pub mod mcp;
pub use mcp::{
AxMCPClient, AxMCPOAuthOptions, AxMCPStdioTransport, AxMCPStreamableHTTPTransport,
AxMCPTokenSet, AxMCPTransport,
};
use reqwest::blocking::Client as HttpClient;
use serde::{Deserialize, Serialize};
use serde_json::{json, Map, Value};
use std::collections::{BTreeMap, BTreeSet, VecDeque};
use std::error::Error;
use std::fmt;
use std::io::{BufRead, BufReader, Write};
use std::process::{Child, ChildStdin, Command, Stdio};
use std::sync::{Arc, Mutex};
use std::time::Duration;
#[cfg(feature = "runtime-quickjs")]
pub mod runtime {
pub mod quickjs;
}
pub type AxResult<T> = Result<T, AxError>;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct AxError {
pub category: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub error_type: Option<String>,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<u16>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
pub retryable: bool,
}
impl AxError {
pub fn new(category: impl Into<String>, message: impl Into<String>) -> Self {
Self {
category: category.into(),
error_type: None,
message: message.into(),
status: None,
code: None,
retryable: false,
}
}
pub fn runtime(message: impl Into<String>) -> Self {
Self::new("runtime", message)
}
pub fn validation(message: impl Into<String>) -> Self {
Self::new("validation", message)
}
}
impl fmt::Display for AxError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.message)
}
}
impl Error for AxError {}
impl From<serde_json::Error> for AxError {
fn from(value: serde_json::Error) -> Self {
Self::runtime(value.to_string())
}
}
impl From<std::io::Error> for AxError {
fn from(value: std::io::Error) -> Self {
Self::runtime(value.to_string())
}
}
impl From<reqwest::Error> for AxError {
fn from(value: reqwest::Error) -> Self {
let mut err = Self::new("ai_service", value.to_string());
err.status = value.status().map(|status| status.as_u16());
err.retryable = err.status.map(|status| status >= 500).unwrap_or(false);
err
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct FieldType {
pub name: String,
#[serde(default, rename = "isArray")]
pub is_array: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub options: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fields: Option<Map<String, Value>>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "minLength")]
pub min_length: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "maxLength")]
pub max_length: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub minimum: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub maximum: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pattern: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "patternDescription"
)]
pub pattern_description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
impl FieldType {
pub fn new(name: impl Into<String>) -> Self {
Self {
name: name.into(),
is_array: false,
options: None,
fields: None,
min_length: None,
max_length: None,
minimum: None,
maximum: None,
pattern: None,
pattern_description: None,
format: None,
description: None,
}
}
pub fn string() -> Self {
Self::new("string")
}
pub fn number() -> Self {
Self::new("number")
}
pub fn boolean() -> Self {
Self::new("boolean")
}
pub fn class(options: impl IntoIterator<Item = impl Into<String>>) -> Self {
Self {
name: "class".to_string(),
is_array: false,
options: Some(options.into_iter().map(Into::into).collect()),
fields: None,
min_length: None,
max_length: None,
minimum: None,
maximum: None,
pattern: None,
pattern_description: None,
format: None,
description: None,
}
}
pub fn array(mut self) -> Self {
self.is_array = true;
self
}
fn to_payload(&self) -> Value {
self.to_payload_inner(false)
}
fn to_payload_with_description(&self) -> Value {
self.to_payload_inner(true)
}
fn to_payload_inner(&self, include_description: bool) -> Value {
let mut out = Map::new();
out.insert("isArray".to_string(), Value::Bool(self.is_array));
out.insert("name".to_string(), Value::String(self.name.clone()));
if let Some(options) = &self.options {
out.insert(
"options".to_string(),
Value::Array(options.iter().cloned().map(Value::String).collect()),
);
}
if let Some(fields) = &self.fields {
out.insert("fields".to_string(), Value::Object(fields.clone()));
}
if let Some(value) = self.min_length {
out.insert("minLength".to_string(), json_number(value));
}
if let Some(value) = self.max_length {
out.insert("maxLength".to_string(), json_number(value));
}
if let Some(value) = self.minimum {
out.insert("minimum".to_string(), json_number(value));
}
if let Some(value) = self.maximum {
out.insert("maximum".to_string(), json_number(value));
}
if let Some(value) = &self.pattern {
out.insert("pattern".to_string(), Value::String(value.clone()));
}
if let Some(value) = &self.pattern_description {
out.insert(
"patternDescription".to_string(),
Value::String(value.clone()),
);
}
if let Some(value) = &self.format {
out.insert("format".to_string(), Value::String(value.clone()));
}
if include_description {
if let Some(value) = &self.description {
out.insert("description".to_string(), Value::String(value.clone()));
}
}
Value::Object(out)
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Field {
pub name: String,
pub title: String,
#[serde(rename = "type")]
pub field_type: FieldType,
#[serde(default, rename = "isOptional")]
pub is_optional: bool,
#[serde(default, rename = "isInternal")]
pub is_internal: bool,
#[serde(default, rename = "isCached")]
pub is_cached: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
impl Field {
pub fn new(name: impl Into<String>, field_type: FieldType) -> Self {
let name = name.into();
Self {
title: title_case(&name),
name,
field_type,
is_optional: false,
is_internal: false,
is_cached: false,
description: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct AxSignature {
pub description: Option<String>,
pub inputs: Vec<Field>,
pub outputs: Vec<Field>,
}
impl AxSignature {
pub fn parse(spec: &str) -> AxResult<Self> {
let parsed = parse_signature(&[CoreValue::from(spec)])?;
validate_signature(&[parsed.clone()])?;
let payload = core_value_to_json(&parsed);
let mut inputs = Vec::new();
if let Some(items) = payload.get("inputs").and_then(Value::as_array) {
for item in items {
let name = item.get("name").and_then(Value::as_str).unwrap_or_default();
inputs.push(field_from_payload(name, item));
}
}
let mut outputs = Vec::new();
if let Some(items) = payload.get("outputs").and_then(Value::as_array) {
for item in items {
let name = item.get("name").and_then(Value::as_str).unwrap_or_default();
outputs.push(field_from_payload(name, item));
}
}
Ok(AxSignature {
description: payload
.get("description")
.and_then(Value::as_str)
.map(ToString::to_string),
inputs,
outputs,
})
}
pub fn get_output_fields(&self) -> &[Field] {
&self.outputs
}
pub fn to_json_schema(&self, section: &str) -> Value {
self.to_json_schema_with_options(section, &Value::Null)
}
pub fn to_json_schema_with_options(&self, section: &str, options: &Value) -> Value {
let fields = if section == "inputs" {
&self.inputs
} else {
&self.outputs
};
core_fields_value(fields)
.and_then(|fields_value| {
to_json_schema(&[
fields_value,
CoreValue::from("Schema"),
core_value_from_json(options),
])
})
.map(|schema| core_value_to_json(&schema))
.unwrap_or(Value::Null)
}
}
pub fn s(spec: &str) -> AxResult<AxSignature> {
AxSignature::parse(spec)
}
pub struct SignatureBuilder {
inputs: Vec<Field>,
outputs: Vec<Field>,
}
pub fn f() -> SignatureBuilder {
SignatureBuilder {
inputs: Vec::new(),
outputs: Vec::new(),
}
}
impl SignatureBuilder {
pub fn input(mut self, name: &str, field_type: FieldType) -> Self {
self.inputs.push(Field::new(name, field_type));
self
}
pub fn output(mut self, name: &str, field_type: FieldType) -> Self {
self.outputs.push(Field::new(name, field_type));
self
}
pub fn build(self) -> AxSignature {
AxSignature {
description: None,
inputs: self.inputs,
outputs: self.outputs,
}
}
}
fn title_case(name: &str) -> String {
let mut out = String::new();
let mut upper = true;
let mut prev_lower_or_digit = false;
for ch in name.chars() {
if ch == '_' || ch == '-' {
out.push(' ');
upper = true;
prev_lower_or_digit = false;
} else if ch.is_uppercase() && prev_lower_or_digit {
out.push(' ');
out.push(ch);
upper = false;
prev_lower_or_digit = false;
} else if upper {
for c in ch.to_uppercase() {
out.push(c);
}
upper = false;
prev_lower_or_digit = ch.is_lowercase() || ch.is_ascii_digit();
} else {
out.push(ch);
prev_lower_or_digit = ch.is_lowercase() || ch.is_ascii_digit();
}
}
out
}
fn field_from_payload(name: &str, raw: &Value) -> Field {
if let Some(obj) = raw.as_object() {
if obj.contains_key("type") && obj.get("name").is_none() {
return field_from_spec(name, raw);
}
let type_obj = raw.get("type").and_then(Value::as_object);
let type_payload = type_obj
.map(|value| Value::Object(value.clone()))
.unwrap_or_else(|| raw.clone());
let mut field_type = field_type_from_payload(&type_payload);
if field_type.name.is_empty() {
field_type.name = raw
.get("name")
.and_then(Value::as_str)
.unwrap_or("string")
.to_string();
}
let mut field = Field::new(name, field_type);
field.title = raw
.get("title")
.and_then(Value::as_str)
.map(ToString::to_string)
.unwrap_or_else(|| title_case(name));
field.description = raw
.get("description")
.and_then(Value::as_str)
.map(ToString::to_string);
field.is_optional = bool_key(raw, &["isOptional", "optional"]);
field.is_internal = bool_key(raw, &["isInternal", "internal"]);
field.is_cached = bool_key(raw, &["isCached", "cache", "cached"]);
return field;
}
Field::new(name, FieldType::string())
}
fn field_type_from_payload(raw: &Value) -> FieldType {
let mut field_type =
FieldType::new(raw.get("name").and_then(Value::as_str).unwrap_or("string"));
field_type.is_array = raw
.get("isArray")
.or_else(|| raw.get("array"))
.and_then(Value::as_bool)
.unwrap_or(false);
field_type.options = raw.get("options").and_then(Value::as_array).map(|items| {
items
.iter()
.filter_map(Value::as_str)
.map(ToString::to_string)
.collect()
});
field_type.fields = raw.get("fields").and_then(Value::as_object).cloned();
field_type.min_length = number_key(raw, &["minLength"]);
field_type.max_length = number_key(raw, &["maxLength"]);
field_type.minimum = number_key(raw, &["minimum"]);
field_type.maximum = number_key(raw, &["maximum"]);
field_type.pattern = raw
.get("pattern")
.and_then(Value::as_str)
.map(ToString::to_string);
field_type.pattern_description = raw
.get("patternDescription")
.and_then(Value::as_str)
.map(ToString::to_string);
field_type.format = raw
.get("format")
.and_then(Value::as_str)
.map(ToString::to_string);
field_type.description = raw
.get("description")
.and_then(Value::as_str)
.map(ToString::to_string);
field_type
}
fn field_from_spec(name: &str, raw: &Value) -> Field {
let type_name = raw.get("type").and_then(Value::as_str).unwrap_or("string");
let mut type_payload = Map::new();
type_payload.insert("name".to_string(), Value::String(type_name.to_string()));
type_payload.insert(
"isArray".to_string(),
Value::Bool(bool_key(raw, &["array", "isArray"])),
);
if let Some(options) = raw.get("options") {
type_payload.insert("options".to_string(), options.clone());
}
if let Some(fields) = raw.get("fields").and_then(Value::as_object) {
let mut nested = Map::new();
for (child_name, child_spec) in fields {
nested.insert(
child_name.clone(),
field_payload_with_type_description(&field_from_spec(child_name, child_spec)),
);
}
type_payload.insert("fields".to_string(), Value::Object(nested));
}
if let Some(value) = number_key(raw, &["minLength"]) {
type_payload.insert("minLength".to_string(), json_number(value));
}
if let Some(value) = number_key(raw, &["maxLength"]) {
type_payload.insert("maxLength".to_string(), json_number(value));
}
if let Some(value) = number_key(raw, &["min", "minimum"]) {
let key = if type_name == "string" {
"minLength"
} else {
"minimum"
};
type_payload.insert(key.to_string(), json_number(value));
}
if let Some(value) = number_key(raw, &["max", "maximum"]) {
let key = if type_name == "string" {
"maxLength"
} else {
"maximum"
};
type_payload.insert(key.to_string(), json_number(value));
}
if let Some(value) = raw.get("pattern").and_then(Value::as_str) {
type_payload.insert("pattern".to_string(), Value::String(value.to_string()));
}
if let Some(value) = raw.get("patternDescription").and_then(Value::as_str) {
type_payload.insert(
"patternDescription".to_string(),
Value::String(value.to_string()),
);
}
if bool_key(raw, &["email"]) {
type_payload.insert("format".to_string(), Value::String("email".to_string()));
} else if bool_key(raw, &["url"]) {
type_payload.insert("format".to_string(), Value::String("uri".to_string()));
} else if let Some(value) = raw.get("format").and_then(Value::as_str) {
type_payload.insert("format".to_string(), Value::String(value.to_string()));
}
if let Some(description) = raw.get("description").and_then(Value::as_str) {
if type_name != "object" || bool_key(raw, &["array", "isArray"]) {
type_payload.insert(
"description".to_string(),
Value::String(description.to_string()),
);
}
}
let mut field = Field::new(name, field_type_from_payload(&Value::Object(type_payload)));
field.title = raw
.get("title")
.and_then(Value::as_str)
.map(ToString::to_string)
.unwrap_or_else(|| title_case(name));
field.description = raw
.get("arrayDescription")
.or_else(|| raw.get("description"))
.and_then(Value::as_str)
.map(ToString::to_string);
field.is_optional = bool_key(raw, &["optional", "isOptional"]);
field.is_internal = bool_key(raw, &["internal", "isInternal"]);
field.is_cached = bool_key(raw, &["cache", "cached", "isCached"]);
field
}
fn field_payload_with_type_description(field: &Field) -> Value {
field_payload_impl(field, true)
}
fn field_payload(field: &Field) -> Value {
field_payload_impl(field, false)
}
fn field_payload_impl(field: &Field, include_type_description: bool) -> Value {
let mut out = Map::new();
out.insert("name".to_string(), Value::String(field.name.clone()));
out.insert("title".to_string(), Value::String(field.title.clone()));
out.insert(
"type".to_string(),
if include_type_description {
field.field_type.to_payload_with_description()
} else {
field.field_type.to_payload()
},
);
out.insert("isOptional".to_string(), Value::Bool(field.is_optional));
out.insert("isInternal".to_string(), Value::Bool(field.is_internal));
out.insert("isCached".to_string(), Value::Bool(field.is_cached));
if let Some(description) = &field.description {
out.insert(
"description".to_string(),
Value::String(description.clone()),
);
}
Value::Object(out)
}
fn signature_payload(sig: &AxSignature) -> Value {
json!({
"description": sig.description,
"inputs": sig.inputs.iter().map(field_payload).collect::<Vec<_>>(),
"outputs": sig.outputs.iter().map(field_payload).collect::<Vec<_>>()
})
}
pub fn signature_from_spec(spec: &Value) -> AxResult<AxSignature> {
let mut inputs = Vec::new();
let mut outputs = Vec::new();
if let Some(raw_inputs) = spec.get("inputs").and_then(Value::as_object) {
for (name, raw) in raw_inputs {
inputs.push(field_from_spec(name, raw));
}
}
if let Some(raw_outputs) = spec.get("outputs").and_then(Value::as_object) {
for (name, raw) in raw_outputs {
outputs.push(field_from_spec(name, raw));
}
}
let values = core_value_from_json(&json!({
"inputs": inputs.iter().map(field_payload).collect::<Vec<_>>(),
"outputs": outputs.iter().map(field_payload).collect::<Vec<_>>(),
}));
let record = core_record_new(&[CoreValue::from("AxSignature"), values])?;
validate_signature(&[record])?;
Ok(AxSignature {
description: spec
.get("description")
.and_then(Value::as_str)
.map(ToString::to_string),
inputs,
outputs,
})
}
fn build_fixture_signature(fixture: &Value) -> AxResult<AxSignature> {
if let Some(spec) = fixture.get("signature_spec") {
return signature_from_spec(spec);
}
if let Some(spec) = fixture.get("signature").and_then(Value::as_object) {
return signature_from_spec(&Value::Object(spec.clone()));
}
s(fixture
.get("signature")
.and_then(Value::as_str)
.unwrap_or("question:string -> answer:string"))
}
fn trim_num(value: f64) -> String {
if value.fract() == 0.0 {
format!("{}", value as i64)
} else {
value.to_string()
}
}
// Decode a standard-alphabet base64 string into raw bytes. Mirrors Python's
// base64.b64decode tolerance: whitespace is ignored and the input may omit
// trailing padding. Invalid characters terminate decoding (the caller falls
// back to the raw UTF-8 bytes when this yields nothing usable).
fn decode_base64(input: &str) -> Vec<u8> {
fn sextet(byte: u8) -> Option<u8> {
match byte {
b'A'..=b'Z' => Some(byte - b'A'),
b'a'..=b'z' => Some(byte - b'a' + 26),
b'0'..=b'9' => Some(byte - b'0' + 52),
b'+' => Some(62),
b'/' => Some(63),
_ => None,
}
}
let mut out = Vec::new();
let mut buffer: u32 = 0;
let mut bits = 0u32;
for &byte in input.as_bytes() {
if byte == b'=' {
break;
}
if byte.is_ascii_whitespace() {
continue;
}
let value = match sextet(byte) {
Some(value) => value,
None => break,
};
buffer = (buffer << 6) | u32::from(value);
bits += 6;
if bits >= 8 {
bits -= 8;
out.push((buffer >> bits) as u8);
}
}
out
}
// Encode raw bytes as a standard-alphabet base64 string (with `=` padding).
// Inverse of `decode_base64`; used for binary responses (e.g. OpenAI
// /audio/speech returns raw mp3) which must not be UTF-8 decoded. Mirrors the
// verified Python `base64.b64encode(...).decode()`.
fn encode_base64(input: &[u8]) -> String {
const ALPHABET: &[u8; 64] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
let mut out = String::with_capacity((input.len() + 2) / 3 * 4);
for chunk in input.chunks(3) {
let b0 = chunk[0] as u32;
let b1 = chunk.get(1).copied().unwrap_or(0) as u32;
let b2 = chunk.get(2).copied().unwrap_or(0) as u32;
let triple = (b0 << 16) | (b1 << 8) | b2;
out.push(ALPHABET[((triple >> 18) & 0x3f) as usize] as char);
out.push(ALPHABET[((triple >> 12) & 0x3f) as usize] as char);
if chunk.len() > 1 {
out.push(ALPHABET[((triple >> 6) & 0x3f) as usize] as char);
} else {
out.push('=');
}
if chunk.len() > 2 {
out.push(ALPHABET[(triple & 0x3f) as usize] as char);
} else {
out.push('=');
}
}
out
}
// Encode a request payload as multipart/form-data and return the raw body
// bytes plus the matching Content-Type header value. Multipart operations
// (e.g. OpenAI /audio/transcriptions) carry the audio as a binary `file` part;
// every other field is a plain form field. The `file` value is a base64 string
// (optionally a `data:` URL) or a map {data, mimeType?, filename?}. Mirrors the
// verified Python `_encode_multipart`; the fixed boundary avoids needing a
// random/uuid dependency.
fn encode_multipart(payload: &Value) -> (Vec<u8>, String) {
const BOUNDARY: &str = "----axllmFormBoundaryAx7LlmMultipartBoundary";
const CRLF: &[u8] = b"\r\n";
let mut body: Vec<u8> = Vec::new();
if let Some(entries) = payload.as_object() {
for (key, value) in entries {
if value.is_null() {
continue;
}
if key == "file" {
let (raw_data, filename, content_type) = match value {
Value::Object(map) => {
let data = map
.get("data")
.and_then(Value::as_str)
.unwrap_or("")
.to_string();
let filename = map
.get("filename")
.and_then(Value::as_str)
.filter(|name| !name.is_empty())
.unwrap_or("audio.wav")
.to_string();
let content_type = map
.get("mimeType")
.or_else(|| map.get("mime_type"))
.and_then(Value::as_str)
.filter(|mime| !mime.is_empty())
.unwrap_or("audio/wav")
.to_string();
(data, filename, content_type)
}
_ => (
value_as_display_string(value),
"audio.wav".to_string(),
"audio/wav".to_string(),
),
};
let stripped = if raw_data.starts_with("data:") {
match raw_data.split_once(',') {
Some((_, rest)) => rest.to_string(),
None => raw_data.clone(),
}
} else {
raw_data.clone()
};
let mut file_bytes = decode_base64(&stripped);
if file_bytes.is_empty() && !stripped.is_empty() {
file_bytes = stripped.into_bytes();
}
body.extend_from_slice(b"--");
body.extend_from_slice(BOUNDARY.as_bytes());
body.extend_from_slice(CRLF);
body.extend_from_slice(
format!(
"Content-Disposition: form-data; name=\"file\"; filename=\"{filename}\""
)
.as_bytes(),
);
body.extend_from_slice(CRLF);
body.extend_from_slice(format!("Content-Type: {content_type}").as_bytes());
body.extend_from_slice(CRLF);
body.extend_from_slice(CRLF);
body.extend_from_slice(&file_bytes);
body.extend_from_slice(CRLF);
} else {
body.extend_from_slice(b"--");
body.extend_from_slice(BOUNDARY.as_bytes());
body.extend_from_slice(CRLF);
body.extend_from_slice(
format!("Content-Disposition: form-data; name=\"{key}\"").as_bytes(),
);
body.extend_from_slice(CRLF);
body.extend_from_slice(CRLF);
body.extend_from_slice(value_as_display_string(value).as_bytes());
body.extend_from_slice(CRLF);
}
}
}
body.extend_from_slice(b"--");
body.extend_from_slice(BOUNDARY.as_bytes());
body.extend_from_slice(b"--");
body.extend_from_slice(CRLF);
(body, format!("multipart/form-data; boundary={BOUNDARY}"))
}
fn json_number(value: f64) -> Value {
if value.fract() == 0.0 {
json!(value as i64)
} else {
json!(value)
}
}
fn number_key(value: &Value, keys: &[&str]) -> Option<f64> {
keys.iter()
.find_map(|key| value.get(*key).and_then(Value::as_f64))
}
fn bool_key(value: &Value, keys: &[&str]) -> bool {
keys.iter()
.any(|key| value.get(*key).and_then(Value::as_bool).unwrap_or(false))
}
pub trait AxAIClient {
fn chat(&mut self, request: Value) -> AxResult<Value>;
fn transcribe(&mut self, request: Value) -> AxResult<Value> {
let _ = request;
Ok(json!({"text": ""}))
}
fn complete(&mut self, request: Value) -> AxResult<Value> {
self.chat(request)
}
fn stream(&mut self, request: Value) -> AxResult<Vec<Value>> {
let response = self.chat(request)?;
if let Some(results) = response.get("results").and_then(Value::as_array) {
return Ok(results
.iter()
.map(|result| json!({"results": [result.clone()]}))
.collect());
}
Ok(vec![response])
}
}
pub type AIClient = dyn AxAIClient;
pub trait AxTransport: Send {
fn send(&mut self, request: Value) -> AxResult<Value>;
}
pub type RuntimeTransport = dyn AxTransport;
pub struct ScriptedTransport {
responses: VecDeque<Value>,
pub requests: Vec<Value>,
}
impl ScriptedTransport {
pub fn new(responses: Vec<Value>) -> Self {
Self {
responses: responses.into(),
requests: Vec::new(),
}
}
}
impl AxTransport for ScriptedTransport {
fn send(&mut self, request: Value) -> AxResult<Value> {
self.requests.push(request);
self.responses
.pop_front()
.ok_or_else(|| AxError::runtime("scripted transport exhausted"))
}
}
pub struct OpenAICompatibleClient {
pub api_key: String,
pub api_url: String,
pub base_url_override: Option<String>,
pub api_version: String,
pub model: String,
pub embed_model: String,
pub profile: String,
pub model_config: Value,
pub options: Value,
pub transport: Option<Box<dyn AxTransport>>,
}
impl OpenAICompatibleClient {
pub fn new(api_key: impl Into<String>, model: impl Into<String>) -> Self {
Self {
api_key: api_key.into(),
api_url: "https://api.openai.com/v1".to_string(),
base_url_override: None,
api_version: String::new(),
model: model.into(),
embed_model: "text-embedding-3-small".to_string(),
profile: "openai-compatible".to_string(),
model_config: json!({}),
options: json!({}),
transport: None,
}
}
pub fn with_transport(mut self, transport: impl AxTransport + 'static) -> Self {
self.transport = Some(Box::new(transport));
self
}
pub fn with_model_config(mut self, config: Value) -> Self {
self.model_config = config;
self
}
pub fn with_api_url(mut self, api_url: impl Into<String>) -> Self {
self.api_url = api_url.into();
self
}
pub fn with_embed_model(mut self, model: impl Into<String>) -> Self {
self.embed_model = model.into();
self
}
pub fn with_profile(mut self, profile: impl Into<String>) -> Self {
self.profile = profile.into();
self
}
pub fn with_options(mut self, options: Value) -> Self {
self.options = if options.is_object() {
options
} else {
json!({})
};
self
}
fn prepare_chat_request(&self, request: &Value) -> AxResult<Value> {
let mut req = if request.is_object() {
request.clone()
} else {
json!({})
};
if req.get("chat_prompt").is_none() {
if let Some(prompt) = request
.get("chatPrompt")
.or_else(|| request.get("messages"))
{
req["chat_prompt"] = prompt.clone();
}
}
if req
.get("model")
.and_then(Value::as_str)
.filter(|model| !model.is_empty())
.is_none()
{
req["model"] = json!(self.model.clone());
}
let mut base_config = if self.model_config.is_object() {
self.model_config.clone()
} else {
json!({})
};
if base_config.get("temperature").is_none() {
base_config["temperature"] = json!(0);
}
let override_config = req
.get("model_config")
.or_else(|| req.get("modelConfig"))
.cloned()
.unwrap_or_else(|| json!({}));
let merged = merge_model_config(&[
core_value_from_json(&base_config),
core_value_from_json(&override_config),
CoreValue::new_map(),
])?;
req["model_config"] = core_value_to_json(&merged);
Ok(req)
}
fn provider_transport_request(
&self,
operation: &str,
payload: &Value,
model: &str,
stream: bool,
) -> AxResult<Value> {
let operation_descriptor = core_value_to_json(&provider_operation_descriptor(&[
CoreValue::from(self.profile.as_str()),
CoreValue::from(operation),
])?);
let descriptor = core_value_to_json(&provider_descriptor(&[CoreValue::from(
self.profile.as_str(),
)])?);
let mut path = operation_descriptor
.get("path")
.and_then(Value::as_str)
.unwrap_or("/chat/completions")
.to_string();
path = path.replace("{model}", &url_component_escape(model));
let auth = descriptor
.get("auth")
.and_then(Value::as_str)
.unwrap_or("bearer");
if auth == "api_key_query" {
let key_name = descriptor
.get("apiKeyQuery")
.and_then(Value::as_str)
.unwrap_or("key");
let separator = if path.contains('?') { "&" } else { "?" };
path = format!(
"{path}{separator}{}={}",
url_component_escape(key_name),
url_component_escape(&self.api_key)
);
}
let base = self.base_url_override.clone().unwrap_or_else(|| {
descriptor
.get("baseUrl")
.and_then(Value::as_str)
.unwrap_or("https://api.openai.com/v1")
.to_string()
});
let mut url = format!("{}{path}", base.trim_end_matches('/'));
if !self.api_version.is_empty() {
let separator = if url.contains('?') { "&" } else { "?" };
url = format!(
"{url}{separator}api-version={}",
url_component_escape(&self.api_version)
);
}
let mut headers = serde_json::Map::new();
headers.insert("Content-Type".to_string(), json!("application/json"));
match auth {
"bearer" => {
if !self.api_key.is_empty() {
headers.insert(
"Authorization".to_string(),
json!(format!("Bearer {}", self.api_key)),
);
}
}
"anthropic_key" => {
headers.insert("x-api-key".to_string(), json!(self.api_key.clone()));
}
"api_key_header" => {
let key_name = descriptor
.get("apiKeyHeader")
.and_then(Value::as_str)
.unwrap_or("api-key");
headers.insert(key_name.to_string(), json!(self.api_key.clone()));
}
_ => {}
}
if let Some(extra) = descriptor.get("headers").and_then(Value::as_object) {
for (key, value) in extra {
let text = value
.as_str()
.map(ToString::to_string)
.unwrap_or_else(|| value.to_string());
headers.insert(key.clone(), json!(text));
}
}
let body_key =
if operation_descriptor.get("body").and_then(Value::as_str) == Some("multipart") {
"data"
} else {
"json"
};
let mut out = json!({"method": "POST", "url": url, "headers": Value::Object(headers), "stream": stream});
out[body_key] = payload.clone();
Ok(out)
}
fn dispatch_transport_request(&mut self, call: Value) -> AxResult<Value> {
if let Some(transport) = self.transport.as_mut() {
return transport.send(call);
}
let url = call
.get("url")
.and_then(Value::as_str)
.unwrap_or_default()
.to_string();
let mut builder = HttpClient::builder()
.timeout(Duration::from_secs(60))
.build()?
.post(url);
if let Some(headers) = call.get("headers").and_then(Value::as_object) {
for (key, value) in headers {
builder = builder.header(key.as_str(), value.as_str().unwrap_or_default());
}
}
// A `data` body marks a multipart/form-data operation (e.g. /audio/transcriptions):
// encode it as a binary multipart body and override Content-Type. A `json` body is
// serialized as JSON as usual.
let response: Value = if let Some(data) = call.get("data") {
let (body, content_type) = encode_multipart(data);
builder
.header("Content-Type", content_type)
.body(body)
.send()?
.error_for_status()?
.json()?
} else {
let body = call.get("json").cloned().unwrap_or_else(|| json!({}));
builder.json(&body).send()?.error_for_status()?.json()?
};
Ok(json!({"status": 200, "json": response}))
}
fn request_body(&self, request: &Value) -> Value {
let messages = request
.get("chat_prompt")
.or_else(|| request.get("chatPrompt"))
.cloned()
.unwrap_or_else(|| json!([]));
let mut body = json!({
"model": self.model,
"messages": messages
});
merge_object(&mut body, &self.model_config);
if let Some(config) = request
.get("model_config")
.or_else(|| request.get("modelConfig"))
{
merge_model_config_wire(&mut body, config);
}
if body.get("temperature").is_none() {
body["temperature"] = json!(0);
}
if let Some(format) = request.get("response_format") {
body["response_format"] = format.clone();
}
if let Some(tools) = request.get("tools") {
if tools
.as_array()
.map(|items| !items.is_empty())
.unwrap_or(true)
{
body["tools"] = tools.clone();
}
}
body
}
fn stream_body(&self, request: &Value) -> Value {
match self.profile.as_str() {
"openai-responses" => json!({
"model": self.model,
"input": request.get("chat_prompt").or_else(|| request.get("chatPrompt")).cloned().unwrap_or_else(|| json!([])),
"stream": true
}),
"google-gemini" => json!({
"contents": request.get("chat_prompt").or_else(|| request.get("chatPrompt")).cloned().unwrap_or_else(|| json!([])),
"generationConfig": {"responseMimeType": "text/plain"}
}),
"anthropic" => json!({
"model": self.model,
"messages": request.get("chat_prompt").or_else(|| request.get("chatPrompt")).cloned().unwrap_or_else(|| json!([])),
"stream": true
}),
_ => {
let mut body = self.request_body(request);
body["stream"] = json!(true);
body["stream_options"] = json!({"include_usage": true});
body
}
}
}
fn endpoint_url(&self, path: &str) -> String {
if path.starts_with("http://") || path.starts_with("https://") {
path.to_string()
} else {
// Honor a base_url override (e.g. a proxy/gateway) for the audio paths
// too, matching how chat/embed dispatch already resolve the base URL;
// fall back to api_url when no override was supplied.
let base = self.base_url_override.as_deref().unwrap_or(&self.api_url);
format!("{}{}", base.trim_end_matches('/'), path)
}
}
fn chat_path(&self) -> &'static str {
match self.profile.as_str() {
"openai-responses" => "/responses",
"anthropic" => "/v1/messages",
_ => "/chat/completions",
}
}
fn stream_path(&self) -> String {
match self.profile.as_str() {
"google-gemini" => format!(
"https://generativelanguage.googleapis.com/v1beta/models/{}:streamGenerateContent?alt=sse&key={}",
self.model, self.api_key
),
_ => self.chat_path().to_string(),
}
}
fn post_json(&mut self, path: &str, body: Value, binary: bool) -> AxResult<Value> {
let url = self.endpoint_url(path);
if let Some(transport) = self.transport.as_mut() {
return transport.send(json!({
"method": "POST",
"url": url,
"headers": {"authorization": "Bearer test-key"},
"json": body
}));
}
let raw = HttpClient::builder()
.timeout(Duration::from_secs(60))
.build()?
.post(url)
.bearer_auth(&self.api_key)
.json(&body)
.send()?
.error_for_status()?;
// Binary operations (e.g. OpenAI /audio/speech returns raw mp3) must not
// be UTF-8 decoded or parsed as JSON; return the bytes as a base64 string
// so the speak normalizer can pass it through to the `audio` field.
let response: Value = if binary {
Value::String(encode_base64(&raw.bytes()?))
} else {
raw.json()?
};
Ok(json!({"status": 200, "json": response}))
}
fn post_data(&mut self, path: &str, data: Value) -> AxResult<Value> {
let url = self.endpoint_url(path);
if let Some(transport) = self.transport.as_mut() {
return transport.send(json!({
"method": "POST",
"url": url,
"headers": {"authorization": "Bearer test-key"},
"data": data
}));
}
// `data` operations (e.g. OpenAI /audio/transcriptions) are multipart/form-data,
// not JSON. Encode the payload as a binary multipart body and override Content-Type.
let (body, content_type) = encode_multipart(&data);
let response: Value = HttpClient::builder()
.timeout(Duration::from_secs(60))
.build()?
.post(url)
.bearer_auth(&self.api_key)
.header("Content-Type", content_type)
.body(body)
.send()?
.error_for_status()?
.json()?;
Ok(json!({"status": 200, "json": response}))
}
fn post_stream(&mut self, path: &str, body: Value) -> AxResult<Value> {
let url = self.endpoint_url(path);
if let Some(transport) = self.transport.as_mut() {
return transport.send(json!({
"method": "POST",
"url": url,
"headers": {"authorization": "Bearer test-key"},
"json": body,
"stream": true
}));
}
let text = HttpClient::builder()
.timeout(Duration::from_secs(60))
.build()?
.post(url)
.bearer_auth(&self.api_key)
.json(&body)
.send()?
.error_for_status()?
.text()?;
Ok(json!({"status": 200, "body": text}))
}
pub fn embed(&mut self, request: Value) -> AxResult<Value> {
// python: AxBaseAI.embed validation + ProviderOperationClient._embed
// (provider_build_embed_request -> transport -> provider_normalize_embed_response)
let texts = request
.get("texts")
.or_else(|| request.get("input"))
.cloned()
.unwrap_or(Value::Null);
if !texts
.as_array()
.map(|items| !items.is_empty())
.unwrap_or(false)
{
return Err(AxError {
category: "ai_service".to_string(),
error_type: Some("AxAIServiceResponseError".to_string()),
message: "Embed texts is empty".to_string(),
status: None,
code: None,
retryable: false,
});
}
let embed_model = string_at(&request, "embed_model")
.or_else(|| string_at(&request, "embedModel"))
.unwrap_or_else(|| self.embed_model.clone());
if embed_model.is_empty() {
return Err(AxError {
category: "ai_service".to_string(),
error_type: Some("AxAIServiceResponseError".to_string()),
message: "Embed model not set".to_string(),
status: None,
code: None,
retryable: false,
});
}
let mut req = if request.is_object() {
request.clone()
} else {
json!({})
};
req["texts"] = texts;
req["embed_model"] = json!(embed_model.clone());
let profile = self.profile.clone();
if profile == "openai-compatible" {
let _ = build_embed_request(&[
CoreValue::Null,
core_value_from_json(&req),
CoreValue::Null,
])?;
}
let payload = core_value_to_json(&provider_build_embed_request(&[
CoreValue::from(profile.as_str()),
core_value_from_json(&req),
])?);
let model = string_at(&req, "embed_model")
.or_else(|| string_at(&payload, "model"))
.unwrap_or_else(|| self.embed_model.clone());
let call = self.provider_transport_request("embed", &payload, &model, false)?;
let raw = self.dispatch_transport_request(call)?;
let body = normalize_passthrough_response(raw)?;
if profile == "openai-compatible" {
let _ = normalize_embed_response(&[core_value_from_json(&body)])?;
}
let normalized = provider_normalize_embed_response(&[
CoreValue::from(profile.as_str()),
core_value_from_json(&body),
provider_ai_display_name(&profile),
CoreValue::from(model.as_str()),
])?;
Ok(core_value_to_json(&normalized))
}
pub fn transcribe(&mut self, request: Value) -> AxResult<Value> {
let profile = self.profile.clone();
let body = core_value_to_json(&provider_build_transcribe_request(&[
CoreValue::from(profile.as_str()),
core_value_from_json(&request),
])?);
let raw = match profile.as_str() {
"google-gemini" => {
let model = string_at(&request, "model").unwrap_or_else(|| self.model.clone());
let path = format!(
"https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent?key={}",
self.api_key
);
self.post_json(&path, body, false)?
}
"grok" => self.post_data("/stt", body)?,
_ => self.post_data("/audio/transcriptions", body)?,
};
let payload = normalize_passthrough_response(raw)?;
let normalized = provider_normalize_transcribe_response(&[
CoreValue::from(profile.as_str()),
core_value_from_json(&payload),
core_value_from_json(&request),
])?;
Ok(core_value_to_json(&normalized))
}
pub fn speak(&mut self, request: Value) -> AxResult<Value> {
let profile = self.profile.clone();
let body = core_value_to_json(&provider_build_speak_request(&[
CoreValue::from(profile.as_str()),
core_value_from_json(&request),
])?);
// Some speak endpoints (e.g. OpenAI /audio/speech) return RAW binary audio
// rather than JSON. The operation descriptor flags this with `response:
// "binary"`; when set, the HTTP layer base64-encodes the response bytes.
let speak_descriptor = core_value_to_json(&provider_operation_descriptor(&[
CoreValue::from(profile.as_str()),
CoreValue::from("speak"),
])?);
let binary = speak_descriptor.get("response").and_then(Value::as_str) == Some("binary");
let raw = match profile.as_str() {
"google-gemini" => {
let model = string_at(&request, "model")
.unwrap_or_else(|| "gemini-2.5-flash-preview-tts".to_string());
let path = format!(
"https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent?key={}",
self.api_key
);
self.post_json(&path, body, binary)?
}
"grok" => self.post_json("/tts", body, binary)?,
"mistral" => self.post_json("/audio/speech", body, binary)?,
_ => self.post_json("/audio/speech", body, binary)?,
};
let payload = normalize_passthrough_response(raw)?;
let normalized = provider_normalize_speak_response(&[
CoreValue::from(profile.as_str()),
core_value_from_json(&payload),
core_value_from_json(&request),
])?;
Ok(core_value_to_json(&normalized))
}
pub fn realtime(&self, event: Value) -> AxResult<Value> {
let normalized = provider_normalize_realtime_event(&[
CoreValue::from(self.profile.as_str()),
core_value_from_json(&event),
CoreValue::new_map(),
provider_ai_display_name(&self.profile),
CoreValue::from(self.model.as_str()),
])?;
Ok(core_value_to_json(&normalized))
}
pub fn realtime_events(&self, events: Value) -> AxResult<Vec<Value>> {
let state = CoreValue::new_map();
let ai_name = provider_ai_display_name(&self.profile);
let mut out = Vec::new();
for event in events.as_array().cloned().unwrap_or_default() {
let normalized = provider_normalize_realtime_event(&[
CoreValue::from(self.profile.as_str()),
core_value_from_json(&event),
state.clone(),
ai_name.clone(),
CoreValue::from(self.model.as_str()),
])?;
if !normalized.is_null() {
out.push(core_value_to_json(&normalized));
}
}
Ok(out)
}
pub fn realtime_audio_setup(&self, request: Value) -> AxResult<Value> {
let built = provider_build_realtime_audio_setup(&[
CoreValue::from(self.profile.as_str()),
core_value_from_json(&request),
])?;
Ok(core_value_to_json(&built))
}
pub fn realtime_audio_input(&self, audio: Value) -> AxResult<Value> {
let built = provider_build_realtime_audio_input(&[
CoreValue::from(self.profile.as_str()),
core_value_from_json(&audio),
])?;
Ok(core_value_to_json(&built))
}
/// Drive a realtime audio turn over a WebSocket transport: send the
/// Core-built session setup + input events, fold the inbound stream through
/// the shared realtime codec, and merge the per-delta results into one turn
/// response (transcript concatenated, audio chunks base64-joined). Pass a
/// ScriptedRealtimeTransport to exercise the loop offline without a socket.
pub fn realtime_chat(
&self,
request: Value,
transport: Option<RealtimeTransport>,
) -> AxResult<Value> {
let model = request
.get("model")
.and_then(|m| m.as_str())
.unwrap_or(self.model.as_str())
.to_string();
let setup = self.realtime_audio_setup(request.clone())?;
let inputs = self.realtime_audio_input(request.clone())?;
let mut transport = match transport {
Some(transport) => transport,
None => self.open_realtime_transport(&model)?,
};
transport.send(&setup)?;
let mut input_sent = false;
let mut events: Vec<Value> = Vec::new();
loop {
let event = match transport.recv()? {
Some(event) => event,
None => break,
};
if event.get("type").and_then(|t| t.as_str()) == Some("error") {
let message = event
.get("error")
.and_then(|err| err.get("message"))
.and_then(|m| m.as_str())
.unwrap_or("realtime error");
return Err(AxError::runtime(message));
}
if realtime_event_is_ready(&event) {
if !input_sent {
input_sent = true;
if let Some(items) = inputs.as_array() {
for item in items {
transport.send(item)?;
}
}
}
continue;
}
let done = realtime_event_is_done(&event);
events.push(event);
if done {
break;
}
}
let state = CoreValue::new_map();
let ai_name = provider_ai_display_name(&self.profile);
let mut content = String::new();
let mut audio_bytes: Vec<u8> = Vec::new();
let mut has_audio = false;
let mut function_calls: Vec<Value> = Vec::new();
let mut response_id = String::new();
let mut finish_reason = String::new();
let mut model_usage = Value::Null;
for event in &events {
let normalized = provider_normalize_realtime_event(&[
CoreValue::from(self.profile.as_str()),
core_value_from_json(event),
state.clone(),
ai_name.clone(),
CoreValue::from(model.as_str()),
])?;
let out = core_value_to_json(&normalized);
let result = match out
.get("results")
.and_then(|r| r.as_array())
.and_then(|a| a.first())
{
Some(result) => result.clone(),
None => continue,
};
if let Some(text) = result.get("content").and_then(|c| c.as_str()) {
content.push_str(text);
}
if let Some(data) = result
.get("audio")
.and_then(|a| a.get("data"))
.and_then(|d| d.as_str())
{
if !data.is_empty() {
audio_bytes.extend(decode_base64(data));
has_audio = true;
}
}
if let Some(calls) = result.get("function_calls").and_then(|f| f.as_array()) {
function_calls.extend(calls.iter().cloned());
}
if let Some(reason) = result.get("finish_reason").and_then(|f| f.as_str()) {
finish_reason = reason.to_string();
}
let remote_id = out
.get("remote_id")
.and_then(|r| r.as_str())
.or_else(|| result.get("id").and_then(|i| i.as_str()))
.unwrap_or("");
if !remote_id.is_empty() && remote_id != "0" {
response_id = remote_id.to_string();
}
if let Some(usage) = out.get("model_usage") {
if !usage.is_null() {
model_usage = usage.clone();
}
}
}
if response_id.is_empty() {
response_id = "realtime".to_string();
}
if finish_reason.is_empty() {
finish_reason = "stop".to_string();
}
let mut result = json!({
"index": 0,
"id": response_id.clone(),
"content": content.clone(),
"function_calls": function_calls,
"finish_reason": finish_reason,
});
if has_audio {
result["audio"] = json!({
"data": encode_base64(&audio_bytes),
"format": "pcm16",
"transcript": content,
});
}
Ok(json!({
"results": [result],
"remote_id": response_id,
"model_usage": model_usage,
}))
}
fn open_realtime_transport(&self, model: &str) -> AxResult<RealtimeTransport> {
#[cfg(feature = "realtime")]
{
let (url, headers) = self.realtime_ws_target(model);
Ok(RealtimeTransport::Live(WsRealtimeTransport::connect(
&url, headers,
)?))
}
#[cfg(not(feature = "realtime"))]
{
let _ = model;
Err(AxError::runtime(
"realtime audio requires building with --features realtime, or pass a transport",
))
}
}
#[allow(dead_code)]
fn realtime_ws_target(&self, model: &str) -> (String, Vec<(String, String)>) {
// Grammar-specific URL + auth construction lives in Core so the client
// stays provider-agnostic.
let target = core_value_to_json(
&provider_realtime_ws_url(&[
CoreValue::from(self.profile.as_str()),
CoreValue::from(model),
CoreValue::from(self.api_key.as_str()),
])
.unwrap_or_else(|_| CoreValue::new_map()),
);
let url = target
.get("url")
.and_then(|u| u.as_str())
.unwrap_or("")
.to_string();
let mut headers = Vec::new();
if let Some(map) = target.get("headers").and_then(|h| h.as_object()) {
for (key, value) in map {
if let Some(value) = value.as_str() {
headers.push((key.clone(), value.to_string()));
}
}
}
(url, headers)
}
}
/// Transport seam for the realtime turn driver: ScriptedRealtimeTransport for
/// deterministic offline tests, the websocket-backed variant (behind the
/// `realtime` feature) for live turns.
pub enum RealtimeTransport {
Scripted(ScriptedRealtimeTransport),
#[cfg(feature = "realtime")]
Live(WsRealtimeTransport),
}
impl RealtimeTransport {
fn send(&mut self, event: &Value) -> AxResult<()> {
match self {
RealtimeTransport::Scripted(transport) => {
transport.sent.push(event.clone());
Ok(())
}
#[cfg(feature = "realtime")]
RealtimeTransport::Live(transport) => transport.send(event),
}
}
fn recv(&mut self) -> AxResult<Option<Value>> {
match self {
RealtimeTransport::Scripted(transport) => Ok(transport.inbound.pop_front()),
#[cfg(feature = "realtime")]
RealtimeTransport::Live(transport) => transport.recv(),
}
}
}
pub struct ScriptedRealtimeTransport {
inbound: VecDeque<Value>,
pub sent: Vec<Value>,
}
impl ScriptedRealtimeTransport {
pub fn new(inbound: Vec<Value>) -> Self {
Self {
inbound: inbound.into(),
sent: Vec::new(),
}
}
}
fn realtime_event_is_ready(event: &Value) -> bool {
if matches!(
event.get("type").and_then(|t| t.as_str()),
Some("session.created")
| Some("session.updated")
| Some("transcription_session.created")
| Some("transcription_session.updated")
) {
return true;
}
event.get("setupComplete").is_some()
}
fn realtime_event_is_done(event: &Value) -> bool {
if matches!(
event.get("type").and_then(|t| t.as_str()),
Some("response.done") | Some("response.completed")
) {
return true;
}
event
.get("serverContent")
.and_then(|s| s.get("turnComplete"))
.and_then(|t| t.as_bool())
.unwrap_or(false)
}
#[cfg(feature = "realtime")]
pub struct WsRealtimeTransport {
socket: tungstenite::WebSocket<tungstenite::stream::MaybeTlsStream<std::net::TcpStream>>,
}
#[cfg(feature = "realtime")]
impl WsRealtimeTransport {
fn connect(url: &str, headers: Vec<(String, String)>) -> AxResult<Self> {
use tungstenite::client::IntoClientRequest;
let mut request = url
.into_client_request()
.map_err(|e| AxError::runtime(e.to_string()))?;
for (key, value) in headers {
let name = tungstenite::http::header::HeaderName::from_bytes(key.as_bytes())
.map_err(|e| AxError::runtime(e.to_string()))?;
let val = tungstenite::http::header::HeaderValue::from_str(&value)
.map_err(|e| AxError::runtime(e.to_string()))?;
request.headers_mut().insert(name, val);
}
let (socket, _) =
tungstenite::connect(request).map_err(|e| AxError::runtime(e.to_string()))?;
Ok(Self { socket })
}
fn send(&mut self, event: &Value) -> AxResult<()> {
let text = serde_json::to_string(event).map_err(|e| AxError::runtime(e.to_string()))?;
self.socket
.send(tungstenite::Message::Text(text.into()))
.map_err(|e| AxError::runtime(e.to_string()))
}
fn recv(&mut self) -> AxResult<Option<Value>> {
loop {
match self.socket.read() {
Ok(tungstenite::Message::Text(text)) => {
return Ok(Some(
serde_json::from_str(text.as_str())
.map_err(|e| AxError::runtime(e.to_string()))?,
));
}
Ok(tungstenite::Message::Binary(data)) => {
return Ok(Some(
serde_json::from_slice(&data)
.map_err(|e| AxError::runtime(e.to_string()))?,
));
}
Ok(tungstenite::Message::Close(_)) => return Ok(None),
Ok(_) => continue,
Err(_) => return Ok(None),
}
}
}
}
impl AxAIClient for OpenAICompatibleClient {
fn chat(&mut self, request: Value) -> AxResult<Value> {
let req = self.prepare_chat_request(&request)?;
// python: AxBaseAI.chat validates the coerced request up front.
validate_chat_request(&[core_value_from_json(&req)])?;
let realtime_model = req
.get("model")
.and_then(Value::as_str)
.map(ToString::to_string)
.unwrap_or_else(|| self.model.clone());
if core_value_to_json(&provider_should_use_realtime(&[
CoreValue::from(self.profile.as_str()),
CoreValue::from(realtime_model.as_str()),
core_value_from_json(&req),
])?)
.as_bool()
.unwrap_or(false)
{
return self.realtime_chat(req, None);
}
if self.profile == "openai-compatible" {
let _ = build_chat_request(&[
CoreValue::Null,
core_value_from_json(&req),
CoreValue::Null,
])?;
}
let payload = core_value_to_json(&provider_build_chat_request(&[
CoreValue::from(self.profile.as_str()),
core_value_from_json(&req),
])?);
let model = req
.get("model")
.and_then(Value::as_str)
.map(ToString::to_string)
.or_else(|| {
payload
.get("model")
.and_then(Value::as_str)
.map(ToString::to_string)
})
.unwrap_or_else(|| self.model.clone());
let call = self.provider_transport_request("chat", &payload, &model, false)?;
let raw = self.dispatch_transport_request(call)?;
let profile = self.profile.clone();
normalize_openai_response(&profile, &model, raw)
}
fn stream(&mut self, request: Value) -> AxResult<Vec<Value>> {
let body = self.stream_body(&request);
let path = self.stream_path();
let cfg = core_value_to_json(&resolve_stream_retry(&[core_value_from_json(
&self.options,
)])?);
let max_retries = cfg.get("max_retries").and_then(Value::as_i64).unwrap_or(3);
let initial_delay = cfg
.get("initial_delay_ms")
.and_then(Value::as_f64)
.unwrap_or(1000.0);
let max_delay = cfg
.get("max_delay_ms")
.and_then(Value::as_f64)
.unwrap_or(60000.0);
let backoff = cfg
.get("backoff_factor")
.and_then(Value::as_f64)
.unwrap_or(2.0);
let mut attempt: i64 = 0;
loop {
let response = self.post_stream(&path, body.clone())?;
let events = extract_stream_events(response)?;
// Pre-content streaming retry: peek the first raw SSE event before any stateful
// normalize runs (so peeking has no side effects); if the provider classifies it as a
// retryable transient status (e.g. Anthropic's HTTP-200 overloaded_error event),
// re-issue with the same exponential backoff apiCall uses for a 529 before surfacing.
if let Some(first) = events.first() {
let status = provider_classify_stream_error_status(&[
CoreValue::from(self.profile.as_str()),
core_value_from_json(first),
])?;
if !status.is_null()
&& core_truthy(&is_retryable_status(&[status.clone()])?)
&& attempt < max_retries
{
attempt += 1;
let delay = (initial_delay * backoff.powi((attempt - 1) as i32)).min(max_delay);
if delay > 0.0 {
std::thread::sleep(std::time::Duration::from_millis(delay as u64));
}
continue;
}
}
return normalize_stream_events(&self.profile, &self.model, &events);
}
}
}
pub type AxAIService = OpenAICompatibleClient;
pub type AxBaseAI = OpenAICompatibleClient;
pub type AnthropicClient = OpenAICompatibleClient;
pub type AzureOpenAIClient = OpenAICompatibleClient;
pub type CohereClient = OpenAICompatibleClient;
pub type DeepSeekClient = OpenAICompatibleClient;
pub type GoogleGeminiClient = OpenAICompatibleClient;
pub type GrokClient = OpenAICompatibleClient;
pub type MistralClient = OpenAICompatibleClient;
pub type OpenAIResponsesClient = OpenAICompatibleClient;
pub type RekaClient = OpenAICompatibleClient;
pub fn ai(provider: &str, options: Value) -> AxResult<OpenAICompatibleClient> {
let defaults = provider_defaults(provider)
.ok_or_else(|| AxError::validation(format!("unknown AxAI provider {provider}")))?;
let api_key = string_at(&options, "api_key")
.or_else(|| std::env::var("OPENAI_API_KEY").ok())
.or_else(|| std::env::var("OPENAI_APIKEY").ok())
.unwrap_or_else(|| "test-key".to_string());
let model = string_at(&options, "model").unwrap_or_else(|| defaults.model.to_string());
let api_url = string_at(&options, "api_url").unwrap_or_else(|| defaults.api_url.to_string());
let embed_model =
string_at(&options, "embed_model").unwrap_or_else(|| defaults.embed_model.to_string());
let mut client = OpenAICompatibleClient::new(api_key, model)
.with_api_url(api_url)
.with_embed_model(embed_model)
.with_profile(defaults.profile);
client.base_url_override = string_at(&options, "base_url")
.or_else(|| string_at(&options, "baseUrl"))
.or_else(|| string_at(&options, "api_url"));
if defaults.profile == "azure-openai" {
let version = string_at(&options, "api_version")
.or_else(|| string_at(&options, "apiVersion"))
.or_else(|| string_at(&options, "version"))
.unwrap_or_else(|| "2024-02-15-preview".to_string());
client.api_version = version.trim_start_matches("api-version=").to_string();
if client.base_url_override.is_none() {
let resource = string_at(&options, "resource_name")
.or_else(|| string_at(&options, "resourceName"));
let deployment = string_at(&options, "deployment_name")
.or_else(|| string_at(&options, "deploymentName"));
if let (Some(resource), Some(deployment)) = (resource, deployment) {
let host = if resource.contains("://") {
resource
} else {
format!("https://{resource}.openai.azure.com")
};
client.base_url_override = Some(format!(
"{}/openai/deployments/{}",
host.trim_end_matches('/'),
url_component_escape(&deployment)
));
}
}
}
Ok(client.with_model_config(
options
.get("model_config")
.cloned()
.unwrap_or_else(|| json!({})),
))
}
struct ProviderDefaults {
profile: &'static str,
api_url: &'static str,
model: &'static str,
embed_model: &'static str,
}
fn provider_defaults(provider: &str) -> Option<ProviderDefaults> {
match provider {
"openai" | "openai-compatible" => Some(ProviderDefaults {
profile: "openai-compatible",
api_url: "https://api.openai.com/v1",
model: "gpt-4.1-mini",
embed_model: "text-embedding-3-small",
}),
"openai-responses" | "responses" => Some(ProviderDefaults {
profile: "openai-responses",
api_url: "https://api.openai.com/v1",
model: "gpt-4o",
embed_model: "text-embedding-3-small",
}),
"google-gemini" | "gemini" => Some(ProviderDefaults {
profile: "google-gemini",
api_url: "https://generativelanguage.googleapis.com/v1beta",
model: "gemini-2.5-flash",
embed_model: "text-embedding-004",
}),
"anthropic" => Some(ProviderDefaults {
profile: "anthropic",
api_url: "https://api.anthropic.com",
model: "claude-3-7-sonnet-latest",
embed_model: "text-embedding-3-small",
}),
"azure-openai" | "azure" => Some(ProviderDefaults {
profile: "azure-openai",
api_url: "https://example-resource.openai.azure.com/openai/deployments",
model: "gpt-4.1-mini",
embed_model: "text-embedding-3-small",
}),
"deepseek" => Some(ProviderDefaults {
profile: "deepseek",
api_url: "https://api.deepseek.com/v1",
model: "deepseek-chat",
embed_model: "text-embedding-3-small",
}),
"mistral" => Some(ProviderDefaults {
profile: "mistral",
api_url: "https://api.mistral.ai/v1",
model: "mistral-large-latest",
embed_model: "mistral-embed",
}),
"reka" => Some(ProviderDefaults {
profile: "reka",
api_url: "https://api.reka.ai/v1",
model: "reka-flash",
embed_model: "text-embedding-3-small",
}),
"cohere" => Some(ProviderDefaults {
profile: "cohere",
api_url: "https://api.cohere.com/v2",
model: "command-r-plus",
embed_model: "embed-v4.0",
}),
"grok" | "xai" => Some(ProviderDefaults {
profile: "grok",
api_url: "https://api.x.ai/v1",
model: "grok-3-mini",
embed_model: "text-embedding-3-small",
}),
_ => None,
}
}
fn normalize_openai_response(profile: &str, model: &str, response: Value) -> AxResult<Value> {
let payload = normalize_passthrough_response(response)?;
if profile == "openai-compatible" {
let _ = normalize_chat_response(&[core_value_from_json(&payload)])?;
}
let normalized = provider_normalize_chat_response(&[
CoreValue::from(profile),
core_value_from_json(&payload),
provider_ai_display_name(profile),
CoreValue::from(model),
])?;
Ok(core_value_to_json(&normalized))
}
// python: _transport_result. Raises openai_normalize_error for status >= 400
// and unwraps {status, json|body|data} transport envelopes otherwise.
fn normalize_passthrough_response(response: Value) -> AxResult<Value> {
if response.get("status").is_none() {
return Ok(response);
}
let status = response
.get("status")
.and_then(Value::as_u64)
.unwrap_or(200);
let body = response
.get("json")
.or_else(|| response.get("body"))
.or_else(|| response.get("data"))
.cloned()
.unwrap_or(Value::Null);
if status >= 400 {
let error = openai_normalize_error(&[
CoreValue::Num(status as f64),
core_value_from_json(&body),
CoreValue::Null,
])?;
return Err(core_as_error(&error));
}
Ok(body)
}
fn extract_stream_events(response: Value) -> AxResult<Vec<Value>> {
let payload = normalize_passthrough_response(response)?;
if let Some(events) = payload.as_array() {
Ok(events.clone())
} else if let Some(events) = payload.get("events").and_then(Value::as_array) {
Ok(events.clone())
} else {
let body = payload
.as_str()
.or_else(|| payload.get("body").and_then(Value::as_str))
.unwrap_or_default();
parse_sse_events(body)
}
}
fn normalize_stream_response(profile: &str, model: &str, response: Value) -> AxResult<Vec<Value>> {
let events = extract_stream_events(response)?;
normalize_stream_events(profile, model, &events)
}
fn normalize_stream_events(profile: &str, model: &str, events: &[Value]) -> AxResult<Vec<Value>> {
let ai_name = provider_ai_display_name(profile);
let state = CoreValue::new_map();
let mut out = Vec::new();
for event in events {
if profile == "openai-compatible" {
let _ = normalize_stream_delta(&[core_value_from_json(event), CoreValue::new_map()])?;
}
let normalized = provider_normalize_stream_delta(&[
CoreValue::from(profile),
core_value_from_json(event),
state.clone(),
ai_name.clone(),
CoreValue::from(model),
])?;
if !normalized.is_null() {
out.push(core_value_to_json(&normalized));
}
}
Ok(out)
}
pub(crate) fn parse_sse_events(body: &str) -> AxResult<Vec<Value>> {
// Mirror src/ax/util/sse.ts: normalize CRLF/CR, then fold the data: lines of
// each event (events are blank-line separated) into a single payload before
// parsing. A spec-legal SSE event may split one JSON value across several
// data: lines, joined with "\n"; parsing each line on its own would choke.
fn flush(buffer: &mut String, events: &mut Vec<Value>) -> AxResult<()> {
let payload = buffer.trim();
if !payload.is_empty() && payload != "[DONE]" {
events.push(serde_json::from_str::<Value>(payload)?);
}
buffer.clear();
Ok(())
}
let normalized = body.replace("\r\n", "\n").replace('\r', "\n");
let mut events = Vec::new();
let mut buffer = String::new();
for line in normalized.split('\n') {
if line.is_empty() {
flush(&mut buffer, &mut events)?;
continue;
}
if line.starts_with(':') {
continue; // comment line
}
let value = match line.find(':') {
Some(idx) => {
if line[..idx].trim() != "data" {
continue; // event:/id:/retry: do not contribute to the payload
}
line[idx + 1..].trim()
}
None => line.trim(),
};
if !buffer.is_empty() && !buffer.ends_with('\n') {
buffer.push('\n');
}
buffer.push_str(value);
}
flush(&mut buffer, &mut events)?;
Ok(events)
}
#[derive(Clone)]
pub struct Tool {
pub name: String,
pub description: String,
pub args: Map<String, Value>,
handler: Arc<dyn Fn(Value) -> AxResult<Value> + Send + Sync>,
}
impl Tool {
pub fn call(&self, args: Value) -> AxResult<Value> {
validate_fields(&[
core_tool_args_fields(&self.args)?,
core_value_from_json(&args),
CoreValue::from_string(format!("tool.{}.args", self.name)),
])?;
(self.handler)(args)
}
}
pub struct ToolBuilder {
name: String,
description: String,
args: Map<String, Value>,
}
pub fn tool(name: &str) -> ToolBuilder {
ToolBuilder {
name: name.to_string(),
description: String::new(),
args: Map::new(),
}
}
impl ToolBuilder {
pub fn description(mut self, description: impl Into<String>) -> Self {
self.description = description.into();
self
}
pub fn arg(mut self, name: &str, field_type: FieldType) -> Self {
self.args.insert(name.to_string(), field_type.to_payload());
self
}
pub fn handler(
self,
handler: impl Fn(Value) -> AxResult<Value> + Send + Sync + 'static,
) -> Tool {
Tool {
name: self.name,
description: self.description,
args: self.args,
handler: Arc::new(handler),
}
}
}
pub struct AxGen {
pub signature: AxSignature,
pub options: Value,
pub function_call_traces: Vec<Value>,
pub tools: Vec<Tool>,
pub assertions: Vec<Value>,
pub examples: Vec<Value>,
pub demos: Vec<Value>,
pub field_processors: Vec<Value>,
pub stop_functions: Vec<String>,
pub memory: Vec<Value>,
pub traces: Vec<Value>,
pub chat_log: Vec<Value>,
}
pub fn ax(spec: &str) -> AxResult<AxGen> {
AxGen::new(spec)
}
impl AxGen {
pub fn new(spec: &str) -> AxResult<Self> {
Ok(Self {
signature: s(spec)?,
options: json!({}),
function_call_traces: Vec::new(),
tools: Vec::new(),
assertions: Vec::new(),
examples: Vec::new(),
demos: Vec::new(),
field_processors: Vec::new(),
stop_functions: Vec::new(),
memory: Vec::new(),
traces: Vec::new(),
chat_log: Vec::new(),
})
}
pub fn with_tool(mut self, tool: Tool) -> Self {
self.tools.push(tool);
self
}
pub fn with_assertion(mut self, assertion: Value) -> Self {
self.assertions.push(assertion);
self
}
pub fn with_example(mut self, example: Value) -> Self {
self.examples.push(example);
self
}
pub fn with_demo(mut self, demo: Value) -> Self {
self.demos.push(demo);
self
}
pub fn with_field_processor(mut self, field: &str, op: &str) -> Self {
self.field_processors
.push(json!({"field": field, "op": op}));
self
}
pub fn with_stop_function(mut self, name: &str) -> Self {
self.stop_functions.push(name.to_string());
self
}
pub fn forward<C: AxAIClient>(&mut self, client: &mut C, input: Value) -> AxResult<Value> {
self.forward_with_options(client, input, Value::Null)
}
pub fn forward_with_options<C: AxAIClient>(
&mut self,
client: &mut C,
input: Value,
options: Value,
) -> AxResult<Value> {
let state = core_gen_state(self)?;
let mut chat = |method: &str, request: Value| -> AxResult<Value> {
if method == "transcribe" {
client.transcribe(request)
} else {
client.chat(request)
}
};
let result = with_core_client(&mut chat, || {
_forward_impl(&[
state.clone(),
CoreValue::Null,
core_value_from_json(&input),
core_value_from_json(&options),
])
});
core_gen_writeback(self, &state);
Ok(core_value_to_json(&result?))
}
pub fn get_traces(&self) -> &[Value] {
&self.traces
}
pub fn get_chat_log(&self) -> &[Value] {
&self.chat_log
}
// ----- python AxGen optimizer wrapper layer -----
pub(crate) fn with_options_and_tools(
spec: &str,
options: Value,
tools: Vec<Tool>,
) -> AxResult<Self> {
let mut gen = Self::new(spec)?;
gen.options = if options.is_object() {
options
} else {
json!({})
};
gen.tools = tools;
Ok(gen)
}
fn option_str(&self, keys: &[&str]) -> Option<String> {
keys.iter()
.find_map(|key| self.options.get(*key).and_then(Value::as_str))
.map(ToString::to_string)
}
pub fn program_id(&self) -> String {
self.option_str(&["id", "program_id", "programId"])
.unwrap_or_else(|| "root".to_string())
}
pub fn get_instruction(&self) -> String {
self.option_str(&["instruction"]).unwrap_or_default()
}
pub fn set_instruction(&mut self, instruction: &str) {
if !self.options.is_object() {
self.options = json!({});
}
self.options["instruction"] = json!(instruction);
}
pub fn set_demos(&mut self, demos: Vec<Value>) {
let marker = CoreValue::new_map();
let _ = _set_demos(&[marker, core_value_from_json(&Value::Array(demos.clone()))]);
self.demos = demos;
let has = !self.examples.is_empty() || !self.demos.is_empty();
if !self.options.is_object() {
self.options = json!({});
}
self.options["has_example_demonstrations"] = json!(has);
}
pub fn set_examples(&mut self, examples: Vec<Value>) {
let marker = CoreValue::new_map();
let _ = _set_examples(&[
marker,
core_value_from_json(&Value::Array(examples.clone())),
]);
self.examples = examples;
let has = !self.examples.is_empty() || !self.demos.is_empty();
if !self.options.is_object() {
self.options = json!({});
}
self.options["has_example_demonstrations"] = json!(has);
}
pub fn get_optimizable_components(&self) -> Vec<Value> {
let owner = self.program_id();
let mut components = Vec::new();
if let Some(description) = self
.signature
.description
.as_deref()
.filter(|text| !text.is_empty())
{
if let Ok(component) = _optimization_component(&[
CoreValue::from(format!("{owner}::description").as_str()),
CoreValue::from(owner.as_str()),
CoreValue::from("description"),
CoreValue::from(description),
CoreValue::from("Program signature description."),
core_value_from_json(&json!(["Preserve the task intent and field references."])),
CoreValue::new_list(),
CoreValue::Bool(false),
CoreValue::from("markdown"),
core_value_from_json(&json!({"required_placeholders": []})),
]) {
components.push(core_value_to_json(&component));
}
}
if let Ok(component) = _optimization_component(&[
CoreValue::from(format!("{owner}::instruction").as_str()),
CoreValue::from(owner.as_str()),
CoreValue::from("instruction"),
CoreValue::from(self.get_instruction().as_str()),
CoreValue::from("Prompt instruction text used by this generator."),
core_value_from_json(&json!(["Keep required input and output fields intact."])),
CoreValue::new_list(),
CoreValue::Bool(false),
CoreValue::from("markdown"),
core_value_from_json(&json!({"required_placeholders": []})),
]) {
components.push(core_value_to_json(&component));
}
let mut seen = BTreeSet::new();
for tool in &self.tools {
if tool.name.is_empty() || seen.contains(&tool.name) {
continue;
}
seen.insert(tool.name.clone());
if let Ok(component) = _optimization_component(&[
CoreValue::from(format!("{owner}::fn:{}:desc", tool.name).as_str()),
CoreValue::from(owner.as_str()),
CoreValue::from("fn-desc"),
CoreValue::from(tool.description.as_str()),
CoreValue::from(format!("Description for tool {}.", tool.name).as_str()),
core_value_from_json(&json!([
"Non-empty, concise, and faithful to the tool behavior."
])),
CoreValue::new_list(),
CoreValue::Bool(false),
CoreValue::from("text"),
core_value_from_json(&json!({"maxLength": 320})),
]) {
components.push(core_value_to_json(&component));
}
if let Ok(component) = _optimization_component(&[
CoreValue::from(format!("{owner}::fn:{}:name", tool.name).as_str()),
CoreValue::from(owner.as_str()),
CoreValue::from("fn-name"),
CoreValue::from(tool.name.as_str()),
CoreValue::from(format!("Callable name for tool {}.", tool.name).as_str()),
core_value_from_json(&json!([
"snake_case",
"32 characters or fewer",
"unique among tools"
])),
CoreValue::new_list(),
CoreValue::Bool(true),
CoreValue::from("snake_case"),
core_value_from_json(&json!({"pattern": "^[a-z][a-z0-9_]{0,31}$"})),
]) {
components.push(core_value_to_json(&component));
}
}
components
}
pub fn apply_optimized_components(&mut self, component_map: &Value) -> AxResult<()> {
let updates = component_map.as_object().cloned().unwrap_or_default();
let owner = self.program_id();
if let Some(description) = updates.get(&format!("{owner}::description")) {
self.signature.description = Some(value_as_display_string(description));
}
if let Some(instruction) = updates.get(&format!("{owner}::instruction")) {
let text = value_as_display_string(instruction);
self.set_instruction(&text);
}
let old_names = self
.tools
.iter()
.map(|tool| tool.name.clone())
.collect::<Vec<_>>();
for (index, old_name) in old_names.iter().enumerate() {
let desc_id = format!("{owner}::fn:{old_name}:desc");
let name_id = format!("{owner}::fn:{old_name}:name");
if let Some(description) = updates.get(&desc_id) {
self.tools[index].description = value_as_display_string(description);
}
if let Some(new_name) = updates.get(&name_id) {
let new_name = value_as_display_string(new_name).trim().to_string();
if !optimized_function_name_valid(&new_name) {
return Err(AxError::runtime(format!(
"invalid optimized function name: {new_name}"
)));
}
if self
.tools
.iter()
.enumerate()
.any(|(other_index, other)| other_index != index && other.name == new_name)
{
return Err(AxError::runtime(format!(
"duplicate optimized function name: {new_name}"
)));
}
self.tools[index].name = new_name;
}
}
Ok(())
}
pub fn apply_optimization(&mut self, artifact: &Value) -> AxResult<Value> {
let components = Value::Array(self.get_optimizable_components());
let validated = core_value_to_json(&if let Some(text) = artifact.as_str() {
_deserialize_optimized_artifact(&[
CoreValue::from(text),
core_value_from_json(&components),
])?
} else {
_validate_optimized_artifact(&[
core_value_from_json(artifact),
core_value_from_json(&components),
])?
});
if let Some(demos) = validated.get("demos") {
self.set_demos(demos.as_array().cloned().unwrap_or_default());
}
let component_map = validated
.get("componentMap")
.cloned()
.unwrap_or_else(|| json!({}));
self.apply_optimized_components(&component_map)?;
Ok(validated)
}
pub fn evaluate_optimization<C: AxAIClient>(
&mut self,
client: &mut C,
dataset: &Value,
candidate_map: &Value,
options: &Value,
) -> AxResult<Value> {
let opts = if options.is_object() {
options.clone()
} else {
json!({})
};
let normalized =
core_value_to_json(&_normalize_optimization_dataset(&[core_value_from_json(
dataset,
)])?);
let original = core_value_to_json(&_optimization_component_current_map(&[
core_value_from_json(&Value::Array(self.get_optimizable_components())),
])?);
let candidate = if candidate_map.is_object() {
candidate_map.clone()
} else {
json!({})
};
let phase = opts
.get("phase")
.and_then(Value::as_str)
.unwrap_or("train")
.to_string();
let run = (|| -> AxResult<Value> {
if candidate
.as_object()
.map(|map| !map.is_empty())
.unwrap_or(false)
{
self.apply_optimized_components(&candidate)?;
}
let mut rows = Vec::new();
for task in normalized
.get("train")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
{
let input = task.get("input").cloned().unwrap_or_else(|| task.clone());
let forward_options = opts
.get("forward_options")
.cloned()
.unwrap_or_else(|| json!({}));
let (prediction, error) =
match self.forward_with_options(client, input, forward_options) {
Ok(output) => (
json!({
"completionType": "final",
"output": output,
"finalOutput": output,
"functionCalls": self.function_call_traces.clone(),
"actionLog": self.chat_log.clone(),
"usage": {},
"trace": {"traces": self.traces.clone()},
}),
Value::Null,
),
Err(err) => {
let error = json!({"message": err.message});
(
json!({
"completionType": "error",
"error": error,
"functionCalls": self.function_call_traces.clone(),
"actionLog": self.chat_log.clone(),
"usage": {},
"trace": {"traces": self.traces.clone()},
}),
error,
)
}
};
let task_object = if task.is_object() {
task.clone()
} else {
json!({})
};
let (scores, scalar) =
score_optimization_prediction(&task_object, &prediction, &opts)?;
rows.push(core_value_to_json(&_build_optimization_eval_row(&[
core_value_from_json(&task),
core_value_from_json(&prediction),
core_value_from_json(&scores),
CoreValue::Num(scalar),
core_value_from_json(prediction.get("trace").unwrap_or(&Value::Null)),
core_value_from_json(&error),
])?));
}
Ok(core_value_to_json(&_build_optimization_eval_result(&[
core_value_from_json(&Value::Array(rows)),
core_value_from_json(&candidate),
CoreValue::from(phase.as_str()),
])?))
})();
let rollback = self.apply_optimized_components(&original);
let result = run?;
rollback?;
Ok(result)
}
pub fn optimize_with<C: AxAIClient>(
&mut self,
engine: &mut dyn OptimizerEngine,
dataset: &Value,
options: &Value,
client: Option<Rc<RefCell<C>>>,
) -> AxResult<Value> {
let opts = if options.is_object() {
options.clone()
} else {
json!({})
};
let components = Value::Array(self.get_optimizable_components());
let trace = json!({"traces": self.traces.clone(), "chat_log": self.chat_log.clone()});
let run = core_value_to_json(&_prepare_optimizer_run(&[
CoreValue::from("axgen"),
core_value_from_json(&components),
core_value_from_json(dataset),
core_value_from_json(&opts),
core_value_from_json(&trace),
CoreValue::Bool(client.is_some()),
])?);
let request = run.get("request").cloned().unwrap_or_else(|| json!({}));
let mut evaluator = |step: Value| -> AxResult<Value> {
let candidate = step
.get("candidateMap")
.or_else(|| step.get("componentMap"))
.or_else(|| step.get("candidate"))
.cloned()
.unwrap_or_else(|| json!({}));
let mut merged = opts.clone();
if let Some(step_options) = step.get("options").and_then(Value::as_object) {
if !merged.is_object() {
merged = json!({});
}
if let Some(target) = merged.as_object_mut() {
for (key, value) in step_options {
target.insert(key.clone(), value.clone());
}
}
}
let eval_dataset = merged
.get("dataset")
.or_else(|| merged.get("_dataset"))
.cloned()
.unwrap_or_else(|| dataset.clone());
let Some(client) = client.as_ref() else {
return Err(AxError::runtime(
"optimizer evaluator requires an AI client",
));
};
let mut client = client.borrow_mut();
self.evaluate_optimization(&mut *client, &eval_dataset, &candidate, &merged)
};
let response = engine.optimize(request, &mut evaluator)?;
let engine_name = response
.get("optimizerName")
.or_else(|| response.get("optimizer"))
.and_then(Value::as_str)
.unwrap_or("optimizer")
.to_string();
let engine_version = response
.get("optimizerVersion")
.or_else(|| response.get("version"))
.and_then(Value::as_str)
.unwrap_or("host")
.to_string();
let artifact = core_value_to_json(&_normalize_optimizer_engine_response(&[
core_value_from_json(&response),
CoreValue::from(engine_name.as_str()),
CoreValue::from(engine_version.as_str()),
core_value_from_json(&components),
])?);
if opts.get("apply").and_then(Value::as_bool).unwrap_or(true) {
self.apply_optimization(&artifact)?;
}
Ok(artifact)
}
fn tool_descriptors(&self) -> Value {
Value::Array(
self.tools
.iter()
.map(|tool| json!({"type": "function", "function": {"name": tool.name, "description": tool.description, "parameters": {"type": "object", "properties": tool.args}}}))
.collect(),
)
}
fn apply_field_processors(&mut self, output: &mut Value) {
let Some(object) = output.as_object_mut() else {
return;
};
let mut changed = false;
for processor in &self.field_processors {
let Some(field) = processor.get("field").and_then(Value::as_str) else {
continue;
};
let op = processor
.get("op")
.or_else(|| processor.get("processor"))
.and_then(Value::as_str)
.unwrap_or_default();
let Some(value) = object.get_mut(field) else {
continue;
};
let Some(text) = value.as_str() else {
continue;
};
let next = match op {
"uppercase" => text.to_uppercase(),
"lowercase" => text.to_lowercase(),
"trim" => text.trim().to_string(),
_ => text.to_string(),
};
if next != text {
*value = Value::String(next);
changed = true;
}
}
if changed {
self.memory.push(json!({
"role": "processor",
"output": output.clone(),
"tags": ["processor"]
}));
}
}
}
fn value_as_display_string(value: &Value) -> String {
match value {
Value::Null => String::new(),
Value::String(text) => text.clone(),
Value::Bool(value) => value.to_string(),
Value::Number(value) => value.to_string(),
_ => stable_stringify(value),
}
}
fn optimized_function_name_valid(name: &str) -> bool {
let mut chars = name.chars();
let Some(first) = chars.next() else {
return false;
};
if name.len() > 32 || !first.is_ascii_lowercase() {
return false;
}
chars.all(|ch| ch.is_ascii_lowercase() || ch.is_ascii_digit() || ch == '_')
}
fn score_optimization_prediction(
task: &Value,
prediction: &Value,
options: &Value,
) -> AxResult<(Value, f64)> {
let raw_scores = task
.get("metric_score")
.or_else(|| task.get("scores"))
.or_else(|| task.get("score"))
.cloned()
.unwrap_or_else(|| {
if prediction.get("completionType").and_then(Value::as_str) == Some("error") {
json!(0.0)
} else {
json!(1.0)
}
});
let scores = _normalize_optimization_metric_scores(&[core_value_from_json(&raw_scores)])?;
let scalar = _scalarize_optimization_scores(&[scores.clone(), core_value_from_json(options)])?;
let adjusted = _adjust_optimization_score_for_actions(&[
scalar,
core_value_from_json(task),
core_value_from_json(prediction),
])?;
let adjusted_json = core_value_to_json(&adjusted);
Ok((
core_value_to_json(&scores),
adjusted_json.as_f64().unwrap_or(0.0),
))
}
fn assertion_subject<'a>(assertion: &Value, output: &'a Value) -> &'a Value {
assertion
.get("field")
.and_then(Value::as_str)
.and_then(|field| output.get(field))
.unwrap_or(output)
}
pub trait AxProgram {
fn program_kind(&self) -> &'static str;
}
impl AxProgram for AxGen {
fn program_kind(&self) -> &'static str {
"AxGen"
}
}
pub struct AxAgent {
state: CoreValue,
distiller: CoreValue,
executor: CoreValue,
responder: CoreValue,
// Signature + instruction for the built-in llmQuery sub-query, kept as
// plain (Send + Sync) data so the host-callable closure can rebuild the
// sub-gen per call without capturing a non-Send CoreValue.
llm_query_signature: String,
llm_query_instruction: Value,
}
pub fn agent(spec: &str) -> AxResult<AxAgent> {
agent_with_options(spec, json!({}))
}
pub fn agent_with_options(spec: &str, options: Value) -> AxResult<AxAgent> {
agent_with_core_options(spec, core_value_from_json(&options))
}
/// Construct an agent with native host search callbacks for memories and skills.
/// The callbacks run host-side when the actor calls recall()/discover(); passing
/// them at construction auto-enables the memory + skill subsystems (so the actor's
/// prompt advertises recall()/discover()), mirroring the TS/Python API. Callbacks
/// take and return JSON values: memories `(searches, alreadyLoaded) -> results`,
/// skills `(searches) -> results`.
pub fn agent_with_search_callbacks<M, S>(
spec: &str,
options: Value,
memories_search: M,
skills_search: S,
) -> AxResult<AxAgent>
where
M: Fn(Value, Value) -> Value + 'static,
S: Fn(Value) -> Value + 'static,
{
let options = core_value_from_json(&options);
let memories_host = CoreValue::Host(Rc::new(SearchCallbackHost {
label: "AxMemoriesSearchFn",
f: Box::new(move |args| {
let searches = core_value_to_json(&core_arg(args, 0));
let already = core_value_to_json(&core_arg(args, 1));
Ok(core_value_from_json(&memories_search(searches, already)))
}),
}));
core_set(&options, CoreValue::from("onMemoriesSearch"), memories_host)?;
let skills_host = CoreValue::Host(Rc::new(SearchCallbackHost {
label: "AxSkillsSearchFn",
f: Box::new(move |args| {
let searches = core_value_to_json(&core_arg(args, 0));
Ok(core_value_from_json(&skills_search(searches)))
}),
}));
core_set(&options, CoreValue::from("onSkillsSearch"), skills_host)?;
agent_with_core_options(spec, options)
}
pub(crate) fn agent_with_core_options(spec: &str, options: CoreValue) -> AxResult<AxAgent> {
let signature = s(spec)?;
let state = _agent_factory(&[core_signature_value(&signature)?, options.clone()])?;
let distiller_signature = signature_from_record(&core_get(
&state,
&CoreValue::from("distiller_signature"),
CoreValue::Null,
))?;
let executor_signature = signature_from_record(&core_get(
&state,
&CoreValue::from("executor_signature"),
CoreValue::Null,
))?;
let responder_signature = signature_from_record(&core_get(
&state,
&CoreValue::from("responder_signature"),
CoreValue::Null,
))?;
let validation_retries = {
let raw = core_get(
&options,
&CoreValue::from("validation_retries"),
CoreValue::Null,
);
if raw.is_null() {
json!(2)
} else {
core_value_to_json(&raw)
}
};
let distiller_instruction = core_value_to_json(&core_get(
&state,
&CoreValue::from("distiller_description"),
CoreValue::from(""),
));
let executor_instruction = core_value_to_json(&core_get(
&state,
&CoreValue::from("executor_description"),
CoreValue::from(""),
));
let responder_instruction = core_value_to_json(&core_get(
&state,
&CoreValue::from("responder_description"),
CoreValue::from(""),
));
let llm_query_signature = core_get(
&state,
&CoreValue::from("llm_query_signature"),
CoreValue::from("task:string, context:json -> answer:string"),
)
.text();
let llm_query_instruction = core_value_to_json(&core_get(
&state,
&CoreValue::from("llm_query_description"),
CoreValue::from(""),
));
Ok(AxAgent {
state,
distiller: agent_stage_gen(
distiller_signature,
json!({"validation_retries": 0, "id": "ctx.root.actor", "instruction": distiller_instruction}),
),
executor: agent_stage_gen(
executor_signature,
json!({"validation_retries": 0, "id": "task.root.actor", "instruction": executor_instruction}),
),
responder: agent_stage_gen(
responder_signature,
json!({"validation_retries": validation_retries, "id": "task.root.responder", "instruction": responder_instruction}),
),
llm_query_signature,
llm_query_instruction,
})
}
impl AxAgent {
pub fn set_signature(&mut self, spec: &str) -> AxResult<&mut Self> {
let options = core_get(&self.state, &CoreValue::from("options"), CoreValue::Null);
let rebuilt = agent_with_core_options(spec, options)?;
*self = rebuilt;
Ok(self)
}
pub fn forward<C: AxAIClient>(&mut self, client: &mut C, input: Value) -> AxResult<Value> {
self.forward_with_options(client, input, json!({}))
}
pub fn forward_with_options<C: AxAIClient>(
&mut self,
client: &mut C,
input: Value,
options: Value,
) -> AxResult<Value> {
let mut chat = |method: &str, request: Value| -> AxResult<Value> {
if method == "transcribe" {
client.transcribe(request)
} else {
client.chat(request)
}
};
// Wire the built-in llmQuery primitive onto the runtime carried in
// agent options (the same host the actor loop will create sessions on),
// mirroring the Go/Python wrappers. The closure rebuilds a focused
// sub-gen per call and runs it through _agent_run_llm_query; it uses the
// thread-local client bound by with_core_client below (CoreValue::Null
// here resolves to that binding), so it captures only Send + Sync data.
let state_options = core_get(&self.state, &CoreValue::from("options"), CoreValue::Null);
let runtime_host = core_get(&state_options, &CoreValue::from("runtime"), CoreValue::Null);
if let CoreValue::Host(host) = &runtime_host {
let llm_query_signature = self.llm_query_signature.clone();
let llm_query_instruction = self.llm_query_instruction.clone();
let callable: AxHostCallable = Arc::new(move |params: Value| -> AxResult<Value> {
let signature = s(&llm_query_signature)?;
let sub_gen = agent_stage_gen(
signature,
json!({"validation_retries": 1, "id": "rlm.llmquery", "instruction": llm_query_instruction.clone()}),
);
let result = _agent_run_llm_query(&[
sub_gen,
CoreValue::Null,
core_value_from_json(¶ms),
])?;
Ok(core_value_to_json(&result))
});
host.register_runtime_callable("llmQuery", callable);
}
let result = with_core_client(&mut chat, || {
_agent_forward(&[
self.state.clone(),
self.distiller.clone(),
self.executor.clone(),
self.responder.clone(),
CoreValue::Null,
core_value_from_json(&input),
core_value_from_json(&options),
])
})?;
Ok(core_value_to_json(&result))
}
fn state_json(&self, key: &str) -> Value {
core_value_to_json(&core_get(
&self.state,
&CoreValue::from(key),
CoreValue::Null,
))
}
pub fn get_usage(&self) -> Value {
self.state_json("usage")
}
pub fn get_runtime_contract(&self) -> Value {
self.state_json("runtime_contract")
}
pub fn get_policy(&self) -> Value {
self.state_json("policy")
}
pub fn get_policy_registry(&self) -> Value {
self.state_json("policy_registry")
}
pub fn get_callable_inventory(&self) -> Value {
self.state_json("callable_inventory")
}
pub fn get_discovery_catalog(&self) -> Value {
self.state_json("discovery_catalog")
}
pub fn discover(&mut self, request: Value) -> AxResult<Value> {
Ok(core_value_to_json(&_agent_discover(&[
self.state.clone(),
core_value_from_json(&request),
])?))
}
pub fn recall(&mut self, request: Value) -> AxResult<Value> {
Ok(core_value_to_json(&_agent_recall(&[
self.state.clone(),
core_value_from_json(&request),
])?))
}
pub fn used(&mut self, id: &str, reason: &str, stage: &str) -> AxResult<Value> {
Ok(core_value_to_json(&_agent_used(&[
self.state.clone(),
core_value_from_json(&json!({"id": id, "reason": reason, "stage": stage})),
CoreValue::from(stage),
])?))
}
pub fn invoke_callable(
&mut self,
qualified_name: &str,
args: Value,
options: Value,
) -> AxResult<Value> {
Ok(core_value_to_json(&_agent_execute_callable(&[
self.state.clone(),
core_value_from_json(&json!({"qualified_name": qualified_name, "args": args})),
core_value_from_json(&options),
])?))
}
pub fn export_runtime_state(&mut self) -> AxResult<Value> {
Ok(core_value_to_json(&_agent_export_runtime_state(&[self
.state
.clone()])?))
}
pub fn restore_runtime_state(&mut self, snapshot: Value) -> AxResult<Value> {
Ok(core_value_to_json(&_agent_restore_runtime_state(&[
self.state.clone(),
core_value_from_json(&snapshot),
])?))
}
pub fn get_optimizer_metadata(&self) -> AxResult<Value> {
Ok(core_value_to_json(&_agent_optimizer_metadata(&[self
.state
.clone()])?))
}
pub fn get_optimizable_components(&self) -> AxResult<Vec<Value>> {
let mut components = Vec::new();
for stage in [&self.distiller, &self.executor, &self.responder] {
if let Value::Array(items) =
core_value_to_json(&core_program_components(&[stage.clone()])?)
{
components.extend(items);
}
}
components.push(core_value_to_json(&_optimization_component(&[
CoreValue::from("root.agent.runtime"),
CoreValue::from("root.agent"),
CoreValue::from("runtime-policy"),
core_value_from_json(&self.get_runtime_contract()),
CoreValue::from("Agent runtime-language metadata and code-field policy."),
core_value_from_json(&json!([
"Keep code field names aligned with the selected runtime language."
])),
CoreValue::new_list(),
CoreValue::Bool(true),
CoreValue::from("json"),
core_value_from_json(&json!({"component": "runtime_contract"})),
])?));
components.push(core_value_to_json(&_optimization_component(&[
CoreValue::from("root.agent.policy"),
CoreValue::from("root.agent"),
CoreValue::from("agent-policy"),
core_value_from_json(&self.get_policy()),
CoreValue::from("Actor primitive, discovery, delegation, and prompt placement policy."),
core_value_from_json(&json!([
"Do not expose protocol-only actions as actor primitives."
])),
core_value_from_json(&json!(["root.agent.runtime"])),
CoreValue::Bool(true),
CoreValue::from("json"),
core_value_from_json(&json!({"component": "policy_registry"})),
])?));
Ok(components)
}
pub fn apply_optimized_components(&mut self, component_map: &Value) -> AxResult<()> {
let components = Value::Array(self.get_optimizable_components()?);
_validate_optimization_component_map(&[
core_value_from_json(&components),
core_value_from_json(component_map),
])?;
let component_core = core_value_from_json(component_map);
core_program_apply_components(&[self.distiller.clone(), component_core.clone()])?;
core_program_apply_components(&[self.executor.clone(), component_core.clone()])?;
core_program_apply_components(&[self.responder.clone(), component_core.clone()])?;
if let Some(value) = component_map
.get("root.agent.runtime")
.filter(|value| value.is_object())
{
core_set(
&self.state,
CoreValue::from("runtime_contract"),
core_value_from_json(value),
)?;
}
if let Some(value) = component_map
.get("root.agent.policy")
.filter(|value| value.is_object())
{
core_set(
&self.state,
CoreValue::from("policy"),
core_value_from_json(value),
)?;
}
let metadata = _agent_optimizer_metadata(&[self.state.clone()])?;
core_set(&self.state, CoreValue::from("optimizer_metadata"), metadata)?;
Ok(())
}
pub fn replay_trace(&mut self, trace: Value, fixtures: Value) -> AxResult<Value> {
Ok(core_value_to_json(&_agent_replay_trace(&[
core_value_from_json(&trace),
core_value_from_json(&fixtures),
])?))
}
pub fn evaluate_optimization_task<C: AxAIClient>(
&mut self,
client: &mut C,
task: Value,
options: Value,
) -> AxResult<Value> {
let input = task.get("input").cloned().unwrap_or_else(|| task.clone());
let forward_options = options
.get("forward_options")
.cloned()
.unwrap_or_else(|| json!({}));
match self.forward_with_options(client, input, forward_options) {
Ok(output) => {
let trace = self.export_trace()?;
Ok(core_value_to_json(&_build_agent_eval_prediction(&[
core_value_from_json(&output),
core_value_from_json(&Value::Array(self.get_action_log())),
core_value_from_json(&self.get_usage()),
core_value_from_json(&trace),
])?))
}
Err(error) => match core_agent_clarification_detail(&error) {
Some(detail) => Ok(json!({
"completionType": "askClarification",
"clarification": detail.get("clarification").cloned().unwrap_or(Value::Null),
"actionLog": Value::Array(self.get_action_log()),
"functionCalls": self.state_json("function_call_traces"),
"toolErrors": [],
"turnCount": 0,
"usage": self.get_usage(),
})),
None => Err(error),
},
}
}
pub fn execute_actor_step(
&mut self,
runtime: &mut dyn AxCodeRuntime,
code: &str,
input: Value,
options: Value,
) -> AxResult<RuntimeEnvelope> {
_agent_runtime_build_globals(&[self.state.clone(), core_value_from_json(&input)])?;
// SAFETY: lifetime-only erasure; the host never outlives this call.
let runtime_ptr: *mut (dyn AxCodeRuntime + 'static) =
unsafe { std::mem::transmute(runtime as *mut dyn AxCodeRuntime) };
let runtime_host = CoreValue::Host(Rc::new(ScopedRuntimeHost(runtime_ptr)));
let session = core_get(
&self.state,
&CoreValue::from("runtime_session"),
CoreValue::Null,
);
let result = _agent_runtime_execute_step(&[
self.state.clone(),
runtime_host,
session,
CoreValue::from(code),
core_value_from_json(&options),
])?;
Ok(RuntimeEnvelope {
payload: core_value_to_json(&result),
})
}
pub fn test(
&mut self,
runtime: &mut dyn AxCodeRuntime,
code: &str,
input: Value,
options: Value,
) -> AxResult<RuntimeEnvelope> {
// SAFETY: lifetime-only erasure; the host never outlives this call.
let runtime_ptr: *mut (dyn AxCodeRuntime + 'static) =
unsafe { std::mem::transmute(runtime as *mut dyn AxCodeRuntime) };
let runtime_host = CoreValue::Host(Rc::new(ScopedRuntimeHost(runtime_ptr)));
let result = _agent_runtime_test(&[
self.state.clone(),
runtime_host,
CoreValue::from(code),
core_value_from_json(&input),
core_value_from_json(&options),
])?;
Ok(RuntimeEnvelope {
payload: core_value_to_json(&result),
})
}
pub fn inspect_runtime(&mut self) -> AxResult<Value> {
let session = core_get(
&self.state,
&CoreValue::from("runtime_session"),
CoreValue::Null,
);
let result =
_agent_runtime_inspect_state(&[self.state.clone(), session, CoreValue::new_map()])?;
Ok(core_value_to_json(&result))
}
pub fn export_session_state(&mut self) -> AxResult<Value> {
let session = core_get(
&self.state,
&CoreValue::from("runtime_session"),
CoreValue::Null,
);
let result = _agent_runtime_export_session_state(&[
self.state.clone(),
session,
CoreValue::new_map(),
])?;
Ok(core_value_to_json(&result))
}
pub fn restore_session_state(&mut self, snapshot: Value) -> AxResult<Value> {
let session = core_get(
&self.state,
&CoreValue::from("runtime_session"),
CoreValue::Null,
);
let result = _agent_runtime_restore_session_state(&[
self.state.clone(),
session,
core_value_from_json(&snapshot),
CoreValue::new_map(),
])?;
Ok(core_value_to_json(&result))
}
pub fn close_runtime_session(&mut self) -> AxResult<Value> {
let session = core_get(
&self.state,
&CoreValue::from("runtime_session"),
CoreValue::Null,
);
let result = _agent_runtime_close_session(&[self.state.clone(), session])?;
Ok(core_value_to_json(&result))
}
pub fn get_state(&self) -> AxResult<Value> {
Ok(core_value_to_json(&_agent_get_state(&[self
.state
.clone()])?))
}
pub fn set_state(&mut self, state: Value) -> AxResult<Value> {
Ok(core_value_to_json(&_agent_set_state(&[
self.state.clone(),
core_value_from_json(&state),
])?))
}
pub fn export_trace(&self) -> AxResult<Value> {
Ok(core_value_to_json(&_agent_export_trace(&[self
.state
.clone()])?))
}
pub fn get_chat_log(&self) -> Vec<Value> {
match core_value_to_json(&core_get(
&self.state,
&CoreValue::from("chat_log"),
CoreValue::Null,
)) {
Value::Array(items) => items,
_ => Vec::new(),
}
}
pub fn get_action_log(&self) -> Vec<Value> {
match core_value_to_json(&core_get(
&self.state,
&CoreValue::from("action_log"),
CoreValue::Null,
)) {
Value::Array(items) => items,
_ => Vec::new(),
}
}
/// Attach a code runtime so `forward()` can execute the actor's code in a
/// real engine. Wraps the runtime as a host value with full capabilities and
/// stores it under `options.runtime` (the same wiring the conformance runner
/// uses), enabling the Python/Go-style `agent(...).with_runtime(rt).forward(...)`.
pub fn with_runtime(self, runtime: Box<dyn AxCodeRuntime>) -> AxResult<Self> {
let host = core_code_runtime_host_shared(
Rc::new(RefCell::new(runtime)),
core_runtime_capabilities_full(),
);
let options = core_get(&self.state, &CoreValue::from("options"), CoreValue::Null);
core_set(&options, CoreValue::from("runtime"), host)?;
Ok(self)
}
/// Apply an optimizer artifact to the agent's stages: validate (or deserialize)
/// it against the current components, then push the component map into the
/// distiller/executor/responder stages. Mirrors `AxGen::apply_optimization`
/// (agents carry no few-shot demos, so the demo branch is omitted).
pub fn apply_optimization(&mut self, artifact: &Value) -> AxResult<Value> {
let components = Value::Array(self.get_optimizable_components()?);
let validated = core_value_to_json(&if let Some(text) = artifact.as_str() {
_deserialize_optimized_artifact(&[
CoreValue::from(text),
core_value_from_json(&components),
])?
} else {
_validate_optimized_artifact(&[
core_value_from_json(artifact),
core_value_from_json(&components),
])?
});
let component_map = validated
.get("componentMap")
.cloned()
.unwrap_or_else(|| json!({}));
self.apply_optimized_components(&component_map)?;
Ok(validated)
}
/// Evaluate a candidate component map over a dataset by running the agent end to
/// end for each task and scoring the predictions. The original component map is
/// always restored afterwards. Mirrors `AxAgent.evaluate_optimization` in the
/// other ports (per-row delegation to `evaluate_optimization_task`).
pub fn evaluate_optimization<C: AxAIClient>(
&mut self,
client: &mut C,
dataset: &Value,
candidate_map: &Value,
options: &Value,
) -> AxResult<Value> {
let opts = if options.is_object() {
options.clone()
} else {
json!({})
};
let normalized =
core_value_to_json(&_normalize_optimization_dataset(&[core_value_from_json(
dataset,
)])?);
let original = core_value_to_json(&_optimization_component_current_map(&[
core_value_from_json(&Value::Array(self.get_optimizable_components()?)),
])?);
let candidate = if candidate_map.is_object() {
candidate_map.clone()
} else {
json!({})
};
let phase = opts
.get("phase")
.and_then(Value::as_str)
.unwrap_or("train")
.to_string();
let max_metric_calls = opts
.get("maxMetricCalls")
.or_else(|| opts.get("max_metric_calls"))
.and_then(Value::as_u64)
.unwrap_or(1_000_000_000);
let run = (|| -> AxResult<Value> {
if candidate
.as_object()
.map(|map| !map.is_empty())
.unwrap_or(false)
{
self.apply_optimized_components(&candidate)?;
}
let mut rows = Vec::new();
let mut calls: u64 = 0;
for raw_task in normalized
.get("train")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
{
if calls >= max_metric_calls {
return Err(AxError::runtime(format!(
"max metric calls exceeded: {max_metric_calls}"
)));
}
calls += 1;
let task = if raw_task.is_object() {
raw_task.clone()
} else {
json!({"input": raw_task})
};
let prediction =
self.evaluate_optimization_task(client, task.clone(), opts.clone())?;
let error = prediction.get("error").cloned().unwrap_or(Value::Null);
let score_task = if raw_task.is_object() {
raw_task.clone()
} else {
json!({})
};
let (scores, scalar) =
score_optimization_prediction(&score_task, &prediction, &opts)?;
rows.push(core_value_to_json(&_build_optimization_eval_row(&[
core_value_from_json(&raw_task),
core_value_from_json(&prediction),
core_value_from_json(&scores),
CoreValue::Num(scalar),
core_value_from_json(prediction.get("trace").unwrap_or(&Value::Null)),
core_value_from_json(&error),
])?));
}
Ok(core_value_to_json(&_build_optimization_eval_result(&[
core_value_from_json(&Value::Array(rows)),
core_value_from_json(&candidate),
CoreValue::from(phase.as_str()),
])?))
})();
let rollback = self.apply_optimized_components(&original);
let result = run?;
rollback?;
Ok(result)
}
/// Run an optimizer engine against the agent. Builds the optimizer request from
/// the agent's components + trace, drives the engine (scoring candidates with a
/// live client when one is supplied), normalizes the artifact, and applies it
/// unless `options.apply == false`. Mirrors `AxGen::optimize_with` with the
/// `"axagent"` program kind.
pub fn optimize_with<C: AxAIClient>(
&mut self,
engine: &mut dyn OptimizerEngine,
dataset: &Value,
options: &Value,
client: Option<Rc<RefCell<C>>>,
) -> AxResult<Value> {
let opts = if options.is_object() {
options.clone()
} else {
json!({})
};
let components = Value::Array(self.get_optimizable_components()?);
let trace = self.export_trace()?;
let run = core_value_to_json(&_prepare_optimizer_run(&[
CoreValue::from("axagent"),
core_value_from_json(&components),
core_value_from_json(dataset),
core_value_from_json(&opts),
core_value_from_json(&trace),
CoreValue::Bool(client.is_some()),
])?);
let request = run.get("request").cloned().unwrap_or_else(|| json!({}));
let mut evaluator = |step: Value| -> AxResult<Value> {
let candidate = step
.get("candidateMap")
.or_else(|| step.get("componentMap"))
.or_else(|| step.get("candidate"))
.cloned()
.unwrap_or_else(|| json!({}));
let mut merged = opts.clone();
if let Some(step_options) = step.get("options").and_then(Value::as_object) {
if !merged.is_object() {
merged = json!({});
}
if let Some(target) = merged.as_object_mut() {
for (key, value) in step_options {
target.insert(key.clone(), value.clone());
}
}
}
let eval_dataset = merged
.get("dataset")
.or_else(|| merged.get("_dataset"))
.cloned()
.unwrap_or_else(|| dataset.clone());
let Some(client) = client.as_ref() else {
return Err(AxError::runtime(
"optimizer evaluator requires an AI client",
));
};
let mut client = client.borrow_mut();
self.evaluate_optimization(&mut *client, &eval_dataset, &candidate, &merged)
};
let response = engine.optimize(request, &mut evaluator)?;
let engine_name = response
.get("optimizerName")
.or_else(|| response.get("optimizer"))
.and_then(Value::as_str)
.unwrap_or("optimizer")
.to_string();
let engine_version = response
.get("optimizerVersion")
.or_else(|| response.get("version"))
.and_then(Value::as_str)
.unwrap_or("host")
.to_string();
let artifact = core_value_to_json(&_normalize_optimizer_engine_response(&[
core_value_from_json(&response),
CoreValue::from(engine_name.as_str()),
CoreValue::from(engine_version.as_str()),
core_value_from_json(&components),
])?);
if opts.get("apply").and_then(Value::as_bool).unwrap_or(true) {
self.apply_optimization(&artifact)?;
}
Ok(artifact)
}
/// Optimize the agent with the engine carried in `options.engine`/`options.optimizer`.
/// Thin wrapper over [`optimize_with`](Self::optimize_with) matching the Python/
/// Java/C++ `agent.optimize(dataset, options)` surface.
pub fn optimize<C: AxAIClient>(
&mut self,
engine: &mut dyn OptimizerEngine,
dataset: &Value,
options: &Value,
client: Option<Rc<RefCell<C>>>,
) -> AxResult<Value> {
self.optimize_with(engine, dataset, options, client)
}
/// Build an evolving-context `AxPlaybook` bound to a live agent stage (the
/// actor/task stage by default; pass `{"target":"responder"}` for the
/// responder). The playbook SHARES the stage's `AxGen`, so as it evolves the
/// composed instruction is written straight into the live stage prompt — unless
/// `options.apply == false`, in which case injection is disabled. The evolution
/// engine (ACE) is an implementation detail.
pub fn playbook<S: AxAIClient + 'static, T: AxAIClient + 'static>(
&mut self,
student: Rc<RefCell<S>>,
teacher: Option<Rc<RefCell<T>>>,
options: Value,
) -> AxResult<AxPlaybook<S, T>> {
let target = options
.get("target")
.and_then(Value::as_str)
.unwrap_or("actor");
let stage = if target == "responder" {
&self.responder
} else {
&self.executor
};
let gen_rc = if let CoreValue::Host(h) = stage {
h.stage_gen_rc()
} else {
None
}
.ok_or_else(|| AxError::new("optimize", "AxAgent.playbook(): stage is not an AxGen"))?;
let mut pb = AxPlaybook::from_shared(gen_rc, student, teacher, options.clone());
if options.get("apply").and_then(Value::as_bool) == Some(false) {
pb.set_apply_hook(Box::new(|_| {}));
}
Ok(pb)
}
}
impl AxProgram for AxAgent {
fn program_kind(&self) -> &'static str {
"AxAgent"
}
}
pub struct AxFlow {
state: CoreValue,
}
pub fn flow(id: &str) -> AxFlow {
let options = CoreValue::new_map();
let _ = core_set(&options, CoreValue::from("id"), CoreValue::from(id));
let state = _flow_factory(&[options]).unwrap_or_else(|_| CoreValue::new_map());
AxFlow { state }
}
impl AxFlow {
pub fn execute(self, name: &str, program: AxGen) -> Self {
let step = _flow_step(&[
CoreValue::from("execute"),
CoreValue::from(name),
GenHost::new(program),
CoreValue::Null,
]);
if let Ok(step) = step {
let _ = _flow_add_step(&[self.state.clone(), step]);
}
self
}
pub fn returns(self, mapping: Value) -> Self {
let _ = _flow_set_returns(&[self.state.clone(), core_value_from_json(&mapping)]);
self
}
pub fn forward<C: AxAIClient>(&mut self, client: &mut C, input: Value) -> AxResult<Value> {
let mut chat = |method: &str, request: Value| -> AxResult<Value> {
if method == "transcribe" {
client.transcribe(request)
} else {
client.chat(request)
}
};
let result = with_core_client(&mut chat, || {
_flow_forward(&[
self.state.clone(),
CoreValue::Null,
core_value_from_json(&input),
CoreValue::Null,
])
})?;
Ok(core_value_to_json(&result))
}
pub fn get_plan(&self) -> Value {
let id = core_get(
&core_get(&self.state, &CoreValue::from("options"), CoreValue::Null),
&CoreValue::from("id"),
CoreValue::Null,
);
let steps = core_get(&self.state, &CoreValue::from("steps"), CoreValue::Null);
let mut names = Vec::new();
if let Ok(items) = core_iter(&steps) {
for step in items {
let name = core_get(&step, &CoreValue::from("name"), CoreValue::Null);
names.push(json!({"name": core_value_to_json(&name)}));
}
}
json!({"id": core_value_to_json(&id), "steps": names})
}
pub fn set_demos(&mut self, demos: &Value) -> AxResult<()> {
if let Some(map) = demos.as_object() {
let mut known = BTreeSet::new();
let steps = core_get(&self.state, &CoreValue::from("steps"), CoreValue::Null);
if let Ok(items) = core_iter(&steps) {
for step in items {
let name = core_get(&step, &CoreValue::from("name"), CoreValue::Null).text();
if !name.is_empty() {
known.insert(name);
}
}
}
for name in map.keys() {
if !known.contains(name) {
return Err(AxError::runtime(format!(
"unknown flow node in demos: {name}"
)));
}
}
}
core_set(
&self.state,
CoreValue::from("demos"),
core_value_from_json(demos),
)?;
Ok(())
}
pub fn get_optimizable_components(&self) -> AxResult<Value> {
Ok(core_value_to_json(&_flow_get_optimizable_components(&[
self.state.clone(),
])?))
}
pub fn apply_optimized_components(&mut self, component_map: &Value) -> AxResult<()> {
_flow_apply_optimized_components(&[
self.state.clone(),
core_value_from_json(component_map),
])?;
Ok(())
}
}
impl AxProgram for AxFlow {
fn program_kind(&self) -> &'static str {
"AxFlow"
}
}
pub trait OptimizerEngine {
fn optimize(
&mut self,
request: Value,
evaluator: &mut dyn FnMut(Value) -> AxResult<Value>,
) -> AxResult<Value>;
}
pub type OptimizerEvaluator<'a> = dyn FnMut(Value) -> AxResult<Value> + 'a;
pub type OptimizedArtifact = Value;
pub struct AxBootstrapFewShot {
pub options: Value,
}
impl AxBootstrapFewShot {
pub fn new(options: Value) -> Self {
Self { options }
}
}
impl Default for AxBootstrapFewShot {
fn default() -> Self {
Self::new(json!({}))
}
}
impl OptimizerEngine for AxBootstrapFewShot {
fn optimize(
&mut self,
request: Value,
evaluator: &mut dyn FnMut(Value) -> AxResult<Value>,
) -> AxResult<Value> {
let threshold = self
.options
.get("qualityThreshold")
.or_else(|| self.options.get("quality_threshold"))
.and_then(Value::as_f64)
.unwrap_or(0.5);
let max_demos = self
.options
.get("maxDemos")
.or_else(|| self.options.get("max_demos"))
.and_then(Value::as_u64)
.unwrap_or(4) as usize;
let max_rounds = self
.options
.get("maxRounds")
.or_else(|| self.options.get("max_rounds"))
.and_then(Value::as_u64)
.unwrap_or(3)
.max(1) as usize;
let max_examples = self
.options
.get("maxExamples")
.or_else(|| self.options.get("max_examples"))
.and_then(Value::as_u64)
.unwrap_or(16)
.max(1) as usize;
let batch_size = self
.options
.get("batchSize")
.or_else(|| self.options.get("batch_size"))
.and_then(Value::as_u64)
.unwrap_or(1)
.max(1) as usize;
let examples = request
.get("dataset")
.and_then(|dataset| dataset.get("train"))
.and_then(Value::as_array)
.cloned()
.unwrap_or_default();
let sampled = examples.into_iter().take(max_examples).collect::<Vec<_>>();
let mut demos = Vec::new();
let mut accepted = BTreeSet::new();
for round in 0..max_rounds {
if demos.len() >= max_demos {
break;
}
for chunk in sampled.chunks(batch_size) {
if demos.len() >= max_demos {
break;
}
for example in chunk {
if demos.len() >= max_demos {
break;
}
let example_key =
serde_json::to_string(example).unwrap_or_else(|_| format!("{example:?}"));
if accepted.contains(&example_key) {
continue;
}
let score = evaluator(
json!({"candidate": example.clone(), "phase": "bootstrap", "round": round}),
)?;
let scalar = score
.get("scalar")
.and_then(Value::as_f64)
.or_else(|| score.as_f64())
.unwrap_or(1.0);
if scalar >= threshold {
accepted.insert(example_key);
demos.push(json!({"programId": "root", "traces": [example.clone()]}));
}
}
}
}
Ok(json!({
"artifactVersion": "axir-optimized-artifact-v1",
"optimizerName": "BootstrapFewShot",
"optimizerVersion": "axir-bootstrap-fewshot-v1",
"componentMap": {},
"demos": demos,
"metadata": {"optimizer": "BootstrapFewShot", "qualityThreshold": threshold}
}))
}
}
pub struct AxGEPA {
pub max_rounds: usize,
}
#[derive(Clone)]
struct AxGEPACandidate {
cfg: Map<String, Value>,
scores: Value,
}
impl AxGEPA {
pub fn new() -> Self {
Self { max_rounds: 30 }
}
}
impl Default for AxGEPA {
fn default() -> Self {
Self::new()
}
}
impl OptimizerEngine for AxGEPA {
fn optimize(
&mut self,
request: Value,
evaluator: &mut dyn FnMut(Value) -> AxResult<Value>,
) -> AxResult<Value> {
let options = request.get("options").cloned().unwrap_or_else(|| json!({}));
let mut components = request
.get("components")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default();
if components.is_empty() {
if let Some(candidate) = request.get("candidate").and_then(Value::as_object) {
components = candidate
.iter()
.map(|(id, value)| {
json!({
"id": id,
"owner": id.split("::").next().unwrap_or(id),
"kind": "instruction",
"current": value,
})
})
.collect();
}
}
if components.is_empty() {
return Err(AxError::runtime(
"AxGEPA: program exposes no optimizable components",
));
}
let dataset_value = request.get("dataset").cloned().unwrap_or_else(|| json!([]));
let dataset = normalize_optimization_dataset(&dataset_value);
let train = dataset
.get("train")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default();
let validation = dataset
.get("validation")
.and_then(Value::as_array)
.cloned()
.filter(|items| !items.is_empty())
.unwrap_or_else(|| train.clone());
let max_calls = ax_gepa_option_usize(&options, &["maxMetricCalls", "max_metric_calls"], 0);
if max_calls == 0 {
return Err(AxError::runtime(
"AxGEPA: options.maxMetricCalls must be set to a positive integer",
));
}
let num_trials = ax_gepa_option_usize(&options, &["numTrials", "num_trials"], 30);
let minibatch_size =
ax_gepa_option_usize(&options, &["minibatchSize", "minibatch_size"], 20).max(1);
let min_improvement = ax_gepa_option_f64(
&options,
&["minImprovementThreshold", "min_improvement_threshold"],
0.0,
);
let pareto_set_size = ax_gepa_option_usize(
&options,
&["paretoSetSize", "pareto_set_size"],
std::cmp::max(10, std::cmp::min(200, minibatch_size * 3)),
)
.clamp(1, 1000);
let tie_eps = ax_gepa_option_f64(&options, &["tieEpsilon", "tie_epsilon"], 0.0);
let score_options = request
.get("score_options")
.or_else(|| request.get("scoreOptions"))
.unwrap_or(&options);
let mut total_calls = 0usize;
let base_cfg = ax_gepa_current_map(&components);
let pareto_set = validation
.iter()
.take(pareto_set_size)
.cloned()
.collect::<Vec<_>>();
let mut demos = Vec::new();
if let Some(bootstrap) = options.get("bootstrap") {
if bootstrap.as_bool().unwrap_or(true) {
let bootstrap_opts = if bootstrap.is_object() {
bootstrap
} else {
&options
};
let threshold =
ax_gepa_option_f64(bootstrap_opts, &["scoreThreshold", "score_threshold"], 0.8);
let max_demos = ax_gepa_option_usize(
bootstrap_opts,
&["maxBootstrapDemos", "max_bootstrap_demos"],
4,
)
.max(1);
let max_bootstrap_calls = ax_gepa_option_usize(
bootstrap_opts,
&["maxBootstrapMetricCalls", "max_bootstrap_metric_calls"],
std::cmp::max(1, std::cmp::min(train.len(), 8)),
);
let mut bootstrap_calls = 0usize;
for example in &train {
if demos.len() >= max_demos || bootstrap_calls >= max_bootstrap_calls {
break;
}
let (result, next_calls) = ax_gepa_evaluate(
evaluator,
&base_cfg,
std::slice::from_ref(example),
"bootstrap",
max_calls,
total_calls,
false,
)?;
total_calls = next_calls;
bootstrap_calls += 1;
let row = result
.get("rows")
.and_then(Value::as_array)
.and_then(|items| items.first())
.cloned()
.unwrap_or_else(|| json!({}));
if row.get("scalar").and_then(Value::as_f64).unwrap_or(0.0) >= threshold {
let trace = row
.get("prediction")
.cloned()
.or_else(|| row.get("input").cloned())
.unwrap_or_else(|| json!({}));
demos.push(json!({"programId": "root", "traces": [trace]}));
}
}
}
}
let (base_eval, next_calls) = ax_gepa_evaluate(
evaluator,
&base_cfg,
&pareto_set,
"initial Pareto evaluation",
max_calls,
total_calls,
true,
)?;
total_calls = next_calls;
let mut candidates = vec![AxGEPACandidate {
cfg: base_cfg.clone(),
scores: ax_gepa_eval_scores(&base_eval),
}];
let reflection_values = ax_gepa_reflection_values(&request);
let rounds = num_trials.min(self.max_rounds);
if rounds > 0 && !reflection_values.is_empty() && !train.is_empty() {
let mini = train
.iter()
.take(minibatch_size)
.cloned()
.collect::<Vec<_>>();
let (parent_eval, next_calls) = ax_gepa_evaluate(
evaluator,
&base_cfg,
&mini,
"parent minibatch",
max_calls,
total_calls,
false,
)?;
total_calls = next_calls;
let mut proposed = base_cfg.clone();
if let Some(component) = components.first() {
if let Some(component_id) = component.get("id").and_then(Value::as_str) {
let current = proposed
.get(component_id)
.and_then(Value::as_str)
.unwrap_or("")
.to_string();
let next = reflection_values
.iter()
.find(|value| ax_gepa_validate_component_value(component, value))
.cloned()
.unwrap_or(current);
proposed.insert(component_id.to_string(), Value::String(next));
}
}
let (child_mini, next_calls) = ax_gepa_evaluate(
evaluator,
&proposed,
&mini,
"child minibatch",
max_calls,
total_calls,
false,
)?;
total_calls = next_calls;
if ax_gepa_eval_sum(&child_mini) > ax_gepa_eval_sum(&parent_eval) + min_improvement {
let (child_eval, next_calls) = ax_gepa_evaluate(
evaluator,
&proposed,
&pareto_set,
"validation evaluation",
max_calls,
total_calls,
false,
)?;
total_calls = next_calls;
candidates.push(AxGEPACandidate {
cfg: proposed,
scores: ax_gepa_eval_scores(&child_eval),
});
}
}
let front = ax_gepa_pareto_front(&candidates, tie_eps);
let mut best_idx = *front.first().unwrap_or(&0);
let mut best_score = f64::NEG_INFINITY;
for idx in front {
let score = scalarize_scores(&candidates[idx].scores, score_options);
if score > best_score || (score == best_score && idx > best_idx) {
best_score = score;
best_idx = idx;
}
}
let best_score = if best_score.is_finite() {
best_score
} else {
0.0
};
Ok(json!({
"artifactVersion": "axir-optimized-artifact-v1",
"optimizerName": "GEPA",
"optimizerVersion": "axir-gepa-v1",
"componentMap": Value::Object(candidates[best_idx].cfg.clone()),
"demos": demos,
"metadata": {
"optimizer": "GEPA",
"selectorState": options.get("selectorState").or_else(|| options.get("selector_state")).cloned().unwrap_or_else(|| json!({})),
"bestScore": json_number(best_score),
"totalMetricCalls": total_calls,
"candidatesExplored": candidates.len(),
"report": {
"summary": "GEPA Multi-Objective Optimization Complete",
"statistics": {
"totalEvaluations": total_calls,
"candidatesExplored": candidates.len(),
"converged": true,
},
"paretoFrontier": {"solutionCount": candidates.len()},
},
},
"evidence": {
"avg": json_number(best_score),
"count": pareto_set.len(),
"totalMetricCalls": total_calls,
},
"provenance": {
"sourceProgramKind": request.get("programKind").or_else(|| request.get("programId")).and_then(Value::as_str).unwrap_or("unknown"),
"componentOwners": Value::Object(ax_gepa_component_owners(&components)),
},
}))
}
}
fn ax_gepa_option_f64(options: &Value, keys: &[&str], default: f64) -> f64 {
keys.iter()
.find_map(|key| options.get(*key).and_then(Value::as_f64))
.unwrap_or(default)
}
fn ax_gepa_option_usize(options: &Value, keys: &[&str], default: usize) -> usize {
keys.iter()
.find_map(|key| options.get(*key).and_then(Value::as_u64))
.map(|value| value as usize)
.unwrap_or(default)
}
fn ax_gepa_current_map(components: &[Value]) -> Map<String, Value> {
components
.iter()
.filter_map(|component| {
component.get("id").and_then(Value::as_str).map(|id| {
(
id.to_string(),
component
.get("current")
.cloned()
.unwrap_or_else(|| json!("")),
)
})
})
.collect()
}
fn ax_gepa_component_owners(components: &[Value]) -> Map<String, Value> {
components
.iter()
.filter_map(|component| {
let id = component.get("id").and_then(Value::as_str)?;
let owner = component
.get("owner")
.and_then(Value::as_str)
.unwrap_or_else(|| id.split("::").next().unwrap_or(id));
Some((id.to_string(), Value::String(owner.to_string())))
})
.collect()
}
fn ax_gepa_evaluate(
evaluator: &mut dyn FnMut(Value) -> AxResult<Value>,
cfg: &Map<String, Value>,
examples: &[Value],
phase: &str,
max_calls: usize,
total_calls: usize,
required: bool,
) -> AxResult<(Value, usize)> {
let needed = examples.len();
if total_calls + needed > max_calls {
if required {
return Err(AxError::runtime(format!(
"AxGEPA: options.maxMetricCalls={max_calls} is too small to evaluate the initial Pareto set; need at least {needed} metric calls"
)));
}
return Ok((
json!({"rows": [], "avg": 0.0, "sum": 0.0, "count": 0}),
total_calls,
));
}
let dataset = json!({"train": examples, "validation": []});
let result = evaluator(json!({
"candidateMap": Value::Object(cfg.clone()),
"componentMap": Value::Object(cfg.clone()),
"candidate": Value::Object(cfg.clone()),
"dataset": dataset,
"options": {
"dataset": dataset,
"phase": phase,
"captureTraces": true,
},
}))?;
let count = result
.get("count")
.and_then(Value::as_u64)
.map(|value| value as usize)
.unwrap_or(needed);
Ok((result, total_calls + count))
}
fn ax_gepa_eval_scores(result: &Value) -> Value {
result.get("avgScores").cloned().unwrap_or_else(
|| json!({"score": result.get("avg").and_then(Value::as_f64).unwrap_or(0.0)}),
)
}
fn ax_gepa_eval_sum(result: &Value) -> f64 {
result
.get("sum")
.and_then(Value::as_f64)
.unwrap_or_else(|| {
result
.get("rows")
.and_then(Value::as_array)
.map(|rows| {
rows.iter()
.filter_map(|row| row.get("scalar").and_then(Value::as_f64))
.sum()
})
.unwrap_or(0.0)
})
}
fn ax_gepa_reflection_values(request: &Value) -> Vec<String> {
request
.get("reflection_responses")
.or_else(|| request.get("reflectionResponses"))
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
.into_iter()
.filter_map(|response| {
let content = response
.get("results")
.and_then(Value::as_array)
.and_then(|items| items.first())
.and_then(|item| item.get("content"))
.and_then(Value::as_str)
.unwrap_or("")
.trim();
content
.split_once("New Value:")
.map(|(_, value)| value.trim().to_string())
.filter(|value| !value.is_empty())
})
.collect()
}
fn ax_gepa_validate_component_value(component: &Value, value: &str) -> bool {
if value.trim().is_empty() {
return false;
}
if component.get("format").and_then(Value::as_str) == Some("snake_case")
&& !value.chars().enumerate().all(|(index, ch)| {
ch == '_' || ch.is_ascii_lowercase() || (index > 0 && ch.is_ascii_digit())
})
{
return false;
}
if let Some(max_length) = component.get("maxLength").and_then(Value::as_u64) {
if value.chars().count() > max_length as usize {
return false;
}
}
component
.get("preserve")
.and_then(Value::as_array)
.map(|items| {
items
.iter()
.filter_map(Value::as_str)
.all(|literal| value.contains(literal))
})
.unwrap_or(true)
}
fn ax_gepa_dominates(a: &Value, b: &Value, eps: f64) -> bool {
let mut keys = BTreeSet::new();
if let Some(map) = a.as_object() {
keys.extend(map.keys().cloned());
}
if let Some(map) = b.as_object() {
keys.extend(map.keys().cloned());
}
let mut strict = false;
for key in keys {
let av = a.get(&key).and_then(Value::as_f64).unwrap_or(0.0);
let bv = b.get(&key).and_then(Value::as_f64).unwrap_or(0.0);
if av + eps < bv {
return false;
}
if av > bv + eps {
strict = true;
}
}
strict
}
fn ax_gepa_pareto_front(candidates: &[AxGEPACandidate], eps: f64) -> Vec<usize> {
let mut front = Vec::new();
for (index, candidate) in candidates.iter().enumerate() {
let dominated = candidates.iter().enumerate().any(|(other_index, other)| {
other_index != index && ax_gepa_dominates(&other.scores, &candidate.scores, eps)
});
if !dominated {
front.push(index);
}
}
front
}
/// Agentic Context Engineering optimizer (Generator -> Reflector -> Curator).
///
/// Deterministic playbook mutations reuse the Core-owned `_ace_*` ops; the
/// LLM-orchestrated reflect/curate steps are delegated to injected callables so
/// the loop is reproducible under conformance with scripted responses (mirrors
/// how `AxGEPA` accepts a reflection client).
pub struct AxACE {
reflector: Option<Box<dyn FnMut(&Value) -> Value>>,
curator: Option<Box<dyn FnMut(&Value) -> Value>>,
generator: Option<Box<dyn FnMut(&Value) -> Value>>,
config: Map<String, Value>,
initial_playbook: Option<Value>,
now: String,
playbook: Value,
generator_history: Vec<Value>,
delta_history: Vec<Value>,
last_prediction: Value,
}
fn ace_call_core(
f: fn(&[CoreValue]) -> Result<CoreValue, AxError>,
args: &[Value],
) -> AxResult<Value> {
let core_args: Vec<CoreValue> = args.iter().map(core_value_from_json).collect();
Ok(core_value_to_json(&f(&core_args)?))
}
fn ace_is_number(value: &Value) -> bool {
value.is_number()
}
impl AxACE {
pub fn new(options: Value) -> Self {
let options = if options.is_object() {
options
} else {
json!({})
};
let mut config = Map::new();
config.insert("maxEpochs".into(), json!(1));
config.insert("maxReflectorRounds".into(), json!(2));
config.insert("maxSectionSize".into(), json!(25));
config.insert("maxSerializedFieldChars".into(), json!(2000));
config.insert("similarityThreshold".into(), json!(0.95));
config.insert("allowDynamicSections".into(), json!(true));
for key in [
"maxEpochs",
"maxReflectorRounds",
"maxSectionSize",
"maxSerializedFieldChars",
"similarityThreshold",
"allowDynamicSections",
] {
if let Some(value) = options.get(key) {
if !value.is_null() {
config.insert(key.into(), value.clone());
}
}
}
let now = options
.get("now")
.and_then(Value::as_str)
.unwrap_or("1970-01-01T00:00:00.000Z")
.to_string();
let initial_playbook = options
.get("initialPlaybook")
.cloned()
.filter(|v| !v.is_null());
let playbook = match &initial_playbook {
Some(pb) => pb.clone(),
None => ace_call_core(_ace_empty_playbook, &[Value::Null, json!(now)])
.unwrap_or_else(|_| json!({})),
};
Self {
reflector: None,
curator: None,
generator: None,
config,
initial_playbook,
now,
playbook,
generator_history: Vec::new(),
delta_history: Vec::new(),
last_prediction: Value::Null,
}
}
pub fn with_callables(
mut self,
reflector: Option<Box<dyn FnMut(&Value) -> Value>>,
curator: Option<Box<dyn FnMut(&Value) -> Value>>,
generator: Option<Box<dyn FnMut(&Value) -> Value>>,
) -> Self {
self.reflector = reflector;
self.curator = curator;
self.generator = generator;
self
}
pub fn name(&self) -> &str {
"ACE"
}
pub fn version(&self) -> &str {
"axir-ace-v1"
}
fn int_config(&self, key: &str, fallback: i64) -> i64 {
self.config
.get(key)
.and_then(Value::as_i64)
.unwrap_or(fallback)
}
fn empty_playbook(&self) -> Value {
ace_call_core(_ace_empty_playbook, &[Value::Null, json!(self.now)])
.unwrap_or_else(|_| json!({}))
}
pub fn reset(&mut self) {
self.playbook = match &self.initial_playbook {
Some(pb) => pb.clone(),
None => self.empty_playbook(),
};
self.generator_history.clear();
self.delta_history.clear();
}
pub fn configure_auto(&mut self, level: &str) {
match level {
"light" => {
self.config.insert("maxEpochs".into(), json!(1));
self.config.insert("maxReflectorRounds".into(), json!(1));
}
"medium" => {
self.config.insert("maxEpochs".into(), json!(2));
self.config.insert("maxReflectorRounds".into(), json!(2));
}
"heavy" => {
self.config.insert("maxEpochs".into(), json!(3));
self.config.insert("maxReflectorRounds".into(), json!(3));
}
_ => {}
}
}
pub fn hydrate(&mut self, state: &Value) {
if let Some(pb) = state.get("playbook").filter(|v| !v.is_null()) {
self.playbook = pb.clone();
} else if let Some(pb) = &self.initial_playbook {
self.playbook = pb.clone();
} else {
self.playbook = self.empty_playbook();
}
let artifact = state.get("artifact").cloned().unwrap_or_else(|| json!({}));
self.generator_history = artifact
.get("feedback")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default();
self.delta_history = artifact
.get("history")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default();
}
pub fn get_playbook(&self) -> Value {
self.playbook.clone()
}
pub fn get_artifact(&self) -> Value {
json!({
"playbook": self.playbook.clone(),
"feedback": Value::Array(self.generator_history.clone()),
"history": Value::Array(self.delta_history.clone()),
})
}
fn render_playbook(&self) -> String {
ace_call_core(_ace_render_playbook, &[self.playbook.clone()])
.ok()
.and_then(|v| v.as_str().map(|s| s.to_string()))
.unwrap_or_default()
}
fn generator_output(&self, prediction: &Value) -> Value {
let mut reasoning = String::new();
let mut bullet_ids: Vec<Value> = Vec::new();
if let Some(map) = prediction.as_object() {
if let Some(thought) = map.get("thought") {
reasoning = match thought {
Value::String(s) => s.clone(),
other => other.to_string(),
};
}
if let Some(Value::Array(ids)) = map.get("bullet_ids") {
bullet_ids = ids.clone();
}
}
json!({
"reasoning": reasoning,
"answer": prediction.clone(),
"bulletIds": bullet_ids,
})
}
fn run_reflection_rounds(
&mut self,
example: &Value,
generator_output: &Value,
feedback: &Value,
) -> Value {
let rounds = self.int_config("maxReflectorRounds", 1).max(1);
let mut previous = Value::Null;
for _ in 0..rounds {
let reflection = self.run_reflector(example, generator_output, feedback, &previous);
if reflection.is_null() || reflection.as_object().map(|m| m.is_empty()).unwrap_or(true)
{
break;
}
previous = reflection.clone();
let error_text = reflection
.get("errorIdentification")
.and_then(Value::as_str)
.unwrap_or("")
.to_lowercase();
let error_text = error_text.trim();
let resolved = reflection
.get("metadata")
.and_then(|m| m.get("resolved"))
.and_then(Value::as_bool)
.unwrap_or(false);
if resolved
|| error_text.is_empty()
|| error_text.starts_with("no error")
|| error_text.starts_with("resolved")
{
break;
}
}
previous
}
fn run_reflector(
&mut self,
example: &Value,
generator_output: &Value,
feedback: &Value,
previous_reflection: &Value,
) -> Value {
let playbook_render = self.render_playbook();
if let Some(reflector) = self.reflector.as_mut() {
let payload = json!({
"question": example.clone(),
"generator_answer": generator_output.get("answer").cloned().unwrap_or(Value::Null),
"generator_reasoning": generator_output.get("reasoning").cloned().unwrap_or(Value::Null),
"playbook": playbook_render,
"feedback": feedback.clone(),
"previous_reflection": previous_reflection.clone(),
});
reflector(&payload)
} else {
Value::Null
}
}
fn run_curator(&mut self, example: &Value, reflection: &Value) -> Value {
if reflection.is_null() {
return Value::Null;
}
let playbook_render = self.render_playbook();
if let Some(curator) = self.curator.as_mut() {
let payload = json!({
"playbook": playbook_render,
"reflection": reflection.clone(),
"question_context": example.clone(),
"token_budget": 1024,
});
curator(&payload)
} else {
Value::Null
}
}
fn collect_protected_ids(operations: &[Value]) -> Vec<Value> {
let mut out = Vec::new();
for op in operations {
if op.get("type").and_then(Value::as_str) == Some("UPDATE") {
if let Some(id) = op.get("bulletId").filter(|v| !v.is_null()) {
out.push(id.clone());
}
}
}
out
}
fn metric_feedback(score: &Value) -> Value {
if ace_is_number(score) {
json!(format!("Metric score: {}", score))
} else {
Value::Null
}
}
fn apply_operations(
&mut self,
resolved: &mut Vec<Value>,
curator_result: &mut Option<Value>,
) -> AxResult<Vec<Value>> {
let protected = Self::collect_protected_ids(resolved);
let options = json!({
"maxSectionSize": self.config.get("maxSectionSize").cloned().unwrap_or(Value::Null),
"allowDynamicSections": self.config.get("allowDynamicSections").cloned().unwrap_or(Value::Null),
"enableAutoPrune": true,
"protectedBulletIds": protected,
});
let result = ace_call_core(
_ace_apply_curator_operations,
&[
self.playbook.clone(),
Value::Array(resolved.clone()),
options,
json!(self.now),
],
)?;
self.playbook = result.get("playbook").cloned().unwrap_or(Value::Null);
let applied_ids = result
.get("updatedBulletIds")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default();
let auto_removed = result
.get("autoRemoved")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default();
if !auto_removed.is_empty() {
resolved.extend(auto_removed);
if let Some(cr) = curator_result.as_mut() {
if let Some(map) = cr.as_object_mut() {
map.insert("operations".into(), Value::Array(resolved.clone()));
}
}
}
Ok(applied_ids)
}
fn apply_bullet_tags(&mut self, reflection: &Value) -> AxResult<()> {
if let Some(tags) = reflection.get("bulletTags").and_then(Value::as_array) {
for tag in tags {
self.playbook = ace_call_core(
_ace_update_bullet_feedback,
&[
self.playbook.clone(),
tag.get("id").cloned().unwrap_or(Value::Null),
tag.get("tag").cloned().unwrap_or(Value::Null),
json!(self.now),
],
)?;
}
}
Ok(())
}
fn normalize_and_resolve(
&mut self,
raw_curator: &Value,
generator_output: &Value,
reflection: &Value,
) -> AxResult<Vec<Value>> {
let raw_operations = raw_curator
.get("operations")
.cloned()
.unwrap_or(Value::Null);
let operations = ace_call_core(_ace_normalize_curator_operations, &[raw_operations])?;
let resolved = ace_call_core(
_ace_resolve_curator_operation_targets,
&[
operations,
self.playbook.clone(),
reflection.clone(),
generator_output.clone(),
],
)?;
Ok(resolved.as_array().cloned().unwrap_or_default())
}
fn process_example(
&mut self,
example: &Value,
score: &Value,
source: &str,
epoch: i64,
index: i64,
) -> AxResult<()> {
let prediction = self.last_prediction.clone();
let generator_output = self.generator_output(&prediction);
let feedback = Self::metric_feedback(score);
let reflection = self.run_reflection_rounds(example, &generator_output, &feedback);
let raw_curator = self.run_curator(example, &reflection);
let mut resolved =
self.normalize_and_resolve(&raw_curator, &generator_output, &reflection)?;
let mut curator_result = if !raw_curator.is_null() || !resolved.is_empty() {
let mut map = raw_curator.as_object().cloned().unwrap_or_default();
map.insert("operations".into(), Value::Array(resolved.clone()));
Some(Value::Object(map))
} else {
None
};
let mut applied_ids: Vec<Value> = Vec::new();
if !resolved.is_empty() {
applied_ids = self.apply_operations(&mut resolved, &mut curator_result)?;
}
if !reflection.is_null() {
self.apply_bullet_tags(&reflection)?;
}
if !resolved.is_empty() && !applied_ids.is_empty() {
self.playbook = ace_call_core(_ace_dedupe_playbook, &[self.playbook.clone()])?;
}
let score_value = if ace_is_number(score) {
score.clone()
} else {
json!(0)
};
let feedback_event = json!({
"example": example.clone(),
"prediction": prediction,
"score": score_value,
"generatorOutput": generator_output,
"reflection": reflection,
"curator": curator_result.clone().unwrap_or(Value::Null),
"timestamp": self.now.clone(),
});
self.generator_history.push(feedback_event);
let has_ops = curator_result
.as_ref()
.and_then(|cr| cr.get("operations"))
.and_then(Value::as_array)
.map(|ops| !ops.is_empty())
.unwrap_or(false);
if !applied_ids.is_empty() && has_ops {
self.delta_history.push(json!({
"source": source,
"epoch": epoch,
"exampleIndex": index,
"operations": curator_result.as_ref().and_then(|cr| cr.get("operations")).cloned().unwrap_or(json!([])),
}));
}
Ok(())
}
pub fn compile(
&mut self,
examples: &[Value],
metric_fn: &mut dyn FnMut(&Value) -> Value,
options: &Value,
) -> AxResult<Value> {
let ace_options = options
.get("aceOptions")
.or_else(|| options.get("ace_options"));
if let Some(ace_options) = ace_options {
for key in [
"maxEpochs",
"maxReflectorRounds",
"maxSectionSize",
"maxSerializedFieldChars",
"similarityThreshold",
"allowDynamicSections",
] {
if let Some(value) = ace_options.get(key) {
if !value.is_null() {
self.config.insert(key.into(), value.clone());
}
}
}
}
self.reset();
let epochs = self.int_config("maxEpochs", 1).max(1);
let mut best_score: Option<f64> = None;
for epoch in 0..epochs {
for (index, example) in examples.iter().enumerate() {
let prediction = match self.generator.as_mut() {
Some(generator) => generator(example),
None => json!({}),
};
self.last_prediction = prediction;
let score = metric_fn(example);
if let Some(value) = score.as_f64() {
best_score = Some(best_score.map_or(value, |b| b.max(value)));
}
self.process_example(example, &score, "compile", epoch, index as i64)?;
}
}
Ok(json!({
"playbook": self.playbook.clone(),
"artifact": self.get_artifact(),
"bestScore": best_score.unwrap_or(0.0),
"finalConfiguration": {"strategy": "ace", "epochs": epochs},
}))
}
pub fn apply_online_update(&mut self, args: &Value) -> AxResult<Value> {
if self.generator.is_none() {
return Err(AxError::runtime(
"AxACE: compile must run before apply_online_update".to_string(),
));
}
let example = args.get("example").cloned().unwrap_or_else(|| json!({}));
let prediction = args.get("prediction").cloned().unwrap_or(Value::Null);
self.last_prediction = prediction.clone();
let generator_output = self.generator_output(&prediction);
let feedback = args.get("feedback").cloned().unwrap_or(Value::Null);
let reflection = self.run_reflection_rounds(&example, &generator_output, &feedback);
let raw_curator = self.run_curator(&example, &reflection);
let mut resolved =
self.normalize_and_resolve(&raw_curator, &generator_output, &reflection)?;
let mut curator_result = if !raw_curator.is_null() || !resolved.is_empty() {
let mut map = raw_curator.as_object().cloned().unwrap_or_default();
map.insert("operations".into(), Value::Array(resolved.clone()));
Some(Value::Object(map))
} else {
None
};
if !reflection.is_null() {
self.apply_bullet_tags(&reflection)?;
}
let mut applied_ids: Vec<Value> = Vec::new();
if !resolved.is_empty() {
applied_ids = self.apply_operations(&mut resolved, &mut curator_result)?;
self.playbook = ace_call_core(_ace_dedupe_playbook, &[self.playbook.clone()])?;
}
let feedback_event = json!({
"example": example,
"prediction": prediction,
"score": 0,
"generatorOutput": generator_output,
"reflection": reflection,
"curator": curator_result.clone().unwrap_or(Value::Null),
"timestamp": self.now.clone(),
});
self.generator_history.push(feedback_event);
let has_ops = curator_result
.as_ref()
.and_then(|cr| cr.get("operations"))
.and_then(Value::as_array)
.map(|ops| !ops.is_empty())
.unwrap_or(false);
if !applied_ids.is_empty() && has_ops {
self.delta_history.push(json!({
"source": "online",
"epoch": -1,
"exampleIndex": (self.generator_history.len() as i64) - 1,
"operations": curator_result.as_ref().and_then(|cr| cr.get("operations")).cloned().unwrap_or(json!([])),
}));
}
Ok(curator_result.unwrap_or(Value::Null))
}
}
const ACE_REFLECTOR_SIGNATURE: &str =
"question:string \"Original task input serialized as JSON\", \
generator_answer:string \"Generator output serialized as JSON\", \
generator_reasoning?:string \"Generator reasoning trace\", \
playbook:string \"Current context playbook rendered as markdown\", \
expected_answer?:string \"Expected output when ground truth is available\", \
feedback?:string \"External feedback or reward signal\", \
previous_reflection?:string \"Most recent reflection JSON when running multi-round refinement\" \
-> reasoning:string \"Step-by-step analysis of generator performance\", \
errorIdentification:string \"Specific mistakes detected\", \
rootCauseAnalysis:string \"Underlying cause of the error\", \
correctApproach:string \"What the generator should do differently\", \
keyInsight:string \"Reusable insight to remember\", \
bulletTags:json \"Array of {id, tag} entries referencing playbook bullets\"";
const ACE_CURATOR_SIGNATURE: &str = "playbook:string \"Current playbook serialized as JSON\", \
reflection:string \"Latest reflection output serialized as JSON\", \
question_context:string \"Original task input serialized as JSON\", \
token_budget?:number \"Approximate token budget for curator response\" \
-> reasoning:string \"Justification for the proposed updates\", \
operations:json \"List of operations with type/section/content fields\"";
fn playbook_compose_instruction(base: &str, rendered: &str) -> String {
let mut parts: Vec<&str> = Vec::new();
let base = base.trim();
let rendered = rendered.trim();
if !base.is_empty() {
parts.push(base);
}
if !rendered.is_empty() {
parts.push(rendered);
}
parts.join("\n\n")
}
fn playbook_stringify(value: &Value) -> String {
match value {
Value::Null => String::new(),
Value::String(s) => s.clone(),
other => other.to_string(),
}
}
fn playbook_option<'a>(options: &'a Value, keys: &[&str]) -> Option<&'a Value> {
for key in keys {
if let Some(value) = options.get(*key) {
if !value.is_null() {
return Some(value);
}
}
}
None
}
/// A live, evolving context playbook bound to a program. Mirrors the TypeScript
/// `AxPlaybook`: grow it offline from examples (`evolve`), keep it growing online
/// from live feedback (`update`), render it into the program context (`apply_to`),
/// and persist/restore it (`to_json`/`load`). The evolution engine (ACE) is hidden
/// behind this surface, just as `optimize()` hides GEPA.
///
/// The bound program runs with the student client; the real reflector/curator are
/// focused `AxGen` sub-programs driven by the teacher client. The program, the
/// clients, the sub-programs, and the last prediction are held behind `Rc<RefCell>`
/// so the generator/reflector/curator closures installed into `AxACE` can mutate
/// them without statically aliasing the engine that owns those closures.
pub struct AxPlaybook<S: AxAIClient, T: AxAIClient> {
engine: AxACE,
program: Rc<RefCell<AxGen>>,
base_instruction: String,
started: bool,
last_prediction: Rc<RefCell<Value>>,
apply_hook: Rc<RefCell<Option<Box<dyn FnMut(&str)>>>>,
_student: std::marker::PhantomData<S>,
_teacher: std::marker::PhantomData<T>,
}
/// Build an evolving context `AxPlaybook` for a program. Pass the student model
/// under `"studentAI"` (and optionally `"teacherAI"`); the bound program runs with
/// the student while reflection/curation use the teacher. When `teacher` is `None`
/// the student is reused for reflection/curation.
pub fn playbook<S: AxAIClient + 'static, T: AxAIClient + 'static>(
program: AxGen,
student: Rc<RefCell<S>>,
teacher: Option<Rc<RefCell<T>>>,
options: Value,
) -> AxPlaybook<S, T> {
AxPlaybook::new(program, student, teacher, options)
}
impl<S: AxAIClient + 'static, T: AxAIClient + 'static> AxPlaybook<S, T> {
pub fn new(
program: AxGen,
student: Rc<RefCell<S>>,
teacher: Option<Rc<RefCell<T>>>,
options: Value,
) -> Self {
Self::from_shared(Rc::new(RefCell::new(program)), student, teacher, options)
}
/// Build a playbook that SHARES an already-`Rc<RefCell>`-wrapped program. Used by
/// `AxAgent::playbook()` so the playbook injects its composed instruction straight
/// into the live pipeline stage instead of a private clone.
pub fn from_shared(
program: Rc<RefCell<AxGen>>,
student: Rc<RefCell<S>>,
teacher: Option<Rc<RefCell<T>>>,
options: Value,
) -> Self {
let options = if options.is_object() {
options
} else {
json!({})
};
let verbose = options
.get("verbose")
.and_then(Value::as_bool)
.unwrap_or(false);
let base_instruction = program.borrow().get_instruction();
let mut engine_options = Map::new();
if let Some(now) = options.get("now").filter(|v| !v.is_null()) {
engine_options.insert("now".into(), now.clone());
}
for (canonical, keys) in [
("maxEpochs", &["maxEpochs", "max_epochs"][..]),
(
"maxReflectorRounds",
&["maxReflectorRounds", "max_reflector_rounds"][..],
),
(
"maxSectionSize",
&["maxSectionSize", "max_section_size"][..],
),
(
"allowDynamicSections",
&["allowDynamicSections", "allow_dynamic_sections"][..],
),
(
"initialPlaybook",
&["initialPlaybook", "initial_playbook"][..],
),
] {
if let Some(value) = playbook_option(&options, keys) {
engine_options.insert(canonical.into(), value.clone());
}
}
let last_prediction = Rc::new(RefCell::new(Value::Null));
let apply_hook: Rc<RefCell<Option<Box<dyn FnMut(&str)>>>> = Rc::new(RefCell::new(None));
let reflector_program: Rc<RefCell<Option<AxGen>>> = Rc::new(RefCell::new(None));
let curator_program: Rc<RefCell<Option<AxGen>>> = Rc::new(RefCell::new(None));
// The reflector/curator run on the teacher when supplied, else the student.
// Both clients are owned by the handle behind RefCell, so we capture an Rc to
// whichever one drives each sub-program. Keep an Rc to the student always so
// the generator can run the bound program on it.
let teacher_for_reflect: Option<Rc<RefCell<T>>> = teacher.clone();
let teacher_for_curate: Option<Rc<RefCell<T>>> = teacher;
// The real LLM generator: run the bound program with the student client and
// inject the current base instruction so each rollout is grounded.
let gen_program = program.clone();
let gen_student = student.clone();
let gen_last = last_prediction.clone();
let gen_base = base_instruction.clone();
let generator: Box<dyn FnMut(&Value) -> Value> = Box::new(move |example: &Value| {
let mut prog = gen_program.borrow_mut();
prog.set_instruction(&gen_base);
let prediction = {
let mut student = gen_student.borrow_mut();
prog.forward(&mut *student, example.clone())
};
let value = prediction.unwrap_or_else(|_| json!({}));
*gen_last.borrow_mut() = value.clone();
value
});
// The real LLM reflector: a focused AxGen sub-program driven by the teacher.
// The rendered playbook arrives inside the payload (the engine renders it), so
// the closure needs only the sub-program and the reflection client.
let reflect_student = student.clone();
let reflect_prog = reflector_program.clone();
let reflector: Box<dyn FnMut(&Value) -> Value> = Box::new(move |payload: &Value| {
if reflect_prog.borrow().is_none() {
match AxGen::new(ACE_REFLECTOR_SIGNATURE) {
Ok(gen) => *reflect_prog.borrow_mut() = Some(gen),
Err(_) => return Value::Null,
}
}
let mut request = Map::new();
request.insert(
"question".into(),
json!(playbook_stringify(
payload.get("question").unwrap_or(&Value::Null)
)),
);
request.insert(
"generator_answer".into(),
json!(playbook_stringify(
payload.get("generator_answer").unwrap_or(&Value::Null)
)),
);
request.insert(
"playbook".into(),
payload
.get("playbook")
.cloned()
.unwrap_or_else(|| json!("")),
);
if let Some(reasoning) = payload.get("generator_reasoning").filter(|v| !v.is_null()) {
request.insert("generator_reasoning".into(), reasoning.clone());
}
if let Some(feedback) = payload.get("feedback").filter(|v| !v.is_null()) {
request.insert("feedback".into(), feedback.clone());
}
if let Some(previous) = payload.get("previous_reflection").filter(|v| !v.is_null()) {
request.insert(
"previous_reflection".into(),
json!(playbook_stringify(previous)),
);
}
let mut prog = reflect_prog.borrow_mut();
let gen = prog
.as_mut()
.expect("reflector sub-program initialized above");
let result = match &teacher_for_reflect {
Some(teacher) => gen.forward(&mut *teacher.borrow_mut(), Value::Object(request)),
None => gen.forward(&mut *reflect_student.borrow_mut(), Value::Object(request)),
};
match result {
Ok(value) => value,
Err(err) => {
if verbose {
eprintln!("[AxPlaybook] reflector error: {}", err.message);
}
Value::Null
}
}
});
// The real LLM curator: a focused AxGen sub-program driven by the teacher.
let curate_student = student.clone();
let curate_prog = curator_program.clone();
let curator: Box<dyn FnMut(&Value) -> Value> = Box::new(move |payload: &Value| {
if curate_prog.borrow().is_none() {
match AxGen::new(ACE_CURATOR_SIGNATURE) {
Ok(gen) => *curate_prog.borrow_mut() = Some(gen),
Err(_) => return Value::Null,
}
}
let mut request = Map::new();
request.insert(
"playbook".into(),
payload
.get("playbook")
.cloned()
.unwrap_or_else(|| json!("")),
);
request.insert(
"reflection".into(),
json!(playbook_stringify(
payload.get("reflection").unwrap_or(&Value::Null)
)),
);
request.insert(
"question_context".into(),
json!(playbook_stringify(
payload.get("question_context").unwrap_or(&Value::Null)
)),
);
request.insert(
"token_budget".into(),
payload
.get("token_budget")
.cloned()
.unwrap_or_else(|| json!(1024)),
);
let mut prog = curate_prog.borrow_mut();
let gen = prog
.as_mut()
.expect("curator sub-program initialized above");
let result = match &teacher_for_curate {
Some(teacher) => gen.forward(&mut *teacher.borrow_mut(), Value::Object(request)),
None => gen.forward(&mut *curate_student.borrow_mut(), Value::Object(request)),
};
match result {
Ok(value) => value,
Err(err) => {
if verbose {
eprintln!("[AxPlaybook] curator error: {}", err.message);
}
Value::Null
}
}
});
let mut engine = AxACE::new(Value::Object(engine_options)).with_callables(
Some(reflector),
Some(curator),
Some(generator),
);
if let Some(auto) = options.get("auto").filter(|v| !v.is_null()) {
engine.configure_auto(&value_to_level(auto));
}
Self {
engine,
program,
base_instruction,
started: false,
last_prediction,
apply_hook,
_student: std::marker::PhantomData,
_teacher: std::marker::PhantomData,
}
}
/// Grow the playbook offline from labeled examples, scoring each rollout with
/// `metric_fn` ({"prediction", "example"}), then render the result into the bound
/// program. Returns `{bestScore, playbook}`.
pub fn evolve(
&mut self,
examples: &[Value],
metric_fn: &mut dyn FnMut(&Value) -> Value,
options: &Value,
) -> AxResult<Value> {
let options = if options.is_object() {
options.clone()
} else {
json!({})
};
if let Some(auto) = options.get("auto").filter(|v| !v.is_null()) {
self.engine.configure_auto(&value_to_level(auto));
}
let mut ace_options = Map::new();
if let Some(value) = playbook_option(&options, &["maxEpochs", "max_epochs"]) {
ace_options.insert("maxEpochs".into(), value.clone());
}
let last_prediction = self.last_prediction.clone();
let mut wrapped_metric = |example: &Value| -> Value {
let args = json!({
"prediction": last_prediction.borrow().clone(),
"example": example.clone(),
});
metric_fn(&args)
};
let result = self.engine.compile(
examples,
&mut wrapped_metric,
&json!({"aceOptions": Value::Object(ace_options)}),
)?;
self.started = true;
self.inject();
Ok(json!({
"bestScore": result.get("bestScore").cloned().unwrap_or_else(|| json!(0)),
"playbook": result.get("playbook").cloned().unwrap_or(Value::Null),
}))
}
/// Refine the playbook online from a single live interaction. Safe to call
/// without a prior `evolve`/`load`; the engine is hydrated lazily on first use.
pub fn update(&mut self, args: &Value) -> AxResult<Value> {
if !self.started {
self.engine
.hydrate(&json!({"playbook": self.engine.get_playbook()}));
self.started = true;
}
let args = if args.is_object() {
args.clone()
} else {
json!({})
};
let result = self.engine.apply_online_update(&args)?;
self.inject();
Ok(result)
}
/// Render the current playbook into a program context (defaults to the bound
/// program). When a different program is passed, its instruction is composed with
/// the rendered playbook in place.
pub fn apply_to(&mut self, program: Option<&mut AxGen>) {
match program {
Some(other) => {
let composed =
playbook_compose_instruction(&other.get_instruction(), &self.render());
other.set_instruction(&composed);
}
None => self.inject(),
}
}
/// Return the current playbook as a markdown block.
pub fn render(&self) -> String {
ace_call_core(_ace_render_playbook, &[self.engine.get_playbook()])
.ok()
.and_then(|v| v.as_str().map(|s| s.to_string()))
.unwrap_or_default()
}
/// Return a serializable snapshot of the playbook and its history.
pub fn get_state(&self) -> Value {
json!({
"playbook": self.engine.get_playbook(),
"artifact": self.engine.get_artifact(),
})
}
/// Alias for [`get_state`](Self::get_state).
pub fn to_json(&self) -> Value {
self.get_state()
}
/// Restore a snapshot into this handle and render it into the bound program.
pub fn load(&mut self, snapshot: &Value) -> &mut Self {
let snapshot = if snapshot.is_object() {
snapshot.clone()
} else {
json!({})
};
self.engine.hydrate(&json!({
"playbook": snapshot.get("playbook").cloned().unwrap_or(Value::Null),
"artifact": snapshot.get("artifact").cloned().unwrap_or(Value::Null),
}));
self.started = true;
self.inject();
self
}
/// Set the evolution intensity preset (`"light"`, `"medium"`, or `"heavy"`).
pub fn configure_auto(&mut self, level: &str) {
self.engine.configure_auto(level);
}
/// Clear the playbook back to its initial state.
pub fn reset(&mut self) {
self.engine.reset();
self.started = false;
}
/// Redirect playbook injection. Used to push the rendered playbook into a
/// pipeline stage instead of the bound program.
pub fn set_apply_hook(&mut self, hook: Box<dyn FnMut(&str)>) {
*self.apply_hook.borrow_mut() = Some(hook);
}
fn inject(&mut self) {
let rendered = self.render();
{
let mut hook = self.apply_hook.borrow_mut();
if let Some(hook) = hook.as_mut() {
hook(&rendered);
return;
}
}
let composed = playbook_compose_instruction(&self.base_instruction, &rendered);
self.program.borrow_mut().set_instruction(&composed);
}
}
fn value_to_level(value: &Value) -> String {
match value {
Value::String(s) => s.clone(),
other => other.to_string(),
}
}
pub fn optimize<P: AxProgram>(
program: &mut P,
examples: Value,
options: Value,
) -> AxResult<OptimizedArtifact> {
let max_metric_calls = options
.get("maxMetricCalls")
.or_else(|| options.get("max_metric_calls"))
.and_then(Value::as_u64)
.unwrap_or(100);
let train = if examples.is_array() {
examples.as_array().cloned().unwrap_or_default()
} else {
examples
.get("train")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
};
let bootstrap_enabled = options
.get("bootstrap")
.and_then(Value::as_bool)
.unwrap_or(train.len() <= 8);
let bootstrap_options = options.get("bootstrap").and_then(Value::as_object);
let quality_threshold = bootstrap_options
.and_then(|opts| {
opts.get("qualityThreshold")
.or_else(|| opts.get("quality_threshold"))
})
.or_else(|| {
options
.get("qualityThreshold")
.or_else(|| options.get("quality_threshold"))
})
.and_then(Value::as_f64)
.unwrap_or(0.5);
let max_demos = bootstrap_options
.and_then(|opts| opts.get("maxDemos").or_else(|| opts.get("max_demos")))
.or_else(|| options.get("maxDemos").or_else(|| options.get("max_demos")))
.and_then(Value::as_u64)
.unwrap_or(4) as usize;
let demos = if bootstrap_enabled {
train
.iter()
.filter(|example| {
example
.get("score")
.or_else(|| example.get("metric_score"))
.and_then(Value::as_f64)
.unwrap_or(1.0)
>= quality_threshold
})
.take(max_demos)
.cloned()
.map(|example| json!({"programId": "root", "traces": [example]}))
.collect::<Vec<_>>()
} else {
Vec::new()
};
Ok(json!({
"artifactVersion": "axir-optimized-artifact-v1",
"optimizerName": "optimize",
"optimizerVersion": "axir-optimize-helper-v1",
"componentMap": {},
"demos": demos,
"metadata": {
"optimizer": "BootstrapFewShot->GEPA",
"programKind": program.program_kind(),
"maxMetricCalls": max_metric_calls,
"bootstrap": bootstrap_enabled
}
}))
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct AxMemory {
pub entries: Vec<Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct RuntimeCapabilities {
pub inspect_globals: bool,
pub snapshot_globals: bool,
pub patch_globals: bool,
}
pub type AxAgentClarificationError = AxError;
pub struct AxBalancer {
services: Vec<OpenAICompatibleClient>,
current: usize,
}
pub struct MultiServiceRouter {
services: BTreeMap<String, OpenAICompatibleClient>,
}
pub struct ProviderRouter {
providers: BTreeMap<String, OpenAICompatibleClient>,
}
impl AxBalancer {
pub fn new() -> Self {
Self {
services: Vec::new(),
current: 0,
}
}
pub fn from_services(services: Vec<OpenAICompatibleClient>) -> Self {
Self {
services,
current: 0,
}
}
pub fn with_service(mut self, service: OpenAICompatibleClient) -> Self {
self.services.push(service);
self
}
fn current_service(&mut self) -> AxResult<&mut OpenAICompatibleClient> {
if self.services.is_empty() {
return Err(AxError::validation(
"AxBalancer requires at least one service",
));
}
if self.current >= self.services.len() {
self.current = 0;
}
Ok(&mut self.services[self.current])
}
pub fn chat(&mut self, request: Value) -> AxResult<Value> {
self.current_service()?.chat(request)
}
pub fn stream(&mut self, request: Value) -> AxResult<Vec<Value>> {
self.current_service()?.stream(request)
}
pub fn embed(&mut self, request: Value) -> AxResult<Value> {
self.current_service()?.embed(request)
}
pub fn transcribe(&mut self, request: Value) -> AxResult<Value> {
self.current_service()?.transcribe(request)
}
pub fn speak(&mut self, request: Value) -> AxResult<Value> {
self.current_service()?.speak(request)
}
}
impl Default for AxBalancer {
fn default() -> Self {
Self::new()
}
}
impl MultiServiceRouter {
pub fn new() -> Self {
Self {
services: BTreeMap::new(),
}
}
pub fn from_services<K: Into<String>>(services: Vec<(K, OpenAICompatibleClient)>) -> Self {
let mut router = Self::new();
for (key, service) in services {
router.services.insert(key.into(), service);
}
router
}
pub fn with_service(mut self, key: impl Into<String>, service: OpenAICompatibleClient) -> Self {
self.services.insert(key.into(), service);
self
}
fn service_key(&self, request: &Value) -> AxResult<String> {
if let Some(model) = request
.get("model")
.or_else(|| request.get("model_key"))
.or_else(|| request.get("modelKey"))
.and_then(Value::as_str)
{
if self.services.contains_key(model) {
return Ok(model.to_string());
}
}
self.services
.keys()
.next()
.cloned()
.ok_or_else(|| AxError::validation("MultiServiceRouter requires at least one service"))
}
fn service_for(&mut self, request: &Value) -> AxResult<&mut OpenAICompatibleClient> {
let key = self.service_key(request)?;
self.services.get_mut(&key).ok_or_else(|| {
AxError::validation(format!("MultiServiceRouter service {key} not found"))
})
}
pub fn chat(&mut self, request: Value) -> AxResult<Value> {
self.service_for(&request)?.chat(request)
}
pub fn stream(&mut self, request: Value) -> AxResult<Vec<Value>> {
self.service_for(&request)?.stream(request)
}
pub fn embed(&mut self, request: Value) -> AxResult<Value> {
self.service_for(&request)?.embed(request)
}
pub fn transcribe(&mut self, request: Value) -> AxResult<Value> {
self.service_for(&request)?.transcribe(request)
}
pub fn speak(&mut self, request: Value) -> AxResult<Value> {
self.service_for(&request)?.speak(request)
}
}
impl Default for MultiServiceRouter {
fn default() -> Self {
Self::new()
}
}
impl ProviderRouter {
pub fn new() -> Self {
Self {
providers: BTreeMap::new(),
}
}
pub fn from_providers<K: Into<String>>(providers: Vec<(K, OpenAICompatibleClient)>) -> Self {
let mut router = Self::new();
for (key, provider) in providers {
router.providers.insert(key.into(), provider);
}
router
}
pub fn with_provider(
mut self,
key: impl Into<String>,
provider: OpenAICompatibleClient,
) -> Self {
self.providers.insert(key.into(), provider);
self
}
pub fn get_routing_recommendation(&self, request: Value) -> AxResult<Value> {
let provider = request
.get("provider")
.and_then(Value::as_str)
.filter(|name| self.providers.contains_key(*name))
.map(str::to_string)
.or_else(|| self.providers.keys().next().cloned())
.ok_or_else(|| AxError::validation("ProviderRouter requires at least one provider"))?;
Ok(json!({"provider": provider, "reason": "available"}))
}
fn provider_key(&self, request: &Value) -> AxResult<String> {
if let Some(provider) = request.get("provider").and_then(Value::as_str) {
if self.providers.contains_key(provider) {
return Ok(provider.to_string());
}
}
self.providers
.keys()
.next()
.cloned()
.ok_or_else(|| AxError::validation("ProviderRouter requires at least one provider"))
}
fn provider_for(&mut self, request: &Value) -> AxResult<&mut OpenAICompatibleClient> {
let key = self.provider_key(request)?;
self.providers
.get_mut(&key)
.ok_or_else(|| AxError::validation(format!("ProviderRouter provider {key} not found")))
}
pub fn chat(&mut self, request: Value) -> AxResult<Value> {
self.provider_for(&request)?.chat(request)
}
pub fn stream(&mut self, request: Value) -> AxResult<Vec<Value>> {
self.provider_for(&request)?.stream(request)
}
pub fn embed(&mut self, request: Value) -> AxResult<Value> {
self.provider_for(&request)?.embed(request)
}
pub fn transcribe(&mut self, request: Value) -> AxResult<Value> {
self.provider_for(&request)?.transcribe(request)
}
pub fn speak(&mut self, request: Value) -> AxResult<Value> {
self.provider_for(&request)?.speak(request)
}
}
impl Default for ProviderRouter {
fn default() -> Self {
Self::new()
}
}
pub fn get_supported_ai_models() -> Vec<&'static str> {
vec!["gpt-4.1-mini", "gpt-4.1", "gpt-4o-mini"]
}
/// A host callable the agent runtime can expose to actor code (e.g. the
/// built-in `llmQuery`). JSON-typed both ways so it crosses the runtime
/// boundary cleanly; `Send + Sync` so a concrete runtime may store it.
pub type AxHostCallable = Arc<dyn Fn(Value) -> AxResult<Value> + Send + Sync + 'static>;
pub trait AxCodeRuntime {
fn language(&self) -> &str;
fn usage_instructions(&self) -> &str {
""
}
fn create_session(
&mut self,
globals: Value,
options: Value,
) -> AxResult<Box<dyn AxCodeSession>>;
/// Register a host callable under `name`. Default no-op so runtimes that
/// do not host callables are unaffected; the embedded JS engines override
/// it so the agent wrapper can wire the built-in `llmQuery` primitive.
fn register_host_callable(&mut self, _name: &str, _callable: AxHostCallable) -> AxResult<()> {
Ok(())
}
}
pub trait AxCodeSession {
fn execute(&mut self, code: &str, options: Value) -> AxResult<RuntimeEnvelope>;
fn inspect_globals(&mut self, _options: Value) -> AxResult<Value> {
Ok(json!({}))
}
fn snapshot_globals(&mut self, _options: Value) -> AxResult<Value> {
Ok(json!({}))
}
fn patch_globals(&mut self, snapshot: Value, _options: Value) -> AxResult<Value> {
Ok(snapshot)
}
fn close(&mut self) -> AxResult<Value> {
Ok(json!({"closed": true}))
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct RuntimeEnvelope {
#[serde(flatten)]
pub payload: Value,
}
impl RuntimeEnvelope {
pub fn final_payload(value: Value) -> Self {
Self {
payload: json!({"kind": "final", "type": "final", "completion_payload": {"args": [value.clone()]}, "args": [value]}),
}
}
pub fn timeout(message: impl Into<String>) -> Self {
Self {
payload: json!({"kind": "error", "error_category": "timeout", "message": message.into()}),
}
}
}
pub struct ProcessCodeRuntime {
command: Vec<String>,
child: Option<Arc<Mutex<ProtocolChild>>>,
language: String,
}
impl Drop for ProcessCodeRuntime {
fn drop(&mut self) {
// A leaked runtime subprocess holds the inherited stdio pipes open,
// wedging any harness that waits on them; kill it unconditionally.
if let Some(child) = &self.child {
if let Ok(mut child) = child.lock() {
let _ = child.child.kill();
}
}
}
}
pub type RuntimeProtocolClient = ProcessCodeRuntime;
struct ProtocolChild {
child: Child,
stdin: ChildStdin,
stdout: BufReader<std::process::ChildStdout>,
next_id: usize,
}
impl ProcessCodeRuntime {
pub fn new(command: impl IntoIterator<Item = impl Into<String>>) -> Self {
Self {
command: command.into_iter().map(Into::into).collect(),
child: None,
language: "JavaScript".to_string(),
}
}
pub fn shutdown(&mut self) -> AxResult<()> {
if let Some(child) = &self.child {
let mut child = child
.lock()
.map_err(|_| AxError::runtime("runtime protocol lock poisoned"))?;
let _ = child.request("shutdown", None, json!({}));
let _ = child.child.kill();
}
self.child = None;
Ok(())
}
fn child(&mut self) -> AxResult<Arc<Mutex<ProtocolChild>>> {
if self.child.is_none() {
if self.command.is_empty() {
return Err(AxError::runtime("process runtime command is empty"));
}
let mut command = Command::new(&self.command[0]);
command.args(&self.command[1..]);
command
.stdin(Stdio::piped())
.stdout(Stdio::piped())
.stderr(Stdio::inherit());
let mut child = command.spawn()?;
let stdin = child
.stdin
.take()
.ok_or_else(|| AxError::runtime("missing runtime stdin"))?;
let stdout = child
.stdout
.take()
.ok_or_else(|| AxError::runtime("missing runtime stdout"))?;
self.child = Some(Arc::new(Mutex::new(ProtocolChild {
child,
stdin,
stdout: BufReader::new(stdout),
next_id: 0,
})));
}
Ok(self.child.as_ref().expect("runtime child exists").clone())
}
// python ProcessCodeRuntime._request: the raw protocol passthrough the
// protocol conformance fixtures use for capabilities/unknown-op/session
// probes. Returns the full response object (callers read "result").
pub(crate) fn request(
&mut self,
op: &str,
session_id: Option<&str>,
payload: Value,
) -> AxResult<Value> {
let child = self.child()?;
let mut child = child
.lock()
.map_err(|_| AxError::runtime("runtime protocol lock poisoned"))?;
child.request(op, session_id, payload)
}
}
impl AxCodeRuntime for ProcessCodeRuntime {
fn language(&self) -> &str {
&self.language
}
fn create_session(
&mut self,
globals: Value,
options: Value,
) -> AxResult<Box<dyn AxCodeSession>> {
let child = self.child()?;
let response = {
let mut child = child
.lock()
.map_err(|_| AxError::runtime("runtime protocol lock poisoned"))?;
child.request(
"create_session",
None,
json!({"globals": globals, "options": options}),
)?
};
let session_id = response
.get("session_id")
.or_else(|| {
response
.get("result")
.and_then(|result| result.get("session_id"))
})
.and_then(Value::as_str)
.ok_or_else(|| AxError::runtime("runtime protocol response missing session_id"))?
.to_string();
Ok(Box::new(ProcessCodeSession { child, session_id }))
}
}
pub struct ProcessCodeSession {
child: Arc<Mutex<ProtocolChild>>,
session_id: String,
}
impl AxCodeSession for ProcessCodeSession {
fn execute(&mut self, code: &str, options: Value) -> AxResult<RuntimeEnvelope> {
// python ProcessCodeSession.execute converts protocol failures into
// error envelopes instead of raising.
let payload = match self.request("execute", json!({"code": code, "options": options})) {
Ok(result) => result,
Err(err) => json!({
"kind": "error",
"is_error": true,
"error_category": err.category,
"error": err.message,
}),
};
Ok(RuntimeEnvelope { payload })
}
fn inspect_globals(&mut self, options: Value) -> AxResult<Value> {
self.request("inspect_globals", options)
}
fn snapshot_globals(&mut self, options: Value) -> AxResult<Value> {
self.request("snapshot_globals", options)
}
fn patch_globals(&mut self, snapshot: Value, options: Value) -> AxResult<Value> {
self.request(
"patch_globals",
json!({"globals": snapshot, "options": options}),
)
}
fn close(&mut self) -> AxResult<Value> {
self.request("close", json!({}))
}
}
impl ProcessCodeSession {
fn request(&mut self, op: &str, payload: Value) -> AxResult<Value> {
let mut child = self
.child
.lock()
.map_err(|_| AxError::runtime("runtime protocol lock poisoned"))?;
let response = child.request(op, Some(&self.session_id), payload)?;
Ok(response.get("result").cloned().unwrap_or(Value::Null))
}
}
impl ProtocolChild {
// Mirrors python ProcessCodeRuntime._request: validates response id and
// session_id echoes and surfaces protocol failures with the reference
// error strings. Returns the full response object.
fn request(&mut self, op: &str, session_id: Option<&str>, payload: Value) -> AxResult<Value> {
self.next_id += 1;
let id = self.next_id.to_string();
let mut message = json!({"id": id, "op": op, "payload": payload});
if let Some(session_id) = session_id {
message["session_id"] = Value::String(session_id.to_string());
}
writeln!(self.stdin, "{}", message)?;
self.stdin.flush()?;
let mut line = String::new();
self.stdout.read_line(&mut line)?;
if line.trim().is_empty() {
return Err(AxError::runtime(self.closed_without_response_message()));
}
let response: Value = serde_json::from_str(&line).map_err(|err| {
AxError::runtime(format!("runtime protocol invalid JSON response: {err}"))
})?;
if !response.is_object() {
return Err(AxError::runtime(
"runtime protocol response must be an object",
));
}
// python: str(response.get("id")) != str(message["id"])
let response_id = match response.get("id") {
Some(Value::String(text)) => text.clone(),
Some(value) => value.to_string(),
None => "None".to_string(),
};
if response_id != id {
return Err(AxError::runtime("runtime protocol response id mismatch"));
}
if let Some(session_id) = session_id {
let echoed = response.get("session_id");
let matches = match echoed {
None | Some(Value::Null) => true,
Some(value) => value.as_str() == Some(session_id),
};
if !matches {
return Err(AxError::runtime("runtime protocol session_id mismatch"));
}
}
if response.get("ok").and_then(Value::as_bool) == Some(false) {
let error = response.get("error").cloned().unwrap_or_else(|| json!({}));
return Err(AxError::new(
error
.get("category")
.and_then(Value::as_str)
.unwrap_or("runtime"),
error
.get("message")
.and_then(Value::as_str)
.unwrap_or("runtime protocol error"),
));
}
Ok(response)
}
// python ProcessCodeRuntime._closed_without_response_message; stderr is
// inherited on the Rust side, so only the exit code is appended.
fn closed_without_response_message(&mut self) -> String {
let mut status = self.child.try_wait().ok().flatten();
if status.is_none() {
std::thread::sleep(Duration::from_millis(100));
status = self.child.try_wait().ok().flatten();
}
let mut message = "runtime protocol process closed without a response".to_string();
if let Some(code) = status.and_then(|status| status.code()) {
message.push_str(&format!(" (exit code {code})"));
}
message
}
}
pub fn parse_json(text: &str) -> AxResult<Value> {
Ok(serde_json::from_str(text)?)
}
pub fn stable_stringify(value: &Value) -> String {
match value {
Value::Object(map) => {
let mut keys = map.keys().collect::<Vec<_>>();
keys.sort();
let entries = keys
.into_iter()
.map(|key| {
format!(
"{}:{}",
serde_json::to_string(key).unwrap(),
stable_stringify(&map[key])
)
})
.collect::<Vec<_>>();
format!("{{{}}}", entries.join(","))
}
Value::Array(items) => {
let values = items.iter().map(stable_stringify).collect::<Vec<_>>();
format!("[{}]", values.join(","))
}
_ => serde_json::to_string(value).unwrap_or_else(|_| "null".to_string()),
}
}
pub fn run_conformance_fixture(fixture: Value) -> AxResult<()> {
let kind = fixture
.get("kind")
.and_then(Value::as_str)
.ok_or_else(|| AxError::new("fixture", "fixture missing kind"))?;
match kind {
"signature" => run_signature_fixture(&fixture)?,
"signature_error" => run_signature_error_fixture(&fixture)?,
"json_schema" => run_json_schema_fixture(&fixture)?,
"validate_output" => run_validate_output_fixture(&fixture)?,
"validate_value" => run_validate_value_fixture(&fixture)?,
"strip_internal" => run_strip_internal_fixture(&fixture)?,
"prompt" => run_prompt_fixture(&fixture)?,
"template" => run_template_fixture(&fixture)?,
"template_error" => run_template_error_fixture(&fixture)?,
"template_validate" => run_template_validate_fixture(&fixture)?,
"forward" => run_simple_forward_fixture(&fixture)?,
"stream" => run_stream_fixture(&fixture)?,
"ai_chat" => run_ai_chat_fixture(&fixture)?,
"ai_stream" => run_ai_stream_fixture(&fixture)?,
"ai_embed" => run_ai_embed_fixture(&fixture)?,
"ai_transcribe" => run_ai_transcribe_fixture(&fixture)?,
"ai_speak" => run_ai_speak_fixture(&fixture)?,
"ai_realtime" => run_ai_realtime_fixture(&fixture)?,
"ai_provider_descriptor"
| "ai_provider_registry"
| "ai_model_catalog_audit"
| "ai_model_catalog_runtime"
| "ai_multiservice_router"
| "ai_provider_router"
| "ai_balancer"
| "ai_error"
| "ai_unsupported" => run_ai_support_fixture(kind, &fixture)?,
"agent_forward"
| "agent_prompt"
| "agent_runtime_adapter"
| "agent_runtime_policy"
| "agent_runtime_protocol"
| "agent_runtime_real"
| "agent_runtime_session" => run_agent_fixture(kind, &fixture)?,
"flow" => run_flow_fixture(&fixture)?,
"optimize" => run_optimize_fixture(&fixture)?,
"program_contract" => run_program_contract_fixture(&fixture)?,
"mcp" => mcp::run_mcp_conformance_fixture(&fixture)?,
_ => run_explicit_non_ai_conformance_fixture(kind, &fixture)?,
}
Ok(())
}
fn run_explicit_non_ai_conformance_fixture(kind: &str, _fixture: &Value) -> AxResult<()> {
Err(AxError::new(
"fixture",
format!("unsupported Rust conformance fixture kind {kind}"),
))
}
fn run_signature_fixture(fixture: &Value) -> AxResult<()> {
let sig = build_fixture_signature(fixture)?;
if let Some(expected) = fixture.get("expected_signature") {
expect_json_equal("signature", &signature_payload(&sig), expected)?;
}
Ok(())
}
fn run_signature_error_fixture(fixture: &Value) -> AxResult<()> {
match build_fixture_signature(fixture) {
Ok(_) => Err(AxError::new(
"fixture",
"expected signature construction to fail",
)),
Err(err) => {
expect_error_category(&err, fixture)?;
if let Some(expected) = fixture
.get("expected_error_contains")
.and_then(Value::as_str)
{
if !err.message.contains(expected) {
return Err(AxError::new(
"fixture",
format!(
"expected error containing {expected:?}, got {}",
err.message
),
));
}
}
Ok(())
}
}
}
fn run_json_schema_fixture(fixture: &Value) -> AxResult<()> {
let sig = build_fixture_signature(fixture)?;
let target = fixture
.get("target")
.and_then(Value::as_str)
.unwrap_or("outputs");
let schema = sig.to_json_schema_with_options(
target,
fixture.get("schema_options").unwrap_or(&Value::Null),
);
if let Some(expected) = fixture.get("expected_schema") {
expect_json_equal("json schema", &schema, expected)?;
}
Ok(())
}
fn run_validate_output_fixture(fixture: &Value) -> AxResult<()> {
let sig = build_fixture_signature(fixture)?;
let values = fixture.get("values").cloned().unwrap_or_else(|| json!({}));
let result = validate_fields_native(&sig.outputs, &values);
expect_validation_result(result, fixture)
}
fn run_validate_value_fixture(fixture: &Value) -> AxResult<()> {
let field = fixture
.get("field")
.map(|raw| field_from_spec("value", raw))
.or_else(|| {
fixture
.get("field_spec")
.map(|raw| field_from_spec("value", raw))
})
.unwrap_or_else(|| Field::new("value", FieldType::string()));
let value = fixture.get("value").cloned().unwrap_or(Value::Null);
let result = validate_field_value_native(&field, &value);
expect_validation_result(result, fixture)
}
fn run_strip_internal_fixture(fixture: &Value) -> AxResult<()> {
let sig = build_fixture_signature(fixture)?;
let mut values = fixture.get("values").cloned().unwrap_or_else(|| json!({}));
strip_internal_fields(&sig.outputs, &mut values);
if let Some(expected) = fixture.get("expected_output") {
expect_json_equal("strip internal output", &values, expected)?;
}
Ok(())
}
fn run_prompt_fixture(fixture: &Value) -> AxResult<()> {
let sig = build_fixture_signature(fixture)?;
let options = CoreValue::new_map();
for (key, names) in [
("custom_template", vec!["custom_template", "customTemplate"]),
(
"structured_output_function_name",
vec![
"structured_output_function_name",
"structuredOutputFunctionName",
],
),
("instruction", vec!["instruction"]),
] {
for name in names {
let value = fixture
.get(name)
.or_else(|| fixture.get("options").and_then(|o| o.get(name)));
if let Some(value) = value {
core_set(&options, CoreValue::from(key), core_value_from_json(value))?;
break;
}
}
}
let values = fixture
.get("input")
.or_else(|| fixture.get("values"))
.cloned()
.unwrap_or_else(|| json!({}));
let tools = fixture.get("tools").cloned().unwrap_or_else(|| json!([]));
let messages = render_prompt(&[
core_signature_value(&sig)?,
core_value_from_json(&values),
core_value_from_json(&tools),
options,
])?;
let messages_json = core_value_to_json(&messages);
if let Some(expected) = fixture.get("expected_messages") {
expect_json_equal("messages", &messages_json, expected)?;
}
let prompt_text = stable_stringify(&messages_json);
for item in fixture
.get("expected_prompt_contains")
.and_then(Value::as_array)
.into_iter()
.flatten()
{
let needle = item.as_str().unwrap_or_default();
if !prompt_text.contains(needle) {
return Err(AxError::new(
"fixture",
format!("prompt missing {needle:?}"),
));
}
}
Ok(())
}
fn run_template_fixture(fixture: &Value) -> AxResult<()> {
let rendered = render_fixture_template(
fixture
.get("template")
.and_then(Value::as_str)
.unwrap_or_default(),
fixture.get("vars").unwrap_or(&Value::Null),
)?;
if let Some(expected) = fixture.get("expected_output") {
expect_json_equal("template output", &Value::String(rendered), expected)?;
}
Ok(())
}
fn run_template_error_fixture(fixture: &Value) -> AxResult<()> {
let operation = fixture
.get("operation")
.and_then(Value::as_str)
.unwrap_or("render");
let result = if operation == "validate" {
validate_fixture_template(
fixture
.get("template")
.and_then(Value::as_str)
.unwrap_or_default(),
fixture
.get("required_variables")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default(),
)
} else {
render_fixture_template(
fixture
.get("template")
.and_then(Value::as_str)
.unwrap_or_default(),
fixture.get("vars").unwrap_or(&Value::Null),
)
.map(|_| ())
};
match result {
Ok(_) => Err(AxError::new(
"fixture",
"expected template operation to fail",
)),
Err(err) => {
if let Some(expected) = fixture
.get("expected_error_contains")
.and_then(Value::as_str)
{
if !err.message.contains(expected) {
return Err(AxError::new(
"fixture",
format!(
"expected error containing {expected:?}, got {}",
err.message
),
));
}
}
Ok(())
}
}
}
fn run_template_validate_fixture(fixture: &Value) -> AxResult<()> {
validate_fixture_template(
fixture
.get("template")
.and_then(Value::as_str)
.unwrap_or_default(),
fixture
.get("required_variables")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default(),
)?;
if fixture.get("expected_result").and_then(Value::as_bool) == Some(false) {
return Err(AxError::new(
"fixture",
"template validation unexpectedly passed",
));
}
Ok(())
}
// python: _run_stream. Folds the chunks through the emitted fold_stream after
// every event so streaming assertions fire at the same point in the stream.
fn run_stream_fixture(fixture: &Value) -> AxResult<()> {
let events = fixture
.get("stream_events")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default();
let assertions = fixture
.get("streaming_assertions")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default();
let mut chunks = Vec::new();
let mut folded = String::new();
for event in events {
chunks.push(event);
folded = fold_fixture_stream(&chunks)?;
for assertion in &assertions {
if let Some(needle) = assertion
.get("not_contains")
.or_else(|| assertion.get("notContains"))
.and_then(Value::as_str)
{
if folded.contains(needle) {
let err = AxError::runtime(
assertion
.get("message")
.and_then(Value::as_str)
.unwrap_or("streaming assertion failed"),
);
return expect_validation_result(Err(err), fixture);
}
}
}
}
if let Some(expected) = fixture.get("expected_folded") {
expect_json_equal("stream fold", &Value::String(folded), expected)?;
}
expect_validation_result(Ok(()), fixture)
}
fn run_ai_support_fixture(kind: &str, fixture: &Value) -> AxResult<()> {
match kind {
"ai_provider_descriptor"
| "ai_provider_registry"
| "ai_model_catalog_audit"
| "ai_model_catalog_runtime" => {
let actual = conformance_ai_registry_result(kind, fixture)?;
if let Some(expected) = fixture.get("expected_output") {
expect_json_subset("AI registry fixture", &actual, expected)?;
}
if let Some(expected) = fixture.get("alias_expectations").and_then(Value::as_object) {
for (alias, expected_profile) in expected {
let normalized =
core_value_to_json(&provider_normalize_profile(&[CoreValue::from(
alias.as_str(),
)])?);
expect_json_equal(
&format!("provider alias {alias}"),
&normalized,
expected_profile,
)?;
}
}
Ok(())
}
"ai_multiservice_router" | "ai_provider_router" | "ai_balancer" => {
let result = conformance_ai_routing_result(kind, fixture);
if fixture.get("expected_error_contains").is_some() {
return expect_validation_result(result.map(|_| ()), fixture);
}
let actual = result?;
if let Some(expected) = fixture.get("expected_output") {
expect_json_subset("AI routing fixture", &actual, expected)?;
}
Ok(())
}
"ai_error" | "ai_unsupported" => run_ai_error_fixture(kind, fixture),
_ => Err(AxError::new(
"fixture",
format!("unsupported Rust AI support fixture {kind}"),
)),
}
}
// python: _run_ai_error / _run_ai_unsupported. Dispatches the real client
// method and matches message, error type, and status on the failure.
fn run_ai_error_fixture(kind: &str, fixture: &Value) -> AxResult<()> {
let (mut client, _requests) = fixture_client(fixture)?;
let default_method = if kind == "ai_unsupported" {
"transcribe"
} else {
"chat"
};
let method = fixture
.get("method")
.and_then(Value::as_str)
.unwrap_or(default_method);
let request = fixture.get("request").cloned().unwrap_or_else(|| json!({}));
let result: AxResult<Value> = match method {
"stream" => client.stream(request).map(Value::Array),
"embed" => client.embed(request),
"transcribe" => client.transcribe(request),
"speak" => client.speak(request),
_ => client.chat(request),
};
let Err(err) = result else {
return Err(AxError::new("fixture", "expected AxAI call to fail"));
};
if let Some(expected) = fixture
.get("expected_error_contains")
.and_then(Value::as_str)
{
if !err.message.contains(expected) {
return Err(AxError::new(
"fixture",
format!(
"expected error containing {expected:?}, got {}",
err.message
),
));
}
}
if let Some(expected) = fixture.get("expected_error_type").and_then(Value::as_str) {
let actual = err.error_type.as_deref().unwrap_or("");
if actual != expected {
return Err(AxError::new(
"fixture",
format!("expected error type {expected}, got {actual}"),
));
}
}
if let Some(expected) = fixture.get("expected_status") {
let actual = err
.status
.map(|status| json!(status))
.unwrap_or(Value::Null);
if &actual != expected {
return Err(AxError::new(
"fixture",
format!("expected status {expected}, got {actual}"),
));
}
}
Ok(())
}
fn run_agent_fixture(kind: &str, fixture: &Value) -> AxResult<()> {
match kind {
"agent_forward" => run_agent_forward_contract_fixture(fixture),
"agent_prompt" => run_agent_prompt_fixture(fixture),
"agent_runtime_real" => run_agent_forward_contract_fixture(fixture),
"agent_runtime_protocol" => run_agent_runtime_protocol_fixture(fixture),
"agent_runtime_session" => run_agent_runtime_session_fixture(fixture),
"agent_runtime_adapter" => run_agent_runtime_adapter_fixture(fixture),
"agent_runtime_policy" => run_agent_runtime_policy_fixture(fixture),
_ => Err(AxError::new(
"fixture",
format!("unsupported Rust agent fixture {kind}"),
)),
}
}
fn run_flow_fixture(fixture: &Value) -> AxResult<()> {
let result = conformance_flow_result(fixture);
if fixture.get("expected_error_contains").is_some() {
return expect_validation_result(result.map(|_| ()), fixture);
}
let actual = result?;
if let Some(expected) = fixture.get("expected_plan") {
expect_json_equal(
"flow plan",
actual.get("plan").unwrap_or(&Value::Null),
expected,
)?;
}
if let Some(expected) = fixture
.get("expected_plan_subset")
.and_then(Value::as_array)
{
expect_json_list_subset(
"flow plan",
actual.get("plan").unwrap_or(&json!([])),
expected,
)?;
}
if let Some(expected) = fixture.get("expected_output") {
expect_json_equal(
"flow output",
actual.get("output").unwrap_or(&Value::Null),
expected,
)?;
}
if let Some(expected) = fixture.get("expected_streaming_output") {
expect_json_equal(
"flow streaming output",
actual.get("streaming_output").unwrap_or(&Value::Null),
expected,
)?;
}
if let Some(expected) = fixture
.get("expected_cache_keys_equal")
.and_then(Value::as_bool)
{
if actual
.get("cache_keys_equal")
.and_then(Value::as_bool)
.unwrap_or(false)
!= expected
{
return Err(AxError::new("fixture", "flow cache key equality mismatch"));
}
}
if let Some(expected) = fixture
.get("expected_cache_keys_distinct")
.and_then(Value::as_bool)
{
if actual
.get("cache_keys_distinct")
.and_then(Value::as_bool)
.unwrap_or(false)
!= expected
{
return Err(AxError::new(
"fixture",
"flow cache key distinctness mismatch",
));
}
}
Ok(())
}
fn run_optimize_fixture(fixture: &Value) -> AxResult<()> {
let expected_error = fixture
.get("expected_error_contains")
.and_then(Value::as_str);
let result = run_optimize_fixture_inner(fixture);
if let Some(expected) = expected_error {
if let Err(err) = result {
if err.message.contains(expected) {
return Ok(());
}
return Err(AxError::new(
"fixture",
format!(
"expected optimize error containing {expected:?}, got {}",
err.message
),
));
}
return Err(AxError::new("fixture", "expected optimize fixture to fail"));
}
result
}
fn run_program_contract_fixture(fixture: &Value) -> AxResult<()> {
let components = conformance_optimizable_components(fixture);
if let Some(expected) = fixture.get("expected_component_ids") {
expect_json_equal(
"program component ids",
&component_ids(&components),
expected,
)?;
}
if let Some(expected) = fixture
.get("expected_components_subset")
.and_then(Value::as_array)
{
expect_json_list_subset("program components", &Value::Array(components), expected)?;
}
Ok(())
}
struct ConformanceFlowCallable {
mode: &'static str,
spec: Value,
}
impl CoreHost for ConformanceFlowCallable {
fn host_type(&self) -> &'static str {
"ConformanceFlowCallable"
}
fn call_method(&self, name: &str, args: &[CoreValue]) -> Result<CoreValue, AxError> {
if name != "call" {
return Err(AxError::runtime(format!(
"ConformanceFlowCallable has no method '{}'",
name
)));
}
let state = core_value_to_json(&core_arg(args, 0));
let output = if self.mode == "mapper" {
conformance_flow_mapper_call(&self.spec, &state)
} else {
conformance_flow_condition_call(&self.spec, &state)
};
Ok(core_value_from_json(&output))
}
}
fn conformance_flow_callable(mode: &'static str, spec: Value) -> CoreValue {
CoreValue::Host(Rc::new(ConformanceFlowCallable { mode, spec }))
}
// Wraps a native host search closure (memories or skills) as a CoreValue::Host the
// agent loop invokes via core_host_try(.., "call", ..) when the actor calls recall()/discover().
struct SearchCallbackHost {
label: &'static str,
f: Box<dyn Fn(&[CoreValue]) -> Result<CoreValue, AxError>>,
}
impl CoreHost for SearchCallbackHost {
fn host_type(&self) -> &'static str {
self.label
}
fn call_method(&self, name: &str, args: &[CoreValue]) -> Result<CoreValue, AxError> {
if name != "call" {
return Err(AxError::runtime(format!(
"{} has no method '{}'",
self.label, name
)));
}
(self.f)(args)
}
}
fn conformance_flow_state_value(state: &Value, field: &str, fallback: Value) -> Value {
get_path(state, field).cloned().unwrap_or(fallback)
}
fn conformance_flow_condition_call(spec: &Value, state: &Value) -> Value {
let Some(map) = spec.as_object() else {
return json!(core_json_truthy(spec));
};
let op = map.get("op").and_then(Value::as_str).unwrap_or("truthy");
let field = map.get("field").and_then(Value::as_str).unwrap_or("");
let value = conformance_flow_state_value(
state,
field,
map.get("default").cloned().unwrap_or(Value::Null),
);
match op {
"field" => value,
"lt" => json!(
value.as_f64().unwrap_or(0.0) < map.get("value").and_then(Value::as_f64).unwrap_or(0.0)
),
"eq" => json!(value == map.get("value").cloned().unwrap_or(Value::Null)),
_ => json!(core_json_truthy(&value)),
}
}
fn conformance_flow_mapper_call(spec: &Value, state: &Value) -> Value {
let Some(map) = spec.as_object() else {
return json!({});
};
match map.get("op").and_then(Value::as_str).unwrap_or("set") {
"increment" => {
let field = map.get("field").and_then(Value::as_str).unwrap_or("");
let current = conformance_flow_state_value(state, field, json!(0));
let mut out = Map::new();
out.insert(
field.to_string(),
json_number(current.as_f64().unwrap_or(0.0) + 1.0),
);
Value::Object(out)
}
"upper" => {
let from = map.get("from").and_then(Value::as_str).unwrap_or("__item");
let to = map.get("to").and_then(Value::as_str).unwrap_or("__derived");
let val = conformance_flow_state_value(state, from, json!(""));
let mut out = Map::new();
out.insert(
to.to_string(),
json!(val.as_str().unwrap_or("").to_uppercase()),
);
Value::Object(out)
}
_ => map.get("values").cloned().unwrap_or_else(|| json!({})),
}
}
fn conformance_ai_registry_result(kind: &str, fixture: &Value) -> AxResult<Value> {
match kind {
"ai_provider_descriptor" => {
let provider = fixture
.get("provider")
.and_then(Value::as_str)
.unwrap_or("openai-compatible");
Ok(core_value_to_json(&provider_descriptor(&[
CoreValue::from(provider),
])?))
}
"ai_provider_registry" => Ok(core_value_to_json(&provider_profile_registry(&[])?)),
"ai_model_catalog_audit" => Ok(core_value_to_json(&provider_model_catalog_summary(&[])?)),
"ai_model_catalog_runtime" => {
let model_type = fixture.get("model_type").cloned().unwrap_or(Value::Null);
let catalog = get_supported_ai_models_json(&model_type)?;
let entries = catalog.as_array().cloned().unwrap_or_default();
let mut actual = json!({
"providerCount": entries.len(),
"providerNames": entries.iter().map(|item| item.get("name").cloned().unwrap_or(Value::Null)).collect::<Vec<_>>(),
"modelCount": entries
.iter()
.map(|item| item.get("models").and_then(Value::as_array).map(|models| models.len()).unwrap_or(0))
.sum::<usize>(),
"openaiFirstModel": Value::Null,
"openaiModelTypes": [],
"catalog": catalog.clone(),
});
if let Some(openai) = entries.iter().find(|item| {
item.get("name").and_then(Value::as_str) == Some("openai")
&& item
.get("models")
.and_then(Value::as_array)
.map(|models| !models.is_empty())
.unwrap_or(false)
}) {
let models = openai
.get("models")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default();
actual["openaiFirstModel"] = models
.first()
.and_then(|model| model.get("name"))
.cloned()
.unwrap_or(Value::Null);
let mut types = models
.iter()
.filter_map(|model| {
model
.get("type")
.and_then(Value::as_str)
.map(ToString::to_string)
})
.collect::<Vec<_>>();
types.sort();
types.dedup();
actual["openaiModelTypes"] = json!(types);
}
if fixture
.get("check_clone")
.and_then(Value::as_bool)
.unwrap_or(false)
{
// The emitted catalog must hand out fresh copies; mutating the
// first response must not leak into a fresh lookup.
let fresh = get_supported_ai_models_json(&model_type)?;
if fresh != catalog {
return Err(AxError::new("fixture", "catalog clone mismatch"));
}
}
Ok(actual)
}
_ => Err(AxError::new(
"fixture",
format!("unsupported AI registry fixture {kind}"),
)),
}
}
// python: get_supported_ai_models(model_type) -> provider_model_catalog(options)
fn get_supported_ai_models_json(model_type: &Value) -> AxResult<Value> {
let options = if model_type.is_null() {
json!({})
} else {
json!({"type": model_type})
};
Ok(core_value_to_json(&provider_model_catalog(&[
core_value_from_json(&options),
])?))
}
fn conformance_ai_routing_result(kind: &str, fixture: &Value) -> AxResult<Value> {
match kind {
"ai_multiservice_router" => conformance_multiservice_router_result(fixture),
"ai_provider_router" => conformance_provider_router_result(fixture),
"ai_balancer" => conformance_balancer_result(fixture),
_ => Err(AxError::new(
"fixture",
format!("unsupported AI routing fixture {kind}"),
)),
}
}
#[derive(Clone)]
struct RouterFixtureService {
name: String,
id: String,
model: String,
embed_model: String,
features: Value,
model_list: Value,
requests: Vec<Value>,
responses: VecDeque<Value>,
metrics: Value,
options: Value,
last_chat: Value,
last_embed: Value,
last_config: Value,
}
impl RouterFixtureService {
fn new(spec: &Value) -> Self {
let name = spec
.get("name")
.and_then(Value::as_str)
.unwrap_or("fixture")
.to_string();
Self {
id: spec
.get("id")
.and_then(Value::as_str)
.map(ToString::to_string)
.unwrap_or_else(|| format!("{name}-id")),
model: spec
.get("model")
.and_then(Value::as_str)
.unwrap_or("fixture-chat")
.to_string(),
embed_model: spec
.get("embed_model")
.or_else(|| spec.get("embedModel"))
.and_then(Value::as_str)
.unwrap_or("fixture-embed")
.to_string(),
features: spec
.get("features")
.cloned()
.unwrap_or_else(router_default_features),
model_list: spec
.get("modelList")
.or_else(|| spec.get("model_list"))
.cloned()
.unwrap_or(Value::Null),
responses: spec
.get("responses")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
.into(),
metrics: spec
.get("metrics")
.cloned()
.unwrap_or_else(|| json!({"service": name, "calls": 0})),
options: json!({}),
requests: Vec::new(),
last_chat: Value::Null,
last_embed: Value::Null,
last_config: Value::Null,
name,
}
}
fn provider_record(&self) -> Value {
json!({"name": self.name, "id": self.id, "features": self.features})
}
fn record(&mut self, method: &str, options: &Value) {
self.requests
.push(json!({"method": method, "opt": options}));
}
fn chat(&mut self, request: &Value, options: &Value) -> AxResult<Value> {
self.record("chat", options);
self.last_chat = request
.get("model")
.cloned()
.unwrap_or_else(|| Value::String(self.model.clone()));
self.last_config = request
.get("model_config")
.or_else(|| request.get("modelConfig"))
.cloned()
.unwrap_or(Value::Null);
if let Some(next) = self.responses.pop_front() {
if let Some(err) = next.get("error") {
return Err(fixture_ai_service_error(err));
}
if let Some(response) = next.get("response") {
return Ok(response.clone());
}
return Ok(next);
}
Ok(json!({"results": [{"index": 0, "content": format!("{} chat", self.name)}]}))
}
fn embed(&mut self, request: &Value, options: &Value) -> AxResult<Value> {
self.record("embed", options);
self.last_embed = request
.get("embed_model")
.or_else(|| request.get("embedModel"))
.cloned()
.unwrap_or_else(|| Value::String(self.embed_model.clone()));
Ok(json!({"embeddings": [[1, 2]], "modelUsage": {"ai": self.name}}))
}
fn stream(&mut self, request: &Value, options: &Value) -> AxResult<Vec<Value>> {
let value = self.chat(request, options)?;
Ok(value.as_array().cloned().unwrap_or_else(|| vec![value]))
}
fn transcribe(&mut self, _request: &Value, options: &Value) -> AxResult<Value> {
self.record("transcribe", options);
Ok(json!({"text": format!("{} transcript", self.name)}))
}
fn speak(&mut self, _request: &Value, options: &Value) -> AxResult<Value> {
self.record("speak", options);
Ok(json!({"audio": "pcm"}))
}
fn metrics(&self) -> Value {
let mut out = self.metrics.clone();
if out.get("calls").is_some() {
out["calls"] = json!(self.requests.len());
}
out
}
}
fn fixture_ai_service_error(spec: &Value) -> AxError {
let error_type = spec
.get("type")
.and_then(Value::as_str)
.unwrap_or("network");
let message = spec
.get("message")
.and_then(Value::as_str)
.unwrap_or("fixture error");
let mut err = match error_type {
"status" => AxError::new("ai", message),
"authentication" => AxError::new("ai", "Authentication failed"),
"response" => AxError::new("ai", message),
"timeout" => AxError::new("ai", message),
"plain" => AxError::runtime(message),
_ => AxError::new("ai", format!("Network Error: {message}")),
};
err.error_type = Some(
match error_type {
"status" => "AxAIServiceStatusError",
"authentication" => "AxAIServiceAuthenticationError",
"response" => "AxAIServiceResponseError",
"timeout" => "AxAIServiceTimeoutError",
"plain" => "AxError",
_ => "AxAIServiceNetworkError",
}
.to_string(),
);
err.status = spec
.get("status")
.and_then(Value::as_u64)
.map(|status| status as u16);
err.retryable = matches!(error_type, "network" | "response" | "timeout")
|| matches!(err.status, Some(408 | 429 | 500 | 502 | 503 | 504 | 529));
err
}
fn router_default_features() -> Value {
json!({
"functions": false,
"streaming": false,
"media": {
"images": {"supported": false, "formats": []},
"audio": {"supported": false, "formats": [], "output": {"supported": false, "formats": []}},
"files": {"supported": false, "formats": [], "uploadMethod": "none"},
"urls": {"supported": false, "webSearch": false, "contextFetching": false}
},
"caching": {"supported": false, "types": []},
"thinking": false,
"multiTurn": true
})
}
fn build_router_services(fixture: &Value) -> Vec<RouterFixtureService> {
fixture
.get("services")
.and_then(Value::as_array)
.map(|services| services.iter().map(RouterFixtureService::new).collect())
.unwrap_or_default()
}
fn service_calls(services: &[RouterFixtureService]) -> Value {
Value::Array(
services
.iter()
.filter(|service| !service.requests.is_empty())
.map(|service| Value::Array(service.requests.clone()))
.collect(),
)
}
#[derive(Clone)]
struct MultiServiceEntry {
service_index: usize,
description: String,
model: Option<Value>,
embed_model: Option<Value>,
is_internal: bool,
}
struct ConformanceMultiServiceRouter {
services: Vec<RouterFixtureService>,
entries: BTreeMap<String, MultiServiceEntry>,
key_order: Vec<String>,
options: Value,
last_used: Option<usize>,
}
impl ConformanceMultiServiceRouter {
fn new(mut services: Vec<RouterFixtureService>, fixture: &Value) -> AxResult<Self> {
if services.is_empty() {
return Err(AxError::runtime("No AI services provided."));
}
let mut router = Self {
services: Vec::new(),
entries: BTreeMap::new(),
key_order: Vec::new(),
options: json!({}),
last_used: None,
};
router.services.append(&mut services);
for (entry_index, raw) in fixture
.get("router_entries")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
.iter()
.enumerate()
{
let service_index = raw
.get("service_index")
.and_then(Value::as_u64)
.unwrap_or(0) as usize;
if service_index >= router.services.len() {
return Err(AxError::runtime(format!(
"service index {service_index} out of range"
)));
}
if raw.get("kind").and_then(Value::as_str) == Some("key") {
let key = raw
.get("key")
.and_then(Value::as_str)
.unwrap_or("")
.to_string();
if router.entries.contains_key(&key) {
return Err(AxError::runtime(format!("Duplicate model key: {key}")));
}
router.key_order.push(key.clone());
router.entries.insert(
key,
MultiServiceEntry {
service_index,
description: raw
.get("description")
.and_then(Value::as_str)
.unwrap_or("")
.to_string(),
model: None,
embed_model: None,
is_internal: raw
.get("isInternal")
.or_else(|| raw.get("is_internal"))
.and_then(Value::as_bool)
.unwrap_or(false),
},
);
continue;
}
let model_list = router.services[service_index]
.model_list
.as_array()
.cloned()
.unwrap_or_default();
if model_list.is_empty() {
return Err(AxError::runtime(format!(
"Service {entry_index} '{}' has no model list.",
router.services[service_index].name
)));
}
for item in model_list {
let key = item
.get("key")
.and_then(Value::as_str)
.unwrap_or("")
.to_string();
if let Some(existing) = router.entries.get(&key) {
return Err(AxError::runtime(format!(
"Service {entry_index} '{}' has duplicate model key: {key} as service {}",
router.services[service_index].name,
router.services[existing.service_index].name
)));
}
let model = item.get("model").cloned();
let embed_model = item
.get("embedModel")
.or_else(|| item.get("embed_model"))
.cloned();
if model.is_none() && embed_model.is_none() {
return Err(AxError::runtime(format!(
"Key {key} in model list for service {entry_index} '{}' is missing a model or embedModel property.",
router.services[service_index].name
)));
}
router.key_order.push(key.clone());
router.entries.insert(
key,
MultiServiceEntry {
service_index,
description: item
.get("description")
.and_then(Value::as_str)
.unwrap_or("")
.to_string(),
model,
embed_model,
is_internal: false,
},
);
}
}
Ok(router)
}
fn model_list(&self) -> Value {
Value::Array(
self.key_order
.iter()
.filter_map(|key| {
let entry = self.entries.get(key)?;
if entry.is_internal {
return None;
}
let mut item = Map::new();
item.insert("key".to_string(), Value::String(key.clone()));
item.insert(
"description".to_string(),
Value::String(entry.description.clone()),
);
if let Some(model) = &entry.model {
item.insert("model".to_string(), model.clone());
} else if let Some(embed_model) = &entry.embed_model {
item.insert("embedModel".to_string(), embed_model.clone());
}
Some(Value::Object(item))
})
.collect(),
)
}
fn selected_service_index(&self) -> usize {
self.last_used.unwrap_or_else(|| {
self.key_order
.first()
.and_then(|key| self.entries.get(key))
.map(|entry| entry.service_index)
.unwrap_or(0)
})
}
fn chat(&mut self, request: &Value, options: &Value) -> AxResult<Value> {
let model_key = request
.get("model")
.and_then(Value::as_str)
.ok_or_else(|| AxError::runtime("Model key must be specified for multi-service"))?;
let entry = self.entries.get(model_key).cloned().ok_or_else(|| {
AxError::runtime(format!("No service found for model key: {model_key}"))
})?;
self.last_used = Some(entry.service_index);
let mut forwarded = request.clone();
if forwarded.get("modelConfig").is_some() && forwarded.get("model_config").is_none() {
forwarded["model_config"] =
forwarded.get("modelConfig").cloned().unwrap_or(Value::Null);
}
if entry.model.is_none() {
if let Some(obj) = forwarded.as_object_mut() {
obj.remove("model");
}
}
self.services[entry.service_index].chat(&forwarded, options)
}
fn embed(&mut self, request: &Value, options: &Value) -> AxResult<Value> {
let model_key = request
.get("embedModel")
.or_else(|| request.get("embed_model"))
.and_then(Value::as_str)
.ok_or_else(|| {
AxError::runtime("Embed model key must be specified for multi-service")
})?;
let entry = self.entries.get(model_key).cloned().ok_or_else(|| {
AxError::runtime(format!("No service found for embed model key: {model_key}"))
})?;
self.last_used = Some(entry.service_index);
let mut forwarded = request.clone();
if entry.model.is_none() {
if let Some(obj) = forwarded.as_object_mut() {
obj.remove("embedModel");
obj.remove("embed_model");
}
}
self.services[entry.service_index].embed(&forwarded, options)
}
fn transcribe(&mut self, request: &Value, options: &Value) -> AxResult<Value> {
let service_index = request
.get("model")
.and_then(Value::as_str)
.and_then(|key| self.entries.get(key).map(|entry| entry.service_index))
.unwrap_or_else(|| self.selected_service_index());
self.last_used = Some(service_index);
self.services[service_index].transcribe(request, options)
}
fn speak(&mut self, request: &Value, options: &Value) -> AxResult<Value> {
let service_index = request
.get("model")
.and_then(Value::as_str)
.and_then(|key| self.entries.get(key).map(|entry| entry.service_index))
.unwrap_or_else(|| self.selected_service_index());
self.last_used = Some(service_index);
self.services[service_index].speak(request, options)
}
fn set_options(&mut self, options: Value) {
self.options = options.clone();
let mut seen = BTreeSet::new();
for key in &self.key_order {
if let Some(entry) = self.entries.get(key) {
let service = &mut self.services[entry.service_index];
if seen.insert(service.id.clone()) {
service.options = options.clone();
}
}
}
}
fn selected_service(&self) -> &RouterFixtureService {
&self.services[self.selected_service_index()]
}
}
fn conformance_multiservice_router_result(fixture: &Value) -> AxResult<Value> {
let mut router = ConformanceMultiServiceRouter::new(build_router_services(fixture), fixture)?;
let mut outputs = Map::new();
for op in fixture
.get("operations")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
{
let name = op.get("name").and_then(Value::as_str).unwrap_or("");
let request = op.get("request").cloned().unwrap_or_else(|| json!({}));
let options = op.get("options").cloned().unwrap_or_else(|| json!({}));
match name {
"chat" => {
outputs.insert(name.to_string(), router.chat(&request, &options)?);
}
"embed" => {
outputs.insert(name.to_string(), router.embed(&request, &options)?);
}
"stream" => {
let value = router.chat(&request, &options)?;
outputs.insert(
name.to_string(),
Value::Array(value.as_array().cloned().unwrap_or_else(|| vec![value])),
);
}
"transcribe" => {
outputs.insert(name.to_string(), router.transcribe(&request, &options)?);
}
"speak" => {
outputs.insert(name.to_string(), router.speak(&request, &options)?);
}
"set_options" => router.set_options(options),
_ => {}
}
}
let selected = router.selected_service().clone();
let mut actual = json!({
"outputs": Value::Object(outputs),
"lastChat": selected.last_chat,
"lastEmbed": selected.last_embed,
"lastConfig": selected.last_config,
"metrics": selected.metrics(),
"options": router.options,
"serviceCalls": service_calls(&router.services)
});
if fixture
.get("expected_output")
.and_then(|expected| expected.get("modelList"))
.is_some()
{
actual["modelList"] = router.model_list();
}
Ok(actual)
}
fn router_provider_records(services: &[RouterFixtureService]) -> Value {
Value::Array(
services
.iter()
.map(RouterFixtureService::provider_record)
.collect(),
)
}
fn conformance_provider_router_result(fixture: &Value) -> AxResult<Value> {
let services = build_router_services(fixture);
let primary_index = fixture
.get("primary_index")
.and_then(Value::as_u64)
.unwrap_or(0) as usize;
let mut ordered = Vec::new();
if let Some(primary) = services.get(primary_index) {
ordered.push(primary.clone());
}
for index in fixture
.get("alternative_indices")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
{
if let Some(service) = services.get(index.as_u64().unwrap_or(0) as usize) {
ordered.push(service.clone());
}
}
let providers = router_provider_records(&ordered);
let request = fixture.get("request").cloned().unwrap_or_else(|| json!({}));
let routing = fixture
.get("routing")
.and_then(|routing| routing.get("capability"))
.cloned()
.unwrap_or_else(|| json!({"requireExactMatch": false, "allowDegradation": true}));
let processing = fixture
.get("processing")
.cloned()
.unwrap_or_else(|| json!({}));
let rec = core_value_to_json(&provider_route_recommendation(&[
core_value_from_json(&providers),
core_value_from_json(&request),
core_value_from_json(&routing),
])?);
let provider_name = rec
.get("providerName")
.or_else(|| {
rec.get("provider")
.and_then(|provider| provider.get("name"))
})
.cloned()
.unwrap_or_else(|| Value::String(String::new()));
let recommendation = json!({
"provider": provider_name,
"processingApplied": rec.get("processingApplied").cloned().unwrap_or(Value::Null),
"degradations": rec.get("degradations").cloned().unwrap_or(Value::Null),
"warnings": rec.get("warnings").cloned().unwrap_or(Value::Null)
});
let validation = core_value_to_json(&provider_route_validation(&[
core_value_from_json(&providers),
core_value_from_json(&request),
core_value_from_json(&processing),
core_value_from_json(&routing),
])?);
let stats = core_value_to_json(&provider_routing_stats(&[core_value_from_json(
&providers,
)])?);
Ok(json!({"recommendation": recommendation, "validation": validation, "stats": stats}))
}
fn balancer_base_features() -> Value {
json!({
"functions": false,
"streaming": false,
"thinking": false,
"multiTurn": false,
"structuredOutputs": false,
"media": {
"images": {"supported": false, "formats": []},
"audio": {"supported": false, "formats": []},
"files": {"supported": false, "formats": [], "uploadMethod": "none"},
"urls": {"supported": false, "webSearch": false, "contextFetching": false}
},
"caching": {"supported": false, "types": []}
})
}
fn feature_bool(features: &Value, key: &str, aliases: &[&str]) -> bool {
features.get(key).and_then(Value::as_bool).unwrap_or(false)
|| aliases.iter().any(|alias| {
features
.get(*alias)
.and_then(Value::as_bool)
.unwrap_or(false)
})
}
fn append_unique(target: &mut Vec<Value>, values: &Value) {
if let Some(items) = values.as_array() {
for value in items {
if !target.iter().any(|existing| existing == value) {
target.push(value.clone());
}
}
}
}
fn merged_balancer_features(services: &[RouterFixtureService]) -> Value {
let mut out = balancer_base_features();
for service in services {
let raw = &service.features;
for (key, aliases) in [
("functions", vec![]),
("streaming", vec![]),
("thinking", vec![]),
("multiTurn", vec!["multi_turn"]),
("structuredOutputs", vec!["structured_outputs"]),
("functionCot", vec!["function_cot"]),
("hasThinkingBudget", vec!["has_thinking_budget"]),
("hasShowThoughts", vec!["has_show_thoughts"]),
] {
if feature_bool(raw, key, &aliases) {
out[key] = json!(true);
}
}
for kind in ["images", "audio", "files"] {
let src = raw
.get("media")
.and_then(|media| media.get(kind))
.cloned()
.unwrap_or_else(|| json!({}));
if src
.get("supported")
.and_then(Value::as_bool)
.unwrap_or(false)
{
out["media"][kind]["supported"] = json!(true);
}
let mut formats = out["media"][kind]["formats"]
.as_array()
.cloned()
.unwrap_or_default();
append_unique(&mut formats, src.get("formats").unwrap_or(&Value::Null));
out["media"][kind]["formats"] = Value::Array(formats);
if kind == "files" {
if let Some(upload) = src
.get("uploadMethod")
.or_else(|| src.get("upload_method"))
.and_then(Value::as_str)
.filter(|upload| !upload.is_empty() && *upload != "none")
{
out["media"]["files"]["uploadMethod"] = json!(upload);
}
}
}
let urls = raw
.get("media")
.and_then(|media| media.get("urls"))
.cloned()
.unwrap_or_else(|| json!({}));
if urls
.get("supported")
.and_then(Value::as_bool)
.unwrap_or(false)
{
out["media"]["urls"]["supported"] = json!(true);
}
if urls
.get("webSearch")
.or_else(|| urls.get("web_search"))
.and_then(Value::as_bool)
.unwrap_or(false)
{
out["media"]["urls"]["webSearch"] = json!(true);
}
if urls
.get("contextFetching")
.or_else(|| urls.get("context_fetching"))
.and_then(Value::as_bool)
.unwrap_or(false)
{
out["media"]["urls"]["contextFetching"] = json!(true);
}
let caching = raw.get("caching").cloned().unwrap_or_else(|| json!({}));
if caching
.get("supported")
.and_then(Value::as_bool)
.unwrap_or(false)
{
out["caching"]["supported"] = json!(true);
}
let mut cache_types = out["caching"]["types"]
.as_array()
.cloned()
.unwrap_or_default();
append_unique(
&mut cache_types,
caching.get("types").unwrap_or(&Value::Null),
);
out["caching"]["types"] = Value::Array(cache_types);
}
out
}
fn balancer_metrics(services: &[RouterFixtureService]) -> Value {
let mut chat_sum = 0.0;
let mut chat_count = 0.0;
let mut embed_sum = 0.0;
let mut embed_count = 0.0;
let mut chat_p95: f64 = 0.0;
let mut chat_p99: f64 = 0.0;
let mut embed_p95: f64 = 0.0;
let mut embed_p99: f64 = 0.0;
let mut chat_err_count = 0.0;
let mut chat_err_total = 0.0;
let mut embed_err_count = 0.0;
let mut embed_err_total = 0.0;
for service in services {
let metrics = service.metrics();
let chat_err = metrics
.get("errors")
.and_then(|errors| errors.get("chat"))
.cloned()
.unwrap_or_else(|| json!({}));
let embed_err = metrics
.get("errors")
.and_then(|errors| errors.get("embed"))
.cloned()
.unwrap_or_else(|| json!({}));
chat_err_count += chat_err.get("count").and_then(Value::as_f64).unwrap_or(0.0);
chat_err_total += chat_err.get("total").and_then(Value::as_f64).unwrap_or(0.0);
embed_err_count += embed_err
.get("count")
.and_then(Value::as_f64)
.unwrap_or(0.0);
embed_err_total += embed_err
.get("total")
.and_then(Value::as_f64)
.unwrap_or(0.0);
let chat = metrics
.get("latency")
.and_then(|latency| latency.get("chat"))
.cloned()
.unwrap_or_else(|| json!({}));
let chat_samples = chat
.get("samples")
.and_then(Value::as_array)
.map(|samples| samples.len() as f64)
.unwrap_or(0.0);
if chat_samples > 0.0 {
chat_sum += chat.get("mean").and_then(Value::as_f64).unwrap_or(0.0) * chat_samples;
chat_count += chat_samples;
}
chat_p95 = chat_p95.max(chat.get("p95").and_then(Value::as_f64).unwrap_or(0.0));
chat_p99 = chat_p99.max(chat.get("p99").and_then(Value::as_f64).unwrap_or(0.0));
let embed = metrics
.get("latency")
.and_then(|latency| latency.get("embed"))
.cloned()
.unwrap_or_else(|| json!({}));
let embed_samples = embed
.get("samples")
.and_then(Value::as_array)
.map(|samples| samples.len() as f64)
.unwrap_or(0.0);
if embed_samples > 0.0 {
embed_sum += embed.get("mean").and_then(Value::as_f64).unwrap_or(0.0) * embed_samples;
embed_count += embed_samples;
}
embed_p95 = embed_p95.max(embed.get("p95").and_then(Value::as_f64).unwrap_or(0.0));
embed_p99 = embed_p99.max(embed.get("p99").and_then(Value::as_f64).unwrap_or(0.0));
}
let chat_rate = if chat_err_total > 0.0 {
chat_err_count / chat_err_total
} else {
0.0
};
let embed_rate = if embed_err_total > 0.0 {
embed_err_count / embed_err_total
} else {
0.0
};
json!({
"latency": {
"chat": {
"mean": if chat_count > 0.0 { chat_sum / chat_count } else { 0.0 },
"p95": chat_p95,
"p99": chat_p99,
"samples": []
},
"embed": {
"mean": if embed_count > 0.0 { embed_sum / embed_count } else { 0.0 },
"p95": embed_p95,
"p99": embed_p99,
"samples": []
}
},
"errors": {
"chat": {"count": chat_err_count, "rate": chat_rate, "total": chat_err_total},
"embed": {"count": embed_err_count, "rate": embed_rate, "total": embed_err_total}
}
})
}
fn is_retryable_ai_error(err: &AxError) -> bool {
if err.error_type.as_deref() == Some("AxAIServiceAuthenticationError") {
return false;
}
if err.error_type.as_deref() == Some("AxAIServiceStatusError") {
return matches!(err.status, Some(408 | 429 | 500 | 502 | 503 | 504 | 529));
}
err.retryable
|| matches!(
err.error_type.as_deref(),
Some("AxAIServiceNetworkError")
| Some("AxAIServiceResponseError")
| Some("AxAIServiceStreamTerminatedError")
| Some("AxAIServiceTimeoutError")
)
}
struct ConformanceBalancer {
services: Vec<RouterFixtureService>,
current: usize,
failures: BTreeMap<String, usize>,
max_retries: usize,
}
impl ConformanceBalancer {
fn new(mut services: Vec<RouterFixtureService>, options: &Value) -> AxResult<Self> {
if services.is_empty() {
return Err(AxError::runtime("No AI services provided."));
}
let policy = core_value_to_json(&provider_balancer_retry_policy(&[core_value_from_json(
options,
)])?);
let strategy = policy
.get("strategy")
.and_then(Value::as_str)
.unwrap_or("metric")
.to_string();
let max_retries = policy
.get("maxRetries")
.and_then(Value::as_u64)
.unwrap_or(3) as usize;
Self::validate_models(&services)?;
if strategy != "input_order" {
services.sort_by(|a, b| {
let a_score = provider_balancer_metric_score(&[core_value_from_json(&a.metrics())])
.map(|value| core_value_to_json(&value).as_f64().unwrap_or(0.0))
.unwrap_or(0.0);
let b_score = provider_balancer_metric_score(&[core_value_from_json(&b.metrics())])
.map(|value| core_value_to_json(&value).as_f64().unwrap_or(0.0))
.unwrap_or(0.0);
a_score
.partial_cmp(&b_score)
.unwrap_or(std::cmp::Ordering::Equal)
});
}
Ok(Self {
services,
current: 0,
failures: BTreeMap::new(),
max_retries,
})
}
fn validate_models(services: &[RouterFixtureService]) -> AxResult<()> {
let reference = services
.iter()
.find_map(|service| service.model_list.as_array().cloned());
let Some(reference) = reference.filter(|items| !items.is_empty()) else {
return Ok(());
};
let reference_keys = reference
.iter()
.filter_map(|item| {
item.get("key")
.and_then(Value::as_str)
.map(ToString::to_string)
})
.collect::<BTreeSet<_>>();
for (index, service) in services.iter().enumerate() {
let list = service.model_list.as_array().cloned().unwrap_or_default();
if list.is_empty() {
return Err(AxError::runtime(format!(
"Service at index {index} ({}) has no model list while another service does.",
service.name
)));
}
let keys = list
.iter()
.filter_map(|item| {
item.get("key")
.and_then(Value::as_str)
.map(ToString::to_string)
})
.collect::<BTreeSet<_>>();
for key in &reference_keys {
if !keys.contains(key) {
return Err(AxError::runtime(format!(
"Service at index {index} ({}) is missing model {key:?}",
service.name
)));
}
}
for key in &keys {
if !reference_keys.contains(key) {
return Err(AxError::runtime(format!(
"Service at index {index} ({}) has extra model {key:?}",
service.name
)));
}
}
}
Ok(())
}
fn candidate_indices(&self, request: &Value) -> AxResult<Vec<usize>> {
let mut out = Vec::new();
for (index, service) in self.services.iter().enumerate() {
let allowed = core_value_to_json(&provider_balancer_candidate_allowed(&[
core_value_from_json(&service.features),
core_value_from_json(request),
])?);
if allowed.as_bool().unwrap_or(false) {
out.push(index);
}
}
if !out.is_empty() {
return Ok(out);
}
let mut requirements = Vec::new();
if request
.get("responseFormat")
.or_else(|| request.get("response_format"))
.and_then(|format| format.get("type"))
.and_then(Value::as_str)
== Some("json_schema")
{
requirements.push("structured outputs");
}
let capabilities = request
.get("capabilities")
.cloned()
.unwrap_or_else(|| json!({}));
if capabilities
.get("requiresImages")
.or_else(|| capabilities.get("requires_images"))
.and_then(Value::as_bool)
.unwrap_or(false)
{
requirements.push("images");
}
if capabilities
.get("requiresAudio")
.or_else(|| capabilities.get("requires_audio"))
.and_then(Value::as_bool)
.unwrap_or(false)
{
requirements.push("audio");
}
Err(AxError::runtime(format!(
"No services available that support required capabilities: {}.",
requirements.join(", ")
)))
}
// Streaming routes through the same failover loop as chat(): a transient error on the
// primary fails over to a healthy backup, and the backup's response is replayed as stream
// deltas (a single-result response collapses to [{ results: [result] }]). No lazy
// first-chunk peek is needed — the ports stream synchronously, so the error surfaces inside
// the failover loop rather than deferring past it the way TS's ReadableStream does.
fn stream(&mut self, request: &Value, options: &Value) -> AxResult<Vec<Value>> {
let response = self.chat(request, options)?;
if let Some(results) = response.get("results").and_then(Value::as_array) {
return Ok(results
.iter()
.map(|result| json!({ "results": [result.clone()] }))
.collect());
}
Ok(vec![response])
}
fn chat(&mut self, request: &Value, options: &Value) -> AxResult<Value> {
let candidates = self.candidate_indices(request)?;
let mut candidate_pos = 0;
let mut current = candidates[candidate_pos];
self.current = current;
loop {
let id = self.services[current].id.clone();
if self.failures.get(&id).copied().unwrap_or(0) > 0 {
candidate_pos += 1;
if candidate_pos >= candidates.len() {
return Err(AxError::runtime(format!(
"All candidate services exhausted (tried {} service(s))",
candidates.len()
)));
}
current = candidates[candidate_pos];
self.current = current;
continue;
}
match self.services[current].chat(request, options) {
Ok(response) => {
self.failures.remove(&id);
self.current = current;
return Ok(response);
}
Err(err) if is_retryable_ai_error(&err) => {
*self.failures.entry(id).or_insert(0) += 1;
if self
.failures
.get(&self.services[current].id)
.copied()
.unwrap_or(0)
>= self.max_retries
{
candidate_pos += 1;
if candidate_pos >= candidates.len() {
return Err(AxError::runtime(format!(
"All candidate services exhausted (tried {} service(s))",
candidates.len()
)));
}
current = candidates[candidate_pos];
self.current = current;
}
}
Err(err) => return Err(err),
}
}
}
fn embed(&mut self, request: &Value, options: &Value) -> AxResult<Value> {
self.current = 0;
self.services[0].embed(request, options)
}
fn transcribe(&mut self, request: &Value, options: &Value) -> AxResult<Value> {
self.services[self.current].transcribe(request, options)
}
fn speak(&mut self, request: &Value, options: &Value) -> AxResult<Value> {
self.services[self.current].speak(request, options)
}
fn set_options(&mut self, options: Value) {
for service in &mut self.services {
service.options = options.clone();
}
}
fn current_service(&self) -> &RouterFixtureService {
&self.services[self.current]
}
}
fn conformance_balancer_result(fixture: &Value) -> AxResult<Value> {
let options = fixture.get("options").cloned().unwrap_or_else(|| json!({}));
let mut balancer = ConformanceBalancer::new(build_router_services(fixture), &options)?;
let mut outputs = Map::new();
for op in fixture
.get("operations")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
{
let name = op.get("name").and_then(Value::as_str).unwrap_or("");
let request = op.get("request").cloned().unwrap_or_else(|| json!({}));
let options = op.get("options").cloned().unwrap_or_else(|| json!({}));
match name {
"chat" => {
outputs.insert(name.to_string(), balancer.chat(&request, &options)?);
}
"stream" => {
outputs.insert(
name.to_string(),
Value::Array(balancer.stream(&request, &options)?),
);
}
"embed" => {
outputs.insert(name.to_string(), balancer.embed(&request, &options)?);
}
"transcribe" => {
outputs.insert(name.to_string(), balancer.transcribe(&request, &options)?);
}
"speak" => {
outputs.insert(name.to_string(), balancer.speak(&request, &options)?);
}
"set_options" => balancer.set_options(options),
_ => {}
}
}
let current = balancer.current_service().clone();
let mut actual = json!({
"id": current.id,
"name": current.name,
"outputs": Value::Object(outputs),
"lastChat": current.last_chat,
"lastEmbed": current.last_embed,
"lastConfig": current.last_config,
"metrics": balancer_metrics(&balancer.services),
"options": current.options,
"serviceCalls": service_calls(&balancer.services)
});
if fixture
.get("expected_output")
.and_then(|expected| expected.get("modelList"))
.is_some()
{
actual["modelList"] = balancer
.services
.iter()
.find(|service| {
service
.model_list
.as_array()
.map(|items| !items.is_empty())
.unwrap_or(false)
})
.map(|service| service.model_list.clone())
.unwrap_or(Value::Null);
}
if fixture
.get("expected_output")
.and_then(|expected| expected.get("features"))
.is_some()
{
actual["features"] = merged_balancer_features(&balancer.services);
}
Ok(actual)
}
// Prompt-parity gate (G3): build a real agent and assert the RLM stage instructions
// were rendered into agent state. A hollow agent has empty description keys, so this
// fails -- catching the defect that slipped a non-functional agent() past every gate.
fn run_agent_prompt_fixture(fixture: &Value) -> AxResult<()> {
let signature = fixture
.get("signature")
.and_then(Value::as_str)
.unwrap_or("question:string -> answer:string");
let options =
core_value_from_json(&fixture.get("options").cloned().unwrap_or_else(|| json!({})));
let agent = agent_with_core_options(signature, options)?;
let expects = fixture
.get("expected_description_contains")
.and_then(Value::as_object)
.cloned()
.unwrap_or_default();
for (field, needles) in expects.iter() {
if field == "__order" {
continue;
}
let desc_value = agent.state_json(field);
let desc = desc_value.as_str().unwrap_or("");
if desc.trim().is_empty() {
return Err(AxError::new(
"fixture",
format!(
"agent stage description {field} is empty; RLM prompt was not rendered into agent state"
),
));
}
if let Some(items) = needles.as_array() {
for item in items {
if let Some(needle) = item.as_str() {
if !desc.contains(needle) {
return Err(AxError::new(
"fixture",
format!("agent stage description {field} missing {needle:?}: {desc}"),
));
}
}
}
}
}
Ok(())
}
fn run_agent_forward_contract_fixture(fixture: &Value) -> AxResult<()> {
let responses = fixture
.get("responses")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default();
let mut client = FixtureClient {
responses: responses.into(),
transcribe_responses: fixture
.get("transcribe_responses")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
.into(),
requests: Vec::new(),
};
let agent_options =
core_value_from_json(&fixture.get("options").cloned().unwrap_or_else(|| json!({})));
let scripted = fixture
.get("runtime_script")
.and_then(Value::as_array)
.map(|script| {
let runtime_config = fixture
.get("options")
.and_then(|options| options.get("runtime"))
.and_then(Value::as_object)
.cloned()
.unwrap_or_default();
let language = runtime_config
.get("language")
.and_then(Value::as_str)
.or_else(|| fixture.get("runtime_language").and_then(Value::as_str))
.unwrap_or("JavaScript")
.to_string();
let usage = runtime_config
.get("usageInstructions")
.or_else(|| runtime_config.get("usage_instructions"))
.and_then(Value::as_str)
.unwrap_or("")
.to_string();
ScriptedCodeRuntime::new(script.clone(), language, usage)
});
let executed_handle = scripted.as_ref().map(|runtime| runtime.executed_handle());
if let Some(runtime) = scripted {
let host = core_code_runtime_host_shared(
Rc::new(RefCell::new(Box::new(runtime) as Box<dyn AxCodeRuntime>)),
core_runtime_capabilities_full(),
);
core_set(&agent_options, CoreValue::from("runtime"), host)?;
}
// agent_runtime_real (G1): drive forward() through the REAL embedded engine.
if fixture.get("runtime_engine").is_some() {
#[cfg(feature = "runtime-quickjs")]
{
let runtime = crate::runtime::quickjs::QuickJsCodeRuntime::new();
let host = core_code_runtime_host_shared(
Rc::new(RefCell::new(Box::new(runtime) as Box<dyn AxCodeRuntime>)),
core_runtime_capabilities_full(),
);
core_set(&agent_options, CoreValue::from("runtime"), host)?;
}
#[cfg(not(feature = "runtime-quickjs"))]
{
return Err(AxError::new(
"fixture",
"agent_runtime_real requires building with --features runtime-quickjs".to_string(),
));
}
}
let signature = fixture
.get("signature")
.and_then(Value::as_str)
.unwrap_or("question:string -> answer:string");
let mut agent = match agent_with_core_options(signature, agent_options) {
Ok(agent) => agent,
Err(error) => {
if let Some(expected) = fixture
.get("expected_error_contains")
.and_then(Value::as_str)
{
if error.message.contains(expected) {
return Ok(());
}
}
return Err(error);
}
};
if let Some(state) = fixture.get("set_state") {
agent.set_state(state.clone())?;
}
if let Some(snapshot) = fixture.get("restore_runtime_state") {
agent.restore_runtime_state(snapshot.clone())?;
}
let input = fixture.get("input").cloned().unwrap_or_else(|| json!({}));
let forward_options = fixture
.get("forward_options")
.cloned()
.unwrap_or_else(|| json!({}));
let output = match agent.forward_with_options(&mut client, input, forward_options) {
Ok(output) => output,
Err(error) => {
if let Some(expected) = fixture
.get("expected_error_contains")
.and_then(Value::as_str)
{
if error.message.contains(expected) {
if let Some(expected_clarification) = fixture.get("expected_clarification") {
let detail =
core_agent_clarification_detail(&error).unwrap_or_else(|| json!({}));
expect_json_subset(
"clarification",
detail.get("clarification").unwrap_or(&Value::Null),
expected_clarification,
)?;
}
return assert_agent_trace(&mut agent, fixture);
}
}
return Err(error);
}
};
if fixture.get("expected_error_contains").is_some() {
return Err(AxError::new("fixture", "expected agent forward to fail"));
}
if let Some(expected) = fixture.get("expected_output") {
expect_json_equal("agent output", &output, expected)?;
}
if let Some(expected) = fixture
.get("expected_request_count")
.and_then(Value::as_u64)
{
if client.requests.len() as u64 != expected {
return Err(AxError::new(
"fixture",
format!(
"expected {} requests, got {}",
expected,
client.requests.len()
),
));
}
}
if let Some(items) = fixture
.get("expected_request_contains")
.and_then(Value::as_array)
{
let request_text = stable_stringify(&Value::Array(client.requests.clone()));
for item in items {
let needle = item
.as_str()
.map(ToString::to_string)
.unwrap_or_else(|| item.to_string());
if !request_text.contains(&needle) {
return Err(AxError::new(
"fixture",
format!("agent request missing {needle:?}: {request_text}"),
));
}
}
}
if let Some(rules) = fixture
.get("expected_stage_request_not_contains")
.and_then(Value::as_array)
{
for raw in rules {
let index = raw.get("index").and_then(Value::as_u64).unwrap_or(0) as usize;
let text = client
.requests
.get(index)
.map(stable_stringify)
.unwrap_or_default();
for item in raw
.get("absent")
.and_then(Value::as_array)
.into_iter()
.flatten()
{
let needle = item
.as_str()
.map(ToString::to_string)
.unwrap_or_else(|| item.to_string());
if text.contains(&needle) {
return Err(AxError::new(
"fixture",
format!("agent request {index} unexpectedly contained {needle:?}: {text}"),
));
}
}
}
}
if let Some(rules) = fixture
.get("expected_stage_request_subset")
.and_then(Value::as_array)
{
for raw in rules {
let index = raw.get("index").and_then(Value::as_u64).unwrap_or(0) as usize;
let request = client.requests.get(index).ok_or_else(|| {
AxError::new("fixture", format!("missing agent request index {index}"))
})?;
expect_json_subset(
&format!("agent request {index}"),
request,
raw.get("request").unwrap_or(&json!({})),
)?;
}
}
if let Some(indices) = fixture
.get("expected_cached_request_indices")
.and_then(Value::as_array)
{
for index in indices {
let idx = index.as_u64().unwrap_or(0) as usize;
let request = client.requests.get(idx).ok_or_else(|| {
AxError::new("fixture", format!("missing cached request index {idx}"))
})?;
let prompt = request
.get("chat_prompt")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default();
let cached = prompt.iter().any(|message| {
message
.get("cache")
.and_then(Value::as_bool)
.unwrap_or(false)
});
if !cached {
return Err(AxError::new(
"fixture",
format!(
"agent request {idx} did not contain a cached prompt message: {prompt:?}"
),
));
}
}
}
if let Some(expected) = fixture
.get("expected_chat_log_subset")
.and_then(Value::as_array)
{
expect_json_list_subset(
"agent chat log",
&Value::Array(agent.get_chat_log()),
expected,
)?;
}
if let Some(expected) = fixture.get("expected_state") {
expect_json_subset("agent state", &agent.get_state()?, expected)?;
}
let exported = agent.export_runtime_state()?;
if let Some(expected) = fixture.get("expected_runtime_contract_subset") {
expect_json_subset("runtime contract", &agent.get_runtime_contract(), expected)?;
}
if let Some(expected) = fixture.get("expected_exported_state_subset") {
expect_json_subset("runtime state", &exported, expected)?;
}
if let Some(expected) = fixture
.get("expected_context_events_subset")
.and_then(Value::as_array)
{
expect_json_list_subset(
"agent context events",
exported.get("context_events").unwrap_or(&json!([])),
expected,
)?;
}
if let Some(expected) = fixture
.get("expected_action_log_subset")
.and_then(Value::as_array)
{
expect_json_list_subset(
"action log",
exported.get("action_log").unwrap_or(&json!([])),
expected,
)?;
}
if let Some(expected) = fixture.get("expected_executed").and_then(Value::as_array) {
let executed = executed_handle
.map(|shared| {
shared
.borrow()
.executed
.iter()
.map(|code| Value::String(code.clone()))
.collect::<Vec<_>>()
})
.unwrap_or_default();
expect_json_equal(
"executed code",
&Value::Array(executed),
&Value::Array(expected.clone()),
)?;
}
assert_agent_trace(&mut agent, fixture)
}
fn assert_agent_trace(agent: &mut AxAgent, fixture: &Value) -> AxResult<()> {
let trace = agent.export_trace()?;
if let Some(expected) = fixture.get("expected_trace_subset") {
expect_json_subset("agent trace", &trace, expected)?;
}
if let Some(expected) = fixture
.get("expected_trace_event_kinds")
.and_then(Value::as_array)
{
let kinds = trace
.get("events")
.and_then(Value::as_array)
.map(|events| {
events
.iter()
.map(|event| event.get("kind").cloned().unwrap_or(Value::Null))
.collect::<Vec<_>>()
})
.unwrap_or_default();
expect_json_equal(
"agent trace event kinds",
&Value::Array(kinds),
&Value::Array(expected.clone()),
)?;
}
if fixture
.get("replay_trace")
.map(core_json_truthy)
.unwrap_or(false)
{
let mut replay_fixtures = fixture
.get("replay_fixtures")
.and_then(Value::as_object)
.cloned()
.unwrap_or_default();
if let Some(kinds) = fixture.get("expected_trace_event_kinds") {
replay_fixtures
.entry("expected_event_kinds".to_string())
.or_insert_with(|| kinds.clone());
}
if let Some(output) = fixture.get("expected_output") {
replay_fixtures
.entry("expected_output".to_string())
.or_insert_with(|| output.clone());
}
let replayed = agent.replay_trace(trace, Value::Object(replay_fixtures))?;
if let Some(expected) = fixture.get("expected_replay_result_subset") {
expect_json_subset("agent replay", &replayed, expected)?;
} else {
expect_json_subset(
"agent replay",
&replayed,
&json!({"ok": true, "status": "replayed"}),
)?;
}
}
Ok(())
}
// Mirrors python conformance._runtime_protocol_command: python spawns its own
// interpreter on the scripted protocol server entrypoint; the Rust runner
// re-execs the conformance binary with --runtime-protocol-fixture-server. The
// mode travels as an argument because ProcessCodeRuntime has no env plumbing.
fn runtime_protocol_fixture_command(mode: &str) -> AxResult<ProcessCodeRuntime> {
let exe = std::env::current_exe()
.map_err(|err| AxError::runtime(format!("cannot locate conformance binary: {err}")))?;
Ok(ProcessCodeRuntime::new([
exe.to_string_lossy().to_string(),
"--runtime-protocol-fixture-server".to_string(),
mode.to_string(),
]))
}
// Mirrors python conformance._run_agent_runtime_protocol: drives the real
// ProcessCodeRuntime protocol client against the scripted server subprocess.
fn run_agent_runtime_protocol_fixture(fixture: &Value) -> AxResult<()> {
let mode = fixture
.get("mode")
.and_then(Value::as_str)
.unwrap_or("normal");
let mut runtime = runtime_protocol_fixture_command(mode)?;
let result = run_agent_runtime_protocol_operation(fixture, &mut runtime);
let _ = runtime.shutdown();
match result {
Ok(()) => Ok(()),
Err(err) => {
if let Some(expected) = fixture
.get("expected_error_contains")
.and_then(Value::as_str)
{
if err.message.contains(expected) {
return Ok(());
}
}
Err(err)
}
}
}
fn run_agent_runtime_protocol_operation(
fixture: &Value,
runtime: &mut ProcessCodeRuntime,
) -> AxResult<()> {
let create_globals = fixture
.get("create_globals")
.cloned()
.unwrap_or_else(|| json!({}));
let create_options = fixture
.get("create_options")
.cloned()
.unwrap_or_else(|| json!({}));
let execute_options = fixture
.get("execute_options")
.cloned()
.unwrap_or_else(|| json!({}));
match fixture
.get("operation")
.and_then(Value::as_str)
.unwrap_or("roundtrip")
{
"roundtrip" => {
let capabilities = runtime
.request("capabilities", None, json!({}))?
.get("result")
.cloned()
.unwrap_or(Value::Null);
if let Some(expected) = fixture.get("expected_capabilities_subset") {
expect_json_subset("protocol capabilities", &capabilities, expected)?;
}
let mut session = runtime.create_session(create_globals, create_options)?;
let result = session.execute(
fixture
.get("execute_code")
.and_then(Value::as_str)
.unwrap_or("final()"),
execute_options,
)?;
if let Some(expected) = fixture.get("expected_execute_subset") {
expect_json_subset("protocol execute", &result.payload, expected)?;
}
let inspected = session.inspect_globals(json!({}))?;
if let Some(expected) = fixture.get("expected_inspect_subset") {
expect_json_subset("protocol inspect", &inspected, expected)?;
}
let snapshot = session.snapshot_globals(json!({}))?;
if let Some(expected) = fixture.get("expected_snapshot_subset") {
expect_json_subset("protocol snapshot", &snapshot, expected)?;
}
let patched = session.patch_globals(
fixture
.get("patch_globals")
.cloned()
.unwrap_or_else(|| json!({})),
json!({}),
)?;
if let Some(expected) = fixture.get("expected_patch_subset") {
expect_json_subset("protocol patch", &patched, expected)?;
}
let closed = session.close()?;
if let Some(expected) = fixture.get("expected_close_subset") {
expect_json_subset("protocol close", &closed, expected)?;
}
Ok(())
}
"execute_error" => {
let mut session = runtime.create_session(create_globals, create_options)?;
let result = session.execute(
fixture
.get("execute_code")
.and_then(Value::as_str)
.unwrap_or("timeout()"),
execute_options,
)?;
if let Some(expected) = fixture.get("expected_execute_subset") {
expect_json_subset("protocol execute error", &result.payload, expected)?;
}
let _ = session.close();
Ok(())
}
"unknown_op" => {
runtime.request("unknown_op", None, json!({}))?;
Err(AxError::new(
"fixture",
"expected unknown protocol op to fail",
))
}
"capabilities_error" => {
runtime.request("capabilities", None, json!({}))?;
Err(AxError::new(
"fixture",
"expected protocol capabilities request to fail",
))
}
"unavailable" => {
let mut session = runtime.create_session(create_globals, create_options)?;
match fixture
.get("method")
.and_then(Value::as_str)
.unwrap_or("inspect_globals")
{
"snapshot_globals" => session.snapshot_globals(json!({}))?,
"patch_globals" => session.patch_globals(json!({}), json!({}))?,
_ => session.inspect_globals(json!({}))?,
};
Err(AxError::new(
"fixture",
"expected unavailable protocol method to fail",
))
}
"session_mismatch" => {
let _session = runtime.create_session(create_globals, create_options)?;
runtime.request(
"execute",
Some("s1"),
json!({
"code": fixture.get("execute_code").and_then(Value::as_str).unwrap_or("final()"),
"options": {},
}),
)?;
Err(AxError::new(
"fixture",
"expected protocol session mismatch to fail",
))
}
other => Err(AxError::new(
"fixture",
format!("unknown runtime protocol operation {other:?}"),
)),
}
}
// Mirrors python conformance._runtime_protocol_fixture_server_main: the
// scripted stdin/stdout JSONL protocol server hosted by the conformance
// binary when invoked with --runtime-protocol-fixture-server <mode>.
pub fn runtime_protocol_fixture_server_main(mode: &str) -> AxResult<()> {
let stdin = std::io::stdin();
let mut sessions: BTreeMap<String, Value> = BTreeMap::new();
let mut next_session = 0usize;
for line in stdin.lock().lines() {
let line = line?;
match mode {
"eof" => return Ok(()),
"malformed_json" => {
let mut out = std::io::stdout();
writeln!(out, "{{not-json")?;
out.flush()?;
return Ok(());
}
"nonzero" => {
eprintln!("fixture stderr before nonzero exit");
std::process::exit(7);
}
_ => {}
}
let (response, stop) =
runtime_protocol_fixture_step(mode, &line, &mut sessions, &mut next_session);
let mut out = std::io::stdout();
writeln!(out, "{}", serde_json::to_string(&response)?)?;
out.flush()?;
if stop {
return Ok(());
}
}
Ok(())
}
fn runtime_protocol_fixture_ok(id: &Value, result: Value, session_id: Option<&Value>) -> Value {
let mut out = json!({"id": id.clone(), "ok": true, "result": result});
if let Some(session_id) = session_id {
if !session_id.is_null() {
out["session_id"] = session_id.clone();
}
}
out
}
fn runtime_protocol_fixture_fail(id: &Value, category: &str, message: &str) -> Value {
json!({"id": id.clone(), "ok": false, "error": {"category": category, "message": message}})
}
fn runtime_protocol_fixture_snapshot(session: &Value) -> Value {
let bindings = session
.get("globals")
.and_then(Value::as_object)
.cloned()
.unwrap_or_default();
let entries = bindings
.iter()
.map(|(key, value)| {
json!({
"name": key,
"type": python_type_name(value),
"preview": python_str(value),
})
})
.collect::<Vec<_>>();
json!({
"version": 1,
"entries": entries,
"bindings": Value::Object(bindings.clone()),
"globals": Value::Object(bindings),
"closed": session.get("closed").map(core_json_truthy).unwrap_or(false),
})
}
fn runtime_protocol_fixture_step(
mode: &str,
line: &str,
sessions: &mut BTreeMap<String, Value>,
next_session: &mut usize,
) -> (Value, bool) {
let message: Value = match serde_json::from_str(line) {
Ok(value) => value,
Err(err) => {
return (
runtime_protocol_fixture_fail(&Value::Null, "protocol", &err.to_string()),
false,
)
}
};
let op = message
.get("op")
.and_then(Value::as_str)
.unwrap_or_default()
.to_string();
let response_id = if mode == "id_mismatch" {
json!("mismatch")
} else {
message.get("id").cloned().unwrap_or(Value::Null)
};
let message_session_id = message.get("session_id").cloned().unwrap_or(Value::Null);
let session_key = message_session_id.as_str().unwrap_or_default().to_string();
let unavailable = mode == "unavailable";
let response = match op.as_str() {
"capabilities" => runtime_protocol_fixture_ok(
&response_id,
json!({
"language": "JavaScript",
"usage_instructions": "fixture protocol runtime",
"inspect": !unavailable,
"snapshot": !unavailable,
"patch": !unavailable,
"abort": true,
}),
None,
),
"create_session" => {
*next_session += 1;
let session_id = format!("s{next_session}");
let payload = message
.get("payload")
.and_then(Value::as_object)
.cloned()
.unwrap_or_default();
let mut globals = payload
.get("globals")
.and_then(Value::as_object)
.cloned()
.unwrap_or_default();
globals.insert(
"__create_options".to_string(),
payload
.get("options")
.filter(|options| options.is_object())
.cloned()
.unwrap_or_else(|| json!({})),
);
sessions.insert(
session_id.clone(),
json!({"globals": globals, "closed": false}),
);
let mut out =
runtime_protocol_fixture_ok(&response_id, json!({"session_id": session_id}), None);
out["session_id"] = json!(session_id);
out
}
"execute" | "derive" => {
let closed_or_missing = sessions
.get(&session_key)
.map(|session| session.get("closed").map(core_json_truthy).unwrap_or(false))
.unwrap_or(true);
let mut response = if closed_or_missing {
runtime_protocol_fixture_fail(
&response_id,
"session_closed",
"session closed or unknown",
)
} else {
let payload = message
.get("payload")
.and_then(Value::as_object)
.cloned()
.unwrap_or_default();
let code = payload
.get("code")
.and_then(Value::as_str)
.unwrap_or_default()
.to_string();
if let Some(session) = sessions.get_mut(&session_key) {
session["globals"]["__last_execute_options"] = payload
.get("options")
.filter(|options| options.is_object())
.cloned()
.unwrap_or_else(|| json!({}));
}
match code.as_str() {
"timeout()" => {
runtime_protocol_fixture_fail(&response_id, "timeout", "fixture timeout")
}
"sessionClosed()" => runtime_protocol_fixture_fail(
&response_id,
"session_closed",
"fixture session closed",
),
"abort()" => {
runtime_protocol_fixture_fail(&response_id, "abort", "fixture abort")
}
"userError()" => runtime_protocol_fixture_fail(
&response_id,
"user_error",
"fixture user error",
),
_ => {
if let Some(session) = sessions.get_mut(&session_key) {
session["globals"]["answer"] = json!("fixture");
}
runtime_protocol_fixture_ok(
&response_id,
json!({"type": "final", "args": [{"answer": "fixture"}]}),
Some(&message_session_id),
)
}
}
};
if mode == "session_mismatch"
&& response.get("ok").and_then(Value::as_bool).unwrap_or(false)
{
response["session_id"] = json!("wrong-session");
}
response
}
"inspect_globals" => {
if unavailable {
runtime_protocol_fixture_fail(
&response_id,
"unavailable",
"inspectGlobals unavailable",
)
} else {
let globals = sessions
.get(&session_key)
.and_then(|session| session.get("globals"))
.cloned()
.unwrap_or_else(|| json!({}));
runtime_protocol_fixture_ok(&response_id, globals, Some(&message_session_id))
}
}
"snapshot_globals" => {
if unavailable {
runtime_protocol_fixture_fail(
&response_id,
"unavailable",
"snapshotGlobals unavailable",
)
} else {
let snapshot = runtime_protocol_fixture_snapshot(
sessions.get(&session_key).unwrap_or(&json!({})),
);
runtime_protocol_fixture_ok(&response_id, snapshot, Some(&message_session_id))
}
}
"patch_globals" => {
if unavailable {
runtime_protocol_fixture_fail(
&response_id,
"unavailable",
"patchGlobals unavailable",
)
} else {
let payload = message
.get("payload")
.and_then(Value::as_object)
.cloned()
.unwrap_or_default();
let raw = payload
.get("globals")
.and_then(Value::as_object)
.cloned()
.unwrap_or_default();
let bindings = raw
.get("bindings")
.and_then(Value::as_object)
.cloned()
.unwrap_or(raw);
if let Some(session) = sessions.get_mut(&session_key) {
session["globals"] = Value::Object(bindings);
}
let snapshot = runtime_protocol_fixture_snapshot(
sessions.get(&session_key).unwrap_or(&json!({})),
);
runtime_protocol_fixture_ok(&response_id, snapshot, Some(&message_session_id))
}
}
"close" => {
if let Some(session) = sessions.get_mut(&session_key) {
session["closed"] = json!(true);
}
runtime_protocol_fixture_ok(
&response_id,
json!({"closed": true}),
Some(&message_session_id),
)
}
"shutdown" => runtime_protocol_fixture_ok(&response_id, json!({"shutdown": true}), None),
other => runtime_protocol_fixture_fail(
&response_id,
"protocol",
&format!("unknown runtime protocol op: {other}"),
),
};
(response, op == "shutdown")
}
// python: a or b or ... or {} (falls through falsy candidates).
fn conformance_first_truthy(candidates: &[Option<&Value>]) -> Value {
for candidate in candidates.iter().flatten() {
if core_json_truthy(candidate) {
return (*candidate).clone();
}
}
json!({})
}
// Mirrors python conformance._run_agent_runtime_session: drives a real
// AxAgent against a ScriptedCodeRuntime and asserts on the observable state.
fn run_agent_runtime_session_fixture(fixture: &Value) -> AxResult<()> {
let signature = fixture
.get("signature")
.and_then(Value::as_str)
.unwrap_or("question:string -> answer:string");
let agent_options =
core_value_from_json(&fixture.get("options").cloned().unwrap_or_else(|| json!({})));
let mut agent = agent_with_core_options(signature, agent_options)?;
let mut runtime = ScriptedCodeRuntime::new(
fixture
.get("runtime_script")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default(),
"JavaScript".to_string(),
String::new(),
)
.with_fixture_capabilities(fixture.get("runtime_capabilities"));
let shared = runtime.executed_handle();
let mut result = Value::Null;
let mut caught_expected_error = false;
if let Err(err) =
run_agent_runtime_session_operations(fixture, &mut agent, &mut runtime, &mut result)
{
match fixture
.get("expected_error_contains")
.and_then(Value::as_str)
{
Some(expected) if err.message.contains(expected) => {
caught_expected_error = true;
result = Value::Null;
}
_ => return Err(err),
}
}
if fixture.get("expected_error_contains").is_some() && !caught_expected_error {
return Err(AxError::new(
"fixture",
"expected agent runtime session fixture to fail",
));
}
if let Some(expected) = fixture.get("expected_result_subset") {
expect_json_subset("runtime result", &result, expected)?;
}
if let Some(expected) = fixture.get("expected_result") {
expect_json_equal("runtime result", &result, expected)?;
}
let exported = agent.export_runtime_state()?;
if let Some(expected) = fixture.get("expected_exported_state_subset") {
expect_json_subset("runtime state", &exported, expected)?;
}
if let Some(expected) = fixture
.get("expected_action_log_subset")
.and_then(Value::as_array)
{
expect_json_list_subset(
"action log",
exported.get("action_log").unwrap_or(&json!([])),
expected,
)?;
}
if let Some(expected) = fixture
.get("expected_status_log_subset")
.and_then(Value::as_array)
{
expect_json_list_subset(
"status log",
exported.get("status_log").unwrap_or(&json!([])),
expected,
)?;
}
if let Some(expected) = fixture
.get("expected_session_count")
.and_then(Value::as_u64)
{
let actual = shared.borrow().session_closed.len() as u64;
if actual != expected {
return Err(AxError::new(
"fixture",
format!("expected {expected} sessions, got {actual}"),
));
}
}
if let Some(expected) = fixture
.get("expected_closed_session_count")
.and_then(Value::as_u64)
{
let actual = shared
.borrow()
.session_closed
.iter()
.filter(|closed| **closed)
.count() as u64;
if actual != expected {
return Err(AxError::new(
"fixture",
format!("expected {expected} closed sessions, got {actual}"),
));
}
}
if let Some(expected) = fixture.get("expected_executed").and_then(Value::as_array) {
let executed = shared
.borrow()
.executed
.iter()
.map(|code| Value::String(code.clone()))
.collect::<Vec<_>>();
expect_json_equal(
"executed code",
&Value::Array(executed),
&Value::Array(expected.clone()),
)?;
}
if let Some(expected) = fixture.get("expected_create_globals_subset") {
let last = shared
.borrow()
.create_requests
.last()
.cloned()
.ok_or_else(|| {
AxError::new(
"fixture",
"expected at least one runtime create_session request",
)
})?;
expect_json_subset(
"runtime create globals",
last.get("globals").unwrap_or(&Value::Null),
expected,
)?;
}
if let Some(expected) = fixture.get("expected_create_options_subset") {
let last = shared
.borrow()
.create_requests
.last()
.cloned()
.ok_or_else(|| {
AxError::new(
"fixture",
"expected at least one runtime create_session request",
)
})?;
expect_json_subset(
"runtime create options",
last.get("options").unwrap_or(&Value::Null),
expected,
)?;
}
if let Some(expected) = fixture.get("expected_execute_options_subset") {
let last = shared
.borrow()
.execute_options
.last()
.cloned()
.ok_or_else(|| {
AxError::new("fixture", "expected at least one runtime execute request")
})?;
expect_json_subset("runtime execute options", &last, expected)?;
}
if let Some(expected) = fixture.get("expected_runtime_inspection") {
expect_json_equal(
"runtime inspection",
exported.get("runtime_inspection").unwrap_or(&Value::Null),
expected,
)?;
}
if let Some(expected) = fixture
.get("expected_runtime_inspection_contains")
.and_then(Value::as_str)
{
let inspection = exported
.get("runtime_inspection")
.cloned()
.unwrap_or(Value::Null);
let text = inspection
.as_str()
.map(ToString::to_string)
.unwrap_or_else(|| stable_stringify(&inspection));
if !text.contains(expected) {
return Err(AxError::new(
"fixture",
format!("runtime inspection expected to contain {expected:?}, got {text:?}"),
));
}
}
if let Some(keys) = fixture
.get("expected_absent_runtime_session_globals")
.and_then(Value::as_array)
{
let globals = exported
.get("runtime_session_state")
.and_then(|state| state.get("globals"))
.cloned()
.unwrap_or_else(|| json!({}));
for key in keys {
let key = key.as_str().unwrap_or_default();
if globals.get(key).is_some() {
return Err(AxError::new(
"fixture",
format!("runtime session globals unexpectedly contained {key:?}"),
));
}
}
}
assert_agent_trace(&mut agent, fixture)
}
fn run_agent_runtime_session_operations(
fixture: &Value,
agent: &mut AxAgent,
runtime: &mut ScriptedCodeRuntime,
result: &mut Value,
) -> AxResult<()> {
let code = fixture.get("code").and_then(Value::as_str).unwrap_or("");
match fixture
.get("operation")
.and_then(Value::as_str)
.unwrap_or("test")
{
"test" => {
let values =
conformance_first_truthy(&[fixture.get("context_values"), fixture.get("input")]);
let options = conformance_first_truthy(&[fixture.get("runtime_options")]);
*result = agent.test(runtime, code, values, options)?.payload;
}
"steps" => {
for step in fixture
.get("steps")
.and_then(Value::as_array)
.into_iter()
.flatten()
{
if let Some(snapshot) = step.get("restore_session_state") {
agent.restore_session_state(conformance_first_truthy(&[Some(snapshot)]))?;
}
let values = conformance_first_truthy(&[
step.get("values"),
fixture.get("context_values"),
fixture.get("input"),
]);
let options = conformance_first_truthy(&[step.get("options")]);
let step_code = step.get("code").and_then(Value::as_str).unwrap_or("");
*result = agent
.execute_actor_step(runtime, step_code, values, options)?
.payload;
if step.get("inspect").map(core_json_truthy).unwrap_or(false) {
agent.inspect_runtime()?;
}
if step
.get("export_session_state")
.map(core_json_truthy)
.unwrap_or(false)
{
agent.export_session_state()?;
}
}
if fixture
.get("close_runtime_session")
.map(core_json_truthy)
.unwrap_or(false)
{
agent.close_runtime_session()?;
}
}
"reserved" => {
let values = conformance_first_truthy(&[fixture.get("context_values")]);
*result = agent.test(runtime, code, values, json!({}))?.payload;
}
other => {
return Err(AxError::new(
"fixture",
format!("unknown agent runtime session operation {other:?}"),
));
}
}
Ok(())
}
// Mirrors python conformance._runtime_adapter_call: the raw RuntimeEnvelope
// helper payloads exercised by the adapter fixtures.
fn runtime_adapter_call(spec: &Value) -> AxResult<Value> {
let name = spec.get("name").and_then(Value::as_str).unwrap_or_default();
let args = spec
.get("args")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default();
let kwargs = spec.get("kwargs").cloned().unwrap_or_else(|| json!({}));
let arg = |index: usize| args.get(index).cloned();
let text = |value: Option<Value>, fallback: &str| -> String {
match value {
Some(Value::String(text)) => text,
Some(other) => stable_stringify(&other),
None => fallback.to_string(),
}
};
let error_envelope = |message: String, category: &str| json!({"kind": "error", "is_error": true, "error_category": category, "error": message});
// python RuntimeEnvelope.final/ask_clarification flatten a single list arg.
let completion_args = |args: &[Value]| -> Vec<Value> {
if args.len() == 1 {
if let Some(items) = args[0].as_array() {
return items.clone();
}
}
args.to_vec()
};
match name {
"result" => Ok(json!({"kind": "result", "result": arg(0).unwrap_or(Value::Null)})),
"error" => {
let category = arg(1)
.and_then(|value| value.as_str().map(ToString::to_string))
.or_else(|| {
kwargs
.get("category")
.and_then(Value::as_str)
.map(ToString::to_string)
})
.unwrap_or_else(|| "runtime".to_string());
Ok(error_envelope(text(arg(0), ""), &category))
}
"session_closed" => Ok(error_envelope(
text(arg(0), "session closed"),
"session_closed",
)),
"timeout" => Ok(error_envelope(
text(arg(0), "execution timed out"),
"timeout",
)),
"final" => Ok(json!({"type": "final", "args": completion_args(&args)})),
"ask_clarification" => {
Ok(json!({"type": "askClarification", "args": completion_args(&args)}))
}
"discover" => {
Ok(json!({"kind": "discover", "discover": arg(0).unwrap_or_else(|| json!({}))}))
}
"recall" => Ok(json!({"kind": "recall", "recall": arg(0).unwrap_or_else(|| json!([]))})),
"used" => {
let request = arg(0).unwrap_or_else(|| json!({}));
let mut payload = match request {
Value::Object(map) => map,
other => {
let mut map = Map::new();
map.insert("id".to_string(), other);
map
}
};
for key in ["reason", "stage"] {
if let Some(value) = kwargs.get(key) {
if !value.is_null() {
payload.insert(key.to_string(), value.clone());
}
}
}
Ok(json!({"kind": "used", "used": payload}))
}
"status" => Ok(json!({
"kind": "status",
"status": {"type": text(arg(0), "success"), "message": text(arg(1), "")},
})),
"guide_agent" => {
let mut payload = json!({"type": "guide_agent", "guidance": text(arg(0), "")});
if let Some(triggered_by) = arg(1) {
if !triggered_by.is_null() {
payload["triggeredBy"] = triggered_by;
}
}
Ok(payload)
}
other => Err(AxError::new(
"fixture",
format!("unknown runtime adapter helper {other:?}"),
)),
}
}
// Mirrors python conformance._run_agent_runtime_adapter.
fn run_agent_runtime_adapter_fixture(fixture: &Value) -> AxResult<()> {
if let Some(raw) = fixture.get("capabilities") {
// python builds RuntimeCapabilities(...).to_dict(); the Rust struct
// only models the session-host gates, so the dict (with the python
// defaults) is assembled directly.
let capabilities = json!({
"inspect": raw.get("inspect").cloned().unwrap_or(json!(true)),
"snapshot": raw.get("snapshot").cloned().unwrap_or(json!(true)),
"patch": raw.get("patch").cloned().unwrap_or(json!(true)),
"abort": raw.get("abort").cloned().unwrap_or(json!(false)),
"language": raw.get("language").cloned().unwrap_or(json!("JavaScript")),
"usage_instructions": raw.get("usage_instructions").cloned().unwrap_or(json!("")),
});
if let Some(expected) = fixture.get("expected_capabilities") {
expect_json_subset("runtime capabilities", &capabilities, expected)?;
}
}
for spec in fixture
.get("helper_calls")
.and_then(Value::as_array)
.into_iter()
.flatten()
{
let name = spec.get("name").and_then(Value::as_str).unwrap_or_default();
let actual = runtime_adapter_call(spec)?;
if let Some(expected) = spec.get("expected") {
expect_json_equal(&format!("runtime helper {name}"), &actual, expected)?;
}
if let Some(expected) = spec.get("expected_subset") {
expect_json_subset(&format!("runtime helper {name}"), &actual, expected)?;
}
if spec.get("normalize").map(core_json_truthy).unwrap_or(false) {
let normalized = core_value_to_json(&_normalize_agent_runtime_step_result(&[
core_value_from_json(&actual),
CoreValue::from(
spec.get("code")
.and_then(Value::as_str)
.unwrap_or("<adapter>"),
),
])?);
if let Some(expected) = spec.get("expected_normalized_subset") {
expect_json_subset(
&format!("runtime helper normalized {name}"),
&normalized,
expected,
)?;
}
}
}
if let Some(run_session) = fixture.get("run_session") {
if core_json_truthy(run_session) {
let mut session_fixture = Map::new();
session_fixture.insert(
"signature".to_string(),
fixture
.get("signature")
.cloned()
.unwrap_or_else(|| json!("question:string -> answer:string")),
);
session_fixture.insert("operation".to_string(), json!("test"));
session_fixture.insert("code".to_string(), json!("adapter()"));
session_fixture.insert(
"context_values".to_string(),
conformance_first_truthy(&[
fixture.get("context_values"),
Some(&json!({"question": "adapter"})),
]),
);
session_fixture.insert(
"runtime_script".to_string(),
json!([{"expected_code": "adapter()", "result": runtime_adapter_call(run_session)?}]),
);
for key in [
"expected_result_subset",
"expected_action_log_subset",
"expected_trace_event_kinds",
"expected_closed_session_count",
] {
if let Some(value) = fixture.get(key) {
if !value.is_null() {
session_fixture.insert(key.to_string(), value.clone());
}
}
}
run_agent_runtime_session_fixture(&Value::Object(session_fixture))?;
}
}
Ok(())
}
// python: state.get(key) or [] (treats missing/None as an empty list).
fn conformance_list_or_empty(value: Option<&Value>) -> Value {
match value {
Some(Value::Array(items)) => Value::Array(items.clone()),
_ => json!([]),
}
}
// Mirrors python conformance._run_agent_runtime_policy: builds a real AxAgent
// and asserts on its policy/registry/exported-state surfaces.
fn run_agent_runtime_policy_fixture(fixture: &Value) -> AxResult<()> {
let mut agent = match run_agent_runtime_policy_operations(fixture) {
Ok(agent) => agent,
Err(err) => {
if let Some(expected) = fixture
.get("expected_error_contains")
.and_then(Value::as_str)
{
if err.message.contains(expected) {
return Ok(());
}
}
return Err(err);
}
};
if fixture.get("expected_error_contains").is_some() {
return Err(AxError::new(
"fixture",
"expected agent runtime policy fixture to fail",
));
}
if let Some(expected) = fixture.get("expected_runtime_contract_subset") {
expect_json_subset("runtime contract", &agent.get_runtime_contract(), expected)?;
}
if let Some(expected) = fixture.get("expected_policy_subset") {
expect_json_subset("agent policy", &agent.get_policy(), expected)?;
}
if let Some(expected) = fixture.get("expected_policy_registry_subset") {
expect_json_subset("policy registry", &agent.get_policy_registry(), expected)?;
}
if let Some(expected) = fixture.get("expected_state_subset") {
expect_json_subset("agent state", &agent.get_state()?, expected)?;
}
let registry = agent.get_policy_registry();
for (label, registry_key, expected_key) in [
(
"actor primitives",
"actor_primitives",
"expected_actor_primitives_subset",
),
(
"protocol actions",
"protocol_actions",
"expected_protocol_actions_subset",
),
(
"runtime globals",
"runtime_globals",
"expected_runtime_globals_subset",
),
(
"host boundaries",
"host_boundaries",
"expected_host_boundaries_subset",
),
] {
if let Some(expected) = fixture.get(expected_key).and_then(Value::as_array) {
expect_json_list_subset(
label,
&conformance_list_or_empty(registry.get(registry_key)),
expected,
)?;
}
}
if let Some(expected) = fixture
.get("expected_callable_inventory_subset")
.and_then(Value::as_array)
{
expect_json_list_subset(
"callable inventory",
&agent.get_callable_inventory(),
expected,
)?;
}
if let Some(expected) = fixture
.get("expected_discovery_catalog_subset")
.and_then(Value::as_array)
{
expect_json_list_subset(
"discovery catalog",
&agent.get_discovery_catalog(),
expected,
)?;
}
let state = agent.export_runtime_state()?;
for (label, state_key, expected_key) in [
(
"discovered tools",
"discovered_tool_docs",
"expected_discovered_tool_docs_subset",
),
(
"loaded skills",
"loaded_skill_docs",
"expected_loaded_skill_docs_subset",
),
(
"loaded memories",
"loaded_memories",
"expected_loaded_memories_subset",
),
(
"used memories",
"used_memories",
"expected_used_memories_subset",
),
("used skills", "used_skills", "expected_used_skills_subset"),
(
"guidance log",
"guidance_log",
"expected_guidance_log_subset",
),
(
"function call traces",
"function_call_traces",
"expected_function_call_traces_subset",
),
(
"policy trace",
"policy_trace",
"expected_policy_trace_subset",
),
("action log", "action_log", "expected_action_log_subset"),
] {
if let Some(expected) = fixture.get(expected_key).and_then(Value::as_array) {
expect_json_list_subset(
label,
&conformance_list_or_empty(state.get(state_key)),
expected,
)?;
}
}
if let Some(expected) = fixture.get("expected_exported_state_subset") {
expect_json_subset("exported runtime state", &state, expected)?;
}
if let Some(expected) = fixture.get("expected_optimizer_metadata_subset") {
expect_json_subset(
"optimizer metadata",
&agent.get_optimizer_metadata()?,
expected,
)?;
}
assert_agent_trace(&mut agent, fixture)
}
fn run_agent_runtime_policy_operations(fixture: &Value) -> AxResult<AxAgent> {
let signature = fixture
.get("signature")
.and_then(Value::as_str)
.unwrap_or("question:string -> answer:string");
let agent_options =
core_value_from_json(&fixture.get("options").cloned().unwrap_or_else(|| json!({})));
let mut agent = agent_with_core_options(signature, agent_options)?;
if let Some(next_signature) = fixture.get("set_signature").and_then(Value::as_str) {
agent.set_signature(next_signature)?;
}
if let Some(request) = fixture.get("discover") {
let request = if core_json_truthy(request) {
request.clone()
} else {
json!({})
};
let result = agent.discover(request)?;
if let Some(expected) = fixture.get("expected_discover_result") {
expect_json_equal("discover result", &result, expected)?;
}
}
if let Some(request) = fixture.get("recall") {
let request = if core_json_truthy(request) {
request.clone()
} else {
json!([])
};
let result = agent.recall(request)?;
if let Some(expected) = fixture.get("expected_recall_result") {
expect_json_equal("recall result", &result, expected)?;
}
}
if let Some(used) = fixture.get("used") {
let result = agent.used(
used.get("id").and_then(Value::as_str).unwrap_or(""),
used.get("reason").and_then(Value::as_str).unwrap_or(""),
used.get("stage")
.and_then(Value::as_str)
.unwrap_or("executor"),
)?;
if let Some(expected) = fixture.get("expected_used_result") {
expect_json_equal("used result", &result, expected)?;
}
}
if let Some(call) = fixture.get("invoke_callable") {
let qualified_name = call
.get("qualified_name")
.or_else(|| call.get("name"))
.and_then(Value::as_str)
.unwrap_or("");
let args = conformance_first_truthy(&[call.get("args")]);
let result = agent.invoke_callable(qualified_name, args, json!({}))?;
if let Some(expected) = fixture.get("expected_callable_result_subset") {
expect_json_subset("callable result", &result, expected)?;
}
}
if let Some(trace) = fixture.get("replay_trace_input") {
let result = agent.replay_trace(
conformance_first_truthy(&[Some(trace)]),
conformance_first_truthy(&[fixture.get("replay_fixtures")]),
)?;
if let Some(expected) = fixture.get("expected_replay_result_subset") {
expect_json_subset("agent replay", &result, expected)?;
}
}
if let Some(snapshot) = fixture.get("restore_runtime_state") {
agent.restore_runtime_state(conformance_first_truthy(&[Some(snapshot)]))?;
}
if fixture.get("context_operation").is_some() {
// python conformance calls the shared _agent_context_fixture_result
// helper (emitted in the core) on the agent state plus the fixture.
let result = core_value_to_json(&_agent_context_fixture_result(&[
agent.state.clone(),
core_value_from_json(fixture),
])?);
if let Some(expected) = fixture.get("expected_context_result") {
expect_json_equal("agent context result", &result, expected)?;
}
if let Some(expected) = fixture.get("expected_context_result_subset") {
expect_json_subset("agent context result", &result, expected)?;
}
if let Some(expected) = fixture
.get("expected_context_events_subset")
.and_then(Value::as_array)
{
let events = result
.get("exported")
.and_then(|exported| exported.get("context_events"))
.cloned()
.unwrap_or_else(|| json!([]));
expect_json_list_subset("agent context events", &events, expected)?;
}
}
if let Some(payload) = fixture.get("final_payload") {
let normalized =
core_value_to_json(&_normalize_agent_final_payload(&[core_value_from_json(
payload,
)])?);
expect_json_equal(
"final payload",
&normalized,
fixture
.get("expected_final_payload")
.unwrap_or(&Value::Null),
)?;
}
if let Some(payload) = fixture.get("clarification_payload") {
let normalized = core_value_to_json(&_normalize_agent_clarification_payload(&[
core_value_from_json(payload),
])?);
expect_json_equal(
"clarification payload",
&normalized,
fixture
.get("expected_clarification_payload")
.unwrap_or(&Value::Null),
)?;
}
Ok(agent)
}
fn conformance_flow_result(fixture: &Value) -> AxResult<Value> {
conformance_validate_flow_demos(fixture)?;
let state = conformance_build_flow_state(fixture)?;
let operation = fixture
.get("operation")
.and_then(Value::as_str)
.unwrap_or("");
let plan = core_value_to_json(&_flow_plan(&[state.clone()])?);
let cache_keys = fixture
.get("cache_key_inputs")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
.into_iter()
.map(|value| {
_flow_cache_key(&[core_value_from_json(&value)])
.map(|key| key.text())
.unwrap_or_else(|_| stable_stringify(&value))
})
.collect::<Vec<_>>();
let cache_keys_equal =
!cache_keys.is_empty() && cache_keys.iter().all(|key| key == &cache_keys[0]);
let mut sorted = cache_keys.clone();
sorted.sort();
sorted.dedup();
if operation == "cache_key" || operation == "plan" {
return Ok(json!({
"plan": plan,
"output": {},
"streaming_output": [],
"cache_keys_equal": cache_keys_equal,
"cache_keys_distinct": sorted.len() == cache_keys.len(),
}));
}
let responses = fixture
.get("responses")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default();
let mut client = FixtureClient {
responses: responses.into(),
transcribe_responses: VecDeque::new(),
requests: Vec::new(),
};
let input = fixture.get("input").cloned().unwrap_or_else(|| json!({}));
let mut forward_options = fixture
.get("forward_options")
.cloned()
.unwrap_or_else(|| json!({}));
if let Some(seed) = fixture.get("cache_seed_value") {
if !forward_options.is_object() {
forward_options = json!({});
}
let key = _flow_cache_key(&[core_value_from_json(&input)])?.text();
let mut cache_store = forward_options
.get("cache_store")
.or_else(|| forward_options.get("cacheStore"))
.and_then(Value::as_object)
.cloned()
.unwrap_or_default();
cache_store.insert(key, seed.clone());
forward_options["cache_store"] = Value::Object(cache_store);
}
let mut chat = |method: &str, request: Value| -> AxResult<Value> {
if method == "transcribe" {
client.transcribe(request)
} else {
client.chat(request)
}
};
let output = core_value_to_json(&with_core_client(&mut chat, || {
_flow_forward(&[
state.clone(),
CoreValue::Null,
core_value_from_json(&input),
core_value_from_json(&forward_options),
])
})?);
let streaming_output = if operation == "streaming" {
json!([{"version": 1, "index": 0, "delta": output.clone()}])
} else {
json!([])
};
Ok(json!({
"plan": plan,
"output": output,
"streaming_output": streaming_output,
"cache_keys_equal": cache_keys_equal,
"cache_keys_distinct": sorted.len() == cache_keys.len(),
}))
}
fn conformance_build_flow_state(fixture: &Value) -> AxResult<CoreValue> {
conformance_build_flow_state_from_spec(fixture, "root.flow")
}
fn conformance_build_flow_state_from_spec(spec: &Value, fallback_id: &str) -> AxResult<CoreValue> {
let mut options = spec
.get("flow_options")
.or_else(|| spec.get("options"))
.cloned()
.unwrap_or_else(|| json!({}));
if options.get("id").is_none() {
options["id"] = spec
.get("program_id")
.cloned()
.unwrap_or_else(|| json!(fallback_id));
}
let state = _flow_factory(&[core_value_from_json(&options)])?;
for step in spec
.get("steps")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
{
let step_value = conformance_build_flow_step(&step, spec)?;
_flow_add_step(&[state.clone(), step_value])?;
}
if let Some(returns) = spec.get("returns") {
_flow_set_returns(&[state.clone(), core_value_from_json(returns)])?;
}
if let Some(demos) = spec.get("demos") {
core_set(
&state,
CoreValue::from("demos"),
core_value_from_json(demos),
)?;
}
Ok(state)
}
fn conformance_build_flow_step(step: &Value, fixture: &Value) -> AxResult<CoreValue> {
let kind = step
.get("kind")
.and_then(Value::as_str)
.unwrap_or("execute");
let name = step.get("name").and_then(Value::as_str).unwrap_or("step");
let mut options = step.get("options").cloned().unwrap_or_else(|| json!({}));
if !options.is_object() {
options = json!({});
}
match kind {
"branch" | "while" | "feedback" => {
let options_core = core_value_from_json(&options);
if let Some(predicate) = step.get("predicate") {
core_set(
&options_core,
CoreValue::from("predicate"),
conformance_flow_callable("condition", predicate.clone()),
)?;
}
if let Some(condition) = step.get("condition") {
core_set(
&options_core,
CoreValue::from("condition"),
conformance_flow_callable("condition", condition.clone()),
)?;
}
if let Some(branches) = step.get("branches").and_then(Value::as_array) {
let branch_list = CoreValue::new_list();
for branch in branches {
let branch_value = CoreValue::new_map();
if let Some(when) = branch.get("when") {
core_set(
&branch_value,
CoreValue::from("when"),
core_value_from_json(when),
)?;
}
let child_steps = CoreValue::new_list();
for child in branch
.get("steps")
.and_then(Value::as_array)
.into_iter()
.flatten()
{
core_append(&child_steps, conformance_build_flow_step(child, fixture)?)?;
}
core_set(&branch_value, CoreValue::from("steps"), child_steps)?;
core_append(&branch_list, branch_value)?;
}
core_set(&options_core, CoreValue::from("branches"), branch_list)?;
}
if let Some(children) = step.get("steps").and_then(Value::as_array) {
let child_steps = CoreValue::new_list();
for child in children {
core_append(&child_steps, conformance_build_flow_step(child, fixture)?)?;
}
core_set(&options_core, CoreValue::from("steps"), child_steps)?;
}
_flow_step(&[
CoreValue::from(kind),
CoreValue::from(name),
CoreValue::Null,
options_core,
])
}
"map" | "derive" => {
let mapper = step.get("mapper").cloned().unwrap_or_else(|| {
json!({"op": "set", "values": step.get("output").cloned().unwrap_or_else(|| json!({}))})
});
_flow_step(&[
CoreValue::from(kind),
CoreValue::from(name),
conformance_flow_callable("mapper", mapper),
core_value_from_json(&options),
])
}
"parallel" | "parallelMerge" => _flow_step(&[
CoreValue::from(kind),
CoreValue::from(name),
CoreValue::Null,
core_value_from_json(&options),
]),
"execute" => {
let signature = step
.get("extended_signature")
.or_else(|| step.get("extendedSignature"))
.or_else(|| step.get("signature"))
.or_else(|| fixture.get("signature"))
.and_then(Value::as_str)
.unwrap_or("question:string -> answer:string");
let mut step_options = step
.get("forward_options")
.cloned()
.unwrap_or_else(|| json!({}));
if !step_options.is_object() {
step_options = json!({});
}
if let (Some(step_obj), Some(opt_obj)) =
(step_options.as_object_mut(), options.as_object())
{
for (key, value) in opt_obj {
step_obj.insert(key.clone(), value.clone());
}
}
let program = match step.get("program").and_then(Value::as_str).unwrap_or("") {
"flow" => {
let nested_id = step
.get("program_id")
.and_then(Value::as_str)
.map(ToString::to_string)
.unwrap_or_else(|| format!("root.{name}"));
let nested_state = conformance_build_flow_state_from_spec(step, &nested_id)?;
FlowHost::new(AxFlow {
state: nested_state,
})
}
"agent" => {
let agent = agent_with_options(signature, options.clone())?;
AgentHost::new(agent)
}
_ => {
if options.get("id").is_none() {
options["id"] = json!(name);
}
GenHost::new(AxGen::with_options_and_tools(
signature,
options.clone(),
Vec::new(),
)?)
}
};
_flow_step(&[
CoreValue::from(kind),
CoreValue::from(name),
program,
core_value_from_json(&step_options),
])
}
other => Err(AxError::new(
"fixture",
format!("unsupported Rust conformance flow error step kind {other}"),
)),
}
}
fn conformance_validate_flow_demos(fixture: &Value) -> AxResult<()> {
let Some(demos) = fixture.get("demos").and_then(Value::as_array) else {
return Ok(());
};
let mut valid = vec!["root".to_string()];
for step in fixture
.get("steps")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
{
if let Some(name) = step.get("name").and_then(Value::as_str) {
valid.push(format!("root.{name}"));
}
}
let unknown = demos
.iter()
.map(|demo| {
demo.get("programId")
.or_else(|| demo.get("program_id"))
.and_then(Value::as_str)
.unwrap_or("root")
.to_string()
})
.filter(|program_id| !valid.iter().any(|item| item == program_id))
.collect::<Vec<_>>();
if unknown.is_empty() {
return Ok(());
}
let mut ids = valid;
ids.sort();
Err(AxError::runtime(format!(
"Unknown program ID(s) in demos: {}. Valid IDs: {}. Use namedPrograms() to discover available IDs.",
unknown.join(", "),
ids.join(", ")
)))
}
fn conformance_flow_plan(fixture: &Value) -> Value {
if let Some(expected) = fixture.get("expected_plan") {
return expected.clone();
}
let steps = fixture
.get("steps")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
.into_iter()
.enumerate()
.map(|(index, step)| {
json!({
"name": step.get("name").and_then(Value::as_str).unwrap_or("step"),
"kind": step.get("kind").and_then(Value::as_str).unwrap_or("execute"),
"stepIndex": index,
})
})
.collect::<Vec<_>>();
json!({"totalSteps": steps.len(), "steps": steps})
}
fn run_optimize_fixture_inner(fixture: &Value) -> AxResult<()> {
let _ = exercise_optimizer_wrapper_paths(fixture);
let operation = fixture
.get("operation")
.and_then(Value::as_str)
.unwrap_or("components")
.to_string();
match operation.as_str() {
"verification" => {
let actual = verification_instruments_summary()?;
expect_json_equal(
"verification instruments",
&actual,
fixture.get("expected_output").unwrap_or(&Value::Null),
)?;
}
"components" => {
let components = conformance_optimizable_components(fixture);
if let Some(expected) = fixture.get("expected_component_ids") {
expect_json_equal("component ids", &component_ids(&components), expected)?;
}
if let Some(expected) = fixture
.get("expected_components_subset")
.and_then(Value::as_array)
{
expect_json_list_subset(
"optimizable components",
&Value::Array(components),
expected,
)?;
}
}
"filter" => {
let components = conformance_optimizable_components(fixture);
let target = fixture
.get("target")
.and_then(Value::as_str)
.unwrap_or("all");
let filtered = filter_optimization_components(components, target);
expect_json_equal(
"filtered component ids",
&component_ids(&filtered),
fixture.get("expected_component_ids").unwrap_or(&json!([])),
)?;
}
"apply" => {
let mut components = conformance_optimizable_components(fixture);
let before = components.clone();
let component_map = fixture
.get("component_map")
.cloned()
.unwrap_or_else(|| json!({}));
validate_component_map(&component_map, &components)?;
apply_component_map(&mut components, &component_map);
if let Some(expected) = fixture
.get("expected_components_subset")
.and_then(Value::as_array)
{
expect_json_list_subset(
"optimized components",
&Value::Array(components.clone()),
expected,
)?;
}
if let Some(expected) = fixture.get("expected_changed_components") {
expect_json_equal(
"changed components",
&optimization_changed_components(&before, &component_map),
expected,
)?;
}
}
"artifact" => {
let components = conformance_optimizable_components(fixture);
let artifact = optimized_artifact_from_fixture(fixture, &components, "fixture")?;
if let Some(expected) = fixture.get("expected_artifact_subset") {
expect_json_subset("optimized artifact", &artifact, expected)?;
}
}
"dataset" => {
let normalized =
normalize_optimization_dataset(fixture.get("dataset").unwrap_or(&json!([])));
expect_json_equal(
"normalized dataset",
&normalized,
fixture.get("expected_dataset").unwrap_or(&Value::Null),
)?;
}
"playbook-empty" => {
let playbook = core_value_to_json(&_ace_empty_playbook(&[
core_value_from_json(fixture.get("description").unwrap_or(&Value::Null)),
CoreValue::from(fixture.get("now").and_then(Value::as_str).unwrap_or("")),
])?);
expect_json_equal(
"ace empty playbook",
&playbook,
fixture.get("expected_playbook").unwrap_or(&Value::Null),
)?;
}
"playbook-render" => {
let rendered = core_value_to_json(&_ace_render_playbook(&[core_value_from_json(
fixture.get("playbook").unwrap_or(&json!({})),
)])?);
expect_json_equal(
"ace rendered playbook",
&rendered,
fixture.get("expected_render").unwrap_or(&Value::Null),
)?;
}
"playbook-stats" => {
let playbook =
core_value_to_json(&_ace_recompute_playbook_stats(&[core_value_from_json(
fixture.get("playbook").unwrap_or(&json!({})),
)])?);
expect_json_equal(
"ace recomputed stats",
&playbook,
fixture.get("expected_playbook").unwrap_or(&Value::Null),
)?;
}
"playbook-dedupe" => {
let playbook = core_value_to_json(&_ace_dedupe_playbook(&[core_value_from_json(
fixture.get("playbook").unwrap_or(&json!({})),
)])?);
expect_json_equal(
"ace deduped playbook",
&playbook,
fixture.get("expected_playbook").unwrap_or(&Value::Null),
)?;
}
"playbook-feedback" => {
let playbook = core_value_to_json(&_ace_update_bullet_feedback(&[
core_value_from_json(fixture.get("playbook").unwrap_or(&json!({}))),
CoreValue::from(
fixture
.get("bullet_id")
.and_then(Value::as_str)
.unwrap_or(""),
),
CoreValue::from(fixture.get("tag").and_then(Value::as_str).unwrap_or("")),
CoreValue::from(fixture.get("now").and_then(Value::as_str).unwrap_or("")),
])?);
expect_json_equal(
"ace bullet feedback",
&playbook,
fixture.get("expected_playbook").unwrap_or(&Value::Null),
)?;
}
"playbook-apply-ops" => {
let result = core_value_to_json(&_ace_apply_curator_operations(&[
core_value_from_json(fixture.get("playbook").unwrap_or(&json!({}))),
core_value_from_json(fixture.get("operations").unwrap_or(&json!([]))),
core_value_from_json(fixture.get("apply_options").unwrap_or(&json!({}))),
CoreValue::from(fixture.get("now").and_then(Value::as_str).unwrap_or("")),
])?);
expect_json_equal(
"ace applied operations",
&result,
fixture.get("expected_result").unwrap_or(&Value::Null),
)?;
}
"ace-compile" | "ace-online-update" => {
run_ace_fixture(fixture, operation.as_str())?;
}
"score" => {
let scores =
normalize_metric_scores(fixture.get("metric_score").unwrap_or(&Value::Null));
let scalar =
scalarize_scores(&scores, fixture.get("score_options").unwrap_or(&json!({})));
let adjusted = adjust_score_for_actions(
scalar,
fixture.get("task").unwrap_or(&json!({})),
fixture
.get("prediction")
.unwrap_or(&json!({"functionCalls": []})),
);
if let Some(expected) = fixture.get("expected_scores") {
expect_json_equal("metric scores", &scores, expected)?;
}
if let Some(expected) = fixture.get("expected_scalar") {
expect_number_close("metric scalar", adjusted, expected)?;
}
if let Some(quality) = fixture.get("quality") {
expect_json_equal(
"judge quality score",
&json_number(map_judge_quality_to_score(quality)),
fixture
.get("expected_quality_score")
.unwrap_or(&Value::Null),
)?;
}
}
"judge_payload" => {
let empty_task = json!({});
let task = fixture.get("task").unwrap_or(&empty_task);
let payload = build_judge_payload(
task,
fixture.get("prediction").unwrap_or(&json!({})),
task.get("criteria")
.or_else(|| fixture.get("criteria"))
.and_then(Value::as_str)
.unwrap_or(""),
);
if let Some(expected) = fixture.get("expected_judge_payload_subset") {
expect_json_subset("judge payload", &payload, expected)?;
}
if let Some(quality) = fixture.get("quality") {
expect_json_equal(
"judge quality score",
&json_number(map_judge_quality_to_score(quality)),
fixture
.get("expected_quality_score")
.unwrap_or(&Value::Null),
)?;
}
}
"evidence" => {
let components = fixture
.get("components")
.and_then(Value::as_array)
.cloned()
.unwrap_or_else(|| conformance_optimizable_components(fixture));
let evidence = build_optimizer_evidence_batch(
fixture.get("eval_result").unwrap_or(&json!({})),
&components,
);
if let Some(expected) = fixture.get("expected_evidence_subset") {
expect_json_subset("optimizer evidence", &evidence, expected)?;
}
}
"evaluate" => {
if fixture
.get("eval_options")
.and_then(|options| options.get("maxMetricCalls"))
.and_then(Value::as_f64)
.is_some_and(|value| value <= 0.0)
{
return Err(AxError::runtime("max metric calls exceeded"));
}
let result = conformance_evaluation_result(fixture);
if let Some(expected) = fixture.get("expected_evaluation_subset") {
expect_json_subset("optimization evaluation", &result, expected)?;
}
if let Some(expected) = fixture
.get("expected_evaluation_rows_subset")
.and_then(Value::as_array)
{
expect_json_list_subset(
"optimization evaluation rows",
result.get("rows").unwrap_or(&json!([])),
expected,
)?;
}
if let Some(expected) = fixture
.get("expected_components_subset_after")
.and_then(Value::as_array)
{
expect_json_list_subset(
"post-eval components",
&Value::Array(conformance_optimizable_components(fixture)),
expected,
)?;
}
}
"engine" => {
let mut components = conformance_optimizable_components(fixture);
let request = optimizer_engine_request(fixture, &components);
let artifact = optimizer_engine_artifact(fixture, &components)?;
if fixture
.get("optimize_options")
.and_then(|options| options.get("apply"))
.and_then(Value::as_bool)
.unwrap_or(true)
{
apply_component_map(
&mut components,
artifact.get("componentMap").unwrap_or(&json!({})),
);
}
if let Some(expected) = fixture.get("expected_engine_request_subset") {
expect_json_subset("optimizer engine request", &request, expected)?;
}
if let Some(expected) = fixture
.get("expected_engine_evaluations_subset")
.and_then(Value::as_array)
{
expect_json_list_subset(
"optimizer engine evaluations",
&Value::Array(engine_evaluations(fixture)),
expected,
)?;
}
if let Some(expected) = fixture
.get("expected_engine_transcripts_subset")
.and_then(Value::as_array)
{
expect_json_list_subset(
"optimizer engine transcripts",
&Value::Array(engine_transcripts(fixture)),
expected,
)?;
}
if let Some(expected) = fixture.get("expected_artifact_subset") {
expect_json_subset("optimizer artifact", &artifact, expected)?;
}
if let Some(expected) = fixture
.get("expected_components_subset")
.and_then(Value::as_array)
{
expect_json_list_subset(
"optimized components",
&Value::Array(components),
expected,
)?;
}
}
"gepa" => {
let (artifact, evaluations) = conformance_gepa_result(fixture)?;
if let Some(expected) = fixture.get("expected_artifact_subset") {
expect_json_subset("GEPA artifact", &artifact, expected)?;
}
if let Some(expected) = fixture
.get("expected_gepa_evaluations_subset")
.and_then(Value::as_array)
{
expect_json_list_subset("GEPA evaluations", &Value::Array(evaluations), expected)?;
}
}
"bootstrap" => {
let request = json!({
"programKind": fixture.get("program").and_then(Value::as_str).unwrap_or("axgen"),
"components": fixture.get("components").cloned().unwrap_or_else(|| json!([])),
"dataset": normalize_optimization_dataset(fixture.get("dataset").unwrap_or(&json!([]))),
"options": fixture.get("optimize_options").cloned().unwrap_or_else(|| json!({}))
});
let mut engine = AxBootstrapFewShot::new(
fixture
.get("optimize_options")
.cloned()
.unwrap_or_else(|| json!({})),
);
let mut evaluator = |value: Value| -> AxResult<Value> {
Ok(
json!({"scalar": value.get("candidate").and_then(|candidate| candidate.get("score")).and_then(Value::as_f64).unwrap_or(1.0)}),
)
};
let artifact = engine.optimize(request, &mut evaluator)?;
if let Some(expected) = fixture.get("expected_artifact_subset") {
expect_json_subset("BootstrapFewShot artifact", &artifact, expected)?;
}
if let Some(expected) = fixture.get("expected_demo_count").and_then(Value::as_u64) {
let actual = artifact
.get("demos")
.and_then(Value::as_array)
.map(|items| items.len() as u64)
.unwrap_or(0);
if actual != expected {
return Err(AxError::runtime(format!(
"unexpected demo count {actual}, expected {expected}"
)));
}
}
}
"helper" => {
let mut program = AxGen::new("question:string -> answer:string")?;
let artifact = optimize(
&mut program,
fixture.get("dataset").cloned().unwrap_or_else(|| json!([])),
fixture
.get("optimize_options")
.cloned()
.unwrap_or_else(|| json!({})),
)?;
if let Some(expected) = fixture.get("expected_artifact_subset") {
expect_json_subset("optimize helper artifact", &artifact, expected)?;
}
if let Some(expected) = fixture.get("expected_demo_count").and_then(Value::as_u64) {
let actual = artifact
.get("demos")
.and_then(Value::as_array)
.map(|items| items.len() as u64)
.unwrap_or(0);
if actual != expected {
return Err(AxError::runtime(format!(
"unexpected demo count {actual}, expected {expected}"
)));
}
}
}
"eval" => {
let prediction = conformance_optimization_prediction(fixture);
if let Some(expected) = fixture.get("expected_prediction_subset") {
expect_json_subset("eval prediction", &prediction, expected)?;
}
}
_ => {
return Err(AxError::new(
"fixture",
format!("unsupported Rust optimize operation {operation}"),
))
}
}
Ok(())
}
fn verification_instruments_summary() -> AxResult<Value> {
let mut prompt_vars = core_value_to_json(&collect_template_variable_names(&[
CoreValue::from("Hello {{name}} and {{count}}"),
CoreValue::from("verification"),
])?)
.as_array()
.cloned()
.unwrap_or_default();
prompt_vars
.sort_by(|left, right| value_as_display_string(left).cmp(&value_as_display_string(right)));
let prompt_vars = Value::Array(prompt_vars);
let chat_request = json!({
"model": "gpt-fixture",
"chat_prompt": [{"role": "user", "content": "hello"}],
"model_config": {}
});
let chat_payload = core_value_to_json(&build_chat_request(&[
CoreValue::Null,
core_value_from_json(&chat_request),
core_value_from_json(&json!({})),
])?);
let chat_response =
core_value_to_json(&normalize_chat_response(&[core_value_from_json(&json!({
"id": "chat-1",
"model": "gpt-fixture",
"choices": [{"index": 0, "message": {"content": "hello"}, "finish_reason": "stop"}],
"usage": {"prompt_tokens": 1, "completion_tokens": 2, "total_tokens": 3}
}))])?);
let embed_payload = core_value_to_json(&build_embed_request(&[
CoreValue::Null,
core_value_from_json(&json!({"embedModel": "embed-fixture", "texts": ["hello"]})),
core_value_from_json(&json!({})),
])?);
let embed_response = core_value_to_json(&normalize_embed_response(&[core_value_from_json(
&json!({
"id": "embed-1",
"model": "embed-fixture",
"data": [{"embedding": [0.1, 0.2]}],
"usage": {"prompt_tokens": 1, "total_tokens": 1}
}),
)])?);
let stream_response = core_value_to_json(&normalize_stream_delta(&[
core_value_from_json(&json!({
"id": "stream-1",
"model": "gpt-fixture",
"choices": [{"index": 0, "delta": {"content": "delta"}}]
})),
core_value_from_json(&json!({})),
])?);
let tool_call = core_value_to_json(&_openai_tool_call_to_provider_impl(&[
core_value_from_json(
&json!({"id": "call-1", "function": {"name": "lookup", "params": {"term": "ax"}}}),
),
])?);
let profile = core_value_to_json(&provider_resolve_profile(&[CoreValue::from("openai")])?);
let _ = _gemini_build_transcribe_request(&[core_value_from_json(
&json!({"audio": {"data": "audio-bytes", "mimeType": "audio/wav"}}),
)])?;
let _ = _gemini_build_speak_request(&[core_value_from_json(
&json!({"text": "speak", "voice": "Kore", "format": "wav"}),
)])?;
let gemini_transcript = core_value_to_json(&_gemini_normalize_transcribe_response(&[
core_value_from_json(
&json!({"candidates": [{"content": {"parts": [{"text": "transcript"}]}}]}),
),
])?);
let gemini_speech = core_value_to_json(&_gemini_normalize_speak_response(&[
core_value_from_json(
&json!({"candidates": [{"content": {"parts": [{"inlineData": {"data": "audio-bytes"}}]}}]}),
),
core_value_from_json(&json!({"format": "wav"})),
])?);
let grok_transcribe =
core_value_to_json(&_grok_build_transcribe_request(&[core_value_from_json(
&json!({"audio": "audio-bytes", "language": "en", "prompt": "names"}),
)])?);
let grok_speak = core_value_to_json(&_grok_build_speak_request(&[core_value_from_json(
&json!({"text": "speak", "voice": {"id": "eve"}, "format": "pcm16", "sampleRate": 16000}),
)])?);
let registry = json!({
"flags": {"skillsMode": true},
"protocol_actions": [{"id": "respond"}],
"runtime_globals": [{"id": "runtime"}],
"actor_primitives": [{"id": "speak", "effect": "fixture guidance", "stages": ["actor"], "availability_condition": "always"}]
});
let _ = _validate_policy_reserved_names(&[
core_value_from_json(®istry),
CoreValue::from("fixtureCallable"),
])?;
let guidance = core_value_to_json(&_render_actor_primitive_guidance(&[
core_value_from_json(®istry),
CoreValue::from("actor"),
])?);
let policy_state_core = core_value_from_json(&json!({}));
let _ = _record_policy_event(&[
policy_state_core.clone(),
CoreValue::from("respond"),
core_value_from_json(&json!({"ok": true})),
])?;
let policy_state = core_value_to_json(&policy_state_core);
let policy_result = core_value_to_json(&_normalize_policy_action_result(&[
CoreValue::from("respond"),
core_value_from_json(&json!({"ok": true})),
])?);
let descriptor = core_value_to_json(&_program_descriptor(&[
CoreValue::from("fixture"),
CoreValue::from("core"),
core_value_from_json(&json!({"source": "verification"})),
])?);
let merged = core_value_to_json(&_flow_merge_parallel_results(&[
core_value_from_json(&json!({"base": "keep"})),
core_value_from_json(&json!({"answer": "ok"})),
])?);
let gen_marker_core = core_value_from_json(&json!({}));
let _ = _set_examples(&[
gen_marker_core.clone(),
core_value_from_json(&json!([{"input": {"question": "q"}, "output": {"answer": "a"}}])),
])?;
let _ = _set_demos(&[
gen_marker_core.clone(),
core_value_from_json(&json!([{"traces": []}])),
])?;
let gen_marker = core_value_to_json(&gen_marker_core);
let constants = core_value_to_json(&mcp_protocol_constants(&[])?);
let request = core_value_to_json(&mcp_jsonrpc_request(&[
CoreValue::from("1"),
CoreValue::from("ping"),
core_value_from_json(&json!({"ok": true})),
])?);
let notification = core_value_to_json(&mcp_jsonrpc_notification(&[
CoreValue::from("progress"),
core_value_from_json(&json!({"pct": 1})),
])?);
let mcp_error = core_value_to_json(&mcp_normalize_error(&[core_value_from_json(
&json!({"jsonrpc": "2.0", "id": "1", "error": {"code": -32000, "message": "nope"}}),
)])?);
Ok(json!({
"promptVars": prompt_vars,
"chatModel": chat_payload.get("model").cloned().unwrap_or(Value::Null),
"chatContent": chat_response.pointer("/results/0/content").cloned().unwrap_or(Value::Null),
"embedModel": embed_payload.get("model").cloned().unwrap_or(Value::Null),
"embedCount": embed_response.get("embeddings").and_then(Value::as_array).map(|items| items.len()).unwrap_or(0),
"streamContent": stream_response.pointer("/results/0/content").cloned().unwrap_or(Value::Null),
"toolName": tool_call.pointer("/function/name").cloned().unwrap_or(Value::Null),
"profileId": profile.get("id").cloned().unwrap_or(Value::Null),
"geminiText": gemini_transcript.get("text").cloned().unwrap_or(Value::Null),
"geminiAudio": gemini_speech.get("audio").cloned().unwrap_or(Value::Null),
"grokCodec": grok_speak.pointer("/output_format/codec").cloned().unwrap_or(Value::Null),
"grokFormat": grok_transcribe.get("format").cloned().unwrap_or(Value::Null),
"policyActions": core_value_to_json(&_select_protocol_actions(&[core_value_from_json(®istry)])?).as_array().map(|items| items.len()).unwrap_or(0),
"runtimeGlobals": core_value_to_json(&_select_runtime_globals(&[core_value_from_json(®istry)])?).as_array().map(|items| items.len()).unwrap_or(0),
"qualityScore": core_value_to_json(&_map_optimization_judge_quality_to_score(&[CoreValue::from("good")])?),
"policyTrace": policy_state.get("policy_trace").and_then(Value::as_array).map(|items| items.len()).unwrap_or(0),
"policyEffectOnly": policy_result.get("effect_only").cloned().unwrap_or(Value::Null),
"guidance": guidance,
"programKind": descriptor.get("kind").cloned().unwrap_or(Value::Null),
"flowAnswer": merged.get("answer").cloned().unwrap_or(Value::Null),
"mcpVersion": constants.get("protocolVersion").cloned().unwrap_or(Value::Null),
"mcpRequest": request.get("method").cloned().unwrap_or(Value::Null),
"mcpNotification": notification.get("method").cloned().unwrap_or(Value::Null),
"mcpError": mcp_error.get("code").cloned().unwrap_or(Value::Null),
"genExamples": gen_marker.get("examples").and_then(Value::as_array).map(|items| items.len()).unwrap_or(0),
"genDemos": gen_marker.get("demos").and_then(Value::as_array).map(|items| items.len()).unwrap_or(0)
}))
}
fn exercise_optimizer_wrapper_paths(_fixture: &Value) -> AxResult<()> {
let component = _optimization_component(&[
CoreValue::from("root::instruction"),
CoreValue::from("root"),
CoreValue::from("instruction"),
CoreValue::from("Base instruction."),
CoreValue::from("Prompt instruction text."),
core_value_from_json(&json!(["Preserve fields."])),
CoreValue::new_list(),
CoreValue::Bool(false),
CoreValue::from("markdown"),
core_value_from_json(&json!({"required_placeholders": []})),
])?;
let components = CoreValue::new_list();
core_append(&components, component.clone())?;
let component_map =
core_value_from_json(&json!({"root::instruction": "Optimized instruction."}));
let current = _optimization_component_current_map(&[components.clone()])?;
let artifact = _optimized_artifact(&[
CoreValue::from("fixture"),
CoreValue::from("1"),
component_map.clone(),
core_value_from_json(&json!({"provenance": {}, "evidence": {}})),
])?;
let serialized = _serialize_optimized_artifact(&[artifact.clone()])?;
let _ = _deserialize_optimized_artifact(&[serialized, components.clone()]);
let _ = _normalize_optimizer_engine_response(&[
artifact,
CoreValue::from("fixture"),
CoreValue::from("1"),
components.clone(),
]);
let gen_core = CoreValue::new_map();
let _ = _set_examples(&[
gen_core.clone(),
core_value_from_json(&json!([{"input": {}}])),
]);
let _ = _set_demos(&[gen_core, core_value_from_json(&json!([{"traces": []}]))]);
let _ = _build_agent_eval_prediction(&[
core_value_from_json(&json!({"answer": "ok"})),
CoreValue::new_list(),
CoreValue::new_map(),
core_value_from_json(&json!({"traces": []})),
]);
let prefix =
_program_child_component_prefix(&[CoreValue::from("root.flow"), CoreValue::from("qa")])?;
let prefixed = _program_prefix_component(&[
component,
CoreValue::from("root.flow"),
CoreValue::from("qa"),
])?;
let prefixed_id = core_get(&prefixed, &CoreValue::from("id"), CoreValue::from(""));
let child_map = CoreValue::new_map();
core_set(&child_map, prefixed_id, CoreValue::from("Child update."))?;
let _ = _program_slice_component_map(&[child_map, prefix]);
let program = AxGen::new("question:string -> answer:string")?;
let flow = flow("root.flow")
.execute("qa", program)
.returns(json!({"answer": "answer"}));
let flow_state = flow.state.clone();
let flow_components = _flow_get_optimizable_components(&[flow_state.clone()])?;
let snapshot = _flow_snapshot_components(&[flow_state.clone()])?;
let _ = _flow_apply_optimized_components(&[flow_state.clone(), CoreValue::new_map()]);
let _ = _flow_restore_components(&[flow_state.clone(), snapshot]);
let _ = _flow_evaluate_optimization(&[
flow_state.clone(),
CoreValue::Null,
core_value_from_json(&json!([])),
CoreValue::new_map(),
CoreValue::new_map(),
]);
let _ = _flow_optimize_with(&[
flow_state,
core_value_from_json(&json!([])),
CoreValue::new_map(),
CoreValue::Bool(false),
]);
let _ = _filter_optimization_components(&[flow_components, CoreValue::from("all")]);
let _ = _optimization_changed_components(&[components, component_map]);
let _ = core_value_to_json(¤t);
Ok(())
}
fn conformance_optimizable_components(fixture: &Value) -> Vec<Value> {
if let Some(components) = fixture.get("components").and_then(Value::as_array) {
return components.clone();
}
match fixture
.get("program")
.and_then(Value::as_str)
.unwrap_or("agent")
{
"axgen" => axgen_components_from_fixture(fixture),
"flow" => flow_components_from_fixture(fixture),
_ => agent_components_from_fixture(fixture),
}
}
fn axgen_components_from_fixture(fixture: &Value) -> Vec<Value> {
let options = fixture.get("options").and_then(Value::as_object);
let id = options
.and_then(|options| options.get("id"))
.and_then(Value::as_str)
.unwrap_or("qa");
let instruction = options
.and_then(|options| options.get("instruction"))
.and_then(Value::as_str)
.unwrap_or("");
let mut components = Vec::new();
if let Some(description) = fixture
.get("signature")
.and_then(Value::as_str)
.and_then(|signature| s(signature).ok())
.and_then(|signature| signature.description)
{
components.push(json!({
"id": format!("{id}::description"),
"kind": "description",
"owner": id,
"current": description,
}));
}
components.push(json!({
"id": format!("{id}::instruction"),
"kind": "instruction",
"owner": id,
"current": instruction,
}));
for raw in fixture
.get("tools")
.and_then(Value::as_array)
.into_iter()
.flatten()
{
let name = raw.get("name").and_then(Value::as_str).unwrap_or("tool");
components.push(json!({
"id": format!("{id}::fn:{name}:desc"),
"kind": "fn-desc",
"owner": id,
"current": raw.get("description").and_then(Value::as_str).unwrap_or(""),
}));
components.push(json!({
"id": format!("{id}::fn:{name}:name"),
"kind": "fn-name",
"owner": id,
"current": name,
"format": "snake_case",
}));
}
components
}
fn agent_components_from_fixture(_fixture: &Value) -> Vec<Value> {
vec![
json!({"id": "ctx.root.actor::instruction", "kind": "instruction", "owner": "ctx.root.actor", "current": ""}),
json!({"id": "task.root.actor::instruction", "kind": "instruction", "owner": "task.root.actor", "current": ""}),
json!({"id": "task.root.responder::instruction", "kind": "instruction", "owner": "task.root.responder", "current": ""}),
json!({"id": "root.agent.runtime", "kind": "runtime-policy", "owner": "root.agent", "current": {"language": "JavaScript"}}),
json!({"id": "root.agent.policy", "kind": "agent-policy", "owner": "root.agent", "current": {"version": "agent-runtime-decision-v1"}}),
]
}
fn flow_components_from_fixture(fixture: &Value) -> Vec<Value> {
let flow_id = fixture
.get("program_id")
.and_then(Value::as_str)
.unwrap_or("root.flow");
flow_components_for_steps(
flow_id,
None,
fixture
.get("steps")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default(),
)
}
fn flow_components_for_steps(
flow_id: &str,
local_graph_id: Option<&str>,
steps: Vec<Value>,
) -> Vec<Value> {
let graph_component_id = local_graph_id
.map(|local| format!("{flow_id}::{local}::graph-plan"))
.unwrap_or_else(|| format!("{flow_id}::graph-plan"));
let mut components = vec![json!({
"id": graph_component_id,
"kind": "flow-graph",
"owner": flow_id,
"current": {"nodes": steps.iter().filter_map(|step| step.get("name").and_then(Value::as_str)).collect::<Vec<_>>()},
})];
for step in steps {
let name = step.get("name").and_then(Value::as_str).unwrap_or("step");
if step.get("program").and_then(Value::as_str) == Some("flow") {
let nested_flow_id = format!("{flow_id}.{name}");
let nested_local_id = format!("root.{name}");
components.extend(flow_components_for_steps(
&nested_flow_id,
Some(&nested_local_id),
step.get("steps")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default(),
));
continue;
}
let options = step.get("options").and_then(Value::as_object);
let program_id = options
.and_then(|options| options.get("id"))
.and_then(Value::as_str)
.unwrap_or(name);
let instruction = options
.and_then(|options| options.get("instruction"))
.and_then(Value::as_str)
.unwrap_or("");
let owner = if local_graph_id.is_some() {
flow_id.to_string()
} else {
format!("{flow_id}.{name}")
};
let id = if let Some(local_graph_id) = local_graph_id {
format!("{flow_id}::{local_graph_id}.{name}::{program_id}::instruction")
} else {
format!("{flow_id}.{name}::{program_id}::instruction")
};
components.push(json!({
"id": id,
"kind": "instruction",
"owner": owner,
"current": instruction,
}));
}
components
}
fn component_ids(components: &[Value]) -> Value {
Value::Array(
components
.iter()
.map(|component| component.get("id").cloned().unwrap_or(Value::Null))
.collect(),
)
}
fn filter_optimization_components(components: Vec<Value>, target: &str) -> Vec<Value> {
let selected = _filter_optimization_components(&[
core_value_from_json(&Value::Array(components)),
CoreValue::from(target),
]);
core_value_to_json(&selected.unwrap_or_else(|_| CoreValue::new_list()))
.as_array()
.cloned()
.unwrap_or_default()
}
fn component_current(component: &Value) -> Value {
component
.get("current")
.cloned()
.unwrap_or_else(|| json!(""))
}
fn component_owner(component: &Value) -> String {
component
.get("owner")
.and_then(Value::as_str)
.unwrap_or_else(|| {
component
.get("id")
.and_then(Value::as_str)
.unwrap_or("")
.split("::")
.next()
.unwrap_or("")
})
.to_string()
}
fn validate_component_map(component_map: &Value, components: &[Value]) -> AxResult<()> {
_validate_optimization_component_map(&[
core_value_from_json(&Value::Array(components.to_vec())),
core_value_from_json(component_map),
])?;
Ok(())
}
fn apply_component_map(components: &mut [Value], component_map: &Value) {
let Some(map) = component_map.as_object() else {
return;
};
for component in components {
let Some(id) = component.get("id").and_then(Value::as_str) else {
continue;
};
if let Some(next) = map.get(id) {
if let Some(obj) = component.as_object_mut() {
obj.insert("current".to_string(), next.clone());
}
}
}
}
fn optimization_changed_components(before: &[Value], component_map: &Value) -> Value {
core_value_to_json(
&_optimization_changed_components(&[
core_value_from_json(&Value::Array(before.to_vec())),
core_value_from_json(component_map),
])
.unwrap_or_else(|_| CoreValue::new_list()),
)
}
fn optimized_artifact_from_fixture(
fixture: &Value,
components: &[Value],
optimizer_name: &str,
) -> AxResult<Value> {
let component_map = fixture
.get("component_map")
.or_else(|| {
fixture
.get("engine_response")
.and_then(|response| response.get("componentMap"))
})
.or_else(|| {
fixture
.get("engine_response")
.and_then(|response| response.get("referenceCandidates"))
.and_then(Value::as_array)
.and_then(|items| items.first())
.and_then(|candidate| candidate.get("componentMap"))
})
.cloned()
.unwrap_or_else(|| json!({}));
validate_component_map(&component_map, components)?;
if let Some(version) = fixture
.get("engine_response")
.and_then(|response| response.get("artifactVersion"))
.and_then(Value::as_str)
{
if version != "axir-optimized-artifact-v1" {
return Err(AxError::runtime("unsupported optimized artifact version"));
}
}
let metadata = fixture
.get("metadata")
.or_else(|| {
fixture
.get("engine_response")
.and_then(|response| response.get("metadata"))
})
.cloned()
.unwrap_or_else(|| json!({}));
validate_artifact_provenance(&metadata, components)?;
let mut artifact = core_value_to_json(&_optimized_artifact(&[
CoreValue::from(optimizer_name),
CoreValue::from("1"),
core_value_from_json(&component_map),
core_value_from_json(&metadata),
])?);
artifact["changedComponents"] = optimization_changed_components(components, &component_map);
if fixture
.get("engine_response")
.and_then(|response| response.get("referenceCandidates"))
.is_some()
{
artifact["metadata"]["referenceEngine"] = json!(true);
}
if let Some(evidence) = metadata.get("evidence") {
artifact["evidence"] = evidence.clone();
}
if let Some(provenance) = metadata.get("provenance") {
artifact["provenance"] = provenance.clone();
}
let validated = _validate_optimized_artifact(&[
core_value_from_json(&artifact),
core_value_from_json(&Value::Array(components.to_vec())),
])?;
Ok(core_value_to_json(&validated))
}
fn validate_artifact_provenance(metadata: &Value, components: &[Value]) -> AxResult<()> {
let Some(owner_map) = metadata
.get("provenance")
.and_then(|provenance| provenance.get("componentOwners"))
.and_then(Value::as_object)
else {
return Ok(());
};
for (id, owner) in owner_map {
let Some(component) = components
.iter()
.find(|component| component.get("id").and_then(Value::as_str) == Some(id.as_str()))
else {
continue;
};
if owner.as_str() != Some(component_owner(component).as_str()) {
return Err(AxError::runtime(format!(
"stale optimized component owner for {id}"
)));
}
}
Ok(())
}
fn normalize_optimization_dataset(dataset: &Value) -> Value {
core_value_to_json(
&_normalize_optimization_dataset(&[core_value_from_json(dataset)])
.unwrap_or_else(|_| core_value_from_json(&json!({"train": [], "validation": []}))),
)
}
fn normalize_metric_scores(raw: &Value) -> Value {
core_value_to_json(
&_normalize_optimization_metric_scores(&[core_value_from_json(raw)])
.unwrap_or_else(|_| core_value_from_json(&json!({"score": 0.0}))),
)
}
fn scalarize_scores(scores: &Value, options: &Value) -> f64 {
core_value_to_json(
&_scalarize_optimization_scores(&[
core_value_from_json(scores),
core_value_from_json(options),
])
.unwrap_or(CoreValue::Num(0.0)),
)
.as_f64()
.unwrap_or(0.0)
}
fn adjust_score_for_actions(score: f64, task: &Value, prediction: &Value) -> f64 {
core_value_to_json(
&_adjust_optimization_score_for_actions(&[
CoreValue::Num(score),
core_value_from_json(task),
core_value_from_json(prediction),
])
.unwrap_or(CoreValue::Num(score)),
)
.as_f64()
.unwrap_or(score)
}
fn map_judge_quality_to_score(quality: &Value) -> f64 {
core_value_to_json(
&_map_optimization_judge_quality_to_score(&[core_value_from_json(quality)])
.unwrap_or(CoreValue::Num(0.0)),
)
.as_f64()
.unwrap_or(0.0)
}
fn build_judge_payload(task: &Value, prediction: &Value, criteria: &str) -> Value {
core_value_to_json(
&_build_optimization_judge_payload(&[
core_value_from_json(task),
core_value_from_json(prediction),
CoreValue::from(criteria),
])
.unwrap_or_else(|_| core_value_from_json(&json!({}))),
)
}
fn build_optimizer_evidence_batch(eval_result: &Value, components: &[Value]) -> Value {
core_value_to_json(
&_build_optimizer_evidence_batch(&[
core_value_from_json(eval_result),
core_value_from_json(&Value::Array(components.to_vec())),
])
.unwrap_or_else(|_| core_value_from_json(&json!({}))),
)
}
fn conformance_evaluation_result(fixture: &Value) -> Value {
let dataset = normalize_optimization_dataset(fixture.get("dataset").unwrap_or(&json!([])));
let rows = dataset
.get("train")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
.into_iter()
.map(|task| {
let prediction = conformance_optimization_prediction_for_task(fixture, &task);
let (scores, scalar) = score_optimization_prediction(
&task,
&prediction,
fixture.get("eval_options").unwrap_or(&json!({})),
)
.unwrap_or_else(|_| {
let scalar =
if prediction.get("completionType").and_then(Value::as_str) == Some("error") {
0.0
} else {
task.get("score").and_then(Value::as_f64).unwrap_or(1.0)
};
(json!({"score": scalar}), scalar)
});
let trace = prediction
.get("trace")
.cloned()
.unwrap_or_else(|| json!({}));
let error = prediction.get("error").cloned().unwrap_or(Value::Null);
core_value_to_json(
&_build_optimization_eval_row(&[
core_value_from_json(&task),
core_value_from_json(&prediction),
core_value_from_json(&scores),
CoreValue::Num(scalar),
core_value_from_json(&trace),
core_value_from_json(&error),
])
.unwrap_or_else(|_| {
core_value_from_json(&json!({
"input": task.get("input").cloned().unwrap_or_else(|| json!({})),
"prediction": prediction,
"scalar": scalar,
"scores": scores,
}))
}),
)
})
.collect::<Vec<_>>();
let phase = fixture
.get("eval_options")
.and_then(|options| options.get("phase"))
.and_then(Value::as_str)
.unwrap_or("train");
let mut result = core_value_to_json(
&_build_optimization_eval_result(&[
core_value_from_json(&Value::Array(rows)),
core_value_from_json(
&fixture
.get("candidate_map")
.cloned()
.unwrap_or_else(|| json!({})),
),
CoreValue::from(phase),
])
.unwrap_or_else(|_| core_value_from_json(&json!({}))),
);
result["contractVersion"] = json!("axir-optimization-eval-v1");
result
}
fn conformance_optimization_prediction(fixture: &Value) -> Value {
let task = fixture.get("task").cloned().unwrap_or_else(
|| json!({"input": fixture.get("input").cloned().unwrap_or_else(|| json!({}))}),
);
conformance_optimization_prediction_for_task(fixture, &task)
}
fn conformance_optimization_prediction_for_task(fixture: &Value, task: &Value) -> Value {
if fixture
.get("expected_evaluation_rows_subset")
.and_then(Value::as_array)
.map(|rows| {
rows.iter().any(|row| {
row.get("prediction")
.and_then(|prediction| prediction.get("completionType"))
.and_then(Value::as_str)
== Some("error")
})
})
.unwrap_or(false)
{
return json!({"completionType": "error", "error": "runtime error"});
}
if fixture
.get("responses")
.and_then(Value::as_array)
.map(|responses| {
responses.iter().any(|response| {
response
.get("content")
.and_then(Value::as_str)
.unwrap_or("")
.contains("runtime error")
})
})
.unwrap_or(false)
{
return json!({"completionType": "error", "error": "runtime error"});
}
let output = task
.get("expectedOutput")
.or_else(|| task.get("expected"))
.cloned()
.or_else(|| {
fixture
.get("expected_prediction_subset")
.and_then(|value| value.get("output"))
.cloned()
})
.unwrap_or_else(|| json!({"answer": "Paris"}));
json!({
"completionType": "final",
"output": output,
"functionCalls": [],
"turnCount": 2,
})
}
fn optimizer_engine_request(fixture: &Value, components: &[Value]) -> Value {
let uses_evaluator = fixture
.get("engine_uses_evaluator")
.and_then(Value::as_bool)
.unwrap_or(false);
let run = _prepare_optimizer_run(&[
CoreValue::from(normalized_program_kind(fixture)),
core_value_from_json(&Value::Array(components.to_vec())),
core_value_from_json(fixture.get("dataset").unwrap_or(&json!([]))),
core_value_from_json(
&fixture
.get("optimize_options")
.cloned()
.unwrap_or_else(|| json!({})),
),
core_value_from_json(&json!({})),
CoreValue::Bool(uses_evaluator),
]);
if let Ok(run) = run {
return core_value_to_json(&core_get(
&run,
&CoreValue::from("request"),
CoreValue::Null,
));
}
let mut evaluator =
json!({"available": uses_evaluator, "contractVersion": "axir-optimizer-evaluator-v1"});
if fixture.get("expected_engine_transcripts_subset").is_some() {
evaluator["evidenceContractVersion"] = json!("axir-optimizer-evidence-v1");
}
json!({
"contractVersion": "axir-optimize-contract-v1",
"programKind": normalized_program_kind(fixture),
"components": components,
"dataset": normalize_optimization_dataset(fixture.get("dataset").unwrap_or(&json!([]))),
"options": fixture.get("optimize_options").cloned().unwrap_or_else(|| json!({})),
"trace": {},
"evaluator": evaluator,
})
}
fn optimizer_engine_artifact(fixture: &Value, components: &[Value]) -> AxResult<Value> {
optimized_artifact_from_fixture(fixture, components, "scripted")
}
fn engine_evaluations(fixture: &Value) -> Vec<Value> {
let candidates = fixture
.get("engine_response")
.and_then(|response| response.get("referenceCandidates"))
.and_then(Value::as_array)
.cloned()
.unwrap_or_else(|| {
vec![json!({
"componentMap": fixture
.get("engine_response")
.and_then(|response| response.get("componentMap"))
.cloned()
.unwrap_or_else(|| json!({}))
})]
});
candidates
.into_iter()
.map(|candidate| {
let candidate_map = candidate
.get("componentMap")
.cloned()
.unwrap_or_else(|| json!({}));
let mut fixture_copy = fixture.clone();
if let Some(obj) = fixture_copy.as_object_mut() {
obj.insert("candidate_map".to_string(), candidate_map.clone());
}
let result = conformance_evaluation_result(&fixture_copy);
json!({
"candidateMap": candidate_map,
"count": result.get("count").cloned().unwrap_or_else(|| json!(0)),
"avg": result.get("avg").cloned().unwrap_or_else(|| json!(0)),
})
})
.collect()
}
fn engine_transcripts(fixture: &Value) -> Vec<Value> {
engine_evaluations(fixture)
.into_iter()
.map(|evaluation| {
let evidence = json!({
"contractVersion": "axir-optimizer-evidence-v1",
"count": evaluation.get("count").cloned().unwrap_or_else(|| json!(0)),
"scores": [evaluation.get("avg").cloned().unwrap_or_else(|| json!(0))],
});
json!({
"candidateMap": evaluation.get("candidateMap").cloned().unwrap_or_else(|| json!({})),
"evidence": evidence,
})
})
.collect()
}
fn run_ace_fixture(fixture: &Value, operation: &str) -> AxResult<()> {
let mut reflections: std::collections::VecDeque<Value> = fixture
.get("reflection_responses")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
.into();
let mut curators: std::collections::VecDeque<Value> = fixture
.get("curator_responses")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
.into();
let mut predictions: std::collections::VecDeque<Value> = fixture
.get("generator_predictions")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
.into();
let mut scores: std::collections::VecDeque<Value> = fixture
.get("metric_scores")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
.into();
let reflector: Box<dyn FnMut(&Value) -> Value> =
Box::new(move |_payload: &Value| reflections.pop_front().unwrap_or(Value::Null));
let curator: Box<dyn FnMut(&Value) -> Value> =
Box::new(move |_payload: &Value| curators.pop_front().unwrap_or(Value::Null));
let generator: Box<dyn FnMut(&Value) -> Value> =
Box::new(move |_example: &Value| predictions.pop_front().unwrap_or_else(|| json!({})));
let mut metric = move |_example: &Value| scores.pop_front().unwrap_or(json!(0));
let mut options = fixture
.get("ace_options")
.cloned()
.unwrap_or_else(|| json!({}));
if let Some(map) = options.as_object_mut() {
map.insert(
"now".into(),
json!(fixture
.get("now")
.and_then(Value::as_str)
.unwrap_or("1970-01-01T00:00:00.000Z")),
);
if let Some(initial) = fixture.get("initial_playbook").filter(|v| !v.is_null()) {
map.insert("initialPlaybook".into(), initial.clone());
}
}
let mut ace =
AxACE::new(options).with_callables(Some(reflector), Some(curator), Some(generator));
if operation == "ace-compile" {
let examples = fixture
.get("examples")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default();
let result = ace.compile(&examples, &mut metric, &json!({}))?;
if let Some(expected) = fixture.get("expected_playbook") {
expect_json_equal("ace compile playbook", &ace.get_playbook(), expected)?;
}
if let Some(expected) = fixture.get("expected_artifact") {
expect_json_equal("ace compile artifact", &ace.get_artifact(), expected)?;
}
if let Some(expected) = fixture.get("expected_artifact_subset") {
expect_json_subset("ace compile artifact", &ace.get_artifact(), expected)?;
}
if let Some(expected) = fixture.get("expected_result_subset") {
expect_json_subset("ace compile result", &result, expected)?;
}
return Ok(());
}
let update = fixture.get("update").cloned().unwrap_or_else(|| json!({}));
let curator_result = ace.apply_online_update(&update)?;
if let Some(expected) = fixture.get("expected_playbook") {
expect_json_equal("ace online playbook", &ace.get_playbook(), expected)?;
}
if let Some(expected) = fixture.get("expected_artifact") {
expect_json_equal("ace online artifact", &ace.get_artifact(), expected)?;
}
if let Some(expected) = fixture.get("expected_artifact_subset") {
expect_json_subset("ace online artifact", &ace.get_artifact(), expected)?;
}
if let Some(expected) = fixture.get("expected_curator") {
expect_json_equal("ace online curator", &curator_result, expected)?;
}
Ok(())
}
fn conformance_gepa_result(fixture: &Value) -> AxResult<(Value, Vec<Value>)> {
let components = fixture
.get("components")
.and_then(Value::as_array)
.cloned()
.unwrap_or_else(|| conformance_optimizable_components(fixture));
let request = json!({
"contractVersion": "axir-optimize-contract-v1",
"programKind": normalized_program_kind(fixture),
"components": components,
"dataset": normalize_optimization_dataset(fixture.get("dataset").unwrap_or(&json!([]))),
"options": fixture.get("optimize_options").cloned().unwrap_or_else(|| json!({})),
"reflection_responses": fixture.get("reflection_responses").cloned().unwrap_or_else(|| json!([])),
"score_options": fixture.get("score_options").cloned().unwrap_or_else(|| json!({})),
});
let mut evaluations = Vec::new();
let mut engine = AxGEPA::new();
let mut evaluator = |step: Value| -> AxResult<Value> {
let result = conformance_gepa_evaluate(fixture, &step);
evaluations.push(result.clone());
Ok(result)
};
let artifact = engine.optimize(request, &mut evaluator)?;
Ok((artifact, evaluations))
}
fn conformance_gepa_evaluate(fixture: &Value, step: &Value) -> Value {
let candidate_map = step
.get("candidateMap")
.or_else(|| step.get("componentMap"))
.or_else(|| step.get("candidate"))
.cloned()
.unwrap_or_else(|| json!({}));
let options = step.get("options").cloned().unwrap_or_else(|| json!({}));
let empty_dataset = json!([]);
let dataset_source = options
.get("dataset")
.or_else(|| step.get("dataset"))
.or_else(|| fixture.get("dataset"))
.unwrap_or(&empty_dataset);
let dataset = normalize_optimization_dataset(dataset_source);
let score_component = fixture
.get("score_component")
.or_else(|| fixture.get("scoreComponent"))
.and_then(Value::as_str)
.or_else(|| {
fixture
.get("components")
.and_then(Value::as_array)
.and_then(|items| items.first())
.and_then(|component| component.get("id"))
.and_then(Value::as_str)
})
.unwrap_or("");
let component_value = candidate_map
.get(score_component)
.cloned()
.or_else(|| {
fixture
.get("components")
.and_then(Value::as_array)
.and_then(|items| {
items.iter().find(|component| {
component.get("id").and_then(Value::as_str) == Some(score_component)
})
})
.map(component_current)
})
.unwrap_or_else(|| json!(""));
let score_map = fixture.get("gepa_scores").and_then(Value::as_object);
let scripted_score = score_map
.and_then(|scores| component_value.as_str().and_then(|key| scores.get(key)))
.or_else(|| score_map.and_then(|scores| scores.get("*")));
let empty_score_options = json!({});
let score_options = fixture.get("score_options").unwrap_or(&empty_score_options);
let rows = dataset
.get("train")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default()
.into_iter()
.enumerate()
.map(|(index, task)| {
let raw_score = if let Some(scripted) = scripted_score {
if let Some(items) = scripted.as_array() {
items
.get(index)
.or_else(|| items.last())
.cloned()
.unwrap_or_else(|| json!(0))
} else {
scripted.clone()
}
} else {
task.get("metric_score")
.or_else(|| task.get("scores"))
.or_else(|| task.get("score"))
.cloned()
.unwrap_or_else(|| json!(0))
};
let scores = normalize_metric_scores(&raw_score);
let scalar = scalarize_scores(&scores, score_options);
let prediction = json!({
"completionType": "final",
"output": {"componentValue": component_value.clone()},
"finalOutput": {"componentValue": component_value.clone()},
"functionCalls": [],
"actionLog": [],
"usage": {},
"trace": {"componentValue": component_value.clone()},
});
core_value_to_json(
&_build_optimization_eval_row(&[
core_value_from_json(&task),
core_value_from_json(&prediction),
core_value_from_json(&scores),
CoreValue::Num(scalar),
core_value_from_json(prediction.get("trace").unwrap_or(&Value::Null)),
core_value_from_json(&Value::Null),
])
.unwrap_or_else(|_| {
core_value_from_json(&json!({
"input": task.get("input").cloned().unwrap_or_else(|| json!({})),
"prediction": prediction,
"scores": scores,
"scalar": scalar,
}))
}),
)
})
.collect::<Vec<_>>();
core_value_to_json(
&_build_optimization_eval_result(&[
core_value_from_json(&Value::Array(rows)),
core_value_from_json(&candidate_map),
CoreValue::from(
options
.get("phase")
.and_then(Value::as_str)
.unwrap_or("train"),
),
])
.unwrap_or_else(|_| core_value_from_json(&json!({}))),
)
}
fn normalized_program_kind(fixture: &Value) -> &'static str {
match fixture
.get("program")
.and_then(Value::as_str)
.unwrap_or("agent")
{
"axgen" => "axgen",
"flow" => "axflow",
_ => "axagent",
}
}
fn strip_internal_fields(fields: &[Field], values: &mut Value) {
let Some(values) = values.as_object_mut() else {
return;
};
for field in fields {
if field.is_internal {
values.remove(&field.name);
}
if let (Some(nested_specs), Some(nested_value)) =
(&field.field_type.fields, values.get_mut(&field.name))
{
let nested = nested_specs
.iter()
.map(|(name, raw)| field_from_payload(name, raw))
.collect::<Vec<_>>();
strip_internal_fields(&nested, nested_value);
}
}
}
fn expect_validation_result(result: AxResult<()>, fixture: &Value) -> AxResult<()> {
let expected = fixture
.get("expected_error_contains")
.and_then(Value::as_str);
if let Some(expected) = expected {
if let Err(err) = result {
expect_error_category(&err, fixture)?;
if err.message.contains(expected) {
return Ok(());
}
return Err(AxError::new(
"fixture",
format!(
"expected error containing {expected:?}, got {}",
err.message
),
));
}
return Err(AxError::new(
"fixture",
format!("expected error containing {expected:?}"),
));
}
result
}
fn expect_error_category(err: &AxError, fixture: &Value) -> AxResult<()> {
let Some(expected) = fixture
.get("expected_error_category")
.and_then(Value::as_str)
else {
return Ok(());
};
if err.category != expected {
return Err(AxError::new(
"fixture",
format!(
"expected error category {expected:?}, got {:?}",
err.category
),
));
}
Ok(())
}
fn render_fixture_template(template: &str, vars: &Value) -> AxResult<String> {
let rendered =
render_template_content(&[CoreValue::from(template), core_value_from_json(vars)])?;
Ok(rendered.text())
}
fn validate_fixture_template(template: &str, required: Vec<Value>) -> AxResult<()> {
let message = validate_prompt_template_syntax(&[
CoreValue::from(template),
CoreValue::from("template"),
core_value_from_json(&Value::Array(required)),
])?;
if message.is_null() {
Ok(())
} else {
Err(AxError::new("template", message.text()))
}
}
fn fold_fixture_stream(events: &[Value]) -> AxResult<String> {
let folded = fold_stream(&[core_value_from_json(&Value::Array(events.to_vec()))])?;
Ok(folded.text())
}
fn get_path<'a>(value: &'a Value, path: &str) -> Option<&'a Value> {
let mut current = value;
for part in path.split('.') {
current = current.get(part)?;
}
Some(current)
}
fn build_fixture_tools_recording(
fixture: &Value,
) -> AxResult<(Vec<Tool>, std::sync::Arc<std::sync::Mutex<Vec<Value>>>)> {
let calls = std::sync::Arc::new(std::sync::Mutex::new(Vec::new()));
let mut out = Vec::new();
for raw in fixture
.get("tools")
.and_then(Value::as_array)
.into_iter()
.flatten()
{
let name = raw.get("name").and_then(Value::as_str).unwrap_or("tool");
let description = raw
.get("description")
.and_then(Value::as_str)
.unwrap_or(name)
.to_string();
let result = raw.get("result").cloned().unwrap_or_else(|| json!({}));
let error = raw
.get("error")
.and_then(Value::as_str)
.map(ToString::to_string);
let mut builder = tool(name).description(description);
if let Some(args) = raw.get("args").and_then(Value::as_object) {
for (arg_name, arg_spec) in args {
builder = builder.arg(arg_name, field_from_spec(arg_name, arg_spec).field_type);
}
}
let tool_name = name.to_string();
let recorder = std::sync::Arc::clone(&calls);
let tool = builder.handler(move |args| {
recorder
.lock()
.unwrap()
.push(json!({"name": tool_name, "args": args}));
if let Some(error) = &error {
return Err(AxError::runtime(error.clone()));
}
Ok(result.clone())
});
out.push(tool);
}
Ok((out, calls))
}
struct FixtureClient {
responses: VecDeque<Value>,
transcribe_responses: VecDeque<Value>,
requests: Vec<Value>,
}
impl AxAIClient for FixtureClient {
fn transcribe(&mut self, request: Value) -> AxResult<Value> {
self.requests.push(request);
Ok(self
.transcribe_responses
.pop_front()
.unwrap_or_else(|| json!({"text": ""})))
}
fn chat(&mut self, request: Value) -> AxResult<Value> {
self.requests.push(request);
let response = self
.responses
.pop_front()
.ok_or_else(|| AxError::new("fixture", "fixture response exhausted"))?;
if response.get("results").is_some() {
return Ok(response);
}
Ok(json!({
"results": [{
"content": response.get("content").cloned().unwrap_or_else(|| json!("")),
"function_calls": normalize_fixture_function_calls(response.get("function_calls").or_else(|| response.get("tool_calls")).cloned().unwrap_or_else(|| json!([])))
}]
}))
}
}
fn normalize_fixture_function_calls(calls: Value) -> Value {
let mut out = Vec::new();
for call in calls.as_array().cloned().unwrap_or_default() {
if call.get("function").is_some() {
let function = call.get("function").cloned().unwrap_or_else(|| json!({}));
out.push(json!({
"id": call.get("id").cloned().unwrap_or_else(|| json!("")),
"name": function.get("name").cloned().unwrap_or_else(|| json!("")),
"params": function.get("params").or_else(|| function.get("arguments")).cloned().unwrap_or_else(|| json!({}))
}));
} else {
out.push(json!({
"id": call.get("id").cloned().unwrap_or(Value::Null),
"type": "function",
"function": {
"name": call.get("name").cloned().unwrap_or(Value::Null),
"params": call.get("params").cloned().unwrap_or(Value::Null)
}
}));
}
}
Value::Array(out)
}
struct RecordingTransport {
responses: VecDeque<Value>,
requests: Arc<Mutex<Vec<Value>>>,
}
impl RecordingTransport {
fn new(responses: Vec<Value>, requests: Arc<Mutex<Vec<Value>>>) -> Self {
Self {
responses: responses.into(),
requests,
}
}
}
impl AxTransport for RecordingTransport {
fn send(&mut self, request: Value) -> AxResult<Value> {
self.requests.lock().unwrap().push(request);
self.responses
.pop_front()
.ok_or_else(|| AxError::new("fixture", "fixture transport response exhausted"))
}
}
fn run_simple_forward_fixture(fixture: &Value) -> AxResult<()> {
let signature = build_fixture_signature(fixture)?;
let responses = fixture
.get("responses")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default();
let input = fixture.get("input").cloned().unwrap_or_else(|| json!({}));
let (fixture_tools, recorded_calls) = build_fixture_tools_recording(fixture)?;
let mut program = AxGen {
signature,
options: fixture.get("options").cloned().unwrap_or_else(|| json!({})),
function_call_traces: Vec::new(),
tools: fixture_tools,
assertions: fixture
.get("assertions")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default(),
examples: fixture
.get("examples")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default(),
demos: fixture
.get("demos")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default(),
field_processors: fixture
.get("field_processors")
.or_else(|| fixture.get("fieldProcessors"))
.and_then(Value::as_array)
.cloned()
.unwrap_or_default(),
stop_functions: fixture
.get("stop_functions")
.or_else(|| fixture.get("stopFunctions"))
.and_then(Value::as_array)
.map(|items| {
items
.iter()
.filter_map(Value::as_str)
.map(ToString::to_string)
.collect()
})
.unwrap_or_default(),
memory: Vec::new(),
traces: Vec::new(),
chat_log: Vec::new(),
};
let mut client = FixtureClient {
responses: responses.into(),
transcribe_responses: VecDeque::new(),
requests: Vec::new(),
};
let result = program.forward(&mut client, input);
if fixture.get("expected_error_contains").is_some() {
return expect_validation_result(result.map(|_| ()), fixture);
}
let output = result?;
if let Some(expected) = fixture.get("expected_output") {
expect_json_equal("forward output", &output, expected)?;
}
if let Some(expected) = fixture
.get("expected_request_count")
.and_then(Value::as_u64)
{
if client.requests.len() != expected as usize {
return Err(AxError::new(
"fixture",
format!(
"expected {expected} requests, got {}",
client.requests.len()
),
));
}
}
if let Some(expected) = fixture.get("expected_request") {
if let Some(actual) = client.requests.first() {
expect_json_subset("forward request", actual, expected)?;
}
}
if let Some(expected) = fixture
.get("expected_request_contains")
.and_then(Value::as_array)
{
let text = stable_stringify(&Value::Array(client.requests.clone()));
for needle in expected.iter().filter_map(Value::as_str) {
if !text.contains(needle) {
return Err(AxError::new(
"fixture",
format!("forward requests missing {needle:?}"),
));
}
}
}
if let Some(expected) = fixture
.get("expected_chat_prompt_contains")
.and_then(Value::as_array)
{
let prompts = client
.requests
.iter()
.map(|request| request.get("chat_prompt").cloned().unwrap_or(Value::Null))
.collect::<Vec<_>>();
let text = stable_stringify(&Value::Array(prompts));
for needle in expected.iter().filter_map(Value::as_str) {
if !text.contains(needle) {
return Err(AxError::new(
"fixture",
format!("chat prompt missing {needle:?}"),
));
}
}
}
if let Some(expected) = fixture
.get("expected_memory_history_count")
.and_then(Value::as_u64)
{
if program.memory.len() as u64 != expected {
return Err(AxError::new(
"fixture",
format!(
"expected memory history count {}, got {}",
expected,
program.memory.len()
),
));
}
}
if let Some(expected) = fixture
.get("expected_memory_history_subset")
.and_then(Value::as_array)
{
expect_json_list_subset(
"memory history",
&Value::Array(program.memory.clone()),
expected,
)?;
}
if let Some(expected) = fixture.get("expected_tool_calls").and_then(Value::as_array) {
let actual = Value::Array(recorded_calls.lock().unwrap().clone());
expect_json_list_exact_subsets("tool calls", &actual, expected)?;
}
if let Some(expected) = fixture
.get("expected_function_traces_subset")
.and_then(Value::as_array)
{
let actual = Value::Array(program.function_call_traces.clone());
expect_json_list_subset("function traces", &actual, expected)?;
}
Ok(())
}
fn run_ai_chat_fixture(fixture: &Value) -> AxResult<()> {
let (mut client, requests) = fixture_client(fixture)?;
let request = fixture.get("request").cloned().unwrap_or_else(|| json!({}));
let output = client.chat(request)?;
if let Some(expected) = fixture.get("expected_output") {
expect_json_equal("ai chat output", &output, expected)?;
}
expect_transport_request_subset(fixture, &requests)?;
Ok(())
}
fn run_ai_stream_fixture(fixture: &Value) -> AxResult<()> {
let (mut client, requests) = fixture_client(fixture)?;
let request = fixture.get("request").cloned().unwrap_or_else(|| json!({}));
let output = Value::Array(client.stream(request)?);
if let Some(expected) = fixture.get("expected_output") {
expect_json_equal("ai stream output", &output, expected)?;
}
expect_transport_request_subset(fixture, &requests)?;
Ok(())
}
fn run_ai_embed_fixture(fixture: &Value) -> AxResult<()> {
let (mut client, requests) = fixture_client(fixture)?;
let request = fixture.get("request").cloned().unwrap_or_else(|| json!({}));
let output = client.embed(request)?;
if let Some(expected) = fixture.get("expected_output") {
expect_json_equal("ai embed output", &output, expected)?;
}
expect_transport_request_subset(fixture, &requests)?;
Ok(())
}
fn run_ai_transcribe_fixture(fixture: &Value) -> AxResult<()> {
let (mut client, requests) = fixture_client(fixture)?;
let request = fixture.get("request").cloned().unwrap_or_else(|| json!({}));
let output = client.transcribe(request)?;
if let Some(expected) = fixture.get("expected_output") {
expect_json_equal("ai transcribe output", &output, expected)?;
}
expect_transport_request_subset(fixture, &requests)?;
Ok(())
}
fn run_ai_speak_fixture(fixture: &Value) -> AxResult<()> {
let (mut client, requests) = fixture_client(fixture)?;
let request = fixture.get("request").cloned().unwrap_or_else(|| json!({}));
let output = client.speak(request)?;
if let Some(expected) = fixture.get("expected_output") {
expect_json_equal("ai speak output", &output, expected)?;
}
expect_transport_request_subset(fixture, &requests)?;
Ok(())
}
fn run_ai_realtime_fixture(fixture: &Value) -> AxResult<()> {
let provider = fixture
.get("provider")
.and_then(Value::as_str)
.unwrap_or("openai-responses");
let mut options = json!({});
if let Some(model) = fixture.get("model") {
options["model"] = model.clone();
}
let client = ai(provider, options)?;
let result = run_ai_realtime_fixture_inner(&client, fixture);
if fixture.get("expected_error_contains").is_some() {
return expect_validation_result(result, fixture);
}
result
}
fn run_ai_realtime_fixture_inner(client: &OpenAICompatibleClient, fixture: &Value) -> AxResult<()> {
let request = fixture.get("request").cloned().unwrap_or_else(|| json!({}));
if let Some(expected) = fixture.get("expected_setup") {
expect_json_equal(
"ai realtime setup",
&client.realtime_audio_setup(request.clone())?,
expected,
)?;
}
if let Some(expected) = fixture.get("expected_input") {
expect_json_equal(
"ai realtime input",
&client.realtime_audio_input(request.clone())?,
expected,
)?;
}
let events = fixture.get("events").cloned().unwrap_or_else(|| json!([]));
let output = Value::Array(client.realtime_events(events)?);
if fixture.get("expected_error_contains").is_some() {
return Err(AxError::new(
"fixture",
"expected ai realtime fixture to fail",
));
}
if let Some(expected) = fixture.get("expected_output") {
expect_json_equal("ai realtime output", &output, expected)?;
}
Ok(())
}
fn fixture_client(fixture: &Value) -> AxResult<(OpenAICompatibleClient, Arc<Mutex<Vec<Value>>>)> {
let provider = fixture
.get("provider")
.and_then(Value::as_str)
.unwrap_or("openai");
let responses = fixture
.get("transport_responses")
.and_then(Value::as_array)
.cloned()
.unwrap_or_default();
let requests = Arc::new(Mutex::new(Vec::new()));
let transport = RecordingTransport::new(responses, Arc::clone(&requests));
let mut options = json!({});
if let Some(model) = fixture.get("model") {
options["model"] = model.clone();
}
if let Some(model) = fixture
.get("embed_model")
.or_else(|| fixture.get("embedModel"))
{
options["embed_model"] = model.clone();
}
if let Some(config) = fixture
.get("model_config")
.or_else(|| fixture.get("modelConfig"))
{
options["model_config"] = config.clone();
}
for key in [
"base_url",
"baseUrl",
"resource_name",
"resourceName",
"deployment_name",
"deploymentName",
"api_version",
"apiVersion",
"version",
] {
if let Some(value) = fixture.get(key) {
options[key] = value.clone();
}
}
let client = ai(provider, options)?
.with_transport(transport)
.with_options(fixture.get("options").cloned().unwrap_or_else(|| json!({})));
Ok((client, requests))
}
fn expect_transport_request_subset(
fixture: &Value,
requests: &Arc<Mutex<Vec<Value>>>,
) -> AxResult<()> {
let Some(expected) = fixture.get("expected_transport_request") else {
return Ok(());
};
let requests = requests.lock().unwrap();
let actual = requests
.first()
.ok_or_else(|| AxError::new("fixture", "fixture expected a transport request"))?;
expect_json_subset("transport request", actual, expected)
}
fn expect_json_equal(label: &str, actual: &Value, expected: &Value) -> AxResult<()> {
if actual != expected {
return Err(AxError::new(
"fixture",
format!(
"{label} expected {}, got {}",
stable_stringify(expected),
stable_stringify(actual)
),
));
}
Ok(())
}
fn expect_number_close(label: &str, actual: f64, expected: &Value) -> AxResult<()> {
let expected = expected
.as_f64()
.ok_or_else(|| AxError::new("fixture", format!("{label} expected value is not numeric")))?;
if (actual - expected).abs() <= 1e-9 {
return Ok(());
}
Err(AxError::new(
"fixture",
format!("{label} expected {expected}, got {actual}"),
))
}
fn expect_json_subset(label: &str, actual: &Value, expected: &Value) -> AxResult<()> {
if json_contains(actual, expected) {
return Ok(());
}
Err(AxError::new(
"fixture",
format!(
"{label} mismatch\nactual: {}\nexpected subset: {}",
stable_stringify(actual),
stable_stringify(expected)
),
))
}
fn expect_json_list_subset(label: &str, actual: &Value, expected_items: &[Value]) -> AxResult<()> {
let actual_items = actual
.as_array()
.ok_or_else(|| AxError::new("fixture", format!("{label} actual value is not an array")))?;
for expected in expected_items {
if !actual_items
.iter()
.any(|actual| json_contains(actual, expected))
{
return Err(AxError::new(
"fixture",
format!(
"{label} missing subset {}\nactual: {}",
stable_stringify(expected),
stable_stringify(actual)
),
));
}
}
Ok(())
}
fn expect_json_list_exact_subsets(
label: &str,
actual: &Value,
expected_items: &[Value],
) -> AxResult<()> {
let actual_items = actual
.as_array()
.ok_or_else(|| AxError::new("fixture", format!("{label} actual value is not an array")))?;
if actual_items.len() != expected_items.len() {
return Err(AxError::new(
"fixture",
format!(
"{label} expected {} items, got {}\nactual: {}",
expected_items.len(),
actual_items.len(),
stable_stringify(actual)
),
));
}
for (actual, expected) in actual_items.iter().zip(expected_items.iter()) {
if !json_contains(actual, expected) {
return Err(AxError::new(
"fixture",
format!(
"{label} mismatch\nactual: {}\nexpected subset: {}",
stable_stringify(actual),
stable_stringify(expected)
),
));
}
}
Ok(())
}
fn json_contains(actual: &Value, expected: &Value) -> bool {
match (actual, expected) {
(Value::Object(actual), Value::Object(expected)) => expected.iter().all(|(key, value)| {
actual
.get(key)
.map(|actual| json_contains(actual, value))
.unwrap_or(false)
}),
(Value::Array(actual), Value::Array(expected)) => {
actual.len() >= expected.len()
&& expected.iter().enumerate().all(|(index, value)| {
actual
.get(index)
.map(|actual| json_contains(actual, value))
.unwrap_or(false)
})
}
(Value::Number(actual), Value::Number(expected)) => {
match (actual.as_f64(), expected.as_f64()) {
(Some(actual), Some(expected)) => (actual - expected).abs() <= 1e-9,
_ => actual == expected,
}
}
_ => actual == expected,
}
}
fn merge_object(target: &mut Value, source: &Value) {
if let (Some(target), Some(source)) = (target.as_object_mut(), source.as_object()) {
for (key, value) in source {
target.insert(key.clone(), value.clone());
}
}
}
fn string_at(value: &Value, key: &str) -> Option<String> {
value
.get(key)
.and_then(Value::as_str)
.map(ToString::to_string)
}
// Percent-encode every byte outside the RFC 3986 unreserved set, matching
// python's urllib.parse.quote(value, safe="").
fn url_component_escape(value: &str) -> String {
let mut out = String::with_capacity(value.len());
for byte in value.bytes() {
match byte {
b'A'..=b'Z' | b'a'..=b'z' | b'0'..=b'9' | b'-' | b'_' | b'.' | b'~' => {
out.push(byte as char)
}
other => out.push_str(&format!("%{other:02X}")),
}
}
out
}
// ----- AXIR CORE VALUE RUNTIME -----
fn axir_coverage_mark(name: &'static str) {
use std::io::Write;
use std::sync::{Mutex, OnceLock};
type CoverageState = Option<(String, Mutex<std::collections::HashSet<&'static str>>)>;
static STATE: OnceLock<CoverageState> = OnceLock::new();
let state = STATE.get_or_init(|| {
std::env::var("AXIR_COVERAGE_FILE")
.ok()
.map(|path| (path, Mutex::new(std::collections::HashSet::new())))
});
let Some((path, seen)) = state.as_ref() else {
return;
};
if !seen.lock().map(|mut set| set.insert(name)).unwrap_or(false) {
return;
}
if let Ok(mut file) = std::fs::OpenOptions::new()
.append(true)
.create(true)
.open(path)
{
let _ = writeln!(file, "{name}");
}
}
// Dynamic value model for IR-emitted Core functions. Lists and maps are
// reference-shared (Rc<RefCell<...>>) so child values obtained via core_get
// alias their parent, matching the Go and Python runtimes. Single-threaded
// by design, like the blocking HTTP scaffold.
use std::cell::RefCell;
use std::rc::Rc;
#[derive(Clone, Debug)]
pub(crate) enum CoreValue {
Null,
Bool(bool),
Num(f64),
Str(Rc<String>),
List(Rc<RefCell<Vec<CoreValue>>>),
Map(Rc<RefCell<CoreMap>>),
Error(Rc<AxError>),
Host(Rc<dyn CoreHost>),
}
#[derive(Clone, Debug, Default)]
pub(crate) struct CoreMap {
entries: Vec<(String, CoreValue)>,
}
impl CoreMap {
fn get(&self, key: &str) -> Option<CoreValue> {
self.entries
.iter()
.find(|(k, _)| k == key)
.map(|(_, v)| v.clone())
}
fn set(&mut self, key: &str, value: CoreValue) {
for entry in self.entries.iter_mut() {
if entry.0 == key {
entry.1 = value;
return;
}
}
self.entries.push((key.to_string(), value));
}
fn contains(&self, key: &str) -> bool {
self.entries.iter().any(|(k, _)| k == key)
}
fn len(&self) -> usize {
self.entries.len()
}
}
#[derive(Debug)]
pub(crate) enum CoreFlow {
Normal,
Break,
Continue,
Return(CoreValue),
}
impl CoreValue {
pub(crate) fn from(text: &str) -> CoreValue {
CoreValue::Str(Rc::new(text.to_string()))
}
fn from_string(text: String) -> CoreValue {
CoreValue::Str(Rc::new(text))
}
fn new_map() -> CoreValue {
CoreValue::Map(Rc::new(RefCell::new(CoreMap::default())))
}
fn new_list() -> CoreValue {
CoreValue::List(Rc::new(RefCell::new(Vec::new())))
}
fn list_from(items: Vec<CoreValue>) -> CoreValue {
CoreValue::List(Rc::new(RefCell::new(items)))
}
fn as_str(&self) -> Option<&str> {
match self {
CoreValue::Str(s) => Some(s.as_str()),
_ => None,
}
}
fn is_null(&self) -> bool {
matches!(self, CoreValue::Null)
}
fn text(&self) -> String {
match self {
CoreValue::Str(s) => s.as_str().to_string(),
CoreValue::Null => "None".to_string(),
CoreValue::Bool(b) => {
if *b {
"True".to_string()
} else {
"False".to_string()
}
}
CoreValue::Num(n) => trim_num(*n),
CoreValue::Error(e) => e.message.clone(),
CoreValue::Host(host) => host.host_type().to_string(),
other => core_value_to_json(other).to_string(),
}
}
}
impl PartialEq for CoreValue {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(CoreValue::Null, CoreValue::Null) => true,
(CoreValue::Bool(a), CoreValue::Bool(b)) => a == b,
(CoreValue::Num(a), CoreValue::Num(b)) => a == b,
(CoreValue::Str(a), CoreValue::Str(b)) => a == b,
(CoreValue::List(a), CoreValue::List(b)) => *a.borrow() == *b.borrow(),
(CoreValue::Map(a), CoreValue::Map(b)) => {
let a = a.borrow();
let b = b.borrow();
a.len() == b.len()
&& a.entries
.iter()
.all(|(k, v)| b.get(k).map_or(false, |bv| *v == bv))
}
(CoreValue::Error(a), CoreValue::Error(b)) => a == b,
(CoreValue::Host(a), CoreValue::Host(b)) => Rc::ptr_eq(a, b),
_ => false,
}
}
}
fn core_arg(args: &[CoreValue], index: usize) -> CoreValue {
args.get(index).cloned().unwrap_or(CoreValue::Null)
}
pub(crate) fn core_value_from_json(value: &Value) -> CoreValue {
match value {
Value::Null => CoreValue::Null,
Value::Bool(b) => CoreValue::Bool(*b),
Value::Number(n) => CoreValue::Num(n.as_f64().unwrap_or(0.0)),
Value::String(s) => CoreValue::from(s),
Value::Array(items) => {
CoreValue::list_from(items.iter().map(core_value_from_json).collect())
}
Value::Object(map) => {
let mut out = CoreMap::default();
for (k, v) in map {
out.set(k, core_value_from_json(v));
}
CoreValue::Map(Rc::new(RefCell::new(out)))
}
}
}
pub(crate) fn core_value_to_json(value: &CoreValue) -> Value {
match value {
CoreValue::Null => Value::Null,
CoreValue::Bool(b) => Value::Bool(*b),
CoreValue::Num(n) => json_number(*n),
CoreValue::Str(s) => Value::String(s.as_str().to_string()),
CoreValue::List(items) => {
Value::Array(items.borrow().iter().map(core_value_to_json).collect())
}
CoreValue::Map(map) => {
let map = map.borrow();
if let Some(kind) = map
.get("__record")
.and_then(|v| v.as_str().map(str::to_string))
{
return core_record_to_json(&kind, &map);
}
let mut out = Map::new();
for (k, v) in &map.entries {
out.insert(k.clone(), core_value_to_json(v));
}
Value::Object(out)
}
CoreValue::Host(_) => Value::Null,
CoreValue::Error(e) => json!({
"category": e.category,
"message": e.message,
}),
}
}
// core_record_to_json renders intrinsic.record.new records into the JSON
// spec shape the typed-struct bridges (field_from_spec / signature_from_spec)
// consume, mirroring the payload the other targets produce.
fn core_record_to_json(kind: &str, map: &CoreMap) -> Value {
let field = |name: &str| {
map.get(name)
.map(|v| core_value_to_json(&v))
.unwrap_or(Value::Null)
};
match kind {
"FieldType" => {
let mut out = Map::new();
out.insert("name".to_string(), field("name"));
out.insert("isArray".to_string(), field("is_array"));
if !matches!(field("options"), Value::Null) {
out.insert("options".to_string(), field("options"));
}
if !matches!(field("fields"), Value::Null) {
out.insert("fields".to_string(), field("fields"));
}
Value::Object(out)
}
"Field" => {
let mut out = Map::new();
out.insert("name".to_string(), field("name"));
out.insert("type".to_string(), field("type"));
for (json_key, map_key) in [("description", "description"), ("title", "title")] {
if !matches!(field(map_key), Value::Null) {
out.insert(json_key.to_string(), field(map_key));
}
}
out.insert("isOptional".to_string(), field("is_optional"));
out.insert("isInternal".to_string(), field("is_internal"));
out.insert("isCached".to_string(), field("is_cached"));
Value::Object(out)
}
"AxSignature" => {
let mut out = Map::new();
if !matches!(field("description"), Value::Null) {
out.insert("description".to_string(), field("description"));
}
out.insert("inputs".to_string(), field("input_fields"));
out.insert("outputs".to_string(), field("output_fields"));
Value::Object(out)
}
_ => {
let mut out = Map::new();
for (k, v) in &map.entries {
if k != "__record" {
out.insert(k.clone(), core_value_to_json(v));
}
}
Value::Object(out)
}
}
}
fn core_truthy(value: &CoreValue) -> bool {
match value {
CoreValue::Null => false,
CoreValue::Bool(b) => *b,
CoreValue::Num(n) => *n != 0.0,
CoreValue::Str(s) => !s.is_empty(),
CoreValue::List(items) => !items.borrow().is_empty(),
CoreValue::Map(map) => map.borrow().len() > 0,
CoreValue::Error(_) => true,
CoreValue::Host(_) => true,
}
}
fn core_truthy_value(args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::Bool(core_truthy(&core_arg(args, 0))))
}
fn core_as_error(value: &CoreValue) -> AxError {
match value {
CoreValue::Error(e) => (**e).clone(),
other => AxError::runtime(other.text()),
}
}
fn core_get(target: &CoreValue, key: &CoreValue, default: CoreValue) -> CoreValue {
match (target, key) {
(CoreValue::Map(map), CoreValue::Str(key)) => {
map.borrow().get(key.as_str()).unwrap_or(default)
}
// python dicts accept numeric keys; CoreMap normalizes them to text
(CoreValue::Map(map), CoreValue::Num(_)) => {
map.borrow().get(&key.text()).unwrap_or(default)
}
// hosts expose python attribute reads as zero-arg methods
(CoreValue::Host(host), CoreValue::Str(name)) => {
match host.call_method(name.as_str(), &[]) {
Ok(value) => value,
Err(_) => default,
}
}
(CoreValue::List(items), CoreValue::Num(index)) => {
let items = items.borrow();
let index = *index as i64;
if index >= 0 && (index as usize) < items.len() {
items[index as usize].clone()
} else {
default
}
}
_ => default,
}
}
fn core_set(target: &CoreValue, key: CoreValue, value: CoreValue) -> Result<CoreValue, AxError> {
match (target, &key) {
(CoreValue::Map(map), CoreValue::Str(key)) => {
map.borrow_mut().set(key.as_str(), value);
Ok(CoreValue::Null)
}
(CoreValue::Map(map), CoreValue::Num(_)) => {
map.borrow_mut().set(&key.text(), value);
Ok(CoreValue::Null)
}
(CoreValue::List(items), CoreValue::Num(index)) => {
let mut items = items.borrow_mut();
let index = *index as usize;
if index < items.len() {
items[index] = value;
}
Ok(CoreValue::Null)
}
_ => Err(AxError::runtime("core.set target is not a map or list")),
}
}
fn core_append(target: &CoreValue, value: CoreValue) -> Result<CoreValue, AxError> {
match target {
CoreValue::List(items) => {
items.borrow_mut().push(value);
Ok(CoreValue::Null)
}
_ => Err(AxError::runtime("core.append target is not a list")),
}
}
fn core_iter(value: &CoreValue) -> Result<Vec<CoreValue>, AxError> {
match value {
CoreValue::List(items) => Ok(items.borrow().clone()),
CoreValue::Map(map) => Ok(map
.borrow()
.entries
.iter()
.map(|(k, _)| CoreValue::from(k))
.collect()),
CoreValue::Null => Ok(Vec::new()),
_ => Err(AxError::runtime("core.for target is not iterable")),
}
}
fn core_string_trim(value: &CoreValue) -> CoreValue {
CoreValue::from_string(value.text().trim().to_string())
}
fn core_string_join(sep: &CoreValue, values: &CoreValue) -> Result<CoreValue, AxError> {
let sep = sep.text();
match values {
CoreValue::List(items) => Ok(CoreValue::from_string(
items
.borrow()
.iter()
.map(|item| item.text())
.collect::<Vec<_>>()
.join(&sep),
)),
_ => Err(AxError::runtime("core.string_join value is not a list")),
}
}
fn core_type_is(value: &CoreValue, type_name: CoreValue) -> CoreValue {
let name = type_name.text();
let matched = match name.as_str() {
"object" => matches!(value, CoreValue::Map(_)),
"list" => matches!(value, CoreValue::List(_)),
"string" => matches!(value, CoreValue::Str(_)),
"number" => matches!(value, CoreValue::Num(_)),
"boolean" => matches!(value, CoreValue::Bool(_)),
"null" => value.is_null(),
"json" => !matches!(value, CoreValue::Error(_)),
_ => false,
};
CoreValue::Bool(matched)
}
fn core_regex_match(pattern: CoreValue, value: &CoreValue) -> Result<CoreValue, AxError> {
let text = match value.as_str() {
Some(text) => text,
None => return Ok(CoreValue::Bool(false)),
};
let compiled = regex::Regex::new(&pattern.text())
.map_err(|err| AxError::runtime(format!("invalid regex pattern: {err}")))?;
Ok(CoreValue::Bool(compiled.is_match(text)))
}
fn core_not(args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::Bool(!core_truthy(&core_arg(args, 0))))
}
fn core_and(args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::Bool(
core_truthy(&core_arg(args, 0)) && core_truthy(&core_arg(args, 1)),
))
}
fn core_or(args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::Bool(
core_truthy(&core_arg(args, 0)) || core_truthy(&core_arg(args, 1)),
))
}
fn core_eq(args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::Bool(core_arg(args, 0) == core_arg(args, 1)))
}
fn core_ne(args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::Bool(core_arg(args, 0) != core_arg(args, 1)))
}
fn core_number_pair(args: &[CoreValue]) -> Result<(f64, f64), AxError> {
match (core_arg(args, 0), core_arg(args, 1)) {
(CoreValue::Num(a), CoreValue::Num(b)) => Ok((a, b)),
_ => Err(AxError::runtime("expected numeric operands")),
}
}
fn core_lt(args: &[CoreValue]) -> Result<CoreValue, AxError> {
match (core_arg(args, 0), core_arg(args, 1)) {
(CoreValue::Str(a), CoreValue::Str(b)) => Ok(CoreValue::Bool(a < b)),
_ => core_number_pair(args).map(|(a, b)| CoreValue::Bool(a < b)),
}
}
fn core_lte(args: &[CoreValue]) -> Result<CoreValue, AxError> {
core_number_pair(args).map(|(a, b)| CoreValue::Bool(a <= b))
}
fn core_gt(args: &[CoreValue]) -> Result<CoreValue, AxError> {
match (core_arg(args, 0), core_arg(args, 1)) {
(CoreValue::Str(a), CoreValue::Str(b)) => Ok(CoreValue::Bool(a > b)),
_ => core_number_pair(args).map(|(a, b)| CoreValue::Bool(a > b)),
}
}
fn core_gte(args: &[CoreValue]) -> Result<CoreValue, AxError> {
core_number_pair(args).map(|(a, b)| CoreValue::Bool(a >= b))
}
fn core_add(args: &[CoreValue]) -> Result<CoreValue, AxError> {
match (core_arg(args, 0), core_arg(args, 1)) {
(CoreValue::Num(a), CoreValue::Num(b)) => Ok(CoreValue::Num(a + b)),
(CoreValue::Str(a), CoreValue::Str(b)) => Ok(CoreValue::from_string(format!("{}{}", a, b))),
_ => Err(AxError::runtime("unsupported operands for intrinsic.add")),
}
}
fn core_len(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let len = match core_arg(args, 0) {
CoreValue::Str(s) => s.chars().count(),
CoreValue::List(items) => items.borrow().len(),
CoreValue::Map(map) => map.borrow().len(),
_ => return Err(AxError::runtime("intrinsic.len target has no length")),
};
Ok(CoreValue::Num(len as f64))
}
fn core_is_none(args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::Bool(core_arg(args, 0).is_null()))
}
fn core_is_not_none(args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::Bool(!core_arg(args, 0).is_null()))
}
fn core_none(_args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::Null)
}
fn core_coalesce(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let value = core_arg(args, 0);
if value.is_null() {
Ok(core_arg(args, 1))
} else {
Ok(value)
}
}
fn core_contains(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let container = core_arg(args, 0);
let item = core_arg(args, 1);
let contains = match &container {
CoreValue::Null => false,
CoreValue::Str(s) => s.contains(&item.text()),
CoreValue::List(items) => items.borrow().iter().any(|entry| *entry == item),
CoreValue::Map(map) => map.borrow().contains(&item.text()),
_ => false,
};
Ok(CoreValue::Bool(contains))
}
fn core_list_get(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let values = core_arg(args, 0);
let index = core_arg(args, 1);
let default = core_arg(args, 2);
Ok(core_get(&values, &index, default))
}
fn core_record_new(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let kind = core_arg(args, 0).text();
let values = core_arg(args, 1);
let read = |snake: &str, camel: &str| -> CoreValue {
let direct = core_get(&values, &CoreValue::from(snake), CoreValue::Null);
if direct.is_null() {
core_get(&values, &CoreValue::from(camel), CoreValue::Null)
} else {
direct
}
};
let mut out = CoreMap::default();
out.set("__record", CoreValue::from(kind.as_str()));
match kind.as_str() {
"FieldType" => {
let name = read("name", "name");
out.set(
"name",
if name.is_null() {
CoreValue::from("string")
} else {
name
},
);
out.set(
"is_array",
CoreValue::Bool(core_truthy(&read("is_array", "isArray"))),
);
out.set("options", read("options", "options"));
out.set("fields", read("fields", "fields"));
}
"Field" => {
out.set("name", read("name", "name"));
let field_type = read("type", "type");
out.set(
"type",
if field_type.is_null() {
core_record_new(&[CoreValue::from("FieldType"), CoreValue::new_map()])?
} else {
field_type
},
);
out.set("description", read("description", "description"));
let title = read("title", "title");
out.set(
"title",
if title.is_null() {
CoreValue::from_string(title_case(&read("name", "name").text()))
} else {
title
},
);
out.set(
"is_optional",
CoreValue::Bool(core_truthy(&read("is_optional", "isOptional"))),
);
out.set(
"is_internal",
CoreValue::Bool(core_truthy(&read("is_internal", "isInternal"))),
);
out.set(
"is_cached",
CoreValue::Bool(core_truthy(&read("is_cached", "isCached"))),
);
}
"AxSignature" => {
// The constructor accepts inputs/outputs; the record exposes the
// python instance-attribute names that IR code reads.
let inputs = read("input_fields", "inputs");
let outputs = read("output_fields", "outputs");
out.set(
"input_fields",
if inputs.is_null() {
CoreValue::new_list()
} else {
inputs
},
);
out.set(
"output_fields",
if outputs.is_null() {
CoreValue::new_list()
} else {
outputs
},
);
out.set("description", read("description", "description"));
}
other => {
return Err(AxError::new(
"signature",
format!("Unknown record type: {other}"),
))
}
}
Ok(CoreValue::Map(Rc::new(RefCell::new(out))))
}
fn core_fields_from_map(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let fields = core_arg(args, 0);
let out = CoreValue::new_list();
if let CoreValue::Map(map) = &fields {
for (name, item) in map.borrow().entries.clone() {
// In-IR records carry the __record tag; values that crossed a
// JSON boundary lose it, so a map with a "type" key is already a
// Field payload (FieldType payloads have no "type" key).
let is_field_record = matches!(
core_get(&item, &CoreValue::from("__record"), CoreValue::Null).as_str(),
Some("Field")
) || !core_get(&item, &CoreValue::from("type"), CoreValue::Null)
.is_null();
if is_field_record {
core_append(&out, item)?;
} else {
let values = CoreValue::new_map();
core_set(
&values,
CoreValue::from("name"),
CoreValue::from(name.as_str()),
)?;
core_set(&values, CoreValue::from("type"), item)?;
core_append(&out, core_record_new(&[CoreValue::from("Field"), values])?)?;
}
}
}
Ok(out)
}
fn core_signature_error(args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::Error(Rc::new(AxError::new(
"signature",
core_arg(args, 0).text(),
))))
}
fn core_runtime_error(args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::Error(Rc::new(AxError::runtime(
core_arg(args, 0).text(),
))))
}
fn core_validation_error(args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::Error(Rc::new(AxError::validation(
core_arg(args, 0).text(),
))))
}
fn core_string_format(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let template = core_arg(args, 0).text();
let mut out = String::new();
let mut rest = template.as_str();
let mut index = 1;
while let Some(pos) = rest.find("{}") {
out.push_str(&rest[..pos]);
out.push_str(&core_arg(args, index).text());
index += 1;
rest = &rest[pos + 2..];
}
out.push_str(rest);
Ok(CoreValue::from_string(out))
}
fn core_string_replace(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let value = core_arg(args, 0).text();
let old = core_arg(args, 1).text();
let new = core_arg(args, 2).text();
Ok(CoreValue::from_string(value.replace(&old, &new)))
}
fn core_string_slice(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let chars: Vec<char> = core_arg(args, 0).text().chars().collect();
let len = chars.len() as i64;
let clamp = |raw: i64| -> usize {
let adjusted = if raw < 0 { raw + len } else { raw };
adjusted.clamp(0, len) as usize
};
let start = match core_arg(args, 1) {
CoreValue::Num(n) => clamp(n as i64),
_ => 0,
};
let end = match core_arg(args, 2) {
CoreValue::Num(n) => clamp(n as i64),
_ => len as usize,
};
if start >= end {
return Ok(CoreValue::from(""));
}
Ok(CoreValue::from_string(chars[start..end].iter().collect()))
}
fn core_string_default_if_empty(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let text = core_arg(args, 0).text();
let trimmed = text.trim();
if trimmed.is_empty() {
Ok(core_arg(args, 1))
} else {
Ok(CoreValue::from_string(trimmed.to_string()))
}
}
fn core_string_words(args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::list_from(
core_arg(args, 0)
.text()
.split_whitespace()
.map(CoreValue::from)
.collect(),
))
}
fn core_string_split_trim_nonempty(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let value = core_arg(args, 0).text();
let sep = core_arg(args, 1).text();
Ok(CoreValue::list_from(
value
.split(sep.as_str())
.map(str::trim)
.filter(|part| !part.is_empty())
.map(CoreValue::from)
.collect(),
))
}
fn core_string_split_outside_quotes(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let text = core_arg(args, 0).text();
let sep = core_arg(args, 1).text().chars().next().unwrap_or(',');
let mut items: Vec<CoreValue> = Vec::new();
let mut current = String::new();
let mut quote: Option<char> = None;
let mut escaped = false;
for ch in text.chars() {
if escaped {
current.push(ch);
escaped = false;
continue;
}
if ch == '\\' {
current.push(ch);
escaped = true;
continue;
}
if let Some(active) = quote {
current.push(ch);
if ch == active {
quote = None;
}
continue;
}
if ch == '\'' || ch == '"' {
current.push(ch);
quote = Some(ch);
continue;
}
if ch == sep {
let item = current.trim().to_string();
if !item.is_empty() {
items.push(CoreValue::from_string(item));
}
current = String::new();
continue;
}
current.push(ch);
}
if quote.is_some() {
return Err(AxError::new("signature", "Unterminated string"));
}
let item = current.trim().to_string();
if !item.is_empty() {
items.push(CoreValue::from_string(item));
}
Ok(CoreValue::list_from(items))
}
fn core_string_split_once(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let text = core_arg(args, 0).text();
let sep = core_arg(args, 1).text();
let out = CoreValue::new_map();
match text.split_once(sep.as_str()) {
Some((left, right)) => {
core_set(&out, CoreValue::from("left"), CoreValue::from(left))?;
core_set(&out, CoreValue::from("right"), CoreValue::from(right))?;
core_set(&out, CoreValue::from("found"), CoreValue::Bool(true))?;
}
None => {
core_set(&out, CoreValue::from("left"), CoreValue::from_string(text))?;
core_set(&out, CoreValue::from("right"), CoreValue::from(""))?;
core_set(&out, CoreValue::from("found"), CoreValue::Bool(false))?;
}
}
Ok(out)
}
fn core_string_remove_suffix(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let text = core_arg(args, 0).text();
let suffix = core_arg(args, 1).text();
let out = CoreValue::new_map();
if !suffix.is_empty() && text.ends_with(suffix.as_str()) {
let trimmed = text[..text.len() - suffix.len()].to_string();
core_set(
&out,
CoreValue::from("value"),
CoreValue::from_string(trimmed),
)?;
core_set(&out, CoreValue::from("removed"), CoreValue::Bool(true))?;
} else {
core_set(&out, CoreValue::from("value"), CoreValue::from_string(text))?;
core_set(&out, CoreValue::from("removed"), CoreValue::Bool(false))?;
}
Ok(out)
}
fn core_string_find_outside_quotes(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let text = core_arg(args, 0).text();
let needle = core_arg(args, 1).text();
let chars: Vec<char> = text.chars().collect();
let mut quote: Option<char> = None;
let mut escaped = false;
for (i, ch) in chars.iter().enumerate() {
if escaped {
escaped = false;
continue;
}
if *ch == '\\' {
escaped = true;
continue;
}
if let Some(active) = quote {
if *ch == active {
quote = None;
}
continue;
}
if *ch == '\'' || *ch == '"' {
quote = Some(*ch);
continue;
}
let rest: String = chars[i..].iter().collect();
if rest.starts_with(needle.as_str()) {
return Ok(CoreValue::Num(i as f64));
}
}
if quote.is_some() {
return Err(AxError::new("signature", "Unterminated string"));
}
Ok(CoreValue::Num(-1.0))
}
fn core_consume_quoted_prefix(text: &str) -> Result<(Option<String>, String, bool), AxError> {
let chars: Vec<char> = text.chars().collect();
let first = chars.first().copied();
if first != Some('\'') && first != Some('"') {
return Ok((None, text.to_string(), false));
}
let quote = first.unwrap();
let mut escaped = false;
let mut out = String::new();
for (i, ch) in chars.iter().enumerate().skip(1) {
if escaped {
out.push(*ch);
escaped = false;
} else if *ch == '\\' {
escaped = true;
} else if *ch == quote {
let rest: String = chars[i + 1..].iter().collect();
return Ok((Some(out), rest, true));
} else {
out.push(*ch);
}
}
Err(AxError::new("signature", "Unterminated string"))
}
fn quoted_prefix_result(
value: Option<String>,
rest: String,
found: bool,
) -> Result<CoreValue, AxError> {
let out = CoreValue::new_map();
core_set(
&out,
CoreValue::from("value"),
match value {
Some(text) => CoreValue::from_string(text),
None => CoreValue::Null,
},
)?;
core_set(&out, CoreValue::from("rest"), CoreValue::from_string(rest))?;
core_set(&out, CoreValue::from("found"), CoreValue::Bool(found))?;
Ok(out)
}
fn core_string_consume_optional_quoted_prefix(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let text = core_arg(args, 0).text();
let (value, rest, found) = core_consume_quoted_prefix(&text)?;
quoted_prefix_result(value, rest, found)
}
fn core_string_extract_quoted_suffix(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let text = core_arg(args, 0).text();
let chars: Vec<char> = text.chars().collect();
let mut escaped = false;
for (i, ch) in chars.iter().enumerate() {
if escaped {
escaped = false;
continue;
}
if *ch == '\\' {
escaped = true;
continue;
}
if *ch == '\'' || *ch == '"' {
let tail: String = chars[i..].iter().collect();
let (value, rest, _) = core_consume_quoted_prefix(&tail)?;
let head: String = chars[..i].iter().collect();
let out = quoted_prefix_result(value, rest, true)?;
core_set(&out, CoreValue::from("index"), CoreValue::Num(i as f64))?;
core_set(&out, CoreValue::from("head"), CoreValue::from_string(head))?;
return Ok(out);
}
}
let out = quoted_prefix_result(None, String::new(), false)?;
core_set(&out, CoreValue::from("index"), CoreValue::Null)?;
core_set(&out, CoreValue::from("head"), CoreValue::from_string(text))?;
Ok(out)
}
fn core_description_append(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let base = core_arg(args, 0);
let hint = core_arg(args, 1);
let hint_text = hint.text();
if hint.is_null() || hint_text.trim().is_empty() {
return Ok(base);
}
let base_text = base.text();
if base.is_null() || base_text.trim().is_empty() {
return Ok(CoreValue::from_string(hint_text));
}
let mut text = base_text.trim().to_string();
if !text.ends_with('.') {
text.push('.');
}
Ok(CoreValue::from_string(format!("{text} {hint_text}")))
}
fn core_deep_clone(value: &CoreValue) -> CoreValue {
match value {
CoreValue::List(items) => {
CoreValue::list_from(items.borrow().iter().map(core_deep_clone).collect())
}
CoreValue::Map(map) => {
let mut out = CoreMap::default();
for (k, v) in &map.borrow().entries {
out.set(k, core_deep_clone(v));
}
CoreValue::Map(Rc::new(RefCell::new(out)))
}
other => other.clone(),
}
}
fn core_field_item(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let field = core_arg(args, 0);
let item_type = core_deep_clone(&core_get(&field, &CoreValue::from("type"), CoreValue::Null));
core_set(
&item_type,
CoreValue::from("is_array"),
CoreValue::Bool(false),
)?;
let values = CoreValue::new_map();
core_set(
&values,
CoreValue::from("name"),
core_get(&field, &CoreValue::from("name"), CoreValue::Null),
)?;
core_set(&values, CoreValue::from("type"), item_type)?;
core_set(
&values,
CoreValue::from("description"),
core_get(&field, &CoreValue::from("description"), CoreValue::Null),
)?;
core_record_new(&[CoreValue::from("Field"), values])
}
fn core_map_contains(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let values = core_arg(args, 0);
let key = core_arg(args, 1).text();
Ok(CoreValue::Bool(
matches!(&values, CoreValue::Map(m) if m.borrow().contains(&key)),
))
}
fn core_map_get(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let values = core_arg(args, 0);
let key = core_arg(args, 1);
let result = core_get(&values, &key, CoreValue::Null);
if result.is_null() && !matches!(&values, CoreValue::Map(m) if m.borrow().contains(&key.text()))
{
return Err(AxError::runtime(format!("missing key {}", key.text())));
}
Ok(result)
}
fn core_map_update(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let target = core_arg(args, 0);
let values = core_arg(args, 1);
if let (CoreValue::Map(dst), CoreValue::Map(src)) = (&target, &values) {
for (k, v) in src.borrow().entries.clone() {
dst.borrow_mut().set(&k, v);
}
}
Ok(target)
}
fn core_media_valid_image(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let v = core_arg(args, 0);
Ok(CoreValue::Bool(
matches!(&v, CoreValue::Map(m) if m.borrow().contains("mimeType") && m.borrow().contains("data")),
))
}
fn core_media_valid_audio(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let v = core_arg(args, 0);
let ok = v.as_str().is_some()
|| matches!(&v, CoreValue::Map(m) if m.borrow().contains("data") || m.borrow().contains("id"));
Ok(CoreValue::Bool(ok))
}
fn core_media_valid_file(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let v = core_arg(args, 0);
let ok = matches!(&v, CoreValue::Map(m) if m.borrow().contains("mimeType")
&& (m.borrow().contains("data") != m.borrow().contains("fileUri")));
Ok(CoreValue::Bool(ok))
}
fn core_media_valid_url_shape(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let v = core_arg(args, 0);
let ok = v.as_str().is_some() || matches!(&v, CoreValue::Map(m) if m.borrow().contains("url"));
Ok(CoreValue::Bool(ok))
}
fn core_url_valid(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let ok = match core_arg(args, 0).as_str() {
Some(text) => regex::Regex::new("^[a-zA-Z][a-zA-Z0-9+.-]*://")
.unwrap()
.is_match(text),
None => false,
};
Ok(CoreValue::Bool(ok))
}
fn core_field_type_value(ft: &FieldType) -> Result<CoreValue, AxError> {
let values = CoreValue::new_map();
core_set(
&values,
CoreValue::from("name"),
CoreValue::from(ft.name.as_str()),
)?;
core_set(
&values,
CoreValue::from("is_array"),
CoreValue::Bool(ft.is_array),
)?;
if let Some(options) = &ft.options {
core_set(
&values,
CoreValue::from("options"),
CoreValue::list_from(
options
.iter()
.map(|o| CoreValue::from(o.as_str()))
.collect(),
),
)?;
}
if let Some(fields) = &ft.fields {
// nested spec values are raw JSON; convert them to Field records the
// way the python runtime stores parsed nested fields
let nested = CoreValue::new_map();
for (name, raw) in fields {
let nested_field = field_from_payload(name, raw);
core_set(
&nested,
CoreValue::from(name.as_str()),
core_field_value(&nested_field)?,
)?;
}
core_set(&values, CoreValue::from("fields"), nested)?;
}
let record = core_record_new(&[CoreValue::from("FieldType"), values])?;
for (key, val) in [
("min_length", ft.min_length),
("max_length", ft.max_length),
("minimum", ft.minimum),
("maximum", ft.maximum),
] {
if let Some(number) = val {
core_set(&record, CoreValue::from(key), CoreValue::Num(number))?;
}
}
for (key, val) in [
("pattern", ft.pattern.as_deref()),
("pattern_description", ft.pattern_description.as_deref()),
("format", ft.format.as_deref()),
("description", ft.description.as_deref()),
] {
if let Some(text) = val {
core_set(&record, CoreValue::from(key), CoreValue::from(text))?;
}
}
Ok(record)
}
fn core_field_value(field: &Field) -> Result<CoreValue, AxError> {
let values = CoreValue::new_map();
core_set(
&values,
CoreValue::from("name"),
CoreValue::from(field.name.as_str()),
)?;
core_set(
&values,
CoreValue::from("type"),
core_field_type_value(&field.field_type)?,
)?;
if let Some(text) = field.description.as_deref() {
core_set(
&values,
CoreValue::from("description"),
CoreValue::from(text),
)?;
}
if !field.title.is_empty() {
core_set(
&values,
CoreValue::from("title"),
CoreValue::from(field.title.as_str()),
)?;
}
core_set(
&values,
CoreValue::from("is_optional"),
CoreValue::Bool(field.is_optional),
)?;
core_set(
&values,
CoreValue::from("is_internal"),
CoreValue::Bool(field.is_internal),
)?;
core_set(
&values,
CoreValue::from("is_cached"),
CoreValue::Bool(field.is_cached),
)?;
core_record_new(&[CoreValue::from("Field"), values])
}
fn core_fields_value(fields: &[Field]) -> Result<CoreValue, AxError> {
let out = CoreValue::new_list();
for field in fields {
core_append(&out, core_field_value(field)?)?;
}
Ok(out)
}
fn validate_fields_native(fields: &[Field], values: &Value) -> AxResult<()> {
validate_fields(&[core_fields_value(fields)?, core_value_from_json(values)])?;
Ok(())
}
fn validate_field_value_native(field: &Field, value: &Value) -> AxResult<()> {
validate_value(&[core_field_value(field)?, core_value_from_json(value)])?;
Ok(())
}
fn core_signature_value(sig: &AxSignature) -> Result<CoreValue, AxError> {
let values = CoreValue::new_map();
core_set(
&values,
CoreValue::from("inputs"),
core_fields_value(&sig.inputs)?,
)?;
core_set(
&values,
CoreValue::from("outputs"),
core_fields_value(&sig.outputs)?,
)?;
if let Some(text) = sig.description.as_deref() {
core_set(
&values,
CoreValue::from("description"),
CoreValue::from(text),
)?;
}
core_record_new(&[CoreValue::from("AxSignature"), values])
}
// ----- AXIR CORE PROMPT/TEMPLATE ENGINE -----
// Port of the Python reference implementations (_core_template_* and
// _core_prompt_*) onto the AxIR CoreValue runtime. Node maps, error messages,
// and rendering output mirror the Python engine exactly; TemplateError maps
// to AxError::new("template", ...).
#[allow(dead_code)]
const BT: &str = "\u{60}";
#[allow(dead_code)]
const DEFAULT_DSPY_TEMPLATE: &str = "<identity>\n{{ identityText }}\n</identity>{{ if hasFunctions }}\n\n<available_functions>\n**Available Functions**: You can call the following functions to complete the task:\n\n{{ functionsList }}\n\n## Function Call Instructions\n- Complete the task, using the functions defined earlier in this prompt.\n- Output fields should only be generated after all functions have been called.\n- Use the function results to generate the output fields.\n</available_functions>{{ /if }}\n\n<input_fields>\n{{ inputFieldsSection }}\n</input_fields>{{ if hasOutputFields }}\n\n<output_fields>\n{{ outputFieldsSection }}\n</output_fields>{{ /if }}\n{{ if hasTaskDefinition }}\n\n<task_definition>\n{{ taskDefinitionText }}\n</task_definition>{{ /if }}\n\n<formatting_rules>\n{{ if hasStructuredOutputFunction }}\nReturn the complete output by calling \u{60}{{ structuredOutputFunctionName }}\u{60}.\n{{ else }}{{ if hasComplexFields }}\nReturn valid JSON matching <output_fields>.\n{{ else }}\nReturn one \u{60}field name: value\u{60} pair per line for the required output fields only.\n{{ /if }}{{ /if }}Above rules override later instructions.\n\n</formatting_rules>\n{{ if hasExampleDemonstrations }}\n\n## Example Demonstrations\nThe following User/Assistant turns are examples only until --- END OF EXAMPLES ---, not context for the current task.\n{{ /if }}\n";
#[allow(dead_code)]
#[derive(Clone, Debug)]
struct CoreTemplateToken {
is_tag: bool,
value: String,
// Character offset of the token in the source template (tags only; text
// tokens carry the offset where the text run starts).
index: usize,
}
#[allow(dead_code)]
struct CoreTemplateParseRange {
nodes: CoreValue,
index: usize,
terminator: Option<String>,
}
#[allow(dead_code)]
fn core_template_error(message: String) -> AxError {
AxError::new("template", message)
}
// IDENTIFIER_PATTERN: ^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$
#[allow(dead_code)]
fn core_template_is_identifier(text: &str) -> bool {
if text.is_empty() {
return false;
}
for part in text.split('.') {
let mut chars = part.chars();
match chars.next() {
Some(first) if first.is_ascii_alphabetic() || first == '_' => {}
_ => return false,
}
if !chars.all(|ch| ch.is_ascii_alphanumeric() || ch == '_') {
return false;
}
}
true
}
// STRING_EQUALITY_PATTERN:
// ^(identifier)\s*===\s*(?:'([^']*)'|"([^"]*)")$ -> Some((path, expected))
#[allow(dead_code)]
fn core_template_match_string_equality(text: &str) -> Option<(String, String)> {
let eq = text.find("===")?;
let path = text[..eq].trim_end();
if !core_template_is_identifier(path) {
return None;
}
let rest = text[eq + 3..].trim_start();
if rest.len() < 2 {
return None;
}
let quote = rest.chars().next()?;
if quote != '\'' && quote != '"' {
return None;
}
if !rest.ends_with(quote) {
return None;
}
let inner = &rest[1..rest.len() - 1];
if inner.contains(quote) {
return None;
}
Some((path.to_string(), inner.to_string()))
}
// TAG_PATTERN tokenizer: {{\s*([^}]+?)\s*}} scanned by character so token
// indices match Python string offsets.
#[allow(dead_code)]
fn core_template_tokenize(template: &str) -> Vec<CoreTemplateToken> {
let chars: Vec<char> = template.chars().collect();
let len = chars.len();
let mut tokens: Vec<CoreTemplateToken> = Vec::new();
let mut last_index = 0usize;
let mut i = 0usize;
while i + 5 <= len {
if chars[i] != '{' || chars[i + 1] != '{' {
i += 1;
continue;
}
// Tag content cannot contain '}', so the closing braces must sit at
// the first '}' after the opener.
let mut close = i + 2;
while close < len && chars[close] != '}' {
close += 1;
}
if close >= len {
break;
}
if close + 1 >= len || chars[close + 1] != '}' || close < i + 3 {
i += 1;
continue;
}
if i > last_index {
tokens.push(CoreTemplateToken {
is_tag: false,
value: chars[last_index..i].iter().collect(),
index: last_index,
});
}
let raw: String = chars[i + 2..close].iter().collect();
tokens.push(CoreTemplateToken {
is_tag: true,
value: raw.trim().to_string(),
index: i,
});
last_index = close + 2;
i = close + 2;
}
if last_index < len {
tokens.push(CoreTemplateToken {
is_tag: false,
value: chars[last_index..].iter().collect(),
index: last_index,
});
}
tokens
}
#[allow(dead_code)]
fn core_template_error_message(context: &str, source: &str, index: usize, message: &str) -> String {
let snippet: String = source.chars().take(index).collect();
let lines: Vec<&str> = snippet.split('\n').collect();
let line = lines.len();
let column = lines
.last()
.map(|last| last.chars().count() + 1)
.unwrap_or(1);
format!("{context}:{line}:{column} {message}")
}
#[allow(dead_code)]
fn core_template_parse_range(
tokens: &[CoreTemplateToken],
source: &str,
context: &str,
start_index: usize,
terminators: &[&str],
) -> Result<CoreTemplateParseRange, AxError> {
let nodes = CoreValue::new_list();
let mut i = start_index;
while i < tokens.len() {
let token = &tokens[i];
if !token.is_tag {
let node = CoreValue::new_map();
core_set(&node, CoreValue::from("type"), CoreValue::from("text"))?;
core_set(
&node,
CoreValue::from("value"),
CoreValue::from(token.value.as_str()),
)?;
core_append(&nodes, node)?;
i += 1;
continue;
}
let tag = token.value.as_str();
if terminators.contains(&tag) {
return Ok(CoreTemplateParseRange {
nodes,
index: i,
terminator: Some(tag.to_string()),
});
}
if let Some(rest) = tag.strip_prefix("if ") {
let condition = rest.trim();
if !core_template_is_identifier(condition)
&& core_template_match_string_equality(condition).is_none()
{
return Err(core_template_error(core_template_error_message(
context,
source,
token.index,
&format!("Invalid if condition '{condition}'"),
)));
}
let then_result =
core_template_parse_range(tokens, source, context, i + 1, &["else", "/if"])?;
let Some(terminator) = then_result.terminator else {
return Err(core_template_error(core_template_error_message(
context,
source,
token.index,
"Unclosed 'if' block",
)));
};
let mut else_nodes = CoreValue::new_list();
let mut next_index = then_result.index;
if terminator == "else" {
let else_result =
core_template_parse_range(tokens, source, context, next_index + 1, &["/if"])?;
if else_result.terminator.as_deref() != Some("/if") {
return Err(core_template_error(core_template_error_message(
context,
source,
token.index,
"Unclosed 'if' block",
)));
}
else_nodes = else_result.nodes;
next_index = else_result.index;
}
let node = CoreValue::new_map();
core_set(&node, CoreValue::from("type"), CoreValue::from("if"))?;
core_set(
&node,
CoreValue::from("condition"),
CoreValue::from(condition),
)?;
core_set(&node, CoreValue::from("then"), then_result.nodes)?;
core_set(&node, CoreValue::from("else"), else_nodes)?;
core_set(
&node,
CoreValue::from("index"),
CoreValue::Num(token.index as f64),
)?;
core_append(&nodes, node)?;
i = next_index + 1;
continue;
}
if tag == "else" {
return Err(core_template_error(core_template_error_message(
context,
source,
token.index,
"Unexpected 'else'",
)));
}
if tag == "/if" {
return Err(core_template_error(core_template_error_message(
context,
source,
token.index,
"Unexpected '/if'",
)));
}
if tag.starts_with('!') {
i += 1;
continue;
}
if tag.starts_with("include ") {
return Err(core_template_error(core_template_error_message(
context,
source,
token.index,
"Unexpected 'include' directive at runtime (includes must be compiled)",
)));
}
if !core_template_is_identifier(tag) {
return Err(core_template_error(core_template_error_message(
context,
source,
token.index,
&format!("Invalid tag '{tag}'"),
)));
}
let node = CoreValue::new_map();
core_set(&node, CoreValue::from("type"), CoreValue::from("var"))?;
core_set(&node, CoreValue::from("name"), CoreValue::from(tag))?;
core_set(
&node,
CoreValue::from("index"),
CoreValue::Num(token.index as f64),
)?;
core_append(&nodes, node)?;
i += 1;
}
Ok(CoreTemplateParseRange {
nodes,
index: i,
terminator: None,
})
}
#[allow(dead_code)]
fn core_template_parse_source(template: &str, context: &str) -> Result<CoreValue, AxError> {
let tokens = core_template_tokenize(template);
let result = core_template_parse_range(&tokens, template, context, 0, &[])?;
if let Some(terminator) = result.terminator {
return Err(core_template_error(format!(
"Unexpected template terminator '{terminator}' in {context}"
)));
}
Ok(result.nodes)
}
#[allow(dead_code)]
fn core_template_resolve_var(
vars: &CoreValue,
path: &str,
source: &str,
context: &str,
index: usize,
) -> Result<CoreValue, AxError> {
let mut current = vars.clone();
for part in path.split('.') {
let has_key = matches!(¤t, CoreValue::Map(map) if map.borrow().contains(part));
if !has_key {
return Err(core_template_error(core_template_error_message(
context,
source,
index,
&format!("Missing template variable '{path}'"),
)));
}
current = core_get(¤t, &CoreValue::from(part), CoreValue::Null);
}
Ok(current)
}
#[allow(dead_code)]
fn core_template_node_index(node: &CoreValue) -> usize {
match core_get(node, &CoreValue::from("index"), CoreValue::Null) {
CoreValue::Num(n) => n as usize,
_ => 0,
}
}
#[allow(dead_code)]
fn core_template_render_tree_nodes(
nodes: &CoreValue,
vars: &CoreValue,
source: &str,
context: &str,
) -> Result<String, AxError> {
let mut out = String::new();
for node in core_iter(nodes)? {
let node_type = core_get(&node, &CoreValue::from("type"), CoreValue::Null);
if node_type.as_str() == Some("text") {
out.push_str(&core_get(&node, &CoreValue::from("value"), CoreValue::from("")).text());
continue;
}
if node_type.as_str() == Some("var") {
let name = core_get(&node, &CoreValue::from("name"), CoreValue::Null).text();
let index = core_template_node_index(&node);
let value = core_template_resolve_var(vars, &name, source, context, index)?;
if !matches!(
value,
CoreValue::Str(_) | CoreValue::Num(_) | CoreValue::Bool(_)
) {
return Err(core_template_error(core_template_error_message(
context,
source,
index,
&format!("Variable '{name}' must be string, number, or boolean"),
)));
}
out.push_str(&value.text());
continue;
}
let condition = core_get(&node, &CoreValue::from("condition"), CoreValue::Null).text();
let index = core_template_node_index(&node);
let condition_value =
if let Some((path, expected)) = core_template_match_string_equality(&condition) {
core_template_resolve_var(vars, &path, source, context, index)?
== CoreValue::from(expected.as_str())
} else {
let resolved = core_template_resolve_var(vars, &condition, source, context, index)?;
match resolved {
CoreValue::Bool(flag) => flag,
_ => {
return Err(core_template_error(core_template_error_message(
context,
source,
index,
&format!("Condition '{condition}' must be boolean"),
)))
}
}
};
let branch_key = if condition_value { "then" } else { "else" };
let branch = core_get(&node, &CoreValue::from(branch_key), CoreValue::Null);
out.push_str(&core_template_render_tree_nodes(
&branch, vars, source, context,
)?);
}
Ok(out)
}
#[allow(dead_code)]
fn core_template_collect_vars_from_tree(
nodes: &CoreValue,
out: &mut Vec<String>,
) -> Result<(), AxError> {
for node in core_iter(nodes)? {
let node_type = core_get(&node, &CoreValue::from("type"), CoreValue::Null);
if node_type.as_str() == Some("var") {
let name = core_get(&node, &CoreValue::from("name"), CoreValue::Null).text();
if !out.contains(&name) {
out.push(name);
}
} else if node_type.as_str() == Some("if") {
let condition = core_get(&node, &CoreValue::from("condition"), CoreValue::Null).text();
let name = match core_template_match_string_equality(&condition) {
Some((path, _)) => path,
None => condition,
};
if !out.contains(&name) {
out.push(name);
}
core_template_collect_vars_from_tree(
&core_get(&node, &CoreValue::from("then"), CoreValue::Null),
out,
)?;
core_template_collect_vars_from_tree(
&core_get(&node, &CoreValue::from("else"), CoreValue::Null),
out,
)?;
}
}
Ok(())
}
// ENTRY: (template, context) -> nodes
#[allow(dead_code)]
fn core_template_parse(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let template = core_arg(args, 0).text();
let context = core_arg(args, 1).text();
core_template_parse_source(&template, &context)
}
// ENTRY: (nodes, vars, source, context) -> rendered string
#[allow(dead_code)]
fn core_template_render_tree(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let nodes = core_arg(args, 0);
let vars = core_arg(args, 1);
let source = core_arg(args, 2).text();
let context = core_arg(args, 3).text();
let rendered = core_template_render_tree_nodes(&nodes, &vars, &source, &context)?;
Ok(CoreValue::from_string(rendered))
}
// ENTRY: (nodes) -> sorted list of unique variable names
#[allow(dead_code)]
fn core_template_collect_vars(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let nodes = core_arg(args, 0);
let mut out: Vec<String> = Vec::new();
core_template_collect_vars_from_tree(&nodes, &mut out)?;
out.sort();
Ok(CoreValue::list_from(
out.into_iter().map(CoreValue::from_string).collect(),
))
}
// ENTRY: (source, context, required_variables?) -> error message string or Null
#[allow(dead_code)]
fn core_template_validate(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let source = core_arg(args, 0).text();
let context = core_arg(args, 1).text();
let required_variables = core_arg(args, 2);
let outcome = (|| -> Result<CoreValue, AxError> {
let nodes = core_template_parse_source(&source, &context)?;
let mut present: Vec<String> = Vec::new();
core_template_collect_vars_from_tree(&nodes, &mut present)?;
let required = if core_truthy(&required_variables) {
core_iter(&required_variables)?
} else {
Vec::new()
};
for variable in required {
let name = variable.text();
if !present.contains(&name) {
return Ok(CoreValue::from_string(format!(
"must preserve template variable {{{{{name}}}}}"
)));
}
}
Ok(CoreValue::Null)
})();
match outcome {
Ok(value) => Ok(value),
Err(err) => Ok(CoreValue::from_string(err.message)),
}
}
// ----- prompt helpers -----
#[allow(dead_code)]
fn core_prompt_combine_consecutive_text(
parts: &CoreValue,
separator: &str,
) -> Result<CoreValue, AxError> {
let out = CoreValue::new_list();
for part in core_iter(parts)? {
let is_text =
core_get(&part, &CoreValue::from("type"), CoreValue::Null).as_str() == Some("text");
let last = match &out {
CoreValue::List(items) => items.borrow().last().cloned(),
_ => None,
};
let merge_target = match last {
Some(prev)
if is_text
&& core_get(&prev, &CoreValue::from("type"), CoreValue::Null).as_str()
== Some("text") =>
{
Some(prev)
}
_ => None,
};
if let Some(prev) = merge_target {
let prev_text = core_get(&prev, &CoreValue::from("text"), CoreValue::from("")).text();
let part_text = core_get(&part, &CoreValue::from("text"), CoreValue::from("")).text();
core_set(
&prev,
CoreValue::from("text"),
CoreValue::from_string(format!("{prev_text}{separator}{part_text}")),
)?;
} else {
core_append(&out, part)?;
}
}
Ok(out)
}
#[allow(dead_code)]
fn core_prompt_default_render_in_field(
field: &CoreValue,
value: &CoreValue,
) -> Result<CoreValue, AxError> {
let field_type = core_get(field, &CoreValue::from("type"), CoreValue::Null);
let typ = if core_truthy(&field_type) {
core_get(&field_type, &CoreValue::from("name"), CoreValue::Null).text()
} else {
"string".to_string()
};
let title = core_get(field, &CoreValue::from("title"), CoreValue::Null).text();
if matches!(typ.as_str(), "image" | "audio" | "file" | "url") {
if matches!(value, CoreValue::List(_)) {
let parts = CoreValue::new_list();
let text_part = CoreValue::new_map();
core_set(&text_part, CoreValue::from("type"), CoreValue::from("text"))?;
core_set(
&text_part,
CoreValue::from("text"),
CoreValue::from_string(format!("{title}: ")),
)?;
core_append(&parts, text_part)?;
for item in core_iter(value)? {
core_append(&parts, item)?;
}
return Ok(parts);
}
if let CoreValue::Map(map) = value {
let part = CoreValue::new_map();
for (key, item) in map.borrow().entries.clone() {
core_set(&part, CoreValue::from(key.as_str()), item)?;
}
let has_type = matches!(&part, CoreValue::Map(m) if m.borrow().contains("type"));
if !has_type {
core_set(
&part,
CoreValue::from("type"),
CoreValue::from_string(typ.clone()),
)?;
}
let text_part = CoreValue::new_map();
core_set(&text_part, CoreValue::from("type"), CoreValue::from("text"))?;
core_set(
&text_part,
CoreValue::from("text"),
CoreValue::from_string(format!("{title}: ")),
)?;
return Ok(CoreValue::list_from(vec![text_part, part]));
}
}
let part = CoreValue::new_map();
core_set(&part, CoreValue::from("type"), CoreValue::from("text"))?;
core_set(
&part,
CoreValue::from("text"),
CoreValue::from_string(format!("{}: {}", title, value.text())),
)?;
if core_truthy(&core_get(
field,
&CoreValue::from("is_cached"),
CoreValue::Null,
)) {
core_set(&part, CoreValue::from("cache"), CoreValue::Bool(true))?;
}
Ok(CoreValue::list_from(vec![part]))
}
#[allow(dead_code)]
fn core_prompt_field_name_to_title(
signature: &CoreValue,
) -> Result<Vec<(String, String)>, AxError> {
let mut out: Vec<(String, String)> = Vec::new();
let mut fields = core_prompt_get_input_fields(signature)?;
fields.extend(core_prompt_get_output_fields(signature)?);
for field in fields {
let name = core_get(&field, &CoreValue::from("name"), CoreValue::Null).text();
let title = core_get(&field, &CoreValue::from("title"), CoreValue::Null).text();
if let Some(entry) = out.iter_mut().find(|(key, _)| *key == name) {
entry.1 = title;
} else {
out.push((name, title));
}
}
Ok(out)
}
#[allow(dead_code)]
fn core_prompt_field_type_text(field_type: &CoreValue) -> String {
let name_value = core_get(field_type, &CoreValue::from("name"), CoreValue::Null);
let name = name_value.as_str().unwrap_or("string");
let base = match name {
"string" => "string".to_string(),
"number" => "number".to_string(),
"boolean" => "boolean (true or false)".to_string(),
"date" => "date (YYYY-MM-DD, e.g. 2024-05-09)".to_string(),
"dateRange" => "date range ({ \"start\": \"YYYY-MM-DD\", \"end\": \"YYYY-MM-DD\" }, e.g. {\"start\":\"2024-05-09\",\"end\":\"2024-05-12\"})".to_string(),
"datetime" => "datetime (ISO 8601 with timezone, e.g. 2024-05-09T14:30:00Z or 2024-05-09T14:30:00-07:00)".to_string(),
"datetimeRange" => "datetime range ({ \"start\": ISO datetime, \"end\": ISO datetime }, e.g. {\"start\":\"2024-05-09T14:30:00Z\",\"end\":\"2024-05-09T15:30:00Z\"})".to_string(),
"json" => "JSON object".to_string(),
"class" => "classification class".to_string(),
"code" => "code".to_string(),
"file" => "file (with filename, mimeType, and data)".to_string(),
"audio" => "speech script (plain text to synthesize as audio)".to_string(),
"url" => "URL (string or object with url, title, description)".to_string(),
"object" => {
let fields = core_get(field_type, &CoreValue::from("fields"), CoreValue::Null);
if core_truthy(&fields) {
format!("object {}", core_prompt_format_object_structure(&fields))
} else {
"object".to_string()
}
}
_ => "string".to_string(),
};
if core_truthy(&core_get(
field_type,
&CoreValue::from("is_array"),
CoreValue::Null,
)) {
format!("json array of {base} items")
} else {
base
}
}
#[allow(dead_code)]
fn core_prompt_format_description(text: &CoreValue) -> String {
let raw = if core_truthy(text) {
text.text()
} else {
String::new()
};
let value = raw.trim();
if value.is_empty() {
return String::new();
}
let suffix = if value.ends_with('.') { "" } else { "." };
let chars: Vec<char> = value.chars().collect();
let first_upper: String = chars[0].to_uppercase().collect();
let rest: String = chars[1..].iter().collect();
format!("{first_upper}{rest}{suffix}")
}
#[allow(dead_code)]
fn core_prompt_format_field_references(
description: &str,
field_map: &[(String, String)],
) -> String {
let mut result = description.to_string();
let mut ordered: Vec<&(String, String)> = field_map.iter().collect();
// sorted(keys, key=len, reverse=True) -- stable, longest first
ordered.sort_by(|a, b| b.0.chars().count().cmp(&a.0.chars().count()));
for (field_name, title) in ordered {
result = result.replace(
&format!("{BT}{field_name}{BT}"),
&format!("{BT}{title}{BT}"),
);
result = result.replace(&format!("\"{field_name}\""), &format!("\"{title}\""));
result = result.replace(&format!("'{field_name}'"), &format!("'{title}'"));
result = result.replace(&format!("[{field_name}]"), &format!("[{title}]"));
result = result.replace(&format!("({field_name})"), &format!("({title})"));
let pattern = format!(r"\${}\b", regex::escape(field_name));
if let Ok(compiled) = regex::Regex::new(&pattern) {
let replacement = format!("{BT}{title}{BT}");
result = compiled
.replace_all(&result, regex::NoExpand(replacement.as_str()))
.into_owned();
}
}
result
}
#[allow(dead_code)]
fn core_prompt_format_object_structure(fields: &CoreValue) -> String {
let mut entries: Vec<String> = Vec::new();
if let CoreValue::Map(map) = fields {
for (key, item) in map.borrow().entries.clone() {
let nested_type = if matches!(&item, CoreValue::Map(m) if m.borrow().contains("type")) {
core_get(&item, &CoreValue::from("type"), CoreValue::Null)
} else {
item.clone()
};
let optional = if core_truthy(&core_get(
&item,
&CoreValue::from("is_optional"),
CoreValue::Null,
)) {
"?"
} else {
""
};
entries.push(format!(
"{}{}: {}",
key,
optional,
core_prompt_field_type_text(&nested_type)
));
}
}
format!("{{ {} }}", entries.join(", "))
}
#[allow(dead_code)]
fn core_prompt_function_descriptors(
functions: &CoreValue,
) -> Result<Vec<(CoreValue, CoreValue)>, AxError> {
let mut out: Vec<(CoreValue, CoreValue)> = Vec::new();
let items = if core_truthy(functions) {
core_iter(functions)?
} else {
Vec::new()
};
for item in items {
let (name, description) = match &item {
CoreValue::Map(map) => (
map.borrow().get("name").unwrap_or(CoreValue::Null),
map.borrow()
.get("description")
.unwrap_or(CoreValue::from("")),
),
_ => (CoreValue::Null, CoreValue::from("")),
};
if core_truthy(&name) {
out.push((name, description));
}
}
Ok(out)
}
#[allow(dead_code)]
fn core_prompt_get_description(signature: &CoreValue) -> CoreValue {
core_get(signature, &CoreValue::from("description"), CoreValue::Null)
}
#[allow(dead_code)]
fn core_prompt_get_input_fields(signature: &CoreValue) -> Result<Vec<CoreValue>, AxError> {
let fields = core_get(signature, &CoreValue::from("input_fields"), CoreValue::Null);
if fields.is_null() {
return Ok(Vec::new());
}
core_iter(&fields)
}
#[allow(dead_code)]
fn core_prompt_get_output_fields(signature: &CoreValue) -> Result<Vec<CoreValue>, AxError> {
let fields = core_get(
signature,
&CoreValue::from("output_fields"),
CoreValue::Null,
);
if fields.is_null() {
return Ok(Vec::new());
}
core_iter(&fields)
}
#[allow(dead_code)]
fn core_prompt_has_complex_fields(signature: &CoreValue) -> Result<bool, AxError> {
if core_truthy(&core_get(
signature,
&CoreValue::from("force_structured"),
CoreValue::Null,
)) {
return Ok(true);
}
for field in core_prompt_get_output_fields(signature)? {
let field_type = core_get(&field, &CoreValue::from("type"), CoreValue::Null);
if core_get(&field_type, &CoreValue::from("name"), CoreValue::Null).as_str()
== Some("object")
|| core_truthy(&core_get(
&field_type,
&CoreValue::from("fields"),
CoreValue::Null,
))
{
return Ok(true);
}
}
Ok(false)
}
#[allow(dead_code)]
fn core_prompt_identity_section(
signature: &CoreValue,
values: &CoreValue,
) -> Result<String, AxError> {
let in_args =
core_prompt_render_desc_fields(&core_prompt_input_fields_for_values(signature, values)?);
let out_args = core_prompt_render_desc_fields(&core_prompt_get_output_fields(signature)?);
Ok(format!(
"You will be provided with the following fields: {in_args}. Your task is to generate new fields: {out_args}."
))
}
#[allow(dead_code)]
fn core_prompt_input_fields_for_values(
signature: &CoreValue,
values: &CoreValue,
) -> Result<Vec<CoreValue>, AxError> {
let mut fields = core_prompt_get_input_fields(signature)?;
fields.sort_by_key(|field| {
if core_truthy(&core_get(
field,
&CoreValue::from("is_cached"),
CoreValue::Null,
)) {
0
} else {
1
}
});
if !matches!(values, CoreValue::Map(_)) {
return Ok(fields);
}
Ok(fields
.into_iter()
.filter(|field| {
if !core_truthy(&core_get(
field,
&CoreValue::from("is_optional"),
CoreValue::Null,
)) {
return true;
}
let name = core_get(field, &CoreValue::from("name"), CoreValue::Null);
core_prompt_is_provided_value(&core_get(values, &name, CoreValue::Null))
})
.collect())
}
#[allow(dead_code)]
fn core_prompt_input_fields_section(
signature: &CoreValue,
values: &CoreValue,
) -> Result<String, AxError> {
let fields = core_prompt_render_input_fields(
&core_prompt_input_fields_for_values(signature, values)?,
&core_prompt_field_name_to_title(signature)?,
);
Ok(format!(
"**Input Fields**: The following fields will be provided to you:\n\n{fields}"
))
}
#[allow(dead_code)]
fn core_prompt_is_provided_value(value: &CoreValue) -> bool {
match value {
CoreValue::Null => false,
CoreValue::Str(text) => !text.is_empty(),
CoreValue::List(items) => !items.borrow().is_empty(),
_ => true,
}
}
#[allow(dead_code)]
fn core_prompt_output_fields_section(signature: &CoreValue) -> Result<String, AxError> {
let fields = core_prompt_render_output_fields(
&core_prompt_get_output_fields(signature)?,
&core_prompt_field_name_to_title(signature)?,
)?;
Ok(format!(
"**Output Fields**: You must generate the following fields:\n\n{fields}"
))
}
#[allow(dead_code)]
fn core_prompt_process_value(field: &CoreValue, value: &CoreValue) -> Result<CoreValue, AxError> {
if matches!(value, CoreValue::Str(_)) {
return Ok(value.clone());
}
let field_type = core_get(field, &CoreValue::from("type"), CoreValue::Null);
if core_truthy(&field_type) {
let name = core_get(&field_type, &CoreValue::from("name"), CoreValue::Null);
if matches!(
name.as_str(),
Some("image") | Some("audio") | Some("file") | Some("url")
) && matches!(value, CoreValue::Map(_))
{
return Ok(value.clone());
}
}
// json.dumps(value, indent=2)
let dumped = serde_json::to_string_pretty(&core_value_to_json(value))
.map_err(|err| AxError::runtime(err.to_string()))?;
Ok(CoreValue::from_string(dumped))
}
#[allow(dead_code)]
fn core_prompt_render_desc_fields(fields: &[CoreValue]) -> String {
fields
.iter()
.map(|field| {
let title = core_get(field, &CoreValue::from("title"), CoreValue::Null).text();
format!("{BT}{title}{BT}")
})
.collect::<Vec<_>>()
.join(", ")
}
#[allow(dead_code)]
fn core_prompt_render_functions_section(funcs: &[(CoreValue, CoreValue)]) -> String {
funcs
.iter()
.map(|(name, description)| {
format!(
"- {BT}{}{BT}: {}",
name.text(),
core_prompt_format_description(description)
)
})
.collect::<Vec<_>>()
.join("\n")
}
#[allow(dead_code)]
fn core_prompt_render_in_field(
field: &CoreValue,
values: &CoreValue,
) -> Result<Option<CoreValue>, AxError> {
let name = core_get(field, &CoreValue::from("name"), CoreValue::Null);
let value = core_get(values, &name, CoreValue::Null);
if !core_prompt_is_provided_value(&value) {
if core_truthy(&core_get(
field,
&CoreValue::from("is_optional"),
CoreValue::Null,
)) || core_truthy(&core_get(
field,
&CoreValue::from("is_internal"),
CoreValue::Null,
)) {
return Ok(None);
}
return Err(AxError::runtime(format!(
"Value for input field '{}' is required.",
name.text()
)));
}
let processed = core_prompt_process_value(field, &value)?;
Ok(Some(core_prompt_default_render_in_field(
field, &processed,
)?))
}
#[allow(dead_code)]
fn core_prompt_render_input_fields(fields: &[CoreValue], field_map: &[(String, String)]) -> String {
let mut rows: Vec<String> = Vec::new();
for field in fields {
let description_value = core_get(field, &CoreValue::from("description"), CoreValue::Null);
let mut description = String::new();
if core_truthy(&description_value) {
description = format!(
" {}",
core_prompt_format_field_references(
&core_prompt_format_description(&description_value),
field_map
)
);
}
let title = core_get(field, &CoreValue::from("title"), CoreValue::Null).text();
rows.push(format!("{title}:{description}").trim().to_string());
}
rows.join("\n")
}
#[allow(dead_code)]
fn core_prompt_render_output_fields(
fields: &[CoreValue],
field_map: &[(String, String)],
) -> Result<String, AxError> {
let mut rows: Vec<String> = Vec::new();
for field in fields {
let field_type = core_get(field, &CoreValue::from("type"), CoreValue::Null);
let type_text = if core_truthy(&field_type) {
core_prompt_field_type_text(&field_type)
} else {
"string".to_string()
};
let required = if core_truthy(&core_get(
field,
&CoreValue::from("is_optional"),
CoreValue::Null,
)) {
format!("Only include this {type_text} field if its value is available")
} else {
format!("This {type_text} field must be included")
};
let description_value = core_get(field, &CoreValue::from("description"), CoreValue::Null);
let mut description = String::new();
if core_truthy(&description_value) {
let is_class = core_truthy(&field_type)
&& core_get(&field_type, &CoreValue::from("name"), CoreValue::Null).as_str()
== Some("class");
let value = if is_class {
description_value.text()
} else {
core_prompt_format_description(&description_value)
};
description = format!(
" {}",
core_prompt_format_field_references(&value, field_map)
);
}
let options = core_get(&field_type, &CoreValue::from("options"), CoreValue::Null);
if core_truthy(&field_type) && core_truthy(&options) {
if !description.is_empty() {
description.push_str(". ");
}
let joined = core_iter(&options)?
.iter()
.map(|option| option.text())
.collect::<Vec<_>>()
.join(", ");
description.push_str(&format!("Allowed values: {joined}"));
}
let title = core_get(field, &CoreValue::from("title"), CoreValue::Null).text();
rows.push(
format!("{title}: ({required}){description}")
.trim()
.to_string(),
);
}
Ok(rows.join("\n"))
}
#[allow(dead_code)]
fn core_prompt_task_definition_section(signature: &CoreValue) -> Result<String, AxError> {
let desc = core_prompt_get_description(signature);
if !core_truthy(&desc) {
return Ok(String::new());
}
Ok(core_prompt_format_field_references(
&core_prompt_format_description(&desc),
&core_prompt_field_name_to_title(signature)?,
))
}
#[allow(dead_code)]
fn core_prompt_user_parts(signature: &CoreValue, values: &CoreValue) -> Result<CoreValue, AxError> {
let out = CoreValue::new_list();
for field in core_prompt_input_fields_for_values(signature, values)? {
if let Some(rendered) = core_prompt_render_in_field(&field, values)? {
for part in core_iter(&rendered)? {
core_append(&out, part)?;
}
}
}
for part in core_iter(&out)? {
if core_get(&part, &CoreValue::from("type"), CoreValue::Null).as_str() == Some("text") {
let text = core_get(&part, &CoreValue::from("text"), CoreValue::from("")).text();
core_set(
&part,
CoreValue::from("text"),
CoreValue::from_string(format!("{text}\n")),
)?;
}
}
Ok(out)
}
// ENTRY: (signature, values, functions, options) -> rendered system prompt
#[allow(dead_code)]
fn core_prompt_structured(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let signature = core_arg(args, 0);
let mut values = core_arg(args, 1);
let functions = core_arg(args, 2);
let mut options = core_arg(args, 3);
if !core_truthy(&values) {
values = CoreValue::new_map();
}
if !core_truthy(&options) {
options = CoreValue::new_map();
}
let has_complex_fields = core_prompt_has_complex_fields(&signature)?;
let task_definition = core_prompt_task_definition_section(&signature)?;
let funcs = core_prompt_function_descriptors(&functions)?;
let has_examples_default = core_get(
&options,
&CoreValue::from("hasExampleDemonstrations"),
CoreValue::Bool(false),
);
let has_example_demonstrations = core_truthy(&core_get(
&options,
&CoreValue::from("has_example_demonstrations"),
has_examples_default,
));
let structured_fn = core_get(
&options,
&CoreValue::from("structured_output_function_name"),
CoreValue::Null,
);
let template_vars = CoreValue::new_map();
core_set(
&template_vars,
CoreValue::from("hasFunctions"),
CoreValue::Bool(!funcs.is_empty()),
)?;
core_set(
&template_vars,
CoreValue::from("hasTaskDefinition"),
CoreValue::Bool(!task_definition.is_empty()),
)?;
core_set(
&template_vars,
CoreValue::from("hasExampleDemonstrations"),
CoreValue::Bool(has_example_demonstrations),
)?;
core_set(
&template_vars,
CoreValue::from("hasOutputFields"),
CoreValue::Bool(!has_complex_fields),
)?;
core_set(
&template_vars,
CoreValue::from("hasComplexFields"),
CoreValue::Bool(has_complex_fields),
)?;
core_set(
&template_vars,
CoreValue::from("hasStructuredOutputFunction"),
CoreValue::Bool(has_complex_fields && core_truthy(&structured_fn)),
)?;
core_set(
&template_vars,
CoreValue::from("identityText"),
CoreValue::from_string(core_prompt_identity_section(&signature, &values)?),
)?;
core_set(
&template_vars,
CoreValue::from("taskDefinitionText"),
CoreValue::from_string(task_definition.clone()),
)?;
core_set(
&template_vars,
CoreValue::from("functionsList"),
if !funcs.is_empty() {
CoreValue::from_string(core_prompt_render_functions_section(&funcs))
} else {
CoreValue::from("")
},
)?;
core_set(
&template_vars,
CoreValue::from("inputFieldsSection"),
CoreValue::from_string(core_prompt_input_fields_section(&signature, &values)?),
)?;
core_set(
&template_vars,
CoreValue::from("outputFieldsSection"),
if !has_complex_fields {
CoreValue::from_string(core_prompt_output_fields_section(&signature)?)
} else {
CoreValue::from("")
},
)?;
core_set(
&template_vars,
CoreValue::from("structuredOutputFunctionName"),
if core_truthy(&structured_fn) {
structured_fn.clone()
} else {
CoreValue::from("")
},
)?;
let custom_template = core_get(
&options,
&CoreValue::from("custom_template"),
CoreValue::Null,
);
let (source, context) = if custom_template.is_null() {
(DEFAULT_DSPY_TEMPLATE.to_string(), "template:dsp/dspy.md")
} else {
(custom_template.text(), "inline-template")
};
let nodes = core_template_parse_source(&source, context)?;
let rendered = core_template_render_tree_nodes(&nodes, &template_vars, &source, context)?;
Ok(CoreValue::from_string(rendered.trim().to_string()))
}
// ENTRY: (signature, values) -> joined string, or list of content part maps
#[allow(dead_code)]
fn core_prompt_user_content(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let signature = core_arg(args, 0);
let mut values = core_arg(args, 1);
if !core_truthy(&values) {
values = CoreValue::new_map();
}
let parts = core_prompt_user_parts(&signature, &values)?;
let items = core_iter(&parts)?;
let all_plain_text = items.iter().all(|part| {
core_get(part, &CoreValue::from("type"), CoreValue::Null).as_str() == Some("text")
&& !core_truthy(&core_get(part, &CoreValue::from("cache"), CoreValue::Null))
});
if all_plain_text {
let joined = items
.iter()
.map(|part| core_get(part, &CoreValue::from("text"), CoreValue::from("")).text())
.collect::<Vec<_>>()
.join("\n");
return Ok(CoreValue::from_string(joined));
}
core_prompt_combine_consecutive_text(&parts, "\n")
}
// ----- END AXIR CORE PROMPT/TEMPLATE ENGINE -----
fn core_python_dumps(value: &Value) -> String {
match value {
Value::Null => "null".to_string(),
Value::Bool(b) => b.to_string(),
Value::Number(n) => n.to_string(),
Value::String(s) => serde_json::to_string(s).unwrap_or_default(),
Value::Array(items) => {
let parts: Vec<String> = items.iter().map(core_python_dumps).collect();
format!("[{}]", parts.join(", "))
}
Value::Object(map) => {
let parts: Vec<String> = map
.iter()
.map(|(k, v)| {
format!(
"{}: {}",
serde_json::to_string(k).unwrap_or_default(),
core_python_dumps(v)
)
})
.collect();
format!("{{{}}}", parts.join(", "))
}
}
}
fn core_json_parse(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let text = core_arg(args, 0).text();
let parsed: Value = serde_json::from_str(&text)
.map_err(|err| AxError::runtime(format!("json parse error: {err}")))?;
Ok(core_value_from_json(&parsed))
}
fn core_json_stringify(args: &[CoreValue]) -> Result<CoreValue, AxError> {
// python _core_json_stringify: json.dumps(value, sort_keys=True,
// separators=(",", ":")) — compact and key-sorted.
let value = core_arg(args, 0);
let json = if value.is_null() {
json!({})
} else {
core_value_to_json(&value)
};
Ok(CoreValue::from_string(stable_stringify(&json)))
}
fn core_map_delete(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let target = core_arg(args, 0);
let key = core_arg(args, 1).text();
if let CoreValue::Map(map) = &target {
map.borrow_mut().entries.retain(|(k, _)| k != &key);
}
Ok(target)
}
fn core_map_merge(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let out = CoreValue::new_map();
for index in [0usize, 1] {
if let CoreValue::Map(map) = core_arg(args, index) {
for (k, v) in map.borrow().entries.clone() {
core_set(&out, CoreValue::from(k.as_str()), v)?;
}
}
}
Ok(out)
}
fn core_mul(args: &[CoreValue]) -> Result<CoreValue, AxError> {
core_number_pair(args).map(|(a, b)| CoreValue::Num(a * b))
}
fn core_string_lower(args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::from_string(
core_arg(args, 0).text().to_lowercase(),
))
}
fn core_string_starts_with(args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::Bool(
core_arg(args, 0)
.text()
.starts_with(&core_arg(args, 1).text()),
))
}
fn core_string_ends_with(args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::Bool(
core_arg(args, 0)
.text()
.ends_with(&core_arg(args, 1).text()),
))
}
fn core_string_str(args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::from_string(core_arg(args, 0).text()))
}
fn core_string_join_intrinsic(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let sep = core_arg(args, 0);
core_string_join(&sep, &core_arg(args, 1))
}
fn core_ai_error(
class_name: &str,
args: &[CoreValue],
default_retryable: bool,
retry_index: Option<usize>,
) -> Result<CoreValue, AxError> {
let status = match core_arg(args, 1) {
CoreValue::Num(n) => Some(n as u16),
_ => None,
};
let code = core_arg(args, 2);
let retryable = match retry_index.map(|i| core_arg(args, i)) {
Some(CoreValue::Null) | None => default_retryable,
Some(value) => core_truthy(&value),
};
Ok(CoreValue::Error(Rc::new(AxError {
category: "ai_service".to_string(),
error_type: Some(class_name.to_string()),
message: core_arg(args, 0).text(),
status,
code: code.as_str().map(str::to_string),
retryable,
})))
}
fn core_ai_error_auth(args: &[CoreValue]) -> Result<CoreValue, AxError> {
core_ai_error("AxAIServiceAuthenticationError", args, false, None)
}
fn core_ai_error_refusal(args: &[CoreValue]) -> Result<CoreValue, AxError> {
core_ai_error("AxAIRefusalError", args, false, None)
}
fn core_ai_error_response(args: &[CoreValue]) -> Result<CoreValue, AxError> {
core_ai_error("AxAIServiceResponseError", args, false, None)
}
fn core_ai_error_status(args: &[CoreValue]) -> Result<CoreValue, AxError> {
core_ai_error("AxAIServiceStatusError", args, false, Some(5))
}
fn core_ai_error_stream(args: &[CoreValue]) -> Result<CoreValue, AxError> {
core_ai_error("AxAIServiceStreamTerminatedError", args, true, Some(2))
}
fn core_ai_error_timeout(args: &[CoreValue]) -> Result<CoreValue, AxError> {
core_ai_error("AxAIServiceTimeoutError", args, true, Some(5))
}
fn core_ai_error_unsupported(args: &[CoreValue]) -> Result<CoreValue, AxError> {
core_ai_error("AxUnsupportedCapabilityError", args, false, None)
}
fn core_stream_event_content_parts(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let event = core_arg(args, 0);
if let Some(text) = event.as_str() {
return Ok(CoreValue::list_from(vec![CoreValue::from(text)]));
}
if !matches!(event, CoreValue::Map(_)) {
return Ok(CoreValue::new_list());
}
let inner = core_get(&event, &CoreValue::from("data"), CoreValue::Null);
let data = if matches!(inner, CoreValue::Map(_)) {
inner
} else {
event
};
let kind = core_get(&data, &CoreValue::from("type"), CoreValue::Null).text();
if kind == "done" || kind == "message_stop" {
return Ok(CoreValue::new_list());
}
let results = core_get(&data, &CoreValue::from("results"), CoreValue::Null);
if core_truthy(&results) {
let out = CoreValue::new_list();
for result in core_iter(&results)? {
let content = core_get(&result, &CoreValue::from("content"), CoreValue::Null);
core_append(
&out,
if content.is_null() {
CoreValue::from("")
} else {
content
},
)?;
}
return Ok(out);
}
for key in ["delta", "content_delta", "contentDelta", "text", "content"] {
let value = core_get(&data, &CoreValue::from(key), CoreValue::Null);
if core_truthy(&value) {
return Ok(CoreValue::list_from(vec![value]));
}
}
Ok(CoreValue::list_from(vec![CoreValue::from("")]))
}
// Wire-format key translation for the openai-compatible chat body; the
// Core-level AxModelConfig merge is the emitted merge_model_config.
fn merge_model_config_wire(target: &mut Value, source: &Value) {
if let Some(source) = source.as_object() {
for (key, value) in source {
let out_key = match key.as_str() {
"maxTokens" | "max_tokens" => "max_completion_tokens",
"topP" | "top_p" => "top_p",
"presencePenalty" | "presence_penalty" => "presence_penalty",
"frequencyPenalty" | "frequency_penalty" => "frequency_penalty",
"stopSequences" | "stop_sequences" => "stop",
other => other,
};
target[out_key] = value.clone();
}
}
}
fn provider_ai_display_name(profile: &str) -> CoreValue {
provider_descriptor(&[CoreValue::from(profile)])
.map(|descriptor| {
core_get(
&descriptor,
&CoreValue::from("name"),
CoreValue::from(profile),
)
})
.unwrap_or_else(|_| CoreValue::from(profile))
}
// ----- AXIR CORE GEN ENGINE (host boundary) -----
// Port of the Python reference helpers (_core_axgen_* family, class AxMemory,
// and the host-boundary intrinsics) onto the AxIR CoreValue runtime. The
// CoreValue::Host variant carries opaque host objects (memory, tools, user
// callbacks); a value is "callable" in the python sense iff it is a Host, and
// calling it dispatches call_method("call", [arg]).
#[allow(dead_code)]
pub(crate) trait CoreHost {
fn host_type(&self) -> &'static str;
fn call_method(&self, name: &str, args: &[CoreValue]) -> Result<CoreValue, AxError>;
/// Register a host callable on the wrapped runtime, if this host wraps one.
/// Returns true when the host handled it. Default false (most hosts are not
/// runtimes); the code-runtime host overrides it. Used by the agent wrapper
/// to wire `llmQuery` onto the runtime carried inside agent options.
fn register_runtime_callable(&self, _name: &str, _callable: AxHostCallable) -> bool {
false
}
/// Expose the shared `AxGen` carried by an `AxGen` host so the agent can build
/// a playbook bound to the live pipeline stage. Default `None`; only `GenHost`
/// (the host that wraps an AxGen) overrides it.
fn stage_gen_rc(&self) -> Option<Rc<RefCell<AxGen>>> {
None
}
}
// Keeps #[derive(Debug)] on CoreValue working once the Host(Rc<dyn CoreHost>)
// variant is added: Rc<T> is Debug iff T is Debug, and this impl makes the
// trait object Debug without forcing a supertrait on implementors.
impl std::fmt::Debug for dyn CoreHost {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "CoreHost({})", self.host_type())
}
}
// ----- AxMemory host -----
// Items are stored behind the same Rc<RefCell<Vec<...>>> that CoreValue::List
// wraps, so call_method("items") hands out a list that aliases the internal
// storage exactly like python attribute access does.
#[allow(dead_code)]
struct CoreMemory {
items: Rc<RefCell<Vec<CoreValue>>>,
}
#[allow(dead_code)]
pub(crate) fn core_memory_new() -> CoreValue {
CoreValue::Host(Rc::new(CoreMemory {
items: Rc::new(RefCell::new(Vec::new())),
}))
}
#[allow(dead_code)]
fn core_memory_entry(
role: &str,
payload_key: &str,
payload: CoreValue,
session: CoreValue,
) -> Result<CoreValue, AxError> {
let item = CoreValue::new_map();
core_set(&item, CoreValue::from("role"), CoreValue::from(role))?;
core_set(&item, CoreValue::from(payload_key), payload)?;
core_set(&item, CoreValue::from("session_id"), session)?;
core_set(&item, CoreValue::from("tags"), CoreValue::new_list())?;
Ok(item)
}
// python: tag in (item.get("tags") or [])
#[allow(dead_code)]
fn core_memory_tags_contain(item: &CoreValue, tag: &CoreValue) -> bool {
let tags = core_get(item, &CoreValue::from("tags"), CoreValue::Null);
match &tags {
CoreValue::List(list) => list.borrow().iter().any(|entry| entry == tag),
_ => false,
}
}
fn core_memory_response_meaningful(response: &CoreValue) -> bool {
match response {
CoreValue::List(items) => items.borrow().iter().any(core_memory_response_meaningful),
CoreValue::Map(map) => {
let map = map.borrow();
if let Some(CoreValue::Str(content)) = map.get("content") {
if !content.trim().is_empty() {
return true;
}
}
for key in [
"function_calls",
"functionCalls",
"tool_calls",
"toolCalls",
"thought_blocks",
"thoughtBlocks",
] {
if let Some(CoreValue::List(items)) = map.get(key) {
if !items.borrow().is_empty() {
return true;
}
}
}
map.get("audio").is_some_and(|value| !value.is_null())
}
other => core_truthy(other),
}
}
impl CoreHost for CoreMemory {
fn host_type(&self) -> &'static str {
"AxMemory"
}
#[allow(clippy::all)]
fn call_method(&self, name: &str, args: &[CoreValue]) -> Result<CoreValue, AxError> {
match name {
"items" => Ok(CoreValue::List(self.items.clone())),
"add_request" => {
let item =
core_memory_entry("request", "messages", core_arg(args, 0), core_arg(args, 1))?;
self.items.borrow_mut().push(item);
Ok(CoreValue::Null)
}
"add_response" => {
let response = core_arg(args, 0);
if !core_memory_response_meaningful(&response) {
return Ok(CoreValue::Null);
}
let item = core_memory_entry("assistant", "response", response, core_arg(args, 1))?;
self.items.borrow_mut().push(item);
Ok(CoreValue::Null)
}
"update_result" => {
let session = core_arg(args, 1);
let item =
core_memory_entry("assistant", "response", core_arg(args, 0), session.clone())?;
{
let items = self.items.borrow();
for existing in items.iter().rev() {
let role = core_get(existing, &CoreValue::from("role"), CoreValue::Null);
let sid =
core_get(existing, &CoreValue::from("session_id"), CoreValue::Null);
if role.as_str() == Some("assistant") && sid == session {
if let (CoreValue::Map(dst), CoreValue::Map(src)) = (existing, &item) {
let entries = src.borrow().entries.clone();
for (key, value) in entries {
dst.borrow_mut().set(&key, value);
}
}
return Ok(CoreValue::Null);
}
}
}
self.items.borrow_mut().push(item);
Ok(CoreValue::Null)
}
"add_function_results" => {
let results = core_arg(args, 0);
let results = if matches!(results, CoreValue::List(_)) {
results
} else {
CoreValue::list_from(vec![results])
};
let item = core_memory_entry("function", "results", results, core_arg(args, 1))?;
self.items.borrow_mut().push(item);
Ok(CoreValue::Null)
}
"remove_by_tag" => {
let tag = core_arg(args, 0);
self.items
.borrow_mut()
.retain(|item| !core_memory_tags_contain(item, &tag));
Ok(CoreValue::Null)
}
"history" => {
let index = core_arg(args, 0);
if index.is_null() {
return Ok(CoreValue::list_from(self.items.borrow().clone()));
}
let matched: Vec<CoreValue> = self
.items
.borrow()
.iter()
.filter(|item| {
core_get(item, &CoreValue::from("index"), CoreValue::Null) == index
})
.cloned()
.collect();
Ok(CoreValue::list_from(matched))
}
"get_last" => {
let session = core_arg(args, 0);
let items = self.items.borrow();
for item in items.iter().rev() {
if session.is_null()
|| core_get(item, &CoreValue::from("session_id"), CoreValue::Null)
== session
{
return Ok(item.clone());
}
}
Ok(CoreValue::Null)
}
"add_tag" => {
let tag = core_arg(args, 0);
let items = self.items.borrow();
if let Some(last) = items.last() {
if matches!(last, CoreValue::Map(_)) {
let has_tags =
matches!(last, CoreValue::Map(map) if map.borrow().contains("tags"));
if !has_tags {
core_set(last, CoreValue::from("tags"), CoreValue::new_list())?;
}
let tags = core_get(last, &CoreValue::from("tags"), CoreValue::Null);
if let CoreValue::List(list) = &tags {
let exists = list.borrow().iter().any(|entry| *entry == tag);
if !exists {
list.borrow_mut().push(tag.clone());
}
}
}
}
Ok(CoreValue::Null)
}
"rewind_to_tag" => {
let tag = core_arg(args, 0);
let mut cut: Option<usize> = None;
{
let items = self.items.borrow();
for idx in (0..items.len()).rev() {
if core_memory_tags_contain(&items[idx], &tag) {
cut = Some(idx + 1);
break;
}
}
}
if let Some(end) = cut {
self.items.borrow_mut().truncate(end);
}
Ok(CoreValue::Null)
}
other => Err(AxError::runtime(format!(
"AxMemory has no method '{}'",
other
))),
}
}
}
// ----- Tool host -----
// Bridges the typed Tool struct into the CoreValue world. call_method("call")
// converts CoreValue params to JSON, invokes the handler, and converts the
// result back. The struct field backing "parameters" is Tool.args.
#[allow(dead_code)]
struct ToolHost {
tool: Rc<Tool>,
}
#[allow(dead_code)]
pub(crate) fn core_tool_host(tool: Tool) -> CoreValue {
CoreValue::Host(Rc::new(ToolHost {
tool: Rc::new(tool),
}))
}
impl CoreHost for ToolHost {
fn host_type(&self) -> &'static str {
"Tool"
}
fn call_method(&self, name: &str, args: &[CoreValue]) -> Result<CoreValue, AxError> {
match name {
"call" => {
let params = core_arg(args, 0);
let payload = if params.is_null() {
Value::Object(Map::new())
} else {
core_value_to_json(¶ms)
};
let result = self.tool.call(payload)?;
Ok(core_value_from_json(&result))
}
"name" => Ok(CoreValue::from(self.tool.name.as_str())),
"description" => Ok(CoreValue::from(self.tool.description.as_str())),
"parameters" | "args" => {
Ok(core_value_from_json(&Value::Object(self.tool.args.clone())))
}
other => Err(AxError::runtime(format!("Tool has no method '{}'", other))),
}
}
}
// ----- AI client scope -----
// The emitted flows receive an opaque "client" value, but the real chat
// callback lives on the host side as a &mut closure. with_core_client erases
// the borrow into a raw pointer for the dynamic extent of run(). SAFETY
// contract: the runtime is single-threaded, the pointer is only dereferenced
// by core_ai_complete_once while the with_core_client frame is alive (the
// guard pops it on unwind too), and the chat callback must not recursively
// re-enter core_ai_complete_once for the same frame.
thread_local! {
// The scoped client is a single method-dispatch closure (method, request) so chat AND
// transcribe share one &mut borrow of the typed client (two separate closures would be a
// borrow-check conflict). core_ai_complete_once calls it with "chat"; core_agent_transcribe
// with "transcribe". This keeps audio transcription emitted + uniform with the other four
// languages (which pass the real client directly).
static CORE_CLIENT_STACK: RefCell<Vec<*mut (dyn FnMut(&str, Value) -> AxResult<Value> + 'static)>> =
RefCell::new(Vec::new());
}
#[allow(dead_code)]
pub(crate) fn with_core_client<R>(
chat: &mut dyn FnMut(&str, Value) -> AxResult<Value>,
run: impl FnOnce() -> R,
) -> R {
struct CoreClientGuard;
impl Drop for CoreClientGuard {
fn drop(&mut self) {
CORE_CLIENT_STACK.with(|stack| {
stack.borrow_mut().pop();
});
}
}
// SAFETY: only the lifetime bound of the trait object changes; the fat
// pointer layout is identical, and the pointer never outlives this frame.
let erased: *mut (dyn FnMut(&str, Value) -> AxResult<Value> + 'static) =
unsafe { std::mem::transmute(chat) };
CORE_CLIENT_STACK.with(|stack| stack.borrow_mut().push(erased));
let _guard = CoreClientGuard;
run()
}
// python: _core_ai_complete_once(client, request). The client argument is
// ignored; the innermost with_core_client chat callback services the request.
#[allow(dead_code)]
pub(crate) fn core_ai_complete_once(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let request = core_arg(args, 1);
let top = CORE_CLIENT_STACK.with(|stack| stack.borrow().last().copied());
let ptr = match top {
Some(ptr) => ptr,
None => return Err(AxError::runtime("no AI client in scope")),
};
// SAFETY: single-threaded runtime; the pointer was pushed by an enclosing
// with_core_client frame that is still on the stack, so the borrow it was
// created from is still live. The RefCell borrow is released before the
// call so the callback may itself push a nested client.
let chat = unsafe { &mut *ptr };
let response = chat("chat", core_value_to_json(&request))?;
chat_response_to_completion(&[core_value_from_json(&response)])
}
// Backs intrinsic.agent.transcribe. Rust scopes the client as a chat/transcribe dispatch
// closure (the agent receives CoreValue::Null for %client), so we route "transcribe" through
// the same scoped closure core_ai_complete_once uses for "chat".
#[allow(dead_code)]
pub(crate) fn core_agent_transcribe(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let request = core_arg(args, 1);
let top = CORE_CLIENT_STACK.with(|stack| stack.borrow().last().copied());
match top {
Some(ptr) => {
let call = unsafe { &mut *ptr };
let response = call("transcribe", core_value_to_json(&request))?;
Ok(core_value_from_json(&response))
}
None => Ok(core_value_from_json(&json!({"text": ""}))),
}
}
// ----- Simple host-boundary intrinsics -----
// python float(x) for the operand shapes the IR produces.
#[allow(dead_code)]
fn core_float_cast(value: &CoreValue) -> Result<f64, AxError> {
match value {
CoreValue::Num(n) => Ok(*n),
CoreValue::Bool(b) => Ok(if *b { 1.0 } else { 0.0 }),
CoreValue::Str(s) => s
.trim()
.parse::<f64>()
.map_err(|_| AxError::runtime(format!("could not convert string to float: '{}'", s))),
other => Err(AxError::runtime(format!(
"float() argument is not a number: {}",
other.text()
))),
}
}
// python: float(left or 0) / float(right or 1)
#[allow(dead_code)]
fn core_div(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let left_raw = core_arg(args, 0);
let right_raw = core_arg(args, 1);
let left = if core_truthy(&left_raw) {
core_float_cast(&left_raw)?
} else {
0.0
};
let right = if core_truthy(&right_raw) {
core_float_cast(&right_raw)?
} else {
1.0
};
if right == 0.0 {
return Err(AxError::runtime("float division by zero"));
}
Ok(CoreValue::Num(left / right))
}
// python: str(error) -- AxError values render their message.
#[allow(dead_code)]
fn core_exception_message_text(error: &CoreValue) -> String {
match error {
CoreValue::Error(err) => err.message.clone(),
other => other.text(),
}
}
#[allow(dead_code)]
fn core_exception_message(args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::from_string(core_exception_message_text(
&core_arg(args, 0),
)))
}
#[allow(dead_code)]
fn core_map_keys(args: &[CoreValue]) -> Result<CoreValue, AxError> {
match core_arg(args, 0) {
CoreValue::Map(map) => Ok(CoreValue::list_from(
map.borrow()
.entries
.iter()
.map(|(key, _)| CoreValue::from(key.as_str()))
.collect(),
)),
_ => Ok(CoreValue::new_list()),
}
}
// Variant with the list fallback: dict -> values, otherwise list(values).
#[allow(dead_code)]
fn core_map_values(args: &[CoreValue]) -> Result<CoreValue, AxError> {
match core_arg(args, 0) {
CoreValue::Map(map) => Ok(CoreValue::list_from(
map.borrow()
.entries
.iter()
.map(|(_, value)| value.clone())
.collect(),
)),
CoreValue::List(items) => Ok(CoreValue::list_from(items.borrow().clone())),
CoreValue::Str(s) => Ok(CoreValue::list_from(
s.chars()
.map(|ch| CoreValue::from_string(ch.to_string()))
.collect(),
)),
_ => Ok(CoreValue::new_list()),
}
}
// python: time.sleep(min(0.25 * (int(attempt) + 1), 1.0))
#[allow(dead_code)]
fn core_retry_sleep(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let attempt = match core_arg(args, 0) {
CoreValue::Num(n) => n as i64,
CoreValue::Bool(b) => {
if b {
1
} else {
0
}
}
CoreValue::Str(s) => s
.trim()
.parse::<i64>()
.map_err(|_| AxError::runtime(format!("invalid literal for int(): '{}'", s)))?,
other => {
return Err(AxError::runtime(format!(
"int() argument is not a number: {}",
other.text()
)))
}
};
let seconds = (0.25 * ((attempt + 1) as f64)).min(1.0).max(0.0);
std::thread::sleep(Duration::from_secs_f64(seconds));
Ok(CoreValue::Null)
}
// python: getattr(target, str(method_name))(*args)
#[allow(dead_code)]
fn core_object_call_method(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let target = core_arg(args, 0);
let method = core_arg(args, 1).text();
match &target {
CoreValue::Host(host) => host.call_method(&method, args.get(2..).unwrap_or(&[])),
other => Err(AxError::runtime(format!(
"object of type {} has no callable method '{}'",
other.text(),
method
))),
}
}
// python: fn.call(params or {})
#[allow(dead_code)]
fn core_tool_invoke(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let target = core_arg(args, 0);
let params = core_arg(args, 1);
let params = if core_truthy(¶ms) {
params
} else {
CoreValue::new_map()
};
let host = match &target {
CoreValue::Host(_) => target.clone(),
CoreValue::Map(_) => core_get(&target, &CoreValue::from("__tool_host"), CoreValue::Null),
_ => CoreValue::Null,
};
match host {
CoreValue::Host(host) => host.call_method("call", &[params]),
_ => Err(AxError::runtime(
"intrinsic.tool.invoke target is not a tool",
)),
}
}
// ----- AxGen helper family -----
// Shared shape: gen is a CoreValue map carrying the python attribute names
// (options, memory, chat_log, examples, demos, assertions, field_processors,
// traces, function_call_traces, stop_functions, streaming_assertions,
// signature).
// python: xs or [] then iteration (lists iterate items, dicts iterate keys).
#[allow(dead_code)]
fn core_axgen_iter_or_empty(value: &CoreValue) -> Result<Vec<CoreValue>, AxError> {
if !core_truthy(value) {
return Ok(Vec::new());
}
core_iter(value)
}
// python: dict(x) shallow copy; non-map inputs yield an empty map.
#[allow(dead_code)]
fn core_axgen_map_copy(value: &CoreValue) -> CoreValue {
let out = CoreValue::new_map();
if let (CoreValue::Map(dst), CoreValue::Map(src)) = (&out, value) {
let entries = src.borrow().entries.clone();
for (key, item) in entries {
dst.borrow_mut().set(&key, item);
}
}
out
}
#[allow(dead_code)]
fn core_axgen_map_from(entries: &[(&str, CoreValue)]) -> Result<CoreValue, AxError> {
let out = CoreValue::new_map();
for (key, value) in entries {
core_set(&out, CoreValue::from(*key), value.clone())?;
}
Ok(out)
}
// hasattr(memory, "items") followed by memory.items access: only the memory
// host (or a map that carries an "items" list) exposes the shared item list.
#[allow(dead_code)]
fn core_axgen_memory_items(memory: &CoreValue) -> Option<CoreValue> {
match memory {
CoreValue::Host(host) => match host.call_method("items", &[]) {
Ok(items @ CoreValue::List(_)) => Some(items),
_ => None,
},
CoreValue::Map(map) => match map.borrow().get("items") {
Some(items @ CoreValue::List(_)) => Some(items),
_ => None,
},
_ => None,
}
}
// Recursive key sort so core_python_dumps matches json.dumps(sort_keys=True).
#[allow(dead_code)]
fn core_axgen_sorted_json(value: &Value) -> Value {
match value {
Value::Array(items) => Value::Array(items.iter().map(core_axgen_sorted_json).collect()),
Value::Object(map) => {
let mut keys: Vec<&String> = map.keys().collect();
keys.sort();
let mut out = Map::new();
for key in keys {
if let Some(item) = map.get(key) {
out.insert(key.clone(), core_axgen_sorted_json(item));
}
}
Value::Object(out)
}
other => other.clone(),
}
}
// python: value if isinstance(value, str) else json.dumps(value, sort_keys=True)
#[allow(dead_code)]
fn core_axgen_value_text_impl(value: &CoreValue) -> String {
if let Some(text) = value.as_str() {
return text.to_string();
}
core_python_dumps(&core_axgen_sorted_json(&core_value_to_json(value)))
}
#[allow(dead_code)]
fn core_axgen_value_text(args: &[CoreValue]) -> Result<CoreValue, AxError> {
Ok(CoreValue::from_string(core_axgen_value_text_impl(
&core_arg(args, 0),
)))
}
// python: list(_core_get(gen.signature, f"{kind}_fields", []) or [])
#[allow(dead_code)]
fn core_axgen_fields_for_impl(gen: &CoreValue, kind: &str) -> Result<Vec<CoreValue>, AxError> {
let sig = core_get(gen, &CoreValue::from("signature"), CoreValue::Null);
let key = format!("{}_fields", kind);
let fields = core_get(&sig, &CoreValue::from(key.as_str()), CoreValue::Null);
core_axgen_iter_or_empty(&fields)
}
#[allow(dead_code)]
fn core_axgen_fields_for(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let gen = core_arg(args, 0);
let kind = core_arg(args, 1).text();
Ok(CoreValue::list_from(core_axgen_fields_for_impl(
&gen, &kind,
)?))
}
#[allow(dead_code)]
#[allow(clippy::all)]
fn core_axgen_format_values_impl(
gen: &CoreValue,
values: &CoreValue,
kind: &str,
) -> Result<String, AxError> {
let values = if core_truthy(values) {
values.clone()
} else {
CoreValue::new_map()
};
let fields = core_axgen_fields_for_impl(gen, kind)?;
let mut lines: Vec<String> = Vec::new();
for field in &fields {
let name = core_get(field, &CoreValue::from("name"), CoreValue::Null);
let present = match name.as_str() {
Some(key) => {
matches!(&values, CoreValue::Map(map) if map.borrow().contains(key))
}
None => false,
};
if present {
let title = core_get(field, &CoreValue::from("title"), name.clone());
let value = core_get(&values, &name, CoreValue::Null);
lines.push(format!(
"{}: {}",
title.text(),
core_axgen_value_text_impl(&value)
));
}
}
if lines.is_empty() {
if let CoreValue::Map(map) = &values {
let entries = map.borrow().entries.clone();
for (name, value) in entries {
lines.push(format!("{}: {}", name, core_axgen_value_text_impl(&value)));
}
}
}
Ok(lines.join("\n"))
}
#[allow(dead_code)]
fn core_axgen_format_values(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let gen = core_arg(args, 0);
let values = core_arg(args, 1);
let kind = core_arg(args, 2).text();
Ok(CoreValue::from_string(core_axgen_format_values_impl(
&gen, &values, &kind,
)?))
}
#[allow(dead_code)]
fn core_axgen_example_turn_impl(
gen: &CoreValue,
label: &str,
item: &CoreValue,
) -> Result<(CoreValue, CoreValue), AxError> {
let item = if core_truthy(item) {
item.clone()
} else {
CoreValue::new_map()
};
let inp = core_get(
&item,
&CoreValue::from("input"),
core_get(&item, &CoreValue::from("values"), CoreValue::new_map()),
);
let out = core_get(
&item,
&CoreValue::from("output"),
core_get(
&item,
&CoreValue::from("expected_output"),
CoreValue::new_map(),
),
);
let user = core_axgen_map_from(&[
("role", CoreValue::from("user")),
(
"content",
CoreValue::from_string(format!(
"{} Input:\n{}",
label,
core_axgen_format_values_impl(gen, &inp, "input")?
)),
),
])?;
let assistant = core_axgen_map_from(&[
("role", CoreValue::from("assistant")),
(
"content",
CoreValue::from_string(format!(
"{} Output:\n{}",
label,
core_axgen_format_values_impl(gen, &out, "output")?
)),
),
])?;
Ok((user, assistant))
}
#[allow(dead_code)]
fn core_axgen_example_turn(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let gen = core_arg(args, 0);
let label = core_arg(args, 1).text();
let item = core_arg(args, 2);
let (user, assistant) = core_axgen_example_turn_impl(&gen, &label, &item)?;
Ok(CoreValue::list_from(vec![user, assistant]))
}
// python: skip demo items where (item or {}).get("input", (item or {}).get("values")) is falsy
#[allow(dead_code)]
fn core_axgen_demo_has_input(item: &CoreValue) -> bool {
let item = if core_truthy(item) {
item.clone()
} else {
CoreValue::new_map()
};
let gate = core_get(
&item,
&CoreValue::from("input"),
core_get(&item, &CoreValue::from("values"), CoreValue::Null),
);
core_truthy(&gate)
}
#[allow(dead_code)]
fn core_axgen_render_examples(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let gen = core_arg(args, 0);
let options = core_get(&gen, &CoreValue::from("options"), CoreValue::new_map());
let in_system = core_get(
&options,
&CoreValue::from("examplesInSystem"),
CoreValue::Bool(false),
);
if core_truthy(&in_system) {
return Ok(CoreValue::new_list());
}
let messages = CoreValue::new_list();
let examples = core_get(&gen, &CoreValue::from("examples"), CoreValue::Null);
for item in core_axgen_iter_or_empty(&examples)? {
let (user, assistant) = core_axgen_example_turn_impl(&gen, "Example", &item)?;
core_append(&messages, user)?;
core_append(&messages, assistant)?;
}
Ok(messages)
}
#[allow(dead_code)]
fn core_axgen_render_demos(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let gen = core_arg(args, 0);
let options = core_get(&gen, &CoreValue::from("options"), CoreValue::new_map());
let in_system = core_get(
&options,
&CoreValue::from("examplesInSystem"),
CoreValue::Bool(false),
);
if core_truthy(&in_system) {
return Ok(CoreValue::new_list());
}
let messages = CoreValue::new_list();
let demos = core_get(&gen, &CoreValue::from("demos"), CoreValue::Null);
for item in core_axgen_iter_or_empty(&demos)? {
if !core_axgen_demo_has_input(&item) {
continue;
}
let (user, assistant) = core_axgen_example_turn_impl(&gen, "Demo", &item)?;
core_append(&messages, user)?;
core_append(&messages, assistant)?;
}
Ok(messages)
}
#[allow(dead_code)]
#[allow(clippy::all)]
fn core_axgen_apply_context_cache(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let gen = core_arg(args, 0);
let raw_messages = core_arg(args, 1);
let runtime_options = core_arg(args, 2);
// messages = [dict(item) if isinstance(item, dict) else item ...]
let mut messages: Vec<CoreValue> = Vec::new();
for item in core_axgen_iter_or_empty(&raw_messages)? {
if matches!(item, CoreValue::Map(_)) {
messages.push(core_axgen_map_copy(&item));
} else {
messages.push(item);
}
}
// options = {**(gen.options or {}), **(runtime_options or {})}
let options = CoreValue::new_map();
for source in [
core_get(&gen, &CoreValue::from("options"), CoreValue::Null),
runtime_options,
] {
if let (CoreValue::Map(dst), CoreValue::Map(src)) = (&options, &source) {
let entries = src.borrow().entries.clone();
for (key, value) in entries {
dst.borrow_mut().set(&key, value);
}
}
}
let examples_in_system = core_get(
&options,
&CoreValue::from("examplesInSystem"),
CoreValue::Null,
);
if core_truthy(&examples_in_system) && !messages.is_empty() {
let mut blocks: Vec<String> = Vec::new();
let examples = core_get(&gen, &CoreValue::from("examples"), CoreValue::Null);
for item in core_axgen_iter_or_empty(&examples)? {
let (user, assistant) = core_axgen_example_turn_impl(&gen, "Example", &item)?;
for message in [user, assistant] {
blocks.push(
core_get(&message, &CoreValue::from("content"), CoreValue::from("")).text(),
);
}
}
let demos = core_get(&gen, &CoreValue::from("demos"), CoreValue::Null);
for item in core_axgen_iter_or_empty(&demos)? {
if !core_axgen_demo_has_input(&item) {
continue;
}
let (user, assistant) = core_axgen_example_turn_impl(&gen, "Demo", &item)?;
for message in [user, assistant] {
blocks.push(
core_get(&message, &CoreValue::from("content"), CoreValue::from("")).text(),
);
}
}
if !blocks.is_empty() && matches!(&messages[0], CoreValue::Map(_)) {
let current = core_get(
&messages[0],
&CoreValue::from("content"),
CoreValue::from(""),
)
.text();
core_set(
&messages[0],
CoreValue::from("content"),
CoreValue::from_string(format!(
"{}\n\n--- EXAMPLES ---\n{}\n--- END OF EXAMPLES ---",
current,
blocks.join("\n\n")
)),
)?;
}
}
let context_cache = core_get(
&options,
&CoreValue::from("context_cache"),
core_get(&options, &CoreValue::from("contextCache"), CoreValue::Null),
);
let ignore_breakpoints = core_get(
&options,
&CoreValue::from("ignore_cache_breakpoints"),
CoreValue::Null,
);
if !core_truthy(&context_cache) || core_truthy(&ignore_breakpoints) {
return Ok(CoreValue::list_from(messages));
}
if let Some(first) = messages.first() {
if matches!(first, CoreValue::Map(_)) {
core_set(first, CoreValue::from("cache"), CoreValue::Bool(true))?;
}
}
let breakpoint = if matches!(&context_cache, CoreValue::Map(_)) {
// python or-chain over breakpoint key spellings
let mut value = core_get(
&context_cache,
&CoreValue::from("breakpoint"),
CoreValue::Null,
);
if !core_truthy(&value) {
value = core_get(
&context_cache,
&CoreValue::from("cache_breakpoint"),
CoreValue::Null,
);
}
if !core_truthy(&value) {
value = core_get(
&context_cache,
&CoreValue::from("cacheBreakpoint"),
CoreValue::Null,
);
}
value
} else {
CoreValue::from("after_examples")
};
let breakpoint_matches = breakpoint.is_null()
|| matches!(
breakpoint.as_str(),
Some("after_examples") | Some("afterExamples")
);
if breakpoint_matches && messages.len() > 2 {
for idx in (0..=messages.len() - 2).rev() {
let role = core_get(&messages[idx], &CoreValue::from("role"), CoreValue::Null);
if matches!(role.as_str(), Some("assistant") | Some("tool")) {
core_set(
&messages[idx],
CoreValue::from("cache"),
CoreValue::Bool(true),
)?;
break;
}
}
}
Ok(CoreValue::list_from(messages))
}
#[allow(dead_code)]
#[allow(clippy::all)]
fn core_axgen_apply_field_processors(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let gen = core_arg(args, 0);
let output = core_arg(args, 1);
let mut result = core_axgen_map_copy(&if core_truthy(&output) {
output
} else {
CoreValue::new_map()
});
let mut changed = false;
let specs = core_get(&gen, &CoreValue::from("field_processors"), CoreValue::Null);
for spec in core_axgen_iter_or_empty(&specs)? {
// callable(spec): whole-output processor
if let CoreValue::Host(host) = &spec {
let processed = host.call_method("call", &[core_axgen_map_copy(&result)])?;
if !processed.is_null() {
result = core_axgen_map_copy(&processed);
changed = true;
}
continue;
}
// field = spec.get("field") or spec.get("name")
let mut field = core_get(&spec, &CoreValue::from("field"), CoreValue::Null);
if !core_truthy(&field) {
field = core_get(&spec, &CoreValue::from("name"), CoreValue::Null);
}
if !core_truthy(&field) {
continue;
}
let field_key = field.text();
let present = matches!(&result, CoreValue::Map(map) if map.borrow().contains(&field_key));
if !present {
continue;
}
let processor = core_get(
&spec,
&CoreValue::from("processor"),
core_get(&spec, &CoreValue::from("op"), CoreValue::Null),
);
if let CoreValue::Host(host) = &processor {
let current = core_get(&result, &field, CoreValue::Null);
let updated = host.call_method("call", &[current])?;
core_set(&result, field.clone(), updated)?;
changed = true;
continue;
}
let op = processor.text();
let value = core_get(&result, &field, CoreValue::Null);
if op == "uppercase" {
core_set(
&result,
field.clone(),
CoreValue::from_string(value.text().to_uppercase()),
)?;
changed = true;
} else if op == "lowercase" {
core_set(
&result,
field.clone(),
CoreValue::from_string(value.text().to_lowercase()),
)?;
changed = true;
} else if op == "trim" {
core_set(
&result,
field.clone(),
CoreValue::from_string(value.text().trim().to_string()),
)?;
changed = true;
} else if let Some(prefix) = op.strip_prefix("prefix:") {
core_set(
&result,
field.clone(),
CoreValue::from_string(format!("{}{}", prefix, value.text())),
)?;
changed = true;
} else if let Some(suffix) = op.strip_prefix("suffix:") {
core_set(
&result,
field.clone(),
CoreValue::from_string(format!("{}{}", value.text(), suffix)),
)?;
changed = true;
}
}
if changed {
let memory = core_get(&gen, &CoreValue::from("memory"), CoreValue::Null);
if let Some(items) = core_axgen_memory_items(&memory) {
let entry = core_axgen_map_from(&[
("role", CoreValue::from("processor")),
("output", core_axgen_map_copy(&result)),
(
"tags",
CoreValue::list_from(vec![CoreValue::from("processor")]),
),
])?;
core_append(&items, entry)?;
}
}
Ok(result)
}
#[allow(dead_code)]
#[allow(clippy::all)]
fn core_axgen_run_assertions(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let gen = core_arg(args, 0);
let output = core_arg(args, 1);
let assertions = core_get(&gen, &CoreValue::from("assertions"), CoreValue::Null);
for assertion in core_axgen_iter_or_empty(&assertions)? {
if let CoreValue::Host(host) = &assertion {
let result = host.call_method("call", &[output.clone()])?;
if let Some(text) = result.as_str() {
return Err(AxError::runtime(text));
}
if result == CoreValue::Bool(false) {
return Err(AxError::runtime("assertion failed"));
}
continue;
}
let field = core_get(&assertion, &CoreValue::from("field"), CoreValue::Null);
let value = if core_truthy(&field) {
core_get(&output, &field, CoreValue::Null)
} else {
output.clone()
};
let mut message = core_get(&assertion, &CoreValue::from("message"), CoreValue::Null);
if !core_truthy(&message) {
message = CoreValue::from("assertion failed");
}
let has_return =
matches!(&assertion, CoreValue::Map(map) if map.borrow().contains("return"));
if has_return {
let returned = core_get(&assertion, &CoreValue::from("return"), CoreValue::Null);
if returned.is_null() {
continue;
}
let has_message =
matches!(&assertion, CoreValue::Map(map) if map.borrow().contains("message"));
if returned == CoreValue::Bool(false) && !has_message {
return Err(AxError::runtime("assertion failed without message"));
}
if returned == CoreValue::Bool(false) {
return Err(AxError::runtime(message.text()));
}
if let Some(text) = returned.as_str() {
return Err(AxError::runtime(text));
}
}
let has_contains =
matches!(&assertion, CoreValue::Map(map) if map.borrow().contains("contains"));
if has_contains {
let needle = core_get(&assertion, &CoreValue::from("contains"), CoreValue::Null);
if !value.text().contains(&needle.text()) {
return Err(AxError::runtime(message.text()));
}
}
let has_equals =
matches!(&assertion, CoreValue::Map(map) if map.borrow().contains("equals"));
if has_equals {
let expected = core_get(&assertion, &CoreValue::from("equals"), CoreValue::Null);
if value != expected {
return Err(AxError::runtime(message.text()));
}
}
}
Ok(CoreValue::Null)
}
#[allow(dead_code)]
#[allow(clippy::all)]
fn core_axgen_run_streaming_assertions(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let gen = core_arg(args, 0);
let content = core_arg(args, 1);
let assertions = core_get(
&gen,
&CoreValue::from("streaming_assertions"),
CoreValue::Null,
);
for assertion in core_axgen_iter_or_empty(&assertions)? {
if let CoreValue::Host(host) = &assertion {
let result = host.call_method("call", &[content.clone()])?;
if let Some(text) = result.as_str() {
return Err(AxError::runtime(text));
}
if result == CoreValue::Bool(false) {
return Err(AxError::runtime("streaming assertion failed"));
}
continue;
}
if !matches!(&assertion, CoreValue::Map(_)) {
continue;
}
let needle = core_get(
&assertion,
&CoreValue::from("not_contains"),
core_get(&assertion, &CoreValue::from("notContains"), CoreValue::Null),
);
if needle.is_null() {
continue;
}
let mut message = core_get(&assertion, &CoreValue::from("message"), CoreValue::Null);
if !core_truthy(&message) {
let field = core_get(&assertion, &CoreValue::from("field"), CoreValue::Null);
message = CoreValue::from_string(format!(
"streaming assertion failed for field '{}'",
field.text()
));
}
if content.text().contains(&needle.text()) {
return Err(AxError::runtime(message.text()));
}
}
Ok(CoreValue::Null)
}
#[allow(dead_code)]
fn core_axgen_record_trace(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let gen = core_arg(args, 0);
let values = core_arg(args, 1);
let output = core_arg(args, 2);
let status = core_arg(args, 3);
let traces = core_get(&gen, &CoreValue::from("traces"), CoreValue::new_list());
let chat_log = core_get(&gen, &CoreValue::from("chat_log"), CoreValue::Null);
let function_calls = core_get(
&gen,
&CoreValue::from("function_call_traces"),
CoreValue::Null,
);
let entry = core_axgen_map_from(&[
("status", status),
("input", values),
("output", output),
(
"chat_log",
CoreValue::list_from(core_axgen_iter_or_empty(&chat_log)?),
),
(
"function_calls",
CoreValue::list_from(core_axgen_iter_or_empty(&function_calls)?),
),
])?;
core_append(&traces, entry)?;
Ok(CoreValue::Null)
}
#[allow(dead_code)]
fn core_axgen_should_continue_steps(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let gen = core_arg(args, 0);
let calls = core_arg(args, 1);
let stops = core_axgen_iter_or_empty(&core_get(
&gen,
&CoreValue::from("stop_functions"),
CoreValue::Null,
))?;
if stops.is_empty() {
return Ok(CoreValue::Bool(true));
}
for call in core_axgen_iter_or_empty(&calls)? {
let fallback = core_get(&call, &CoreValue::from("name"), CoreValue::Null);
let function = core_get(&call, &CoreValue::from("function"), CoreValue::new_map());
let name = core_get(&function, &CoreValue::from("name"), fallback);
if stops.iter().any(|stop| *stop == name) {
return Ok(CoreValue::Bool(false));
}
}
Ok(CoreValue::Bool(true))
}
#[allow(dead_code)]
fn core_axgen_memory_add_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let gen = core_arg(args, 0);
let messages = core_arg(args, 1);
let memory = core_get(&gen, &CoreValue::from("memory"), CoreValue::Null);
if let CoreValue::Host(host) = &memory {
host.call_method("add_request", &[messages])?;
}
Ok(CoreValue::Null)
}
#[allow(dead_code)]
fn core_axgen_memory_add_response(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let gen = core_arg(args, 0);
let response = core_arg(args, 2);
let memory = core_get(&gen, &CoreValue::from("memory"), CoreValue::Null);
if let CoreValue::Host(host) = &memory {
host.call_method("add_response", &[response])?;
}
Ok(CoreValue::Null)
}
#[allow(dead_code)]
fn core_axgen_memory_add_function_result(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let gen = core_arg(args, 0);
let call = core_arg(args, 1);
let result = core_arg(args, 2);
let ok = core_arg(args, 3);
let memory = core_get(&gen, &CoreValue::from("memory"), CoreValue::Null);
if let CoreValue::Host(host) = &memory {
let payload = core_axgen_map_from(&[
("call", call),
("result", result),
("ok", CoreValue::Bool(core_truthy(&ok))),
])?;
host.call_method("add_function_results", &[payload])?;
}
Ok(CoreValue::Null)
}
#[allow(dead_code)]
fn core_axgen_memory_add_correction(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let gen = core_arg(args, 0);
let response = core_arg(args, 1);
let error = core_arg(args, 2);
let memory = core_get(&gen, &CoreValue::from("memory"), CoreValue::Null);
if let Some(items) = core_axgen_memory_items(&memory) {
let entry = core_axgen_map_from(&[
("role", CoreValue::from("user")),
(
"content",
CoreValue::from_string(format!(
"Correction: {}",
core_exception_message_text(&error)
)),
),
("response", response),
(
"tags",
CoreValue::list_from(vec![CoreValue::from("correction")]),
),
])?;
core_append(&items, entry)?;
}
Ok(CoreValue::Null)
}
#[allow(dead_code)]
fn core_axgen_memory_cleanup_corrections(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let gen = core_arg(args, 0);
let memory = core_get(&gen, &CoreValue::from("memory"), CoreValue::Null);
if let CoreValue::Host(host) = &memory {
host.call_method("remove_by_tag", &[CoreValue::from("correction")])?;
}
Ok(CoreValue::Null)
}
#[allow(dead_code)]
fn core_axgen_record_chat_log(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let gen = core_arg(args, 0);
let request = core_arg(args, 1);
let response = core_arg(args, 2);
let chat_log = core_get(&gen, &CoreValue::from("chat_log"), CoreValue::new_list());
let entry = core_axgen_map_from(&[
(
"model",
core_get(&request, &CoreValue::from("model"), CoreValue::Null),
),
(
"messages",
core_get(
&request,
&CoreValue::from("chat_prompt"),
CoreValue::new_list(),
),
),
("response", response.clone()),
(
"remote_id",
core_get(
&response,
&CoreValue::from("remote_id"),
core_get(&response, &CoreValue::from("id"), CoreValue::Null),
),
),
(
"session_id",
core_get(&response, &CoreValue::from("session_id"), CoreValue::Null),
),
(
"usage",
core_get(
&response,
&CoreValue::from("usage"),
core_get(&response, &CoreValue::from("model_usage"), CoreValue::Null),
),
),
(
"function_calls",
core_get(
&response,
&CoreValue::from("function_calls"),
CoreValue::new_list(),
),
),
])?;
core_append(&chat_log, entry)?;
Ok(CoreValue::Null)
}
#[allow(dead_code)]
fn core_axgen_record_function_call(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let gen = core_arg(args, 0);
let call = core_arg(args, 1);
let result = core_arg(args, 2);
let status = core_arg(args, 3);
let traces = core_get(
&gen,
&CoreValue::from("function_call_traces"),
CoreValue::new_list(),
);
let function = core_get(&call, &CoreValue::from("function"), CoreValue::new_map());
let record = core_axgen_map_from(&[
(
"name",
core_get(
&call,
&CoreValue::from("name"),
core_get(&function, &CoreValue::from("name"), CoreValue::Null),
),
),
(
"id",
core_get(&call, &CoreValue::from("id"), CoreValue::Null),
),
(
"args",
core_get(
&call,
&CoreValue::from("params"),
core_get(&call, &CoreValue::from("args"), CoreValue::new_map()),
),
),
("status", status),
("result", result),
])?;
core_append(&traces, record.clone())?;
let options = core_get(&gen, &CoreValue::from("options"), CoreValue::new_map());
let hook = core_get(
&options,
&CoreValue::from("on_function_call"),
core_get(
&options,
&CoreValue::from("onFunctionCall"),
CoreValue::Null,
),
);
if let CoreValue::Host(host) = &hook {
// python wraps the hook in try/except Exception: pass
let _ = host.call_method("call", &[record]);
}
Ok(CoreValue::Null)
}
// ----- END AXIR CORE GEN ENGINE -----
fn core_gen_state(gen: &AxGen) -> Result<CoreValue, AxError> {
let state = CoreValue::new_map();
core_set(
&state,
CoreValue::from("signature"),
core_signature_value(&gen.signature)?,
)?;
core_set(
&state,
CoreValue::from("options"),
core_value_from_json(&gen.options),
)?;
let tools = CoreValue::new_list();
for tool in &gen.tools {
let entry = core_tool_host(tool.clone());
let map = CoreValue::new_map();
core_set(&map, CoreValue::from("name"), entry_method(&entry, "name"))?;
core_set(
&map,
CoreValue::from("description"),
entry_method(&entry, "description"),
)?;
core_set(
&map,
CoreValue::from("args"),
core_tool_args_fields(&tool.args)?,
)?;
core_set(&map, CoreValue::from("__tool_host"), entry)?;
core_append(&tools, map)?;
}
core_set(&state, CoreValue::from("tools"), tools.clone())?;
core_set(&state, CoreValue::from("functions"), tools.clone())?;
core_set(
&state,
CoreValue::from("prompt_template"),
CoreValue::Host(Rc::new(GenPromptHost {
signature: core_get(&state, &CoreValue::from("signature"), CoreValue::Null),
tools,
options: core_value_from_json(&gen.options),
})),
)?;
for (key, items) in [
("assertions", &gen.assertions),
("examples", &gen.examples),
("demos", &gen.demos),
("field_processors", &gen.field_processors),
] {
core_set(
&state,
CoreValue::from(key),
core_value_from_json(&Value::Array(items.clone())),
)?;
}
core_set(
&state,
CoreValue::from("stop_functions"),
CoreValue::list_from(
gen.stop_functions
.iter()
.map(|s| CoreValue::from(s.as_str()))
.collect(),
),
)?;
let memory = core_memory_new();
if let CoreValue::Host(host) = &memory {
let items = host.call_method("items", &[])?;
for item in &gen.memory {
core_append(&items, core_value_from_json(item))?;
}
}
core_set(&state, CoreValue::from("memory"), memory)?;
for key in ["chat_log", "traces", "function_call_traces"] {
core_set(&state, CoreValue::from(key), CoreValue::new_list())?;
}
Ok(state)
}
fn entry_method(host: &CoreValue, name: &str) -> CoreValue {
match host {
CoreValue::Host(h) => h.call_method(name, &[]).unwrap_or(CoreValue::Null),
_ => CoreValue::Null,
}
}
fn core_gen_writeback(gen: &mut AxGen, state: &CoreValue) {
for (key, target) in [
("chat_log", &mut gen.chat_log as *mut Vec<Value>),
("traces", &mut gen.traces as *mut Vec<Value>),
(
"function_call_traces",
&mut gen.function_call_traces as *mut Vec<Value>,
),
] {
let list = core_get(state, &CoreValue::from(key), CoreValue::Null);
if let Value::Array(items) = core_value_to_json(&list) {
unsafe { (*target).extend(items) };
}
}
let memory = core_get(state, &CoreValue::from("memory"), CoreValue::Null);
if let CoreValue::Host(host) = memory {
if let Ok(items) = host.call_method("items", &[]) {
if let Value::Array(items) = core_value_to_json(&items) {
gen.memory = items;
}
}
}
}
struct GenPromptHost {
signature: CoreValue,
tools: CoreValue,
options: CoreValue,
}
impl CoreHost for GenPromptHost {
fn host_type(&self) -> &'static str {
"AxPromptTemplate"
}
fn call_method(&self, name: &str, args: &[CoreValue]) -> Result<CoreValue, AxError> {
match name {
"render" => render_prompt(&[
self.signature.clone(),
core_arg(args, 0),
self.tools.clone(),
self.options.clone(),
]),
other => Err(AxError::runtime(format!(
"AxPromptTemplate has no callable method '{other}'"
))),
}
}
}
fn core_tool_args_fields(args: &Map<String, Value>) -> Result<CoreValue, AxError> {
let fields = CoreValue::new_list();
for (arg_name, payload) in args {
let values = CoreValue::new_map();
core_set(
&values,
CoreValue::from("name"),
CoreValue::from(arg_name.as_str()),
)?;
core_set(
&values,
CoreValue::from("type"),
core_field_type_value(&field_type_from_payload(payload))?,
)?;
core_append(
&fields,
core_record_new(&[CoreValue::from("Field"), values])?,
)?;
}
Ok(fields)
}
struct RawScopedClient(*mut dyn FnMut(&str, Value) -> AxResult<Value>);
impl AxAIClient for RawScopedClient {
fn chat(&mut self, request: Value) -> AxResult<Value> {
// SAFETY: the pointer was captured from the client stack inside the
// enclosing with_core_client scope, which outlives this call.
let call = unsafe { &mut *self.0 };
call("chat", request)
}
fn transcribe(&mut self, request: Value) -> AxResult<Value> {
let call = unsafe { &mut *self.0 };
call("transcribe", request)
}
}
fn core_scoped_client() -> AxResult<RawScopedClient> {
let top = CORE_CLIENT_STACK.with(|stack| stack.borrow().last().copied());
match top {
Some(ptr) => Ok(RawScopedClient(ptr)),
None => Err(AxError::runtime("no AI client in scope")),
}
}
pub(crate) struct GenHost {
gen: Rc<RefCell<AxGen>>,
}
impl GenHost {
pub(crate) fn new(gen: AxGen) -> CoreValue {
CoreValue::Host(Rc::new(GenHost {
gen: Rc::new(RefCell::new(gen)),
}))
}
}
impl CoreHost for GenHost {
fn host_type(&self) -> &'static str {
"AxGen"
}
fn stage_gen_rc(&self) -> Option<Rc<RefCell<AxGen>>> {
Some(self.gen.clone())
}
fn call_method(&self, name: &str, args: &[CoreValue]) -> Result<CoreValue, AxError> {
match name {
"forward" => {
let values = core_value_to_json(&core_arg(args, 1));
let options = core_value_to_json(&core_arg(args, 2));
let mut client = core_scoped_client()?;
let output =
self.gen
.borrow_mut()
.forward_with_options(&mut client, values, options)?;
Ok(core_value_from_json(&output))
}
"get_chat_log" => Ok(core_value_from_json(&Value::Array(
self.gen.borrow().chat_log.clone(),
))),
"get_traces" => Ok(core_value_from_json(&Value::Array(
self.gen.borrow().traces.clone(),
))),
"get_optimizable_components" => Ok(core_value_from_json(&Value::Array(
self.gen.borrow().get_optimizable_components(),
))),
"apply_optimized_components" => {
let component_map = core_value_to_json(&core_arg(args, 0));
self.gen
.borrow_mut()
.apply_optimized_components(&component_map)?;
Ok(CoreValue::Null)
}
"set_demos" => {
let demos = core_value_to_json(&core_arg(args, 0));
self.gen
.borrow_mut()
.set_demos(demos.as_array().cloned().unwrap_or_default());
Ok(CoreValue::Null)
}
other => Err(AxError::runtime(format!(
"object of type AxGen has no callable method '{other}'"
))),
}
}
}
// Host wrapper exposing an AxFlow as a flow-step / optimizer program, the
// same surface python reaches through duck typing on the AxFlow class.
pub(crate) struct FlowHost {
flow: RefCell<AxFlow>,
}
impl FlowHost {
pub(crate) fn new(flow: AxFlow) -> CoreValue {
CoreValue::Host(Rc::new(FlowHost {
flow: RefCell::new(flow),
}))
}
}
impl CoreHost for FlowHost {
fn host_type(&self) -> &'static str {
"AxFlow"
}
fn call_method(&self, name: &str, args: &[CoreValue]) -> Result<CoreValue, AxError> {
match name {
"forward" => {
let values = core_arg(args, 1);
let options = core_arg(args, 2);
let state = self.flow.borrow().state.clone();
let result = _flow_forward(&[state, CoreValue::Null, values, options])?;
Ok(result)
}
"get_chat_log" => Ok(core_get(
&self.flow.borrow().state,
&CoreValue::from("chat_log"),
CoreValue::new_list(),
)),
"get_traces" => Ok(core_get(
&self.flow.borrow().state,
&CoreValue::from("traces"),
CoreValue::new_list(),
)),
"get_usage" => Ok(core_get(
&self.flow.borrow().state,
&CoreValue::from("usage"),
CoreValue::Null,
)),
"get_optimizable_components" => {
let state = self.flow.borrow().state.clone();
_flow_get_optimizable_components(&[state])
}
"apply_optimized_components" => {
let state = self.flow.borrow().state.clone();
_flow_apply_optimized_components(&[state, core_arg(args, 0)])?;
Ok(CoreValue::Null)
}
"set_demos" => {
let demos = core_value_to_json(&core_arg(args, 0));
self.flow.borrow_mut().set_demos(&demos)?;
Ok(CoreValue::Null)
}
other => Err(AxError::runtime(format!(
"object of type AxFlow has no callable method '{other}'"
))),
}
}
}
// Host wrapper exposing an AxAgent as a flow-step program.
pub(crate) struct AgentHost {
agent: RefCell<AxAgent>,
}
impl AgentHost {
pub(crate) fn new(agent: AxAgent) -> CoreValue {
CoreValue::Host(Rc::new(AgentHost {
agent: RefCell::new(agent),
}))
}
}
impl CoreHost for AgentHost {
fn host_type(&self) -> &'static str {
"AxAgent"
}
fn call_method(&self, name: &str, args: &[CoreValue]) -> Result<CoreValue, AxError> {
match name {
"forward" => {
let values = core_value_to_json(&core_arg(args, 1));
let options = core_value_to_json(&core_arg(args, 2));
let mut client = core_scoped_client()?;
let output =
self.agent
.borrow_mut()
.forward_with_options(&mut client, values, options)?;
Ok(core_value_from_json(&output))
}
"get_chat_log" => Ok(core_value_from_json(&Value::Array(
self.agent.borrow().get_chat_log(),
))),
"get_usage" => {
let usage = self.agent.borrow().get_usage();
Ok(core_value_from_json(&usage))
}
"get_optimizable_components" => {
let components = self.agent.borrow().get_optimizable_components()?;
Ok(core_value_from_json(&Value::Array(components)))
}
"apply_optimized_components" => {
let component_map = core_value_to_json(&core_arg(args, 0));
self.agent
.borrow_mut()
.apply_optimized_components(&component_map)?;
Ok(CoreValue::Null)
}
other => Err(AxError::runtime(format!(
"object of type AxAgent has no callable method '{other}'"
))),
}
}
}
fn core_host_try(
value: &CoreValue,
method: &str,
args: &[CoreValue],
) -> Option<Result<CoreValue, AxError>> {
if let CoreValue::Host(host) = value {
match host.call_method(method, args) {
Err(err) if err.message.contains("no callable method") => None,
other => Some(other),
}
} else {
None
}
}
fn core_agent_stage_chat_log(args: &[CoreValue]) -> Result<CoreValue, AxError> {
match core_host_try(&core_arg(args, 0), "get_chat_log", &[]) {
Some(result) => result,
None => Ok(CoreValue::new_list()),
}
}
fn core_agent_stage_traces(args: &[CoreValue]) -> Result<CoreValue, AxError> {
match core_host_try(&core_arg(args, 0), "get_traces", &[]) {
Some(result) => result,
None => Ok(CoreValue::new_list()),
}
}
fn core_agent_stage_usage(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let stage = core_arg(args, 0);
if let Some(result) = core_host_try(&stage, "get_usage", &[]) {
let usage = result?;
if core_truthy(&usage) {
return Ok(usage);
}
}
if let Some(result) = core_host_try(&stage, "get_chat_log", &[]) {
let items = CoreValue::new_list();
for entry in core_iter(&result?)? {
let usage = core_get(&entry, &CoreValue::from("usage"), CoreValue::Null);
if core_truthy(&usage) {
core_append(&items, usage)?;
}
}
return Ok(items);
}
Ok(CoreValue::new_list())
}
fn core_agent_stage_forward(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let stage = core_arg(args, 0);
let client = core_arg(args, 1);
let values = core_arg(args, 2);
let values = if values.is_null() {
CoreValue::new_map()
} else {
values
};
let options = core_arg(args, 3);
let options = if options.is_null() {
CoreValue::new_map()
} else {
options
};
match &stage {
CoreValue::Host(host) => host.call_method("forward", &[client, values, options]),
_ => Err(AxError::runtime("flow stage is not a runnable program")),
}
}
fn core_json_stable_stringify(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let value = core_arg(args, 0);
let json = if value.is_null() {
json!({})
} else {
core_value_to_json(&value)
};
Ok(CoreValue::from_string(stable_stringify(&json)))
}
fn core_string_split(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let value = core_arg(args, 0).text();
let sep = core_arg(args, 1).text();
Ok(CoreValue::list_from(
value.split(sep.as_str()).map(CoreValue::from).collect(),
))
}
fn core_program_components(args: &[CoreValue]) -> Result<CoreValue, AxError> {
match core_host_try(&core_arg(args, 0), "get_optimizable_components", &[]) {
Some(result) => result,
None => Ok(CoreValue::new_list()),
}
}
fn core_program_apply_components(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let program = core_arg(args, 0);
let component_map = core_arg(args, 1);
let component_map = if component_map.is_null() {
CoreValue::new_map()
} else {
component_map
};
if let Some(result) = core_host_try(&program, "apply_optimized_components", &[component_map]) {
result?;
}
Ok(CoreValue::new_map())
}
// ----- AXIR CORE AGENT ENGINE (host boundary) -----
// Port of the Python reference helpers for the AxAgent module
// (_core_agent_* family plus the string/regex/json intrinsics the agent IR
// leans on) onto the AxIR CoreValue runtime. The AxCodeRuntime and
// AxCodeSession trait objects ride inside CoreValue::Host wrappers;
// python's hasattr fallback chains are mirrored with core_host_try, where
// the "no callable method" sentinel stands in for a missing attribute.
//
// Conventions:
// - state/options/request values are CoreValue maps keyed by the python
// attribute names (callable_inventory, qualified_name, runtime_state, ...).
// - callable(x) in the python sense means x is CoreValue::Host; invoking it
// dispatches call_method("call", args).
// - The AxCodeRuntime/AxCodeSession bridge is JSON-typed (the trait methods
// take and return serde_json::Value), so CoreValue::Host values do not
// survive the crossing; runtime options and snapshots are plain data.
// python: AxAgentClarificationError. core.raise turns the returned
// CoreValue::Error into Err(AxError) via core_as_error, so the structured
// payload must ride inside AxError itself: category marks the error as a
// clarification, message carries str(question or message or clarification)
// for expected_error_contains style checks, and code carries the stable
// JSON of {clarification, payload, state} so catch sites can recover the
// python exception attributes.
#[allow(dead_code)]
pub(crate) const CORE_AGENT_CLARIFICATION_CATEGORY: &str = "agent_clarification";
#[allow(dead_code)]
const CORE_AGENT_INSPECT_UNAVAILABLE: &str =
"[runtime state inspection unavailable: runtime session does not implement inspect_globals()]";
// Recovers the python exception attributes from a clarification AxError:
// Some({"clarification": ..., "payload": ..., "state": ...}) when the error
// was produced by core_agent_clarification_error, None otherwise.
#[allow(dead_code)]
pub(crate) fn core_agent_clarification_detail(error: &AxError) -> Option<Value> {
if error.category != CORE_AGENT_CLARIFICATION_CATEGORY {
return None;
}
error
.code
.as_deref()
.and_then(|raw| serde_json::from_str(raw).ok())
}
// python:
// args = _core_get(payload, "args", []) or []
// clarification = args[0] if args else payload
// AxAgentClarificationError(clarification, state=state.get("runtime_state", {}), payload=payload)
// where the exception message is str(question or message or clarification)
// for dict clarifications and str(clarification) otherwise. RETURNS the
// error value (the IR raises it separately via core.raise).
#[allow(dead_code)]
fn core_agent_clarification_error(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let payload = core_arg(args, 0);
let state = core_arg(args, 1);
let payload_args = core_get(&payload, &CoreValue::from("args"), CoreValue::Null);
let clarification = match &payload_args {
CoreValue::List(items) if !items.borrow().is_empty() => items.borrow()[0].clone(),
_ => payload.clone(),
};
let message = match &clarification {
CoreValue::Map(_) => {
let question = core_get(
&clarification,
&CoreValue::from("question"),
CoreValue::Null,
);
let fallback = core_get(&clarification, &CoreValue::from("message"), CoreValue::Null);
if core_truthy(&question) {
question.text()
} else if core_truthy(&fallback) {
fallback.text()
} else {
clarification.text()
}
}
other => other.text(),
};
let runtime_state = core_get(
&state,
&CoreValue::from("runtime_state"),
CoreValue::new_map(),
);
let detail = json!({
"clarification": core_value_to_json(&clarification),
"payload": core_value_to_json(&payload),
"state": core_value_to_json(&runtime_state),
});
let mut error = AxError::new(CORE_AGENT_CLARIFICATION_CATEGORY, message);
error.error_type = Some("AxAgentClarificationError".to_string());
error.code = Some(stable_stringify(&detail));
Ok(CoreValue::Error(Rc::new(error)))
}
// ----- AxCodeRuntime / AxCodeSession hosts -----
// RuntimeCapabilities plays the role of python's override detection: the
// reference checks type(session).snapshot_globals is not
// AxCodeSession.snapshot_globals (and the scripted session consults
// runtime.capabilities). Rust trait objects cannot observe overrides, so the
// wiring states the capabilities up front; a disabled capability reproduces
// the python behaviour for a session that never implemented the method.
#[allow(dead_code)]
pub(crate) fn core_runtime_capabilities_full() -> RuntimeCapabilities {
RuntimeCapabilities {
inspect_globals: true,
snapshot_globals: true,
patch_globals: true,
}
}
#[allow(dead_code)]
struct CodeRuntimeHost {
runtime: Rc<RefCell<Box<dyn AxCodeRuntime>>>,
capabilities: RuntimeCapabilities,
}
#[allow(dead_code)]
pub(crate) fn core_code_runtime_host(runtime: Box<dyn AxCodeRuntime>) -> CoreValue {
core_code_runtime_host_shared(
Rc::new(RefCell::new(runtime)),
core_runtime_capabilities_full(),
)
}
#[allow(dead_code)]
pub(crate) fn core_code_runtime_host_with_capabilities(
runtime: Box<dyn AxCodeRuntime>,
capabilities: RuntimeCapabilities,
) -> CoreValue {
core_code_runtime_host_shared(Rc::new(RefCell::new(runtime)), capabilities)
}
// Shared form for wiring that needs to keep a handle on the runtime (for
// example a scripted conformance runtime whose call log is asserted after
// the forward pass).
#[allow(dead_code)]
pub(crate) fn core_code_runtime_host_shared(
runtime: Rc<RefCell<Box<dyn AxCodeRuntime>>>,
capabilities: RuntimeCapabilities,
) -> CoreValue {
CoreValue::Host(Rc::new(CodeRuntimeHost {
runtime,
capabilities,
}))
}
impl CoreHost for CodeRuntimeHost {
fn host_type(&self) -> &'static str {
"AxCodeRuntime"
}
fn register_runtime_callable(&self, name: &str, callable: AxHostCallable) -> bool {
self.runtime
.borrow_mut()
.register_host_callable(name, callable)
.is_ok()
}
fn call_method(&self, name: &str, args: &[CoreValue]) -> Result<CoreValue, AxError> {
match name {
"create_session" => {
let globals = core_value_to_json(&core_arg(args, 0));
let options = core_value_to_json(&core_arg(args, 1));
let session = self.runtime.borrow_mut().create_session(globals, options)?;
Ok(core_code_session_host_with_capabilities(
session,
self.capabilities.clone(),
))
}
// python attribute access (runtime.language, runtime.get_usage_instructions())
"language" => Ok(CoreValue::from_string(
self.runtime.borrow().language().to_string(),
)),
"usage_instructions" | "get_usage_instructions" | "usageInstructions" => Ok(
CoreValue::from_string(self.runtime.borrow().usage_instructions().to_string()),
),
other => Err(AxError::runtime(format!(
"object of type AxCodeRuntime has no callable method '{other}'"
))),
}
}
}
#[allow(dead_code)]
struct CodeSessionHost {
session: Rc<RefCell<Box<dyn AxCodeSession>>>,
capabilities: RuntimeCapabilities,
}
#[allow(dead_code)]
pub(crate) fn core_code_session_host(session: Box<dyn AxCodeSession>) -> CoreValue {
core_code_session_host_with_capabilities(session, core_runtime_capabilities_full())
}
#[allow(dead_code)]
pub(crate) fn core_code_session_host_with_capabilities(
session: Box<dyn AxCodeSession>,
capabilities: RuntimeCapabilities,
) -> CoreValue {
CoreValue::Host(Rc::new(CodeSessionHost {
session: Rc::new(RefCell::new(session)),
capabilities,
}))
}
impl CoreHost for CodeSessionHost {
fn host_type(&self) -> &'static str {
"AxCodeSession"
}
fn call_method(&self, name: &str, args: &[CoreValue]) -> Result<CoreValue, AxError> {
match name {
"execute" => {
let code = core_arg(args, 0).text();
let options = core_value_to_json(&core_arg(args, 1));
let envelope = self.session.borrow_mut().execute(&code, options)?;
Ok(core_value_from_json(&envelope.payload))
}
"inspect_globals" => {
// python base AxCodeSession.inspect_globals (and the scripted
// session with the inspect capability off) returns the
// unavailable notice instead of raising.
if !self.capabilities.inspect_globals {
return Ok(CoreValue::from(CORE_AGENT_INSPECT_UNAVAILABLE));
}
let options = core_value_to_json(&core_arg(args, 0));
let result = self.session.borrow_mut().inspect_globals(options)?;
Ok(core_value_from_json(&result))
}
"snapshot_globals" => {
if !self.capabilities.snapshot_globals {
return Err(AxError::runtime(
"AxCodeSession.snapshot_globals() is required to export AxAgent state",
));
}
let options = core_value_to_json(&core_arg(args, 0));
let result = self.session.borrow_mut().snapshot_globals(options)?;
Ok(core_value_from_json(&result))
}
"patch_globals" => {
if !self.capabilities.patch_globals {
return Err(AxError::runtime(
"AxCodeSession.patch_globals() is required to restore AxAgent state",
));
}
let snapshot = core_value_to_json(&core_arg(args, 0));
let options = core_value_to_json(&core_arg(args, 1));
let result = self.session.borrow_mut().patch_globals(snapshot, options)?;
Ok(core_value_from_json(&result))
}
"close" => {
let result = self.session.borrow_mut().close()?;
Ok(core_value_from_json(&result))
}
other => Err(AxError::runtime(format!(
"object of type AxCodeSession has no callable method '{other}'"
))),
}
}
}
// ----- shared small helpers -----
// python: value or {}
#[allow(dead_code)]
fn core_agent_or_empty_map(value: CoreValue) -> CoreValue {
if core_truthy(&value) {
value
} else {
CoreValue::new_map()
}
}
// python: _core_get(state, "options", {}) or {}
#[allow(dead_code)]
fn core_agent_state_options(state: &CoreValue) -> CoreValue {
core_agent_or_empty_map(core_get(
state,
&CoreValue::from("options"),
CoreValue::Null,
))
}
// python: options.get(snake) or options.get(camel)
#[allow(dead_code)]
fn core_agent_option(options: &CoreValue, snake: &str, camel: &str) -> CoreValue {
let value = core_get(options, &CoreValue::from(snake), CoreValue::Null);
if core_truthy(&value) {
return value;
}
core_get(options, &CoreValue::from(camel), CoreValue::Null)
}
// python: list(value or []) (shallow copy; dicts iterate keys, like list())
#[allow(dead_code)]
fn core_agent_list_copy(value: &CoreValue) -> Result<CoreValue, AxError> {
if !core_truthy(value) {
return Ok(CoreValue::new_list());
}
Ok(CoreValue::list_from(core_iter(value)?))
}
// python: copy.deepcopy(value) for the plain-data values scripted fixtures
// hold; implemented as a JSON round trip (Host values do not occur in
// scripted results).
#[allow(dead_code)]
fn core_agent_deep_copy(value: &CoreValue) -> CoreValue {
core_value_from_json(&core_value_to_json(value))
}
#[allow(dead_code)]
fn core_agent_map(entries: &[(&str, CoreValue)]) -> Result<CoreValue, AxError> {
let out = CoreValue::new_map();
for (key, value) in entries {
core_set(&out, CoreValue::from(key), value.clone())?;
}
Ok(out)
}
// ----- runtime lifecycle intrinsics -----
// python: _core_agent_runtime_create_session(runtime, globals_, options)
#[allow(dead_code)]
fn core_agent_runtime_create_session(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let runtime = core_arg(args, 0);
let globals = core_agent_or_empty_map(core_arg(args, 1));
let options = core_agent_or_empty_map(core_arg(args, 2));
match core_host_try(&runtime, "create_session", &[globals, options]) {
Some(result) => {
let session = result?;
if session.is_null() {
return Err(AxError::runtime("agent runtime returned no session"));
}
Ok(session)
}
None => Err(AxError::runtime(
"agent runtime does not implement AxCodeRuntime",
)),
}
}
// python: _core_agent_runtime_execute(session, code, options)
#[allow(dead_code)]
fn core_agent_runtime_execute(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let session = core_arg(args, 0);
let code = CoreValue::from_string(core_arg(args, 1).text());
let options = core_agent_or_empty_map(core_arg(args, 2));
match core_host_try(&session, "execute", &[code, options]) {
Some(result) => result,
None => Err(AxError::runtime("agent code session is not active")),
}
}
// python: _core_agent_runtime_inspect(session, options) with the
// inspect_globals -> inspect -> notice fallback chain.
#[allow(dead_code)]
fn core_agent_runtime_inspect(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let session = core_arg(args, 0);
let options = core_agent_or_empty_map(core_arg(args, 1));
if let Some(result) = core_host_try(&session, "inspect_globals", &[options.clone()]) {
return result;
}
if let Some(result) = core_host_try(&session, "inspect", &[options]) {
return result;
}
Ok(CoreValue::from(CORE_AGENT_INSPECT_UNAVAILABLE))
}
// python: _core_agent_runtime_export_state(session, options) with the
// snapshot_globals -> export_state -> raise fallback chain.
#[allow(dead_code)]
fn core_agent_runtime_export_state(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let session = core_arg(args, 0);
let options = core_agent_or_empty_map(core_arg(args, 1));
if let Some(result) = core_host_try(&session, "snapshot_globals", &[options.clone()]) {
return result;
}
if let Some(result) = core_host_try(&session, "export_state", &[options]) {
return result;
}
Err(AxError::runtime(
"AxCodeSession.snapshot_globals() is required to export AxAgent state",
))
}
// python: _core_agent_runtime_restore_state(session, snapshot, options) with
// the patch_globals -> restore_state -> raise fallback chain.
#[allow(dead_code)]
fn core_agent_runtime_restore_state(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let session = core_arg(args, 0);
let snapshot = core_agent_or_empty_map(core_arg(args, 1));
let options = core_agent_or_empty_map(core_arg(args, 2));
if let Some(result) = core_host_try(
&session,
"patch_globals",
&[snapshot.clone(), options.clone()],
) {
return result;
}
if let Some(result) = core_host_try(&session, "restore_state", &[snapshot, options]) {
return result;
}
Err(AxError::runtime(
"AxCodeSession.patch_globals() is required to restore AxAgent state",
))
}
// python: _core_agent_runtime_close(session); None results normalize to
// {"closed": True}.
#[allow(dead_code)]
fn core_agent_runtime_close(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let session = core_arg(args, 0);
let closed = || core_agent_map(&[("closed", CoreValue::Bool(true))]);
match core_host_try(&session, "close", &[]) {
Some(result) => {
let value = result?;
if value.is_null() {
closed()
} else {
Ok(value)
}
}
None => closed(),
}
}
// ----- memory / skill search intrinsics -----
// python: _core_agent_memory_search(state, searches, already_loaded).
// Callback path first (on_memories_search / onMemoriesSearch), then scripted
// results (memory_search_results / memorySearchResults): exact joined key,
// then per-search key (first hit wins), then the "*" fallback.
#[allow(dead_code)]
fn core_agent_memory_search(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let state = core_arg(args, 0);
let searches = core_arg(args, 1);
let already_loaded = core_arg(args, 2);
let options = core_agent_state_options(&state);
let callback = core_agent_option(&options, "on_memories_search", "onMemoriesSearch");
if let Some(result) = core_host_try(
&callback,
"call",
&[
core_agent_list_copy(&searches)?,
core_agent_list_copy(&already_loaded)?,
],
) {
let value = result?;
return Ok(if core_truthy(&value) {
value
} else {
CoreValue::new_list()
});
}
let scripted = core_agent_or_empty_map(core_agent_option(
&options,
"memory_search_results",
"memorySearchResults",
));
match &scripted {
CoreValue::Map(map) => {
let items = if core_truthy(&searches) {
core_iter(&searches)?
} else {
Vec::new()
};
let joined = items
.iter()
.map(|item| item.text())
.collect::<Vec<_>>()
.join("|");
if map.borrow().contains(&joined) {
return Ok(core_agent_deep_copy(&core_get(
&scripted,
&CoreValue::from(joined.as_str()),
CoreValue::Null,
)));
}
for item in &items {
let key = item.text();
if map.borrow().contains(&key) {
return Ok(core_agent_deep_copy(&core_get(
&scripted,
&CoreValue::from(key.as_str()),
CoreValue::Null,
)));
}
}
Ok(core_agent_deep_copy(&core_get(
&scripted,
&CoreValue::from("*"),
CoreValue::new_list(),
)))
}
CoreValue::List(_) => Ok(core_agent_deep_copy(&scripted)),
_ => Ok(CoreValue::new_list()),
}
}
// python: _core_agent_skill_search(state, searches). Callback path first
// (on_skills_search / onSkillsSearch), then scripted results
// (skill_search_results / skillSearchResults): exact joined key, then the
// concatenation of every per-search hit, then the "*" fallback.
#[allow(dead_code)]
fn core_agent_skill_search(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let state = core_arg(args, 0);
let searches = core_arg(args, 1);
let options = core_agent_state_options(&state);
let callback = core_agent_option(&options, "on_skills_search", "onSkillsSearch");
if let Some(result) = core_host_try(&callback, "call", &[core_agent_list_copy(&searches)?]) {
let value = result?;
return Ok(if core_truthy(&value) {
value
} else {
CoreValue::new_list()
});
}
let scripted = core_agent_or_empty_map(core_agent_option(
&options,
"skill_search_results",
"skillSearchResults",
));
match &scripted {
CoreValue::Map(map) => {
let items = if core_truthy(&searches) {
core_iter(&searches)?
} else {
Vec::new()
};
let joined = items
.iter()
.map(|item| item.text())
.collect::<Vec<_>>()
.join("|");
if map.borrow().contains(&joined) {
return Ok(core_agent_deep_copy(&core_get(
&scripted,
&CoreValue::from(joined.as_str()),
CoreValue::Null,
)));
}
let out = CoreValue::new_list();
for item in &items {
let key = item.text();
let entry = core_agent_deep_copy(&core_get(
&scripted,
&CoreValue::from(key.as_str()),
CoreValue::new_list(),
));
for hit in core_iter(&entry)? {
core_append(&out, hit)?;
}
}
if core_truthy(&out) {
return Ok(out);
}
Ok(core_agent_deep_copy(&core_get(
&scripted,
&CoreValue::from("*"),
CoreValue::new_list(),
)))
}
CoreValue::List(_) => Ok(core_agent_deep_copy(&scripted)),
_ => Ok(CoreValue::new_list()),
}
}
// ----- callable invocation intrinsic -----
// python: _core_agent_callable_invoke(state, request, options). Walks
// state["callable_inventory"] groups for a callable whose qualified_name
// matches and invokes its handler when callable; otherwise consults
// scripted callable_results / callableResults (qualified name, plain name,
// then "*"); otherwise reports the unknown callable. The third argument is
// accepted and ignored, mirroring the reference.
#[allow(dead_code)]
fn core_agent_callable_invoke(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let state = core_arg(args, 0);
let request = core_arg(args, 1);
let agent_options = core_agent_state_options(&state);
let name = core_get(&request, &CoreValue::from("name"), CoreValue::from(""));
let qualified = core_get(&request, &CoreValue::from("qualified_name"), name.clone());
let call_args = core_get(&request, &CoreValue::from("args"), CoreValue::new_map());
let inventory = core_get(
&state,
&CoreValue::from("callable_inventory"),
CoreValue::Null,
);
for group in core_axgen_iter_or_empty(&inventory)? {
let callables = core_get(&group, &CoreValue::from("callables"), CoreValue::Null);
for callable_meta in core_axgen_iter_or_empty(&callables)? {
let meta_qualified = core_get(
&callable_meta,
&CoreValue::from("qualified_name"),
CoreValue::Null,
);
if meta_qualified != qualified {
continue;
}
let handler = core_get(&callable_meta, &CoreValue::from("handler"), CoreValue::Null);
if let CoreValue::Host(host) = &handler {
let value = host.call_method("call", &[call_args.clone()])?;
return core_agent_map(&[("status", CoreValue::from("ok")), ("value", value)]);
}
}
}
let scripted = core_agent_or_empty_map(core_agent_option(
&agent_options,
"callable_results",
"callableResults",
));
if let CoreValue::Map(_) = &scripted {
let mut result = core_get(&scripted, &qualified, CoreValue::Null);
if result.is_null() {
result = core_get(&scripted, &name, CoreValue::Null);
}
if result.is_null() {
result = core_get(&scripted, &CoreValue::from("*"), CoreValue::Null);
}
if !result.is_null() {
let copied = core_agent_deep_copy(&result);
if let CoreValue::Map(map) = &copied {
let error = core_get(&copied, &CoreValue::from("error"), CoreValue::Null);
if core_truthy(&error) {
return core_agent_map(&[
("status", CoreValue::from("error")),
("error", error),
]);
}
// python: copied.setdefault("status", "ok")
if !map.borrow().contains("status") {
core_set(&copied, CoreValue::from("status"), CoreValue::from("ok"))?;
}
return Ok(copied);
}
return core_agent_map(&[("status", CoreValue::from("ok")), ("value", copied)]);
}
}
core_agent_map(&[
("status", CoreValue::from("error")),
(
"error",
CoreValue::from_string(format!("unknown callable: {}", qualified.text())),
),
])
}
// ----- string / regex / json intrinsics -----
// Translates a python re.sub replacement template into the regex crate's
// replacement syntax: literal dollars are escaped, backreferences become
// brace-delimited group references (group numbers cap at two digits, like
// python), the named \g<name> form maps across, doubled backslashes
// collapse, and the common control escapes are decoded.
#[allow(dead_code)]
fn core_regex_python_replacement(repl: &str) -> String {
let mut out = String::new();
let mut chars = repl.chars().peekable();
while let Some(ch) = chars.next() {
if ch == '$' {
out.push_str("$$");
continue;
}
if ch != '\\' {
out.push(ch);
continue;
}
match chars.peek().copied() {
Some('\\') => {
chars.next();
out.push('\\');
}
Some('n') => {
chars.next();
out.push('\n');
}
Some('t') => {
chars.next();
out.push('\t');
}
Some('r') => {
chars.next();
out.push('\r');
}
Some('g') => {
chars.next();
if chars.peek().copied() == Some('<') {
chars.next();
let mut group = String::new();
let mut closed = false;
for next in chars.by_ref() {
if next == '>' {
closed = true;
break;
}
group.push(next);
}
if closed && !group.is_empty() {
out.push_str("${");
out.push_str(&group);
out.push('}');
} else {
out.push_str("\\g<");
out.push_str(&group);
}
} else {
out.push('\\');
out.push('g');
}
}
Some(digit) if digit.is_ascii_digit() => {
let mut group = String::new();
while group.len() < 2 {
match chars.peek().copied() {
Some(next) if next.is_ascii_digit() => {
group.push(next);
chars.next();
}
_ => break,
}
}
out.push_str("${");
out.push_str(&group);
out.push('}');
}
_ => out.push('\\'),
}
}
out
}
// python: re.sub(str(pattern), str(repl), str(value))
#[allow(dead_code)]
fn core_regex_replace(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let pattern = core_arg(args, 0).text();
let repl = core_arg(args, 1).text();
let value = core_arg(args, 2).text();
let compiled = regex::Regex::new(&pattern)
.map_err(|err| AxError::runtime(format!("invalid regex pattern: {err}")))?;
let replacement = core_regex_python_replacement(&repl);
Ok(CoreValue::from_string(
compiled
.replace_all(&value, replacement.as_str())
.into_owned(),
))
}
// python: json.dumps(value, indent=2)
#[allow(dead_code)]
fn core_json_pretty(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let json = core_value_to_json(&core_arg(args, 0));
let text = serde_json::to_string_pretty(&json)
.map_err(|err| AxError::runtime(format!("json pretty error: {err}")))?;
Ok(CoreValue::from_string(text))
}
// python: word.lower().capitalize() (first char upper, remainder lower)
#[allow(dead_code)]
fn core_string_capitalize_lower(word: &str) -> String {
let lowered = word.to_lowercase();
let mut chars = lowered.chars();
match chars.next() {
Some(first) => first.to_uppercase().chain(chars).collect(),
None => String::new(),
}
}
// python: _core_string_lower_camel(words)
#[allow(dead_code)]
fn core_string_lower_camel(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let words = core_arg(args, 0);
let mut items: Vec<String> = Vec::new();
if core_truthy(&words) {
for item in core_iter(&words)? {
let text = item.text();
if !text.is_empty() {
items.push(text);
}
}
}
if items.is_empty() {
return Ok(CoreValue::from(""));
}
let mut out = items[0].to_lowercase();
for item in &items[1..] {
out.push_str(&core_string_capitalize_lower(item));
}
Ok(CoreValue::from_string(out))
}
// python: _core_string_title_from_camel(value)
// text = re.sub("Code$", " Code", str(value))
// text = re.sub("([a-z0-9])([A-Z])", "\\1 \\2", text).strip()
// return text[:1].upper() + text[1:]
#[allow(dead_code)]
fn core_string_title_from_camel(args: &[CoreValue]) -> Result<CoreValue, AxError> {
let value = core_arg(args, 0).text();
let code_suffix = regex::Regex::new("Code$")
.map_err(|err| AxError::runtime(format!("invalid regex pattern: {err}")))?;
let spaced_code = code_suffix.replace_all(&value, " Code");
let boundary = regex::Regex::new("([a-z0-9])([A-Z])")
.map_err(|err| AxError::runtime(format!("invalid regex pattern: {err}")))?;
let spaced = boundary
.replace_all(spaced_code.as_ref(), "${1} ${2}")
.trim()
.to_string();
let mut chars = spaced.chars();
Ok(match chars.next() {
Some(first) => {
CoreValue::from_string(first.to_uppercase().chain(chars).collect::<String>())
}
None => CoreValue::from(""),
})
}
// ----- END AXIR CORE AGENT ENGINE -----
fn signature_from_record(record: &CoreValue) -> AxResult<AxSignature> {
if let CoreValue::Str(text) = record {
return s(text.as_str());
}
let payload = core_value_to_json(record);
let mut inputs = Vec::new();
let mut outputs = Vec::new();
for (key, out) in [("inputFields", &mut inputs), ("outputFields", &mut outputs)] {
for raw in payload
.get(key)
.and_then(Value::as_array)
.into_iter()
.flatten()
{
let name = raw.get("name").and_then(Value::as_str).unwrap_or("");
out.push(field_from_payload(name, raw));
}
}
Ok(AxSignature {
description: payload
.get("description")
.and_then(Value::as_str)
.map(ToString::to_string),
inputs,
outputs,
})
}
fn agent_stage_gen(signature: AxSignature, options: Value) -> CoreValue {
GenHost::new(AxGen {
signature,
options,
function_call_traces: Vec::new(),
tools: Vec::new(),
assertions: Vec::new(),
examples: Vec::new(),
demos: Vec::new(),
field_processors: Vec::new(),
stop_functions: Vec::new(),
memory: Vec::new(),
traces: Vec::new(),
chat_log: Vec::new(),
})
}
struct ScopedRuntimeHost(*mut dyn AxCodeRuntime);
impl CoreHost for ScopedRuntimeHost {
fn host_type(&self) -> &'static str {
"AxCodeRuntime"
}
fn call_method(&self, name: &str, args: &[CoreValue]) -> Result<CoreValue, AxError> {
// SAFETY: the pointer is valid for the duration of the agent method
// that constructed this host; emitted code uses it synchronously.
let runtime = unsafe { &mut *self.0 };
match name {
"create_session" => {
let globals = core_value_to_json(&core_arg(args, 0));
let options = core_value_to_json(&core_arg(args, 1));
let session = runtime.create_session(globals, options)?;
Ok(core_code_session_host(session))
}
"language" => Ok(CoreValue::from_string(runtime.language().to_string())),
"usage_instructions" | "get_usage_instructions" | "usageInstructions" => Ok(
CoreValue::from_string(runtime.usage_instructions().to_string()),
),
other => Err(AxError::runtime(format!(
"object of type AxCodeRuntime has no callable method '{other}'"
))),
}
}
}
struct ScriptedRuntimeShared {
script: Vec<Value>,
executed: Vec<String>,
// python ScriptedCodeRuntime bookkeeping inspected by the session
// conformance runner after the fact.
create_requests: Vec<Value>,
execute_options: Vec<Value>,
session_closed: Vec<bool>,
capabilities: RuntimeCapabilities,
}
pub(crate) struct ScriptedCodeRuntime {
shared: Rc<RefCell<ScriptedRuntimeShared>>,
language: String,
usage_instructions: String,
}
impl ScriptedCodeRuntime {
pub(crate) fn new(script: Vec<Value>, language: String, usage_instructions: String) -> Self {
ScriptedCodeRuntime {
shared: Rc::new(RefCell::new(ScriptedRuntimeShared {
script,
executed: Vec::new(),
create_requests: Vec::new(),
execute_options: Vec::new(),
session_closed: Vec::new(),
capabilities: core_runtime_capabilities_full(),
})),
language,
usage_instructions,
}
}
// python ScriptedCodeRuntime(capabilities=...): {"inspect": True,
// "snapshot": True, "patch": True} updated with the fixture overrides.
fn with_fixture_capabilities(self, raw: Option<&Value>) -> Self {
{
let capability = |name: &str, fallback: bool| {
raw.and_then(|caps| caps.get(name))
.and_then(Value::as_bool)
.unwrap_or(fallback)
};
let mut shared = self.shared.borrow_mut();
shared.capabilities = RuntimeCapabilities {
inspect_globals: capability("inspect", true),
snapshot_globals: capability("snapshot", true),
patch_globals: capability("patch", true),
};
}
self
}
fn executed_handle(&self) -> Rc<RefCell<ScriptedRuntimeShared>> {
Rc::clone(&self.shared)
}
}
impl AxCodeRuntime for ScriptedCodeRuntime {
fn language(&self) -> &str {
&self.language
}
fn usage_instructions(&self) -> &str {
&self.usage_instructions
}
fn create_session(
&mut self,
globals: Value,
options: Value,
) -> AxResult<Box<dyn AxCodeSession>> {
let index = {
let mut shared = self.shared.borrow_mut();
shared
.create_requests
.push(json!({"globals": globals.clone(), "options": options}));
shared.session_closed.push(false);
shared.session_closed.len() - 1
};
Ok(Box::new(ScriptedCodeSession {
shared: Rc::clone(&self.shared),
globals: globals.as_object().cloned().unwrap_or_default(),
closed: false,
index,
}))
}
}
struct ScriptedCodeSession {
shared: Rc<RefCell<ScriptedRuntimeShared>>,
globals: Map<String, Value>,
closed: bool,
index: usize,
}
impl ScriptedCodeSession {
fn set_closed(&mut self, closed: bool) {
self.closed = closed;
let mut shared = self.shared.borrow_mut();
if let Some(flag) = shared.session_closed.get_mut(self.index) {
*flag = closed;
}
}
}
impl AxCodeSession for ScriptedCodeSession {
fn execute(&mut self, code: &str, options: Value) -> AxResult<RuntimeEnvelope> {
if self.closed {
return Ok(RuntimeEnvelope {
payload: json!({"is_error": true, "error_category": "session_closed", "error": "session closed"}),
});
}
let step = {
let mut shared = self.shared.borrow_mut();
if shared.script.is_empty() {
return Err(AxError::runtime("scripted runtime exhausted"));
}
shared.script.remove(0)
};
if let Some(expected) = step.get("expected_code").and_then(Value::as_str) {
if expected != code {
return Err(AxError::runtime(format!(
"expected code {expected:?}, got {code:?}"
)));
}
}
if let Some(expected) = step.get("expected_options_subset") {
expect_json_subset("runtime execute options", &options, expected)?;
}
{
let mut shared = self.shared.borrow_mut();
shared.executed.push(code.to_string());
shared.execute_options.push(options);
}
if let Some(patch) = step.get("bindings_patch").and_then(Value::as_object) {
for (key, value) in patch {
self.globals.insert(key.clone(), value.clone());
}
}
if step
.get("close_before_result")
.map(core_json_truthy)
.unwrap_or(false)
{
self.set_closed(true);
}
let payload = step.get("result").cloned().unwrap_or_else(
|| json!({"kind": "result", "result": Value::Object(self.globals.clone())}),
);
Ok(RuntimeEnvelope { payload })
}
fn inspect_globals(&mut self, _options: Value) -> AxResult<Value> {
// python ScriptedCodeSession gates on runtime.capabilities and
// returns the bracketed unavailable notice instead of raising.
if !self.shared.borrow().capabilities.inspect_globals {
return Ok(json!(CORE_AGENT_INSPECT_UNAVAILABLE));
}
Ok(Value::Object(self.globals.clone()))
}
fn snapshot_globals(&mut self, _options: Value) -> AxResult<Value> {
if !self.shared.borrow().capabilities.snapshot_globals {
return Err(AxError::runtime(
"AxCodeSession.snapshot_globals() is required to export AxAgent state",
));
}
let entries = self
.globals
.iter()
.map(|(key, value)| {
json!({
"name": key,
"type": python_type_name(value),
"preview": python_repr(value),
})
})
.collect::<Vec<_>>();
Ok(json!({
"version": 1,
"entries": entries,
"bindings": Value::Object(self.globals.clone()),
"globals": Value::Object(self.globals.clone()),
"closed": self.closed,
}))
}
fn patch_globals(&mut self, snapshot: Value, options: Value) -> AxResult<Value> {
if !self.shared.borrow().capabilities.patch_globals {
return Err(AxError::runtime(
"AxCodeSession.patch_globals() is required to restore AxAgent state",
));
}
let snap = snapshot.as_object().cloned().unwrap_or_default();
self.globals = snap
.get("bindings")
.or_else(|| snap.get("globals"))
.and_then(Value::as_object)
.cloned()
.unwrap_or_default();
let closed = snap.get("closed").map(core_json_truthy).unwrap_or(false);
self.set_closed(closed);
self.snapshot_globals(options)
}
fn close(&mut self) -> AxResult<Value> {
self.set_closed(true);
Ok(json!({"closed": true}))
}
}
fn core_json_truthy(value: &Value) -> bool {
core_truthy(&core_value_from_json(value))
}
fn python_type_name(value: &Value) -> &'static str {
match value {
Value::Null => "NoneType",
Value::Bool(_) => "bool",
Value::Number(n) if n.is_i64() || n.is_u64() => "int",
Value::Number(_) => "float",
Value::String(_) => "str",
Value::Array(_) => "list",
Value::Object(_) => "dict",
}
}
// python str(value): like repr but with bare strings.
fn python_str(value: &Value) -> String {
match value {
Value::String(text) => text.clone(),
other => python_repr(other),
}
}
fn python_repr(value: &Value) -> String {
match value {
Value::Null => "None".to_string(),
Value::Bool(true) => "True".to_string(),
Value::Bool(false) => "False".to_string(),
Value::Number(n) => n.to_string(),
Value::String(text) => format!("'{}'", text.replace('\\', "\\\\").replace('\'', "\\'")),
Value::Array(items) => format!(
"[{}]",
items.iter().map(python_repr).collect::<Vec<_>>().join(", ")
),
Value::Object(map) => format!(
"{{{}}}",
map.iter()
.map(|(key, value)| format!("'{key}': {}", python_repr(value)))
.collect::<Vec<_>>()
.join(", ")
),
}
}
// ----- END AXIR CORE VALUE RUNTIME -----
// BEGIN AXIR CORE EMITTED FUNCTIONS
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn parse_signature(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("parse_signature");
let mut v_signature = core_arg(args, 0);
let mut v_parsed = CoreValue::Null;
v_parsed = _signature_parse_impl(&[v_signature.clone()])?;
return Ok(v_parsed.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn validate_signature(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("validate_signature");
let mut v_signature = core_arg(args, 0);
_signature_validate_impl(&[v_signature.clone()])?;
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _signature_parse_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_signature_parse_impl");
let mut v_signature = core_arg(args, 0);
let mut v_arrow = CoreValue::Null;
let mut v_attrs = CoreValue::Null;
let mut v_body = CoreValue::Null;
let mut v_description = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_inputs = CoreValue::Null;
let mut v_is_empty = CoreValue::Null;
let mut v_left = CoreValue::Null;
let mut v_left_empty = CoreValue::Null;
let mut v_left_len = CoreValue::Null;
let mut v_left_raw = CoreValue::Null;
let mut v_missing_arrow = CoreValue::Null;
let mut v_outputs = CoreValue::Null;
let mut v_parsed = CoreValue::Null;
let mut v_prefix = CoreValue::Null;
let mut v_rest = CoreValue::Null;
let mut v_right = CoreValue::Null;
let mut v_right_empty = CoreValue::Null;
let mut v_right_len = CoreValue::Null;
let mut v_right_raw = CoreValue::Null;
let mut v_right_start = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_text_len = CoreValue::Null;
v_text = core_string_trim(&v_signature);
v_text_len = core_len(&[v_text.clone()])?;
v_is_empty = core_eq(&[v_text_len.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_is_empty) {
v_error = core_signature_error(&[CoreValue::from("Empty signature provided")])?;
return Err(core_as_error(&v_error));
}
v_prefix = core_string_consume_optional_quoted_prefix(&[v_text.clone()])?;
v_description = core_get(&v_prefix, &CoreValue::from("value"), CoreValue::Null);
v_rest = core_get(&v_prefix, &CoreValue::from("rest"), CoreValue::Null);
v_body = core_string_trim(&v_rest);
v_arrow = core_string_find_outside_quotes(&[v_body.clone(), CoreValue::from("->")])?;
v_missing_arrow = core_lt(&[v_arrow.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_missing_arrow) {
v_error = core_signature_error(&[CoreValue::from("Expected \"->\"")])?;
return Err(core_as_error(&v_error));
}
v_left_raw = core_string_slice(&[v_body.clone(), CoreValue::Num(0f64), v_arrow.clone()])?;
v_left = core_string_trim(&v_left_raw);
v_right_start = core_add(&[v_arrow.clone(), CoreValue::Num(2f64)])?;
v_right_raw = core_string_slice(&[v_body.clone(), v_right_start.clone()])?;
v_right = core_string_trim(&v_right_raw);
v_left_len = core_len(&[v_left.clone()])?;
v_left_empty = core_eq(&[v_left_len.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_left_empty) {
v_error = core_signature_error(&[CoreValue::from("No input fields specified")])?;
return Err(core_as_error(&v_error));
}
v_right_len = core_len(&[v_right.clone()])?;
v_right_empty = core_eq(&[v_right_len.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_right_empty) {
v_error = core_signature_error(&[CoreValue::from("No output fields specified")])?;
return Err(core_as_error(&v_error));
}
v_inputs = _signature_parse_fields_impl(&[v_left.clone(), CoreValue::Bool(false)])?;
v_outputs = _signature_parse_fields_impl(&[v_right.clone(), CoreValue::Bool(true)])?;
v_attrs = CoreValue::new_map();
core_set(&v_attrs, CoreValue::from("inputs"), v_inputs.clone())?;
core_set(&v_attrs, CoreValue::from("outputs"), v_outputs.clone())?;
core_set(
&v_attrs,
CoreValue::from("description"),
v_description.clone(),
)?;
v_parsed = core_record_new(&[CoreValue::from("AxSignature"), v_attrs.clone()])?;
return Ok(v_parsed.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _signature_parse_fields_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_signature_parse_fields_impl");
let mut v_text = core_arg(args, 0);
let mut v_output = core_arg(args, 1);
let mut v_field = CoreValue::Null;
let mut v_fields = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_parts = CoreValue::Null;
v_parts = core_string_split_outside_quotes(&[v_text.clone(), CoreValue::from(",")])?;
v_fields = CoreValue::new_list();
for v_part in core_iter(&v_parts)? {
let mut v_part = v_part;
v_field = _signature_parse_field_impl(&[v_part.clone(), v_output.clone()])?;
core_append(&v_fields, v_field.clone())?;
}
return Ok(v_fields.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _signature_parse_field_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_signature_parse_field_impl");
let mut v_raw = core_arg(args, 0);
let mut v_output = core_arg(args, 1);
let mut v_array_info = CoreValue::Null;
let mut v_class_input = CoreValue::Null;
let mut v_class_option_text = CoreValue::Null;
let mut v_empty_options = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_extra_type_tokens = CoreValue::Null;
let mut v_field = CoreValue::Null;
let mut v_field_attrs = CoreValue::Null;
let mut v_field_type = CoreValue::Null;
let mut v_has_extra = CoreValue::Null;
let mut v_head = CoreValue::Null;
let mut v_head_parts = CoreValue::Null;
let mut v_head_raw = CoreValue::Null;
let mut v_is_array = CoreValue::Null;
let mut v_is_class = CoreValue::Null;
let mut v_is_internal = CoreValue::Null;
let mut v_is_optional = CoreValue::Null;
let mut v_missing_quoted = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_name_part = CoreValue::Null;
let mut v_name_part_raw = CoreValue::Null;
let mut v_name_without_markers = CoreValue::Null;
let mut v_name_without_optional = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_option_count = CoreValue::Null;
let mut v_options = CoreValue::Null;
let mut v_quoted = CoreValue::Null;
let mut v_quoted_info = CoreValue::Null;
let mut v_rest_after_quote = CoreValue::Null;
let mut v_rest_after_quote_trimmed = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_type_attrs = CoreValue::Null;
let mut v_type_name = CoreValue::Null;
let mut v_type_name_raw = CoreValue::Null;
let mut v_type_part = CoreValue::Null;
let mut v_type_part_raw = CoreValue::Null;
let mut v_type_part_trimmed = CoreValue::Null;
let mut v_type_token = CoreValue::Null;
let mut v_type_word_count = CoreValue::Null;
let mut v_type_words = CoreValue::Null;
v_text = core_string_trim(&v_raw);
v_quoted_info = core_string_extract_quoted_suffix(&[v_text.clone()])?;
v_quoted = core_get(&v_quoted_info, &CoreValue::from("value"), CoreValue::Null);
v_rest_after_quote = core_get(&v_quoted_info, &CoreValue::from("rest"), CoreValue::Null);
v_rest_after_quote_trimmed = core_string_trim(&v_rest_after_quote);
v_has_extra = core_truthy_value(&[v_rest_after_quote_trimmed.clone()])?;
if core_truthy(&v_has_extra) {
v_error = core_signature_error(&[CoreValue::from("Unexpected content after signature")])?;
return Err(core_as_error(&v_error));
}
v_head_raw = core_get(&v_quoted_info, &CoreValue::from("head"), CoreValue::Null);
v_head = core_string_trim(&v_head_raw);
v_head_parts = core_string_split_once(&[v_head.clone(), CoreValue::from(":")])?;
v_name_part_raw = core_get(&v_head_parts, &CoreValue::from("left"), CoreValue::Null);
v_type_part_raw = core_get(&v_head_parts, &CoreValue::from("right"), CoreValue::Null);
v_name_part = core_string_trim(&v_name_part_raw);
v_type_part_trimmed = core_string_trim(&v_type_part_raw);
v_type_part =
core_string_default_if_empty(&[v_type_part_trimmed.clone(), CoreValue::from("string")])?;
v_is_optional = core_contains(&[v_name_part.clone(), CoreValue::from("?")])?;
v_is_internal = core_contains(&[v_name_part.clone(), CoreValue::from("!")])?;
v_name_without_optional = core_string_replace(&[
v_name_part.clone(),
CoreValue::from("?"),
CoreValue::from(""),
])?;
v_name_without_markers = core_string_replace(&[
v_name_without_optional.clone(),
CoreValue::from("!"),
CoreValue::from(""),
])?;
v_name = core_string_trim(&v_name_without_markers);
v_type_words = core_string_words(&[v_type_part.clone()])?;
v_type_word_count = core_len(&[v_type_words.clone()])?;
v_extra_type_tokens = core_gt(&[v_type_word_count.clone(), CoreValue::Num(1f64)])?;
if core_truthy(&v_extra_type_tokens) {
v_error = core_signature_error(&[CoreValue::from("Unexpected content after signature")])?;
return Err(core_as_error(&v_error));
}
v_type_token = core_list_get(&[
v_type_words.clone(),
CoreValue::Num(0f64),
CoreValue::from("string"),
])?;
v_array_info = core_string_remove_suffix(&[v_type_token.clone(), CoreValue::from("[]")])?;
v_type_name_raw = core_get(&v_array_info, &CoreValue::from("value"), CoreValue::Null);
v_type_name =
core_string_default_if_empty(&[v_type_name_raw.clone(), CoreValue::from("string")])?;
v_is_array = core_get(&v_array_info, &CoreValue::from("removed"), CoreValue::Null);
v_is_class = core_eq(&[v_type_name.clone(), CoreValue::from("class")])?;
if core_truthy(&v_is_class) {
v_class_input = core_not(&[v_output.clone()])?;
if core_truthy(&v_class_input) {
v_error = core_signature_error(&[CoreValue::from(
"Input field cannot use the \"class\" type",
)])?;
return Err(core_as_error(&v_error));
}
v_missing_quoted = core_is_none(&[v_quoted.clone()])?;
if core_truthy(&v_missing_quoted) {
v_error = core_signature_error(&[CoreValue::from(
"Missing class options after \"class\" type",
)])?;
return Err(core_as_error(&v_error));
}
v_class_option_text =
core_string_replace(&[v_quoted.clone(), CoreValue::from("|"), CoreValue::from(",")])?;
v_options =
core_string_split_trim_nonempty(&[v_class_option_text.clone(), CoreValue::from(",")])?;
v_option_count = core_len(&[v_options.clone()])?;
v_empty_options = core_eq(&[v_option_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_empty_options) {
v_error = core_signature_error(&[CoreValue::from(
"Missing class options after \"class\" type",
)])?;
return Err(core_as_error(&v_error));
}
v_type_attrs = CoreValue::new_map();
core_set(&v_type_attrs, CoreValue::from("name"), v_type_name.clone())?;
core_set(
&v_type_attrs,
CoreValue::from("is_array"),
v_is_array.clone(),
)?;
core_set(&v_type_attrs, CoreValue::from("options"), v_options.clone())?;
v_field_type = core_record_new(&[CoreValue::from("FieldType"), v_type_attrs.clone()])?;
v_none = core_none(&[])?;
v_field_attrs = CoreValue::new_map();
core_set(&v_field_attrs, CoreValue::from("name"), v_name.clone())?;
core_set(
&v_field_attrs,
CoreValue::from("type"),
v_field_type.clone(),
)?;
core_set(
&v_field_attrs,
CoreValue::from("description"),
v_none.clone(),
)?;
core_set(
&v_field_attrs,
CoreValue::from("is_optional"),
v_is_optional.clone(),
)?;
core_set(
&v_field_attrs,
CoreValue::from("is_internal"),
v_is_internal.clone(),
)?;
v_field = core_record_new(&[CoreValue::from("Field"), v_field_attrs.clone()])?;
_signature_validate_field_shape_impl(&[
v_field.clone(),
v_output.clone(),
CoreValue::Bool(false),
])?;
return Ok(v_field.clone());
}
v_type_attrs = CoreValue::new_map();
core_set(&v_type_attrs, CoreValue::from("name"), v_type_name.clone())?;
core_set(
&v_type_attrs,
CoreValue::from("is_array"),
v_is_array.clone(),
)?;
v_field_type = core_record_new(&[CoreValue::from("FieldType"), v_type_attrs.clone()])?;
v_field_attrs = CoreValue::new_map();
core_set(&v_field_attrs, CoreValue::from("name"), v_name.clone())?;
core_set(
&v_field_attrs,
CoreValue::from("type"),
v_field_type.clone(),
)?;
core_set(
&v_field_attrs,
CoreValue::from("description"),
v_quoted.clone(),
)?;
core_set(
&v_field_attrs,
CoreValue::from("is_optional"),
v_is_optional.clone(),
)?;
core_set(
&v_field_attrs,
CoreValue::from("is_internal"),
v_is_internal.clone(),
)?;
v_field = core_record_new(&[CoreValue::from("Field"), v_field_attrs.clone()])?;
_signature_validate_field_shape_impl(&[
v_field.clone(),
v_output.clone(),
CoreValue::Bool(false),
])?;
return Ok(v_field.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _signature_validate_field_shape_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_signature_validate_field_shape_impl");
let mut v_field = core_arg(args, 0);
let mut v_output = core_arg(args, 1);
let mut v_nested = core_arg(args, 2);
let mut v_class_options = CoreValue::Null;
let mut v_class_without_options = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_has_class_options = CoreValue::Null;
let mut v_has_nested = CoreValue::Null;
let mut v_input_class = CoreValue::Null;
let mut v_internal_input = CoreValue::Null;
let mut v_invalid_name = CoreValue::Null;
let mut v_is_array = CoreValue::Null;
let mut v_is_audio = CoreValue::Null;
let mut v_is_class = CoreValue::Null;
let mut v_is_file = CoreValue::Null;
let mut v_is_image = CoreValue::Null;
let mut v_is_input = CoreValue::Null;
let mut v_is_internal = CoreValue::Null;
let mut v_is_media = CoreValue::Null;
let mut v_known_type = CoreValue::Null;
let mut v_media_types = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_missing_class_options = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_nested_field = CoreValue::Null;
let mut v_nested_fields = CoreValue::Null;
let mut v_nested_map = CoreValue::Null;
let mut v_nested_media = CoreValue::Null;
let mut v_output_audio = CoreValue::Null;
let mut v_output_audio_array = CoreValue::Null;
let mut v_output_file = CoreValue::Null;
let mut v_output_image = CoreValue::Null;
let mut v_starts_number = CoreValue::Null;
let mut v_typ = CoreValue::Null;
let mut v_type_name = CoreValue::Null;
let mut v_unknown_type = CoreValue::Null;
let mut v_valid_name = CoreValue::Null;
let mut v_valid_types = CoreValue::Null;
v_name = core_get(&v_field, &CoreValue::from("name"), CoreValue::Null);
v_valid_name = core_regex_match(CoreValue::from("^[A-Za-z_][A-Za-z0-9_]*$"), &v_name)?;
v_invalid_name = core_not(&[v_valid_name.clone()])?;
if core_truthy(&v_invalid_name) {
v_starts_number = core_regex_match(CoreValue::from("^[0-9]"), &v_name)?;
if core_truthy(&v_starts_number) {
v_message = core_string_format(&[
CoreValue::from("Field name \"{}\" cannot start with a number"),
v_name.clone(),
])?;
v_error = core_signature_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
} else {
v_message = core_string_format(&[
CoreValue::from("Invalid field name: \"{}\""),
v_name.clone(),
])?;
v_error = core_signature_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
}
v_typ = core_get(&v_field, &CoreValue::from("type"), CoreValue::Null);
v_type_name = core_get(&v_typ, &CoreValue::from("name"), CoreValue::Null);
v_valid_types = CoreValue::new_list();
core_append(&v_valid_types, CoreValue::from("audio"))?;
core_append(&v_valid_types, CoreValue::from("boolean"))?;
core_append(&v_valid_types, CoreValue::from("class"))?;
core_append(&v_valid_types, CoreValue::from("code"))?;
core_append(&v_valid_types, CoreValue::from("date"))?;
core_append(&v_valid_types, CoreValue::from("dateRange"))?;
core_append(&v_valid_types, CoreValue::from("datetime"))?;
core_append(&v_valid_types, CoreValue::from("datetimeRange"))?;
core_append(&v_valid_types, CoreValue::from("file"))?;
core_append(&v_valid_types, CoreValue::from("image"))?;
core_append(&v_valid_types, CoreValue::from("json"))?;
core_append(&v_valid_types, CoreValue::from("number"))?;
core_append(&v_valid_types, CoreValue::from("object"))?;
core_append(&v_valid_types, CoreValue::from("string"))?;
core_append(&v_valid_types, CoreValue::from("url"))?;
v_known_type = core_contains(&[v_valid_types.clone(), v_type_name.clone()])?;
v_unknown_type = core_not(&[v_known_type.clone()])?;
if core_truthy(&v_unknown_type) {
v_message =
core_string_format(&[CoreValue::from("Invalid type \"{}\""), v_type_name.clone()])?;
v_error = core_signature_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
v_media_types = CoreValue::new_list();
core_append(&v_media_types, CoreValue::from("image"))?;
core_append(&v_media_types, CoreValue::from("audio"))?;
core_append(&v_media_types, CoreValue::from("file"))?;
v_is_media = core_contains(&[v_media_types.clone(), v_type_name.clone()])?;
v_nested_media = core_and(&[v_nested.clone(), v_is_media.clone()])?;
if core_truthy(&v_nested_media) {
v_message = core_string_format(&[
CoreValue::from("Media type '{}' is not allowed in nested object fields"),
v_type_name.clone(),
])?;
v_error = core_signature_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
v_is_class = core_eq(&[v_type_name.clone(), CoreValue::from("class")])?;
v_is_input = core_not(&[v_output.clone()])?;
v_input_class = core_and(&[v_is_class.clone(), v_is_input.clone()])?;
if core_truthy(&v_input_class) {
v_error =
core_signature_error(&[CoreValue::from("Input field cannot use the \"class\" type")])?;
return Err(core_as_error(&v_error));
}
v_class_options = core_get(&v_typ, &CoreValue::from("options"), CoreValue::Null);
v_has_class_options = core_truthy_value(&[v_class_options.clone()])?;
v_missing_class_options = core_not(&[v_has_class_options.clone()])?;
v_class_without_options = core_and(&[v_is_class.clone(), v_missing_class_options.clone()])?;
if core_truthy(&v_class_without_options) {
v_error = core_signature_error(&[CoreValue::from(
"Missing class options after \"class\" type",
)])?;
return Err(core_as_error(&v_error));
}
v_is_internal = core_get(
&v_field,
&CoreValue::from("is_internal"),
CoreValue::Bool(false),
);
v_internal_input = core_and(&[v_is_internal.clone(), v_is_input.clone()])?;
if core_truthy(&v_internal_input) {
v_error = core_signature_error(&[CoreValue::from(
"Input field cannot use the internal marker",
)])?;
return Err(core_as_error(&v_error));
}
v_is_image = core_eq(&[v_type_name.clone(), CoreValue::from("image")])?;
v_output_image = core_and(&[v_output.clone(), v_is_image.clone()])?;
if core_truthy(&v_output_image) {
v_error = core_signature_error(&[CoreValue::from(
"Image type is not supported in output fields",
)])?;
return Err(core_as_error(&v_error));
}
v_is_file = core_eq(&[v_type_name.clone(), CoreValue::from("file")])?;
v_output_file = core_and(&[v_output.clone(), v_is_file.clone()])?;
if core_truthy(&v_output_file) {
v_error = core_signature_error(&[CoreValue::from(
"File type is not supported in output fields",
)])?;
return Err(core_as_error(&v_error));
}
v_is_audio = core_eq(&[v_type_name.clone(), CoreValue::from("audio")])?;
v_is_array = core_get(&v_typ, &CoreValue::from("is_array"), CoreValue::Bool(false));
v_output_audio = core_and(&[v_output.clone(), v_is_audio.clone()])?;
v_output_audio_array = core_and(&[v_output_audio.clone(), v_is_array.clone()])?;
if core_truthy(&v_output_audio_array) {
v_error = core_signature_error(&[CoreValue::from(
"Arrays of audio are not supported in output fields",
)])?;
return Err(core_as_error(&v_error));
}
v_nested_map = core_get(&v_typ, &CoreValue::from("fields"), CoreValue::Null);
v_has_nested = core_truthy_value(&[v_nested_map.clone()])?;
if core_truthy(&v_has_nested) {
v_nested_fields = core_fields_from_map(&[v_nested_map.clone()])?;
for v_nested_field in core_iter(&v_nested_fields)? {
let mut v_nested_field = v_nested_field;
_signature_validate_field_shape_impl(&[
v_nested_field.clone(),
v_output.clone(),
CoreValue::Bool(true),
])?;
}
}
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _signature_validate_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_signature_validate_impl");
let mut v_signature = core_arg(args, 0);
let mut v_collision = CoreValue::Null;
let mut v_duplicate = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_field = CoreValue::Null;
let mut v_field_name = CoreValue::Null;
let mut v_input_count = CoreValue::Null;
let mut v_inputs = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_no_inputs = CoreValue::Null;
let mut v_no_outputs = CoreValue::Null;
let mut v_output_count = CoreValue::Null;
let mut v_outputs = CoreValue::Null;
let mut v_seen_inputs = CoreValue::Null;
let mut v_seen_outputs = CoreValue::Null;
v_inputs = core_get(
&v_signature,
&CoreValue::from("input_fields"),
CoreValue::Null,
);
v_outputs = core_get(
&v_signature,
&CoreValue::from("output_fields"),
CoreValue::Null,
);
v_input_count = core_len(&[v_inputs.clone()])?;
v_no_inputs = core_eq(&[v_input_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_no_inputs) {
v_error = core_signature_error(&[CoreValue::from("No input fields specified")])?;
return Err(core_as_error(&v_error));
}
v_output_count = core_len(&[v_outputs.clone()])?;
v_no_outputs = core_eq(&[v_output_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_no_outputs) {
v_error = core_signature_error(&[CoreValue::from("No output fields specified")])?;
return Err(core_as_error(&v_error));
}
v_seen_inputs = CoreValue::new_list();
for v_field in core_iter(&v_inputs)? {
let mut v_field = v_field;
_signature_validate_field_shape_impl(&[
v_field.clone(),
CoreValue::Bool(false),
CoreValue::Bool(false),
])?;
v_field_name = core_get(&v_field, &CoreValue::from("name"), CoreValue::Null);
v_duplicate = core_contains(&[v_seen_inputs.clone(), v_field_name.clone()])?;
if core_truthy(&v_duplicate) {
v_message = core_string_format(&[
CoreValue::from("Duplicate input field name: \"{}\""),
v_field_name.clone(),
])?;
v_error = core_signature_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
core_append(&v_seen_inputs, v_field_name.clone())?;
}
v_seen_outputs = CoreValue::new_list();
for v_field in core_iter(&v_outputs)? {
let mut v_field = v_field;
_signature_validate_field_shape_impl(&[
v_field.clone(),
CoreValue::Bool(true),
CoreValue::Bool(false),
])?;
v_field_name = core_get(&v_field, &CoreValue::from("name"), CoreValue::Null);
v_collision = core_contains(&[v_seen_inputs.clone(), v_field_name.clone()])?;
if core_truthy(&v_collision) {
v_message = core_string_format(&[
CoreValue::from("Field name \"{}\" appears in both inputs and outputs"),
v_field_name.clone(),
])?;
v_error = core_signature_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
v_duplicate = core_contains(&[v_seen_outputs.clone(), v_field_name.clone()])?;
if core_truthy(&v_duplicate) {
v_message = core_string_format(&[
CoreValue::from("Duplicate output field name: \"{}\""),
v_field_name.clone(),
])?;
v_error = core_signature_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
core_append(&v_seen_outputs, v_field_name.clone())?;
}
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn validate_fields(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("validate_fields");
let mut v_fields = core_arg(args, 0);
let mut v_values = core_arg(args, 1);
let mut v_context = core_arg(args, 2);
_validate_fields_impl(&[v_fields.clone(), v_values.clone(), v_context.clone()])?;
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn to_json_schema(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("to_json_schema");
let mut v_fields = core_arg(args, 0);
let mut v_schema_title = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_schema = CoreValue::Null;
v_schema = _schema_to_json_schema_impl(&[
v_fields.clone(),
v_schema_title.clone(),
v_options.clone(),
])?;
return Ok(v_schema.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _schema_required_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_schema_required_impl");
let mut v_field = core_arg(args, 0);
let mut v_options = core_arg(args, 1);
let mut v_is_optional = CoreValue::Null;
let mut v_not_optional = CoreValue::Null;
let mut v_required = CoreValue::Null;
let mut v_strict = CoreValue::Null;
let mut v_strict_camel = CoreValue::Null;
let mut v_strict_snake = CoreValue::Null;
v_strict_camel = core_get(
&v_options,
&CoreValue::from("strictStructuredOutputs"),
CoreValue::Bool(false),
);
v_strict_snake = core_get(
&v_options,
&CoreValue::from("strict_structured_outputs"),
CoreValue::Bool(false),
);
v_strict = core_or(&[v_strict_camel.clone(), v_strict_snake.clone()])?;
v_is_optional = core_get(
&v_field,
&CoreValue::from("is_optional"),
CoreValue::Bool(false),
);
v_not_optional = core_not(&[v_is_optional.clone()])?;
v_required = core_or(&[v_strict.clone(), v_not_optional.clone()])?;
return Ok(v_required.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn validate_output(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("validate_output");
let mut v_fields = core_arg(args, 0);
let mut v_values = core_arg(args, 1);
let mut v_validated = CoreValue::Null;
v_validated = _validate_output_impl(&[v_fields.clone(), v_values.clone()])?;
return Ok(v_validated.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn validate_value(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("validate_value");
let mut v_field = core_arg(args, 0);
let mut v_value = core_arg(args, 1);
let mut v_path = core_arg(args, 2);
_validate_value_impl(&[v_field.clone(), v_value.clone(), v_path.clone()])?;
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _schema_flexible_json_as_string_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_schema_flexible_json_as_string_impl");
let mut v_typ = core_arg(args, 0);
let mut v_options = core_arg(args, 1);
let mut v_as_string = CoreValue::Null;
let mut v_camel = CoreValue::Null;
let mut v_enabled = CoreValue::Null;
let mut v_fields = CoreValue::Null;
let mut v_flexible_type = CoreValue::Null;
let mut v_has_fields = CoreValue::Null;
let mut v_is_json = CoreValue::Null;
let mut v_is_object = CoreValue::Null;
let mut v_snake = CoreValue::Null;
let mut v_type_name = CoreValue::Null;
let mut v_unshaped = CoreValue::Null;
let mut v_unshaped_object = CoreValue::Null;
v_camel = core_get(
&v_options,
&CoreValue::from("flexibleJsonFieldsAsString"),
CoreValue::Bool(false),
);
v_snake = core_get(
&v_options,
&CoreValue::from("flexible_json_fields_as_string"),
CoreValue::Bool(false),
);
v_enabled = core_or(&[v_camel.clone(), v_snake.clone()])?;
v_type_name = core_get(&v_typ, &CoreValue::from("name"), CoreValue::Null);
v_is_json = core_eq(&[v_type_name.clone(), CoreValue::from("json")])?;
v_is_object = core_eq(&[v_type_name.clone(), CoreValue::from("object")])?;
v_fields = core_get(&v_typ, &CoreValue::from("fields"), CoreValue::Null);
v_has_fields = core_truthy_value(&[v_fields.clone()])?;
v_unshaped = core_not(&[v_has_fields.clone()])?;
v_unshaped_object = core_and(&[v_is_object.clone(), v_unshaped.clone()])?;
v_flexible_type = core_or(&[v_is_json.clone(), v_unshaped_object.clone()])?;
v_as_string = core_and(&[v_enabled.clone(), v_flexible_type.clone()])?;
return Ok(v_as_string.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn strip_internal(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("strip_internal");
let mut v_fields = core_arg(args, 0);
let mut v_values = core_arg(args, 1);
let mut v_public_values = CoreValue::Null;
v_public_values = _strip_internal_fields_impl(&[v_fields.clone(), v_values.clone()])?;
return Ok(v_public_values.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _validate_fields_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_validate_fields_impl");
let mut v_fields = core_arg(args, 0);
let mut v_values = core_arg(args, 1);
let mut v_context = core_arg(args, 2);
let mut v_child_path = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_field = CoreValue::Null;
let mut v_field_name = CoreValue::Null;
let mut v_field_title = CoreValue::Null;
let mut v_field_value = CoreValue::Null;
let mut v_has_value = CoreValue::Null;
let mut v_is_null = CoreValue::Null;
let mut v_is_optional = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_missing = CoreValue::Null;
let mut v_missing_or_null = CoreValue::Null;
let mut v_required_missing = CoreValue::Null;
let mut v_values_is_object = CoreValue::Null;
let mut v_values_not_object = CoreValue::Null;
v_values_is_object = core_type_is(&v_values, CoreValue::from("object"));
v_values_not_object = core_not(&[v_values_is_object.clone()])?;
if core_truthy(&v_values_not_object) {
v_message =
core_string_format(&[CoreValue::from("{} must be an object"), v_context.clone()])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
for v_field in core_iter(&v_fields)? {
let mut v_field = v_field;
v_field_name = core_get(&v_field, &CoreValue::from("name"), CoreValue::Null);
v_field_title = core_get(&v_field, &CoreValue::from("title"), CoreValue::Null);
v_is_optional = core_get(
&v_field,
&CoreValue::from("is_optional"),
CoreValue::Bool(false),
);
v_has_value = core_map_contains(&[v_values.clone(), v_field_name.clone()])?;
v_missing = core_not(&[v_has_value.clone()])?;
v_field_value = core_get(&v_values, &v_field_name.clone(), CoreValue::Null);
v_is_null = core_is_none(&[v_field_value.clone()])?;
v_missing_or_null = core_or(&[v_missing.clone(), v_is_null.clone()])?;
if core_truthy(&v_missing_or_null) {
v_required_missing = core_not(&[v_is_optional.clone()])?;
if core_truthy(&v_required_missing) {
v_message = core_string_format(&[
CoreValue::from("Required field is missing: '{}'"),
v_field_title.clone(),
])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
} else {
v_child_path = core_string_format(&[
CoreValue::from("{}.{}"),
v_context.clone(),
v_field_name.clone(),
])?;
_validate_value_impl(&[v_field.clone(), v_field_value.clone(), v_child_path.clone()])?;
}
}
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _schema_json_type_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_schema_json_type_impl");
let mut v_type_name = core_arg(args, 0);
let mut v_flexible_names = CoreValue::Null;
let mut v_is_boolean = CoreValue::Null;
let mut v_is_flexible = CoreValue::Null;
let mut v_is_number = CoreValue::Null;
let mut v_is_string = CoreValue::Null;
let mut v_json_types = CoreValue::Null;
let mut v_string_types = CoreValue::Null;
v_string_types = CoreValue::new_list();
core_append(&v_string_types, CoreValue::from("string"))?;
core_append(&v_string_types, CoreValue::from("code"))?;
core_append(&v_string_types, CoreValue::from("url"))?;
core_append(&v_string_types, CoreValue::from("date"))?;
core_append(&v_string_types, CoreValue::from("datetime"))?;
core_append(&v_string_types, CoreValue::from("dateRange"))?;
core_append(&v_string_types, CoreValue::from("datetimeRange"))?;
core_append(&v_string_types, CoreValue::from("image"))?;
core_append(&v_string_types, CoreValue::from("audio"))?;
core_append(&v_string_types, CoreValue::from("file"))?;
v_is_string = core_contains(&[v_string_types.clone(), v_type_name.clone()])?;
if core_truthy(&v_is_string) {
return Ok(CoreValue::from("string"));
}
v_is_number = core_eq(&[v_type_name.clone(), CoreValue::from("number")])?;
if core_truthy(&v_is_number) {
return Ok(CoreValue::from("number"));
}
v_is_boolean = core_eq(&[v_type_name.clone(), CoreValue::from("boolean")])?;
if core_truthy(&v_is_boolean) {
return Ok(CoreValue::from("boolean"));
}
v_json_types = CoreValue::new_list();
core_append(&v_json_types, CoreValue::from("object"))?;
core_append(&v_json_types, CoreValue::from("array"))?;
core_append(&v_json_types, CoreValue::from("string"))?;
core_append(&v_json_types, CoreValue::from("number"))?;
core_append(&v_json_types, CoreValue::from("boolean"))?;
core_append(&v_json_types, CoreValue::from("null"))?;
v_flexible_names = CoreValue::new_list();
core_append(&v_flexible_names, CoreValue::from("json"))?;
core_append(&v_flexible_names, CoreValue::from("object"))?;
v_is_flexible = core_contains(&[v_flexible_names.clone(), v_type_name.clone()])?;
if core_truthy(&v_is_flexible) {
return Ok(v_json_types.clone());
}
return Ok(CoreValue::from("string"));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _validate_output_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_validate_output_impl");
let mut v_fields = core_arg(args, 0);
let mut v_values = core_arg(args, 1);
let mut v_alias_title = CoreValue::Null;
let mut v_field = CoreValue::Null;
let mut v_field_name = CoreValue::Null;
let mut v_field_title = CoreValue::Null;
let mut v_has_name = CoreValue::Null;
let mut v_has_title = CoreValue::Null;
let mut v_missing_name = CoreValue::Null;
let mut v_normalized = CoreValue::Null;
let mut v_title_value = CoreValue::Null;
v_normalized = v_values.clone();
for v_field in core_iter(&v_fields)? {
let mut v_field = v_field;
v_field_name = core_get(&v_field, &CoreValue::from("name"), CoreValue::Null);
v_field_title = core_get(&v_field, &CoreValue::from("title"), CoreValue::Null);
v_has_name = core_map_contains(&[v_normalized.clone(), v_field_name.clone()])?;
v_missing_name = core_not(&[v_has_name.clone()])?;
v_has_title = core_map_contains(&[v_normalized.clone(), v_field_title.clone()])?;
v_alias_title = core_and(&[v_missing_name.clone(), v_has_title.clone()])?;
if core_truthy(&v_alias_title) {
v_title_value = core_get(&v_normalized, &v_field_title.clone(), CoreValue::Null);
core_set(&v_normalized, v_field_name.clone(), v_title_value.clone())?;
}
}
_validate_fields_impl(&[
v_fields.clone(),
v_normalized.clone(),
CoreValue::from("output"),
])?;
return Ok(v_normalized.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _schema_enhance_description_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_schema_enhance_description_impl");
let mut v_base = core_arg(args, 0);
let mut v_typ = core_arg(args, 1);
let mut v_constraint_count = CoreValue::Null;
let mut v_constraint_text = CoreValue::Null;
let mut v_constraints = CoreValue::Null;
let mut v_description = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_format = CoreValue::Null;
let mut v_format_url = CoreValue::Null;
let mut v_has_both = CoreValue::Null;
let mut v_has_constraints = CoreValue::Null;
let mut v_has_length_constraints = CoreValue::Null;
let mut v_has_max = CoreValue::Null;
let mut v_has_maximum = CoreValue::Null;
let mut v_has_min = CoreValue::Null;
let mut v_has_minimum = CoreValue::Null;
let mut v_has_pattern = CoreValue::Null;
let mut v_is_date = CoreValue::Null;
let mut v_is_date_range = CoreValue::Null;
let mut v_is_datetime = CoreValue::Null;
let mut v_is_datetime_range = CoreValue::Null;
let mut v_is_email = CoreValue::Null;
let mut v_is_number = CoreValue::Null;
let mut v_is_url = CoreValue::Null;
let mut v_length_types = CoreValue::Null;
let mut v_max_length = CoreValue::Null;
let mut v_maximum = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_min_length = CoreValue::Null;
let mut v_minimum = CoreValue::Null;
let mut v_missing_pattern_description = CoreValue::Null;
let mut v_pattern = CoreValue::Null;
let mut v_pattern_description = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_type_name = CoreValue::Null;
let mut v_type_url = CoreValue::Null;
let mut v_url_formats = CoreValue::Null;
v_constraints = CoreValue::new_list();
v_type_name = core_get(&v_typ, &CoreValue::from("name"), CoreValue::Null);
v_format = core_get(&v_typ, &CoreValue::from("format"), CoreValue::Null);
v_is_email = core_eq(&[v_format.clone(), CoreValue::from("email")])?;
if core_truthy(&v_is_email) {
core_append(
&v_constraints,
CoreValue::from("Must be a valid email address format"),
)?;
}
v_url_formats = CoreValue::new_list();
core_append(&v_url_formats, CoreValue::from("uri"))?;
core_append(&v_url_formats, CoreValue::from("url"))?;
v_format_url = core_contains(&[v_url_formats.clone(), v_format.clone()])?;
v_type_url = core_eq(&[v_type_name.clone(), CoreValue::from("url")])?;
v_is_url = core_or(&[v_format_url.clone(), v_type_url.clone()])?;
if core_truthy(&v_is_url) {
core_append(
&v_constraints,
CoreValue::from("Must be a valid URL format"),
)?;
}
v_length_types = CoreValue::new_list();
core_append(&v_length_types, CoreValue::from("string"))?;
core_append(&v_length_types, CoreValue::from("code"))?;
core_append(&v_length_types, CoreValue::from("url"))?;
core_append(&v_length_types, CoreValue::from("date"))?;
core_append(&v_length_types, CoreValue::from("dateRange"))?;
core_append(&v_length_types, CoreValue::from("datetime"))?;
core_append(&v_length_types, CoreValue::from("datetimeRange"))?;
v_has_length_constraints = core_contains(&[v_length_types.clone(), v_type_name.clone()])?;
if core_truthy(&v_has_length_constraints) {
v_min_length = core_get(&v_typ, &CoreValue::from("min_length"), CoreValue::Null);
v_max_length = core_get(&v_typ, &CoreValue::from("max_length"), CoreValue::Null);
v_has_min = core_is_not_none(&[v_min_length.clone()])?;
v_has_max = core_is_not_none(&[v_max_length.clone()])?;
v_has_both = core_and(&[v_has_min.clone(), v_has_max.clone()])?;
if core_truthy(&v_has_both) {
v_text = core_string_format(&[
CoreValue::from("Minimum length: {} characters, maximum length: {} characters"),
v_min_length.clone(),
v_max_length.clone(),
])?;
core_append(&v_constraints, v_text.clone())?;
} else {
if core_truthy(&v_has_min) {
v_text = core_string_format(&[
CoreValue::from("Minimum length: {} characters"),
v_min_length.clone(),
])?;
core_append(&v_constraints, v_text.clone())?;
} else {
if core_truthy(&v_has_max) {
v_text = core_string_format(&[
CoreValue::from("Maximum length: {} characters"),
v_max_length.clone(),
])?;
core_append(&v_constraints, v_text.clone())?;
}
}
}
}
v_is_number = core_eq(&[v_type_name.clone(), CoreValue::from("number")])?;
if core_truthy(&v_is_number) {
v_minimum = core_get(&v_typ, &CoreValue::from("minimum"), CoreValue::Null);
v_maximum = core_get(&v_typ, &CoreValue::from("maximum"), CoreValue::Null);
v_has_minimum = core_is_not_none(&[v_minimum.clone()])?;
v_has_maximum = core_is_not_none(&[v_maximum.clone()])?;
v_has_both = core_and(&[v_has_minimum.clone(), v_has_maximum.clone()])?;
if core_truthy(&v_has_both) {
v_text = core_string_format(&[
CoreValue::from("Minimum value: {}, maximum value: {}"),
v_minimum.clone(),
v_maximum.clone(),
])?;
core_append(&v_constraints, v_text.clone())?;
} else {
if core_truthy(&v_has_minimum) {
v_text =
core_string_format(&[CoreValue::from("Minimum value: {}"), v_minimum.clone()])?;
core_append(&v_constraints, v_text.clone())?;
} else {
if core_truthy(&v_has_maximum) {
v_text = core_string_format(&[
CoreValue::from("Maximum value: {}"),
v_maximum.clone(),
])?;
core_append(&v_constraints, v_text.clone())?;
}
}
}
}
v_pattern = core_get(&v_typ, &CoreValue::from("pattern"), CoreValue::Null);
v_has_pattern = core_is_not_none(&[v_pattern.clone()])?;
if core_truthy(&v_has_pattern) {
v_pattern_description = core_get(
&v_typ,
&CoreValue::from("pattern_description"),
CoreValue::Null,
);
v_missing_pattern_description = core_is_none(&[v_pattern_description.clone()])?;
if core_truthy(&v_missing_pattern_description) {
v_message = core_string_format(&[CoreValue::from("Field with pattern '{}' must include a patternDescription to explain the pattern to the LLM"), v_pattern.clone()])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
} else {
core_append(&v_constraints, v_pattern_description.clone())?;
}
}
v_is_date = core_eq(&[v_type_name.clone(), CoreValue::from("date")])?;
if core_truthy(&v_is_date) {
core_append(&v_constraints, CoreValue::from("Format: YYYY-MM-DD"))?;
}
v_is_date_range = core_eq(&[v_type_name.clone(), CoreValue::from("dateRange")])?;
if core_truthy(&v_is_date_range) {
core_append(
&v_constraints,
CoreValue::from(
"Format: JSON object with start and end dates, or YYYY-MM-DD/YYYY-MM-DD",
),
)?;
}
v_is_datetime = core_eq(&[v_type_name.clone(), CoreValue::from("datetime")])?;
if core_truthy(&v_is_datetime) {
core_append(
&v_constraints,
CoreValue::from("Format: ISO 8601 date-time"),
)?;
}
v_is_datetime_range = core_eq(&[v_type_name.clone(), CoreValue::from("datetimeRange")])?;
if core_truthy(&v_is_datetime_range) {
core_append(&v_constraints, CoreValue::from("Format: JSON object with start and end ISO 8601 date-times, or ISO interval start/end"))?;
}
v_constraint_count = core_len(&[v_constraints.clone()])?;
v_has_constraints = core_gt(&[v_constraint_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_constraints) {
v_constraint_text = core_string_join(&CoreValue::from(". "), &v_constraints)?;
v_description = core_description_append(&[v_base.clone(), v_constraint_text.clone()])?;
return Ok(v_description.clone());
}
return Ok(v_base.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _validate_string_constraints_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_validate_string_constraints_impl");
let mut v_value = core_arg(args, 0);
let mut v_field = core_arg(args, 1);
let mut v_error = CoreValue::Null;
let mut v_format = CoreValue::Null;
let mut v_has_max = CoreValue::Null;
let mut v_has_min = CoreValue::Null;
let mut v_has_pattern = CoreValue::Null;
let mut v_invalid_email = CoreValue::Null;
let mut v_invalid_url = CoreValue::Null;
let mut v_is_email = CoreValue::Null;
let mut v_is_url_format = CoreValue::Null;
let mut v_length = CoreValue::Null;
let mut v_matches = CoreValue::Null;
let mut v_max_length = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_min_length = CoreValue::Null;
let mut v_pattern = CoreValue::Null;
let mut v_pattern_failed = CoreValue::Null;
let mut v_title = CoreValue::Null;
let mut v_too_long = CoreValue::Null;
let mut v_too_short = CoreValue::Null;
let mut v_typ = CoreValue::Null;
let mut v_url_formats = CoreValue::Null;
let mut v_valid_email = CoreValue::Null;
let mut v_valid_url = CoreValue::Null;
v_typ = core_get(&v_field, &CoreValue::from("type"), CoreValue::Null);
v_title = core_get(&v_field, &CoreValue::from("title"), CoreValue::Null);
v_min_length = core_get(&v_typ, &CoreValue::from("min_length"), CoreValue::Null);
v_has_min = core_is_not_none(&[v_min_length.clone()])?;
if core_truthy(&v_has_min) {
v_length = core_len(&[v_value.clone()])?;
v_too_short = core_lt(&[v_length.clone(), v_min_length.clone()])?;
if core_truthy(&v_too_short) {
v_message = core_string_format(&[
CoreValue::from(
"Field '{}' failed validation: String must be at least {} characters long.",
),
v_title.clone(),
v_min_length.clone(),
])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
}
v_max_length = core_get(&v_typ, &CoreValue::from("max_length"), CoreValue::Null);
v_has_max = core_is_not_none(&[v_max_length.clone()])?;
if core_truthy(&v_has_max) {
v_length = core_len(&[v_value.clone()])?;
v_too_long = core_gt(&[v_length.clone(), v_max_length.clone()])?;
if core_truthy(&v_too_long) {
v_message = core_string_format(&[
CoreValue::from(
"Field '{}' failed validation: String must be at most {} characters long.",
),
v_title.clone(),
v_max_length.clone(),
])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
}
v_pattern = core_get(&v_typ, &CoreValue::from("pattern"), CoreValue::Null);
v_has_pattern = core_is_not_none(&[v_pattern.clone()])?;
if core_truthy(&v_has_pattern) {
v_matches = core_regex_match(v_pattern.clone(), &v_value)?;
v_pattern_failed = core_not(&[v_matches.clone()])?;
if core_truthy(&v_pattern_failed) {
v_message = core_string_format(&[
CoreValue::from("Field '{}' failed validation: String must match pattern /{}/."),
v_title.clone(),
v_pattern.clone(),
])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
}
v_format = core_get(&v_typ, &CoreValue::from("format"), CoreValue::Null);
v_is_email = core_eq(&[v_format.clone(), CoreValue::from("email")])?;
if core_truthy(&v_is_email) {
v_valid_email =
core_regex_match(CoreValue::from("^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"), &v_value)?;
v_invalid_email = core_not(&[v_valid_email.clone()])?;
if core_truthy(&v_invalid_email) {
v_message = core_string_format(&[
CoreValue::from(
"Field '{}' failed validation: String must be a valid email address.",
),
v_title.clone(),
])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
}
v_url_formats = CoreValue::new_list();
core_append(&v_url_formats, CoreValue::from("uri"))?;
core_append(&v_url_formats, CoreValue::from("url"))?;
v_is_url_format = core_contains(&[v_url_formats.clone(), v_format.clone()])?;
if core_truthy(&v_is_url_format) {
v_valid_url = core_url_valid(&[v_value.clone()])?;
v_invalid_url = core_not(&[v_valid_url.clone()])?;
if core_truthy(&v_invalid_url) {
v_message = core_string_format(&[
CoreValue::from("Invalid URL for '{}': Invalid URL format."),
v_title.clone(),
])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
}
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _validate_number_constraints_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_validate_number_constraints_impl");
let mut v_value = core_arg(args, 0);
let mut v_field = core_arg(args, 1);
let mut v_error = CoreValue::Null;
let mut v_has_maximum = CoreValue::Null;
let mut v_has_minimum = CoreValue::Null;
let mut v_maximum = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_minimum = CoreValue::Null;
let mut v_title = CoreValue::Null;
let mut v_too_large = CoreValue::Null;
let mut v_too_small = CoreValue::Null;
let mut v_typ = CoreValue::Null;
v_typ = core_get(&v_field, &CoreValue::from("type"), CoreValue::Null);
v_title = core_get(&v_field, &CoreValue::from("title"), CoreValue::Null);
v_minimum = core_get(&v_typ, &CoreValue::from("minimum"), CoreValue::Null);
v_has_minimum = core_is_not_none(&[v_minimum.clone()])?;
if core_truthy(&v_has_minimum) {
v_too_small = core_lt(&[v_value.clone(), v_minimum.clone()])?;
if core_truthy(&v_too_small) {
v_message = core_string_format(&[
CoreValue::from("Field '{}' failed validation: Number must be at least {}."),
v_title.clone(),
v_minimum.clone(),
])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
}
v_maximum = core_get(&v_typ, &CoreValue::from("maximum"), CoreValue::Null);
v_has_maximum = core_is_not_none(&[v_maximum.clone()])?;
if core_truthy(&v_has_maximum) {
v_too_large = core_gt(&[v_value.clone(), v_maximum.clone()])?;
if core_truthy(&v_too_large) {
v_message = core_string_format(&[
CoreValue::from("Field '{}' failed validation: Number must be at most {}."),
v_title.clone(),
v_maximum.clone(),
])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
}
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _schema_apply_constraints_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_schema_apply_constraints_impl");
let mut v_schema = core_arg(args, 0);
let mut v_typ = core_arg(args, 1);
let mut v_default_date_format = CoreValue::Null;
let mut v_default_datetime_format = CoreValue::Null;
let mut v_default_url_format = CoreValue::Null;
let mut v_format = CoreValue::Null;
let mut v_has_format = CoreValue::Null;
let mut v_has_max = CoreValue::Null;
let mut v_has_maximum = CoreValue::Null;
let mut v_has_min = CoreValue::Null;
let mut v_has_minimum = CoreValue::Null;
let mut v_has_pattern = CoreValue::Null;
let mut v_is_date = CoreValue::Null;
let mut v_is_datetime = CoreValue::Null;
let mut v_is_number = CoreValue::Null;
let mut v_is_string_type = CoreValue::Null;
let mut v_is_url = CoreValue::Null;
let mut v_max_length = CoreValue::Null;
let mut v_maximum = CoreValue::Null;
let mut v_min_length = CoreValue::Null;
let mut v_minimum = CoreValue::Null;
let mut v_missing_format = CoreValue::Null;
let mut v_pattern = CoreValue::Null;
let mut v_string_types = CoreValue::Null;
let mut v_type_name = CoreValue::Null;
v_type_name = core_get(&v_typ, &CoreValue::from("name"), CoreValue::Null);
v_string_types = CoreValue::new_list();
core_append(&v_string_types, CoreValue::from("string"))?;
core_append(&v_string_types, CoreValue::from("code"))?;
core_append(&v_string_types, CoreValue::from("url"))?;
core_append(&v_string_types, CoreValue::from("date"))?;
core_append(&v_string_types, CoreValue::from("dateRange"))?;
core_append(&v_string_types, CoreValue::from("datetime"))?;
core_append(&v_string_types, CoreValue::from("datetimeRange"))?;
v_is_string_type = core_contains(&[v_string_types.clone(), v_type_name.clone()])?;
if core_truthy(&v_is_string_type) {
v_min_length = core_get(&v_typ, &CoreValue::from("min_length"), CoreValue::Null);
v_has_min = core_is_not_none(&[v_min_length.clone()])?;
if core_truthy(&v_has_min) {
core_set(
&v_schema,
CoreValue::from("minLength"),
v_min_length.clone(),
)?;
}
v_max_length = core_get(&v_typ, &CoreValue::from("max_length"), CoreValue::Null);
v_has_max = core_is_not_none(&[v_max_length.clone()])?;
if core_truthy(&v_has_max) {
core_set(
&v_schema,
CoreValue::from("maxLength"),
v_max_length.clone(),
)?;
}
v_pattern = core_get(&v_typ, &CoreValue::from("pattern"), CoreValue::Null);
v_has_pattern = core_is_not_none(&[v_pattern.clone()])?;
if core_truthy(&v_has_pattern) {
core_set(&v_schema, CoreValue::from("pattern"), v_pattern.clone())?;
}
v_format = core_get(&v_typ, &CoreValue::from("format"), CoreValue::Null);
v_has_format = core_is_not_none(&[v_format.clone()])?;
if core_truthy(&v_has_format) {
core_set(&v_schema, CoreValue::from("format"), v_format.clone())?;
}
v_is_url = core_eq(&[v_type_name.clone(), CoreValue::from("url")])?;
v_missing_format = core_not(&[v_has_format.clone()])?;
v_default_url_format = core_and(&[v_is_url.clone(), v_missing_format.clone()])?;
if core_truthy(&v_default_url_format) {
core_set(&v_schema, CoreValue::from("format"), CoreValue::from("uri"))?;
}
v_is_date = core_eq(&[v_type_name.clone(), CoreValue::from("date")])?;
v_default_date_format = core_and(&[v_is_date.clone(), v_missing_format.clone()])?;
if core_truthy(&v_default_date_format) {
core_set(
&v_schema,
CoreValue::from("format"),
CoreValue::from("date"),
)?;
}
v_is_datetime = core_eq(&[v_type_name.clone(), CoreValue::from("datetime")])?;
v_default_datetime_format = core_and(&[v_is_datetime.clone(), v_missing_format.clone()])?;
if core_truthy(&v_default_datetime_format) {
core_set(
&v_schema,
CoreValue::from("format"),
CoreValue::from("date-time"),
)?;
}
} else {
v_is_number = core_eq(&[v_type_name.clone(), CoreValue::from("number")])?;
if core_truthy(&v_is_number) {
v_minimum = core_get(&v_typ, &CoreValue::from("minimum"), CoreValue::Null);
v_has_minimum = core_is_not_none(&[v_minimum.clone()])?;
if core_truthy(&v_has_minimum) {
core_set(&v_schema, CoreValue::from("minimum"), v_minimum.clone())?;
}
v_maximum = core_get(&v_typ, &CoreValue::from("maximum"), CoreValue::Null);
v_has_maximum = core_is_not_none(&[v_maximum.clone()])?;
if core_truthy(&v_has_maximum) {
core_set(&v_schema, CoreValue::from("maximum"), v_maximum.clone())?;
}
}
}
return Ok(v_schema.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _validate_value_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_validate_value_impl");
let mut v_field = core_arg(args, 0);
let mut v_value = core_arg(args, 1);
let mut v_path = core_arg(args, 2);
let mut v_error = CoreValue::Null;
let mut v_field_name = CoreValue::Null;
let mut v_field_title = CoreValue::Null;
let mut v_has_nested = CoreValue::Null;
let mut v_has_options = CoreValue::Null;
let mut v_invalid_audio = CoreValue::Null;
let mut v_invalid_file = CoreValue::Null;
let mut v_invalid_image = CoreValue::Null;
let mut v_invalid_url = CoreValue::Null;
let mut v_invalid_url_shape = CoreValue::Null;
let mut v_is_array = CoreValue::Null;
let mut v_is_audio = CoreValue::Null;
let mut v_is_boolean = CoreValue::Null;
let mut v_is_boolean_type = CoreValue::Null;
let mut v_is_class_string = CoreValue::Null;
let mut v_is_class_type = CoreValue::Null;
let mut v_is_file = CoreValue::Null;
let mut v_is_image = CoreValue::Null;
let mut v_is_json = CoreValue::Null;
let mut v_is_json_type = CoreValue::Null;
let mut v_is_list = CoreValue::Null;
let mut v_is_number = CoreValue::Null;
let mut v_is_number_type = CoreValue::Null;
let mut v_is_object = CoreValue::Null;
let mut v_is_object_type = CoreValue::Null;
let mut v_is_string = CoreValue::Null;
let mut v_is_string_type = CoreValue::Null;
let mut v_is_url = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_item_field = CoreValue::Null;
let mut v_known_class = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_nested_fields = CoreValue::Null;
let mut v_nested_map = CoreValue::Null;
let mut v_not_boolean = CoreValue::Null;
let mut v_not_class_string = CoreValue::Null;
let mut v_not_json = CoreValue::Null;
let mut v_not_list = CoreValue::Null;
let mut v_not_number = CoreValue::Null;
let mut v_not_object = CoreValue::Null;
let mut v_not_string = CoreValue::Null;
let mut v_options = CoreValue::Null;
let mut v_string_types = CoreValue::Null;
let mut v_typ = CoreValue::Null;
let mut v_type_name = CoreValue::Null;
let mut v_unknown_class = CoreValue::Null;
let mut v_url_is_string = CoreValue::Null;
let mut v_valid_audio = CoreValue::Null;
let mut v_valid_file = CoreValue::Null;
let mut v_valid_image = CoreValue::Null;
let mut v_valid_url = CoreValue::Null;
let mut v_valid_url_shape = CoreValue::Null;
v_field_name = core_get(&v_field, &CoreValue::from("name"), CoreValue::Null);
v_typ = core_get(&v_field, &CoreValue::from("type"), CoreValue::Null);
v_type_name = core_get(&v_typ, &CoreValue::from("name"), CoreValue::Null);
v_is_array = core_get(&v_typ, &CoreValue::from("is_array"), CoreValue::Bool(false));
if core_truthy(&v_is_array) {
v_is_list = core_type_is(&v_value, CoreValue::from("list"));
v_not_list = core_not(&[v_is_list.clone()])?;
if core_truthy(&v_not_list) {
v_message =
core_string_format(&[CoreValue::from("{} must be an array"), v_path.clone()])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
v_item_field = core_field_item(&[v_field.clone()])?;
for v_item in core_iter(&v_value)? {
let mut v_item = v_item;
_validate_value_impl(&[v_item_field.clone(), v_item.clone(), v_path.clone()])?;
}
return Ok(CoreValue::Null);
}
v_is_image = core_eq(&[v_type_name.clone(), CoreValue::from("image")])?;
if core_truthy(&v_is_image) {
v_valid_image = core_media_valid_image(&[v_value.clone()])?;
v_invalid_image = core_not(&[v_valid_image.clone()])?;
if core_truthy(&v_invalid_image) {
v_message = core_string_format(&[CoreValue::from("Validation failed: Expected '{}' to be type 'object ({{ mimeType: string; data: string }})'"), v_field_name.clone()])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
return Ok(CoreValue::Null);
}
v_is_audio = core_eq(&[v_type_name.clone(), CoreValue::from("audio")])?;
if core_truthy(&v_is_audio) {
v_valid_audio = core_media_valid_audio(&[v_value.clone()])?;
v_invalid_audio = core_not(&[v_valid_audio.clone()])?;
if core_truthy(&v_invalid_audio) {
v_message = core_string_format(&[CoreValue::from("Validation failed: Expected '{}' to be type 'string or object ({{ data: string; format?: string }})'"), v_field_name.clone()])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
return Ok(CoreValue::Null);
}
v_is_file = core_eq(&[v_type_name.clone(), CoreValue::from("file")])?;
if core_truthy(&v_is_file) {
v_valid_file = core_media_valid_file(&[v_value.clone()])?;
v_invalid_file = core_not(&[v_valid_file.clone()])?;
if core_truthy(&v_invalid_file) {
v_message = core_string_format(&[CoreValue::from("Validation failed: Expected '{}' to be type 'object ({{ mimeType: string; data: string }} | {{ mimeType: string; fileUri: string }})'"), v_field_name.clone()])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
return Ok(CoreValue::Null);
}
v_is_url = core_eq(&[v_type_name.clone(), CoreValue::from("url")])?;
if core_truthy(&v_is_url) {
v_valid_url_shape = core_media_valid_url_shape(&[v_value.clone()])?;
v_invalid_url_shape = core_not(&[v_valid_url_shape.clone()])?;
if core_truthy(&v_invalid_url_shape) {
v_message = core_string_format(&[CoreValue::from("Validation failed: Expected '{}' to be type 'string or object ({{ url: string; title?: string; description?: string }})'"), v_field_name.clone()])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
v_url_is_string = core_type_is(&v_value, CoreValue::from("string"));
if core_truthy(&v_url_is_string) {
v_valid_url = core_url_valid(&[v_value.clone()])?;
v_invalid_url = core_not(&[v_valid_url.clone()])?;
if core_truthy(&v_invalid_url) {
v_field_title = core_get(&v_field, &CoreValue::from("title"), CoreValue::Null);
v_message = core_string_format(&[
CoreValue::from("Invalid URL for '{}': Invalid URL format."),
v_field_title.clone(),
])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
}
return Ok(CoreValue::Null);
}
v_string_types = CoreValue::new_list();
core_append(&v_string_types, CoreValue::from("string"))?;
core_append(&v_string_types, CoreValue::from("code"))?;
core_append(&v_string_types, CoreValue::from("date"))?;
core_append(&v_string_types, CoreValue::from("datetime"))?;
core_append(&v_string_types, CoreValue::from("dateRange"))?;
core_append(&v_string_types, CoreValue::from("datetimeRange"))?;
v_is_string_type = core_contains(&[v_string_types.clone(), v_type_name.clone()])?;
if core_truthy(&v_is_string_type) {
v_is_string = core_type_is(&v_value, CoreValue::from("string"));
v_not_string = core_not(&[v_is_string.clone()])?;
if core_truthy(&v_not_string) {
v_message = core_string_format(&[
CoreValue::from("Validation failed: Expected '{}' to be a {}"),
v_field_name.clone(),
v_type_name.clone(),
])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
_validate_string_constraints_impl(&[v_value.clone(), v_field.clone()])?;
return Ok(CoreValue::Null);
}
v_is_number_type = core_eq(&[v_type_name.clone(), CoreValue::from("number")])?;
if core_truthy(&v_is_number_type) {
v_is_number = core_type_is(&v_value, CoreValue::from("number"));
v_not_number = core_not(&[v_is_number.clone()])?;
if core_truthy(&v_not_number) {
v_message = core_string_format(&[
CoreValue::from("Validation failed: Expected '{}' to be a number"),
v_field_name.clone(),
])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
_validate_number_constraints_impl(&[v_value.clone(), v_field.clone()])?;
return Ok(CoreValue::Null);
}
v_is_boolean_type = core_eq(&[v_type_name.clone(), CoreValue::from("boolean")])?;
if core_truthy(&v_is_boolean_type) {
v_is_boolean = core_type_is(&v_value, CoreValue::from("boolean"));
v_not_boolean = core_not(&[v_is_boolean.clone()])?;
if core_truthy(&v_not_boolean) {
v_message = core_string_format(&[
CoreValue::from("Validation failed: Expected '{}' to be a boolean"),
v_field_name.clone(),
])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
return Ok(CoreValue::Null);
}
v_is_class_type = core_eq(&[v_type_name.clone(), CoreValue::from("class")])?;
if core_truthy(&v_is_class_type) {
v_is_class_string = core_type_is(&v_value, CoreValue::from("string"));
v_not_class_string = core_not(&[v_is_class_string.clone()])?;
if core_truthy(&v_not_class_string) {
v_message = core_string_format(&[
CoreValue::from("Validation failed: Expected '{}' to be a class"),
v_field_name.clone(),
])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
v_options = core_get(&v_typ, &CoreValue::from("options"), CoreValue::Null);
v_has_options = core_truthy_value(&[v_options.clone()])?;
if core_truthy(&v_has_options) {
v_known_class = core_contains(&[v_options.clone(), v_value.clone()])?;
v_unknown_class = core_not(&[v_known_class.clone()])?;
if core_truthy(&v_unknown_class) {
v_message = core_string_format(&[
CoreValue::from("{} must be one of {}"),
v_path.clone(),
v_options.clone(),
])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
}
return Ok(CoreValue::Null);
}
v_is_json_type = core_eq(&[v_type_name.clone(), CoreValue::from("json")])?;
if core_truthy(&v_is_json_type) {
v_is_json = core_type_is(&v_value, CoreValue::from("json"));
v_not_json = core_not(&[v_is_json.clone()])?;
if core_truthy(&v_not_json) {
v_message = core_string_format(&[
CoreValue::from("Validation failed: Expected '{}' to be JSON"),
v_field_name.clone(),
])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
return Ok(CoreValue::Null);
}
v_is_object_type = core_eq(&[v_type_name.clone(), CoreValue::from("object")])?;
if core_truthy(&v_is_object_type) {
v_is_object = core_type_is(&v_value, CoreValue::from("object"));
v_not_object = core_not(&[v_is_object.clone()])?;
if core_truthy(&v_not_object) {
v_message =
core_string_format(&[CoreValue::from("{} must be an object"), v_path.clone()])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
v_nested_map = core_get(&v_typ, &CoreValue::from("fields"), CoreValue::Null);
v_has_nested = core_truthy_value(&[v_nested_map.clone()])?;
if core_truthy(&v_has_nested) {
v_nested_fields = core_fields_from_map(&[v_nested_map.clone()])?;
_validate_fields_impl(&[v_nested_fields.clone(), v_value.clone(), v_path.clone()])?;
}
return Ok(CoreValue::Null);
}
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _schema_nullable_optional_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_schema_nullable_optional_impl");
let mut v_schema = core_arg(args, 0);
let mut v_field = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_enum_has_null = CoreValue::Null;
let mut v_enum_is_list = CoreValue::Null;
let mut v_enum_needs_null = CoreValue::Null;
let mut v_enum_values = CoreValue::Null;
let mut v_has_null_type = CoreValue::Null;
let mut v_is_optional = CoreValue::Null;
let mut v_make_nullable = CoreValue::Null;
let mut v_needs_null_type = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_nullable_type = CoreValue::Null;
let mut v_schema_type = CoreValue::Null;
let mut v_strict = CoreValue::Null;
let mut v_strict_camel = CoreValue::Null;
let mut v_strict_snake = CoreValue::Null;
let mut v_type_is_list = CoreValue::Null;
v_is_optional = core_get(
&v_field,
&CoreValue::from("is_optional"),
CoreValue::Bool(false),
);
v_strict_camel = core_get(
&v_options,
&CoreValue::from("strictStructuredOutputs"),
CoreValue::Bool(false),
);
v_strict_snake = core_get(
&v_options,
&CoreValue::from("strict_structured_outputs"),
CoreValue::Bool(false),
);
v_strict = core_or(&[v_strict_camel.clone(), v_strict_snake.clone()])?;
v_make_nullable = core_and(&[v_is_optional.clone(), v_strict.clone()])?;
if core_truthy(&v_make_nullable) {
v_schema_type = core_get(&v_schema, &CoreValue::from("type"), CoreValue::Null);
v_type_is_list = core_type_is(&v_schema_type, CoreValue::from("list"));
if core_truthy(&v_type_is_list) {
v_has_null_type = core_contains(&[v_schema_type.clone(), CoreValue::from("null")])?;
v_needs_null_type = core_not(&[v_has_null_type.clone()])?;
if core_truthy(&v_needs_null_type) {
core_append(&v_schema_type, CoreValue::from("null"))?;
}
} else {
v_nullable_type = CoreValue::new_list();
core_append(&v_nullable_type, v_schema_type.clone())?;
core_append(&v_nullable_type, CoreValue::from("null"))?;
core_set(&v_schema, CoreValue::from("type"), v_nullable_type.clone())?;
}
v_enum_values = core_get(&v_schema, &CoreValue::from("enum"), CoreValue::Null);
v_enum_is_list = core_type_is(&v_enum_values, CoreValue::from("list"));
if core_truthy(&v_enum_is_list) {
v_none = core_none(&[])?;
v_enum_has_null = core_contains(&[v_enum_values.clone(), v_none.clone()])?;
v_enum_needs_null = core_not(&[v_enum_has_null.clone()])?;
if core_truthy(&v_enum_needs_null) {
core_append(&v_enum_values, v_none.clone())?;
}
}
}
return Ok(v_schema.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _schema_object_from_fields_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_schema_object_from_fields_impl");
let mut v_fields_map = core_arg(args, 0);
let mut v_is_nested = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_field = CoreValue::Null;
let mut v_field_name = CoreValue::Null;
let mut v_field_schema = CoreValue::Null;
let mut v_fields = CoreValue::Null;
let mut v_include = CoreValue::Null;
let mut v_is_internal = CoreValue::Null;
let mut v_is_required = CoreValue::Null;
let mut v_properties = CoreValue::Null;
let mut v_required = CoreValue::Null;
let mut v_schema = CoreValue::Null;
v_schema = CoreValue::new_map();
v_properties = CoreValue::new_map();
v_required = CoreValue::new_list();
core_set(
&v_schema,
CoreValue::from("type"),
CoreValue::from("object"),
)?;
core_set(
&v_schema,
CoreValue::from("properties"),
v_properties.clone(),
)?;
core_set(&v_schema, CoreValue::from("required"), v_required.clone())?;
core_set(
&v_schema,
CoreValue::from("additionalProperties"),
CoreValue::Bool(false),
)?;
v_fields = core_fields_from_map(&[v_fields_map.clone()])?;
for v_field in core_iter(&v_fields)? {
let mut v_field = v_field;
v_is_internal = core_get(
&v_field,
&CoreValue::from("is_internal"),
CoreValue::Bool(false),
);
v_include = core_not(&[v_is_internal.clone()])?;
if core_truthy(&v_include) {
v_field_name = core_get(&v_field, &CoreValue::from("name"), CoreValue::Null);
v_field_schema = _schema_field_schema_impl(&[
v_field.clone(),
v_is_nested.clone(),
v_options.clone(),
])?;
core_set(&v_properties, v_field_name.clone(), v_field_schema.clone())?;
v_is_required = _schema_required_impl(&[v_field.clone(), v_options.clone()])?;
if core_truthy(&v_is_required) {
core_append(&v_required, v_field_name.clone())?;
}
}
}
return Ok(v_schema.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _schema_field_schema_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_schema_field_schema_impl");
let mut v_field = core_arg(args, 0);
let mut v_is_nested = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_audio_description = CoreValue::Null;
let mut v_class_options = CoreValue::Null;
let mut v_description = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_field_description = CoreValue::Null;
let mut v_fields_map = CoreValue::Null;
let mut v_flexible_string = CoreValue::Null;
let mut v_has_description = CoreValue::Null;
let mut v_has_fields = CoreValue::Null;
let mut v_has_item_description = CoreValue::Null;
let mut v_has_type_description = CoreValue::Null;
let mut v_is_array = CoreValue::Null;
let mut v_is_audio = CoreValue::Null;
let mut v_is_class = CoreValue::Null;
let mut v_is_media = CoreValue::Null;
let mut v_is_object = CoreValue::Null;
let mut v_is_shaped_object = CoreValue::Null;
let mut v_item_base_description = CoreValue::Null;
let mut v_item_description = CoreValue::Null;
let mut v_items = CoreValue::Null;
let mut v_items_with_constraints = CoreValue::Null;
let mut v_json_description = CoreValue::Null;
let mut v_json_type = CoreValue::Null;
let mut v_media_types = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_nested_media = CoreValue::Null;
let mut v_nullable = CoreValue::Null;
let mut v_object_schema = CoreValue::Null;
let mut v_schema = CoreValue::Null;
let mut v_schema_with_constraints = CoreValue::Null;
let mut v_typ = CoreValue::Null;
let mut v_type_description = CoreValue::Null;
let mut v_type_name = CoreValue::Null;
let mut v_updated = CoreValue::Null;
v_typ = core_get(&v_field, &CoreValue::from("type"), CoreValue::Null);
v_type_name = core_get(&v_typ, &CoreValue::from("name"), CoreValue::Null);
v_media_types = CoreValue::new_list();
core_append(&v_media_types, CoreValue::from("image"))?;
core_append(&v_media_types, CoreValue::from("audio"))?;
core_append(&v_media_types, CoreValue::from("file"))?;
v_is_media = core_contains(&[v_media_types.clone(), v_type_name.clone()])?;
v_nested_media = core_and(&[v_is_nested.clone(), v_is_media.clone()])?;
if core_truthy(&v_nested_media) {
v_message = core_string_format(&[
CoreValue::from("Media type '{}' is not allowed in nested object fields"),
v_type_name.clone(),
])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
v_schema = CoreValue::new_map();
v_field_description = core_get(&v_field, &CoreValue::from("description"), CoreValue::Null);
v_description =
_schema_enhance_description_impl(&[v_field_description.clone(), v_typ.clone()])?;
v_has_description = core_truthy_value(&[v_description.clone()])?;
if core_truthy(&v_has_description) {
core_set(
&v_schema,
CoreValue::from("description"),
v_description.clone(),
)?;
}
v_is_array = core_get(&v_typ, &CoreValue::from("is_array"), CoreValue::Bool(false));
if core_truthy(&v_is_array) {
core_set(&v_schema, CoreValue::from("type"), CoreValue::from("array"))?;
v_fields_map = core_get(&v_typ, &CoreValue::from("fields"), CoreValue::Null);
v_has_fields = core_truthy_value(&[v_fields_map.clone()])?;
if core_truthy(&v_has_fields) {
v_items = _schema_object_from_fields_impl(&[
v_fields_map.clone(),
CoreValue::Bool(true),
v_options.clone(),
])?;
v_type_description = core_get(&v_typ, &CoreValue::from("description"), CoreValue::Null);
v_has_type_description = core_truthy_value(&[v_type_description.clone()])?;
if core_truthy(&v_has_type_description) {
core_set(
&v_items,
CoreValue::from("description"),
v_type_description.clone(),
)?;
}
core_set(&v_schema, CoreValue::from("items"), v_items.clone())?;
v_nullable = _schema_nullable_optional_impl(&[
v_schema.clone(),
v_field.clone(),
v_options.clone(),
])?;
return Ok(v_nullable.clone());
}
v_is_class = core_eq(&[v_type_name.clone(), CoreValue::from("class")])?;
if core_truthy(&v_is_class) {
v_items = CoreValue::new_map();
core_set(&v_items, CoreValue::from("type"), CoreValue::from("string"))?;
v_class_options = core_get(&v_typ, &CoreValue::from("options"), CoreValue::Null);
core_set(&v_items, CoreValue::from("enum"), v_class_options.clone())?;
core_set(&v_schema, CoreValue::from("items"), v_items.clone())?;
v_nullable = _schema_nullable_optional_impl(&[
v_schema.clone(),
v_field.clone(),
v_options.clone(),
])?;
return Ok(v_nullable.clone());
}
v_items = CoreValue::new_map();
v_flexible_string =
_schema_flexible_json_as_string_impl(&[v_typ.clone(), v_options.clone()])?;
if core_truthy(&v_flexible_string) {
core_set(&v_items, CoreValue::from("type"), CoreValue::from("string"))?;
v_type_description = core_get(&v_typ, &CoreValue::from("description"), CoreValue::Null);
v_item_base_description =
core_coalesce(&[v_type_description.clone(), v_field_description.clone()])?;
v_item_description = _schema_enhance_description_impl(&[
v_item_base_description.clone(),
v_typ.clone(),
])?;
v_json_description = core_description_append(&[v_item_description.clone(), CoreValue::from("Return this field as a JSON-encoded string that can be parsed with JSON.parse.")])?;
core_set(
&v_items,
CoreValue::from("description"),
v_json_description.clone(),
)?;
} else {
v_json_type = _schema_json_type_impl(&[v_type_name.clone()])?;
core_set(&v_items, CoreValue::from("type"), v_json_type.clone())?;
v_type_description = core_get(&v_typ, &CoreValue::from("description"), CoreValue::Null);
v_item_base_description =
core_coalesce(&[v_type_description.clone(), v_field_description.clone()])?;
v_item_description = _schema_enhance_description_impl(&[
v_item_base_description.clone(),
v_typ.clone(),
])?;
v_has_item_description = core_truthy_value(&[v_item_description.clone()])?;
if core_truthy(&v_has_item_description) {
core_set(
&v_items,
CoreValue::from("description"),
v_item_description.clone(),
)?;
}
}
v_items_with_constraints =
_schema_apply_constraints_impl(&[v_items.clone(), v_typ.clone()])?;
core_set(
&v_schema,
CoreValue::from("items"),
v_items_with_constraints.clone(),
)?;
v_nullable = _schema_nullable_optional_impl(&[
v_schema.clone(),
v_field.clone(),
v_options.clone(),
])?;
return Ok(v_nullable.clone());
}
v_fields_map = core_get(&v_typ, &CoreValue::from("fields"), CoreValue::Null);
v_is_object = core_eq(&[v_type_name.clone(), CoreValue::from("object")])?;
v_has_fields = core_truthy_value(&[v_fields_map.clone()])?;
v_is_shaped_object = core_and(&[v_is_object.clone(), v_has_fields.clone()])?;
if core_truthy(&v_is_shaped_object) {
v_object_schema = _schema_object_from_fields_impl(&[
v_fields_map.clone(),
CoreValue::Bool(true),
v_options.clone(),
])?;
v_updated = core_map_update(&[v_schema.clone(), v_object_schema.clone()])?;
v_nullable = _schema_nullable_optional_impl(&[
v_updated.clone(),
v_field.clone(),
v_options.clone(),
])?;
return Ok(v_nullable.clone());
}
v_is_class = core_eq(&[v_type_name.clone(), CoreValue::from("class")])?;
if core_truthy(&v_is_class) {
core_set(
&v_schema,
CoreValue::from("type"),
CoreValue::from("string"),
)?;
v_class_options = core_get(&v_typ, &CoreValue::from("options"), CoreValue::Null);
core_set(&v_schema, CoreValue::from("enum"), v_class_options.clone())?;
v_nullable = _schema_nullable_optional_impl(&[
v_schema.clone(),
v_field.clone(),
v_options.clone(),
])?;
return Ok(v_nullable.clone());
}
v_flexible_string = _schema_flexible_json_as_string_impl(&[v_typ.clone(), v_options.clone()])?;
if core_truthy(&v_flexible_string) {
core_set(
&v_schema,
CoreValue::from("type"),
CoreValue::from("string"),
)?;
v_json_description = core_description_append(&[
v_description.clone(),
CoreValue::from(
"Return this field as a JSON-encoded string that can be parsed with JSON.parse.",
),
])?;
core_set(
&v_schema,
CoreValue::from("description"),
v_json_description.clone(),
)?;
v_nullable = _schema_nullable_optional_impl(&[
v_schema.clone(),
v_field.clone(),
v_options.clone(),
])?;
return Ok(v_nullable.clone());
}
v_json_type = _schema_json_type_impl(&[v_type_name.clone()])?;
core_set(&v_schema, CoreValue::from("type"), v_json_type.clone())?;
v_is_audio = core_eq(&[v_type_name.clone(), CoreValue::from("audio")])?;
if core_truthy(&v_is_audio) {
v_audio_description = core_description_append(&[v_description.clone(), CoreValue::from("Return plain text to synthesize as speech; do not return audio bytes or JSON audio objects.")])?;
core_set(
&v_schema,
CoreValue::from("description"),
v_audio_description.clone(),
)?;
}
v_schema_with_constraints = _schema_apply_constraints_impl(&[v_schema.clone(), v_typ.clone()])?;
v_nullable = _schema_nullable_optional_impl(&[
v_schema_with_constraints.clone(),
v_field.clone(),
v_options.clone(),
])?;
return Ok(v_nullable.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _strip_internal_fields_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_strip_internal_fields_impl");
let mut v_fields = core_arg(args, 0);
let mut v_values = core_arg(args, 1);
let mut v_field = CoreValue::Null;
let mut v_field_name = CoreValue::Null;
let mut v_field_value = CoreValue::Null;
let mut v_has_value = CoreValue::Null;
let mut v_is_internal = CoreValue::Null;
let mut v_is_public = CoreValue::Null;
let mut v_keep = CoreValue::Null;
let mut v_public_values = CoreValue::Null;
v_public_values = CoreValue::new_map();
for v_field in core_iter(&v_fields)? {
let mut v_field = v_field;
v_is_internal = core_get(
&v_field,
&CoreValue::from("is_internal"),
CoreValue::Bool(false),
);
v_is_public = core_not(&[v_is_internal.clone()])?;
v_field_name = core_get(&v_field, &CoreValue::from("name"), CoreValue::Null);
v_has_value = core_map_contains(&[v_values.clone(), v_field_name.clone()])?;
v_keep = core_and(&[v_is_public.clone(), v_has_value.clone()])?;
if core_truthy(&v_keep) {
v_field_value = core_map_get(&[v_values.clone(), v_field_name.clone()])?;
core_set(
&v_public_values,
v_field_name.clone(),
v_field_value.clone(),
)?;
}
}
return Ok(v_public_values.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _schema_to_json_schema_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_schema_to_json_schema_impl");
let mut v_fields = core_arg(args, 0);
let mut v_schema_title = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_field = CoreValue::Null;
let mut v_field_name = CoreValue::Null;
let mut v_field_schema = CoreValue::Null;
let mut v_include = CoreValue::Null;
let mut v_is_internal = CoreValue::Null;
let mut v_is_required = CoreValue::Null;
let mut v_properties = CoreValue::Null;
let mut v_required = CoreValue::Null;
let mut v_schema = CoreValue::Null;
v_schema = CoreValue::new_map();
v_properties = CoreValue::new_map();
v_required = CoreValue::new_list();
core_set(
&v_schema,
CoreValue::from("type"),
CoreValue::from("object"),
)?;
core_set(&v_schema, CoreValue::from("title"), v_schema_title.clone())?;
core_set(
&v_schema,
CoreValue::from("properties"),
v_properties.clone(),
)?;
core_set(&v_schema, CoreValue::from("required"), v_required.clone())?;
core_set(
&v_schema,
CoreValue::from("additionalProperties"),
CoreValue::Bool(false),
)?;
for v_field in core_iter(&v_fields)? {
let mut v_field = v_field;
v_is_internal = core_get(
&v_field,
&CoreValue::from("is_internal"),
CoreValue::Bool(false),
);
v_include = core_not(&[v_is_internal.clone()])?;
if core_truthy(&v_include) {
v_field_name = core_get(&v_field, &CoreValue::from("name"), CoreValue::Null);
v_field_schema = _schema_field_schema_impl(&[
v_field.clone(),
CoreValue::Bool(false),
v_options.clone(),
])?;
core_set(&v_properties, v_field_name.clone(), v_field_schema.clone())?;
v_is_required = _schema_required_impl(&[v_field.clone(), v_options.clone()])?;
if core_truthy(&v_is_required) {
core_append(&v_required, v_field_name.clone())?;
}
}
}
return Ok(v_schema.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn render_template_content(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("render_template_content");
let mut v_template = core_arg(args, 0);
let mut v_vars = core_arg(args, 1);
let mut v_context = core_arg(args, 2);
let mut v_nodes = CoreValue::Null;
let mut v_rendered = CoreValue::Null;
v_nodes = _template_parse_impl(&[v_template.clone(), v_context.clone()])?;
v_rendered = _template_render_tree_impl(&[
v_nodes.clone(),
v_vars.clone(),
v_template.clone(),
v_context.clone(),
])?;
return Ok(v_rendered.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn collect_template_variable_names(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("collect_template_variable_names");
let mut v_source = core_arg(args, 0);
let mut v_context = core_arg(args, 1);
let mut v_names = CoreValue::Null;
let mut v_nodes = CoreValue::Null;
v_nodes = _template_parse_impl(&[v_source.clone(), v_context.clone()])?;
v_names = _template_collect_vars_impl(&[v_nodes.clone()])?;
return Ok(v_names.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn validate_prompt_template_syntax(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("validate_prompt_template_syntax");
let mut v_source = core_arg(args, 0);
let mut v_context = core_arg(args, 1);
let mut v_required_variables = core_arg(args, 2);
let mut v_result = CoreValue::Null;
v_result = _template_validate_impl(&[
v_source.clone(),
v_context.clone(),
v_required_variables.clone(),
])?;
return Ok(v_result.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _template_parse_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_template_parse_impl");
let mut v_template = core_arg(args, 0);
let mut v_context = core_arg(args, 1);
let mut v_nodes = CoreValue::Null;
v_nodes = core_template_parse(&[v_template.clone(), v_context.clone()])?;
return Ok(v_nodes.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _template_render_tree_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_template_render_tree_impl");
let mut v_nodes = core_arg(args, 0);
let mut v_vars = core_arg(args, 1);
let mut v_source = core_arg(args, 2);
let mut v_context = core_arg(args, 3);
let mut v_rendered = CoreValue::Null;
v_rendered = core_template_render_tree(&[
v_nodes.clone(),
v_vars.clone(),
v_source.clone(),
v_context.clone(),
])?;
return Ok(v_rendered.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _template_collect_vars_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_template_collect_vars_impl");
let mut v_nodes = core_arg(args, 0);
let mut v_names = CoreValue::Null;
v_names = core_template_collect_vars(&[v_nodes.clone()])?;
return Ok(v_names.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _template_validate_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_template_validate_impl");
let mut v_source = core_arg(args, 0);
let mut v_context = core_arg(args, 1);
let mut v_required_variables = core_arg(args, 2);
let mut v_result = CoreValue::Null;
v_result = core_template_validate(&[
v_source.clone(),
v_context.clone(),
v_required_variables.clone(),
])?;
return Ok(v_result.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn render_prompt(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("render_prompt");
let mut v_signature = core_arg(args, 0);
let mut v_values = core_arg(args, 1);
let mut v_functions = core_arg(args, 2);
let mut v_options = core_arg(args, 3);
let mut v_has_instruction = CoreValue::Null;
let mut v_instruction = CoreValue::Null;
let mut v_messages = CoreValue::Null;
let mut v_system_content = CoreValue::Null;
let mut v_user_content = CoreValue::Null;
v_instruction = core_get(&v_options, &CoreValue::from("instruction"), CoreValue::Null);
v_has_instruction = core_is_not_none(&[v_instruction.clone()])?;
if core_truthy(&v_has_instruction) {
v_user_content = _prompt_user_content_impl(&[v_signature.clone(), v_values.clone()])?;
v_messages = _prompt_messages_impl(&[v_instruction.clone(), v_user_content.clone()])?;
return Ok(v_messages.clone());
} else {
v_system_content = _prompt_structured_impl(&[
v_signature.clone(),
v_values.clone(),
v_functions.clone(),
v_options.clone(),
])?;
v_user_content = _prompt_user_content_impl(&[v_signature.clone(), v_values.clone()])?;
v_messages = _prompt_messages_impl(&[v_system_content.clone(), v_user_content.clone()])?;
return Ok(v_messages.clone());
}
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _prompt_structured_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_prompt_structured_impl");
let mut v_signature = core_arg(args, 0);
let mut v_values = core_arg(args, 1);
let mut v_functions = core_arg(args, 2);
let mut v_options = core_arg(args, 3);
let mut v_content = CoreValue::Null;
v_content = core_prompt_structured(&[
v_signature.clone(),
v_values.clone(),
v_functions.clone(),
v_options.clone(),
])?;
return Ok(v_content.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _prompt_user_content_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_prompt_user_content_impl");
let mut v_signature = core_arg(args, 0);
let mut v_values = core_arg(args, 1);
let mut v_content = CoreValue::Null;
v_content = core_prompt_user_content(&[v_signature.clone(), v_values.clone()])?;
return Ok(v_content.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _prompt_messages_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_prompt_messages_impl");
let mut v_system = core_arg(args, 0);
let mut v_user = core_arg(args, 1);
let mut v_messages = CoreValue::Null;
let mut v_system_message = CoreValue::Null;
let mut v_user_message = CoreValue::Null;
v_system_message = CoreValue::new_map();
core_set(
&v_system_message,
CoreValue::from("role"),
CoreValue::from("system"),
)?;
core_set(
&v_system_message,
CoreValue::from("content"),
v_system.clone(),
)?;
core_set(
&v_system_message,
CoreValue::from("cache"),
CoreValue::Bool(false),
)?;
v_user_message = CoreValue::new_map();
core_set(
&v_user_message,
CoreValue::from("role"),
CoreValue::from("user"),
)?;
core_set(&v_user_message, CoreValue::from("content"), v_user.clone())?;
v_messages = CoreValue::new_list();
core_append(&v_messages, v_system_message.clone())?;
core_append(&v_messages, v_user_message.clone())?;
return Ok(v_messages.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn openai_build_chat_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("openai_build_chat_request");
let mut v_request = core_arg(args, 0);
let mut v_chat_prompt = CoreValue::Null;
let mut v_empty_functions = CoreValue::Null;
let mut v_fn = CoreValue::Null;
let mut v_functions = CoreValue::Null;
let mut v_has_functions = CoreValue::Null;
let mut v_has_response_format = CoreValue::Null;
let mut v_is_json_object = CoreValue::Null;
let mut v_is_json_schema = CoreValue::Null;
let mut v_json_mode_message = CoreValue::Null;
let mut v_json_schema_format = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_messages = CoreValue::Null;
let mut v_model = CoreValue::Null;
let mut v_model_config = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_provider_message = CoreValue::Null;
let mut v_response_format = CoreValue::Null;
let mut v_response_format_type = CoreValue::Null;
let mut v_schema = CoreValue::Null;
let mut v_tool = CoreValue::Null;
let mut v_tool_choice = CoreValue::Null;
let mut v_tools = CoreValue::Null;
v_payload = CoreValue::new_map();
v_model = core_get(&v_request, &CoreValue::from("model"), CoreValue::Null);
core_set(&v_payload, CoreValue::from("model"), v_model.clone())?;
v_messages = CoreValue::new_list();
v_chat_prompt = core_get(&v_request, &CoreValue::from("chat_prompt"), CoreValue::Null);
for v_message in core_iter(&v_chat_prompt)? {
let mut v_message = v_message;
v_provider_message = _openai_message_impl(&[v_message.clone()])?;
core_append(&v_messages, v_provider_message.clone())?;
}
core_set(&v_payload, CoreValue::from("messages"), v_messages.clone())?;
v_empty_functions = CoreValue::new_list();
v_functions = core_get(
&v_request,
&CoreValue::from("functions"),
v_empty_functions.clone(),
);
v_has_functions = core_truthy_value(&[v_functions.clone()])?;
if core_truthy(&v_has_functions) {
v_tools = CoreValue::new_list();
for v_fn in core_iter(&v_functions)? {
let mut v_fn = v_fn;
v_tool = _openai_tool_spec_impl(&[v_fn.clone()])?;
core_append(&v_tools, v_tool.clone())?;
}
core_set(&v_payload, CoreValue::from("tools"), v_tools.clone())?;
v_tool_choice = core_get(
&v_request,
&CoreValue::from("function_call"),
CoreValue::from("auto"),
);
core_set(
&v_payload,
CoreValue::from("tool_choice"),
v_tool_choice.clone(),
)?;
}
v_response_format = core_get(
&v_request,
&CoreValue::from("response_format"),
CoreValue::Null,
);
v_has_response_format = core_truthy_value(&[v_response_format.clone()])?;
if core_truthy(&v_has_response_format) {
v_response_format_type = core_get(
&v_response_format,
&CoreValue::from("type"),
CoreValue::Null,
);
v_is_json_object = core_eq(&[
v_response_format_type.clone(),
CoreValue::from("json_object"),
])?;
if core_truthy(&v_is_json_object) {
v_json_mode_message = CoreValue::new_map();
core_set(
&v_json_mode_message,
CoreValue::from("role"),
CoreValue::from("system"),
)?;
core_set(
&v_json_mode_message,
CoreValue::from("content"),
CoreValue::from("JSON output is required. Return only the requested JSON object."),
)?;
core_append(&v_messages, v_json_mode_message.clone())?;
core_set(&v_payload, CoreValue::from("messages"), v_messages.clone())?;
}
v_is_json_schema = core_eq(&[
v_response_format_type.clone(),
CoreValue::from("json_schema"),
])?;
if core_truthy(&v_is_json_schema) {
v_json_schema_format = CoreValue::new_map();
v_schema = core_get(
&v_response_format,
&CoreValue::from("schema"),
CoreValue::Null,
);
core_set(
&v_json_schema_format,
CoreValue::from("type"),
CoreValue::from("json_schema"),
)?;
core_set(
&v_json_schema_format,
CoreValue::from("json_schema"),
v_schema.clone(),
)?;
core_set(
&v_payload,
CoreValue::from("response_format"),
v_json_schema_format.clone(),
)?;
} else {
core_set(
&v_payload,
CoreValue::from("response_format"),
v_response_format.clone(),
)?;
}
}
v_model_config = core_get(
&v_request,
&CoreValue::from("model_config"),
CoreValue::Null,
);
_openai_apply_model_config_impl(&[v_payload.clone(), v_model_config.clone()])?;
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn merge_model_config(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("merge_model_config");
let mut v_base = core_arg(args, 0);
let mut v_override = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_has_stream_option = CoreValue::Null;
let mut v_include = CoreValue::Null;
let mut v_key = CoreValue::Null;
let mut v_merged = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_stream = CoreValue::Null;
let mut v_value = CoreValue::Null;
v_merged = core_map_merge(&[v_base.clone(), v_override.clone()])?;
v_has_stream_option = core_map_contains(&[v_options.clone(), CoreValue::from("stream")])?;
if core_truthy(&v_has_stream_option) {
v_stream = core_get(&v_options, &CoreValue::from("stream"), CoreValue::Null);
core_set(&v_merged, CoreValue::from("stream"), v_stream.clone())?;
}
v_out = CoreValue::new_map();
for v_key in core_iter(&v_merged)? {
let mut v_key = v_key;
v_value = core_get(&v_merged, &v_key.clone(), CoreValue::Null);
v_include = core_is_not_none(&[v_value.clone()])?;
if core_truthy(&v_include) {
core_set(&v_out, v_key.clone(), v_value.clone())?;
}
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn validate_chat_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("validate_chat_request");
let mut v_request = core_arg(args, 0);
let mut v_bad_assistant = CoreValue::Null;
let mut v_bad_prompt = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_function_calls = CoreValue::Null;
let mut v_has_assistant_payload = CoreValue::Null;
let mut v_has_calls = CoreValue::Null;
let mut v_has_content = CoreValue::Null;
let mut v_has_realtime = CoreValue::Null;
let mut v_invalid_role = CoreValue::Null;
let mut v_is_assistant = CoreValue::Null;
let mut v_is_function = CoreValue::Null;
let mut v_is_system = CoreValue::Null;
let mut v_is_user = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_message_text = CoreValue::Null;
let mut v_missing_assistant_payload = CoreValue::Null;
let mut v_prompt = CoreValue::Null;
let mut v_prompt_empty = CoreValue::Null;
let mut v_prompt_is_list = CoreValue::Null;
let mut v_prompt_len = CoreValue::Null;
let mut v_prompt_not_list = CoreValue::Null;
let mut v_realtime = CoreValue::Null;
let mut v_role = CoreValue::Null;
let mut v_valid_left = CoreValue::Null;
let mut v_valid_right = CoreValue::Null;
let mut v_valid_role = CoreValue::Null;
v_realtime = core_get(&v_request, &CoreValue::from("realtime"), CoreValue::Null);
v_has_realtime = core_truthy_value(&[v_realtime.clone()])?;
if core_truthy(&v_has_realtime) {
v_error = core_ai_error_unsupported(&[CoreValue::from(
"OpenAI-compatible beta does not support realtime requests",
)])?;
return Err(core_as_error(&v_error));
}
v_prompt = core_get(&v_request, &CoreValue::from("chat_prompt"), CoreValue::Null);
v_prompt_is_list = core_type_is(&v_prompt, CoreValue::from("list"));
v_prompt_len = core_len(&[v_prompt.clone()])?;
v_prompt_empty = core_eq(&[v_prompt_len.clone(), CoreValue::Num(0f64)])?;
v_prompt_not_list = core_not(&[v_prompt_is_list.clone()])?;
v_bad_prompt = core_or(&[v_prompt_not_list.clone(), v_prompt_empty.clone()])?;
if core_truthy(&v_bad_prompt) {
v_error = core_ai_error_response(&[CoreValue::from("Chat prompt is empty")])?;
return Err(core_as_error(&v_error));
}
for v_message in core_iter(&v_prompt)? {
let mut v_message = v_message;
v_role = core_get(&v_message, &CoreValue::from("role"), CoreValue::Null);
v_is_system = core_eq(&[v_role.clone(), CoreValue::from("system")])?;
v_is_user = core_eq(&[v_role.clone(), CoreValue::from("user")])?;
v_is_assistant = core_eq(&[v_role.clone(), CoreValue::from("assistant")])?;
v_is_function = core_eq(&[v_role.clone(), CoreValue::from("function")])?;
v_valid_left = core_or(&[v_is_system.clone(), v_is_user.clone()])?;
v_valid_right = core_or(&[v_is_assistant.clone(), v_is_function.clone()])?;
v_valid_role = core_or(&[v_valid_left.clone(), v_valid_right.clone()])?;
v_invalid_role = core_not(&[v_valid_role.clone()])?;
if core_truthy(&v_invalid_role) {
v_message_text = core_string_format(&[
CoreValue::from("Invalid chat message role: {}"),
v_role.clone(),
])?;
v_error = core_ai_error_response(&[v_message_text.clone()])?;
return Err(core_as_error(&v_error));
}
v_content = core_get(&v_message, &CoreValue::from("content"), CoreValue::Null);
v_function_calls = core_get(
&v_message,
&CoreValue::from("function_calls"),
CoreValue::Null,
);
v_has_content = core_truthy_value(&[v_content.clone()])?;
v_has_calls = core_truthy_value(&[v_function_calls.clone()])?;
v_has_assistant_payload = core_or(&[v_has_content.clone(), v_has_calls.clone()])?;
v_missing_assistant_payload = core_not(&[v_has_assistant_payload.clone()])?;
v_bad_assistant = core_and(&[v_is_assistant.clone(), v_missing_assistant_payload.clone()])?;
if core_truthy(&v_bad_assistant) {
v_error = core_ai_error_response(&[CoreValue::from(
"Assistant content is required when no tool calls are provided",
)])?;
return Err(core_as_error(&v_error));
}
}
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_apply_model_config_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_apply_model_config_impl");
let mut v_payload = core_arg(args, 0);
let mut v_model_config = core_arg(args, 1);
let mut v_has_stop = CoreValue::Null;
let mut v_is_stream = CoreValue::Null;
let mut v_stop = CoreValue::Null;
let mut v_stop_snake = CoreValue::Null;
let mut v_stream = CoreValue::Null;
let mut v_stream_options = CoreValue::Null;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("max_tokens"),
CoreValue::from("max_completion_tokens"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("maxTokens"),
CoreValue::from("max_completion_tokens"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("temperature"),
CoreValue::from("temperature"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("top_p"),
CoreValue::from("top_p"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("topP"),
CoreValue::from("top_p"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("n"),
CoreValue::from("n"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("presence_penalty"),
CoreValue::from("presence_penalty"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("presencePenalty"),
CoreValue::from("presence_penalty"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("frequency_penalty"),
CoreValue::from("frequency_penalty"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("frequencyPenalty"),
CoreValue::from("frequency_penalty"),
])?;
v_stop_snake = core_get(
&v_model_config,
&CoreValue::from("stop_sequences"),
CoreValue::Null,
);
v_stop = core_get(
&v_model_config,
&CoreValue::from("stopSequences"),
v_stop_snake.clone(),
);
v_has_stop = core_truthy_value(&[v_stop.clone()])?;
if core_truthy(&v_has_stop) {
core_set(&v_payload, CoreValue::from("stop"), v_stop.clone())?;
}
v_stream = core_get(&v_model_config, &CoreValue::from("stream"), CoreValue::Null);
v_is_stream = core_truthy_value(&[v_stream.clone()])?;
if core_truthy(&v_is_stream) {
core_set(&v_payload, CoreValue::from("stream"), CoreValue::Bool(true))?;
v_stream_options = CoreValue::new_map();
core_set(
&v_stream_options,
CoreValue::from("include_usage"),
CoreValue::Bool(true),
)?;
core_set(
&v_payload,
CoreValue::from("stream_options"),
v_stream_options.clone(),
)?;
}
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn build_chat_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("build_chat_request");
let mut v_service = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_payload = CoreValue::Null;
validate_chat_request(&[v_request.clone()])?;
v_payload = openai_build_chat_request(&[v_request.clone()])?;
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_copy_config_key_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_copy_config_key_impl");
let mut v_payload = core_arg(args, 0);
let mut v_model_config = core_arg(args, 1);
let mut v_source = core_arg(args, 2);
let mut v_target = core_arg(args, 3);
let mut v_has_source = CoreValue::Null;
let mut v_value = CoreValue::Null;
v_has_source = core_map_contains(&[v_model_config.clone(), v_source.clone()])?;
if core_truthy(&v_has_source) {
v_value = core_get(&v_model_config, &v_source.clone(), CoreValue::Null);
core_set(&v_payload, v_target.clone(), v_value.clone())?;
}
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn normalize_chat_response(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("normalize_chat_response");
let mut v_raw = core_arg(args, 0);
let mut v_response = CoreValue::Null;
v_response = openai_normalize_chat_response(&[v_raw.clone()])?;
return Ok(v_response.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn normalize_stream_delta(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("normalize_stream_delta");
let mut v_raw = core_arg(args, 0);
let mut v_state = core_arg(args, 1);
let mut v_response = CoreValue::Null;
v_response = openai_normalize_stream_delta(&[v_raw.clone(), v_state.clone()])?;
return Ok(v_response.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_message_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_message_impl");
let mut v_message = core_arg(args, 0);
let mut v_assistant_content = CoreValue::Null;
let mut v_call = CoreValue::Null;
let mut v_calls = CoreValue::Null;
let mut v_calls_snake = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_content_is_list = CoreValue::Null;
let mut v_empty_calls = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_function_id = CoreValue::Null;
let mut v_function_id_snake = CoreValue::Null;
let mut v_has_assistant_content = CoreValue::Null;
let mut v_has_calls = CoreValue::Null;
let mut v_has_name = CoreValue::Null;
let mut v_is_assistant = CoreValue::Null;
let mut v_is_function = CoreValue::Null;
let mut v_is_system = CoreValue::Null;
let mut v_is_user = CoreValue::Null;
let mut v_message_text = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_provider_call = CoreValue::Null;
let mut v_provider_part = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_role = CoreValue::Null;
let mut v_tool_calls = CoreValue::Null;
v_role = core_get(&v_message, &CoreValue::from("role"), CoreValue::Null);
v_content = core_get(&v_message, &CoreValue::from("content"), CoreValue::from(""));
v_is_system = core_eq(&[v_role.clone(), CoreValue::from("system")])?;
if core_truthy(&v_is_system) {
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("role"), CoreValue::from("system"))?;
core_set(&v_out, CoreValue::from("content"), v_content.clone())?;
return Ok(v_out.clone());
}
v_is_user = core_eq(&[v_role.clone(), CoreValue::from("user")])?;
if core_truthy(&v_is_user) {
v_content_is_list = core_type_is(&v_content, CoreValue::from("list"));
if core_truthy(&v_content_is_list) {
v_parts = CoreValue::new_list();
for v_part in core_iter(&v_content)? {
let mut v_part = v_part;
v_provider_part = _openai_content_part_impl(&[v_part.clone()])?;
core_append(&v_parts, v_provider_part.clone())?;
}
v_content = v_parts.clone();
}
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("role"), CoreValue::from("user"))?;
core_set(&v_out, CoreValue::from("content"), v_content.clone())?;
v_name = core_get(&v_message, &CoreValue::from("name"), CoreValue::Null);
v_has_name = core_truthy_value(&[v_name.clone()])?;
if core_truthy(&v_has_name) {
core_set(&v_out, CoreValue::from("name"), v_name.clone())?;
}
return Ok(v_out.clone());
}
v_is_assistant = core_eq(&[v_role.clone(), CoreValue::from("assistant")])?;
if core_truthy(&v_is_assistant) {
v_empty_calls = CoreValue::new_list();
v_calls_snake = core_get(
&v_message,
&CoreValue::from("function_calls"),
v_empty_calls.clone(),
);
v_calls = core_get(
&v_message,
&CoreValue::from("functionCalls"),
v_calls_snake.clone(),
);
v_has_calls = core_truthy_value(&[v_calls.clone()])?;
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("role"),
CoreValue::from("assistant"),
)?;
if core_truthy(&v_has_calls) {
v_assistant_content =
core_get(&v_message, &CoreValue::from("content"), CoreValue::Null);
v_has_assistant_content = core_is_not_none(&[v_assistant_content.clone()])?;
if core_truthy(&v_has_assistant_content) {
core_set(
&v_out,
CoreValue::from("content"),
v_assistant_content.clone(),
)?;
}
v_tool_calls = CoreValue::new_list();
for v_call in core_iter(&v_calls)? {
let mut v_call = v_call;
v_provider_call = _openai_tool_call_to_provider_impl(&[v_call.clone()])?;
core_append(&v_tool_calls, v_provider_call.clone())?;
}
core_set(&v_out, CoreValue::from("tool_calls"), v_tool_calls.clone())?;
} else {
core_set(&v_out, CoreValue::from("content"), v_content.clone())?;
}
return Ok(v_out.clone());
}
v_is_function = core_eq(&[v_role.clone(), CoreValue::from("function")])?;
if core_truthy(&v_is_function) {
v_out = CoreValue::new_map();
v_result = core_get(&v_message, &CoreValue::from("result"), CoreValue::from(""));
v_function_id_snake =
core_get(&v_message, &CoreValue::from("function_id"), CoreValue::Null);
v_function_id = core_get(
&v_message,
&CoreValue::from("functionId"),
v_function_id_snake.clone(),
);
core_set(&v_out, CoreValue::from("role"), CoreValue::from("tool"))?;
core_set(&v_out, CoreValue::from("content"), v_result.clone())?;
core_set(
&v_out,
CoreValue::from("tool_call_id"),
v_function_id.clone(),
)?;
return Ok(v_out.clone());
}
v_message_text = core_string_format(&[CoreValue::from("Invalid role: {}"), v_role.clone()])?;
v_error = core_ai_error_response(&[v_message_text.clone()])?;
return Err(core_as_error(&v_error));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn build_embed_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("build_embed_request");
let mut v_service = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_payload = CoreValue::Null;
v_payload = openai_build_embed_request(&[v_request.clone()])?;
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn normalize_embed_response(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("normalize_embed_response");
let mut v_raw = core_arg(args, 0);
let mut v_response = CoreValue::Null;
v_response = openai_normalize_embed_response(&[v_raw.clone()])?;
return Ok(v_response.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn normalize_token_usage(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("normalize_token_usage");
let mut v_usage = core_arg(args, 0);
let mut v_cache_creation_tokens = CoreValue::Null;
let mut v_cache_creation_tokens_snake = CoreValue::Null;
let mut v_cache_read_tokens = CoreValue::Null;
let mut v_cache_read_tokens_snake = CoreValue::Null;
let mut v_completion_tokens = CoreValue::Null;
let mut v_completion_tokens_snake = CoreValue::Null;
let mut v_computed_total_tokens = CoreValue::Null;
let mut v_has_cache_creation = CoreValue::Null;
let mut v_has_cache_read = CoreValue::Null;
let mut v_has_reasoning = CoreValue::Null;
let mut v_input_tokens = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_output_tokens = CoreValue::Null;
let mut v_prompt_tokens = CoreValue::Null;
let mut v_prompt_tokens_snake = CoreValue::Null;
let mut v_reasoning_tokens = CoreValue::Null;
let mut v_reasoning_tokens_snake = CoreValue::Null;
let mut v_total_tokens = CoreValue::Null;
let mut v_total_tokens_snake = CoreValue::Null;
v_out = CoreValue::new_map();
v_input_tokens = core_get(
&v_usage,
&CoreValue::from("input_tokens"),
CoreValue::Num(0f64),
);
v_prompt_tokens_snake = core_get(
&v_usage,
&CoreValue::from("prompt_tokens"),
v_input_tokens.clone(),
);
v_prompt_tokens = core_get(
&v_usage,
&CoreValue::from("promptTokens"),
v_prompt_tokens_snake.clone(),
);
v_output_tokens = core_get(
&v_usage,
&CoreValue::from("output_tokens"),
CoreValue::Num(0f64),
);
v_completion_tokens_snake = core_get(
&v_usage,
&CoreValue::from("completion_tokens"),
v_output_tokens.clone(),
);
v_completion_tokens = core_get(
&v_usage,
&CoreValue::from("completionTokens"),
v_completion_tokens_snake.clone(),
);
v_computed_total_tokens = core_add(&[v_prompt_tokens.clone(), v_completion_tokens.clone()])?;
v_total_tokens_snake = core_get(
&v_usage,
&CoreValue::from("total_tokens"),
v_computed_total_tokens.clone(),
);
v_total_tokens = core_get(
&v_usage,
&CoreValue::from("totalTokens"),
v_total_tokens_snake.clone(),
);
core_set(
&v_out,
CoreValue::from("prompt_tokens"),
v_prompt_tokens.clone(),
)?;
core_set(
&v_out,
CoreValue::from("completion_tokens"),
v_completion_tokens.clone(),
)?;
core_set(
&v_out,
CoreValue::from("total_tokens"),
v_total_tokens.clone(),
)?;
v_reasoning_tokens_snake = core_get(
&v_usage,
&CoreValue::from("reasoning_tokens"),
CoreValue::Null,
);
v_reasoning_tokens = core_get(
&v_usage,
&CoreValue::from("reasoningTokens"),
v_reasoning_tokens_snake.clone(),
);
v_has_reasoning = core_is_not_none(&[v_reasoning_tokens.clone()])?;
if core_truthy(&v_has_reasoning) {
core_set(
&v_out,
CoreValue::from("reasoning_tokens"),
v_reasoning_tokens.clone(),
)?;
}
v_cache_read_tokens_snake = core_get(
&v_usage,
&CoreValue::from("cache_read_tokens"),
CoreValue::Null,
);
v_cache_read_tokens = core_get(
&v_usage,
&CoreValue::from("cacheReadTokens"),
v_cache_read_tokens_snake.clone(),
);
v_has_cache_read = core_is_not_none(&[v_cache_read_tokens.clone()])?;
if core_truthy(&v_has_cache_read) {
core_set(
&v_out,
CoreValue::from("cache_read_tokens"),
v_cache_read_tokens.clone(),
)?;
}
v_cache_creation_tokens_snake = core_get(
&v_usage,
&CoreValue::from("cache_creation_tokens"),
CoreValue::Null,
);
v_cache_creation_tokens = core_get(
&v_usage,
&CoreValue::from("cacheCreationTokens"),
v_cache_creation_tokens_snake.clone(),
);
v_has_cache_creation = core_is_not_none(&[v_cache_creation_tokens.clone()])?;
if core_truthy(&v_has_cache_creation) {
core_set(
&v_out,
CoreValue::from("cache_creation_tokens"),
v_cache_creation_tokens.clone(),
)?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _ai_model_usage_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_ai_model_usage_impl");
let mut v_ai_name = core_arg(args, 0);
let mut v_model = core_arg(args, 1);
let mut v_usage = core_arg(args, 2);
let mut v_has_usage = CoreValue::Null;
let mut v_missing_usage = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_tokens = CoreValue::Null;
v_has_usage = core_truthy_value(&[v_usage.clone()])?;
v_missing_usage = core_not(&[v_has_usage.clone()])?;
if core_truthy(&v_missing_usage) {
v_none = core_none(&[])?;
return Ok(v_none.clone());
}
v_tokens = normalize_token_usage(&[v_usage.clone()])?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("ai"), v_ai_name.clone())?;
core_set(&v_out, CoreValue::from("model"), v_model.clone())?;
core_set(&v_out, CoreValue::from("tokens"), v_tokens.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_content_part_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_content_part_impl");
let mut v_part = core_arg(args, 0);
let mut v_audio_alt = CoreValue::Null;
let mut v_audio_error = CoreValue::Null;
let mut v_audio_message = CoreValue::Null;
let mut v_data = CoreValue::Null;
let mut v_details = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_format = CoreValue::Null;
let mut v_format_ok = CoreValue::Null;
let mut v_image = CoreValue::Null;
let mut v_image_raw = CoreValue::Null;
let mut v_image_url = CoreValue::Null;
let mut v_image_value = CoreValue::Null;
let mut v_input_audio = CoreValue::Null;
let mut v_is_audio = CoreValue::Null;
let mut v_is_data_url = CoreValue::Null;
let mut v_is_image = CoreValue::Null;
let mut v_is_mp3 = CoreValue::Null;
let mut v_is_text = CoreValue::Null;
let mut v_is_wav = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_mime = CoreValue::Null;
let mut v_mime_raw = CoreValue::Null;
let mut v_mime_snake = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_type = CoreValue::Null;
let mut v_url = CoreValue::Null;
v_type = core_get(&v_part, &CoreValue::from("type"), CoreValue::Null);
v_is_text = core_eq(&[v_type.clone(), CoreValue::from("text")])?;
if core_truthy(&v_is_text) {
v_text = core_get(&v_part, &CoreValue::from("text"), CoreValue::from(""));
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("type"), CoreValue::from("text"))?;
core_set(&v_out, CoreValue::from("text"), v_text.clone())?;
return Ok(v_out.clone());
}
v_is_image = core_eq(&[v_type.clone(), CoreValue::from("image")])?;
if core_truthy(&v_is_image) {
v_mime_snake = core_get(&v_part, &CoreValue::from("mime_type"), CoreValue::Null);
v_mime_raw = core_get(&v_part, &CoreValue::from("mimeType"), v_mime_snake.clone());
v_mime = core_coalesce(&[v_mime_raw.clone(), CoreValue::from("image/png")])?;
v_image_value = core_get(&v_part, &CoreValue::from("image"), CoreValue::Null);
v_image_raw = core_get(&v_part, &CoreValue::from("data"), v_image_value.clone());
v_image = core_coalesce(&[v_image_raw.clone(), CoreValue::from("")])?;
v_is_data_url = core_string_starts_with(&[v_image.clone(), CoreValue::from("data:")])?;
v_url = CoreValue::from("");
if core_truthy(&v_is_data_url) {
v_url = v_image.clone();
} else {
v_url = core_string_format(&[
CoreValue::from("data:{};base64,{}"),
v_mime.clone(),
v_image.clone(),
])?;
}
v_details = core_get(
&v_part,
&CoreValue::from("details"),
CoreValue::from("auto"),
);
v_image_url = CoreValue::new_map();
core_set(&v_image_url, CoreValue::from("url"), v_url.clone())?;
core_set(&v_image_url, CoreValue::from("detail"), v_details.clone())?;
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("type"),
CoreValue::from("image_url"),
)?;
core_set(&v_out, CoreValue::from("image_url"), v_image_url.clone())?;
return Ok(v_out.clone());
}
v_is_audio = core_eq(&[v_type.clone(), CoreValue::from("audio")])?;
if core_truthy(&v_is_audio) {
v_audio_alt = core_get(&v_part, &CoreValue::from("audio"), CoreValue::Null);
v_data = core_get(&v_part, &CoreValue::from("data"), v_audio_alt.clone());
v_format = core_get(&v_part, &CoreValue::from("format"), CoreValue::Null);
v_is_wav = core_eq(&[v_format.clone(), CoreValue::from("wav")])?;
v_is_mp3 = core_eq(&[v_format.clone(), CoreValue::from("mp3")])?;
v_format_ok = core_or(&[v_is_wav.clone(), v_is_mp3.clone()])?;
if core_truthy(&v_format_ok) {
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("type"),
CoreValue::from("input_audio"),
)?;
v_input_audio = CoreValue::new_map();
core_set(&v_input_audio, CoreValue::from("data"), v_data.clone())?;
core_set(&v_input_audio, CoreValue::from("format"), v_format.clone())?;
core_set(
&v_out,
CoreValue::from("input_audio"),
v_input_audio.clone(),
)?;
return Ok(v_out.clone());
}
v_audio_message = core_string_format(&[
CoreValue::from("OpenAI audio chat input supports only wav and mp3 audio, received {}"),
v_format.clone(),
])?;
v_audio_error = core_ai_error_unsupported(&[v_audio_message.clone()])?;
return Err(core_as_error(&v_audio_error));
}
v_message = core_string_format(&[
CoreValue::from("OpenAI-compatible beta does not support content part type: {}"),
v_type.clone(),
])?;
v_error = core_ai_error_unsupported(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn chat_response_to_completion(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("chat_response_to_completion");
let mut v_response = core_arg(args, 0);
let mut v_call = CoreValue::Null;
let mut v_calls = CoreValue::Null;
let mut v_compat_call = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_empty_calls = CoreValue::Null;
let mut v_empty_result = CoreValue::Null;
let mut v_empty_results = CoreValue::Null;
let mut v_fn = CoreValue::Null;
let mut v_function_calls = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_model_usage = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_params = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_results = CoreValue::Null;
let mut v_usage = CoreValue::Null;
v_empty_results = CoreValue::new_list();
v_results = core_get(
&v_response,
&CoreValue::from("results"),
v_empty_results.clone(),
);
v_empty_result = CoreValue::new_map();
v_result = core_list_get(&[
v_results.clone(),
CoreValue::Num(0f64),
v_empty_result.clone(),
])?;
v_content = core_get(&v_result, &CoreValue::from("content"), CoreValue::from(""));
v_calls = CoreValue::new_list();
v_empty_calls = CoreValue::new_list();
v_function_calls = core_get(
&v_result,
&CoreValue::from("function_calls"),
v_empty_calls.clone(),
);
for v_call in core_iter(&v_function_calls)? {
let mut v_call = v_call;
v_fn = core_get(&v_call, &CoreValue::from("function"), CoreValue::Null);
v_id = core_get(&v_call, &CoreValue::from("id"), CoreValue::Null);
v_name = core_get(&v_fn, &CoreValue::from("name"), CoreValue::Null);
v_params = core_get(&v_fn, &CoreValue::from("params"), CoreValue::Null);
v_compat_call = CoreValue::new_map();
core_set(&v_compat_call, CoreValue::from("id"), v_id.clone())?;
core_set(&v_compat_call, CoreValue::from("name"), v_name.clone())?;
core_set(&v_compat_call, CoreValue::from("params"), v_params.clone())?;
core_append(&v_calls, v_compat_call.clone())?;
}
v_model_usage = core_get(
&v_response,
&CoreValue::from("model_usage"),
CoreValue::Null,
);
v_usage = core_get(&v_model_usage, &CoreValue::from("tokens"), CoreValue::Null);
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("content"), v_content.clone())?;
core_set(&v_out, CoreValue::from("function_calls"), v_calls.clone())?;
core_set(&v_out, CoreValue::from("usage"), v_usage.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_tool_call_to_provider_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_tool_call_to_provider_impl");
let mut v_call = core_arg(args, 0);
let mut v_fn = CoreValue::Null;
let mut v_function = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_params = CoreValue::Null;
let mut v_params_is_string = CoreValue::Null;
let mut v_params_json = CoreValue::Null;
v_fn = core_get(&v_call, &CoreValue::from("function"), CoreValue::Null);
v_params = core_get(&v_fn, &CoreValue::from("params"), CoreValue::Null);
v_params_is_string = core_type_is(&v_params, CoreValue::from("string"));
if core_truthy(&v_params_is_string) {
} else {
v_params_json = core_json_stringify(&[v_params.clone()])?;
v_params = v_params_json.clone();
}
v_id = core_get(&v_call, &CoreValue::from("id"), CoreValue::Null);
v_name = core_get(&v_fn, &CoreValue::from("name"), CoreValue::Null);
v_function = CoreValue::new_map();
core_set(&v_function, CoreValue::from("name"), v_name.clone())?;
core_set(&v_function, CoreValue::from("arguments"), v_params.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("id"), v_id.clone())?;
core_set(&v_out, CoreValue::from("type"), CoreValue::from("function"))?;
core_set(&v_out, CoreValue::from("function"), v_function.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_tool_spec_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_tool_spec_impl");
let mut v_fn = core_arg(args, 0);
let mut v_description = CoreValue::Null;
let mut v_function = CoreValue::Null;
let mut v_has_parameters = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_parameters = CoreValue::Null;
v_name = core_get(&v_fn, &CoreValue::from("name"), CoreValue::Null);
v_description = core_get(&v_fn, &CoreValue::from("description"), CoreValue::from(""));
v_parameters = core_get(&v_fn, &CoreValue::from("parameters"), CoreValue::Null);
v_function = CoreValue::new_map();
core_set(&v_function, CoreValue::from("name"), v_name.clone())?;
core_set(
&v_function,
CoreValue::from("description"),
v_description.clone(),
)?;
v_has_parameters = core_truthy_value(&[v_parameters.clone()])?;
if core_truthy(&v_has_parameters) {
core_set(
&v_function,
CoreValue::from("parameters"),
v_parameters.clone(),
)?;
}
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("type"), CoreValue::from("function"))?;
core_set(&v_out, CoreValue::from("function"), v_function.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn openai_build_embed_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("openai_build_embed_request");
let mut v_request = core_arg(args, 0);
let mut v_dimensions = CoreValue::Null;
let mut v_embed_model_snake = CoreValue::Null;
let mut v_empty_texts = CoreValue::Null;
let mut v_has_dimensions = CoreValue::Null;
let mut v_model = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_texts = CoreValue::Null;
v_embed_model_snake = core_get(&v_request, &CoreValue::from("embed_model"), CoreValue::Null);
v_model = core_get(
&v_request,
&CoreValue::from("embedModel"),
v_embed_model_snake.clone(),
);
v_empty_texts = CoreValue::new_list();
v_texts = core_get(&v_request, &CoreValue::from("texts"), v_empty_texts.clone());
v_payload = CoreValue::new_map();
core_set(&v_payload, CoreValue::from("model"), v_model.clone())?;
core_set(&v_payload, CoreValue::from("input"), v_texts.clone())?;
v_dimensions = core_get(&v_request, &CoreValue::from("dimensions"), CoreValue::Null);
v_has_dimensions = core_truthy_value(&[v_dimensions.clone()])?;
if core_truthy(&v_has_dimensions) {
core_set(
&v_payload,
CoreValue::from("dimensions"),
v_dimensions.clone(),
)?;
}
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn openai_normalize_chat_response(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("openai_normalize_chat_response");
let mut v_raw = core_arg(args, 0);
let mut v_ai_name = core_arg(args, 1);
let mut v_model = core_arg(args, 2);
let mut v_bad_choices = CoreValue::Null;
let mut v_choice = CoreValue::Null;
let mut v_choices = CoreValue::Null;
let mut v_choices_is_list = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_has_provider_error = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_model_usage = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_provider_error = CoreValue::Null;
let mut v_raw_is_object = CoreValue::Null;
let mut v_raw_model = CoreValue::Null;
let mut v_raw_not_object = CoreValue::Null;
let mut v_remote_id = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_results = CoreValue::Null;
let mut v_usage = CoreValue::Null;
let mut v_used_model = CoreValue::Null;
v_raw_is_object = core_type_is(&v_raw, CoreValue::from("object"));
v_raw_not_object = core_not(&[v_raw_is_object.clone()])?;
if core_truthy(&v_raw_not_object) {
v_error = core_ai_error_response(&[
CoreValue::from("provider response must be a JSON object"),
v_raw.clone(),
])?;
return Err(core_as_error(&v_error));
}
v_provider_error = core_get(&v_raw, &CoreValue::from("error"), CoreValue::Null);
v_has_provider_error = core_truthy_value(&[v_provider_error.clone()])?;
if core_truthy(&v_has_provider_error) {
v_message = core_get(
&v_provider_error,
&CoreValue::from("message"),
CoreValue::from("provider response error"),
);
v_error = core_ai_error_response(&[v_message.clone(), v_raw.clone()])?;
return Err(core_as_error(&v_error));
}
v_choices = core_get(&v_raw, &CoreValue::from("choices"), CoreValue::Null);
v_choices_is_list = core_type_is(&v_choices, CoreValue::from("list"));
v_bad_choices = core_not(&[v_choices_is_list.clone()])?;
if core_truthy(&v_bad_choices) {
v_error = core_ai_error_response(&[
CoreValue::from("provider response missing choices"),
v_raw.clone(),
])?;
return Err(core_as_error(&v_error));
}
v_results = CoreValue::new_list();
for v_choice in core_iter(&v_choices)? {
let mut v_choice = v_choice;
v_result = _openai_normalize_choice_impl(&[v_choice.clone(), v_raw.clone()])?;
core_append(&v_results, v_result.clone())?;
}
v_raw_model = core_get(&v_raw, &CoreValue::from("model"), CoreValue::Null);
v_used_model = core_coalesce(&[v_raw_model.clone(), v_model.clone()])?;
v_usage = core_get(&v_raw, &CoreValue::from("usage"), CoreValue::Null);
v_model_usage =
_ai_model_usage_impl(&[v_ai_name.clone(), v_used_model.clone(), v_usage.clone()])?;
v_remote_id = core_get(&v_raw, &CoreValue::from("id"), CoreValue::Null);
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("results"), v_results.clone())?;
core_set(&v_out, CoreValue::from("remote_id"), v_remote_id.clone())?;
core_set(
&v_out,
CoreValue::from("model_usage"),
v_model_usage.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_normalize_choice_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_normalize_choice_impl");
let mut v_choice = core_arg(args, 0);
let mut v_raw = core_arg(args, 1);
let mut v_content = CoreValue::Null;
let mut v_content_raw = CoreValue::Null;
let mut v_empty_calls = CoreValue::Null;
let mut v_empty_message = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_finish_reason = CoreValue::Null;
let mut v_finish_reason_raw = CoreValue::Null;
let mut v_function_calls = CoreValue::Null;
let mut v_has_content = CoreValue::Null;
let mut v_has_refusal = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_index = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_refusal = CoreValue::Null;
let mut v_tool_calls = CoreValue::Null;
v_empty_message = CoreValue::new_map();
v_message = core_get(
&v_choice,
&CoreValue::from("message"),
v_empty_message.clone(),
);
v_refusal = core_get(&v_message, &CoreValue::from("refusal"), CoreValue::Null);
v_has_refusal = core_truthy_value(&[v_refusal.clone()])?;
if core_truthy(&v_has_refusal) {
v_error = core_ai_error_refusal(&[v_refusal.clone(), v_raw.clone()])?;
return Err(core_as_error(&v_error));
}
v_index = core_get(&v_choice, &CoreValue::from("index"), CoreValue::Num(0f64));
v_id = core_string_str(&[v_index.clone()])?;
v_content_raw = core_get(&v_message, &CoreValue::from("content"), CoreValue::Null);
v_content = core_none(&[])?;
v_has_content = core_truthy_value(&[v_content_raw.clone()])?;
if core_truthy(&v_has_content) {
v_content = v_content_raw.clone();
} else {
v_content = core_none(&[])?;
}
v_empty_calls = CoreValue::new_list();
v_tool_calls = core_get(
&v_message,
&CoreValue::from("tool_calls"),
v_empty_calls.clone(),
);
v_function_calls = _openai_normalize_tool_calls_impl(&[v_tool_calls.clone()])?;
v_finish_reason_raw = core_get(
&v_choice,
&CoreValue::from("finish_reason"),
CoreValue::Null,
);
v_finish_reason = _openai_finish_reason_impl(&[v_finish_reason_raw.clone()])?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("index"), v_index.clone())?;
core_set(&v_out, CoreValue::from("id"), v_id.clone())?;
core_set(&v_out, CoreValue::from("content"), v_content.clone())?;
core_set(
&v_out,
CoreValue::from("function_calls"),
v_function_calls.clone(),
)?;
core_set(
&v_out,
CoreValue::from("finish_reason"),
v_finish_reason.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_normalize_tool_calls_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_normalize_tool_calls_impl");
let mut v_calls = core_arg(args, 0);
let mut v_call = CoreValue::Null;
let mut v_fn = CoreValue::Null;
let mut v_function = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_normalized = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_params = CoreValue::Null;
let mut v_params_is_string = CoreValue::Null;
let mut v_parse_error = CoreValue::Null;
let mut v_parsed_params = CoreValue::Null;
v_out = CoreValue::new_list();
for v_call in core_iter(&v_calls)? {
let mut v_call = v_call;
v_fn = core_get(&v_call, &CoreValue::from("function"), CoreValue::Null);
v_params = core_get(&v_fn, &CoreValue::from("arguments"), CoreValue::Null);
v_params_is_string = core_type_is(&v_params, CoreValue::from("string"));
if core_truthy(&v_params_is_string) {
let __core_try: Result<CoreFlow, AxError> = (|| {
v_parsed_params = core_json_parse(&[v_params.clone()])?;
v_params = v_parsed_params.clone();
Ok(CoreFlow::Normal)
})();
match __core_try {
Ok(CoreFlow::Normal) => {}
Ok(CoreFlow::Return(value)) => return Ok(value),
Ok(CoreFlow::Break) => break,
Ok(CoreFlow::Continue) => continue,
Err(__core_caught) => {
v_parse_error = CoreValue::Error(std::rc::Rc::new(__core_caught));
}
}
}
v_id = core_get(&v_call, &CoreValue::from("id"), CoreValue::Null);
v_name = core_get(&v_fn, &CoreValue::from("name"), CoreValue::Null);
v_function = CoreValue::new_map();
core_set(&v_function, CoreValue::from("name"), v_name.clone())?;
core_set(&v_function, CoreValue::from("params"), v_params.clone())?;
v_normalized = CoreValue::new_map();
core_set(&v_normalized, CoreValue::from("id"), v_id.clone())?;
core_set(
&v_normalized,
CoreValue::from("type"),
CoreValue::from("function"),
)?;
core_set(
&v_normalized,
CoreValue::from("function"),
v_function.clone(),
)?;
core_append(&v_out, v_normalized.clone())?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_finish_reason_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_finish_reason_impl");
let mut v_value = core_arg(args, 0);
let mut v_is_call = CoreValue::Null;
let mut v_is_content_filter = CoreValue::Null;
let mut v_is_function_call = CoreValue::Null;
let mut v_is_length = CoreValue::Null;
let mut v_is_stop = CoreValue::Null;
let mut v_is_tool_calls = CoreValue::Null;
let mut v_none = CoreValue::Null;
v_is_stop = core_eq(&[v_value.clone(), CoreValue::from("stop")])?;
if core_truthy(&v_is_stop) {
return Ok(CoreValue::from("stop"));
}
v_is_length = core_eq(&[v_value.clone(), CoreValue::from("length")])?;
if core_truthy(&v_is_length) {
return Ok(CoreValue::from("length"));
}
v_is_content_filter = core_eq(&[v_value.clone(), CoreValue::from("content_filter")])?;
if core_truthy(&v_is_content_filter) {
return Ok(CoreValue::from("error"));
}
v_is_tool_calls = core_eq(&[v_value.clone(), CoreValue::from("tool_calls")])?;
v_is_function_call = core_eq(&[v_value.clone(), CoreValue::from("function_call")])?;
v_is_call = core_or(&[v_is_tool_calls.clone(), v_is_function_call.clone()])?;
if core_truthy(&v_is_call) {
return Ok(CoreValue::from("function_call"));
}
v_none = core_none(&[])?;
return Ok(v_none.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn openai_normalize_embed_response(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("openai_normalize_embed_response");
let mut v_raw = core_arg(args, 0);
let mut v_ai_name = core_arg(args, 1);
let mut v_model = core_arg(args, 2);
let mut v_data = CoreValue::Null;
let mut v_embedding = CoreValue::Null;
let mut v_embeddings = CoreValue::Null;
let mut v_empty_data = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_model_usage = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_raw_model = CoreValue::Null;
let mut v_remote_id = CoreValue::Null;
let mut v_usage = CoreValue::Null;
let mut v_used_model = CoreValue::Null;
v_embeddings = CoreValue::new_list();
v_empty_data = CoreValue::new_list();
v_data = core_get(&v_raw, &CoreValue::from("data"), v_empty_data.clone());
for v_item in core_iter(&v_data)? {
let mut v_item = v_item;
v_embedding = core_get(&v_item, &CoreValue::from("embedding"), CoreValue::Null);
core_append(&v_embeddings, v_embedding.clone())?;
}
v_raw_model = core_get(&v_raw, &CoreValue::from("model"), CoreValue::Null);
v_used_model = core_coalesce(&[v_raw_model.clone(), v_model.clone()])?;
v_usage = core_get(&v_raw, &CoreValue::from("usage"), CoreValue::Null);
v_model_usage =
_ai_model_usage_impl(&[v_ai_name.clone(), v_used_model.clone(), v_usage.clone()])?;
v_remote_id = core_get(&v_raw, &CoreValue::from("id"), CoreValue::Null);
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("embeddings"), v_embeddings.clone())?;
core_set(&v_out, CoreValue::from("remote_id"), v_remote_id.clone())?;
core_set(
&v_out,
CoreValue::from("model_usage"),
v_model_usage.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn openai_normalize_stream_delta(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("openai_normalize_stream_delta");
let mut v_raw = core_arg(args, 0);
let mut v_state = core_arg(args, 1);
let mut v_ai_name = core_arg(args, 2);
let mut v_model = core_arg(args, 3);
let mut v_choice = CoreValue::Null;
let mut v_choices = CoreValue::Null;
let mut v_empty_choices = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_has_provider_error = CoreValue::Null;
let mut v_has_raw_remote_id = CoreValue::Null;
let mut v_index_ids = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_missing_index_ids = CoreValue::Null;
let mut v_model_usage = CoreValue::Null;
let mut v_new_index_ids = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_provider_error = CoreValue::Null;
let mut v_raw_is_object = CoreValue::Null;
let mut v_raw_model = CoreValue::Null;
let mut v_raw_not_object = CoreValue::Null;
let mut v_raw_remote_id = CoreValue::Null;
let mut v_remote_id = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_results = CoreValue::Null;
let mut v_usage = CoreValue::Null;
let mut v_used_model = CoreValue::Null;
v_raw_is_object = core_type_is(&v_raw, CoreValue::from("object"));
v_raw_not_object = core_not(&[v_raw_is_object.clone()])?;
if core_truthy(&v_raw_not_object) {
v_error = core_ai_error_stream(&[
CoreValue::from("provider stream event must be a JSON object"),
v_raw.clone(),
CoreValue::Bool(true),
])?;
return Err(core_as_error(&v_error));
}
v_provider_error = core_get(&v_raw, &CoreValue::from("error"), CoreValue::Null);
v_has_provider_error = core_truthy_value(&[v_provider_error.clone()])?;
if core_truthy(&v_has_provider_error) {
v_message = core_get(
&v_provider_error,
&CoreValue::from("message"),
CoreValue::from("provider stream error"),
);
v_error = core_ai_error_stream(&[v_message.clone(), v_raw.clone(), CoreValue::Bool(true)])?;
return Err(core_as_error(&v_error));
}
v_index_ids = core_get(&v_state, &CoreValue::from("index_ids"), CoreValue::Null);
v_missing_index_ids = core_is_none(&[v_index_ids.clone()])?;
if core_truthy(&v_missing_index_ids) {
v_new_index_ids = CoreValue::new_map();
core_set(
&v_state,
CoreValue::from("index_ids"),
v_new_index_ids.clone(),
)?;
v_index_ids = v_new_index_ids.clone();
}
v_raw_remote_id = core_get(&v_raw, &CoreValue::from("id"), CoreValue::Null);
v_has_raw_remote_id = core_truthy_value(&[v_raw_remote_id.clone()])?;
if core_truthy(&v_has_raw_remote_id) {
core_set(
&v_state,
CoreValue::from("remote_id"),
v_raw_remote_id.clone(),
)?;
}
v_remote_id = core_get(
&v_state,
&CoreValue::from("remote_id"),
v_raw_remote_id.clone(),
);
v_results = CoreValue::new_list();
v_empty_choices = CoreValue::new_list();
v_choices = core_get(&v_raw, &CoreValue::from("choices"), v_empty_choices.clone());
for v_choice in core_iter(&v_choices)? {
let mut v_choice = v_choice;
v_result = _openai_stream_choice_impl(&[v_choice.clone(), v_index_ids.clone()])?;
core_append(&v_results, v_result.clone())?;
}
v_raw_model = core_get(&v_raw, &CoreValue::from("model"), CoreValue::Null);
v_used_model = core_coalesce(&[v_raw_model.clone(), v_model.clone()])?;
v_usage = core_get(&v_raw, &CoreValue::from("usage"), CoreValue::Null);
v_model_usage =
_ai_model_usage_impl(&[v_ai_name.clone(), v_used_model.clone(), v_usage.clone()])?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("results"), v_results.clone())?;
core_set(&v_out, CoreValue::from("remote_id"), v_remote_id.clone())?;
core_set(
&v_out,
CoreValue::from("model_usage"),
v_model_usage.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_stream_choice_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_stream_choice_impl");
let mut v_choice = core_arg(args, 0);
let mut v_index_ids = core_arg(args, 1);
let mut v_arguments = CoreValue::Null;
let mut v_call = CoreValue::Null;
let mut v_call_id = CoreValue::Null;
let mut v_call_index = CoreValue::Null;
let mut v_calls = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_delta = CoreValue::Null;
let mut v_empty_delta = CoreValue::Null;
let mut v_empty_tool_calls = CoreValue::Null;
let mut v_finish_reason = CoreValue::Null;
let mut v_finish_reason_raw = CoreValue::Null;
let mut v_fn = CoreValue::Null;
let mut v_function = CoreValue::Null;
let mut v_has_call_id = CoreValue::Null;
let mut v_has_stable_id = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_index = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_normalized = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_stable_id = CoreValue::Null;
let mut v_tool_calls = CoreValue::Null;
v_empty_delta = CoreValue::new_map();
v_delta = core_get(&v_choice, &CoreValue::from("delta"), v_empty_delta.clone());
v_calls = CoreValue::new_list();
v_empty_tool_calls = CoreValue::new_list();
v_tool_calls = core_get(
&v_delta,
&CoreValue::from("tool_calls"),
v_empty_tool_calls.clone(),
);
for v_call in core_iter(&v_tool_calls)? {
let mut v_call = v_call;
v_call_index = core_get(&v_call, &CoreValue::from("index"), CoreValue::Num(0f64));
v_call_id = core_get(&v_call, &CoreValue::from("id"), CoreValue::Null);
v_has_call_id = core_truthy_value(&[v_call_id.clone()])?;
if core_truthy(&v_has_call_id) {
core_set(&v_index_ids, v_call_index.clone(), v_call_id.clone())?;
}
v_stable_id = core_get(&v_index_ids, &v_call_index.clone(), CoreValue::Null);
v_has_stable_id = core_truthy_value(&[v_stable_id.clone()])?;
if core_truthy(&v_has_stable_id) {
v_fn = core_get(&v_call, &CoreValue::from("function"), CoreValue::Null);
v_name = core_get(&v_fn, &CoreValue::from("name"), CoreValue::Null);
v_arguments = core_get(&v_fn, &CoreValue::from("arguments"), CoreValue::Null);
v_function = CoreValue::new_map();
core_set(&v_function, CoreValue::from("name"), v_name.clone())?;
core_set(&v_function, CoreValue::from("params"), v_arguments.clone())?;
v_normalized = CoreValue::new_map();
core_set(&v_normalized, CoreValue::from("id"), v_stable_id.clone())?;
core_set(
&v_normalized,
CoreValue::from("type"),
CoreValue::from("function"),
)?;
core_set(
&v_normalized,
CoreValue::from("function"),
v_function.clone(),
)?;
core_append(&v_calls, v_normalized.clone())?;
}
}
v_index = core_get(&v_choice, &CoreValue::from("index"), CoreValue::Num(0f64));
v_id = core_string_str(&[v_index.clone()])?;
v_content = core_get(&v_delta, &CoreValue::from("content"), CoreValue::Null);
v_finish_reason_raw = core_get(
&v_choice,
&CoreValue::from("finish_reason"),
CoreValue::Null,
);
v_finish_reason = _openai_finish_reason_impl(&[v_finish_reason_raw.clone()])?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("index"), v_index.clone())?;
core_set(&v_out, CoreValue::from("id"), v_id.clone())?;
core_set(&v_out, CoreValue::from("content"), v_content.clone())?;
core_set(&v_out, CoreValue::from("function_calls"), v_calls.clone())?;
core_set(
&v_out,
CoreValue::from("finish_reason"),
v_finish_reason.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn openai_normalize_error(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("openai_normalize_error");
let mut v_status = core_arg(args, 0);
let mut v_body = core_arg(args, 1);
let mut v_request = core_arg(args, 2);
let mut v_body_is_object = CoreValue::Null;
let mut v_body_text = CoreValue::Null;
let mut v_code = CoreValue::Null;
let mut v_code_value = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_error_body = CoreValue::Null;
let mut v_error_is_object = CoreValue::Null;
let mut v_is_401 = CoreValue::Null;
let mut v_is_403 = CoreValue::Null;
let mut v_is_408 = CoreValue::Null;
let mut v_is_429 = CoreValue::Null;
let mut v_is_500 = CoreValue::Null;
let mut v_is_502 = CoreValue::Null;
let mut v_is_503 = CoreValue::Null;
let mut v_is_504 = CoreValue::Null;
let mut v_is_529 = CoreValue::Null;
let mut v_is_auth = CoreValue::Null;
let mut v_is_timeout = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_message_value = CoreValue::Null;
let mut v_retry_left = CoreValue::Null;
let mut v_retry_more = CoreValue::Null;
let mut v_retry_right = CoreValue::Null;
let mut v_retry_some = CoreValue::Null;
let mut v_retryable = CoreValue::Null;
v_message = v_body.clone();
v_code = core_none(&[])?;
v_body_is_object = core_type_is(&v_body, CoreValue::from("object"));
if core_truthy(&v_body_is_object) {
v_error_body = core_get(&v_body, &CoreValue::from("error"), v_body.clone());
v_error_is_object = core_type_is(&v_error_body, CoreValue::from("object"));
if core_truthy(&v_error_is_object) {
v_body_text = core_string_str(&[v_body.clone()])?;
v_message_value = core_get(
&v_error_body,
&CoreValue::from("message"),
v_body_text.clone(),
);
v_code_value = core_get(&v_error_body, &CoreValue::from("code"), CoreValue::Null);
v_message = v_message_value.clone();
v_code = v_code_value.clone();
} else {
v_message_value = core_string_str(&[v_error_body.clone()])?;
v_message = v_message_value.clone();
}
}
v_is_401 = core_eq(&[v_status.clone(), CoreValue::Num(401f64)])?;
v_is_403 = core_eq(&[v_status.clone(), CoreValue::Num(403f64)])?;
v_is_auth = core_or(&[v_is_401.clone(), v_is_403.clone()])?;
if core_truthy(&v_is_auth) {
v_error = core_ai_error_auth(&[
v_message.clone(),
v_status.clone(),
v_code.clone(),
v_body.clone(),
v_request.clone(),
])?;
return Ok(v_error.clone());
}
v_is_408 = core_eq(&[v_status.clone(), CoreValue::Num(408f64)])?;
v_is_504 = core_eq(&[v_status.clone(), CoreValue::Num(504f64)])?;
v_is_timeout = core_or(&[v_is_408.clone(), v_is_504.clone()])?;
if core_truthy(&v_is_timeout) {
v_error = core_ai_error_timeout(&[
v_message.clone(),
v_status.clone(),
v_code.clone(),
v_body.clone(),
v_request.clone(),
CoreValue::Bool(true),
])?;
return Ok(v_error.clone());
}
v_is_429 = core_eq(&[v_status.clone(), CoreValue::Num(429f64)])?;
v_is_500 = core_eq(&[v_status.clone(), CoreValue::Num(500f64)])?;
v_is_502 = core_eq(&[v_status.clone(), CoreValue::Num(502f64)])?;
v_is_503 = core_eq(&[v_status.clone(), CoreValue::Num(503f64)])?;
v_is_529 = core_eq(&[v_status.clone(), CoreValue::Num(529f64)])?;
v_retry_left = core_or(&[v_is_429.clone(), v_is_500.clone()])?;
v_retry_right = core_or(&[v_is_502.clone(), v_is_503.clone()])?;
v_retry_some = core_or(&[v_retry_left.clone(), v_retry_right.clone()])?;
v_retry_more = core_or(&[v_retry_some.clone(), v_is_504.clone()])?;
v_retryable = core_or(&[v_retry_more.clone(), v_is_529.clone()])?;
v_error = core_ai_error_status(&[
v_message.clone(),
v_status.clone(),
v_code.clone(),
v_body.clone(),
v_request.clone(),
v_retryable.clone(),
])?;
return Ok(v_error.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_normalize_profile(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_normalize_profile");
let mut v_profile = core_arg(args, 0);
let mut v_aliases = CoreValue::Null;
let mut v_normalized = CoreValue::Null;
let mut v_provider_id = CoreValue::Null;
v_normalized = core_string_lower(&[v_profile.clone()])?;
v_aliases = core_json_parse(&[CoreValue::from("{\"openai\":\"openai-compatible\",\"openai-compatible\":\"openai-compatible\",\"openai_compatible\":\"openai-compatible\",\"compatible\":\"openai-compatible\",\"openai-responses\":\"openai-responses\",\"openai_responses\":\"openai-responses\",\"responses\":\"openai-responses\",\"google-gemini\":\"google-gemini\",\"google_gemini\":\"google-gemini\",\"gemini\":\"google-gemini\",\"anthropic\":\"anthropic\",\"claude\":\"anthropic\",\"azure-openai\":\"azure-openai\",\"azure_openai\":\"azure-openai\",\"azure\":\"azure-openai\",\"deepseek\":\"deepseek\",\"mistral\":\"mistral\",\"reka\":\"reka\",\"cohere\":\"cohere\",\"grok\":\"grok\",\"xai\":\"grok\",\"x-grok\":\"grok\",\"x_grok\":\"grok\"}")])?;
v_provider_id = core_get(
&v_aliases,
&v_normalized.clone(),
CoreValue::from("openai-compatible"),
);
return Ok(v_provider_id.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_profile_registry(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_profile_registry");
let mut v_registry = CoreValue::Null;
v_registry = core_json_parse(&[CoreValue::from("{\"deferredCatalogProviderIds\":[],\"profiles\":{\"anthropic\":{\"aliases\":[\"anthropic\",\"claude\"],\"catalogStatus\":\"descriptor-covered\",\"generatedClient\":\"AnthropicClient\",\"id\":\"anthropic\"},\"azure-openai\":{\"aliases\":[\"azure-openai\",\"azure_openai\",\"azure\"],\"catalogStatus\":\"descriptor-covered\",\"generatedClient\":\"AzureOpenAIClient\",\"id\":\"azure-openai\"},\"cohere\":{\"aliases\":[\"cohere\"],\"catalogStatus\":\"descriptor-covered\",\"generatedClient\":\"CohereClient\",\"id\":\"cohere\"},\"deepseek\":{\"aliases\":[\"deepseek\"],\"catalogStatus\":\"descriptor-covered\",\"generatedClient\":\"DeepSeekClient\",\"id\":\"deepseek\"},\"google-gemini\":{\"aliases\":[\"google-gemini\",\"google_gemini\",\"gemini\"],\"catalogStatus\":\"descriptor-covered\",\"generatedClient\":\"GoogleGeminiClient\",\"id\":\"google-gemini\"},\"grok\":{\"aliases\":[\"grok\",\"xai\",\"x-grok\",\"x_grok\"],\"catalogStatus\":\"descriptor-covered\",\"generatedClient\":\"GrokClient\",\"id\":\"grok\"},\"mistral\":{\"aliases\":[\"mistral\"],\"catalogStatus\":\"descriptor-covered\",\"generatedClient\":\"MistralClient\",\"id\":\"mistral\"},\"openai-compatible\":{\"aliases\":[\"openai-compatible\",\"openai\",\"compatible\"],\"catalogStatus\":\"descriptor-covered\",\"generatedClient\":\"OpenAICompatibleClient\",\"id\":\"openai-compatible\"},\"openai-responses\":{\"aliases\":[\"openai-responses\",\"openai_responses\",\"responses\"],\"catalogStatus\":\"descriptor-covered\",\"generatedClient\":\"OpenAIResponsesClient\",\"id\":\"openai-responses\"},\"reka\":{\"aliases\":[\"reka\"],\"catalogStatus\":\"descriptor-covered\",\"generatedClient\":\"RekaClient\",\"id\":\"reka\"}},\"registryVersion\":\"provider-profile-registry-v1\",\"supportedProfileIds\":[\"openai-compatible\",\"openai-responses\",\"google-gemini\",\"anthropic\",\"azure-openai\",\"deepseek\",\"mistral\",\"reka\",\"cohere\",\"grok\"]}")])?;
return Ok(v_registry.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_resolve_profile(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_resolve_profile");
let mut v_profile = core_arg(args, 0);
let mut v_aliases = CoreValue::Null;
let mut v_is_known = CoreValue::Null;
let mut v_normalized = CoreValue::Null;
let mut v_provider_id = CoreValue::Null;
let mut v_resolved = CoreValue::Null;
v_normalized = core_string_lower(&[v_profile.clone()])?;
v_aliases = core_json_parse(&[CoreValue::from("{\"openai\":\"openai-compatible\",\"openai-compatible\":\"openai-compatible\",\"openai_compatible\":\"openai-compatible\",\"compatible\":\"openai-compatible\",\"openai-responses\":\"openai-responses\",\"openai_responses\":\"openai-responses\",\"responses\":\"openai-responses\",\"google-gemini\":\"google-gemini\",\"google_gemini\":\"google-gemini\",\"gemini\":\"google-gemini\",\"anthropic\":\"anthropic\",\"claude\":\"anthropic\",\"azure-openai\":\"azure-openai\",\"azure_openai\":\"azure-openai\",\"azure\":\"azure-openai\",\"deepseek\":\"deepseek\",\"mistral\":\"mistral\",\"reka\":\"reka\",\"cohere\":\"cohere\",\"grok\":\"grok\",\"xai\":\"grok\",\"x-grok\":\"grok\",\"x_grok\":\"grok\"}")])?;
v_is_known = core_map_contains(&[v_aliases.clone(), v_normalized.clone()])?;
v_provider_id = provider_normalize_profile(&[v_profile.clone()])?;
v_resolved = CoreValue::new_map();
core_set(&v_resolved, CoreValue::from("id"), v_provider_id.clone())?;
core_set(&v_resolved, CoreValue::from("known"), v_is_known.clone())?;
core_set(&v_resolved, CoreValue::from("input"), v_profile.clone())?;
return Ok(v_resolved.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_model_catalog_summary(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_model_catalog_summary");
let mut v_summary = CoreValue::Null;
v_summary = core_json_parse(&[CoreValue::from("{\"catalogVersion\":\"provider-model-catalog-audit-v1\",\"deferredProviderIds\":[],\"descriptorCoveredProviderIds\":[\"openai-compatible\",\"openai-responses\",\"google-gemini\",\"anthropic\",\"azure-openai\",\"deepseek\",\"mistral\",\"reka\",\"cohere\",\"grok\"],\"filterOptions\":[\"all\",\"text\",\"embeddings\",\"code\",\"audio\"],\"nextMilestone\":\"Generated catalog provider clients match the active catalog\",\"providerCount\":11,\"providerNames\":[\"google-gemini\",\"webllm\",\"openai\",\"cohere\",\"mistral\",\"deepseek\",\"openai-responses\",\"grok\",\"reka\",\"anthropic\",\"azure-openai\"],\"semantics\":{\"codeMatchesTextFilter\":true,\"dynamicProvidersMayHaveEmptyModels\":true,\"metadataClonedPerCall\":true,\"modelSort\":\"price-then-name\",\"providerSort\":\"cheapest-model-then-display-name\"},\"source\":\"src/ax/ai/catalog.ts\"}")])?;
return Ok(v_summary.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _provider_model_catalog_registry(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_provider_model_catalog_registry");
let mut v_catalog = CoreValue::Null;
v_catalog = core_json_parse(&[CoreValue::from("{\"all\":[{\"defaultEmbedModel\":\"gemini-embedding-2\",\"defaultModel\":\"gemini-2.5-flash\",\"displayName\":\"Google Gemini\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-2.0-flash-thinking-exp-01-21\",\"promptTokenCostPer1M\":0,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-2.0-pro-exp-02-05\",\"promptTokenCostPer1M\":0,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-robotics-er-1.6-preview\",\"promptTokenCostPer1M\":0,\"provider\":\"google-gemini\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-embedding-001\",\"promptTokenCostPer1M\":0.15,\"provider\":\"google-gemini\",\"type\":\"embeddings\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0.15,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-1.5-flash-8b\",\"promptTokenCostPer1M\":0.0375,\"provider\":\"google-gemini\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"contextWindow\":8192,\"currency\":\"usd\",\"isDefault\":true,\"name\":\"gemini-embedding-2\",\"promptTokenCostPer1M\":0.2,\"provider\":\"google-gemini\",\"type\":\"embeddings\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0.3,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-1.5-flash\",\"promptTokenCostPer1M\":0.075,\"provider\":\"google-gemini\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0.3,\"currency\":\"usd\",\"deprecatedOn\":\"2026-06-01\",\"isDefault\":false,\"isDeprecated\":true,\"name\":\"gemini-2.0-flash-lite\",\"promptTokenCostPer1M\":0.075,\"provider\":\"google-gemini\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.025,\"cacheWriteTokenCostPer1M\":0.1,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0.4,\"currency\":\"usd\",\"deprecatedOn\":\"2026-06-01\",\"isDefault\":false,\"isDeprecated\":true,\"name\":\"gemini-2.0-flash\",\"promptTokenCostPer1M\":0.1,\"provider\":\"google-gemini\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.01,\"cacheWriteTokenCostPer1M\":0.1,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-2.5-flash-lite\",\"promptTokenCostPer1M\":0.1,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.01,\"cacheWriteTokenCostPer1M\":0.1,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-flash-lite-latest\",\"promptTokenCostPer1M\":0.1,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.025,\"cacheWriteTokenCostPer1M\":0.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":1.5,\"contextWindow\":1048576,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":65536,\"name\":\"gemini-3.1-flash-lite\",\"promptTokenCostPer1M\":0.25,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.025,\"cacheWriteTokenCostPer1M\":0.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":1.5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-3.1-flash-lite-preview\",\"promptTokenCostPer1M\":0.25,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":1.5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-1.0-pro\",\"promptTokenCostPer1M\":0.5,\"provider\":\"google-gemini\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0.134,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-3-pro-image-preview\",\"promptTokenCostPer1M\":2,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.03,\"cacheWriteTokenCostPer1M\":0.3,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":2.5,\"currency\":\"usd\",\"isDefault\":true,\"name\":\"gemini-2.5-flash\",\"promptTokenCostPer1M\":0.3,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.03,\"cacheWriteTokenCostPer1M\":0.3,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":2.5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-flash-latest\",\"promptTokenCostPer1M\":0.3,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.05,\"cacheWriteTokenCostPer1M\":0.5,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":3,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-3-flash-preview\",\"promptTokenCostPer1M\":0.5,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":3,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-3.1-flash-image-preview\",\"promptTokenCostPer1M\":0.5,\"provider\":\"google-gemini\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"audio\":{\"input\":false,\"output\":true},\"capabilities\":{\"audioInput\":false,\"audioOutput\":true,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":3,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-3.1-flash-tts-preview\",\"promptTokenCostPer1M\":0.5,\"provider\":\"google-gemini\",\"type\":\"audio\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":3,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"nano-banana-2\",\"promptTokenCostPer1M\":0.5,\"provider\":\"google-gemini\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-1.5-pro\",\"promptTokenCostPer1M\":1.25,\"provider\":\"google-gemini\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.15,\"cacheWriteTokenCostPer1M\":1.5,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":9,\"contextWindow\":1048576,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":65536,\"name\":\"gemini-3.5-flash\",\"promptTokenCostPer1M\":1.5,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.125,\"cacheWriteTokenCostPer1M\":1.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"longContextCacheReadTokenCostPer1M\":0.25,\"longContextCompletionTokenCostPer1M\":15,\"longContextPromptTokenCostPer1M\":2.5,\"longContextThreshold\":200000,\"name\":\"gemini-2.5-pro\",\"promptTokenCostPer1M\":1.25,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.125,\"cacheWriteTokenCostPer1M\":1.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"longContextCacheReadTokenCostPer1M\":0.25,\"longContextCompletionTokenCostPer1M\":15,\"longContextPromptTokenCostPer1M\":2.5,\"longContextThreshold\":200000,\"name\":\"gemini-pro-latest\",\"promptTokenCostPer1M\":1.25,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.2,\"cacheWriteTokenCostPer1M\":2,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":12,\"currency\":\"usd\",\"isDefault\":false,\"longContextCacheReadTokenCostPer1M\":0.4,\"longContextCompletionTokenCostPer1M\":18,\"longContextPromptTokenCostPer1M\":4,\"longContextThreshold\":200000,\"name\":\"gemini-3.1-pro-preview\",\"promptTokenCostPer1M\":2,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"audio\":{\"input\":true,\"output\":true},\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":true,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"contextWindow\":131072,\"isDefault\":false,\"maxTokens\":65536,\"name\":\"gemini-3.1-flash-live-preview\",\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"thinkingBudget\":true},\"type\":\"audio\"},{\"audio\":{\"input\":true,\"output\":true},\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":true,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"contextWindow\":131072,\"isDefault\":false,\"maxTokens\":8192,\"name\":\"gemini-2.5-flash-native-audio-preview-12-2025\",\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"thinkingBudget\":true},\"type\":\"audio\"}],\"name\":\"google-gemini\"},{\"defaultModel\":\"Llama-3.2-3B-Instruct-q4f32_1-MLC\",\"displayName\":\"WebLLM\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":8192,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":2048,\"name\":\"gemma-2-2b-it-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":8192,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":2048,\"name\":\"gemma-2-9b-it-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":128000,\"currency\":\"usd\",\"isDefault\":false,\"isExpensive\":true,\"maxTokens\":4096,\"name\":\"Llama-3.1-70B-Instruct-q4f16_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":128000,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"Llama-3.1-8B-Instruct-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":128000,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":2048,\"name\":\"Llama-3.2-1B-Instruct-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":128000,\"currency\":\"usd\",\"isDefault\":true,\"maxTokens\":2048,\"name\":\"Llama-3.2-3B-Instruct-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":32768,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"Mistral-7B-Instruct-v0.3-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":128000,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"Phi-3.5-mini-instruct-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":32768,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":2048,\"name\":\"Qwen2.5-0.5B-Instruct-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":32768,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":2048,\"name\":\"Qwen2.5-1.5B-Instruct-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":32768,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":2048,\"name\":\"Qwen2.5-3B-Instruct-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":32768,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"Qwen2.5-7B-Instruct-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"}],\"name\":\"webllm\"},{\"defaultEmbedModel\":\"text-embedding-3-small\",\"defaultModel\":\"gpt-5-mini\",\"displayName\":\"OpenAI\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.02,\"currency\":\"usd\",\"isDefault\":true,\"name\":\"text-embedding-3-small\",\"promptTokenCostPer1M\":0.02,\"provider\":\"openai\",\"type\":\"embeddings\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.1,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"text-embedding-ada-002\",\"promptTokenCostPer1M\":0.1,\"provider\":\"openai\",\"type\":\"embeddings\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.13,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"text-embedding-3-large\",\"promptTokenCostPer1M\":0.13,\"provider\":\"openai\",\"type\":\"embeddings\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":0.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-nano\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.05,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4.1-nano\",\"promptTokenCostPer1M\":0.1,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.6,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4o-mini\",\"promptTokenCostPer1M\":0.15,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":1.25,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.4-nano\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.2,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":1.5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-3.5-turbo\",\"promptTokenCostPer1M\":0.5,\"provider\":\"openai\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":1.6,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4.1-mini\",\"promptTokenCostPer1M\":0.4,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":2,\"currency\":\"usd\",\"isDefault\":true,\"name\":\"gpt-5-mini\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":2,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-codex-mini\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":4.5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.4-mini\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.75,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":4.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"o1-mini\",\"promptTokenCostPer1M\":1.1,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":4.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"o4-mini\",\"promptTokenCostPer1M\":1.1,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":8,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4.1\",\"promptTokenCostPer1M\":2,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":8,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"o3\",\"promptTokenCostPer1M\":2,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-chat\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-chat-latest\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-codex\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-chat-latest\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-codex\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-codex-max\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4o\",\"promptTokenCostPer1M\":2.5,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":14,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.2\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.75,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":14,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.2-chat-latest\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.75,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":14,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.2-codex\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.75,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.4\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":2.5,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"chatgpt-4o-latest\",\"promptTokenCostPer1M\":5,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":30,\"contextWindow\":1000000,\"currency\":\"usd\",\"isDefault\":false,\"longContextCacheReadTokenCostPer1M\":1,\"longContextCompletionTokenCostPer1M\":45,\"longContextPromptTokenCostPer1M\":10,\"longContextThreshold\":272000,\"name\":\"gpt-5.5\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":5,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":30,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4-turbo\",\"promptTokenCostPer1M\":10,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":60,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"o1\",\"promptTokenCostPer1M\":15,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":60,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4\",\"promptTokenCostPer1M\":30,\"provider\":\"openai\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":120,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-pro\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":15,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":168,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.2-pro\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":21,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":180,\"contextWindow\":1000000,\"currency\":\"usd\",\"isDefault\":false,\"isExpensive\":true,\"longContextCompletionTokenCostPer1M\":270,\"longContextPromptTokenCostPer1M\":60,\"longContextThreshold\":272000,\"name\":\"gpt-5.5-pro\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":30,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"audio\":{\"input\":true,\"output\":true},\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"isDefault\":false,\"name\":\"gpt-audio\",\"provider\":\"openai\",\"type\":\"audio\"},{\"audio\":{\"input\":true,\"output\":true},\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"isDefault\":false,\"name\":\"gpt-audio-mini\",\"provider\":\"openai\",\"type\":\"audio\"},{\"audio\":{\"input\":true,\"output\":true},\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"isDefault\":false,\"name\":\"gpt-audio-1.5\",\"provider\":\"openai\",\"type\":\"audio\"},{\"audio\":{\"input\":true,\"output\":true},\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"isDefault\":false,\"name\":\"gpt-realtime-1.5\",\"provider\":\"openai\",\"type\":\"audio\"},{\"audio\":{\"input\":true,\"output\":true},\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"isDefault\":false,\"name\":\"gpt-realtime-2\",\"provider\":\"openai\",\"supported\":{\"thinkingBudget\":true},\"type\":\"audio\"},{\"audio\":{\"input\":true,\"output\":false},\"capabilities\":{\"audioInput\":true,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"isDefault\":false,\"name\":\"gpt-realtime-whisper\",\"provider\":\"openai\",\"type\":\"audio\"},{\"audio\":{\"input\":true,\"output\":true},\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"isDefault\":false,\"name\":\"gpt-realtime-translate\",\"provider\":\"openai\",\"type\":\"audio\"}],\"name\":\"openai\"},{\"defaultModel\":\"command-r-plus\",\"displayName\":\"Cohere\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.1,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"embed-english-light-v3.0\",\"promptTokenCostPer1M\":0.1,\"provider\":\"cohere\",\"type\":\"embeddings\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.1,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"embed-english-v3.0\",\"promptTokenCostPer1M\":0.1,\"provider\":\"cohere\",\"type\":\"embeddings\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.1,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"embed-multilingual-light-v3.0\",\"promptTokenCostPer1M\":0.1,\"provider\":\"cohere\",\"type\":\"embeddings\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.1,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"embed-multilingual-v3.0\",\"promptTokenCostPer1M\":0.1,\"provider\":\"cohere\",\"type\":\"embeddings\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.6,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"command-light\",\"promptTokenCostPer1M\":0.3,\"provider\":\"cohere\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":1.5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"command\",\"promptTokenCostPer1M\":0.5,\"provider\":\"cohere\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":1.5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"command-r\",\"promptTokenCostPer1M\":0.5,\"provider\":\"cohere\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":true,\"name\":\"command-r-plus\",\"promptTokenCostPer1M\":3,\"provider\":\"cohere\",\"type\":\"text\"}],\"name\":\"cohere\"},{\"defaultModel\":\"mistral-small-latest\",\"displayName\":\"Mistral AI\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.15,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"mistral-nemo-latest\",\"promptTokenCostPer1M\":0.15,\"provider\":\"mistral\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.25,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"open-codestral-mamba\",\"promptTokenCostPer1M\":0.25,\"provider\":\"mistral\",\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.25,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"open-mistral-7b\",\"promptTokenCostPer1M\":0.25,\"provider\":\"mistral\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.3,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"open-mistral-nemo-latest\",\"promptTokenCostPer1M\":0.3,\"provider\":\"mistral\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.6,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"codestral-latest\",\"promptTokenCostPer1M\":0.2,\"provider\":\"mistral\",\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.6,\"currency\":\"USD\",\"isDefault\":true,\"name\":\"mistral-small-latest\",\"promptTokenCostPer1M\":0.2,\"provider\":\"mistral\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.7,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"open-mixtral-8x7b\",\"promptTokenCostPer1M\":0.7,\"provider\":\"mistral\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":6,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"mistral-large-latest\",\"promptTokenCostPer1M\":2,\"provider\":\"mistral\",\"type\":\"text\"}],\"name\":\"mistral\"},{\"defaultModel\":\"deepseek-v4-flash\",\"displayName\":\"DeepSeek\",\"isDynamic\":false,\"models\":[{\"aliases\":[\"deepseek-chat\",\"deepseek-reasoner\"],\"cacheReadTokenCostPer1M\":0.0028,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":0.28,\"contextWindow\":1000000,\"currency\":\"USD\",\"isDefault\":true,\"maxTokens\":384000,\"name\":\"deepseek-v4-flash\",\"promptTokenCostPer1M\":0.14,\"provider\":\"deepseek\",\"supported\":{\"showThoughts\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.003625,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":0.87,\"contextWindow\":1000000,\"currency\":\"USD\",\"isDefault\":false,\"maxTokens\":384000,\"name\":\"deepseek-v4-pro\",\"promptTokenCostPer1M\":0.435,\"provider\":\"deepseek\",\"supported\":{\"showThoughts\":true,\"thinkingBudget\":true},\"type\":\"text\"}],\"name\":\"deepseek\"},{\"defaultEmbedModel\":\"text-embedding-ada-002\",\"defaultModel\":\"gpt-4o\",\"displayName\":\"OpenAI Responses\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":0.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-nano\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.05,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4.1-nano\",\"promptTokenCostPer1M\":0.1,\"provider\":\"openai-responses\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.6,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4o-mini\",\"promptTokenCostPer1M\":0.15,\"provider\":\"openai-responses\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":1.25,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.4-nano\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.2,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":1.5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-3.5-turbo\",\"promptTokenCostPer1M\":0.5,\"provider\":\"openai-responses\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":1.6,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4.1-mini\",\"promptTokenCostPer1M\":0.4,\"provider\":\"openai-responses\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":2,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-mini\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":2,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-codex-mini\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":4.5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.4-mini\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.75,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":4.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"o3-mini\",\"promptTokenCostPer1M\":1.1,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":4.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"o4-mini\",\"promptTokenCostPer1M\":1.1,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":8,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4.1\",\"promptTokenCostPer1M\":2,\"provider\":\"openai-responses\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":8,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"o3\",\"promptTokenCostPer1M\":2,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-chat\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-chat-latest\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-codex\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-chat-latest\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-codex\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-codex-max\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":true,\"name\":\"gpt-4o\",\"promptTokenCostPer1M\":2.5,\"provider\":\"openai-responses\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":14,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.2\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.75,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":14,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.2-chat-latest\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.75,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":14,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.2-codex\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.75,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.4\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":2.5,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"chatgpt-4o-latest\",\"promptTokenCostPer1M\":5,\"provider\":\"openai-responses\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":30,\"contextWindow\":1000000,\"currency\":\"usd\",\"isDefault\":false,\"longContextCacheReadTokenCostPer1M\":1,\"longContextCompletionTokenCostPer1M\":45,\"longContextPromptTokenCostPer1M\":10,\"longContextThreshold\":272000,\"name\":\"gpt-5.5\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":5,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":30,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4-turbo\",\"promptTokenCostPer1M\":10,\"provider\":\"openai-responses\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":60,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"o1\",\"promptTokenCostPer1M\":15,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":60,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4\",\"promptTokenCostPer1M\":30,\"provider\":\"openai-responses\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":80,\"currency\":\"usd\",\"isDefault\":false,\"isExpensive\":true,\"name\":\"o3-pro\",\"promptTokenCostPer1M\":20,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":120,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-pro\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":15,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":168,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.2-pro\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":21,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":180,\"contextWindow\":1000000,\"currency\":\"usd\",\"isDefault\":false,\"isExpensive\":true,\"longContextCompletionTokenCostPer1M\":270,\"longContextPromptTokenCostPer1M\":60,\"longContextThreshold\":272000,\"name\":\"gpt-5.5-pro\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":30,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":600,\"currency\":\"usd\",\"isDefault\":false,\"isExpensive\":true,\"name\":\"o1-pro\",\"promptTokenCostPer1M\":150,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"}],\"name\":\"openai-responses\"},{\"defaultModel\":\"grok-3\",\"displayName\":\"xAI Grok\",\"isDynamic\":false,\"models\":[{\"aliases\":[\"grok-4-1-fast-non-reasoning-latest\"],\"cacheReadTokenCostPer1M\":0.05,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.5,\"contextWindow\":2000000,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-4-1-fast-non-reasoning\",\"promptTokenCostPer1M\":0.2,\"provider\":\"grok\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"aliases\":[\"grok-4-1-fast-reasoning-latest\"],\"cacheReadTokenCostPer1M\":0.05,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.5,\"contextWindow\":2000000,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-4-1-fast-reasoning\",\"promptTokenCostPer1M\":0.2,\"provider\":\"grok\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":0.5,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-3-mini\",\"promptTokenCostPer1M\":0.3,\"provider\":\"grok\",\"supported\":{\"thinkingBudget\":true},\"type\":\"text\"},{\"aliases\":[\"grok-4.20-multi-agent-0309\",\"grok-4.20-multi-agent-latest\"],\"cacheReadTokenCostPer1M\":0.2,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":2.5,\"contextWindow\":2000000,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-4.20-multi-agent\",\"promptTokenCostPer1M\":1.25,\"provider\":\"grok\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"aliases\":[\"grok-4.20-0309-non-reasoning\",\"grok-4.20-non-reasoning-latest\"],\"cacheReadTokenCostPer1M\":0.2,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":2.5,\"contextWindow\":2000000,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-4.20-non-reasoning\",\"promptTokenCostPer1M\":1.25,\"provider\":\"grok\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"aliases\":[\"grok-4.20-0309-reasoning\",\"grok-4.20-reasoning-latest\",\"grok-4.20\",\"grok-4.20-0309\"],\"cacheReadTokenCostPer1M\":0.2,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":2.5,\"contextWindow\":2000000,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-4.20-reasoning\",\"promptTokenCostPer1M\":1.25,\"provider\":\"grok\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"aliases\":[\"grok-4.3-latest\",\"grok-latest\"],\"cacheReadTokenCostPer1M\":0.2,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":2.5,\"contextWindow\":1000000,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-4.3\",\"promptTokenCostPer1M\":1.25,\"provider\":\"grok\",\"supported\":{\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":4,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-3-mini-fast\",\"promptTokenCostPer1M\":0.6,\"provider\":\"grok\",\"supported\":{\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"USD\",\"isDefault\":true,\"name\":\"grok-3\",\"promptTokenCostPer1M\":3,\"provider\":\"grok\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":25,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-3-fast\",\"promptTokenCostPer1M\":5,\"provider\":\"grok\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-voice-think-fast-1.0\",\"provider\":\"grok\",\"type\":\"audio\"},{\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-voice-fast-1.0\",\"provider\":\"grok\",\"type\":\"audio\"}],\"name\":\"grok\"},{\"defaultModel\":\"reka-core\",\"displayName\":\"Reka\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":1,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"reka-edge\",\"promptTokenCostPer1M\":0.4,\"provider\":\"reka\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":2,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"reka-flash\",\"promptTokenCostPer1M\":0.8,\"provider\":\"reka\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":true,\"name\":\"reka-core\",\"promptTokenCostPer1M\":3,\"provider\":\"reka\",\"type\":\"text\"}],\"name\":\"reka\"},{\"defaultModel\":\"claude-3-7-sonnet-latest\",\"displayName\":\"Anthropic\",\"isDynamic\":false,\"models\":[{\"cacheReadTokenCostPer1M\":0.03,\"cacheWriteTokenCostPer1M\":0.3,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":1.25,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"claude-3-haiku-20240307\",\"promptTokenCostPer1M\":0.25,\"provider\":\"anthropic\",\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.03,\"cacheWriteTokenCostPer1M\":0.3,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":1.25,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"claude-3-haiku@20240307\",\"promptTokenCostPer1M\":0.25,\"provider\":\"anthropic\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":2.24,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"claude-instant-1.2\",\"promptTokenCostPer1M\":0.8,\"provider\":\"anthropic\",\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.08,\"cacheWriteTokenCostPer1M\":1,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":4,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":8192,\"name\":\"claude-3-5-haiku-latest\",\"promptTokenCostPer1M\":0.8,\"provider\":\"anthropic\",\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.1,\"cacheWriteTokenCostPer1M\":1.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":5,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":8192,\"name\":\"claude-3-5-haiku@20241022\",\"promptTokenCostPer1M\":1,\"provider\":\"anthropic\",\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.1,\"cacheWriteTokenCostPer1M\":1.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":5,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":200000,\"name\":\"claude-haiku-4-5\",\"promptTokenCostPer1M\":1,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.1,\"cacheWriteTokenCostPer1M\":1.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":5,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":200000,\"name\":\"claude-haiku-4-5@20251001\",\"promptTokenCostPer1M\":1,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":8192,\"name\":\"claude-3-5-sonnet-latest\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":8192,\"name\":\"claude-3-5-sonnet-v2@20241022\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":8192,\"name\":\"claude-3-5-sonnet@20240620\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":true,\"maxTokens\":64000,\"name\":\"claude-3-7-sonnet-latest\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":64000,\"name\":\"claude-3-7-sonnet@20250219\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"claude-3-sonnet-20240229\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":64000,\"name\":\"claude-sonnet-4-20250514\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":200000,\"name\":\"claude-sonnet-4-5-20250929\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":200000,\"name\":\"claude-sonnet-4-5@20250929\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":64000,\"name\":\"claude-sonnet-4-6\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":64000,\"name\":\"claude-sonnet-4-6\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":64000,\"name\":\"claude-sonnet-4@20250514\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"contextWindow\":1000000,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":128000,\"name\":\"claude-sonnet-5\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"contextWindow\":1000000,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":128000,\"name\":\"claude-sonnet-5\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"cacheWriteTokenCostPer1M\":6.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":25,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":64000,\"name\":\"claude-opus-4-5-20251101\",\"promptTokenCostPer1M\":5,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"cacheWriteTokenCostPer1M\":6.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":25,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":64000,\"name\":\"claude-opus-4-5@20251101\",\"promptTokenCostPer1M\":5,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"cacheWriteTokenCostPer1M\":6.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":25,\"contextWindow\":1000000,\"currency\":\"usd\",\"fastCacheReadTokenCostPer1M\":3,\"fastCacheWriteTokenCostPer1M\":37.5,\"fastCompletionTokenCostPer1M\":150,\"fastPromptTokenCostPer1M\":30,\"isDefault\":false,\"maxTokens\":128000,\"name\":\"claude-opus-4-6\",\"promptTokenCostPer1M\":5,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"cacheWriteTokenCostPer1M\":6.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":25,\"contextWindow\":1000000,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":128000,\"name\":\"claude-opus-4-6\",\"promptTokenCostPer1M\":5,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"cacheWriteTokenCostPer1M\":6.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":25,\"contextWindow\":1000000,\"currency\":\"usd\",\"fastCacheReadTokenCostPer1M\":3,\"fastCacheWriteTokenCostPer1M\":37.5,\"fastCompletionTokenCostPer1M\":150,\"fastPromptTokenCostPer1M\":30,\"isDefault\":false,\"maxTokens\":128000,\"name\":\"claude-opus-4-7\",\"promptTokenCostPer1M\":5,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"cacheWriteTokenCostPer1M\":6.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":25,\"contextWindow\":1000000,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":128000,\"name\":\"claude-opus-4-7\",\"promptTokenCostPer1M\":5,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"cacheWriteTokenCostPer1M\":6.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":25,\"contextWindow\":1000000,\"currency\":\"usd\",\"fastCacheReadTokenCostPer1M\":1,\"fastCacheWriteTokenCostPer1M\":12.5,\"fastCompletionTokenCostPer1M\":50,\"fastPromptTokenCostPer1M\":10,\"isDefault\":false,\"maxTokens\":128000,\"name\":\"claude-opus-4-8\",\"promptTokenCostPer1M\":5,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"cacheWriteTokenCostPer1M\":6.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":25,\"contextWindow\":1000000,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":128000,\"name\":\"claude-opus-4-8\",\"promptTokenCostPer1M\":5,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":25,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"claude-2.1\",\"promptTokenCostPer1M\":8,\"provider\":\"anthropic\",\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":1.5,\"cacheWriteTokenCostPer1M\":18.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":75,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"claude-3-opus-latest\",\"promptTokenCostPer1M\":15,\"provider\":\"anthropic\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":1.5,\"cacheWriteTokenCostPer1M\":18.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":75,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"claude-3-opus@20240229\",\"promptTokenCostPer1M\":15,\"provider\":\"anthropic\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":1.5,\"cacheWriteTokenCostPer1M\":18.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":75,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":32000,\"name\":\"claude-opus-4-1-20250805\",\"promptTokenCostPer1M\":15,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":1.5,\"cacheWriteTokenCostPer1M\":18.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":75,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":32000,\"name\":\"claude-opus-4-1@20250805\",\"promptTokenCostPer1M\":15,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":1.5,\"cacheWriteTokenCostPer1M\":18.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":75,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":32000,\"name\":\"claude-opus-4-20250514\",\"promptTokenCostPer1M\":15,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":1.5,\"cacheWriteTokenCostPer1M\":18.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":75,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":32000,\"name\":\"claude-opus-4@20250514\",\"promptTokenCostPer1M\":15,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"}],\"name\":\"anthropic\"},{\"displayName\":\"Azure OpenAI\",\"isDynamic\":true,\"models\":[],\"name\":\"azure-openai\"}],\"audio\":[{\"defaultEmbedModel\":\"gemini-embedding-2\",\"defaultModel\":\"gemini-2.5-flash\",\"displayName\":\"Google Gemini\",\"isDynamic\":false,\"models\":[{\"audio\":{\"input\":false,\"output\":true},\"capabilities\":{\"audioInput\":false,\"audioOutput\":true,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":3,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-3.1-flash-tts-preview\",\"promptTokenCostPer1M\":0.5,\"provider\":\"google-gemini\",\"type\":\"audio\"},{\"audio\":{\"input\":true,\"output\":true},\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":true,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"contextWindow\":131072,\"isDefault\":false,\"maxTokens\":65536,\"name\":\"gemini-3.1-flash-live-preview\",\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"thinkingBudget\":true},\"type\":\"audio\"},{\"audio\":{\"input\":true,\"output\":true},\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":true,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"contextWindow\":131072,\"isDefault\":false,\"maxTokens\":8192,\"name\":\"gemini-2.5-flash-native-audio-preview-12-2025\",\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"thinkingBudget\":true},\"type\":\"audio\"}],\"name\":\"google-gemini\"},{\"defaultEmbedModel\":\"text-embedding-3-small\",\"defaultModel\":\"gpt-5-mini\",\"displayName\":\"OpenAI\",\"isDynamic\":false,\"models\":[{\"audio\":{\"input\":true,\"output\":true},\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"isDefault\":false,\"name\":\"gpt-audio\",\"provider\":\"openai\",\"type\":\"audio\"},{\"audio\":{\"input\":true,\"output\":true},\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"isDefault\":false,\"name\":\"gpt-audio-mini\",\"provider\":\"openai\",\"type\":\"audio\"},{\"audio\":{\"input\":true,\"output\":true},\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"isDefault\":false,\"name\":\"gpt-audio-1.5\",\"provider\":\"openai\",\"type\":\"audio\"},{\"audio\":{\"input\":true,\"output\":true},\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"isDefault\":false,\"name\":\"gpt-realtime-1.5\",\"provider\":\"openai\",\"type\":\"audio\"},{\"audio\":{\"input\":true,\"output\":true},\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"isDefault\":false,\"name\":\"gpt-realtime-2\",\"provider\":\"openai\",\"supported\":{\"thinkingBudget\":true},\"type\":\"audio\"},{\"audio\":{\"input\":true,\"output\":false},\"capabilities\":{\"audioInput\":true,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"isDefault\":false,\"name\":\"gpt-realtime-whisper\",\"provider\":\"openai\",\"type\":\"audio\"},{\"audio\":{\"input\":true,\"output\":true},\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"isDefault\":false,\"name\":\"gpt-realtime-translate\",\"provider\":\"openai\",\"type\":\"audio\"}],\"name\":\"openai\"},{\"defaultEmbedModel\":\"text-embedding-ada-002\",\"defaultModel\":\"gpt-4o\",\"displayName\":\"OpenAI Responses\",\"isDynamic\":false,\"models\":[],\"name\":\"openai-responses\"},{\"displayName\":\"Azure OpenAI\",\"isDynamic\":true,\"models\":[],\"name\":\"azure-openai\"},{\"defaultModel\":\"claude-3-7-sonnet-latest\",\"displayName\":\"Anthropic\",\"isDynamic\":false,\"models\":[],\"name\":\"anthropic\"},{\"defaultModel\":\"command-r-plus\",\"displayName\":\"Cohere\",\"isDynamic\":false,\"models\":[],\"name\":\"cohere\"},{\"defaultModel\":\"deepseek-v4-flash\",\"displayName\":\"DeepSeek\",\"isDynamic\":false,\"models\":[],\"name\":\"deepseek\"},{\"defaultModel\":\"mistral-small-latest\",\"displayName\":\"Mistral AI\",\"isDynamic\":false,\"models\":[],\"name\":\"mistral\"},{\"defaultModel\":\"reka-core\",\"displayName\":\"Reka\",\"isDynamic\":false,\"models\":[],\"name\":\"reka\"},{\"defaultModel\":\"grok-3\",\"displayName\":\"xAI Grok\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-voice-think-fast-1.0\",\"provider\":\"grok\",\"type\":\"audio\"},{\"capabilities\":{\"audioInput\":true,\"audioOutput\":true,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-voice-fast-1.0\",\"provider\":\"grok\",\"type\":\"audio\"}],\"name\":\"grok\"},{\"defaultModel\":\"Llama-3.2-3B-Instruct-q4f32_1-MLC\",\"displayName\":\"WebLLM\",\"isDynamic\":false,\"models\":[],\"name\":\"webllm\"}],\"code\":[{\"defaultModel\":\"mistral-small-latest\",\"displayName\":\"Mistral AI\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.25,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"open-codestral-mamba\",\"promptTokenCostPer1M\":0.25,\"provider\":\"mistral\",\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.6,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"codestral-latest\",\"promptTokenCostPer1M\":0.2,\"provider\":\"mistral\",\"type\":\"code\"}],\"name\":\"mistral\"},{\"defaultEmbedModel\":\"text-embedding-3-small\",\"defaultModel\":\"gpt-5-mini\",\"displayName\":\"OpenAI\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":2,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-codex-mini\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-codex\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-codex\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-codex-max\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":14,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.2-codex\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.75,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"code\"}],\"name\":\"openai\"},{\"defaultEmbedModel\":\"text-embedding-ada-002\",\"defaultModel\":\"gpt-4o\",\"displayName\":\"OpenAI Responses\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":2,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-codex-mini\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-codex\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-codex\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-codex-max\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":14,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.2-codex\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.75,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"code\"}],\"name\":\"openai-responses\"},{\"displayName\":\"Azure OpenAI\",\"isDynamic\":true,\"models\":[],\"name\":\"azure-openai\"},{\"defaultModel\":\"claude-3-7-sonnet-latest\",\"displayName\":\"Anthropic\",\"isDynamic\":false,\"models\":[],\"name\":\"anthropic\"},{\"defaultEmbedModel\":\"gemini-embedding-2\",\"defaultModel\":\"gemini-2.5-flash\",\"displayName\":\"Google Gemini\",\"isDynamic\":false,\"models\":[],\"name\":\"google-gemini\"},{\"defaultModel\":\"command-r-plus\",\"displayName\":\"Cohere\",\"isDynamic\":false,\"models\":[],\"name\":\"cohere\"},{\"defaultModel\":\"deepseek-v4-flash\",\"displayName\":\"DeepSeek\",\"isDynamic\":false,\"models\":[],\"name\":\"deepseek\"},{\"defaultModel\":\"reka-core\",\"displayName\":\"Reka\",\"isDynamic\":false,\"models\":[],\"name\":\"reka\"},{\"defaultModel\":\"grok-3\",\"displayName\":\"xAI Grok\",\"isDynamic\":false,\"models\":[],\"name\":\"grok\"},{\"defaultModel\":\"Llama-3.2-3B-Instruct-q4f32_1-MLC\",\"displayName\":\"WebLLM\",\"isDynamic\":false,\"models\":[],\"name\":\"webllm\"}],\"embeddings\":[{\"defaultEmbedModel\":\"text-embedding-3-small\",\"defaultModel\":\"gpt-5-mini\",\"displayName\":\"OpenAI\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.02,\"currency\":\"usd\",\"isDefault\":true,\"name\":\"text-embedding-3-small\",\"promptTokenCostPer1M\":0.02,\"provider\":\"openai\",\"type\":\"embeddings\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.1,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"text-embedding-ada-002\",\"promptTokenCostPer1M\":0.1,\"provider\":\"openai\",\"type\":\"embeddings\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.13,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"text-embedding-3-large\",\"promptTokenCostPer1M\":0.13,\"provider\":\"openai\",\"type\":\"embeddings\"}],\"name\":\"openai\"},{\"defaultEmbedModel\":\"gemini-embedding-2\",\"defaultModel\":\"gemini-2.5-flash\",\"displayName\":\"Google Gemini\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-embedding-001\",\"promptTokenCostPer1M\":0.15,\"provider\":\"google-gemini\",\"type\":\"embeddings\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"contextWindow\":8192,\"currency\":\"usd\",\"isDefault\":true,\"name\":\"gemini-embedding-2\",\"promptTokenCostPer1M\":0.2,\"provider\":\"google-gemini\",\"type\":\"embeddings\"}],\"name\":\"google-gemini\"},{\"defaultModel\":\"command-r-plus\",\"displayName\":\"Cohere\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.1,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"embed-english-light-v3.0\",\"promptTokenCostPer1M\":0.1,\"provider\":\"cohere\",\"type\":\"embeddings\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.1,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"embed-english-v3.0\",\"promptTokenCostPer1M\":0.1,\"provider\":\"cohere\",\"type\":\"embeddings\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.1,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"embed-multilingual-light-v3.0\",\"promptTokenCostPer1M\":0.1,\"provider\":\"cohere\",\"type\":\"embeddings\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.1,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"embed-multilingual-v3.0\",\"promptTokenCostPer1M\":0.1,\"provider\":\"cohere\",\"type\":\"embeddings\"}],\"name\":\"cohere\"},{\"defaultEmbedModel\":\"text-embedding-ada-002\",\"defaultModel\":\"gpt-4o\",\"displayName\":\"OpenAI Responses\",\"isDynamic\":false,\"models\":[],\"name\":\"openai-responses\"},{\"displayName\":\"Azure OpenAI\",\"isDynamic\":true,\"models\":[],\"name\":\"azure-openai\"},{\"defaultModel\":\"claude-3-7-sonnet-latest\",\"displayName\":\"Anthropic\",\"isDynamic\":false,\"models\":[],\"name\":\"anthropic\"},{\"defaultModel\":\"deepseek-v4-flash\",\"displayName\":\"DeepSeek\",\"isDynamic\":false,\"models\":[],\"name\":\"deepseek\"},{\"defaultModel\":\"mistral-small-latest\",\"displayName\":\"Mistral AI\",\"isDynamic\":false,\"models\":[],\"name\":\"mistral\"},{\"defaultModel\":\"reka-core\",\"displayName\":\"Reka\",\"isDynamic\":false,\"models\":[],\"name\":\"reka\"},{\"defaultModel\":\"grok-3\",\"displayName\":\"xAI Grok\",\"isDynamic\":false,\"models\":[],\"name\":\"grok\"},{\"defaultModel\":\"Llama-3.2-3B-Instruct-q4f32_1-MLC\",\"displayName\":\"WebLLM\",\"isDynamic\":false,\"models\":[],\"name\":\"webllm\"}],\"text\":[{\"defaultEmbedModel\":\"gemini-embedding-2\",\"defaultModel\":\"gemini-2.5-flash\",\"displayName\":\"Google Gemini\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-2.0-flash-thinking-exp-01-21\",\"promptTokenCostPer1M\":0,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-2.0-pro-exp-02-05\",\"promptTokenCostPer1M\":0,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-robotics-er-1.6-preview\",\"promptTokenCostPer1M\":0,\"provider\":\"google-gemini\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0.15,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-1.5-flash-8b\",\"promptTokenCostPer1M\":0.0375,\"provider\":\"google-gemini\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0.3,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-1.5-flash\",\"promptTokenCostPer1M\":0.075,\"provider\":\"google-gemini\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0.3,\"currency\":\"usd\",\"deprecatedOn\":\"2026-06-01\",\"isDefault\":false,\"isDeprecated\":true,\"name\":\"gemini-2.0-flash-lite\",\"promptTokenCostPer1M\":0.075,\"provider\":\"google-gemini\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.025,\"cacheWriteTokenCostPer1M\":0.1,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0.4,\"currency\":\"usd\",\"deprecatedOn\":\"2026-06-01\",\"isDefault\":false,\"isDeprecated\":true,\"name\":\"gemini-2.0-flash\",\"promptTokenCostPer1M\":0.1,\"provider\":\"google-gemini\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.01,\"cacheWriteTokenCostPer1M\":0.1,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-2.5-flash-lite\",\"promptTokenCostPer1M\":0.1,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.01,\"cacheWriteTokenCostPer1M\":0.1,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-flash-lite-latest\",\"promptTokenCostPer1M\":0.1,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.025,\"cacheWriteTokenCostPer1M\":0.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":1.5,\"contextWindow\":1048576,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":65536,\"name\":\"gemini-3.1-flash-lite\",\"promptTokenCostPer1M\":0.25,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.025,\"cacheWriteTokenCostPer1M\":0.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":1.5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-3.1-flash-lite-preview\",\"promptTokenCostPer1M\":0.25,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":1.5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-1.0-pro\",\"promptTokenCostPer1M\":0.5,\"provider\":\"google-gemini\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":0.134,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-3-pro-image-preview\",\"promptTokenCostPer1M\":2,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.03,\"cacheWriteTokenCostPer1M\":0.3,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":2.5,\"currency\":\"usd\",\"isDefault\":true,\"name\":\"gemini-2.5-flash\",\"promptTokenCostPer1M\":0.3,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.03,\"cacheWriteTokenCostPer1M\":0.3,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":2.5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-flash-latest\",\"promptTokenCostPer1M\":0.3,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.05,\"cacheWriteTokenCostPer1M\":0.5,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":3,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-3-flash-preview\",\"promptTokenCostPer1M\":0.5,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":3,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-3.1-flash-image-preview\",\"promptTokenCostPer1M\":0.5,\"provider\":\"google-gemini\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":3,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"nano-banana-2\",\"promptTokenCostPer1M\":0.5,\"provider\":\"google-gemini\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gemini-1.5-pro\",\"promptTokenCostPer1M\":1.25,\"provider\":\"google-gemini\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.15,\"cacheWriteTokenCostPer1M\":1.5,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":9,\"contextWindow\":1048576,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":65536,\"name\":\"gemini-3.5-flash\",\"promptTokenCostPer1M\":1.5,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.125,\"cacheWriteTokenCostPer1M\":1.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"longContextCacheReadTokenCostPer1M\":0.25,\"longContextCompletionTokenCostPer1M\":15,\"longContextPromptTokenCostPer1M\":2.5,\"longContextThreshold\":200000,\"name\":\"gemini-2.5-pro\",\"promptTokenCostPer1M\":1.25,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.125,\"cacheWriteTokenCostPer1M\":1.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"longContextCacheReadTokenCostPer1M\":0.25,\"longContextCompletionTokenCostPer1M\":15,\"longContextPromptTokenCostPer1M\":2.5,\"longContextThreshold\":200000,\"name\":\"gemini-pro-latest\",\"promptTokenCostPer1M\":1.25,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.2,\"cacheWriteTokenCostPer1M\":2,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"characterIsToken\":false,\"completionTokenCostPer1M\":12,\"currency\":\"usd\",\"isDefault\":false,\"longContextCacheReadTokenCostPer1M\":0.4,\"longContextCompletionTokenCostPer1M\":18,\"longContextPromptTokenCostPer1M\":4,\"longContextThreshold\":200000,\"name\":\"gemini-3.1-pro-preview\",\"promptTokenCostPer1M\":2,\"provider\":\"google-gemini\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"}],\"name\":\"google-gemini\"},{\"defaultModel\":\"Llama-3.2-3B-Instruct-q4f32_1-MLC\",\"displayName\":\"WebLLM\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":8192,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":2048,\"name\":\"gemma-2-2b-it-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":8192,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":2048,\"name\":\"gemma-2-9b-it-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":128000,\"currency\":\"usd\",\"isDefault\":false,\"isExpensive\":true,\"maxTokens\":4096,\"name\":\"Llama-3.1-70B-Instruct-q4f16_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":128000,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"Llama-3.1-8B-Instruct-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":128000,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":2048,\"name\":\"Llama-3.2-1B-Instruct-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":128000,\"currency\":\"usd\",\"isDefault\":true,\"maxTokens\":2048,\"name\":\"Llama-3.2-3B-Instruct-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":32768,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"Mistral-7B-Instruct-v0.3-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":128000,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"Phi-3.5-mini-instruct-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":32768,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":2048,\"name\":\"Qwen2.5-0.5B-Instruct-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":32768,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":2048,\"name\":\"Qwen2.5-1.5B-Instruct-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":32768,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":2048,\"name\":\"Qwen2.5-3B-Instruct-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0,\"contextWindow\":32768,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"Qwen2.5-7B-Instruct-q4f32_1-MLC\",\"promptTokenCostPer1M\":0,\"provider\":\"webllm\",\"type\":\"text\"}],\"name\":\"webllm\"},{\"defaultModel\":\"mistral-small-latest\",\"displayName\":\"Mistral AI\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.15,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"mistral-nemo-latest\",\"promptTokenCostPer1M\":0.15,\"provider\":\"mistral\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.25,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"open-codestral-mamba\",\"promptTokenCostPer1M\":0.25,\"provider\":\"mistral\",\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.25,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"open-mistral-7b\",\"promptTokenCostPer1M\":0.25,\"provider\":\"mistral\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.3,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"open-mistral-nemo-latest\",\"promptTokenCostPer1M\":0.3,\"provider\":\"mistral\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.6,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"codestral-latest\",\"promptTokenCostPer1M\":0.2,\"provider\":\"mistral\",\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.6,\"currency\":\"USD\",\"isDefault\":true,\"name\":\"mistral-small-latest\",\"promptTokenCostPer1M\":0.2,\"provider\":\"mistral\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.7,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"open-mixtral-8x7b\",\"promptTokenCostPer1M\":0.7,\"provider\":\"mistral\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":6,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"mistral-large-latest\",\"promptTokenCostPer1M\":2,\"provider\":\"mistral\",\"type\":\"text\"}],\"name\":\"mistral\"},{\"defaultModel\":\"deepseek-v4-flash\",\"displayName\":\"DeepSeek\",\"isDynamic\":false,\"models\":[{\"aliases\":[\"deepseek-chat\",\"deepseek-reasoner\"],\"cacheReadTokenCostPer1M\":0.0028,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":0.28,\"contextWindow\":1000000,\"currency\":\"USD\",\"isDefault\":true,\"maxTokens\":384000,\"name\":\"deepseek-v4-flash\",\"promptTokenCostPer1M\":0.14,\"provider\":\"deepseek\",\"supported\":{\"showThoughts\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.003625,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":0.87,\"contextWindow\":1000000,\"currency\":\"USD\",\"isDefault\":false,\"maxTokens\":384000,\"name\":\"deepseek-v4-pro\",\"promptTokenCostPer1M\":0.435,\"provider\":\"deepseek\",\"supported\":{\"showThoughts\":true,\"thinkingBudget\":true},\"type\":\"text\"}],\"name\":\"deepseek\"},{\"defaultEmbedModel\":\"text-embedding-3-small\",\"defaultModel\":\"gpt-5-mini\",\"displayName\":\"OpenAI\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":0.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-nano\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.05,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4.1-nano\",\"promptTokenCostPer1M\":0.1,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.6,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4o-mini\",\"promptTokenCostPer1M\":0.15,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":1.25,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.4-nano\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.2,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":1.5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-3.5-turbo\",\"promptTokenCostPer1M\":0.5,\"provider\":\"openai\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":1.6,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4.1-mini\",\"promptTokenCostPer1M\":0.4,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":2,\"currency\":\"usd\",\"isDefault\":true,\"name\":\"gpt-5-mini\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":2,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-codex-mini\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":4.5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.4-mini\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.75,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":4.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"o1-mini\",\"promptTokenCostPer1M\":1.1,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":4.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"o4-mini\",\"promptTokenCostPer1M\":1.1,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":8,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4.1\",\"promptTokenCostPer1M\":2,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":8,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"o3\",\"promptTokenCostPer1M\":2,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-chat\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-chat-latest\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-codex\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-chat-latest\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-codex\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-codex-max\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4o\",\"promptTokenCostPer1M\":2.5,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":14,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.2\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.75,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":14,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.2-chat-latest\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.75,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":14,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.2-codex\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.75,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.4\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":2.5,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"chatgpt-4o-latest\",\"promptTokenCostPer1M\":5,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":30,\"contextWindow\":1000000,\"currency\":\"usd\",\"isDefault\":false,\"longContextCacheReadTokenCostPer1M\":1,\"longContextCompletionTokenCostPer1M\":45,\"longContextPromptTokenCostPer1M\":10,\"longContextThreshold\":272000,\"name\":\"gpt-5.5\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":5,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":30,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4-turbo\",\"promptTokenCostPer1M\":10,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":60,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"o1\",\"promptTokenCostPer1M\":15,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":60,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4\",\"promptTokenCostPer1M\":30,\"provider\":\"openai\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":120,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-pro\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":15,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":false,\"topP\":false},\"completionTokenCostPer1M\":168,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.2-pro\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":21,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":180,\"contextWindow\":1000000,\"currency\":\"usd\",\"isDefault\":false,\"isExpensive\":true,\"longContextCompletionTokenCostPer1M\":270,\"longContextPromptTokenCostPer1M\":60,\"longContextThreshold\":272000,\"name\":\"gpt-5.5-pro\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":30,\"provider\":\"openai\",\"supported\":{\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"}],\"name\":\"openai\"},{\"defaultEmbedModel\":\"text-embedding-ada-002\",\"defaultModel\":\"gpt-4o\",\"displayName\":\"OpenAI Responses\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":0.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-nano\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.05,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4.1-nano\",\"promptTokenCostPer1M\":0.1,\"provider\":\"openai-responses\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.6,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4o-mini\",\"promptTokenCostPer1M\":0.15,\"provider\":\"openai-responses\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":1.25,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.4-nano\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.2,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":1.5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-3.5-turbo\",\"promptTokenCostPer1M\":0.5,\"provider\":\"openai-responses\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":1.6,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4.1-mini\",\"promptTokenCostPer1M\":0.4,\"provider\":\"openai-responses\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":2,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-mini\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":2,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-codex-mini\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":4.5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.4-mini\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":0.75,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":4.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"o3-mini\",\"promptTokenCostPer1M\":1.1,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":4.4,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"o4-mini\",\"promptTokenCostPer1M\":1.1,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":8,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4.1\",\"promptTokenCostPer1M\":2,\"provider\":\"openai-responses\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":8,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"o3\",\"promptTokenCostPer1M\":2,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-chat\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-chat-latest\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-codex\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-chat-latest\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-codex\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.1-codex-max\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.25,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":10,\"currency\":\"usd\",\"isDefault\":true,\"name\":\"gpt-4o\",\"promptTokenCostPer1M\":2.5,\"provider\":\"openai-responses\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":14,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.2\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.75,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":14,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.2-chat-latest\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.75,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":14,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.2-codex\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":1.75,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"code\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.4\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":2.5,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"chatgpt-4o-latest\",\"promptTokenCostPer1M\":5,\"provider\":\"openai-responses\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":30,\"contextWindow\":1000000,\"currency\":\"usd\",\"isDefault\":false,\"longContextCacheReadTokenCostPer1M\":1,\"longContextCompletionTokenCostPer1M\":45,\"longContextPromptTokenCostPer1M\":10,\"longContextThreshold\":272000,\"name\":\"gpt-5.5\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":5,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":30,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4-turbo\",\"promptTokenCostPer1M\":10,\"provider\":\"openai-responses\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":60,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"o1\",\"promptTokenCostPer1M\":15,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":60,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-4\",\"promptTokenCostPer1M\":30,\"provider\":\"openai-responses\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":80,\"currency\":\"usd\",\"isDefault\":false,\"isExpensive\":true,\"name\":\"o3-pro\",\"promptTokenCostPer1M\":20,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":120,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5-pro\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":15,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":168,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"gpt-5.2-pro\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":21,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":false,\"thinkingBudget\":true,\"topP\":false},\"completionTokenCostPer1M\":180,\"contextWindow\":1000000,\"currency\":\"usd\",\"isDefault\":false,\"isExpensive\":true,\"longContextCompletionTokenCostPer1M\":270,\"longContextPromptTokenCostPer1M\":60,\"longContextThreshold\":272000,\"name\":\"gpt-5.5-pro\",\"notSupported\":{\"temperature\":true,\"topP\":true},\"promptTokenCostPer1M\":30,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":600,\"currency\":\"usd\",\"isDefault\":false,\"isExpensive\":true,\"name\":\"o1-pro\",\"promptTokenCostPer1M\":150,\"provider\":\"openai-responses\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"}],\"name\":\"openai-responses\"},{\"defaultModel\":\"grok-3\",\"displayName\":\"xAI Grok\",\"isDynamic\":false,\"models\":[{\"aliases\":[\"grok-4-1-fast-non-reasoning-latest\"],\"cacheReadTokenCostPer1M\":0.05,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.5,\"contextWindow\":2000000,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-4-1-fast-non-reasoning\",\"promptTokenCostPer1M\":0.2,\"provider\":\"grok\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"aliases\":[\"grok-4-1-fast-reasoning-latest\"],\"cacheReadTokenCostPer1M\":0.05,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.5,\"contextWindow\":2000000,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-4-1-fast-reasoning\",\"promptTokenCostPer1M\":0.2,\"provider\":\"grok\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":0.5,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-3-mini\",\"promptTokenCostPer1M\":0.3,\"provider\":\"grok\",\"supported\":{\"thinkingBudget\":true},\"type\":\"text\"},{\"aliases\":[\"grok-4.20-multi-agent-0309\",\"grok-4.20-multi-agent-latest\"],\"cacheReadTokenCostPer1M\":0.2,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":2.5,\"contextWindow\":2000000,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-4.20-multi-agent\",\"promptTokenCostPer1M\":1.25,\"provider\":\"grok\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"aliases\":[\"grok-4.20-0309-non-reasoning\",\"grok-4.20-non-reasoning-latest\"],\"cacheReadTokenCostPer1M\":0.2,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":2.5,\"contextWindow\":2000000,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-4.20-non-reasoning\",\"promptTokenCostPer1M\":1.25,\"provider\":\"grok\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"aliases\":[\"grok-4.20-0309-reasoning\",\"grok-4.20-reasoning-latest\",\"grok-4.20\",\"grok-4.20-0309\"],\"cacheReadTokenCostPer1M\":0.2,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":2.5,\"contextWindow\":2000000,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-4.20-reasoning\",\"promptTokenCostPer1M\":1.25,\"provider\":\"grok\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"aliases\":[\"grok-4.3-latest\",\"grok-latest\"],\"cacheReadTokenCostPer1M\":0.2,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":2.5,\"contextWindow\":1000000,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-4.3\",\"promptTokenCostPer1M\":1.25,\"provider\":\"grok\",\"supported\":{\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":4,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-3-mini-fast\",\"promptTokenCostPer1M\":0.6,\"provider\":\"grok\",\"supported\":{\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"USD\",\"isDefault\":true,\"name\":\"grok-3\",\"promptTokenCostPer1M\":3,\"provider\":\"grok\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":25,\"currency\":\"USD\",\"isDefault\":false,\"name\":\"grok-3-fast\",\"promptTokenCostPer1M\":5,\"provider\":\"grok\",\"type\":\"text\"}],\"name\":\"grok\"},{\"defaultModel\":\"command-r-plus\",\"displayName\":\"Cohere\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":0.6,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"command-light\",\"promptTokenCostPer1M\":0.3,\"provider\":\"cohere\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":1.5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"command\",\"promptTokenCostPer1M\":0.5,\"provider\":\"cohere\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":1.5,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"command-r\",\"promptTokenCostPer1M\":0.5,\"provider\":\"cohere\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":true,\"name\":\"command-r-plus\",\"promptTokenCostPer1M\":3,\"provider\":\"cohere\",\"type\":\"text\"}],\"name\":\"cohere\"},{\"defaultModel\":\"reka-core\",\"displayName\":\"Reka\",\"isDynamic\":false,\"models\":[{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":1,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"reka-edge\",\"promptTokenCostPer1M\":0.4,\"provider\":\"reka\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":2,\"currency\":\"usd\",\"isDefault\":false,\"name\":\"reka-flash\",\"promptTokenCostPer1M\":0.8,\"provider\":\"reka\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":true,\"name\":\"reka-core\",\"promptTokenCostPer1M\":3,\"provider\":\"reka\",\"type\":\"text\"}],\"name\":\"reka\"},{\"defaultModel\":\"claude-3-7-sonnet-latest\",\"displayName\":\"Anthropic\",\"isDynamic\":false,\"models\":[{\"cacheReadTokenCostPer1M\":0.03,\"cacheWriteTokenCostPer1M\":0.3,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":1.25,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"claude-3-haiku-20240307\",\"promptTokenCostPer1M\":0.25,\"provider\":\"anthropic\",\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.03,\"cacheWriteTokenCostPer1M\":0.3,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":1.25,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"claude-3-haiku@20240307\",\"promptTokenCostPer1M\":0.25,\"provider\":\"anthropic\",\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":2.24,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"claude-instant-1.2\",\"promptTokenCostPer1M\":0.8,\"provider\":\"anthropic\",\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.08,\"cacheWriteTokenCostPer1M\":1,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":4,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":8192,\"name\":\"claude-3-5-haiku-latest\",\"promptTokenCostPer1M\":0.8,\"provider\":\"anthropic\",\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.1,\"cacheWriteTokenCostPer1M\":1.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":5,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":8192,\"name\":\"claude-3-5-haiku@20241022\",\"promptTokenCostPer1M\":1,\"provider\":\"anthropic\",\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.1,\"cacheWriteTokenCostPer1M\":1.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":5,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":200000,\"name\":\"claude-haiku-4-5\",\"promptTokenCostPer1M\":1,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.1,\"cacheWriteTokenCostPer1M\":1.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":5,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":200000,\"name\":\"claude-haiku-4-5@20251001\",\"promptTokenCostPer1M\":1,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":8192,\"name\":\"claude-3-5-sonnet-latest\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":8192,\"name\":\"claude-3-5-sonnet-v2@20241022\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":8192,\"name\":\"claude-3-5-sonnet@20240620\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":true,\"maxTokens\":64000,\"name\":\"claude-3-7-sonnet-latest\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":64000,\"name\":\"claude-3-7-sonnet@20250219\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"claude-3-sonnet-20240229\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":64000,\"name\":\"claude-sonnet-4-20250514\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":200000,\"name\":\"claude-sonnet-4-5-20250929\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":200000,\"name\":\"claude-sonnet-4-5@20250929\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":64000,\"name\":\"claude-sonnet-4-6\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":64000,\"name\":\"claude-sonnet-4-6\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":64000,\"name\":\"claude-sonnet-4@20250514\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"contextWindow\":1000000,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":128000,\"name\":\"claude-sonnet-5\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.3,\"cacheWriteTokenCostPer1M\":3.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":15,\"contextWindow\":1000000,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":128000,\"name\":\"claude-sonnet-5\",\"promptTokenCostPer1M\":3,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"cacheWriteTokenCostPer1M\":6.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":25,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":64000,\"name\":\"claude-opus-4-5-20251101\",\"promptTokenCostPer1M\":5,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"cacheWriteTokenCostPer1M\":6.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":25,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":64000,\"name\":\"claude-opus-4-5@20251101\",\"promptTokenCostPer1M\":5,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"cacheWriteTokenCostPer1M\":6.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":25,\"contextWindow\":1000000,\"currency\":\"usd\",\"fastCacheReadTokenCostPer1M\":3,\"fastCacheWriteTokenCostPer1M\":37.5,\"fastCompletionTokenCostPer1M\":150,\"fastPromptTokenCostPer1M\":30,\"isDefault\":false,\"maxTokens\":128000,\"name\":\"claude-opus-4-6\",\"promptTokenCostPer1M\":5,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"cacheWriteTokenCostPer1M\":6.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":25,\"contextWindow\":1000000,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":128000,\"name\":\"claude-opus-4-6\",\"promptTokenCostPer1M\":5,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"cacheWriteTokenCostPer1M\":6.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":25,\"contextWindow\":1000000,\"currency\":\"usd\",\"fastCacheReadTokenCostPer1M\":3,\"fastCacheWriteTokenCostPer1M\":37.5,\"fastCompletionTokenCostPer1M\":150,\"fastPromptTokenCostPer1M\":30,\"isDefault\":false,\"maxTokens\":128000,\"name\":\"claude-opus-4-7\",\"promptTokenCostPer1M\":5,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"cacheWriteTokenCostPer1M\":6.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":25,\"contextWindow\":1000000,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":128000,\"name\":\"claude-opus-4-7\",\"promptTokenCostPer1M\":5,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"cacheWriteTokenCostPer1M\":6.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":25,\"contextWindow\":1000000,\"currency\":\"usd\",\"fastCacheReadTokenCostPer1M\":1,\"fastCacheWriteTokenCostPer1M\":12.5,\"fastCompletionTokenCostPer1M\":50,\"fastPromptTokenCostPer1M\":10,\"isDefault\":false,\"maxTokens\":128000,\"name\":\"claude-opus-4-8\",\"promptTokenCostPer1M\":5,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":0.5,\"cacheWriteTokenCostPer1M\":6.25,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":25,\"contextWindow\":1000000,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":128000,\"name\":\"claude-opus-4-8\",\"promptTokenCostPer1M\":5,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":false,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":25,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"claude-2.1\",\"promptTokenCostPer1M\":8,\"provider\":\"anthropic\",\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":1.5,\"cacheWriteTokenCostPer1M\":18.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":75,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"claude-3-opus-latest\",\"promptTokenCostPer1M\":15,\"provider\":\"anthropic\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":1.5,\"cacheWriteTokenCostPer1M\":18.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":false,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":false,\"topP\":true},\"completionTokenCostPer1M\":75,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":4096,\"name\":\"claude-3-opus@20240229\",\"promptTokenCostPer1M\":15,\"provider\":\"anthropic\",\"supported\":{\"structuredOutputs\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":1.5,\"cacheWriteTokenCostPer1M\":18.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":75,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":32000,\"name\":\"claude-opus-4-1-20250805\",\"promptTokenCostPer1M\":15,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":1.5,\"cacheWriteTokenCostPer1M\":18.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":75,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":32000,\"name\":\"claude-opus-4-1@20250805\",\"promptTokenCostPer1M\":15,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":1.5,\"cacheWriteTokenCostPer1M\":18.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":75,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":32000,\"name\":\"claude-opus-4-20250514\",\"promptTokenCostPer1M\":15,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"},{\"cacheReadTokenCostPer1M\":1.5,\"cacheWriteTokenCostPer1M\":18.75,\"capabilities\":{\"audioInput\":false,\"audioOutput\":false,\"showThoughts\":true,\"structuredOutputs\":true,\"temperature\":true,\"thinkingBudget\":true,\"topP\":true},\"completionTokenCostPer1M\":75,\"currency\":\"usd\",\"isDefault\":false,\"maxTokens\":32000,\"name\":\"claude-opus-4@20250514\",\"promptTokenCostPer1M\":15,\"provider\":\"anthropic\",\"supported\":{\"showThoughts\":true,\"structuredOutputs\":true,\"thinkingBudget\":true},\"type\":\"text\"}],\"name\":\"anthropic\"},{\"displayName\":\"Azure OpenAI\",\"isDynamic\":true,\"models\":[],\"name\":\"azure-openai\"}]}")])?;
return Ok(v_catalog.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_model_catalog(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_model_catalog");
let mut v_options = core_arg(args, 0);
let mut v_candidate = CoreValue::Null;
let mut v_candidate_is_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_missing = CoreValue::Null;
let mut v_options_is_string = CoreValue::Null;
let mut v_opts = CoreValue::Null;
let mut v_opts_missing = CoreValue::Null;
let mut v_registry = CoreValue::Null;
let mut v_selected = CoreValue::Null;
let mut v_type_name = CoreValue::Null;
let mut v_type_raw = CoreValue::Null;
v_registry = _provider_model_catalog_registry(&[])?;
v_type_raw = CoreValue::from("all");
v_options_is_string = core_type_is(&v_options, CoreValue::from("string"));
if core_truthy(&v_options_is_string) {
v_type_raw = v_options.clone();
} else {
v_empty_map = CoreValue::new_map();
v_opts = v_options.clone();
v_opts_missing = core_is_none(&[v_opts.clone()])?;
if core_truthy(&v_opts_missing) {
v_opts = v_empty_map.clone();
}
v_candidate = core_get(&v_opts, &CoreValue::from("type"), CoreValue::from("all"));
v_candidate_is_list = core_type_is(&v_candidate, CoreValue::from("list"));
if core_truthy(&v_candidate_is_list) {
v_type_raw = core_list_get(&[
v_candidate.clone(),
CoreValue::Num(0f64),
CoreValue::from("all"),
])?;
} else {
v_type_raw = v_candidate.clone();
}
}
v_type_name = core_string_lower(&[v_type_raw.clone()])?;
v_selected = core_get(&v_registry, &v_type_name.clone(), CoreValue::Null);
v_missing = core_is_none(&[v_selected.clone()])?;
if core_truthy(&v_missing) {
v_selected = core_get(&v_registry, &CoreValue::from("all"), CoreValue::Null);
}
return Ok(v_selected.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_route_request_requirements(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_route_request_requirements");
let mut v_request = core_arg(args, 0);
let mut v_audio_config = CoreValue::Null;
let mut v_audio_output = CoreValue::Null;
let mut v_audio_output_enabled = CoreValue::Null;
let mut v_cached = CoreValue::Null;
let mut v_cached_audio = CoreValue::Null;
let mut v_cached_file = CoreValue::Null;
let mut v_cached_part = CoreValue::Null;
let mut v_cached_url = CoreValue::Null;
let mut v_capabilities = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_content_is_list = CoreValue::Null;
let mut v_content_types = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_functions = CoreValue::Null;
let mut v_functions_count = CoreValue::Null;
let mut v_has_functions = CoreValue::Null;
let mut v_is_audio = CoreValue::Null;
let mut v_is_file = CoreValue::Null;
let mut v_is_image = CoreValue::Null;
let mut v_is_url = CoreValue::Null;
let mut v_known_type = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_message_cached = CoreValue::Null;
let mut v_model_config = CoreValue::Null;
let mut v_model_config_missing = CoreValue::Null;
let mut v_new_type = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_part_type = CoreValue::Null;
let mut v_prompt = CoreValue::Null;
let mut v_prompt_count_initial = CoreValue::Null;
let mut v_prompt_empty = CoreValue::Null;
let mut v_requirements = CoreValue::Null;
let mut v_requires_audio = CoreValue::Null;
let mut v_requires_audio_output = CoreValue::Null;
let mut v_requires_files = CoreValue::Null;
let mut v_requires_images = CoreValue::Null;
let mut v_requires_web_search = CoreValue::Null;
let mut v_stream = CoreValue::Null;
v_requirements = CoreValue::new_map();
core_set(
&v_requirements,
CoreValue::from("hasImages"),
CoreValue::Bool(false),
)?;
core_set(
&v_requirements,
CoreValue::from("hasAudio"),
CoreValue::Bool(false),
)?;
core_set(
&v_requirements,
CoreValue::from("hasAudioOutput"),
CoreValue::Bool(false),
)?;
core_set(
&v_requirements,
CoreValue::from("hasFiles"),
CoreValue::Bool(false),
)?;
core_set(
&v_requirements,
CoreValue::from("hasUrls"),
CoreValue::Bool(false),
)?;
core_set(
&v_requirements,
CoreValue::from("requiresFunctions"),
CoreValue::Bool(false),
)?;
core_set(
&v_requirements,
CoreValue::from("requiresStreaming"),
CoreValue::Bool(false),
)?;
core_set(
&v_requirements,
CoreValue::from("requiresCaching"),
CoreValue::Bool(false),
)?;
v_content_types = CoreValue::new_list();
core_set(
&v_requirements,
CoreValue::from("contentTypes"),
v_content_types.clone(),
)?;
core_set(
&v_requirements,
CoreValue::from("estimatedTokens"),
CoreValue::Num(0f64),
)?;
v_empty_list = CoreValue::new_list();
v_prompt = core_get(
&v_request,
&CoreValue::from("chatPrompt"),
v_empty_list.clone(),
);
v_prompt_count_initial = core_len(&[v_prompt.clone()])?;
v_prompt_empty = core_eq(&[v_prompt_count_initial.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_prompt_empty) {
v_prompt = core_get(
&v_request,
&CoreValue::from("chat_prompt"),
v_prompt.clone(),
);
}
for v_message in core_iter(&v_prompt)? {
let mut v_message = v_message;
v_content = core_get(&v_message, &CoreValue::from("content"), CoreValue::Null);
v_content_is_list = core_type_is(&v_content, CoreValue::from("list"));
if core_truthy(&v_content_is_list) {
for v_part in core_iter(&v_content)? {
let mut v_part = v_part;
v_part_type = core_get(&v_part, &CoreValue::from("type"), CoreValue::from("text"));
v_known_type = core_contains(&[v_content_types.clone(), v_part_type.clone()])?;
v_new_type = core_not(&[v_known_type.clone()])?;
if core_truthy(&v_new_type) {
core_append(&v_content_types, v_part_type.clone())?;
}
v_is_image = core_eq(&[v_part_type.clone(), CoreValue::from("image")])?;
if core_truthy(&v_is_image) {
core_set(
&v_requirements,
CoreValue::from("hasImages"),
CoreValue::Bool(true),
)?;
v_cached = core_get(&v_part, &CoreValue::from("cache"), CoreValue::Bool(false));
if core_truthy(&v_cached) {
core_set(
&v_requirements,
CoreValue::from("requiresCaching"),
CoreValue::Bool(true),
)?;
}
}
v_is_audio = core_eq(&[v_part_type.clone(), CoreValue::from("audio")])?;
if core_truthy(&v_is_audio) {
core_set(
&v_requirements,
CoreValue::from("hasAudio"),
CoreValue::Bool(true),
)?;
v_cached_audio =
core_get(&v_part, &CoreValue::from("cache"), CoreValue::Bool(false));
if core_truthy(&v_cached_audio) {
core_set(
&v_requirements,
CoreValue::from("requiresCaching"),
CoreValue::Bool(true),
)?;
}
}
v_is_file = core_eq(&[v_part_type.clone(), CoreValue::from("file")])?;
if core_truthy(&v_is_file) {
core_set(
&v_requirements,
CoreValue::from("hasFiles"),
CoreValue::Bool(true),
)?;
v_cached_file =
core_get(&v_part, &CoreValue::from("cache"), CoreValue::Bool(false));
if core_truthy(&v_cached_file) {
core_set(
&v_requirements,
CoreValue::from("requiresCaching"),
CoreValue::Bool(true),
)?;
}
}
v_is_url = core_eq(&[v_part_type.clone(), CoreValue::from("url")])?;
if core_truthy(&v_is_url) {
core_set(
&v_requirements,
CoreValue::from("hasUrls"),
CoreValue::Bool(true),
)?;
v_cached_url =
core_get(&v_part, &CoreValue::from("cache"), CoreValue::Bool(false));
if core_truthy(&v_cached_url) {
core_set(
&v_requirements,
CoreValue::from("requiresCaching"),
CoreValue::Bool(true),
)?;
}
}
v_cached_part =
core_get(&v_part, &CoreValue::from("cache"), CoreValue::Bool(false));
if core_truthy(&v_cached_part) {
core_set(
&v_requirements,
CoreValue::from("requiresCaching"),
CoreValue::Bool(true),
)?;
}
}
}
v_message_cached = core_get(
&v_message,
&CoreValue::from("cache"),
CoreValue::Bool(false),
);
if core_truthy(&v_message_cached) {
core_set(
&v_requirements,
CoreValue::from("requiresCaching"),
CoreValue::Bool(true),
)?;
}
}
v_functions = core_get(
&v_request,
&CoreValue::from("functions"),
v_empty_list.clone(),
);
v_functions_count = core_len(&[v_functions.clone()])?;
v_has_functions = core_gt(&[v_functions_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_functions) {
core_set(
&v_requirements,
CoreValue::from("requiresFunctions"),
CoreValue::Bool(true),
)?;
}
v_model_config = core_get(&v_request, &CoreValue::from("modelConfig"), CoreValue::Null);
v_model_config_missing = core_is_none(&[v_model_config.clone()])?;
if core_truthy(&v_model_config_missing) {
v_model_config = core_get(
&v_request,
&CoreValue::from("model_config"),
CoreValue::Null,
);
}
v_stream = core_get(
&v_model_config,
&CoreValue::from("stream"),
CoreValue::Bool(false),
);
if core_truthy(&v_stream) {
core_set(
&v_requirements,
CoreValue::from("requiresStreaming"),
CoreValue::Bool(true),
)?;
}
v_audio_config = core_get(&v_model_config, &CoreValue::from("audio"), CoreValue::Null);
v_audio_output = core_get(&v_audio_config, &CoreValue::from("output"), CoreValue::Null);
v_audio_output_enabled = core_get(
&v_audio_output,
&CoreValue::from("enabled"),
CoreValue::Bool(false),
);
if core_truthy(&v_audio_output_enabled) {
core_set(
&v_requirements,
CoreValue::from("hasAudioOutput"),
CoreValue::Bool(true),
)?;
}
v_capabilities = core_get(
&v_request,
&CoreValue::from("capabilities"),
CoreValue::Null,
);
v_requires_images = core_get(
&v_capabilities,
&CoreValue::from("requiresImages"),
CoreValue::Bool(false),
);
if core_truthy(&v_requires_images) {
core_set(
&v_requirements,
CoreValue::from("hasImages"),
CoreValue::Bool(true),
)?;
}
v_requires_audio = core_get(
&v_capabilities,
&CoreValue::from("requiresAudio"),
CoreValue::Bool(false),
);
if core_truthy(&v_requires_audio) {
core_set(
&v_requirements,
CoreValue::from("hasAudio"),
CoreValue::Bool(true),
)?;
}
v_requires_audio_output = core_get(
&v_capabilities,
&CoreValue::from("requiresAudioOutput"),
CoreValue::Bool(false),
);
if core_truthy(&v_requires_audio_output) {
core_set(
&v_requirements,
CoreValue::from("hasAudioOutput"),
CoreValue::Bool(true),
)?;
}
v_requires_files = core_get(
&v_capabilities,
&CoreValue::from("requiresFiles"),
CoreValue::Bool(false),
);
if core_truthy(&v_requires_files) {
core_set(
&v_requirements,
CoreValue::from("hasFiles"),
CoreValue::Bool(true),
)?;
}
v_requires_web_search = core_get(
&v_capabilities,
&CoreValue::from("requiresWebSearch"),
CoreValue::Bool(false),
);
if core_truthy(&v_requires_web_search) {
core_set(
&v_requirements,
CoreValue::from("hasUrls"),
CoreValue::Bool(true),
)?;
}
return Ok(v_requirements.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _provider_features_support(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_provider_features_support");
let mut v_features = core_arg(args, 0);
let mut v_path = core_arg(args, 1);
let mut v_audio = CoreValue::Null;
let mut v_caching = CoreValue::Null;
let mut v_files = CoreValue::Null;
let mut v_images = CoreValue::Null;
let mut v_is_audio = CoreValue::Null;
let mut v_is_caching = CoreValue::Null;
let mut v_is_files = CoreValue::Null;
let mut v_is_functions = CoreValue::Null;
let mut v_is_images = CoreValue::Null;
let mut v_is_streaming = CoreValue::Null;
let mut v_is_urls = CoreValue::Null;
let mut v_media = CoreValue::Null;
let mut v_urls = CoreValue::Null;
let mut v_value = CoreValue::Null;
let mut v_value_audio = CoreValue::Null;
let mut v_value_caching = CoreValue::Null;
let mut v_value_files = CoreValue::Null;
let mut v_value_images = CoreValue::Null;
let mut v_value_streaming = CoreValue::Null;
let mut v_value_urls = CoreValue::Null;
v_media = core_get(&v_features, &CoreValue::from("media"), CoreValue::Null);
v_caching = core_get(&v_features, &CoreValue::from("caching"), CoreValue::Null);
v_is_functions = core_eq(&[v_path.clone(), CoreValue::from("functions")])?;
if core_truthy(&v_is_functions) {
v_value = core_get(
&v_features,
&CoreValue::from("functions"),
CoreValue::Bool(false),
);
return Ok(v_value.clone());
}
v_is_streaming = core_eq(&[v_path.clone(), CoreValue::from("streaming")])?;
if core_truthy(&v_is_streaming) {
v_value_streaming = core_get(
&v_features,
&CoreValue::from("streaming"),
CoreValue::Bool(false),
);
return Ok(v_value_streaming.clone());
}
v_is_images = core_eq(&[v_path.clone(), CoreValue::from("images")])?;
if core_truthy(&v_is_images) {
v_images = core_get(&v_media, &CoreValue::from("images"), CoreValue::Null);
v_value_images = core_get(
&v_images,
&CoreValue::from("supported"),
CoreValue::Bool(false),
);
return Ok(v_value_images.clone());
}
v_is_audio = core_eq(&[v_path.clone(), CoreValue::from("audio")])?;
if core_truthy(&v_is_audio) {
v_audio = core_get(&v_media, &CoreValue::from("audio"), CoreValue::Null);
v_value_audio = core_get(
&v_audio,
&CoreValue::from("supported"),
CoreValue::Bool(false),
);
return Ok(v_value_audio.clone());
}
v_is_files = core_eq(&[v_path.clone(), CoreValue::from("files")])?;
if core_truthy(&v_is_files) {
v_files = core_get(&v_media, &CoreValue::from("files"), CoreValue::Null);
v_value_files = core_get(
&v_files,
&CoreValue::from("supported"),
CoreValue::Bool(false),
);
return Ok(v_value_files.clone());
}
v_is_urls = core_eq(&[v_path.clone(), CoreValue::from("urls")])?;
if core_truthy(&v_is_urls) {
v_urls = core_get(&v_media, &CoreValue::from("urls"), CoreValue::Null);
v_value_urls = core_get(
&v_urls,
&CoreValue::from("supported"),
CoreValue::Bool(false),
);
return Ok(v_value_urls.clone());
}
v_is_caching = core_eq(&[v_path.clone(), CoreValue::from("caching")])?;
if core_truthy(&v_is_caching) {
v_value_caching = core_get(
&v_caching,
&CoreValue::from("supported"),
CoreValue::Bool(false),
);
return Ok(v_value_caching.clone());
}
return Ok(CoreValue::Bool(false));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _provider_route_score(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_provider_route_score");
let mut v_provider = core_arg(args, 0);
let mut v_requirements = core_arg(args, 1);
let mut v_features = CoreValue::Null;
let mut v_missing = CoreValue::Null;
let mut v_missing_count = CoreValue::Null;
let mut v_multi_turn = CoreValue::Null;
let mut v_multi_turn_missing = CoreValue::Null;
let mut v_needs_audio = CoreValue::Null;
let mut v_needs_caching = CoreValue::Null;
let mut v_needs_files = CoreValue::Null;
let mut v_needs_functions = CoreValue::Null;
let mut v_needs_images = CoreValue::Null;
let mut v_needs_streaming = CoreValue::Null;
let mut v_needs_urls = CoreValue::Null;
let mut v_ok_audio = CoreValue::Null;
let mut v_ok_caching = CoreValue::Null;
let mut v_ok_files = CoreValue::Null;
let mut v_ok_functions = CoreValue::Null;
let mut v_ok_images = CoreValue::Null;
let mut v_ok_streaming = CoreValue::Null;
let mut v_ok_urls = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_penalty = CoreValue::Null;
let mut v_score = CoreValue::Null;
let mut v_supported = CoreValue::Null;
let mut v_thinking = CoreValue::Null;
v_features = core_get(&v_provider, &CoreValue::from("features"), CoreValue::Null);
v_score = CoreValue::Num(10f64);
v_missing = CoreValue::new_list();
v_supported = CoreValue::new_list();
v_needs_images = core_get(
&v_requirements,
&CoreValue::from("hasImages"),
CoreValue::Bool(false),
);
if core_truthy(&v_needs_images) {
v_ok_images = _provider_features_support(&[v_features.clone(), CoreValue::from("images")])?;
if core_truthy(&v_ok_images) {
v_score = core_add(&[v_score.clone(), CoreValue::Num(25f64)])?;
core_append(&v_supported, CoreValue::from("Images"))?;
} else {
core_append(&v_missing, CoreValue::from("Image support"))?;
}
}
v_needs_audio = core_get(
&v_requirements,
&CoreValue::from("hasAudio"),
CoreValue::Bool(false),
);
if core_truthy(&v_needs_audio) {
v_ok_audio = _provider_features_support(&[v_features.clone(), CoreValue::from("audio")])?;
if core_truthy(&v_ok_audio) {
v_score = core_add(&[v_score.clone(), CoreValue::Num(25f64)])?;
core_append(&v_supported, CoreValue::from("Audio"))?;
} else {
core_append(&v_missing, CoreValue::from("Audio support"))?;
}
}
v_needs_files = core_get(
&v_requirements,
&CoreValue::from("hasFiles"),
CoreValue::Bool(false),
);
if core_truthy(&v_needs_files) {
v_ok_files = _provider_features_support(&[v_features.clone(), CoreValue::from("files")])?;
if core_truthy(&v_ok_files) {
v_score = core_add(&[v_score.clone(), CoreValue::Num(25f64)])?;
core_append(&v_supported, CoreValue::from("Files"))?;
} else {
core_append(&v_missing, CoreValue::from("File support"))?;
}
}
v_needs_urls = core_get(
&v_requirements,
&CoreValue::from("hasUrls"),
CoreValue::Bool(false),
);
if core_truthy(&v_needs_urls) {
v_ok_urls = _provider_features_support(&[v_features.clone(), CoreValue::from("urls")])?;
if core_truthy(&v_ok_urls) {
v_score = core_add(&[v_score.clone(), CoreValue::Num(25f64)])?;
core_append(&v_supported, CoreValue::from("URLs"))?;
} else {
core_append(&v_missing, CoreValue::from("URL/Web search support"))?;
}
}
v_needs_functions = core_get(
&v_requirements,
&CoreValue::from("requiresFunctions"),
CoreValue::Bool(false),
);
if core_truthy(&v_needs_functions) {
v_ok_functions =
_provider_features_support(&[v_features.clone(), CoreValue::from("functions")])?;
if core_truthy(&v_ok_functions) {
v_score = core_add(&[v_score.clone(), CoreValue::Num(15f64)])?;
core_append(&v_supported, CoreValue::from("Functions"))?;
} else {
core_append(&v_missing, CoreValue::from("Function calling"))?;
}
}
v_needs_streaming = core_get(
&v_requirements,
&CoreValue::from("requiresStreaming"),
CoreValue::Bool(false),
);
if core_truthy(&v_needs_streaming) {
v_ok_streaming =
_provider_features_support(&[v_features.clone(), CoreValue::from("streaming")])?;
if core_truthy(&v_ok_streaming) {
v_score = core_add(&[v_score.clone(), CoreValue::Num(10f64)])?;
core_append(&v_supported, CoreValue::from("Streaming"))?;
} else {
core_append(&v_missing, CoreValue::from("Streaming responses"))?;
}
}
v_needs_caching = core_get(
&v_requirements,
&CoreValue::from("requiresCaching"),
CoreValue::Bool(false),
);
if core_truthy(&v_needs_caching) {
v_ok_caching =
_provider_features_support(&[v_features.clone(), CoreValue::from("caching")])?;
if core_truthy(&v_ok_caching) {
v_score = core_add(&[v_score.clone(), CoreValue::Num(8f64)])?;
core_append(&v_supported, CoreValue::from("Caching"))?;
} else {
core_append(&v_missing, CoreValue::from("Content caching"))?;
}
}
v_thinking = core_get(
&v_features,
&CoreValue::from("thinking"),
CoreValue::Bool(false),
);
if core_truthy(&v_thinking) {
v_score = core_add(&[v_score.clone(), CoreValue::Num(2f64)])?;
}
v_multi_turn = core_get(&v_features, &CoreValue::from("multiTurn"), CoreValue::Null);
v_multi_turn_missing = core_is_none(&[v_multi_turn.clone()])?;
if core_truthy(&v_multi_turn_missing) {
v_multi_turn = core_get(
&v_features,
&CoreValue::from("multi_turn"),
CoreValue::Bool(false),
);
}
if core_truthy(&v_multi_turn) {
v_score = core_add(&[v_score.clone(), CoreValue::Num(2f64)])?;
}
v_missing_count = core_len(&[v_missing.clone()])?;
v_penalty = core_mul(&[v_missing_count.clone(), CoreValue::Num(-10f64)])?;
v_score = core_add(&[v_score.clone(), v_penalty.clone()])?;
v_score = core_add(&[v_score.clone(), CoreValue::Num(0f64)])?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("provider"), v_provider.clone())?;
core_set(&v_out, CoreValue::from("score"), v_score.clone())?;
core_set(
&v_out,
CoreValue::from("missingCapabilities"),
v_missing.clone(),
)?;
core_set(
&v_out,
CoreValue::from("supportedCapabilities"),
v_supported.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_route_recommendation(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_route_recommendation");
let mut v_providers = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_allow_degradation = CoreValue::Null;
let mut v_best = CoreValue::Null;
let mut v_best_missing = CoreValue::Null;
let mut v_best_name_for_error = CoreValue::Null;
let mut v_best_score = CoreValue::Null;
let mut v_better = CoreValue::Null;
let mut v_degradation_disallowed = CoreValue::Null;
let mut v_degradations = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_error_exact = CoreValue::Null;
let mut v_error_no_degrade = CoreValue::Null;
let mut v_features = CoreValue::Null;
let mut v_has_missing = CoreValue::Null;
let mut v_has_providers = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_message_no_degrade = CoreValue::Null;
let mut v_missing_audio = CoreValue::Null;
let mut v_missing_caching = CoreValue::Null;
let mut v_missing_count = CoreValue::Null;
let mut v_missing_files = CoreValue::Null;
let mut v_missing_images = CoreValue::Null;
let mut v_missing_streaming = CoreValue::Null;
let mut v_missing_text = CoreValue::Null;
let mut v_missing_text_no_degrade = CoreValue::Null;
let mut v_missing_urls = CoreValue::Null;
let mut v_needs_audio = CoreValue::Null;
let mut v_needs_caching = CoreValue::Null;
let mut v_needs_files = CoreValue::Null;
let mut v_needs_images = CoreValue::Null;
let mut v_needs_streaming = CoreValue::Null;
let mut v_needs_urls = CoreValue::Null;
let mut v_no_providers = CoreValue::Null;
let mut v_ok_audio = CoreValue::Null;
let mut v_ok_caching = CoreValue::Null;
let mut v_ok_files = CoreValue::Null;
let mut v_ok_images = CoreValue::Null;
let mut v_ok_streaming = CoreValue::Null;
let mut v_ok_urls = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_processing = CoreValue::Null;
let mut v_provider = CoreValue::Null;
let mut v_provider_count = CoreValue::Null;
let mut v_provider_name = CoreValue::Null;
let mut v_require_exact = CoreValue::Null;
let mut v_requirements = CoreValue::Null;
let mut v_score = CoreValue::Null;
let mut v_score_entry = CoreValue::Null;
let mut v_warnings = CoreValue::Null;
v_provider_count = core_len(&[v_providers.clone()])?;
v_has_providers = core_gt(&[v_provider_count.clone(), CoreValue::Num(0f64)])?;
v_no_providers = core_not(&[v_has_providers.clone()])?;
if core_truthy(&v_no_providers) {
v_error = core_runtime_error(&[CoreValue::from(
"Provider selection failed: No providers available",
)])?;
return Err(core_as_error(&v_error));
}
v_requirements = provider_route_request_requirements(&[v_request.clone()])?;
v_best = core_list_get(&[v_providers.clone(), CoreValue::Num(0f64), CoreValue::Null])?;
v_best_score = CoreValue::Num(-999999f64);
v_best_missing = CoreValue::new_list();
for v_provider in core_iter(&v_providers)? {
let mut v_provider = v_provider;
v_score_entry = _provider_route_score(&[v_provider.clone(), v_requirements.clone()])?;
v_score = core_get(
&v_score_entry,
&CoreValue::from("score"),
CoreValue::Num(0f64),
);
v_better = core_gt(&[v_score.clone(), v_best_score.clone()])?;
if core_truthy(&v_better) {
v_best_score = v_score.clone();
v_best = v_provider.clone();
v_best_missing = core_get(
&v_score_entry,
&CoreValue::from("missingCapabilities"),
v_best_missing.clone(),
);
}
}
v_require_exact = core_get(
&v_options,
&CoreValue::from("requireExactMatch"),
CoreValue::Bool(false),
);
v_allow_degradation = core_get(
&v_options,
&CoreValue::from("allowDegradation"),
CoreValue::Bool(true),
);
v_missing_count = core_len(&[v_best_missing.clone()])?;
v_has_missing = core_gt(&[v_missing_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_require_exact) {
if core_truthy(&v_has_missing) {
v_missing_text =
core_string_join_intrinsic(&[CoreValue::from(", "), v_best_missing.clone()])?;
v_message = core_string_format(&[CoreValue::from("Provider selection failed: No providers fully support the request requirements: {}"), v_missing_text.clone()])?;
v_error_exact = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error_exact));
}
}
v_degradation_disallowed = core_not(&[v_allow_degradation.clone()])?;
if core_truthy(&v_degradation_disallowed) {
if core_truthy(&v_has_missing) {
v_best_name_for_error = core_get(
&v_best,
&CoreValue::from("name"),
CoreValue::from("provider"),
);
v_missing_text_no_degrade =
core_string_join_intrinsic(&[CoreValue::from(", "), v_best_missing.clone()])?;
v_message_no_degrade = core_string_format(&[
CoreValue::from(
"Provider selection failed: Best available provider ({}) is missing: {}",
),
v_best_name_for_error.clone(),
v_missing_text_no_degrade.clone(),
])?;
v_error_no_degrade = core_runtime_error(&[v_message_no_degrade.clone()])?;
return Err(core_as_error(&v_error_no_degrade));
}
}
v_features = core_get(&v_best, &CoreValue::from("features"), CoreValue::Null);
v_processing = CoreValue::new_list();
v_degradations = CoreValue::new_list();
v_warnings = CoreValue::new_list();
v_needs_images = core_get(
&v_requirements,
&CoreValue::from("hasImages"),
CoreValue::Bool(false),
);
if core_truthy(&v_needs_images) {
v_ok_images = _provider_features_support(&[v_features.clone(), CoreValue::from("images")])?;
v_missing_images = core_not(&[v_ok_images.clone()])?;
if core_truthy(&v_missing_images) {
core_append(
&v_degradations,
CoreValue::from("Images will be converted to text descriptions"),
)?;
core_append(&v_processing, CoreValue::from("Image-to-text conversion"))?;
}
}
v_needs_audio = core_get(
&v_requirements,
&CoreValue::from("hasAudio"),
CoreValue::Bool(false),
);
if core_truthy(&v_needs_audio) {
v_ok_audio = _provider_features_support(&[v_features.clone(), CoreValue::from("audio")])?;
v_missing_audio = core_not(&[v_ok_audio.clone()])?;
if core_truthy(&v_missing_audio) {
core_append(
&v_degradations,
CoreValue::from("Audio will be transcribed to text"),
)?;
core_append(
&v_processing,
CoreValue::from("Audio-to-text transcription"),
)?;
}
}
v_needs_files = core_get(
&v_requirements,
&CoreValue::from("hasFiles"),
CoreValue::Bool(false),
);
if core_truthy(&v_needs_files) {
v_ok_files = _provider_features_support(&[v_features.clone(), CoreValue::from("files")])?;
v_missing_files = core_not(&[v_ok_files.clone()])?;
if core_truthy(&v_missing_files) {
core_append(
&v_degradations,
CoreValue::from("File content will be extracted to text"),
)?;
core_append(&v_processing, CoreValue::from("File-to-text extraction"))?;
}
}
v_needs_urls = core_get(
&v_requirements,
&CoreValue::from("hasUrls"),
CoreValue::Bool(false),
);
if core_truthy(&v_needs_urls) {
v_ok_urls = _provider_features_support(&[v_features.clone(), CoreValue::from("urls")])?;
v_missing_urls = core_not(&[v_ok_urls.clone()])?;
if core_truthy(&v_missing_urls) {
core_append(
&v_degradations,
CoreValue::from("URL content will be pre-fetched"),
)?;
core_append(&v_processing, CoreValue::from("URL content fetching"))?;
}
}
v_needs_streaming = core_get(
&v_requirements,
&CoreValue::from("requiresStreaming"),
CoreValue::Bool(false),
);
if core_truthy(&v_needs_streaming) {
v_ok_streaming =
_provider_features_support(&[v_features.clone(), CoreValue::from("streaming")])?;
v_missing_streaming = core_not(&[v_ok_streaming.clone()])?;
if core_truthy(&v_missing_streaming) {
core_append(
&v_warnings,
CoreValue::from("Streaming not supported - will use non-streaming mode"),
)?;
}
}
v_needs_caching = core_get(
&v_requirements,
&CoreValue::from("requiresCaching"),
CoreValue::Bool(false),
);
if core_truthy(&v_needs_caching) {
v_ok_caching =
_provider_features_support(&[v_features.clone(), CoreValue::from("caching")])?;
v_missing_caching = core_not(&[v_ok_caching.clone()])?;
if core_truthy(&v_missing_caching) {
core_append(
&v_warnings,
CoreValue::from("Content caching not supported"),
)?;
}
}
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("provider"), v_best.clone())?;
v_provider_name = core_get(&v_best, &CoreValue::from("name"), CoreValue::from(""));
core_set(
&v_out,
CoreValue::from("providerName"),
v_provider_name.clone(),
)?;
core_set(
&v_out,
CoreValue::from("processingApplied"),
v_processing.clone(),
)?;
core_set(
&v_out,
CoreValue::from("degradations"),
v_degradations.clone(),
)?;
core_set(&v_out, CoreValue::from("warnings"), v_warnings.clone())?;
core_set(
&v_out,
CoreValue::from("requirements"),
v_requirements.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _provider_route_any_supports(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_provider_route_any_supports");
let mut v_providers = core_arg(args, 0);
let mut v_path = core_arg(args, 1);
let mut v_features = CoreValue::Null;
let mut v_ok = CoreValue::Null;
let mut v_provider = CoreValue::Null;
let mut v_supported = CoreValue::Null;
v_ok = CoreValue::Bool(false);
for v_provider in core_iter(&v_providers)? {
let mut v_provider = v_provider;
v_features = core_get(&v_provider, &CoreValue::from("features"), CoreValue::Null);
v_supported = _provider_features_support(&[v_features.clone(), v_path.clone()])?;
if core_truthy(&v_supported) {
v_ok = CoreValue::Bool(true);
}
}
return Ok(v_ok.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_route_validation(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_route_validation");
let mut v_providers = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_processing = core_arg(args, 2);
let mut v_options = core_arg(args, 3);
let mut v_audio_problem = CoreValue::Null;
let mut v_audio_processor = CoreValue::Null;
let mut v_can_handle = CoreValue::Null;
let mut v_degradation = CoreValue::Null;
let mut v_degradation_count = CoreValue::Null;
let mut v_degradations = CoreValue::Null;
let mut v_has_audio_processor = CoreValue::Null;
let mut v_has_audio_provider = CoreValue::Null;
let mut v_has_degradations = CoreValue::Null;
let mut v_has_image_processor = CoreValue::Null;
let mut v_has_image_provider = CoreValue::Null;
let mut v_image_problem = CoreValue::Null;
let mut v_image_processor = CoreValue::Null;
let mut v_issue_count = CoreValue::Null;
let mut v_issues = CoreValue::Null;
let mut v_needs_audio = CoreValue::Null;
let mut v_needs_images = CoreValue::Null;
let mut v_no_audio_processor = CoreValue::Null;
let mut v_no_audio_provider = CoreValue::Null;
let mut v_no_image_processor = CoreValue::Null;
let mut v_no_image_provider = CoreValue::Null;
let mut v_no_issues = CoreValue::Null;
let mut v_recommendation = CoreValue::Null;
let mut v_recommendations = CoreValue::Null;
let mut v_requirements = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_warning = CoreValue::Null;
let mut v_warnings = CoreValue::Null;
v_issues = CoreValue::new_list();
v_recommendations = CoreValue::new_list();
v_result = CoreValue::new_map();
v_recommendation = provider_route_recommendation(&[
v_providers.clone(),
v_request.clone(),
v_options.clone(),
])?;
v_degradations = core_get(
&v_recommendation,
&CoreValue::from("degradations"),
v_issues.clone(),
);
for v_degradation in core_iter(&v_degradations)? {
let mut v_degradation = v_degradation;
core_append(&v_issues, v_degradation.clone())?;
}
v_warnings = core_get(
&v_recommendation,
&CoreValue::from("warnings"),
v_issues.clone(),
);
for v_warning in core_iter(&v_warnings)? {
let mut v_warning = v_warning;
core_append(&v_issues, v_warning.clone())?;
}
v_degradation_count = core_len(&[v_degradations.clone()])?;
v_has_degradations = core_gt(&[v_degradation_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_degradations) {
core_append(
&v_recommendations,
CoreValue::from("Consider using a provider that natively supports all media types"),
)?;
}
v_requirements = core_get(
&v_recommendation,
&CoreValue::from("requirements"),
CoreValue::Null,
);
v_needs_images = core_get(
&v_requirements,
&CoreValue::from("hasImages"),
CoreValue::Bool(false),
);
if core_truthy(&v_needs_images) {
v_image_processor = core_get(
&v_processing,
&CoreValue::from("imageToText"),
CoreValue::Null,
);
v_has_image_processor = core_is_not_none(&[v_image_processor.clone()])?;
v_has_image_provider =
_provider_route_any_supports(&[v_providers.clone(), CoreValue::from("images")])?;
v_no_image_processor = core_not(&[v_has_image_processor.clone()])?;
v_no_image_provider = core_not(&[v_has_image_provider.clone()])?;
v_image_problem = core_and(&[v_no_image_processor.clone(), v_no_image_provider.clone()])?;
if core_truthy(&v_image_problem) {
core_append(
&v_issues,
CoreValue::from(
"No image processing service available and no providers support images",
),
)?;
core_append(
&v_recommendations,
CoreValue::from("Add imageToText processing service or use image-capable provider"),
)?;
}
}
v_needs_audio = core_get(
&v_requirements,
&CoreValue::from("hasAudio"),
CoreValue::Bool(false),
);
if core_truthy(&v_needs_audio) {
v_audio_processor = core_get(
&v_processing,
&CoreValue::from("audioToText"),
CoreValue::Null,
);
v_has_audio_processor = core_is_not_none(&[v_audio_processor.clone()])?;
v_has_audio_provider =
_provider_route_any_supports(&[v_providers.clone(), CoreValue::from("audio")])?;
v_no_audio_processor = core_not(&[v_has_audio_processor.clone()])?;
v_no_audio_provider = core_not(&[v_has_audio_provider.clone()])?;
v_audio_problem = core_and(&[v_no_audio_processor.clone(), v_no_audio_provider.clone()])?;
if core_truthy(&v_audio_problem) {
core_append(
&v_issues,
CoreValue::from(
"No audio processing service available and no providers support audio",
),
)?;
core_append(
&v_recommendations,
CoreValue::from("Add audioToText processing service or use audio-capable provider"),
)?;
}
}
v_issue_count = core_len(&[v_issues.clone()])?;
v_no_issues = core_eq(&[v_issue_count.clone(), CoreValue::Num(0f64)])?;
v_can_handle = core_or(&[v_no_issues.clone(), v_has_degradations.clone()])?;
core_set(
&v_result,
CoreValue::from("canHandle"),
v_can_handle.clone(),
)?;
core_set(&v_result, CoreValue::from("issues"), v_issues.clone())?;
core_set(
&v_result,
CoreValue::from("recommendations"),
v_recommendations.clone(),
)?;
return Ok(v_result.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_balancer_retry_policy(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_balancer_retry_policy");
let mut v_options = core_arg(args, 0);
let mut v_debug = CoreValue::Null;
let mut v_initial_backoff = CoreValue::Null;
let mut v_initial_backoff_missing = CoreValue::Null;
let mut v_max_backoff = CoreValue::Null;
let mut v_max_backoff_missing = CoreValue::Null;
let mut v_max_retries = CoreValue::Null;
let mut v_max_retries_missing = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_strategy = CoreValue::Null;
v_out = CoreValue::new_map();
v_strategy = core_get(
&v_options,
&CoreValue::from("strategy"),
CoreValue::from("metric"),
);
core_set(&v_out, CoreValue::from("strategy"), v_strategy.clone())?;
v_max_retries = core_get(&v_options, &CoreValue::from("maxRetries"), CoreValue::Null);
v_max_retries_missing = core_is_none(&[v_max_retries.clone()])?;
if core_truthy(&v_max_retries_missing) {
v_max_retries = core_get(
&v_options,
&CoreValue::from("max_retries"),
CoreValue::Num(3f64),
);
}
core_set(&v_out, CoreValue::from("maxRetries"), v_max_retries.clone())?;
v_initial_backoff = core_get(
&v_options,
&CoreValue::from("initialBackoffMs"),
CoreValue::Null,
);
v_initial_backoff_missing = core_is_none(&[v_initial_backoff.clone()])?;
if core_truthy(&v_initial_backoff_missing) {
v_initial_backoff = core_get(
&v_options,
&CoreValue::from("initial_backoff_ms"),
CoreValue::Num(1000f64),
);
}
core_set(
&v_out,
CoreValue::from("initialBackoffMs"),
v_initial_backoff.clone(),
)?;
v_max_backoff = core_get(
&v_options,
&CoreValue::from("maxBackoffMs"),
CoreValue::Null,
);
v_max_backoff_missing = core_is_none(&[v_max_backoff.clone()])?;
if core_truthy(&v_max_backoff_missing) {
v_max_backoff = core_get(
&v_options,
&CoreValue::from("max_backoff_ms"),
CoreValue::Num(32000f64),
);
}
core_set(
&v_out,
CoreValue::from("maxBackoffMs"),
v_max_backoff.clone(),
)?;
v_debug = core_get(&v_options, &CoreValue::from("debug"), CoreValue::Bool(true));
core_set(&v_out, CoreValue::from("debug"), v_debug.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_balancer_metric_score(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_balancer_metric_score");
let mut v_metrics = core_arg(args, 0);
let mut v_chat = CoreValue::Null;
let mut v_latency = CoreValue::Null;
let mut v_mean = CoreValue::Null;
v_latency = core_get(&v_metrics, &CoreValue::from("latency"), CoreValue::Null);
v_chat = core_get(&v_latency, &CoreValue::from("chat"), CoreValue::Null);
v_mean = core_get(&v_chat, &CoreValue::from("mean"), CoreValue::Num(0f64));
return Ok(v_mean.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_balancer_candidate_allowed(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_balancer_candidate_allowed");
let mut v_features = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_audio = CoreValue::Null;
let mut v_audio_bad = CoreValue::Null;
let mut v_audio_ok = CoreValue::Null;
let mut v_capabilities = CoreValue::Null;
let mut v_format = CoreValue::Null;
let mut v_format_missing = CoreValue::Null;
let mut v_format_type = CoreValue::Null;
let mut v_images = CoreValue::Null;
let mut v_images_bad = CoreValue::Null;
let mut v_images_ok = CoreValue::Null;
let mut v_media = CoreValue::Null;
let mut v_no_structured = CoreValue::Null;
let mut v_requires_audio = CoreValue::Null;
let mut v_requires_audio_missing = CoreValue::Null;
let mut v_requires_images = CoreValue::Null;
let mut v_requires_images_missing = CoreValue::Null;
let mut v_requires_structured = CoreValue::Null;
let mut v_structured = CoreValue::Null;
let mut v_structured_missing = CoreValue::Null;
v_format = core_get(
&v_request,
&CoreValue::from("responseFormat"),
CoreValue::Null,
);
v_format_missing = core_is_none(&[v_format.clone()])?;
if core_truthy(&v_format_missing) {
v_format = core_get(
&v_request,
&CoreValue::from("response_format"),
CoreValue::Null,
);
}
v_format_type = core_get(&v_format, &CoreValue::from("type"), CoreValue::from(""));
v_requires_structured = core_eq(&[v_format_type.clone(), CoreValue::from("json_schema")])?;
if core_truthy(&v_requires_structured) {
v_structured = core_get(
&v_features,
&CoreValue::from("structuredOutputs"),
CoreValue::Null,
);
v_structured_missing = core_is_none(&[v_structured.clone()])?;
if core_truthy(&v_structured_missing) {
v_structured = core_get(
&v_features,
&CoreValue::from("structured_outputs"),
CoreValue::Bool(false),
);
}
v_no_structured = core_not(&[v_structured.clone()])?;
if core_truthy(&v_no_structured) {
return Ok(CoreValue::Bool(false));
}
}
v_capabilities = core_get(
&v_request,
&CoreValue::from("capabilities"),
CoreValue::Null,
);
v_media = core_get(&v_features, &CoreValue::from("media"), CoreValue::Null);
v_requires_images = core_get(
&v_capabilities,
&CoreValue::from("requiresImages"),
CoreValue::Null,
);
v_requires_images_missing = core_is_none(&[v_requires_images.clone()])?;
if core_truthy(&v_requires_images_missing) {
v_requires_images = core_get(
&v_capabilities,
&CoreValue::from("requires_images"),
CoreValue::Bool(false),
);
}
if core_truthy(&v_requires_images) {
v_images = core_get(&v_media, &CoreValue::from("images"), CoreValue::Null);
v_images_ok = core_get(
&v_images,
&CoreValue::from("supported"),
CoreValue::Bool(false),
);
v_images_bad = core_not(&[v_images_ok.clone()])?;
if core_truthy(&v_images_bad) {
return Ok(CoreValue::Bool(false));
}
}
v_requires_audio = core_get(
&v_capabilities,
&CoreValue::from("requiresAudio"),
CoreValue::Null,
);
v_requires_audio_missing = core_is_none(&[v_requires_audio.clone()])?;
if core_truthy(&v_requires_audio_missing) {
v_requires_audio = core_get(
&v_capabilities,
&CoreValue::from("requires_audio"),
CoreValue::Bool(false),
);
}
if core_truthy(&v_requires_audio) {
v_audio = core_get(&v_media, &CoreValue::from("audio"), CoreValue::Null);
v_audio_ok = core_get(
&v_audio,
&CoreValue::from("supported"),
CoreValue::Bool(false),
);
v_audio_bad = core_not(&[v_audio_ok.clone()])?;
if core_truthy(&v_audio_bad) {
return Ok(CoreValue::Bool(false));
}
}
return Ok(CoreValue::Bool(true));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_routing_stats(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_routing_stats");
let mut v_providers = core_arg(args, 0);
let mut v_audio = CoreValue::Null;
let mut v_audio_count = CoreValue::Null;
let mut v_caching = CoreValue::Null;
let mut v_caching_count = CoreValue::Null;
let mut v_features = CoreValue::Null;
let mut v_files = CoreValue::Null;
let mut v_files_count = CoreValue::Null;
let mut v_first = CoreValue::Null;
let mut v_functions = CoreValue::Null;
let mut v_functions_count = CoreValue::Null;
let mut v_has_audio = CoreValue::Null;
let mut v_has_caching = CoreValue::Null;
let mut v_has_files = CoreValue::Null;
let mut v_has_functions = CoreValue::Null;
let mut v_has_images = CoreValue::Null;
let mut v_has_streaming = CoreValue::Null;
let mut v_has_urls = CoreValue::Null;
let mut v_images = CoreValue::Null;
let mut v_images_count = CoreValue::Null;
let mut v_matrix = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_ok_audio = CoreValue::Null;
let mut v_ok_caching = CoreValue::Null;
let mut v_ok_files = CoreValue::Null;
let mut v_ok_functions = CoreValue::Null;
let mut v_ok_images = CoreValue::Null;
let mut v_ok_streaming = CoreValue::Null;
let mut v_ok_urls = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_provider = CoreValue::Null;
let mut v_recommended = CoreValue::Null;
let mut v_streaming = CoreValue::Null;
let mut v_streaming_count = CoreValue::Null;
let mut v_total = CoreValue::Null;
let mut v_urls = CoreValue::Null;
let mut v_urls_count = CoreValue::Null;
v_matrix = CoreValue::new_map();
v_functions = CoreValue::new_list();
v_streaming = CoreValue::new_list();
v_images = CoreValue::new_list();
v_audio = CoreValue::new_list();
v_files = CoreValue::new_list();
v_urls = CoreValue::new_list();
v_caching = CoreValue::new_list();
for v_provider in core_iter(&v_providers)? {
let mut v_provider = v_provider;
v_name = core_get(&v_provider, &CoreValue::from("name"), CoreValue::from(""));
v_features = core_get(&v_provider, &CoreValue::from("features"), CoreValue::Null);
v_ok_functions =
_provider_features_support(&[v_features.clone(), CoreValue::from("functions")])?;
if core_truthy(&v_ok_functions) {
core_append(&v_functions, v_name.clone())?;
}
v_ok_streaming =
_provider_features_support(&[v_features.clone(), CoreValue::from("streaming")])?;
if core_truthy(&v_ok_streaming) {
core_append(&v_streaming, v_name.clone())?;
}
v_ok_images = _provider_features_support(&[v_features.clone(), CoreValue::from("images")])?;
if core_truthy(&v_ok_images) {
core_append(&v_images, v_name.clone())?;
}
v_ok_audio = _provider_features_support(&[v_features.clone(), CoreValue::from("audio")])?;
if core_truthy(&v_ok_audio) {
core_append(&v_audio, v_name.clone())?;
}
v_ok_files = _provider_features_support(&[v_features.clone(), CoreValue::from("files")])?;
if core_truthy(&v_ok_files) {
core_append(&v_files, v_name.clone())?;
}
v_ok_urls = _provider_features_support(&[v_features.clone(), CoreValue::from("urls")])?;
if core_truthy(&v_ok_urls) {
core_append(&v_urls, v_name.clone())?;
}
v_ok_caching =
_provider_features_support(&[v_features.clone(), CoreValue::from("caching")])?;
if core_truthy(&v_ok_caching) {
core_append(&v_caching, v_name.clone())?;
}
}
v_functions_count = core_len(&[v_functions.clone()])?;
v_has_functions = core_gt(&[v_functions_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_functions) {
core_set(&v_matrix, CoreValue::from("Functions"), v_functions.clone())?;
}
v_streaming_count = core_len(&[v_streaming.clone()])?;
v_has_streaming = core_gt(&[v_streaming_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_streaming) {
core_set(&v_matrix, CoreValue::from("Streaming"), v_streaming.clone())?;
}
v_images_count = core_len(&[v_images.clone()])?;
v_has_images = core_gt(&[v_images_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_images) {
core_set(&v_matrix, CoreValue::from("Images"), v_images.clone())?;
}
v_audio_count = core_len(&[v_audio.clone()])?;
v_has_audio = core_gt(&[v_audio_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_audio) {
core_set(&v_matrix, CoreValue::from("Audio"), v_audio.clone())?;
}
v_files_count = core_len(&[v_files.clone()])?;
v_has_files = core_gt(&[v_files_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_files) {
core_set(&v_matrix, CoreValue::from("Files"), v_files.clone())?;
}
v_urls_count = core_len(&[v_urls.clone()])?;
v_has_urls = core_gt(&[v_urls_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_urls) {
core_set(&v_matrix, CoreValue::from("URLs"), v_urls.clone())?;
}
v_caching_count = core_len(&[v_caching.clone()])?;
v_has_caching = core_gt(&[v_caching_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_caching) {
core_set(&v_matrix, CoreValue::from("Caching"), v_caching.clone())?;
}
v_first = core_list_get(&[v_providers.clone(), CoreValue::Num(0f64), CoreValue::Null])?;
v_recommended = core_get(&v_first, &CoreValue::from("name"), CoreValue::from("None"));
v_out = CoreValue::new_map();
v_total = core_len(&[v_providers.clone()])?;
core_set(&v_out, CoreValue::from("totalProviders"), v_total.clone())?;
core_set(
&v_out,
CoreValue::from("capabilityMatrix"),
v_matrix.clone(),
)?;
core_set(
&v_out,
CoreValue::from("recommendedProvider"),
v_recommended.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_descriptor(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_descriptor");
let mut v_profile = core_arg(args, 0);
let mut v_anthropic_caching = CoreValue::Null;
let mut v_anthropic_chat = CoreValue::Null;
let mut v_anthropic_images = CoreValue::Null;
let mut v_anthropic_stream = CoreValue::Null;
let mut v_audio = CoreValue::Null;
let mut v_audio_formats = CoreValue::Null;
let mut v_audio_output = CoreValue::Null;
let mut v_caching = CoreValue::Null;
let mut v_compatible_chat = CoreValue::Null;
let mut v_compatible_embed = CoreValue::Null;
let mut v_compatible_speak = CoreValue::Null;
let mut v_compatible_stream = CoreValue::Null;
let mut v_compatible_transcribe = CoreValue::Null;
let mut v_descriptor = CoreValue::Null;
let mut v_empty_anthropic_audio_formats = CoreValue::Null;
let mut v_empty_audio_formats = CoreValue::Null;
let mut v_existing_caching = CoreValue::Null;
let mut v_existing_files = CoreValue::Null;
let mut v_existing_urls = CoreValue::Null;
let mut v_extra_headers = CoreValue::Null;
let mut v_family_features = CoreValue::Null;
let mut v_family_media = CoreValue::Null;
let mut v_family_operations = CoreValue::Null;
let mut v_family_speak = CoreValue::Null;
let mut v_family_transcribe = CoreValue::Null;
let mut v_features = CoreValue::Null;
let mut v_files_media = CoreValue::Null;
let mut v_gemini_audio_formats = CoreValue::Null;
let mut v_gemini_audio_output_formats = CoreValue::Null;
let mut v_gemini_audio_voices = CoreValue::Null;
let mut v_gemini_caching = CoreValue::Null;
let mut v_gemini_chat = CoreValue::Null;
let mut v_gemini_embed = CoreValue::Null;
let mut v_gemini_files = CoreValue::Null;
let mut v_gemini_images = CoreValue::Null;
let mut v_gemini_realtime_audio = CoreValue::Null;
let mut v_gemini_speak = CoreValue::Null;
let mut v_gemini_stream = CoreValue::Null;
let mut v_gemini_transcribe = CoreValue::Null;
let mut v_gemini_urls = CoreValue::Null;
let mut v_grok_audio = CoreValue::Null;
let mut v_grok_realtime_audio = CoreValue::Null;
let mut v_grok_speak = CoreValue::Null;
let mut v_grok_transcribe = CoreValue::Null;
let mut v_has_caching = CoreValue::Null;
let mut v_has_files = CoreValue::Null;
let mut v_has_urls = CoreValue::Null;
let mut v_image_media = CoreValue::Null;
let mut v_is_anthropic = CoreValue::Null;
let mut v_is_gemini = CoreValue::Null;
let mut v_is_grok_family = CoreValue::Null;
let mut v_is_openai_family = CoreValue::Null;
let mut v_is_responses = CoreValue::Null;
let mut v_media = CoreValue::Null;
let mut v_openai_family = CoreValue::Null;
let mut v_openai_family_descriptor = CoreValue::Null;
let mut v_operations = CoreValue::Null;
let mut v_provider_id = CoreValue::Null;
let mut v_responses_chat = CoreValue::Null;
let mut v_responses_embed = CoreValue::Null;
let mut v_responses_realtime = CoreValue::Null;
let mut v_responses_realtime_audio = CoreValue::Null;
let mut v_responses_speak = CoreValue::Null;
let mut v_responses_stream = CoreValue::Null;
let mut v_responses_transcribe = CoreValue::Null;
let mut v_urls_media = CoreValue::Null;
v_provider_id = provider_normalize_profile(&[v_profile.clone()])?;
v_openai_family = core_json_parse(&[CoreValue::from("{\"openai-compatible\":{\"provider\":\"openai-compatible\",\"id\":\"openai-compatible\",\"name\":\"openai\",\"baseUrl\":\"https://api.openai.com/v1\",\"auth\":\"bearer\",\"defaultModel\":\"gpt-4.1-mini\",\"defaultEmbedModel\":\"text-embedding-3-small\",\"operations\":{\"chat\":{\"method\":\"POST\",\"path\":\"/chat/completions\",\"body\":\"json\",\"stream\":false},\"stream_chat\":{\"method\":\"POST\",\"path\":\"/chat/completions\",\"body\":\"json\",\"stream\":true},\"embed\":{\"method\":\"POST\",\"path\":\"/embeddings\",\"body\":\"json\",\"stream\":false}},\"features\":{\"functions\":true,\"streaming\":true,\"structured_outputs\":true,\"multi_turn\":true,\"thinking\":false,\"media\":{\"images\":{\"supported\":true,\"formats\":[\"image/jpeg\",\"image/png\",\"image/webp\"]},\"audio\":{\"supported\":false,\"formats\":[],\"output\":{\"supported\":false,\"formats\":[]}},\"files\":{\"supported\":false,\"formats\":[],\"upload_method\":\"none\"},\"urls\":{\"supported\":false,\"web_search\":false,\"context_fetching\":false}},\"caching\":{\"supported\":false,\"types\":[]}}},\"azure-openai\":{\"provider\":\"azure-openai\",\"id\":\"azure-openai\",\"name\":\"Azure OpenAI\",\"baseUrl\":\"https://{resource}.openai.azure.com/openai/deployments/{deployment}\",\"auth\":\"api_key_header\",\"apiKeyHeader\":\"api-key\",\"apiVersion\":\"2024-02-15-preview\",\"defaultModel\":\"gpt-5-mini\",\"defaultEmbedModel\":\"text-embedding-3-small\",\"operations\":{\"chat\":{\"method\":\"POST\",\"path\":\"/chat/completions\",\"body\":\"json\",\"stream\":false},\"stream_chat\":{\"method\":\"POST\",\"path\":\"/chat/completions\",\"body\":\"json\",\"stream\":true},\"embed\":{\"method\":\"POST\",\"path\":\"/embeddings\",\"body\":\"json\",\"stream\":false}},\"features\":{\"functions\":true,\"streaming\":true,\"structured_outputs\":true,\"multi_turn\":true,\"thinking\":true,\"media\":{\"images\":{\"supported\":true,\"formats\":[\"image/jpeg\",\"image/png\",\"image/gif\",\"image/webp\"],\"maxSize\":20971520},\"audio\":{\"supported\":false,\"formats\":[],\"output\":{\"supported\":false,\"formats\":[]}},\"files\":{\"supported\":false,\"formats\":[],\"upload_method\":\"none\"},\"urls\":{\"supported\":false,\"web_search\":false,\"context_fetching\":false}},\"caching\":{\"supported\":false,\"types\":[]}}},\"deepseek\":{\"provider\":\"deepseek\",\"id\":\"deepseek\",\"name\":\"DeepSeek\",\"baseUrl\":\"https://api.deepseek.com\",\"auth\":\"bearer\",\"defaultModel\":\"deepseek-v4-flash\",\"operations\":{\"chat\":{\"method\":\"POST\",\"path\":\"/chat/completions\",\"body\":\"json\",\"stream\":false},\"stream_chat\":{\"method\":\"POST\",\"path\":\"/chat/completions\",\"body\":\"json\",\"stream\":true}},\"features\":{\"functions\":true,\"streaming\":true,\"structured_outputs\":true,\"multi_turn\":true,\"thinking\":true,\"media\":{\"images\":{\"supported\":false,\"formats\":[]},\"audio\":{\"supported\":false,\"formats\":[],\"output\":{\"supported\":false,\"formats\":[]}},\"files\":{\"supported\":false,\"formats\":[],\"upload_method\":\"none\"},\"urls\":{\"supported\":false,\"web_search\":false,\"context_fetching\":false}},\"caching\":{\"supported\":false,\"types\":[]}}},\"mistral\":{\"provider\":\"mistral\",\"id\":\"mistral\",\"name\":\"Mistral\",\"baseUrl\":\"https://api.mistral.ai/v1\",\"auth\":\"bearer\",\"defaultModel\":\"mistral-small-latest\",\"defaultEmbedModel\":\"mistral-embed\",\"operations\":{\"chat\":{\"method\":\"POST\",\"path\":\"/chat/completions\",\"body\":\"json\",\"stream\":false},\"stream_chat\":{\"method\":\"POST\",\"path\":\"/chat/completions\",\"body\":\"json\",\"stream\":true},\"embed\":{\"method\":\"POST\",\"path\":\"/embeddings\",\"body\":\"json\",\"stream\":false}},\"features\":{\"functions\":true,\"streaming\":true,\"structured_outputs\":true,\"multi_turn\":true,\"thinking\":false,\"media\":{\"images\":{\"supported\":false,\"formats\":[]},\"audio\":{\"supported\":false,\"formats\":[],\"output\":{\"supported\":false,\"formats\":[]}},\"files\":{\"supported\":false,\"formats\":[],\"upload_method\":\"none\"},\"urls\":{\"supported\":false,\"web_search\":false,\"context_fetching\":false}},\"caching\":{\"supported\":false,\"types\":[]}}},\"reka\":{\"provider\":\"reka\",\"id\":\"reka\",\"name\":\"Reka\",\"baseUrl\":\"https://api.reka.ai/v1\",\"auth\":\"bearer\",\"defaultModel\":\"reka-core\",\"operations\":{\"chat\":{\"method\":\"POST\",\"path\":\"/chat/completions\",\"body\":\"json\",\"stream\":false},\"stream_chat\":{\"method\":\"POST\",\"path\":\"/chat/completions\",\"body\":\"json\",\"stream\":true}},\"features\":{\"functions\":true,\"streaming\":true,\"structured_outputs\":true,\"multi_turn\":true,\"thinking\":false,\"media\":{\"images\":{\"supported\":false,\"formats\":[]},\"audio\":{\"supported\":false,\"formats\":[],\"output\":{\"supported\":false,\"formats\":[]}},\"files\":{\"supported\":false,\"formats\":[],\"upload_method\":\"none\"},\"urls\":{\"supported\":false,\"web_search\":false,\"context_fetching\":false}},\"caching\":{\"supported\":false,\"types\":[]}}},\"cohere\":{\"provider\":\"cohere\",\"id\":\"cohere\",\"name\":\"Cohere\",\"baseUrl\":\"https://api.cohere.ai/compatibility/v1\",\"auth\":\"bearer\",\"defaultModel\":\"command-r-plus\",\"defaultEmbedModel\":\"embed-english-v3.0\",\"operations\":{\"chat\":{\"method\":\"POST\",\"path\":\"/chat/completions\",\"body\":\"json\",\"stream\":false},\"stream_chat\":{\"method\":\"POST\",\"path\":\"/chat/completions\",\"body\":\"json\",\"stream\":true},\"embed\":{\"method\":\"POST\",\"path\":\"/embeddings\",\"body\":\"json\",\"stream\":false}},\"features\":{\"functions\":true,\"streaming\":true,\"structured_outputs\":true,\"multi_turn\":true,\"thinking\":false,\"media\":{\"images\":{\"supported\":false,\"formats\":[]},\"audio\":{\"supported\":false,\"formats\":[],\"output\":{\"supported\":false,\"formats\":[]}},\"files\":{\"supported\":false,\"formats\":[],\"upload_method\":\"none\"},\"urls\":{\"supported\":false,\"web_search\":false,\"context_fetching\":false}},\"caching\":{\"supported\":false,\"types\":[]}}},\"grok\":{\"provider\":\"grok\",\"id\":\"grok\",\"name\":\"Grok\",\"baseUrl\":\"https://api.x.ai/v1\",\"auth\":\"bearer\",\"defaultModel\":\"grok-4.3\",\"operations\":{\"chat\":{\"method\":\"POST\",\"path\":\"/chat/completions\",\"body\":\"json\",\"stream\":false},\"stream_chat\":{\"method\":\"POST\",\"path\":\"/chat/completions\",\"body\":\"json\",\"stream\":true}},\"features\":{\"functions\":true,\"streaming\":true,\"structured_outputs\":true,\"multi_turn\":true,\"thinking\":true,\"media\":{\"images\":{\"supported\":true,\"formats\":[\"image/jpeg\",\"image/png\"],\"maxSize\":20971520},\"audio\":{\"supported\":false,\"formats\":[],\"output\":{\"supported\":false,\"formats\":[]}},\"files\":{\"supported\":false,\"formats\":[],\"upload_method\":\"none\"},\"urls\":{\"supported\":false,\"web_search\":true,\"context_fetching\":false}},\"caching\":{\"supported\":false,\"types\":[]}}}}")])?;
v_openai_family_descriptor =
core_get(&v_openai_family, &v_provider_id.clone(), CoreValue::Null);
v_is_openai_family = core_is_not_none(&[v_openai_family_descriptor.clone()])?;
if core_truthy(&v_is_openai_family) {
v_family_operations = core_get(
&v_openai_family_descriptor,
&CoreValue::from("operations"),
CoreValue::Null,
);
v_family_transcribe = core_json_parse(&[CoreValue::from("{\"method\":\"POST\",\"path\":\"/audio/transcriptions\",\"body\":\"multipart\",\"stream\":false}")])?;
v_family_speak = core_json_parse(&[CoreValue::from("{\"method\":\"POST\",\"path\":\"/audio/speech\",\"body\":\"json\",\"stream\":false,\"response\":\"binary\"}")])?;
core_set(
&v_family_operations,
CoreValue::from("transcribe"),
v_family_transcribe.clone(),
)?;
core_set(
&v_family_operations,
CoreValue::from("speak"),
v_family_speak.clone(),
)?;
v_is_grok_family = core_eq(&[v_provider_id.clone(), CoreValue::from("grok")])?;
if core_truthy(&v_is_grok_family) {
v_grok_transcribe = core_json_parse(&[CoreValue::from(
"{\"method\":\"POST\",\"path\":\"/stt\",\"body\":\"multipart\",\"stream\":false}",
)])?;
v_grok_speak = core_json_parse(&[CoreValue::from(
"{\"method\":\"POST\",\"path\":\"/tts\",\"body\":\"json\",\"stream\":false}",
)])?;
core_set(
&v_family_operations,
CoreValue::from("transcribe"),
v_grok_transcribe.clone(),
)?;
core_set(
&v_family_operations,
CoreValue::from("speak"),
v_grok_speak.clone(),
)?;
v_grok_realtime_audio = core_json_parse(&[CoreValue::from("{\"method\":\"WS\",\"path\":\"/realtime\",\"body\":\"events\",\"stream\":true,\"grammar\":\"openai_realtime_compatible\",\"url\":\"wss://api.x.ai/v1/realtime\",\"defaultModel\":\"grok-voice-think-fast-1.0\",\"audio\":{\"input\":{\"formats\":[\"pcm16\",\"pcm\"],\"sampleRate\":24000},\"output\":{\"formats\":[\"pcm16\",\"pcm\"],\"sampleRate\":24000,\"voices\":[\"eve\",\"ara\",\"rex\",\"sal\",\"leo\"],\"defaultVoice\":\"eve\"}},\"validation\":{\"structuredOutputWithAudio\":false}}")])?;
core_set(
&v_family_operations,
CoreValue::from("realtime_audio"),
v_grok_realtime_audio.clone(),
)?;
core_set(
&v_openai_family_descriptor,
CoreValue::from("defaultRealtimeModel"),
CoreValue::from("grok-voice-think-fast-1.0"),
)?;
v_family_features = core_get(
&v_openai_family_descriptor,
&CoreValue::from("features"),
CoreValue::Null,
);
v_family_media = core_get(
&v_family_features,
&CoreValue::from("media"),
CoreValue::Null,
);
v_grok_audio = core_json_parse(&[CoreValue::from("{\"supported\":true,\"formats\":[\"pcm16\",\"pcm\"],\"output\":{\"supported\":true,\"formats\":[\"pcm16\",\"pcm\"],\"voices\":[\"eve\",\"ara\",\"rex\",\"sal\",\"leo\"]},\"realtime\":true}")])?;
core_set(
&v_family_media,
CoreValue::from("audio"),
v_grok_audio.clone(),
)?;
}
return Ok(v_openai_family_descriptor.clone());
}
v_is_responses = core_eq(&[v_provider_id.clone(), CoreValue::from("openai-responses")])?;
v_is_gemini = core_eq(&[v_provider_id.clone(), CoreValue::from("google-gemini")])?;
v_is_anthropic = core_eq(&[v_provider_id.clone(), CoreValue::from("anthropic")])?;
v_descriptor = CoreValue::new_map();
v_operations = CoreValue::new_map();
v_features = CoreValue::new_map();
v_media = CoreValue::new_map();
v_audio = CoreValue::new_map();
v_audio_output = CoreValue::new_map();
core_set(
&v_descriptor,
CoreValue::from("provider"),
v_provider_id.clone(),
)?;
core_set(
&v_features,
CoreValue::from("functions"),
CoreValue::Bool(true),
)?;
core_set(
&v_features,
CoreValue::from("streaming"),
CoreValue::Bool(true),
)?;
core_set(
&v_features,
CoreValue::from("structured_outputs"),
CoreValue::Bool(true),
)?;
core_set(
&v_features,
CoreValue::from("multi_turn"),
CoreValue::Bool(true),
)?;
core_set(
&v_features,
CoreValue::from("thinking"),
CoreValue::Bool(false),
)?;
v_image_media = core_json_parse(&[CoreValue::from(
"{\"supported\":true,\"formats\":[\"image/jpeg\",\"image/png\",\"image/webp\"]}",
)])?;
core_set(&v_media, CoreValue::from("images"), v_image_media.clone())?;
if core_truthy(&v_is_responses) {
core_set(
&v_descriptor,
CoreValue::from("baseUrl"),
CoreValue::from("https://api.openai.com/v1"),
)?;
core_set(
&v_descriptor,
CoreValue::from("auth"),
CoreValue::from("bearer"),
)?;
core_set(
&v_descriptor,
CoreValue::from("id"),
CoreValue::from("openai-responses"),
)?;
core_set(
&v_descriptor,
CoreValue::from("name"),
CoreValue::from("openai-responses"),
)?;
core_set(
&v_descriptor,
CoreValue::from("defaultModel"),
CoreValue::from("gpt-4o"),
)?;
core_set(
&v_descriptor,
CoreValue::from("defaultEmbedModel"),
CoreValue::from("text-embedding-ada-002"),
)?;
v_responses_chat = core_json_parse(&[CoreValue::from(
"{\"method\":\"POST\",\"path\":\"/responses\",\"body\":\"json\",\"stream\":false}",
)])?;
v_responses_stream = core_json_parse(&[CoreValue::from(
"{\"method\":\"POST\",\"path\":\"/responses\",\"body\":\"json\",\"stream\":true}",
)])?;
v_responses_embed = core_json_parse(&[CoreValue::from(
"{\"method\":\"POST\",\"path\":\"/embeddings\",\"body\":\"json\",\"stream\":false}",
)])?;
v_responses_transcribe = core_json_parse(&[CoreValue::from("{\"method\":\"POST\",\"path\":\"/audio/transcriptions\",\"body\":\"multipart\",\"stream\":false}")])?;
v_responses_speak = core_json_parse(&[CoreValue::from("{\"method\":\"POST\",\"path\":\"/audio/speech\",\"body\":\"json\",\"stream\":false,\"response\":\"binary\"}")])?;
v_responses_realtime = core_json_parse(&[CoreValue::from(
"{\"method\":\"WS\",\"path\":\"/realtime\",\"body\":\"events\",\"stream\":true}",
)])?;
v_responses_realtime_audio = core_json_parse(&[CoreValue::from("{\"method\":\"WS\",\"path\":\"/realtime\",\"url\":\"wss://api.openai.com/v1/realtime\",\"body\":\"events\",\"stream\":true,\"grammar\":\"openai_realtime_compatible\",\"audio\":{\"input\":{\"formats\":[\"pcm16\",\"pcm\"],\"sampleRate\":24000},\"output\":{\"formats\":[\"pcm16\",\"pcm\"],\"sampleRate\":24000,\"voices\":[\"alloy\",\"ash\",\"ballad\",\"coral\",\"echo\",\"sage\",\"shimmer\",\"verse\"],\"defaultVoice\":\"alloy\"}},\"validation\":{\"structuredOutputWithAudio\":false}}")])?;
core_set(
&v_operations,
CoreValue::from("chat"),
v_responses_chat.clone(),
)?;
core_set(
&v_operations,
CoreValue::from("stream_chat"),
v_responses_stream.clone(),
)?;
core_set(
&v_operations,
CoreValue::from("embed"),
v_responses_embed.clone(),
)?;
core_set(
&v_operations,
CoreValue::from("transcribe"),
v_responses_transcribe.clone(),
)?;
core_set(
&v_operations,
CoreValue::from("speak"),
v_responses_speak.clone(),
)?;
core_set(
&v_operations,
CoreValue::from("realtime"),
v_responses_realtime.clone(),
)?;
core_set(
&v_operations,
CoreValue::from("realtime_audio"),
v_responses_realtime_audio.clone(),
)?;
core_set(
&v_audio,
CoreValue::from("supported"),
CoreValue::Bool(true),
)?;
v_audio_formats = core_json_parse(&[CoreValue::from("[\"wav\",\"mp3\",\"pcm16\"]")])?;
core_set(
&v_audio,
CoreValue::from("formats"),
v_audio_formats.clone(),
)?;
core_set(
&v_audio_output,
CoreValue::from("supported"),
CoreValue::Bool(true),
)?;
core_set(
&v_audio_output,
CoreValue::from("formats"),
v_audio_formats.clone(),
)?;
} else {
if core_truthy(&v_is_gemini) {
core_set(
&v_descriptor,
CoreValue::from("baseUrl"),
CoreValue::from("https://generativelanguage.googleapis.com/v1beta"),
)?;
core_set(
&v_descriptor,
CoreValue::from("auth"),
CoreValue::from("api_key_query"),
)?;
core_set(
&v_descriptor,
CoreValue::from("apiKeyQuery"),
CoreValue::from("key"),
)?;
core_set(
&v_descriptor,
CoreValue::from("id"),
CoreValue::from("google-gemini"),
)?;
core_set(
&v_descriptor,
CoreValue::from("name"),
CoreValue::from("GoogleGeminiAI"),
)?;
core_set(
&v_descriptor,
CoreValue::from("defaultModel"),
CoreValue::from("gemini-2.5-flash"),
)?;
core_set(
&v_descriptor,
CoreValue::from("defaultEmbedModel"),
CoreValue::from("gemini-embedding-2"),
)?;
v_gemini_chat = core_json_parse(&[CoreValue::from("{\"method\":\"POST\",\"path\":\"/models/{model}:generateContent\",\"body\":\"json\",\"stream\":false}")])?;
v_gemini_stream = core_json_parse(&[CoreValue::from("{\"method\":\"POST\",\"path\":\"/models/{model}:streamGenerateContent?alt=sse\",\"body\":\"json\",\"stream\":true}")])?;
v_gemini_embed = core_json_parse(&[CoreValue::from("{\"method\":\"POST\",\"path\":\"/models/{model}:batchEmbedContents\",\"body\":\"json\",\"stream\":false}")])?;
v_gemini_transcribe = core_json_parse(&[CoreValue::from("{\"method\":\"POST\",\"path\":\"/models/{model}:generateContent\",\"body\":\"json\",\"stream\":false}")])?;
v_gemini_speak = core_json_parse(&[CoreValue::from("{\"method\":\"POST\",\"path\":\"/models/{model}:generateContent\",\"body\":\"json\",\"stream\":false}")])?;
v_gemini_realtime_audio = core_json_parse(&[CoreValue::from("{\"method\":\"WS\",\"path\":\"/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent\",\"url\":\"wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent\",\"body\":\"events\",\"stream\":true,\"grammar\":\"gemini_live_bidi\",\"defaultModel\":\"gemini-2.5-flash-native-audio-preview-12-2025\",\"audio\":{\"input\":{\"formats\":[\"pcm16\",\"pcm\"],\"sampleRate\":16000},\"output\":{\"formats\":[\"pcm16\",\"pcm\"],\"sampleRate\":24000,\"voices\":[\"Kore\",\"Puck\",\"Charon\",\"Fenrir\",\"Aoede\"],\"defaultVoice\":\"Kore\"}},\"validation\":{\"pcmInputOnly\":true,\"rejectStructuredOutputWithAudio\":true}}")])?;
core_set(
&v_operations,
CoreValue::from("chat"),
v_gemini_chat.clone(),
)?;
core_set(
&v_operations,
CoreValue::from("stream_chat"),
v_gemini_stream.clone(),
)?;
core_set(
&v_operations,
CoreValue::from("embed"),
v_gemini_embed.clone(),
)?;
core_set(
&v_operations,
CoreValue::from("transcribe"),
v_gemini_transcribe.clone(),
)?;
core_set(
&v_operations,
CoreValue::from("speak"),
v_gemini_speak.clone(),
)?;
core_set(
&v_operations,
CoreValue::from("realtime_audio"),
v_gemini_realtime_audio.clone(),
)?;
v_gemini_images = core_json_parse(&[CoreValue::from("{\"supported\":true,\"formats\":[\"image/jpeg\",\"image/png\",\"image/gif\",\"image/webp\"],\"maxSize\":20971520}")])?;
core_set(&v_media, CoreValue::from("images"), v_gemini_images.clone())?;
core_set(
&v_audio,
CoreValue::from("supported"),
CoreValue::Bool(true),
)?;
v_gemini_audio_formats =
core_json_parse(&[CoreValue::from("[\"wav\",\"mp3\",\"aac\",\"ogg\"]")])?;
core_set(
&v_audio,
CoreValue::from("formats"),
v_gemini_audio_formats.clone(),
)?;
core_set(
&v_audio_output,
CoreValue::from("supported"),
CoreValue::Bool(true),
)?;
v_gemini_audio_output_formats =
core_json_parse(&[CoreValue::from("[\"pcm16\",\"pcm\"]")])?;
core_set(
&v_audio_output,
CoreValue::from("formats"),
v_gemini_audio_output_formats.clone(),
)?;
v_gemini_audio_voices = core_json_parse(&[CoreValue::from(
"[\"Kore\",\"Puck\",\"Charon\",\"Fenrir\",\"Aoede\"]",
)])?;
core_set(
&v_audio_output,
CoreValue::from("voices"),
v_gemini_audio_voices.clone(),
)?;
v_gemini_files = core_json_parse(&[CoreValue::from("{\"supported\":true,\"formats\":[\"application/pdf\",\"text/plain\",\"text/csv\",\"text/html\",\"text/xml\"],\"upload_method\":\"cloud\"}")])?;
core_set(&v_media, CoreValue::from("files"), v_gemini_files.clone())?;
v_gemini_urls = core_json_parse(&[CoreValue::from(
"{\"supported\":true,\"web_search\":true,\"context_fetching\":true}",
)])?;
core_set(&v_media, CoreValue::from("urls"), v_gemini_urls.clone())?;
v_gemini_caching = core_json_parse(&[CoreValue::from(
"{\"supported\":true,\"types\":[\"persistent\"]}",
)])?;
core_set(
&v_features,
CoreValue::from("caching"),
v_gemini_caching.clone(),
)?;
core_set(
&v_features,
CoreValue::from("thinking"),
CoreValue::Bool(true),
)?;
} else {
if core_truthy(&v_is_anthropic) {
core_set(
&v_descriptor,
CoreValue::from("baseUrl"),
CoreValue::from("https://api.anthropic.com"),
)?;
core_set(
&v_descriptor,
CoreValue::from("auth"),
CoreValue::from("anthropic_key"),
)?;
core_set(
&v_descriptor,
CoreValue::from("id"),
CoreValue::from("anthropic"),
)?;
core_set(
&v_descriptor,
CoreValue::from("name"),
CoreValue::from("anthropic"),
)?;
core_set(
&v_descriptor,
CoreValue::from("defaultModel"),
CoreValue::from("claude-3-7-sonnet-latest"),
)?;
v_extra_headers = core_json_parse(&[CoreValue::from("{\"anthropic-version\":\"2023-06-01\",\"anthropic-beta\":\"structured-outputs-2025-11-13, web-search-2025-03-05\"}")])?;
core_set(
&v_descriptor,
CoreValue::from("headers"),
v_extra_headers.clone(),
)?;
v_anthropic_chat = core_json_parse(&[CoreValue::from("{\"method\":\"POST\",\"path\":\"/v1/messages\",\"body\":\"json\",\"stream\":false}")])?;
v_anthropic_stream = core_json_parse(&[CoreValue::from("{\"method\":\"POST\",\"path\":\"/v1/messages\",\"body\":\"json\",\"stream\":true}")])?;
core_set(
&v_operations,
CoreValue::from("chat"),
v_anthropic_chat.clone(),
)?;
core_set(
&v_operations,
CoreValue::from("stream_chat"),
v_anthropic_stream.clone(),
)?;
v_anthropic_images = core_json_parse(&[CoreValue::from("{\"supported\":true,\"formats\":[\"image/jpeg\",\"image/png\",\"image/gif\",\"image/webp\"]}")])?;
core_set(
&v_media,
CoreValue::from("images"),
v_anthropic_images.clone(),
)?;
core_set(
&v_audio,
CoreValue::from("supported"),
CoreValue::Bool(false),
)?;
v_empty_anthropic_audio_formats = CoreValue::new_list();
core_set(
&v_audio,
CoreValue::from("formats"),
v_empty_anthropic_audio_formats.clone(),
)?;
core_set(
&v_audio_output,
CoreValue::from("supported"),
CoreValue::Bool(false),
)?;
core_set(
&v_audio_output,
CoreValue::from("formats"),
v_empty_anthropic_audio_formats.clone(),
)?;
v_anthropic_caching = core_json_parse(&[CoreValue::from(
"{\"supported\":true,\"types\":[\"ephemeral_block\"]}",
)])?;
core_set(
&v_features,
CoreValue::from("caching"),
v_anthropic_caching.clone(),
)?;
core_set(
&v_features,
CoreValue::from("thinking"),
CoreValue::Bool(true),
)?;
} else {
core_set(
&v_descriptor,
CoreValue::from("baseUrl"),
CoreValue::from("https://api.openai.com/v1"),
)?;
core_set(
&v_descriptor,
CoreValue::from("auth"),
CoreValue::from("bearer"),
)?;
core_set(
&v_descriptor,
CoreValue::from("id"),
CoreValue::from("openai-compatible"),
)?;
core_set(
&v_descriptor,
CoreValue::from("name"),
CoreValue::from("openai"),
)?;
core_set(
&v_descriptor,
CoreValue::from("defaultModel"),
CoreValue::from("gpt-4.1-mini"),
)?;
core_set(
&v_descriptor,
CoreValue::from("defaultEmbedModel"),
CoreValue::from("text-embedding-3-small"),
)?;
v_compatible_chat = core_json_parse(&[CoreValue::from("{\"method\":\"POST\",\"path\":\"/chat/completions\",\"body\":\"json\",\"stream\":false}")])?;
v_compatible_stream = core_json_parse(&[CoreValue::from("{\"method\":\"POST\",\"path\":\"/chat/completions\",\"body\":\"json\",\"stream\":true}")])?;
v_compatible_embed = core_json_parse(&[CoreValue::from("{\"method\":\"POST\",\"path\":\"/embeddings\",\"body\":\"json\",\"stream\":false}")])?;
v_compatible_transcribe = core_json_parse(&[CoreValue::from("{\"method\":\"POST\",\"path\":\"/audio/transcriptions\",\"body\":\"multipart\",\"stream\":false}")])?;
v_compatible_speak = core_json_parse(&[CoreValue::from("{\"method\":\"POST\",\"path\":\"/audio/speech\",\"body\":\"json\",\"stream\":false,\"response\":\"binary\"}")])?;
core_set(
&v_operations,
CoreValue::from("chat"),
v_compatible_chat.clone(),
)?;
core_set(
&v_operations,
CoreValue::from("stream_chat"),
v_compatible_stream.clone(),
)?;
core_set(
&v_operations,
CoreValue::from("embed"),
v_compatible_embed.clone(),
)?;
core_set(
&v_operations,
CoreValue::from("transcribe"),
v_compatible_transcribe.clone(),
)?;
core_set(
&v_operations,
CoreValue::from("speak"),
v_compatible_speak.clone(),
)?;
core_set(
&v_audio,
CoreValue::from("supported"),
CoreValue::Bool(false),
)?;
v_empty_audio_formats = CoreValue::new_list();
core_set(
&v_audio,
CoreValue::from("formats"),
v_empty_audio_formats.clone(),
)?;
core_set(
&v_audio_output,
CoreValue::from("supported"),
CoreValue::Bool(false),
)?;
core_set(
&v_audio_output,
CoreValue::from("formats"),
v_empty_audio_formats.clone(),
)?;
}
}
}
core_set(&v_audio, CoreValue::from("output"), v_audio_output.clone())?;
core_set(&v_media, CoreValue::from("audio"), v_audio.clone())?;
v_existing_files = core_get(&v_media, &CoreValue::from("files"), CoreValue::Null);
v_has_files = core_is_not_none(&[v_existing_files.clone()])?;
if core_truthy(&v_has_files) {
} else {
v_files_media = core_json_parse(&[CoreValue::from(
"{\"supported\":false,\"formats\":[],\"upload_method\":\"none\"}",
)])?;
core_set(&v_media, CoreValue::from("files"), v_files_media.clone())?;
}
v_existing_urls = core_get(&v_media, &CoreValue::from("urls"), CoreValue::Null);
v_has_urls = core_is_not_none(&[v_existing_urls.clone()])?;
if core_truthy(&v_has_urls) {
} else {
v_urls_media = core_json_parse(&[CoreValue::from(
"{\"supported\":false,\"web_search\":false,\"context_fetching\":false}",
)])?;
core_set(&v_media, CoreValue::from("urls"), v_urls_media.clone())?;
}
core_set(&v_features, CoreValue::from("media"), v_media.clone())?;
v_existing_caching = core_get(&v_features, &CoreValue::from("caching"), CoreValue::Null);
v_has_caching = core_is_not_none(&[v_existing_caching.clone()])?;
if core_truthy(&v_has_caching) {
} else {
v_caching = core_json_parse(&[CoreValue::from("{\"supported\":false,\"types\":[]}")])?;
core_set(&v_features, CoreValue::from("caching"), v_caching.clone())?;
}
core_set(
&v_descriptor,
CoreValue::from("operations"),
v_operations.clone(),
)?;
core_set(
&v_descriptor,
CoreValue::from("features"),
v_features.clone(),
)?;
return Ok(v_descriptor.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_operation_descriptor(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_operation_descriptor");
let mut v_profile = core_arg(args, 0);
let mut v_operation = core_arg(args, 1);
let mut v_descriptor = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_missing = CoreValue::Null;
let mut v_operation_desc = CoreValue::Null;
let mut v_operations = CoreValue::Null;
v_descriptor = provider_descriptor(&[v_profile.clone()])?;
v_operations = core_get(
&v_descriptor,
&CoreValue::from("operations"),
CoreValue::Null,
);
v_operation_desc = core_get(&v_operations, &v_operation.clone(), CoreValue::Null);
v_missing = core_is_none(&[v_operation_desc.clone()])?;
if core_truthy(&v_missing) {
v_message = core_string_format(&[
CoreValue::from("provider operation is not supported: {}"),
v_operation.clone(),
])?;
v_error = core_ai_error_unsupported(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
return Ok(v_operation_desc.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _provider_realtime_audio_descriptor(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_provider_realtime_audio_descriptor");
let mut v_profile = core_arg(args, 0);
let mut v_descriptor = CoreValue::Null;
v_descriptor =
provider_operation_descriptor(&[v_profile.clone(), CoreValue::from("realtime_audio")])?;
return Ok(v_descriptor.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_realtime_ws_url(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_realtime_ws_url");
let mut v_profile = core_arg(args, 0);
let mut v_model = core_arg(args, 1);
let mut v_api_key = core_arg(args, 2);
let mut v_auth = CoreValue::Null;
let mut v_base = CoreValue::Null;
let mut v_descriptor = CoreValue::Null;
let mut v_gemini_url = CoreValue::Null;
let mut v_grammar = CoreValue::Null;
let mut v_headers = CoreValue::Null;
let mut v_is_gemini = CoreValue::Null;
let mut v_openai_url = CoreValue::Null;
let mut v_out = CoreValue::Null;
v_descriptor = _provider_realtime_audio_descriptor(&[v_profile.clone()])?;
v_grammar = core_get(
&v_descriptor,
&CoreValue::from("grammar"),
CoreValue::from("openai_realtime_compatible"),
);
v_base = core_get(&v_descriptor, &CoreValue::from("url"), CoreValue::from(""));
v_out = CoreValue::new_map();
v_headers = CoreValue::new_map();
v_is_gemini = core_eq(&[v_grammar.clone(), CoreValue::from("gemini_live_bidi")])?;
if core_truthy(&v_is_gemini) {
v_gemini_url = core_string_format(&[
CoreValue::from("{}?key={}"),
v_base.clone(),
v_api_key.clone(),
])?;
core_set(&v_out, CoreValue::from("url"), v_gemini_url.clone())?;
core_set(&v_out, CoreValue::from("headers"), v_headers.clone())?;
return Ok(v_out.clone());
}
v_openai_url = core_string_format(&[
CoreValue::from("{}?model={}"),
v_base.clone(),
v_model.clone(),
])?;
v_auth = core_string_format(&[CoreValue::from("Bearer {}"), v_api_key.clone()])?;
core_set(&v_headers, CoreValue::from("Authorization"), v_auth.clone())?;
core_set(&v_out, CoreValue::from("url"), v_openai_url.clone())?;
core_set(&v_out, CoreValue::from("headers"), v_headers.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_should_use_realtime(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_should_use_realtime");
let mut v_profile = core_arg(args, 0);
let mut v_model = core_arg(args, 1);
let mut v_request = core_arg(args, 2);
let mut v_audio = CoreValue::Null;
let mut v_audio_ok = CoreValue::Null;
let mut v_descriptor = CoreValue::Null;
let mut v_enabled = CoreValue::Null;
let mut v_explicitly_disabled = CoreValue::Null;
let mut v_has_realtime = CoreValue::Null;
let mut v_is_dash_live = CoreValue::Null;
let mut v_is_gemini_live = CoreValue::Null;
let mut v_is_gpt_realtime = CoreValue::Null;
let mut v_is_grok_voice = CoreValue::Null;
let mut v_is_native_audio = CoreValue::Null;
let mut v_is_realtime_model = CoreValue::Null;
let mut v_model_and_realtime = CoreValue::Null;
let mut v_operations = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_pattern_a = CoreValue::Null;
let mut v_pattern_ab = CoreValue::Null;
let mut v_pattern_b = CoreValue::Null;
let mut v_realtime_op = CoreValue::Null;
let mut v_result = CoreValue::Null;
v_descriptor = provider_descriptor(&[v_profile.clone()])?;
v_operations = core_get(
&v_descriptor,
&CoreValue::from("operations"),
CoreValue::Null,
);
v_realtime_op = core_get(
&v_operations,
&CoreValue::from("realtime_audio"),
CoreValue::Null,
);
v_has_realtime = core_is_not_none(&[v_realtime_op.clone()])?;
v_is_gpt_realtime =
core_string_starts_with(&[v_model.clone(), CoreValue::from("gpt-realtime")])?;
v_is_grok_voice = core_string_starts_with(&[v_model.clone(), CoreValue::from("grok-voice")])?;
v_is_native_audio = core_contains(&[v_model.clone(), CoreValue::from("native-audio")])?;
v_is_dash_live = core_contains(&[v_model.clone(), CoreValue::from("-live-")])?;
v_is_gemini_live = core_string_starts_with(&[v_model.clone(), CoreValue::from("gemini-live")])?;
v_pattern_a = core_or(&[v_is_gpt_realtime.clone(), v_is_grok_voice.clone()])?;
v_pattern_b = core_or(&[v_is_native_audio.clone(), v_is_dash_live.clone()])?;
v_pattern_ab = core_or(&[v_pattern_a.clone(), v_pattern_b.clone()])?;
v_is_realtime_model = core_or(&[v_pattern_ab.clone(), v_is_gemini_live.clone()])?;
v_audio = core_get(&v_request, &CoreValue::from("audio"), CoreValue::Null);
v_output = core_get(&v_audio, &CoreValue::from("output"), CoreValue::Null);
v_enabled = core_get(&v_output, &CoreValue::from("enabled"), CoreValue::Null);
v_explicitly_disabled = core_eq(&[v_enabled.clone(), CoreValue::Bool(false)])?;
v_audio_ok = core_not(&[v_explicitly_disabled.clone()])?;
v_model_and_realtime = core_and(&[v_has_realtime.clone(), v_is_realtime_model.clone()])?;
v_result = core_and(&[v_model_and_realtime.clone(), v_audio_ok.clone()])?;
return Ok(v_result.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_build_realtime_audio_setup(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_build_realtime_audio_setup");
let mut v_profile = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_descriptor = CoreValue::Null;
let mut v_grammar = CoreValue::Null;
let mut v_is_gemini_live = CoreValue::Null;
let mut v_openai_setup = CoreValue::Null;
let mut v_setup = CoreValue::Null;
v_descriptor = _provider_realtime_audio_descriptor(&[v_profile.clone()])?;
v_grammar = core_get(
&v_descriptor,
&CoreValue::from("grammar"),
CoreValue::from("openai_realtime_compatible"),
);
v_is_gemini_live = core_eq(&[v_grammar.clone(), CoreValue::from("gemini_live_bidi")])?;
if core_truthy(&v_is_gemini_live) {
v_setup = _gemini_live_bidi_build_setup(&[v_descriptor.clone(), v_request.clone()])?;
return Ok(v_setup.clone());
}
v_openai_setup =
_openai_realtime_compatible_build_setup(&[v_descriptor.clone(), v_request.clone()])?;
return Ok(v_openai_setup.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_build_realtime_audio_input(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_build_realtime_audio_input");
let mut v_profile = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_descriptor = CoreValue::Null;
let mut v_grammar = CoreValue::Null;
let mut v_input = CoreValue::Null;
let mut v_is_gemini_live = CoreValue::Null;
let mut v_openai_input = CoreValue::Null;
v_descriptor = _provider_realtime_audio_descriptor(&[v_profile.clone()])?;
v_grammar = core_get(
&v_descriptor,
&CoreValue::from("grammar"),
CoreValue::from("openai_realtime_compatible"),
);
v_is_gemini_live = core_eq(&[v_grammar.clone(), CoreValue::from("gemini_live_bidi")])?;
if core_truthy(&v_is_gemini_live) {
v_input = _gemini_live_bidi_build_input(&[v_descriptor.clone(), v_request.clone()])?;
return Ok(v_input.clone());
}
v_openai_input =
_openai_realtime_compatible_build_input(&[v_descriptor.clone(), v_request.clone()])?;
return Ok(v_openai_input.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_realtime_compatible_build_setup(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_realtime_compatible_build_setup");
let mut v_descriptor = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_audio = CoreValue::Null;
let mut v_audio_descriptor = CoreValue::Null;
let mut v_default_input_rate = CoreValue::Null;
let mut v_default_model = CoreValue::Null;
let mut v_default_output_rate = CoreValue::Null;
let mut v_default_voice = CoreValue::Null;
let mut v_has_input_sample_rate = CoreValue::Null;
let mut v_has_instructions = CoreValue::Null;
let mut v_has_output_sample_rate = CoreValue::Null;
let mut v_input = CoreValue::Null;
let mut v_input_audio_descriptor = CoreValue::Null;
let mut v_input_format = CoreValue::Null;
let mut v_input_rate = CoreValue::Null;
let mut v_input_rate_snake = CoreValue::Null;
let mut v_input_sample_rate = CoreValue::Null;
let mut v_instructions = CoreValue::Null;
let mut v_model = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_output_audio_descriptor = CoreValue::Null;
let mut v_output_format = CoreValue::Null;
let mut v_output_modalities = CoreValue::Null;
let mut v_output_rate = CoreValue::Null;
let mut v_output_rate_snake = CoreValue::Null;
let mut v_output_sample_rate = CoreValue::Null;
let mut v_request_audio = CoreValue::Null;
let mut v_request_input_audio = CoreValue::Null;
let mut v_request_output_audio = CoreValue::Null;
let mut v_request_voice = CoreValue::Null;
let mut v_session = CoreValue::Null;
let mut v_voice_id = CoreValue::Null;
v_audio_descriptor = core_get(&v_descriptor, &CoreValue::from("audio"), CoreValue::Null);
v_output_audio_descriptor = core_get(
&v_audio_descriptor,
&CoreValue::from("output"),
CoreValue::Null,
);
v_default_voice = core_get(
&v_output_audio_descriptor,
&CoreValue::from("defaultVoice"),
CoreValue::from("alloy"),
);
v_request_audio = core_get(&v_request, &CoreValue::from("audio"), CoreValue::Null);
v_request_output_audio = core_get(
&v_request_audio,
&CoreValue::from("output"),
CoreValue::Null,
);
v_request_voice = core_get(
&v_request_output_audio,
&CoreValue::from("voice"),
v_default_voice.clone(),
);
v_voice_id = core_get(
&v_request_voice,
&CoreValue::from("id"),
v_request_voice.clone(),
);
v_output_rate = core_get(
&v_request_output_audio,
&CoreValue::from("sampleRate"),
CoreValue::Null,
);
v_output_rate_snake = core_get(
&v_request_output_audio,
&CoreValue::from("sample_rate"),
v_output_rate.clone(),
);
v_default_output_rate = core_get(
&v_output_audio_descriptor,
&CoreValue::from("sampleRate"),
CoreValue::Num(24000f64),
);
v_output_sample_rate = core_get(
&v_request_output_audio,
&CoreValue::from("rate"),
v_output_rate_snake.clone(),
);
v_has_output_sample_rate = core_is_not_none(&[v_output_sample_rate.clone()])?;
if core_truthy(&v_has_output_sample_rate) {
} else {
v_output_sample_rate = v_default_output_rate.clone();
}
v_input_audio_descriptor = core_get(
&v_audio_descriptor,
&CoreValue::from("input"),
CoreValue::Null,
);
v_request_input_audio = core_get(&v_request_audio, &CoreValue::from("input"), CoreValue::Null);
v_input_rate = core_get(
&v_request_input_audio,
&CoreValue::from("sampleRate"),
CoreValue::Null,
);
v_input_rate_snake = core_get(
&v_request_input_audio,
&CoreValue::from("sample_rate"),
v_input_rate.clone(),
);
v_default_input_rate = core_get(
&v_input_audio_descriptor,
&CoreValue::from("sampleRate"),
CoreValue::Num(24000f64),
);
v_input_sample_rate = core_get(
&v_request_input_audio,
&CoreValue::from("rate"),
v_input_rate_snake.clone(),
);
v_has_input_sample_rate = core_is_not_none(&[v_input_sample_rate.clone()])?;
if core_truthy(&v_has_input_sample_rate) {
} else {
v_input_sample_rate = v_default_input_rate.clone();
}
v_session = CoreValue::new_map();
core_set(
&v_session,
CoreValue::from("type"),
CoreValue::from("realtime"),
)?;
v_default_model = core_get(
&v_descriptor,
&CoreValue::from("defaultModel"),
CoreValue::Null,
);
v_model = core_get(
&v_request,
&CoreValue::from("model"),
v_default_model.clone(),
);
core_set(&v_session, CoreValue::from("model"), v_model.clone())?;
v_output_modalities = core_json_parse(&[CoreValue::from("[\"audio\"]")])?;
core_set(
&v_session,
CoreValue::from("output_modalities"),
v_output_modalities.clone(),
)?;
v_audio = CoreValue::new_map();
v_input = CoreValue::new_map();
v_input_format = CoreValue::new_map();
core_set(
&v_input_format,
CoreValue::from("type"),
CoreValue::from("audio/pcm"),
)?;
core_set(
&v_input_format,
CoreValue::from("rate"),
v_input_sample_rate.clone(),
)?;
core_set(&v_input, CoreValue::from("format"), v_input_format.clone())?;
core_set(&v_audio, CoreValue::from("input"), v_input.clone())?;
v_output = CoreValue::new_map();
v_output_format = CoreValue::new_map();
core_set(
&v_output_format,
CoreValue::from("type"),
CoreValue::from("audio/pcm"),
)?;
core_set(
&v_output_format,
CoreValue::from("rate"),
v_output_sample_rate.clone(),
)?;
core_set(
&v_output,
CoreValue::from("format"),
v_output_format.clone(),
)?;
core_set(&v_output, CoreValue::from("voice"), v_voice_id.clone())?;
core_set(&v_audio, CoreValue::from("output"), v_output.clone())?;
core_set(&v_session, CoreValue::from("audio"), v_audio.clone())?;
v_instructions = _realtime_request_system_instruction_impl(&[v_request.clone()])?;
v_has_instructions = core_truthy_value(&[v_instructions.clone()])?;
if core_truthy(&v_has_instructions) {
core_set(
&v_session,
CoreValue::from("instructions"),
v_instructions.clone(),
)?;
}
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("type"),
CoreValue::from("session.update"),
)?;
core_set(&v_out, CoreValue::from("session"), v_session.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_realtime_compatible_build_input(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_realtime_compatible_build_input");
let mut v_descriptor = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_content = CoreValue::Null;
let mut v_event = CoreValue::Null;
let mut v_events = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_messages = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_response = CoreValue::Null;
let mut v_response_event = CoreValue::Null;
let mut v_response_modalities = CoreValue::Null;
v_events = CoreValue::new_list();
v_messages = _realtime_request_user_messages_impl(&[v_request.clone()])?;
for v_message in core_iter(&v_messages)? {
let mut v_message = v_message;
v_content = core_get(&v_message, &CoreValue::from("content"), CoreValue::from(""));
v_parts = _openai_realtime_content_parts_impl(&[v_content.clone()])?;
v_item = CoreValue::new_map();
core_set(&v_item, CoreValue::from("type"), CoreValue::from("message"))?;
core_set(&v_item, CoreValue::from("role"), CoreValue::from("user"))?;
core_set(&v_item, CoreValue::from("content"), v_parts.clone())?;
v_event = CoreValue::new_map();
core_set(
&v_event,
CoreValue::from("type"),
CoreValue::from("conversation.item.create"),
)?;
core_set(&v_event, CoreValue::from("item"), v_item.clone())?;
core_append(&v_events, v_event.clone())?;
}
v_response = CoreValue::new_map();
v_response_modalities = core_json_parse(&[CoreValue::from("[\"audio\"]")])?;
core_set(
&v_response,
CoreValue::from("output_modalities"),
v_response_modalities.clone(),
)?;
v_response_event = CoreValue::new_map();
core_set(
&v_response_event,
CoreValue::from("type"),
CoreValue::from("response.create"),
)?;
core_set(
&v_response_event,
CoreValue::from("response"),
v_response.clone(),
)?;
core_append(&v_events, v_response_event.clone())?;
return Ok(v_events.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_live_bidi_build_setup(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_live_bidi_build_setup");
let mut v_descriptor = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_audio_descriptor = CoreValue::Null;
let mut v_default_model = CoreValue::Null;
let mut v_default_voice = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_generation_config = CoreValue::Null;
let mut v_has_instructions = CoreValue::Null;
let mut v_has_response_format = CoreValue::Null;
let mut v_include_transcript = CoreValue::Null;
let mut v_instructions = CoreValue::Null;
let mut v_modalities = CoreValue::Null;
let mut v_model = CoreValue::Null;
let mut v_model_prefix = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_output_audio_descriptor = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_prebuilt_voice = CoreValue::Null;
let mut v_request_audio = CoreValue::Null;
let mut v_request_model = CoreValue::Null;
let mut v_request_output_audio = CoreValue::Null;
let mut v_response_format = CoreValue::Null;
let mut v_setup = CoreValue::Null;
let mut v_speech_config = CoreValue::Null;
let mut v_system_instruction = CoreValue::Null;
let mut v_transcript = CoreValue::Null;
let mut v_voice = CoreValue::Null;
let mut v_voice_config = CoreValue::Null;
let mut v_voice_name = CoreValue::Null;
v_response_format = core_get(
&v_request,
&CoreValue::from("response_format"),
CoreValue::Null,
);
v_has_response_format = core_truthy_value(&[v_response_format.clone()])?;
if core_truthy(&v_has_response_format) {
v_error = core_ai_error_unsupported(&[CoreValue::from(
"Gemini Live audio does not support structured response formats",
)])?;
return Err(core_as_error(&v_error));
}
v_default_model = core_get(
&v_descriptor,
&CoreValue::from("defaultModel"),
CoreValue::from("gemini-2.5-flash-native-audio-preview-12-2025"),
);
v_request_model = core_get(
&v_request,
&CoreValue::from("model"),
v_default_model.clone(),
);
v_model_prefix = core_contains(&[v_request_model.clone(), CoreValue::from("models/")])?;
v_model = v_request_model.clone();
if core_truthy(&v_model_prefix) {
} else {
v_model = core_string_format(&[CoreValue::from("models/{}"), v_request_model.clone()])?;
}
v_audio_descriptor = core_get(&v_descriptor, &CoreValue::from("audio"), CoreValue::Null);
v_output_audio_descriptor = core_get(
&v_audio_descriptor,
&CoreValue::from("output"),
CoreValue::Null,
);
v_request_audio = core_get(&v_request, &CoreValue::from("audio"), CoreValue::Null);
v_request_output_audio = core_get(
&v_request_audio,
&CoreValue::from("output"),
CoreValue::Null,
);
v_default_voice = core_get(
&v_output_audio_descriptor,
&CoreValue::from("defaultVoice"),
CoreValue::from("Kore"),
);
v_voice = core_get(
&v_request_output_audio,
&CoreValue::from("voice"),
v_default_voice.clone(),
);
v_voice_name = core_get(&v_voice, &CoreValue::from("name"), v_voice.clone());
v_setup = CoreValue::new_map();
core_set(&v_setup, CoreValue::from("model"), v_model.clone())?;
v_generation_config = CoreValue::new_map();
v_modalities = core_json_parse(&[CoreValue::from("[\"AUDIO\"]")])?;
core_set(
&v_generation_config,
CoreValue::from("responseModalities"),
v_modalities.clone(),
)?;
v_speech_config = CoreValue::new_map();
v_voice_config = CoreValue::new_map();
v_prebuilt_voice = CoreValue::new_map();
core_set(
&v_prebuilt_voice,
CoreValue::from("voiceName"),
v_voice_name.clone(),
)?;
core_set(
&v_voice_config,
CoreValue::from("prebuiltVoiceConfig"),
v_prebuilt_voice.clone(),
)?;
core_set(
&v_speech_config,
CoreValue::from("voiceConfig"),
v_voice_config.clone(),
)?;
core_set(
&v_generation_config,
CoreValue::from("speechConfig"),
v_speech_config.clone(),
)?;
core_set(
&v_setup,
CoreValue::from("generationConfig"),
v_generation_config.clone(),
)?;
v_include_transcript = core_get(
&v_request_output_audio,
&CoreValue::from("transcript"),
CoreValue::Bool(true),
);
if core_truthy(&v_include_transcript) {
v_transcript = CoreValue::new_map();
core_set(
&v_setup,
CoreValue::from("outputAudioTranscription"),
v_transcript.clone(),
)?;
}
v_instructions = _realtime_request_system_instruction_impl(&[v_request.clone()])?;
v_has_instructions = core_truthy_value(&[v_instructions.clone()])?;
if core_truthy(&v_has_instructions) {
v_part = CoreValue::new_map();
core_set(&v_part, CoreValue::from("text"), v_instructions.clone())?;
v_parts = CoreValue::new_list();
core_append(&v_parts, v_part.clone())?;
v_system_instruction = CoreValue::new_map();
core_set(
&v_system_instruction,
CoreValue::from("parts"),
v_parts.clone(),
)?;
core_set(
&v_setup,
CoreValue::from("systemInstruction"),
v_system_instruction.clone(),
)?;
}
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("setup"), v_setup.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_live_bidi_build_input(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_live_bidi_build_input");
let mut v_descriptor = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_audio = CoreValue::Null;
let mut v_audio_count = CoreValue::Null;
let mut v_audio_event = CoreValue::Null;
let mut v_audio_events = CoreValue::Null;
let mut v_client_content = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_content_event = CoreValue::Null;
let mut v_data = CoreValue::Null;
let mut v_end_event = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_events = CoreValue::Null;
let mut v_format = CoreValue::Null;
let mut v_format_lower = CoreValue::Null;
let mut v_has_sample_rate = CoreValue::Null;
let mut v_has_text = CoreValue::Null;
let mut v_is_audio = CoreValue::Null;
let mut v_is_list = CoreValue::Null;
let mut v_is_pcm = CoreValue::Null;
let mut v_is_pcm16 = CoreValue::Null;
let mut v_is_text = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_messages = CoreValue::Null;
let mut v_mime = CoreValue::Null;
let mut v_msg_has_audio = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_part_type = CoreValue::Null;
let mut v_realtime_input = CoreValue::Null;
let mut v_sample_rate = CoreValue::Null;
let mut v_sample_rate_final = CoreValue::Null;
let mut v_sample_rate_snake = CoreValue::Null;
let mut v_stream_end = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_text_count = CoreValue::Null;
let mut v_text_part = CoreValue::Null;
let mut v_text_parts = CoreValue::Null;
let mut v_turn = CoreValue::Null;
let mut v_turn_complete = CoreValue::Null;
let mut v_turns = CoreValue::Null;
let mut v_valid_pcm = CoreValue::Null;
v_events = CoreValue::new_list();
v_messages = _realtime_request_user_messages_impl(&[v_request.clone()])?;
for v_message in core_iter(&v_messages)? {
let mut v_message = v_message;
v_content = core_get(&v_message, &CoreValue::from("content"), CoreValue::from(""));
v_is_list = core_type_is(&v_content, CoreValue::from("list"));
v_text_parts = CoreValue::new_list();
v_audio_events = CoreValue::new_list();
if core_truthy(&v_is_list) {
for v_part in core_iter(&v_content)? {
let mut v_part = v_part;
v_part_type = core_get(&v_part, &CoreValue::from("type"), CoreValue::from("text"));
v_is_text = core_eq(&[v_part_type.clone(), CoreValue::from("text")])?;
if core_truthy(&v_is_text) {
v_text_part = CoreValue::new_map();
v_text = core_get(&v_part, &CoreValue::from("text"), CoreValue::from(""));
core_set(&v_text_part, CoreValue::from("text"), v_text.clone())?;
core_append(&v_text_parts, v_text_part.clone())?;
}
v_is_audio = core_eq(&[v_part_type.clone(), CoreValue::from("audio")])?;
if core_truthy(&v_is_audio) {
v_format = core_get(
&v_part,
&CoreValue::from("format"),
CoreValue::from("pcm16"),
);
v_format_lower = core_string_lower(&[v_format.clone()])?;
v_is_pcm16 = core_eq(&[v_format_lower.clone(), CoreValue::from("pcm16")])?;
v_is_pcm = core_eq(&[v_format_lower.clone(), CoreValue::from("pcm")])?;
v_valid_pcm = core_or(&[v_is_pcm16.clone(), v_is_pcm.clone()])?;
if core_truthy(&v_valid_pcm) {
} else {
v_error = core_ai_error_unsupported(&[CoreValue::from(
"Gemini Live audio input must be PCM",
)])?;
return Err(core_as_error(&v_error));
}
v_data = core_get(&v_part, &CoreValue::from("data"), CoreValue::from(""));
v_sample_rate =
core_get(&v_part, &CoreValue::from("sampleRate"), CoreValue::Null);
v_sample_rate_snake = core_get(
&v_part,
&CoreValue::from("sample_rate"),
v_sample_rate.clone(),
);
v_sample_rate_final = v_sample_rate_snake.clone();
v_has_sample_rate = core_is_not_none(&[v_sample_rate_final.clone()])?;
if core_truthy(&v_has_sample_rate) {
} else {
v_sample_rate_final = CoreValue::Num(16000f64);
}
v_mime = core_string_format(&[
CoreValue::from("audio/pcm;rate={}"),
v_sample_rate_final.clone(),
])?;
v_audio = CoreValue::new_map();
core_set(&v_audio, CoreValue::from("data"), v_data.clone())?;
core_set(&v_audio, CoreValue::from("mimeType"), v_mime.clone())?;
v_realtime_input = CoreValue::new_map();
core_set(&v_realtime_input, CoreValue::from("audio"), v_audio.clone())?;
v_audio_event = CoreValue::new_map();
core_set(
&v_audio_event,
CoreValue::from("realtimeInput"),
v_realtime_input.clone(),
)?;
core_append(&v_audio_events, v_audio_event.clone())?;
}
}
} else {
v_text_part = CoreValue::new_map();
core_set(&v_text_part, CoreValue::from("text"), v_content.clone())?;
core_append(&v_text_parts, v_text_part.clone())?;
}
v_audio_count = core_len(&[v_audio_events.clone()])?;
v_msg_has_audio = core_gt(&[v_audio_count.clone(), CoreValue::Num(0f64)])?;
v_text_count = core_len(&[v_text_parts.clone()])?;
v_has_text = core_gt(&[v_text_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_text) {
v_turn = CoreValue::new_map();
core_set(&v_turn, CoreValue::from("role"), CoreValue::from("user"))?;
core_set(&v_turn, CoreValue::from("parts"), v_text_parts.clone())?;
v_turns = CoreValue::new_list();
core_append(&v_turns, v_turn.clone())?;
v_client_content = CoreValue::new_map();
core_set(&v_client_content, CoreValue::from("turns"), v_turns.clone())?;
v_turn_complete = core_not(&[v_msg_has_audio.clone()])?;
core_set(
&v_client_content,
CoreValue::from("turnComplete"),
v_turn_complete.clone(),
)?;
v_content_event = CoreValue::new_map();
core_set(
&v_content_event,
CoreValue::from("clientContent"),
v_client_content.clone(),
)?;
core_append(&v_events, v_content_event.clone())?;
}
for v_audio_event in core_iter(&v_audio_events)? {
let mut v_audio_event = v_audio_event;
core_append(&v_events, v_audio_event.clone())?;
}
if core_truthy(&v_msg_has_audio) {
v_stream_end = CoreValue::new_map();
core_set(
&v_stream_end,
CoreValue::from("audioStreamEnd"),
CoreValue::Bool(true),
)?;
v_end_event = CoreValue::new_map();
core_set(
&v_end_event,
CoreValue::from("realtimeInput"),
v_stream_end.clone(),
)?;
core_append(&v_events, v_end_event.clone())?;
}
}
return Ok(v_events.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _realtime_request_system_instruction_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_realtime_request_system_instruction_impl");
let mut v_request = core_arg(args, 0);
let mut v_content = CoreValue::Null;
let mut v_direct = CoreValue::Null;
let mut v_empty_prompt = CoreValue::Null;
let mut v_has_direct = CoreValue::Null;
let mut v_is_system = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_prompt = CoreValue::Null;
let mut v_role = CoreValue::Null;
v_direct = core_get(
&v_request,
&CoreValue::from("instructions"),
CoreValue::Null,
);
v_has_direct = core_truthy_value(&[v_direct.clone()])?;
if core_truthy(&v_has_direct) {
return Ok(v_direct.clone());
}
v_empty_prompt = CoreValue::new_list();
v_prompt = core_get(
&v_request,
&CoreValue::from("chat_prompt"),
v_empty_prompt.clone(),
);
v_parts = CoreValue::new_list();
for v_message in core_iter(&v_prompt)? {
let mut v_message = v_message;
v_role = core_get(&v_message, &CoreValue::from("role"), CoreValue::Null);
v_is_system = core_eq(&[v_role.clone(), CoreValue::from("system")])?;
if core_truthy(&v_is_system) {
v_content = core_get(&v_message, &CoreValue::from("content"), CoreValue::from(""));
core_append(&v_parts, v_content.clone())?;
}
}
v_out = core_string_join_intrinsic(&[CoreValue::from("\n"), v_parts.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _realtime_request_user_messages_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_realtime_request_user_messages_impl");
let mut v_request = core_arg(args, 0);
let mut v_count = CoreValue::Null;
let mut v_empty_prompt = CoreValue::Null;
let mut v_has_input = CoreValue::Null;
let mut v_has_out = CoreValue::Null;
let mut v_input = CoreValue::Null;
let mut v_is_user = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_prompt = CoreValue::Null;
let mut v_role = CoreValue::Null;
v_empty_prompt = CoreValue::new_list();
v_prompt = core_get(
&v_request,
&CoreValue::from("chat_prompt"),
v_empty_prompt.clone(),
);
v_out = CoreValue::new_list();
for v_message in core_iter(&v_prompt)? {
let mut v_message = v_message;
v_role = core_get(&v_message, &CoreValue::from("role"), CoreValue::Null);
v_is_user = core_eq(&[v_role.clone(), CoreValue::from("user")])?;
if core_truthy(&v_is_user) {
core_append(&v_out, v_message.clone())?;
}
}
v_count = core_len(&[v_out.clone()])?;
v_has_out = core_gt(&[v_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_out) {
} else {
v_input = core_get(&v_request, &CoreValue::from("input"), CoreValue::Null);
v_has_input = core_is_not_none(&[v_input.clone()])?;
if core_truthy(&v_has_input) {
v_message = CoreValue::new_map();
core_set(&v_message, CoreValue::from("role"), CoreValue::from("user"))?;
core_set(&v_message, CoreValue::from("content"), v_input.clone())?;
core_append(&v_out, v_message.clone())?;
}
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_realtime_content_parts_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_realtime_content_parts_impl");
let mut v_content = core_arg(args, 0);
let mut v_audio_part = CoreValue::Null;
let mut v_data = CoreValue::Null;
let mut v_format = CoreValue::Null;
let mut v_input_audio = CoreValue::Null;
let mut v_is_audio = CoreValue::Null;
let mut v_is_list = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_text_part = CoreValue::Null;
let mut v_type = CoreValue::Null;
v_parts = CoreValue::new_list();
v_is_list = core_type_is(&v_content, CoreValue::from("list"));
if core_truthy(&v_is_list) {
for v_part in core_iter(&v_content)? {
let mut v_part = v_part;
v_type = core_get(&v_part, &CoreValue::from("type"), CoreValue::from("text"));
v_is_audio = core_eq(&[v_type.clone(), CoreValue::from("audio")])?;
if core_truthy(&v_is_audio) {
v_audio_part = CoreValue::new_map();
core_set(
&v_audio_part,
CoreValue::from("type"),
CoreValue::from("input_audio"),
)?;
v_input_audio = CoreValue::new_map();
v_data = core_get(&v_part, &CoreValue::from("data"), CoreValue::from(""));
core_set(&v_input_audio, CoreValue::from("data"), v_data.clone())?;
v_format = core_get(
&v_part,
&CoreValue::from("format"),
CoreValue::from("pcm16"),
);
core_set(&v_input_audio, CoreValue::from("format"), v_format.clone())?;
core_set(
&v_audio_part,
CoreValue::from("input_audio"),
v_input_audio.clone(),
)?;
core_append(&v_parts, v_audio_part.clone())?;
} else {
v_text_part = CoreValue::new_map();
core_set(
&v_text_part,
CoreValue::from("type"),
CoreValue::from("input_text"),
)?;
v_text = core_get(&v_part, &CoreValue::from("text"), CoreValue::from(""));
core_set(&v_text_part, CoreValue::from("text"), v_text.clone())?;
core_append(&v_parts, v_text_part.clone())?;
}
}
} else {
v_part = CoreValue::new_map();
core_set(
&v_part,
CoreValue::from("type"),
CoreValue::from("input_text"),
)?;
core_set(&v_part, CoreValue::from("text"), v_content.clone())?;
core_append(&v_parts, v_part.clone())?;
}
return Ok(v_parts.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_build_chat_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_build_chat_request");
let mut v_profile = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_anthropic_payload = CoreValue::Null;
let mut v_compatible_payload = CoreValue::Null;
let mut v_gemini_payload = CoreValue::Null;
let mut v_is_anthropic = CoreValue::Null;
let mut v_is_gemini = CoreValue::Null;
let mut v_is_responses = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_payload_with_quirks = CoreValue::Null;
let mut v_provider_id = CoreValue::Null;
let mut v_responses_payload = CoreValue::Null;
v_provider_id = provider_normalize_profile(&[v_profile.clone()])?;
v_is_responses = core_eq(&[v_provider_id.clone(), CoreValue::from("openai-responses")])?;
v_is_gemini = core_eq(&[v_provider_id.clone(), CoreValue::from("google-gemini")])?;
v_is_anthropic = core_eq(&[v_provider_id.clone(), CoreValue::from("anthropic")])?;
v_payload = CoreValue::new_map();
if core_truthy(&v_is_responses) {
v_responses_payload = openai_responses_build_chat_request(&[v_request.clone()])?;
v_payload = v_responses_payload.clone();
} else {
if core_truthy(&v_is_gemini) {
v_gemini_payload = _gemini_build_chat_request(&[v_request.clone()])?;
v_payload = v_gemini_payload.clone();
} else {
if core_truthy(&v_is_anthropic) {
v_anthropic_payload = _anthropic_build_chat_request(&[v_request.clone()])?;
v_payload = v_anthropic_payload.clone();
} else {
v_compatible_payload = openai_build_chat_request(&[v_request.clone()])?;
v_payload = v_compatible_payload.clone();
}
}
}
v_payload_with_quirks = _provider_apply_openai_compatible_profile_quirks(&[
v_provider_id.clone(),
v_payload.clone(),
v_request.clone(),
])?;
v_payload = v_payload_with_quirks.clone();
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _provider_apply_openai_compatible_profile_quirks(
args: &[CoreValue],
) -> Result<CoreValue, AxError> {
axir_coverage_mark("_provider_apply_openai_compatible_profile_quirks");
let mut v_profile = core_arg(args, 0);
let mut v_payload = core_arg(args, 1);
let mut v_request = core_arg(args, 2);
let mut v_empty_map = CoreValue::Null;
let mut v_is_deepseek = CoreValue::Null;
let mut v_is_grok = CoreValue::Null;
let mut v_is_mistral = CoreValue::Null;
let mut v_model_config = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_model_config = core_get(
&v_request,
&CoreValue::from("model_config"),
v_empty_map.clone(),
);
v_is_deepseek = core_eq(&[v_profile.clone(), CoreValue::from("deepseek")])?;
if core_truthy(&v_is_deepseek) {
v_payload =
_provider_apply_deepseek_chat_quirks(&[v_payload.clone(), v_model_config.clone()])?;
}
v_is_mistral = core_eq(&[v_profile.clone(), CoreValue::from("mistral")])?;
if core_truthy(&v_is_mistral) {
v_payload = _provider_apply_mistral_chat_quirks(&[v_payload.clone()])?;
}
v_is_grok = core_eq(&[v_profile.clone(), CoreValue::from("grok")])?;
if core_truthy(&v_is_grok) {
v_payload = _provider_apply_grok_chat_quirks(&[
v_payload.clone(),
v_request.clone(),
v_model_config.clone(),
])?;
}
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _provider_apply_deepseek_chat_quirks(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_provider_apply_deepseek_chat_quirks");
let mut v_payload = core_arg(args, 0);
let mut v_model_config = core_arg(args, 1);
let mut v_budget = CoreValue::Null;
let mut v_budget_is_highest = CoreValue::Null;
let mut v_budget_is_none = CoreValue::Null;
let mut v_budget_snake = CoreValue::Null;
let mut v_choice_none = CoreValue::Null;
let mut v_disabled_signal = CoreValue::Null;
let mut v_has_budget = CoreValue::Null;
let mut v_has_reasoning = CoreValue::Null;
let mut v_has_thinking_signal = CoreValue::Null;
let mut v_is_flash = CoreValue::Null;
let mut v_is_high = CoreValue::Null;
let mut v_is_max_effort = CoreValue::Null;
let mut v_is_pro = CoreValue::Null;
let mut v_is_reasoner = CoreValue::Null;
let mut v_is_xhigh = CoreValue::Null;
let mut v_model = CoreValue::Null;
let mut v_not_disabled_signal = CoreValue::Null;
let mut v_reasoning = CoreValue::Null;
let mut v_reasoning_is_none = CoreValue::Null;
let mut v_supports_thinking = CoreValue::Null;
let mut v_thinking = CoreValue::Null;
let mut v_thinking_enabled = CoreValue::Null;
let mut v_tool_choice = CoreValue::Null;
let mut v_unsupported_tool_choice_left = CoreValue::Null;
v_model = core_get(&v_payload, &CoreValue::from("model"), CoreValue::from(""));
v_is_flash = core_eq(&[v_model.clone(), CoreValue::from("deepseek-v4-flash")])?;
v_is_pro = core_eq(&[v_model.clone(), CoreValue::from("deepseek-v4-pro")])?;
v_supports_thinking = core_or(&[v_is_flash.clone(), v_is_pro.clone()])?;
v_is_reasoner = core_eq(&[v_model.clone(), CoreValue::from("deepseek-reasoner")])?;
v_unsupported_tool_choice_left =
core_or(&[v_supports_thinking.clone(), v_is_reasoner.clone()])?;
if core_truthy(&v_supports_thinking) {
v_budget_snake = core_get(
&v_model_config,
&CoreValue::from("thinking_token_budget"),
CoreValue::Null,
);
v_budget = core_get(
&v_model_config,
&CoreValue::from("thinkingTokenBudget"),
v_budget_snake.clone(),
);
v_reasoning = core_get(
&v_payload,
&CoreValue::from("reasoning_effort"),
CoreValue::Null,
);
v_has_budget = core_is_not_none(&[v_budget.clone()])?;
v_has_reasoning = core_is_not_none(&[v_reasoning.clone()])?;
v_has_thinking_signal = core_or(&[v_has_budget.clone(), v_has_reasoning.clone()])?;
v_budget_is_none = core_eq(&[v_budget.clone(), CoreValue::from("none")])?;
v_reasoning_is_none = core_eq(&[v_reasoning.clone(), CoreValue::from("none")])?;
v_disabled_signal = core_or(&[v_budget_is_none.clone(), v_reasoning_is_none.clone()])?;
v_not_disabled_signal = core_not(&[v_disabled_signal.clone()])?;
v_thinking_enabled =
core_and(&[v_has_thinking_signal.clone(), v_not_disabled_signal.clone()])?;
v_thinking = CoreValue::new_map();
if core_truthy(&v_thinking_enabled) {
core_set(
&v_thinking,
CoreValue::from("type"),
CoreValue::from("enabled"),
)?;
v_is_xhigh = core_eq(&[v_reasoning.clone(), CoreValue::from("xhigh")])?;
v_budget_is_highest = core_eq(&[v_budget.clone(), CoreValue::from("highest")])?;
v_is_max_effort = core_or(&[v_is_xhigh.clone(), v_budget_is_highest.clone()])?;
if core_truthy(&v_is_max_effort) {
core_set(
&v_payload,
CoreValue::from("reasoning_effort"),
CoreValue::from("max"),
)?;
} else {
v_is_high = core_eq(&[v_reasoning.clone(), CoreValue::from("high")])?;
if core_truthy(&v_is_high) {
core_set(
&v_payload,
CoreValue::from("reasoning_effort"),
CoreValue::from("high"),
)?;
} else {
core_set(
&v_payload,
CoreValue::from("reasoning_effort"),
CoreValue::from("high"),
)?;
}
}
core_map_delete(&[v_payload.clone(), CoreValue::from("temperature")])?;
core_map_delete(&[v_payload.clone(), CoreValue::from("top_p")])?;
core_map_delete(&[v_payload.clone(), CoreValue::from("presence_penalty")])?;
core_map_delete(&[v_payload.clone(), CoreValue::from("frequency_penalty")])?;
} else {
core_set(
&v_thinking,
CoreValue::from("type"),
CoreValue::from("disabled"),
)?;
core_map_delete(&[v_payload.clone(), CoreValue::from("reasoning_effort")])?;
}
core_set(&v_payload, CoreValue::from("thinking"), v_thinking.clone())?;
}
if core_truthy(&v_unsupported_tool_choice_left) {
v_tool_choice = core_get(&v_payload, &CoreValue::from("tool_choice"), CoreValue::Null);
v_choice_none = core_eq(&[v_tool_choice.clone(), CoreValue::from("none")])?;
if core_truthy(&v_choice_none) {
core_map_delete(&[v_payload.clone(), CoreValue::from("tools")])?;
}
core_map_delete(&[v_payload.clone(), CoreValue::from("tool_choice")])?;
}
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _provider_apply_mistral_chat_quirks(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_provider_apply_mistral_chat_quirks");
let mut v_payload = core_arg(args, 0);
let mut v_content = CoreValue::Null;
let mut v_content_is_list = CoreValue::Null;
let mut v_empty_image = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_has_max_completion = CoreValue::Null;
let mut v_image = CoreValue::Null;
let mut v_is_image_url = CoreValue::Null;
let mut v_max_completion = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_messages = CoreValue::Null;
let mut v_next_image = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_part_type = CoreValue::Null;
let mut v_url = CoreValue::Null;
v_max_completion = core_get(
&v_payload,
&CoreValue::from("max_completion_tokens"),
CoreValue::Null,
);
v_has_max_completion = core_is_not_none(&[v_max_completion.clone()])?;
if core_truthy(&v_has_max_completion) {
core_set(
&v_payload,
CoreValue::from("max_tokens"),
v_max_completion.clone(),
)?;
core_map_delete(&[v_payload.clone(), CoreValue::from("max_completion_tokens")])?;
}
v_empty_list = CoreValue::new_list();
v_messages = core_get(
&v_payload,
&CoreValue::from("messages"),
v_empty_list.clone(),
);
for v_message in core_iter(&v_messages)? {
let mut v_message = v_message;
v_content = core_get(&v_message, &CoreValue::from("content"), CoreValue::Null);
v_content_is_list = core_type_is(&v_content, CoreValue::from("list"));
if core_truthy(&v_content_is_list) {
for v_part in core_iter(&v_content)? {
let mut v_part = v_part;
v_part_type = core_get(&v_part, &CoreValue::from("type"), CoreValue::from(""));
v_is_image_url = core_eq(&[v_part_type.clone(), CoreValue::from("image_url")])?;
if core_truthy(&v_is_image_url) {
v_empty_image = CoreValue::new_map();
v_image = core_get(
&v_part,
&CoreValue::from("image_url"),
v_empty_image.clone(),
);
v_url = core_get(&v_image, &CoreValue::from("url"), CoreValue::Null);
v_next_image = CoreValue::new_map();
core_set(&v_next_image, CoreValue::from("url"), v_url.clone())?;
core_set(&v_part, CoreValue::from("image_url"), v_next_image.clone())?;
}
}
}
}
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _provider_apply_grok_chat_quirks(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_provider_apply_grok_chat_quirks");
let mut v_payload = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_model_config = core_arg(args, 2);
let mut v_allowed_websites = CoreValue::Null;
let mut v_allowed_websites_camel = CoreValue::Null;
let mut v_budget = CoreValue::Null;
let mut v_budget_snake = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_excluded_websites = CoreValue::Null;
let mut v_excluded_websites_camel = CoreValue::Null;
let mut v_from_date = CoreValue::Null;
let mut v_from_date_snake = CoreValue::Null;
let mut v_has_allowed_websites = CoreValue::Null;
let mut v_has_budget = CoreValue::Null;
let mut v_has_excluded_websites = CoreValue::Null;
let mut v_has_from_date = CoreValue::Null;
let mut v_has_links = CoreValue::Null;
let mut v_has_max_results = CoreValue::Null;
let mut v_has_mode = CoreValue::Null;
let mut v_has_return_citations = CoreValue::Null;
let mut v_has_safe_search = CoreValue::Null;
let mut v_has_search = CoreValue::Null;
let mut v_has_source_country = CoreValue::Null;
let mut v_has_source_type = CoreValue::Null;
let mut v_has_to_date = CoreValue::Null;
let mut v_has_x_handles = CoreValue::Null;
let mut v_highish = CoreValue::Null;
let mut v_is_grok43 = CoreValue::Null;
let mut v_is_grok43_any = CoreValue::Null;
let mut v_is_grok43_latest = CoreValue::Null;
let mut v_is_high = CoreValue::Null;
let mut v_is_highest = CoreValue::Null;
let mut v_is_low = CoreValue::Null;
let mut v_is_medium = CoreValue::Null;
let mut v_is_minimal = CoreValue::Null;
let mut v_is_none = CoreValue::Null;
let mut v_links = CoreValue::Null;
let mut v_lowish = CoreValue::Null;
let mut v_mapped_source = CoreValue::Null;
let mut v_mapped_sources = CoreValue::Null;
let mut v_max_results = CoreValue::Null;
let mut v_max_results_snake = CoreValue::Null;
let mut v_mode = CoreValue::Null;
let mut v_model = CoreValue::Null;
let mut v_return_citations = CoreValue::Null;
let mut v_return_citations_snake = CoreValue::Null;
let mut v_safe_search = CoreValue::Null;
let mut v_safe_search_camel = CoreValue::Null;
let mut v_search = CoreValue::Null;
let mut v_search_camel = CoreValue::Null;
let mut v_search_config_snake = CoreValue::Null;
let mut v_search_payload = CoreValue::Null;
let mut v_search_snake = CoreValue::Null;
let mut v_source = CoreValue::Null;
let mut v_source_country = CoreValue::Null;
let mut v_source_type = CoreValue::Null;
let mut v_sources = CoreValue::Null;
let mut v_to_date = CoreValue::Null;
let mut v_to_date_snake = CoreValue::Null;
let mut v_x_handles = CoreValue::Null;
let mut v_x_handles_camel = CoreValue::Null;
v_model = core_get(&v_payload, &CoreValue::from("model"), CoreValue::from(""));
v_is_grok43 = core_eq(&[v_model.clone(), CoreValue::from("grok-4.3")])?;
v_is_grok43_latest = core_eq(&[v_model.clone(), CoreValue::from("grok-4.3-latest")])?;
v_is_grok43_any = core_or(&[v_is_grok43.clone(), v_is_grok43_latest.clone()])?;
if core_truthy(&v_is_grok43_any) {
v_budget_snake = core_get(
&v_model_config,
&CoreValue::from("thinking_token_budget"),
CoreValue::Null,
);
v_budget = core_get(
&v_model_config,
&CoreValue::from("thinkingTokenBudget"),
v_budget_snake.clone(),
);
v_has_budget = core_is_not_none(&[v_budget.clone()])?;
if core_truthy(&v_has_budget) {
v_is_none = core_eq(&[v_budget.clone(), CoreValue::from("none")])?;
v_is_minimal = core_eq(&[v_budget.clone(), CoreValue::from("minimal")])?;
v_is_low = core_eq(&[v_budget.clone(), CoreValue::from("low")])?;
v_is_medium = core_eq(&[v_budget.clone(), CoreValue::from("medium")])?;
v_is_high = core_eq(&[v_budget.clone(), CoreValue::from("high")])?;
v_is_highest = core_eq(&[v_budget.clone(), CoreValue::from("highest")])?;
v_lowish = core_or(&[v_is_minimal.clone(), v_is_low.clone()])?;
v_highish = core_or(&[v_is_high.clone(), v_is_highest.clone()])?;
if core_truthy(&v_is_none) {
core_set(
&v_payload,
CoreValue::from("reasoning_effort"),
CoreValue::from("none"),
)?;
} else {
if core_truthy(&v_lowish) {
core_set(
&v_payload,
CoreValue::from("reasoning_effort"),
CoreValue::from("low"),
)?;
} else {
if core_truthy(&v_is_medium) {
core_set(
&v_payload,
CoreValue::from("reasoning_effort"),
CoreValue::from("medium"),
)?;
} else {
if core_truthy(&v_highish) {
core_set(
&v_payload,
CoreValue::from("reasoning_effort"),
CoreValue::from("high"),
)?;
}
}
}
}
}
core_map_delete(&[v_payload.clone(), CoreValue::from("presence_penalty")])?;
core_map_delete(&[v_payload.clone(), CoreValue::from("frequency_penalty")])?;
core_map_delete(&[v_payload.clone(), CoreValue::from("stop")])?;
} else {
core_map_delete(&[v_payload.clone(), CoreValue::from("reasoning_effort")])?;
}
v_empty_map = CoreValue::new_map();
v_search_snake = core_get(
&v_request,
&CoreValue::from("search_parameters"),
CoreValue::Null,
);
v_search_camel = core_get(
&v_request,
&CoreValue::from("searchParameters"),
v_search_snake.clone(),
);
v_search_config_snake = core_get(
&v_model_config,
&CoreValue::from("search_parameters"),
v_search_camel.clone(),
);
v_search = core_get(
&v_model_config,
&CoreValue::from("searchParameters"),
v_search_config_snake.clone(),
);
v_has_search = core_is_not_none(&[v_search.clone()])?;
if core_truthy(&v_has_search) {
v_search_payload = CoreValue::new_map();
v_mode = core_get(&v_search, &CoreValue::from("mode"), CoreValue::Null);
v_return_citations = core_get(
&v_search,
&CoreValue::from("returnCitations"),
CoreValue::Null,
);
v_return_citations_snake = core_get(
&v_search,
&CoreValue::from("return_citations"),
v_return_citations.clone(),
);
v_from_date = core_get(&v_search, &CoreValue::from("fromDate"), CoreValue::Null);
v_from_date_snake = core_get(
&v_search,
&CoreValue::from("from_date"),
v_from_date.clone(),
);
v_to_date = core_get(&v_search, &CoreValue::from("toDate"), CoreValue::Null);
v_to_date_snake = core_get(&v_search, &CoreValue::from("to_date"), v_to_date.clone());
v_max_results = core_get(
&v_search,
&CoreValue::from("maxSearchResults"),
CoreValue::Null,
);
v_max_results_snake = core_get(
&v_search,
&CoreValue::from("max_search_results"),
v_max_results.clone(),
);
v_sources = core_get(&v_search, &CoreValue::from("sources"), CoreValue::Null);
v_has_mode = core_is_not_none(&[v_mode.clone()])?;
if core_truthy(&v_has_mode) {
core_set(&v_search_payload, CoreValue::from("mode"), v_mode.clone())?;
}
v_has_return_citations = core_is_not_none(&[v_return_citations_snake.clone()])?;
if core_truthy(&v_has_return_citations) {
core_set(
&v_search_payload,
CoreValue::from("return_citations"),
v_return_citations_snake.clone(),
)?;
}
v_has_from_date = core_is_not_none(&[v_from_date_snake.clone()])?;
if core_truthy(&v_has_from_date) {
core_set(
&v_search_payload,
CoreValue::from("from_date"),
v_from_date_snake.clone(),
)?;
}
v_has_to_date = core_is_not_none(&[v_to_date_snake.clone()])?;
if core_truthy(&v_has_to_date) {
core_set(
&v_search_payload,
CoreValue::from("to_date"),
v_to_date_snake.clone(),
)?;
}
v_has_max_results = core_is_not_none(&[v_max_results_snake.clone()])?;
if core_truthy(&v_has_max_results) {
core_set(
&v_search_payload,
CoreValue::from("max_search_results"),
v_max_results_snake.clone(),
)?;
}
if core_truthy(&v_sources) {
v_mapped_sources = CoreValue::new_list();
for v_source in core_iter(&v_sources)? {
let mut v_source = v_source;
v_mapped_source = CoreValue::new_map();
v_source_type = core_get(&v_source, &CoreValue::from("type"), CoreValue::Null);
v_source_country =
core_get(&v_source, &CoreValue::from("country"), CoreValue::Null);
v_excluded_websites_camel = core_get(
&v_source,
&CoreValue::from("excludedWebsites"),
CoreValue::Null,
);
v_excluded_websites = core_get(
&v_source,
&CoreValue::from("excluded_websites"),
v_excluded_websites_camel.clone(),
);
v_allowed_websites_camel = core_get(
&v_source,
&CoreValue::from("allowedWebsites"),
CoreValue::Null,
);
v_allowed_websites = core_get(
&v_source,
&CoreValue::from("allowed_websites"),
v_allowed_websites_camel.clone(),
);
v_safe_search_camel =
core_get(&v_source, &CoreValue::from("safeSearch"), CoreValue::Null);
v_safe_search = core_get(
&v_source,
&CoreValue::from("safe_search"),
v_safe_search_camel.clone(),
);
v_x_handles_camel =
core_get(&v_source, &CoreValue::from("xHandles"), CoreValue::Null);
v_x_handles = core_get(
&v_source,
&CoreValue::from("x_handles"),
v_x_handles_camel.clone(),
);
v_links = core_get(&v_source, &CoreValue::from("links"), CoreValue::Null);
v_has_source_type = core_is_not_none(&[v_source_type.clone()])?;
if core_truthy(&v_has_source_type) {
core_set(
&v_mapped_source,
CoreValue::from("type"),
v_source_type.clone(),
)?;
}
v_has_source_country = core_is_not_none(&[v_source_country.clone()])?;
if core_truthy(&v_has_source_country) {
core_set(
&v_mapped_source,
CoreValue::from("country"),
v_source_country.clone(),
)?;
}
v_has_excluded_websites = core_is_not_none(&[v_excluded_websites.clone()])?;
if core_truthy(&v_has_excluded_websites) {
core_set(
&v_mapped_source,
CoreValue::from("excluded_websites"),
v_excluded_websites.clone(),
)?;
}
v_has_allowed_websites = core_is_not_none(&[v_allowed_websites.clone()])?;
if core_truthy(&v_has_allowed_websites) {
core_set(
&v_mapped_source,
CoreValue::from("allowed_websites"),
v_allowed_websites.clone(),
)?;
}
v_has_safe_search = core_is_not_none(&[v_safe_search.clone()])?;
if core_truthy(&v_has_safe_search) {
core_set(
&v_mapped_source,
CoreValue::from("safe_search"),
v_safe_search.clone(),
)?;
}
v_has_x_handles = core_is_not_none(&[v_x_handles.clone()])?;
if core_truthy(&v_has_x_handles) {
core_set(
&v_mapped_source,
CoreValue::from("x_handles"),
v_x_handles.clone(),
)?;
}
v_has_links = core_is_not_none(&[v_links.clone()])?;
if core_truthy(&v_has_links) {
core_set(&v_mapped_source, CoreValue::from("links"), v_links.clone())?;
}
core_append(&v_mapped_sources, v_mapped_source.clone())?;
}
core_set(
&v_search_payload,
CoreValue::from("sources"),
v_mapped_sources.clone(),
)?;
}
core_set(
&v_payload,
CoreValue::from("search_parameters"),
v_search_payload.clone(),
)?;
}
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_build_embed_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_build_embed_request");
let mut v_profile = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_error = CoreValue::Null;
let mut v_gemini_payload = CoreValue::Null;
let mut v_is_anthropic = CoreValue::Null;
let mut v_is_gemini = CoreValue::Null;
let mut v_openai_payload = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_provider_id = CoreValue::Null;
v_provider_id = provider_normalize_profile(&[v_profile.clone()])?;
v_is_gemini = core_eq(&[v_provider_id.clone(), CoreValue::from("google-gemini")])?;
v_is_anthropic = core_eq(&[v_provider_id.clone(), CoreValue::from("anthropic")])?;
v_payload = CoreValue::new_map();
if core_truthy(&v_is_gemini) {
v_gemini_payload = _gemini_build_embed_request(&[v_request.clone()])?;
v_payload = v_gemini_payload.clone();
} else {
if core_truthy(&v_is_anthropic) {
v_error = core_ai_error_unsupported(&[CoreValue::from(
"embed is not supported by Anthropic provider",
)])?;
return Err(core_as_error(&v_error));
} else {
v_openai_payload = openai_build_embed_request(&[v_request.clone()])?;
v_payload = v_openai_payload.clone();
}
}
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_normalize_chat_response(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_normalize_chat_response");
let mut v_profile = core_arg(args, 0);
let mut v_raw = core_arg(args, 1);
let mut v_ai_name = core_arg(args, 2);
let mut v_model = core_arg(args, 3);
let mut v_anthropic_response = CoreValue::Null;
let mut v_compatible_response = CoreValue::Null;
let mut v_gemini_response = CoreValue::Null;
let mut v_is_anthropic = CoreValue::Null;
let mut v_is_gemini = CoreValue::Null;
let mut v_is_responses = CoreValue::Null;
let mut v_provider_id = CoreValue::Null;
let mut v_response = CoreValue::Null;
let mut v_responses_response = CoreValue::Null;
v_provider_id = provider_normalize_profile(&[v_profile.clone()])?;
v_is_responses = core_eq(&[v_provider_id.clone(), CoreValue::from("openai-responses")])?;
v_is_gemini = core_eq(&[v_provider_id.clone(), CoreValue::from("google-gemini")])?;
v_is_anthropic = core_eq(&[v_provider_id.clone(), CoreValue::from("anthropic")])?;
v_response = CoreValue::new_map();
if core_truthy(&v_is_responses) {
v_responses_response = openai_responses_normalize_chat_response(&[
v_raw.clone(),
v_ai_name.clone(),
v_model.clone(),
])?;
v_response = v_responses_response.clone();
} else {
if core_truthy(&v_is_gemini) {
v_gemini_response = _gemini_normalize_chat_response(&[
v_raw.clone(),
v_ai_name.clone(),
v_model.clone(),
])?;
v_response = v_gemini_response.clone();
} else {
if core_truthy(&v_is_anthropic) {
v_anthropic_response = _anthropic_normalize_chat_response(&[
v_raw.clone(),
v_ai_name.clone(),
v_model.clone(),
])?;
v_response = v_anthropic_response.clone();
} else {
v_compatible_response = openai_normalize_chat_response(&[
v_raw.clone(),
v_ai_name.clone(),
v_model.clone(),
])?;
v_response = v_compatible_response.clone();
}
}
}
return Ok(v_response.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_normalize_stream_delta(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_normalize_stream_delta");
let mut v_profile = core_arg(args, 0);
let mut v_raw = core_arg(args, 1);
let mut v_state = core_arg(args, 2);
let mut v_ai_name = core_arg(args, 3);
let mut v_model = core_arg(args, 4);
let mut v_anthropic_response = CoreValue::Null;
let mut v_compatible_response = CoreValue::Null;
let mut v_gemini_response = CoreValue::Null;
let mut v_is_anthropic = CoreValue::Null;
let mut v_is_gemini = CoreValue::Null;
let mut v_is_responses = CoreValue::Null;
let mut v_provider_id = CoreValue::Null;
let mut v_response = CoreValue::Null;
let mut v_responses_response = CoreValue::Null;
v_provider_id = provider_normalize_profile(&[v_profile.clone()])?;
v_is_responses = core_eq(&[v_provider_id.clone(), CoreValue::from("openai-responses")])?;
v_is_gemini = core_eq(&[v_provider_id.clone(), CoreValue::from("google-gemini")])?;
v_is_anthropic = core_eq(&[v_provider_id.clone(), CoreValue::from("anthropic")])?;
v_response = CoreValue::new_map();
if core_truthy(&v_is_responses) {
v_responses_response = openai_responses_normalize_stream_delta(&[
v_raw.clone(),
v_state.clone(),
v_ai_name.clone(),
v_model.clone(),
])?;
v_response = v_responses_response.clone();
} else {
if core_truthy(&v_is_gemini) {
v_gemini_response = _gemini_normalize_chat_response(&[
v_raw.clone(),
v_ai_name.clone(),
v_model.clone(),
])?;
v_response = v_gemini_response.clone();
} else {
if core_truthy(&v_is_anthropic) {
v_anthropic_response = _anthropic_normalize_stream_delta(&[
v_raw.clone(),
v_state.clone(),
v_ai_name.clone(),
v_model.clone(),
])?;
v_response = v_anthropic_response.clone();
} else {
v_compatible_response = openai_normalize_stream_delta(&[
v_raw.clone(),
v_state.clone(),
v_ai_name.clone(),
v_model.clone(),
])?;
v_response = v_compatible_response.clone();
}
}
}
return Ok(v_response.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_classify_stream_error_status(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_classify_stream_error_status");
let mut v_profile = core_arg(args, 0);
let mut v_event = core_arg(args, 1);
let mut v_error_body = CoreValue::Null;
let mut v_error_type = CoreValue::Null;
let mut v_event_is_object = CoreValue::Null;
let mut v_is_anthropic = CoreValue::Null;
let mut v_is_error = CoreValue::Null;
let mut v_mapped = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_provider_id = CoreValue::Null;
let mut v_status = CoreValue::Null;
let mut v_type = CoreValue::Null;
v_provider_id = provider_normalize_profile(&[v_profile.clone()])?;
v_none = core_none(&[])?;
v_status = v_none.clone();
v_is_anthropic = core_eq(&[v_provider_id.clone(), CoreValue::from("anthropic")])?;
if core_truthy(&v_is_anthropic) {
v_event_is_object = core_type_is(&v_event, CoreValue::from("object"));
if core_truthy(&v_event_is_object) {
v_type = core_get(&v_event, &CoreValue::from("type"), CoreValue::from(""));
v_is_error = core_eq(&[v_type.clone(), CoreValue::from("error")])?;
if core_truthy(&v_is_error) {
v_error_body = core_get(&v_event, &CoreValue::from("error"), CoreValue::Null);
v_error_type =
core_get(&v_error_body, &CoreValue::from("type"), CoreValue::from(""));
v_mapped = _anthropic_error_type_to_status(&[v_error_type.clone()])?;
v_status = v_mapped.clone();
}
}
}
return Ok(v_status.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn is_retryable_status(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("is_retryable_status");
let mut v_status = core_arg(args, 0);
let mut v_is_408 = CoreValue::Null;
let mut v_is_429 = CoreValue::Null;
let mut v_is_500 = CoreValue::Null;
let mut v_is_502 = CoreValue::Null;
let mut v_is_503 = CoreValue::Null;
let mut v_is_504 = CoreValue::Null;
let mut v_is_529 = CoreValue::Null;
let mut v_r1 = CoreValue::Null;
let mut v_r2 = CoreValue::Null;
let mut v_r3 = CoreValue::Null;
let mut v_r4 = CoreValue::Null;
let mut v_r5 = CoreValue::Null;
let mut v_retryable = CoreValue::Null;
v_is_408 = core_eq(&[v_status.clone(), CoreValue::Num(408f64)])?;
v_is_429 = core_eq(&[v_status.clone(), CoreValue::Num(429f64)])?;
v_is_500 = core_eq(&[v_status.clone(), CoreValue::Num(500f64)])?;
v_is_502 = core_eq(&[v_status.clone(), CoreValue::Num(502f64)])?;
v_is_503 = core_eq(&[v_status.clone(), CoreValue::Num(503f64)])?;
v_is_504 = core_eq(&[v_status.clone(), CoreValue::Num(504f64)])?;
v_is_529 = core_eq(&[v_status.clone(), CoreValue::Num(529f64)])?;
v_r1 = core_or(&[v_is_408.clone(), v_is_429.clone()])?;
v_r2 = core_or(&[v_is_500.clone(), v_is_502.clone()])?;
v_r3 = core_or(&[v_is_503.clone(), v_is_504.clone()])?;
v_r4 = core_or(&[v_r1.clone(), v_r2.clone()])?;
v_r5 = core_or(&[v_r3.clone(), v_is_529.clone()])?;
v_retryable = core_or(&[v_r4.clone(), v_r5.clone()])?;
return Ok(v_retryable.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn default_retry_config(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("default_retry_config");
let mut v_config = CoreValue::Null;
v_config = CoreValue::new_map();
core_set(
&v_config,
CoreValue::from("max_retries"),
CoreValue::Num(3f64),
)?;
core_set(
&v_config,
CoreValue::from("initial_delay_ms"),
CoreValue::Num(1000f64),
)?;
core_set(
&v_config,
CoreValue::from("max_delay_ms"),
CoreValue::Num(60000f64),
)?;
core_set(
&v_config,
CoreValue::from("backoff_factor"),
CoreValue::Num(2f64),
)?;
return Ok(v_config.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn retry_opt_value(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("retry_opt_value");
let mut v_map = core_arg(args, 0);
let mut v_camel = core_arg(args, 1);
let mut v_snake = core_arg(args, 2);
let mut v_fallback = core_arg(args, 3);
let mut v_camel_val = CoreValue::Null;
let mut v_has_camel = CoreValue::Null;
let mut v_has_snake = CoreValue::Null;
let mut v_snake_val = CoreValue::Null;
v_camel_val = core_get(&v_map, &v_camel.clone(), CoreValue::Null);
v_has_camel = core_is_not_none(&[v_camel_val.clone()])?;
if core_truthy(&v_has_camel) {
return Ok(v_camel_val.clone());
}
v_snake_val = core_get(&v_map, &v_snake.clone(), CoreValue::Null);
v_has_snake = core_is_not_none(&[v_snake_val.clone()])?;
if core_truthy(&v_has_snake) {
return Ok(v_snake_val.clone());
}
return Ok(v_fallback.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn resolve_stream_retry(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("resolve_stream_retry");
let mut v_options = core_arg(args, 0);
let mut v_backoff = CoreValue::Null;
let mut v_cfg = CoreValue::Null;
let mut v_def_backoff = CoreValue::Null;
let mut v_def_initial = CoreValue::Null;
let mut v_def_max = CoreValue::Null;
let mut v_def_max_delay = CoreValue::Null;
let mut v_initial = CoreValue::Null;
let mut v_max_delay = CoreValue::Null;
let mut v_max_retries = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_retry = CoreValue::Null;
v_cfg = default_retry_config(&[])?;
v_def_max = core_get(&v_cfg, &CoreValue::from("max_retries"), CoreValue::Null);
v_def_initial = core_get(
&v_cfg,
&CoreValue::from("initial_delay_ms"),
CoreValue::Null,
);
v_def_max_delay = core_get(&v_cfg, &CoreValue::from("max_delay_ms"), CoreValue::Null);
v_def_backoff = core_get(&v_cfg, &CoreValue::from("backoff_factor"), CoreValue::Null);
v_retry = core_get(&v_options, &CoreValue::from("retry"), CoreValue::Null);
v_max_retries = retry_opt_value(&[
v_retry.clone(),
CoreValue::from("maxRetries"),
CoreValue::from("max_retries"),
v_def_max.clone(),
])?;
v_initial = retry_opt_value(&[
v_retry.clone(),
CoreValue::from("initialDelayMs"),
CoreValue::from("initial_delay_ms"),
v_def_initial.clone(),
])?;
v_max_delay = retry_opt_value(&[
v_retry.clone(),
CoreValue::from("maxDelayMs"),
CoreValue::from("max_delay_ms"),
v_def_max_delay.clone(),
])?;
v_backoff = retry_opt_value(&[
v_retry.clone(),
CoreValue::from("backoffFactor"),
CoreValue::from("backoff_factor"),
v_def_backoff.clone(),
])?;
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("max_retries"),
v_max_retries.clone(),
)?;
core_set(
&v_out,
CoreValue::from("initial_delay_ms"),
v_initial.clone(),
)?;
core_set(&v_out, CoreValue::from("max_delay_ms"), v_max_delay.clone())?;
core_set(&v_out, CoreValue::from("backoff_factor"), v_backoff.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_normalize_embed_response(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_normalize_embed_response");
let mut v_profile = core_arg(args, 0);
let mut v_raw = core_arg(args, 1);
let mut v_ai_name = core_arg(args, 2);
let mut v_model = core_arg(args, 3);
let mut v_gemini_response = CoreValue::Null;
let mut v_is_gemini = CoreValue::Null;
let mut v_openai_response = CoreValue::Null;
let mut v_provider_id = CoreValue::Null;
let mut v_response = CoreValue::Null;
v_provider_id = provider_normalize_profile(&[v_profile.clone()])?;
v_is_gemini = core_eq(&[v_provider_id.clone(), CoreValue::from("google-gemini")])?;
v_response = CoreValue::new_map();
if core_truthy(&v_is_gemini) {
v_gemini_response =
_gemini_normalize_embed_response(&[v_raw.clone(), v_ai_name.clone(), v_model.clone()])?;
v_response = v_gemini_response.clone();
} else {
v_openai_response =
openai_normalize_embed_response(&[v_raw.clone(), v_ai_name.clone(), v_model.clone()])?;
v_response = v_openai_response.clone();
}
return Ok(v_response.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_build_transcribe_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_build_transcribe_request");
let mut v_profile = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_gemini_payload = CoreValue::Null;
let mut v_grok_payload = CoreValue::Null;
let mut v_is_gemini = CoreValue::Null;
let mut v_is_grok = CoreValue::Null;
let mut v_is_responses = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_provider_id = CoreValue::Null;
let mut v_responses_payload = CoreValue::Null;
v_provider_id = provider_normalize_profile(&[v_profile.clone()])?;
v_is_responses = core_eq(&[v_provider_id.clone(), CoreValue::from("openai-responses")])?;
v_is_gemini = core_eq(&[v_provider_id.clone(), CoreValue::from("google-gemini")])?;
v_is_grok = core_eq(&[v_provider_id.clone(), CoreValue::from("grok")])?;
v_payload = CoreValue::new_map();
if core_truthy(&v_is_gemini) {
v_gemini_payload = _gemini_build_transcribe_request(&[v_request.clone()])?;
v_payload = v_gemini_payload.clone();
} else {
if core_truthy(&v_is_grok) {
v_grok_payload = _grok_build_transcribe_request(&[v_request.clone()])?;
v_payload = v_grok_payload.clone();
} else {
v_responses_payload = openai_responses_build_transcribe_request(&[v_request.clone()])?;
v_payload = v_responses_payload.clone();
}
}
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_build_speak_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_build_speak_request");
let mut v_profile = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_gemini_payload = CoreValue::Null;
let mut v_grok_payload = CoreValue::Null;
let mut v_is_gemini = CoreValue::Null;
let mut v_is_grok = CoreValue::Null;
let mut v_is_responses = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_provider_id = CoreValue::Null;
let mut v_responses_payload = CoreValue::Null;
v_provider_id = provider_normalize_profile(&[v_profile.clone()])?;
v_is_responses = core_eq(&[v_provider_id.clone(), CoreValue::from("openai-responses")])?;
v_is_gemini = core_eq(&[v_provider_id.clone(), CoreValue::from("google-gemini")])?;
v_is_grok = core_eq(&[v_provider_id.clone(), CoreValue::from("grok")])?;
v_payload = CoreValue::new_map();
if core_truthy(&v_is_gemini) {
v_gemini_payload = _gemini_build_speak_request(&[v_request.clone()])?;
v_payload = v_gemini_payload.clone();
} else {
if core_truthy(&v_is_grok) {
v_grok_payload = _grok_build_speak_request(&[v_request.clone()])?;
v_payload = v_grok_payload.clone();
} else {
v_responses_payload = openai_responses_build_speak_request(&[v_request.clone()])?;
v_payload = v_responses_payload.clone();
}
}
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_normalize_transcribe_response(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_normalize_transcribe_response");
let mut v_profile = core_arg(args, 0);
let mut v_raw = core_arg(args, 1);
let mut v_duration = CoreValue::Null;
let mut v_gemini_out = CoreValue::Null;
let mut v_has_duration = CoreValue::Null;
let mut v_has_language = CoreValue::Null;
let mut v_is_gemini = CoreValue::Null;
let mut v_language = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_provider_id = CoreValue::Null;
let mut v_text = CoreValue::Null;
v_provider_id = provider_normalize_profile(&[v_profile.clone()])?;
v_is_gemini = core_eq(&[v_provider_id.clone(), CoreValue::from("google-gemini")])?;
if core_truthy(&v_is_gemini) {
v_gemini_out = _gemini_normalize_transcribe_response(&[v_raw.clone()])?;
return Ok(v_gemini_out.clone());
}
v_text = core_get(&v_raw, &CoreValue::from("text"), CoreValue::from(""));
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("text"), v_text.clone())?;
v_language = core_get(&v_raw, &CoreValue::from("language"), CoreValue::Null);
v_has_language = core_is_not_none(&[v_language.clone()])?;
if core_truthy(&v_has_language) {
core_set(&v_out, CoreValue::from("language"), v_language.clone())?;
}
v_duration = core_get(&v_raw, &CoreValue::from("duration"), CoreValue::Null);
v_has_duration = core_is_not_none(&[v_duration.clone()])?;
if core_truthy(&v_has_duration) {
core_set(&v_out, CoreValue::from("duration"), v_duration.clone())?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_normalize_speak_response(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_normalize_speak_response");
let mut v_profile = core_arg(args, 0);
let mut v_raw = core_arg(args, 1);
let mut v_request = core_arg(args, 2);
let mut v_data = CoreValue::Null;
let mut v_format = CoreValue::Null;
let mut v_gemini_out = CoreValue::Null;
let mut v_is_gemini = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_provider_id = CoreValue::Null;
v_provider_id = provider_normalize_profile(&[v_profile.clone()])?;
v_is_gemini = core_eq(&[v_provider_id.clone(), CoreValue::from("google-gemini")])?;
if core_truthy(&v_is_gemini) {
v_gemini_out = _gemini_normalize_speak_response(&[v_raw.clone(), v_request.clone()])?;
return Ok(v_gemini_out.clone());
}
v_data = core_get(&v_raw, &CoreValue::from("audio"), v_raw.clone());
v_format = core_get(
&v_request,
&CoreValue::from("format"),
CoreValue::from("mp3"),
);
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("audio"), v_data.clone())?;
core_set(&v_out, CoreValue::from("format"), v_format.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn provider_normalize_realtime_event(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("provider_normalize_realtime_event");
let mut v_profile = core_arg(args, 0);
let mut v_event = core_arg(args, 1);
let mut v_state = core_arg(args, 2);
let mut v_ai_name = core_arg(args, 3);
let mut v_model = core_arg(args, 4);
let mut v_descriptor = CoreValue::Null;
let mut v_gemini_response = CoreValue::Null;
let mut v_grammar = CoreValue::Null;
let mut v_is_gemini_live = CoreValue::Null;
let mut v_provider_id = CoreValue::Null;
let mut v_response = CoreValue::Null;
v_provider_id = provider_normalize_profile(&[v_profile.clone()])?;
v_descriptor = _provider_realtime_audio_descriptor(&[v_provider_id.clone()])?;
v_grammar = core_get(
&v_descriptor,
&CoreValue::from("grammar"),
CoreValue::from("openai_realtime_compatible"),
);
v_is_gemini_live = core_eq(&[v_grammar.clone(), CoreValue::from("gemini_live_bidi")])?;
if core_truthy(&v_is_gemini_live) {
v_gemini_response = _gemini_live_bidi_normalize_realtime_event(&[
v_event.clone(),
v_state.clone(),
v_ai_name.clone(),
v_model.clone(),
])?;
return Ok(v_gemini_response.clone());
}
v_response = openai_responses_normalize_realtime_event(&[
v_event.clone(),
v_state.clone(),
v_ai_name.clone(),
v_model.clone(),
])?;
return Ok(v_response.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn openai_responses_build_chat_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("openai_responses_build_chat_request");
let mut v_request = core_arg(args, 0);
let mut v_empty_functions = CoreValue::Null;
let mut v_empty_model_config = CoreValue::Null;
let mut v_empty_prompt = CoreValue::Null;
let mut v_fn = CoreValue::Null;
let mut v_format = CoreValue::Null;
let mut v_format_type = CoreValue::Null;
let mut v_functions = CoreValue::Null;
let mut v_has_functions = CoreValue::Null;
let mut v_has_include = CoreValue::Null;
let mut v_has_instructions = CoreValue::Null;
let mut v_has_parallel = CoreValue::Null;
let mut v_has_reasoning = CoreValue::Null;
let mut v_has_response_format = CoreValue::Null;
let mut v_include = CoreValue::Null;
let mut v_input = CoreValue::Null;
let mut v_instructions = CoreValue::Null;
let mut v_is_json_schema = CoreValue::Null;
let mut v_is_system = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_model = CoreValue::Null;
let mut v_model_config = CoreValue::Null;
let mut v_parallel = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_prompt = CoreValue::Null;
let mut v_reasoning = CoreValue::Null;
let mut v_response_format = CoreValue::Null;
let mut v_role = CoreValue::Null;
let mut v_schema = CoreValue::Null;
let mut v_stream = CoreValue::Null;
let mut v_system_content = CoreValue::Null;
let mut v_text_config = CoreValue::Null;
let mut v_tool = CoreValue::Null;
let mut v_tool_choice = CoreValue::Null;
let mut v_tools = CoreValue::Null;
v_payload = CoreValue::new_map();
v_model = core_get(
&v_request,
&CoreValue::from("model"),
CoreValue::from("gpt-4o"),
);
core_set(&v_payload, CoreValue::from("model"), v_model.clone())?;
v_empty_prompt = CoreValue::new_list();
v_prompt = core_get(
&v_request,
&CoreValue::from("chat_prompt"),
v_empty_prompt.clone(),
);
v_input = CoreValue::new_list();
v_instructions = core_none(&[])?;
for v_message in core_iter(&v_prompt)? {
let mut v_message = v_message;
v_role = core_get(&v_message, &CoreValue::from("role"), CoreValue::Null);
v_is_system = core_eq(&[v_role.clone(), CoreValue::from("system")])?;
if core_truthy(&v_is_system) {
v_system_content =
core_get(&v_message, &CoreValue::from("content"), CoreValue::from(""));
v_instructions = v_system_content.clone();
} else {
v_item = _openai_responses_input_item_impl(&[v_message.clone()])?;
core_append(&v_input, v_item.clone())?;
}
}
v_has_instructions = core_is_not_none(&[v_instructions.clone()])?;
if core_truthy(&v_has_instructions) {
core_set(
&v_payload,
CoreValue::from("instructions"),
v_instructions.clone(),
)?;
}
core_set(&v_payload, CoreValue::from("input"), v_input.clone())?;
v_empty_functions = CoreValue::new_list();
v_functions = core_get(
&v_request,
&CoreValue::from("functions"),
v_empty_functions.clone(),
);
v_has_functions = core_truthy_value(&[v_functions.clone()])?;
if core_truthy(&v_has_functions) {
v_tools = CoreValue::new_list();
for v_fn in core_iter(&v_functions)? {
let mut v_fn = v_fn;
v_tool = _openai_responses_tool_spec_impl(&[v_fn.clone()])?;
core_append(&v_tools, v_tool.clone())?;
}
core_set(&v_payload, CoreValue::from("tools"), v_tools.clone())?;
v_tool_choice = core_get(
&v_request,
&CoreValue::from("function_call"),
CoreValue::from("auto"),
);
core_set(
&v_payload,
CoreValue::from("tool_choice"),
v_tool_choice.clone(),
)?;
}
v_response_format = core_get(
&v_request,
&CoreValue::from("response_format"),
CoreValue::Null,
);
v_has_response_format = core_truthy_value(&[v_response_format.clone()])?;
if core_truthy(&v_has_response_format) {
v_format_type = core_get(
&v_response_format,
&CoreValue::from("type"),
CoreValue::from("text"),
);
v_is_json_schema = core_eq(&[v_format_type.clone(), CoreValue::from("json_schema")])?;
v_format = CoreValue::new_map();
if core_truthy(&v_is_json_schema) {
v_schema = core_get(
&v_response_format,
&CoreValue::from("schema"),
CoreValue::Null,
);
core_set(
&v_format,
CoreValue::from("type"),
CoreValue::from("json_schema"),
)?;
core_set(&v_format, CoreValue::from("json_schema"), v_schema.clone())?;
} else {
core_set(&v_format, CoreValue::from("type"), v_format_type.clone())?;
}
v_text_config = CoreValue::new_map();
core_set(&v_text_config, CoreValue::from("format"), v_format.clone())?;
core_set(&v_payload, CoreValue::from("text"), v_text_config.clone())?;
}
v_empty_model_config = CoreValue::new_map();
v_model_config = core_get(
&v_request,
&CoreValue::from("model_config"),
v_empty_model_config.clone(),
);
v_stream = core_get(
&v_model_config,
&CoreValue::from("stream"),
CoreValue::Bool(false),
);
core_set(&v_payload, CoreValue::from("stream"), v_stream.clone())?;
_openai_responses_apply_model_config_impl(&[v_payload.clone(), v_model_config.clone()])?;
v_reasoning = core_get(
&v_model_config,
&CoreValue::from("reasoning"),
CoreValue::Null,
);
v_has_reasoning = core_truthy_value(&[v_reasoning.clone()])?;
if core_truthy(&v_has_reasoning) {
core_set(
&v_payload,
CoreValue::from("reasoning"),
v_reasoning.clone(),
)?;
}
v_include = core_get(
&v_model_config,
&CoreValue::from("include"),
CoreValue::Null,
);
v_has_include = core_truthy_value(&[v_include.clone()])?;
if core_truthy(&v_has_include) {
core_set(&v_payload, CoreValue::from("include"), v_include.clone())?;
}
v_parallel = core_get(
&v_model_config,
&CoreValue::from("parallel_tool_calls"),
CoreValue::Null,
);
v_has_parallel = core_is_not_none(&[v_parallel.clone()])?;
if core_truthy(&v_has_parallel) {
core_set(
&v_payload,
CoreValue::from("parallel_tool_calls"),
v_parallel.clone(),
)?;
}
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_responses_apply_model_config_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_responses_apply_model_config_impl");
let mut v_payload = core_arg(args, 0);
let mut v_model_config = core_arg(args, 1);
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("maxTokens"),
CoreValue::from("max_output_tokens"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("max_tokens"),
CoreValue::from("max_output_tokens"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("temperature"),
CoreValue::from("temperature"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("topP"),
CoreValue::from("top_p"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("top_p"),
CoreValue::from("top_p"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("presencePenalty"),
CoreValue::from("presence_penalty"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("presence_penalty"),
CoreValue::from("presence_penalty"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("frequencyPenalty"),
CoreValue::from("frequency_penalty"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("frequency_penalty"),
CoreValue::from("frequency_penalty"),
])?;
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_responses_tool_spec_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_responses_tool_spec_impl");
let mut v_fn = core_arg(args, 0);
let mut v_description = CoreValue::Null;
let mut v_empty_parameters = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_parameters = CoreValue::Null;
let mut v_tool = CoreValue::Null;
v_tool = CoreValue::new_map();
v_name = core_get(&v_fn, &CoreValue::from("name"), CoreValue::Null);
v_description = core_get(&v_fn, &CoreValue::from("description"), CoreValue::from(""));
v_empty_parameters = CoreValue::new_map();
v_parameters = core_get(
&v_fn,
&CoreValue::from("parameters"),
v_empty_parameters.clone(),
);
core_set(
&v_tool,
CoreValue::from("type"),
CoreValue::from("function"),
)?;
core_set(&v_tool, CoreValue::from("name"), v_name.clone())?;
core_set(
&v_tool,
CoreValue::from("description"),
v_description.clone(),
)?;
core_set(&v_tool, CoreValue::from("parameters"), v_parameters.clone())?;
return Ok(v_tool.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_responses_input_item_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_responses_input_item_impl");
let mut v_message = core_arg(args, 0);
let mut v_call_id = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_is_function = CoreValue::Null;
let mut v_message_content = CoreValue::Null;
let mut v_message_id = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_role = CoreValue::Null;
v_role = core_get(&v_message, &CoreValue::from("role"), CoreValue::Null);
v_is_function = core_eq(&[v_role.clone(), CoreValue::from("function")])?;
if core_truthy(&v_is_function) {
v_message_id = core_get(&v_message, &CoreValue::from("id"), CoreValue::Null);
v_message_content = core_get(&v_message, &CoreValue::from("content"), CoreValue::Null);
v_call_id = core_get(
&v_message,
&CoreValue::from("function_call_id"),
v_message_id.clone(),
);
v_result = core_get(
&v_message,
&CoreValue::from("result"),
v_message_content.clone(),
);
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("type"),
CoreValue::from("function_call_output"),
)?;
core_set(&v_out, CoreValue::from("call_id"), v_call_id.clone())?;
core_set(&v_out, CoreValue::from("output"), v_result.clone())?;
return Ok(v_out.clone());
}
v_content = core_get(&v_message, &CoreValue::from("content"), CoreValue::from(""));
v_parts = _openai_responses_content_parts_impl(&[v_content.clone(), v_role.clone()])?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("role"), v_role.clone())?;
core_set(&v_out, CoreValue::from("content"), v_parts.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_responses_content_parts_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_responses_content_parts_impl");
let mut v_content = core_arg(args, 0);
let mut v_role = core_arg(args, 1);
let mut v_is_assistant = CoreValue::Null;
let mut v_is_list = CoreValue::Null;
let mut v_mapped = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_part_type = CoreValue::Null;
let mut v_parts = CoreValue::Null;
v_is_list = core_type_is(&v_content, CoreValue::from("list"));
v_parts = CoreValue::new_list();
if core_truthy(&v_is_list) {
for v_part in core_iter(&v_content)? {
let mut v_part = v_part;
v_mapped = _openai_responses_content_part_impl(&[v_part.clone(), v_role.clone()])?;
core_append(&v_parts, v_mapped.clone())?;
}
} else {
v_part_type = CoreValue::from("input_text");
v_is_assistant = core_eq(&[v_role.clone(), CoreValue::from("assistant")])?;
if core_truthy(&v_is_assistant) {
v_part_type = CoreValue::from("output_text");
}
v_part = CoreValue::new_map();
core_set(&v_part, CoreValue::from("type"), v_part_type.clone())?;
core_set(&v_part, CoreValue::from("text"), v_content.clone())?;
core_append(&v_parts, v_part.clone())?;
}
return Ok(v_parts.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_responses_content_part_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_responses_content_part_impl");
let mut v_part = core_arg(args, 0);
let mut v_role = core_arg(args, 1);
let mut v_audio_alt = CoreValue::Null;
let mut v_data = CoreValue::Null;
let mut v_details = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_format = CoreValue::Null;
let mut v_image_url = CoreValue::Null;
let mut v_input_audio = CoreValue::Null;
let mut v_is_assistant = CoreValue::Null;
let mut v_is_audio = CoreValue::Null;
let mut v_is_image = CoreValue::Null;
let mut v_is_text = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_mime = CoreValue::Null;
let mut v_mime_camel = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_out_type = CoreValue::Null;
let mut v_part_data = CoreValue::Null;
let mut v_part_text = CoreValue::Null;
let mut v_type = CoreValue::Null;
let mut v_url = CoreValue::Null;
v_type = core_get(&v_part, &CoreValue::from("type"), CoreValue::from("text"));
v_is_assistant = core_eq(&[v_role.clone(), CoreValue::from("assistant")])?;
v_is_text = core_eq(&[v_type.clone(), CoreValue::from("text")])?;
if core_truthy(&v_is_text) {
v_out = CoreValue::new_map();
v_out_type = CoreValue::from("input_text");
if core_truthy(&v_is_assistant) {
v_out_type = CoreValue::from("output_text");
}
core_set(&v_out, CoreValue::from("type"), v_out_type.clone())?;
v_part_text = core_get(&v_part, &CoreValue::from("text"), CoreValue::from(""));
core_set(&v_out, CoreValue::from("text"), v_part_text.clone())?;
return Ok(v_out.clone());
}
v_is_image = core_eq(&[v_type.clone(), CoreValue::from("image")])?;
if core_truthy(&v_is_image) {
v_mime_camel = core_get(
&v_part,
&CoreValue::from("mimeType"),
CoreValue::from("image/png"),
);
v_mime = core_get(&v_part, &CoreValue::from("mime_type"), v_mime_camel.clone());
v_part_data = core_get(&v_part, &CoreValue::from("data"), CoreValue::Null);
v_data = core_get(&v_part, &CoreValue::from("image"), v_part_data.clone());
v_url = core_string_format(&[
CoreValue::from("data:{};base64,{}"),
v_mime.clone(),
v_data.clone(),
])?;
v_details = core_get(
&v_part,
&CoreValue::from("details"),
CoreValue::from("auto"),
);
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("type"),
CoreValue::from("input_image"),
)?;
v_image_url = CoreValue::new_map();
core_set(&v_image_url, CoreValue::from("url"), v_url.clone())?;
core_set(&v_image_url, CoreValue::from("details"), v_details.clone())?;
core_set(&v_out, CoreValue::from("image_url"), v_image_url.clone())?;
return Ok(v_out.clone());
}
v_is_audio = core_eq(&[v_type.clone(), CoreValue::from("audio")])?;
if core_truthy(&v_is_audio) {
v_audio_alt = core_get(&v_part, &CoreValue::from("audio"), CoreValue::Null);
v_data = core_get(&v_part, &CoreValue::from("data"), v_audio_alt.clone());
v_format = core_get(&v_part, &CoreValue::from("format"), CoreValue::from("wav"));
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("type"),
CoreValue::from("input_audio"),
)?;
v_input_audio = CoreValue::new_map();
core_set(&v_input_audio, CoreValue::from("data"), v_data.clone())?;
core_set(&v_input_audio, CoreValue::from("format"), v_format.clone())?;
core_set(
&v_out,
CoreValue::from("input_audio"),
v_input_audio.clone(),
)?;
return Ok(v_out.clone());
}
v_message = core_string_format(&[
CoreValue::from("Unsupported Responses content part: {}"),
v_type.clone(),
])?;
v_error = core_ai_error_unsupported(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn openai_responses_normalize_chat_response(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("openai_responses_normalize_chat_response");
let mut v_raw = core_arg(args, 0);
let mut v_ai_name = core_arg(args, 1);
let mut v_model = core_arg(args, 2);
let mut v_empty_function_calls = CoreValue::Null;
let mut v_empty_output = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_model_usage = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_raw_id = CoreValue::Null;
let mut v_raw_model = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_results = CoreValue::Null;
let mut v_usage = CoreValue::Null;
v_empty_output = CoreValue::new_list();
v_output = core_get(&v_raw, &CoreValue::from("output"), v_empty_output.clone());
v_result = CoreValue::new_map();
core_set(&v_result, CoreValue::from("index"), CoreValue::Num(0f64))?;
core_set(&v_result, CoreValue::from("id"), CoreValue::from("0"))?;
core_set(&v_result, CoreValue::from("content"), CoreValue::from(""))?;
v_empty_function_calls = CoreValue::new_list();
core_set(
&v_result,
CoreValue::from("function_calls"),
v_empty_function_calls.clone(),
)?;
core_set(
&v_result,
CoreValue::from("finish_reason"),
CoreValue::from("stop"),
)?;
for v_item in core_iter(&v_output)? {
let mut v_item = v_item;
_openai_responses_merge_output_item_impl(&[v_result.clone(), v_item.clone()])?;
}
v_results = CoreValue::new_list();
core_append(&v_results, v_result.clone())?;
v_raw_model = core_get(&v_raw, &CoreValue::from("model"), v_model.clone());
v_usage = core_get(&v_raw, &CoreValue::from("usage"), CoreValue::Null);
v_model_usage =
_ai_model_usage_impl(&[v_ai_name.clone(), v_raw_model.clone(), v_usage.clone()])?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("results"), v_results.clone())?;
v_raw_id = core_get(&v_raw, &CoreValue::from("id"), CoreValue::Null);
core_set(&v_out, CoreValue::from("remote_id"), v_raw_id.clone())?;
core_set(
&v_out,
CoreValue::from("model_usage"),
v_model_usage.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_responses_merge_output_item_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_responses_merge_output_item_impl");
let mut v_result = core_arg(args, 0);
let mut v_item = core_arg(args, 1);
let mut v_call = CoreValue::Null;
let mut v_calls = CoreValue::Null;
let mut v_citations = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_empty_content = CoreValue::Null;
let mut v_has_citations = CoreValue::Null;
let mut v_is_function = CoreValue::Null;
let mut v_is_message = CoreValue::Null;
let mut v_item_content = CoreValue::Null;
let mut v_item_id = CoreValue::Null;
let mut v_type = CoreValue::Null;
v_type = core_get(&v_item, &CoreValue::from("type"), CoreValue::Null);
v_is_message = core_eq(&[v_type.clone(), CoreValue::from("message")])?;
if core_truthy(&v_is_message) {
v_item_id = core_get(&v_item, &CoreValue::from("id"), CoreValue::from("0"));
core_set(&v_result, CoreValue::from("id"), v_item_id.clone())?;
v_empty_content = CoreValue::new_list();
v_item_content = core_get(
&v_item,
&CoreValue::from("content"),
v_empty_content.clone(),
);
v_content = _openai_responses_content_to_text_impl(&[v_item_content.clone()])?;
core_set(&v_result, CoreValue::from("content"), v_content.clone())?;
v_citations = _openai_responses_extract_citations_impl(&[v_item_content.clone()])?;
v_has_citations = core_truthy_value(&[v_citations.clone()])?;
if core_truthy(&v_has_citations) {
core_set(&v_result, CoreValue::from("citations"), v_citations.clone())?;
}
}
v_is_function = core_eq(&[v_type.clone(), CoreValue::from("function_call")])?;
if core_truthy(&v_is_function) {
v_call = _openai_responses_function_call_impl(&[v_item.clone()])?;
v_calls = CoreValue::new_list();
core_append(&v_calls, v_call.clone())?;
core_set(
&v_result,
CoreValue::from("function_calls"),
v_calls.clone(),
)?;
core_set(
&v_result,
CoreValue::from("finish_reason"),
CoreValue::from("function_call"),
)?;
}
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_responses_content_to_text_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_responses_content_to_text_impl");
let mut v_content = core_arg(args, 0);
let mut v_is_refusal = CoreValue::Null;
let mut v_is_text = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_type = CoreValue::Null;
v_parts = CoreValue::new_list();
for v_part in core_iter(&v_content)? {
let mut v_part = v_part;
v_type = core_get(&v_part, &CoreValue::from("type"), CoreValue::Null);
v_is_text = core_eq(&[v_type.clone(), CoreValue::from("output_text")])?;
if core_truthy(&v_is_text) {
v_text = core_get(&v_part, &CoreValue::from("text"), CoreValue::from(""));
core_append(&v_parts, v_text.clone())?;
}
v_is_refusal = core_eq(&[v_type.clone(), CoreValue::from("refusal")])?;
if core_truthy(&v_is_refusal) {
v_text = core_get(&v_part, &CoreValue::from("refusal"), CoreValue::from(""));
core_append(&v_parts, v_text.clone())?;
}
}
v_out = core_string_join_intrinsic(&[CoreValue::from(""), v_parts.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_responses_extract_citations_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_responses_extract_citations_impl");
let mut v_content = core_arg(args, 0);
let mut v_annotation = CoreValue::Null;
let mut v_annotations = CoreValue::Null;
let mut v_citation = CoreValue::Null;
let mut v_empty_annotations = CoreValue::Null;
let mut v_has_title = CoreValue::Null;
let mut v_has_url = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_title = CoreValue::Null;
let mut v_url = CoreValue::Null;
v_out = CoreValue::new_list();
for v_part in core_iter(&v_content)? {
let mut v_part = v_part;
v_empty_annotations = CoreValue::new_list();
v_annotations = core_get(
&v_part,
&CoreValue::from("annotations"),
v_empty_annotations.clone(),
);
for v_annotation in core_iter(&v_annotations)? {
let mut v_annotation = v_annotation;
v_url = core_get(&v_annotation, &CoreValue::from("url"), CoreValue::Null);
v_has_url = core_truthy_value(&[v_url.clone()])?;
if core_truthy(&v_has_url) {
v_title = core_get(&v_annotation, &CoreValue::from("title"), CoreValue::Null);
v_citation = CoreValue::new_map();
core_set(&v_citation, CoreValue::from("url"), v_url.clone())?;
v_has_title = core_is_not_none(&[v_title.clone()])?;
if core_truthy(&v_has_title) {
core_set(&v_citation, CoreValue::from("title"), v_title.clone())?;
}
core_append(&v_out, v_citation.clone())?;
}
}
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _openai_responses_function_call_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_openai_responses_function_call_impl");
let mut v_item = core_arg(args, 0);
let mut v_args = CoreValue::Null;
let mut v_args_is_string = CoreValue::Null;
let mut v_call = CoreValue::Null;
let mut v_call_id = CoreValue::Null;
let mut v_empty_args = CoreValue::Null;
let mut v_function = CoreValue::Null;
let mut v_item_id = CoreValue::Null;
let mut v_item_name = CoreValue::Null;
let mut v_parse_error = CoreValue::Null;
let mut v_parsed = CoreValue::Null;
v_empty_args = CoreValue::new_map();
v_args = core_get(&v_item, &CoreValue::from("arguments"), v_empty_args.clone());
v_args_is_string = core_type_is(&v_args, CoreValue::from("string"));
if core_truthy(&v_args_is_string) {
let __core_try: Result<CoreFlow, AxError> = (|| {
v_parsed = core_json_parse(&[v_args.clone()])?;
v_args = v_parsed.clone();
Ok(CoreFlow::Normal)
})();
match __core_try {
Ok(CoreFlow::Normal) => {}
Ok(CoreFlow::Return(value)) => return Ok(value),
Ok(CoreFlow::Break) => unreachable!("break outside loop"),
Ok(CoreFlow::Continue) => unreachable!("continue outside loop"),
Err(__core_caught) => {
v_parse_error = CoreValue::Error(std::rc::Rc::new(__core_caught));
}
}
}
v_function = CoreValue::new_map();
v_item_name = core_get(&v_item, &CoreValue::from("name"), CoreValue::Null);
core_set(&v_function, CoreValue::from("name"), v_item_name.clone())?;
core_set(&v_function, CoreValue::from("params"), v_args.clone())?;
v_call = CoreValue::new_map();
v_item_id = core_get(&v_item, &CoreValue::from("id"), CoreValue::Null);
v_call_id = core_get(&v_item, &CoreValue::from("call_id"), v_item_id.clone());
core_set(&v_call, CoreValue::from("id"), v_call_id.clone())?;
core_set(
&v_call,
CoreValue::from("type"),
CoreValue::from("function"),
)?;
core_set(&v_call, CoreValue::from("function"), v_function.clone())?;
return Ok(v_call.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn openai_responses_normalize_stream_delta(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("openai_responses_normalize_stream_delta");
let mut v_event = core_arg(args, 0);
let mut v_state = core_arg(args, 1);
let mut v_ai_name = core_arg(args, 2);
let mut v_model = core_arg(args, 3);
let mut v_call = CoreValue::Null;
let mut v_call_id = CoreValue::Null;
let mut v_calls = CoreValue::Null;
let mut v_empty_calls = CoreValue::Null;
let mut v_empty_item = CoreValue::Null;
let mut v_empty_response = CoreValue::Null;
let mut v_event_call_id = CoreValue::Null;
let mut v_event_delta = CoreValue::Null;
let mut v_event_item_id = CoreValue::Null;
let mut v_event_name = CoreValue::Null;
let mut v_event_response = CoreValue::Null;
let mut v_event_response_id = CoreValue::Null;
let mut v_event_response_id_fallback = CoreValue::Null;
let mut v_function = CoreValue::Null;
let mut v_has_remote = CoreValue::Null;
let mut v_is_args_delta = CoreValue::Null;
let mut v_is_completed = CoreValue::Null;
let mut v_is_output_added = CoreValue::Null;
let mut v_is_text_delta = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_model_usage = CoreValue::Null;
let mut v_none_finish = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_raw_model = CoreValue::Null;
let mut v_remote_id = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_results = CoreValue::Null;
let mut v_stable_remote = CoreValue::Null;
let mut v_text_delta = CoreValue::Null;
let mut v_type = CoreValue::Null;
let mut v_usage = CoreValue::Null;
v_type = core_get(&v_event, &CoreValue::from("type"), CoreValue::Null);
v_empty_response = CoreValue::new_map();
v_event_response = core_get(
&v_event,
&CoreValue::from("response"),
v_empty_response.clone(),
);
v_event_response_id = core_get(&v_event_response, &CoreValue::from("id"), CoreValue::Null);
v_event_response_id_fallback = core_get(
&v_event,
&CoreValue::from("response_id"),
v_event_response_id.clone(),
);
v_remote_id = core_get(
&v_event,
&CoreValue::from("id"),
v_event_response_id_fallback.clone(),
);
v_has_remote = core_truthy_value(&[v_remote_id.clone()])?;
if core_truthy(&v_has_remote) {
core_set(&v_state, CoreValue::from("remote_id"), v_remote_id.clone())?;
}
v_stable_remote = core_get(&v_state, &CoreValue::from("remote_id"), v_remote_id.clone());
v_result = CoreValue::new_map();
core_set(&v_result, CoreValue::from("index"), CoreValue::Num(0f64))?;
v_event_item_id = core_get(&v_event, &CoreValue::from("item_id"), CoreValue::from("0"));
core_set(&v_result, CoreValue::from("id"), v_event_item_id.clone())?;
core_set(&v_result, CoreValue::from("content"), CoreValue::from(""))?;
v_empty_calls = CoreValue::new_list();
core_set(
&v_result,
CoreValue::from("function_calls"),
v_empty_calls.clone(),
)?;
v_none_finish = core_none(&[])?;
core_set(
&v_result,
CoreValue::from("finish_reason"),
v_none_finish.clone(),
)?;
v_is_text_delta = core_eq(&[
v_type.clone(),
CoreValue::from("response.output_text.delta"),
])?;
if core_truthy(&v_is_text_delta) {
v_text_delta = core_get(&v_event, &CoreValue::from("delta"), CoreValue::from(""));
core_set(&v_result, CoreValue::from("content"), v_text_delta.clone())?;
}
v_is_output_added = core_eq(&[
v_type.clone(),
CoreValue::from("response.output_item.added"),
])?;
if core_truthy(&v_is_output_added) {
v_empty_item = CoreValue::new_map();
v_item = core_get(&v_event, &CoreValue::from("item"), v_empty_item.clone());
_openai_responses_merge_output_item_impl(&[v_result.clone(), v_item.clone()])?;
}
v_is_args_delta = core_eq(&[
v_type.clone(),
CoreValue::from("response.function_call_arguments.delta"),
])?;
if core_truthy(&v_is_args_delta) {
v_event_call_id = core_get(&v_event, &CoreValue::from("call_id"), CoreValue::from("0"));
v_call_id = core_get(
&v_event,
&CoreValue::from("item_id"),
v_event_call_id.clone(),
);
v_event_name = core_get(&v_event, &CoreValue::from("name"), CoreValue::Null);
v_event_delta = core_get(&v_event, &CoreValue::from("delta"), CoreValue::from(""));
v_function = CoreValue::new_map();
core_set(&v_function, CoreValue::from("name"), v_event_name.clone())?;
core_set(
&v_function,
CoreValue::from("params"),
v_event_delta.clone(),
)?;
v_call = CoreValue::new_map();
core_set(&v_call, CoreValue::from("id"), v_call_id.clone())?;
core_set(
&v_call,
CoreValue::from("type"),
CoreValue::from("function"),
)?;
core_set(&v_call, CoreValue::from("function"), v_function.clone())?;
v_calls = CoreValue::new_list();
core_append(&v_calls, v_call.clone())?;
core_set(
&v_result,
CoreValue::from("function_calls"),
v_calls.clone(),
)?;
core_set(
&v_result,
CoreValue::from("finish_reason"),
CoreValue::from("function_call"),
)?;
}
v_is_completed = core_eq(&[v_type.clone(), CoreValue::from("response.completed")])?;
v_usage = core_none(&[])?;
if core_truthy(&v_is_completed) {
v_usage = core_get(
&v_event_response,
&CoreValue::from("usage"),
CoreValue::Null,
);
core_set(
&v_result,
CoreValue::from("finish_reason"),
CoreValue::from("stop"),
)?;
}
v_results = CoreValue::new_list();
core_append(&v_results, v_result.clone())?;
v_raw_model = core_get(
&v_event_response,
&CoreValue::from("model"),
v_model.clone(),
);
v_model_usage =
_ai_model_usage_impl(&[v_ai_name.clone(), v_raw_model.clone(), v_usage.clone()])?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("results"), v_results.clone())?;
core_set(
&v_out,
CoreValue::from("remote_id"),
v_stable_remote.clone(),
)?;
core_set(
&v_out,
CoreValue::from("model_usage"),
v_model_usage.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn openai_responses_build_transcribe_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("openai_responses_build_transcribe_request");
let mut v_request = core_arg(args, 0);
let mut v_audio_file = CoreValue::Null;
let mut v_format = CoreValue::Null;
let mut v_has_language = CoreValue::Null;
let mut v_language = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_request_file = CoreValue::Null;
let mut v_transcribe_model = CoreValue::Null;
v_payload = CoreValue::new_map();
v_request_file = core_get(&v_request, &CoreValue::from("file"), CoreValue::Null);
v_audio_file = core_get(
&v_request,
&CoreValue::from("audio"),
v_request_file.clone(),
);
core_set(&v_payload, CoreValue::from("file"), v_audio_file.clone())?;
v_transcribe_model = core_get(
&v_request,
&CoreValue::from("model"),
CoreValue::from("whisper-1"),
);
core_set(
&v_payload,
CoreValue::from("model"),
v_transcribe_model.clone(),
)?;
v_format = core_get(
&v_request,
&CoreValue::from("format"),
CoreValue::from("json"),
);
core_set(
&v_payload,
CoreValue::from("response_format"),
v_format.clone(),
)?;
v_language = core_get(&v_request, &CoreValue::from("language"), CoreValue::Null);
v_has_language = core_is_not_none(&[v_language.clone()])?;
if core_truthy(&v_has_language) {
core_set(&v_payload, CoreValue::from("language"), v_language.clone())?;
}
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn openai_responses_build_speak_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("openai_responses_build_speak_request");
let mut v_request = core_arg(args, 0);
let mut v_payload = CoreValue::Null;
let mut v_request_input = CoreValue::Null;
let mut v_response_format = CoreValue::Null;
let mut v_speak_input = CoreValue::Null;
let mut v_speak_model = CoreValue::Null;
let mut v_voice = CoreValue::Null;
v_payload = CoreValue::new_map();
v_speak_model = core_get(
&v_request,
&CoreValue::from("model"),
CoreValue::from("tts-1"),
);
v_request_input = core_get(&v_request, &CoreValue::from("input"), CoreValue::from(""));
v_speak_input = core_get(
&v_request,
&CoreValue::from("text"),
v_request_input.clone(),
);
v_voice = core_get(
&v_request,
&CoreValue::from("voice"),
CoreValue::from("alloy"),
);
v_response_format = core_get(
&v_request,
&CoreValue::from("format"),
CoreValue::from("mp3"),
);
core_set(&v_payload, CoreValue::from("model"), v_speak_model.clone())?;
core_set(&v_payload, CoreValue::from("input"), v_speak_input.clone())?;
core_set(&v_payload, CoreValue::from("voice"), v_voice.clone())?;
core_set(
&v_payload,
CoreValue::from("response_format"),
v_response_format.clone(),
)?;
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _grok_build_transcribe_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_grok_build_transcribe_request");
let mut v_request = core_arg(args, 0);
let mut v_audio_file = CoreValue::Null;
let mut v_has_language = CoreValue::Null;
let mut v_has_prompt = CoreValue::Null;
let mut v_language = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_prompt = CoreValue::Null;
let mut v_request_file = CoreValue::Null;
v_payload = CoreValue::new_map();
v_request_file = core_get(&v_request, &CoreValue::from("file"), CoreValue::Null);
v_audio_file = core_get(
&v_request,
&CoreValue::from("audio"),
v_request_file.clone(),
);
core_set(&v_payload, CoreValue::from("file"), v_audio_file.clone())?;
v_language = core_get(&v_request, &CoreValue::from("language"), CoreValue::Null);
v_has_language = core_is_not_none(&[v_language.clone()])?;
if core_truthy(&v_has_language) {
core_set(&v_payload, CoreValue::from("language"), v_language.clone())?;
}
v_prompt = core_get(&v_request, &CoreValue::from("prompt"), CoreValue::Null);
v_has_prompt = core_is_not_none(&[v_prompt.clone()])?;
if core_truthy(&v_has_prompt) {
core_set(&v_payload, CoreValue::from("keyterm"), v_prompt.clone())?;
}
core_set(&v_payload, CoreValue::from("format"), CoreValue::Bool(true))?;
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _grok_build_speak_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_grok_build_speak_request");
let mut v_request = core_arg(args, 0);
let mut v_codec = CoreValue::Null;
let mut v_format = CoreValue::Null;
let mut v_has_sample_rate = CoreValue::Null;
let mut v_is_pcm16 = CoreValue::Null;
let mut v_is_pcm_like = CoreValue::Null;
let mut v_is_raw = CoreValue::Null;
let mut v_is_ulaw = CoreValue::Null;
let mut v_language = CoreValue::Null;
let mut v_output_format = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_request_input = CoreValue::Null;
let mut v_sample_rate = CoreValue::Null;
let mut v_sample_rate_alt = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_voice = CoreValue::Null;
let mut v_voice_id = CoreValue::Null;
v_payload = CoreValue::new_map();
v_request_input = core_get(&v_request, &CoreValue::from("input"), CoreValue::from(""));
v_text = core_get(
&v_request,
&CoreValue::from("text"),
v_request_input.clone(),
);
v_voice = core_get(
&v_request,
&CoreValue::from("voice"),
CoreValue::from("eve"),
);
v_voice_id = core_get(&v_voice, &CoreValue::from("id"), v_voice.clone());
v_language = core_get(
&v_request,
&CoreValue::from("language"),
CoreValue::from("auto"),
);
v_format = core_get(
&v_request,
&CoreValue::from("format"),
CoreValue::from("mp3"),
);
v_is_pcm16 = core_eq(&[v_format.clone(), CoreValue::from("pcm16")])?;
v_is_raw = core_eq(&[v_format.clone(), CoreValue::from("raw")])?;
v_is_pcm_like = core_or(&[v_is_pcm16.clone(), v_is_raw.clone()])?;
v_codec = v_format.clone();
if core_truthy(&v_is_pcm_like) {
v_codec = CoreValue::from("pcm");
} else {
v_is_ulaw = core_eq(&[v_format.clone(), CoreValue::from("ulaw")])?;
if core_truthy(&v_is_ulaw) {
v_codec = CoreValue::from("mulaw");
}
}
v_output_format = CoreValue::new_map();
core_set(&v_output_format, CoreValue::from("codec"), v_codec.clone())?;
v_sample_rate_alt = core_get(&v_request, &CoreValue::from("sample_rate"), CoreValue::Null);
v_sample_rate = core_get(
&v_request,
&CoreValue::from("sampleRate"),
v_sample_rate_alt.clone(),
);
v_has_sample_rate = core_is_not_none(&[v_sample_rate.clone()])?;
if core_truthy(&v_has_sample_rate) {
core_set(
&v_output_format,
CoreValue::from("sample_rate"),
v_sample_rate.clone(),
)?;
}
core_set(&v_payload, CoreValue::from("text"), v_text.clone())?;
core_set(&v_payload, CoreValue::from("voice_id"), v_voice_id.clone())?;
core_set(&v_payload, CoreValue::from("language"), v_language.clone())?;
core_set(
&v_payload,
CoreValue::from("output_format"),
v_output_format.clone(),
)?;
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_build_transcribe_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_build_transcribe_request");
let mut v_request = core_arg(args, 0);
let mut v_audio = CoreValue::Null;
let mut v_audio_part = CoreValue::Null;
let mut v_contents = CoreValue::Null;
let mut v_data = CoreValue::Null;
let mut v_has_mime = CoreValue::Null;
let mut v_inline_data = CoreValue::Null;
let mut v_mime_type = CoreValue::Null;
let mut v_mime_type_raw = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_prompt = CoreValue::Null;
let mut v_request_file = CoreValue::Null;
let mut v_text_part = CoreValue::Null;
let mut v_turn = CoreValue::Null;
v_payload = CoreValue::new_map();
v_contents = CoreValue::new_list();
v_turn = CoreValue::new_map();
core_set(&v_turn, CoreValue::from("role"), CoreValue::from("user"))?;
v_parts = CoreValue::new_list();
v_request_file = core_get(&v_request, &CoreValue::from("file"), CoreValue::Null);
v_audio = core_get(
&v_request,
&CoreValue::from("audio"),
v_request_file.clone(),
);
v_mime_type_raw = core_get(&v_audio, &CoreValue::from("mimeType"), CoreValue::Null);
v_mime_type = core_get(
&v_audio,
&CoreValue::from("mime_type"),
v_mime_type_raw.clone(),
);
v_has_mime = core_is_not_none(&[v_mime_type.clone()])?;
if core_truthy(&v_has_mime) {
} else {
v_mime_type = CoreValue::from("audio/wav");
}
v_data = core_get(&v_audio, &CoreValue::from("data"), v_audio.clone());
v_inline_data = CoreValue::new_map();
core_set(
&v_inline_data,
CoreValue::from("mimeType"),
v_mime_type.clone(),
)?;
core_set(&v_inline_data, CoreValue::from("data"), v_data.clone())?;
v_audio_part = CoreValue::new_map();
core_set(
&v_audio_part,
CoreValue::from("inlineData"),
v_inline_data.clone(),
)?;
core_append(&v_parts, v_audio_part.clone())?;
v_prompt = core_get(
&v_request,
&CoreValue::from("prompt"),
CoreValue::from("Generate a transcript of the speech in this audio."),
);
v_text_part = CoreValue::new_map();
core_set(&v_text_part, CoreValue::from("text"), v_prompt.clone())?;
core_append(&v_parts, v_text_part.clone())?;
core_set(&v_turn, CoreValue::from("parts"), v_parts.clone())?;
core_append(&v_contents, v_turn.clone())?;
core_set(&v_payload, CoreValue::from("contents"), v_contents.clone())?;
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_build_speak_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_build_speak_request");
let mut v_request = core_arg(args, 0);
let mut v_contents = CoreValue::Null;
let mut v_generation_config = CoreValue::Null;
let mut v_modalities = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_prebuilt = CoreValue::Null;
let mut v_request_input = CoreValue::Null;
let mut v_speech_config = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_text_part = CoreValue::Null;
let mut v_turn = CoreValue::Null;
let mut v_voice = CoreValue::Null;
let mut v_voice_config = CoreValue::Null;
let mut v_voice_id = CoreValue::Null;
v_payload = CoreValue::new_map();
v_contents = CoreValue::new_list();
v_turn = CoreValue::new_map();
core_set(&v_turn, CoreValue::from("role"), CoreValue::from("user"))?;
v_parts = CoreValue::new_list();
v_request_input = core_get(&v_request, &CoreValue::from("input"), CoreValue::from(""));
v_text = core_get(
&v_request,
&CoreValue::from("text"),
v_request_input.clone(),
);
v_text_part = CoreValue::new_map();
core_set(&v_text_part, CoreValue::from("text"), v_text.clone())?;
core_append(&v_parts, v_text_part.clone())?;
core_set(&v_turn, CoreValue::from("parts"), v_parts.clone())?;
core_append(&v_contents, v_turn.clone())?;
v_generation_config = CoreValue::new_map();
v_modalities = CoreValue::new_list();
core_append(&v_modalities, CoreValue::from("AUDIO"))?;
core_set(
&v_generation_config,
CoreValue::from("responseModalities"),
v_modalities.clone(),
)?;
v_voice = core_get(
&v_request,
&CoreValue::from("voice"),
CoreValue::from("Kore"),
);
v_voice_id = core_get(&v_voice, &CoreValue::from("id"), v_voice.clone());
v_prebuilt = CoreValue::new_map();
core_set(
&v_prebuilt,
CoreValue::from("voiceName"),
v_voice_id.clone(),
)?;
v_voice_config = CoreValue::new_map();
core_set(
&v_voice_config,
CoreValue::from("prebuiltVoiceConfig"),
v_prebuilt.clone(),
)?;
v_speech_config = CoreValue::new_map();
core_set(
&v_speech_config,
CoreValue::from("voiceConfig"),
v_voice_config.clone(),
)?;
core_set(
&v_generation_config,
CoreValue::from("speechConfig"),
v_speech_config.clone(),
)?;
core_set(&v_payload, CoreValue::from("contents"), v_contents.clone())?;
core_set(
&v_payload,
CoreValue::from("generationConfig"),
v_generation_config.clone(),
)?;
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_normalize_transcribe_response(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_normalize_transcribe_response");
let mut v_raw = core_arg(args, 0);
let mut v_candidate = CoreValue::Null;
let mut v_candidates = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_empty_candidates = CoreValue::Null;
let mut v_empty_parts = CoreValue::Null;
let mut v_has_text = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_text_parts = CoreValue::Null;
v_empty_candidates = CoreValue::new_list();
v_candidates = core_get(
&v_raw,
&CoreValue::from("candidates"),
v_empty_candidates.clone(),
);
v_text_parts = CoreValue::new_list();
for v_candidate in core_iter(&v_candidates)? {
let mut v_candidate = v_candidate;
v_content = core_get(&v_candidate, &CoreValue::from("content"), CoreValue::Null);
v_empty_parts = CoreValue::new_list();
v_parts = core_get(&v_content, &CoreValue::from("parts"), v_empty_parts.clone());
for v_part in core_iter(&v_parts)? {
let mut v_part = v_part;
v_text = core_get(&v_part, &CoreValue::from("text"), CoreValue::Null);
v_has_text = core_is_not_none(&[v_text.clone()])?;
if core_truthy(&v_has_text) {
core_append(&v_text_parts, v_text.clone())?;
}
}
}
v_text = core_string_join_intrinsic(&[CoreValue::from(""), v_text_parts.clone()])?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("text"), v_text.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_normalize_speak_response(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_normalize_speak_response");
let mut v_raw = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_audio = CoreValue::Null;
let mut v_candidate = CoreValue::Null;
let mut v_candidates = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_data = CoreValue::Null;
let mut v_empty_candidates = CoreValue::Null;
let mut v_empty_parts = CoreValue::Null;
let mut v_format = CoreValue::Null;
let mut v_has_audio = CoreValue::Null;
let mut v_has_data = CoreValue::Null;
let mut v_inline_data = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_parts = CoreValue::Null;
v_audio = core_get(&v_raw, &CoreValue::from("audio"), CoreValue::Null);
v_format = core_get(
&v_request,
&CoreValue::from("format"),
CoreValue::from("wav"),
);
v_empty_candidates = CoreValue::new_list();
v_candidates = core_get(
&v_raw,
&CoreValue::from("candidates"),
v_empty_candidates.clone(),
);
for v_candidate in core_iter(&v_candidates)? {
let mut v_candidate = v_candidate;
v_content = core_get(&v_candidate, &CoreValue::from("content"), CoreValue::Null);
v_empty_parts = CoreValue::new_list();
v_parts = core_get(&v_content, &CoreValue::from("parts"), v_empty_parts.clone());
for v_part in core_iter(&v_parts)? {
let mut v_part = v_part;
v_inline_data = core_get(&v_part, &CoreValue::from("inlineData"), CoreValue::Null);
v_data = core_get(&v_inline_data, &CoreValue::from("data"), CoreValue::Null);
v_has_data = core_is_not_none(&[v_data.clone()])?;
if core_truthy(&v_has_data) {
v_audio = v_data.clone();
}
}
}
v_has_audio = core_is_not_none(&[v_audio.clone()])?;
if core_truthy(&v_has_audio) {
} else {
v_audio = v_raw.clone();
}
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("audio"), v_audio.clone())?;
core_set(&v_out, CoreValue::from("format"), v_format.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn openai_responses_normalize_realtime_event(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("openai_responses_normalize_realtime_event");
let mut v_event = core_arg(args, 0);
let mut v_state = core_arg(args, 1);
let mut v_ai_name = core_arg(args, 2);
let mut v_model = core_arg(args, 3);
let mut v_audio = CoreValue::Null;
let mut v_audio_delta = CoreValue::Null;
let mut v_empty_error_payload = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_error_message = CoreValue::Null;
let mut v_error_payload = CoreValue::Null;
let mut v_event_id = CoreValue::Null;
let mut v_event_response_id = CoreValue::Null;
let mut v_event_usage = CoreValue::Null;
let mut v_has_realtime_item_id = CoreValue::Null;
let mut v_is_any_audio = CoreValue::Null;
let mut v_is_any_text = CoreValue::Null;
let mut v_is_audio = CoreValue::Null;
let mut v_is_audio_transcript = CoreValue::Null;
let mut v_is_done = CoreValue::Null;
let mut v_is_error_event = CoreValue::Null;
let mut v_is_output_audio = CoreValue::Null;
let mut v_is_output_text = CoreValue::Null;
let mut v_is_output_transcript = CoreValue::Null;
let mut v_is_realtime_transcript = CoreValue::Null;
let mut v_is_text = CoreValue::Null;
let mut v_is_transcript = CoreValue::Null;
let mut v_model_usage = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_realtime_empty_calls = CoreValue::Null;
let mut v_realtime_empty_response = CoreValue::Null;
let mut v_realtime_item_id = CoreValue::Null;
let mut v_realtime_none_finish = CoreValue::Null;
let mut v_realtime_response = CoreValue::Null;
let mut v_realtime_response_id = CoreValue::Null;
let mut v_realtime_text_delta = CoreValue::Null;
let mut v_realtime_transcript_delta = CoreValue::Null;
let mut v_remote_id = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_results = CoreValue::Null;
let mut v_type = CoreValue::Null;
let mut v_usage = CoreValue::Null;
v_type = core_get(&v_event, &CoreValue::from("type"), CoreValue::Null);
v_is_error_event = core_contains(&[v_type.clone(), CoreValue::from("error")])?;
if core_truthy(&v_is_error_event) {
v_empty_error_payload = CoreValue::new_map();
v_error_payload = core_get(
&v_event,
&CoreValue::from("error"),
v_empty_error_payload.clone(),
);
v_error_message = core_get(
&v_error_payload,
&CoreValue::from("message"),
CoreValue::from("realtime audio provider error"),
);
v_error = core_ai_error_response(&[v_error_message.clone(), v_event.clone()])?;
return Err(core_as_error(&v_error));
}
v_result = CoreValue::new_map();
core_set(&v_result, CoreValue::from("index"), CoreValue::Num(0f64))?;
v_realtime_response_id = core_get(&v_event, &CoreValue::from("response_id"), CoreValue::Null);
v_realtime_item_id = core_get(
&v_event,
&CoreValue::from("item_id"),
v_realtime_response_id.clone(),
);
v_has_realtime_item_id = core_is_not_none(&[v_realtime_item_id.clone()])?;
if core_truthy(&v_has_realtime_item_id) {
} else {
v_realtime_item_id = CoreValue::from("0");
}
core_set(&v_result, CoreValue::from("id"), v_realtime_item_id.clone())?;
core_set(&v_result, CoreValue::from("content"), CoreValue::from(""))?;
v_realtime_empty_calls = CoreValue::new_list();
core_set(
&v_result,
CoreValue::from("function_calls"),
v_realtime_empty_calls.clone(),
)?;
v_realtime_none_finish = core_none(&[])?;
core_set(
&v_result,
CoreValue::from("finish_reason"),
v_realtime_none_finish.clone(),
)?;
v_is_text = core_eq(&[v_type.clone(), CoreValue::from("response.text.delta")])?;
v_is_output_text = core_eq(&[
v_type.clone(),
CoreValue::from("response.output_text.delta"),
])?;
v_is_any_text = core_or(&[v_is_text.clone(), v_is_output_text.clone()])?;
v_is_transcript = core_eq(&[
v_type.clone(),
CoreValue::from("conversation.item.input_audio_transcription.delta"),
])?;
v_is_output_transcript = core_eq(&[
v_type.clone(),
CoreValue::from("response.output_audio_transcript.delta"),
])?;
v_is_audio_transcript = core_eq(&[
v_type.clone(),
CoreValue::from("response.audio_transcript.delta"),
])?;
v_is_realtime_transcript = core_or(&[v_is_transcript.clone(), v_is_output_transcript.clone()])?;
v_is_realtime_transcript = core_or(&[
v_is_realtime_transcript.clone(),
v_is_audio_transcript.clone(),
])?;
v_is_audio = core_eq(&[v_type.clone(), CoreValue::from("response.audio.delta")])?;
v_is_output_audio = core_eq(&[
v_type.clone(),
CoreValue::from("response.output_audio.delta"),
])?;
v_is_any_audio = core_or(&[v_is_audio.clone(), v_is_output_audio.clone()])?;
if core_truthy(&v_is_any_text) {
v_realtime_text_delta = core_get(&v_event, &CoreValue::from("delta"), CoreValue::from(""));
core_set(
&v_result,
CoreValue::from("content"),
v_realtime_text_delta.clone(),
)?;
}
if core_truthy(&v_is_realtime_transcript) {
v_realtime_transcript_delta =
core_get(&v_event, &CoreValue::from("delta"), CoreValue::from(""));
core_set(
&v_result,
CoreValue::from("content"),
v_realtime_transcript_delta.clone(),
)?;
}
if core_truthy(&v_is_any_audio) {
v_audio_delta = core_get(&v_event, &CoreValue::from("delta"), CoreValue::from(""));
v_audio = CoreValue::new_map();
core_set(&v_audio, CoreValue::from("data"), v_audio_delta.clone())?;
core_set(
&v_audio,
CoreValue::from("format"),
CoreValue::from("pcm16"),
)?;
core_set(&v_audio, CoreValue::from("is_delta"), CoreValue::Bool(true))?;
core_set(&v_result, CoreValue::from("audio"), v_audio.clone())?;
}
v_is_done = core_string_ends_with(&[v_type.clone(), CoreValue::from(".done")])?;
if core_truthy(&v_is_done) {
core_set(
&v_result,
CoreValue::from("finish_reason"),
CoreValue::from("stop"),
)?;
}
v_realtime_empty_response = CoreValue::new_map();
v_realtime_response = core_get(
&v_event,
&CoreValue::from("response"),
v_realtime_empty_response.clone(),
);
v_event_usage = core_get(&v_event, &CoreValue::from("usage"), CoreValue::Null);
v_usage = core_get(
&v_realtime_response,
&CoreValue::from("usage"),
v_event_usage.clone(),
);
v_model_usage = _ai_model_usage_impl(&[v_ai_name.clone(), v_model.clone(), v_usage.clone()])?;
v_results = CoreValue::new_list();
core_append(&v_results, v_result.clone())?;
v_event_id = core_get(&v_event, &CoreValue::from("id"), CoreValue::Null);
v_event_response_id = core_get(
&v_event,
&CoreValue::from("response_id"),
v_event_id.clone(),
);
v_remote_id = core_get(
&v_realtime_response,
&CoreValue::from("id"),
v_event_response_id.clone(),
);
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("results"), v_results.clone())?;
core_set(&v_out, CoreValue::from("remote_id"), v_remote_id.clone())?;
core_set(
&v_out,
CoreValue::from("model_usage"),
v_model_usage.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_live_bidi_normalize_realtime_event(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_live_bidi_normalize_realtime_event");
let mut v_event = core_arg(args, 0);
let mut v_state = core_arg(args, 1);
let mut v_ai_name = core_arg(args, 2);
let mut v_model = core_arg(args, 3);
let mut v_audio = CoreValue::Null;
let mut v_call_count = CoreValue::Null;
let mut v_calls = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_data = CoreValue::Null;
let mut v_empty_model_turn = CoreValue::Null;
let mut v_empty_parts = CoreValue::Null;
let mut v_empty_server = CoreValue::Null;
let mut v_empty_top_function_calls = CoreValue::Null;
let mut v_empty_top_tool_call = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_error_message = CoreValue::Null;
let mut v_error_payload = CoreValue::Null;
let mut v_event_id = CoreValue::Null;
let mut v_function_calls = CoreValue::Null;
let mut v_gemini_usage = CoreValue::Null;
let mut v_has_calls = CoreValue::Null;
let mut v_has_error = CoreValue::Null;
let mut v_has_inline_data = CoreValue::Null;
let mut v_has_input_transcription = CoreValue::Null;
let mut v_has_output_transcription = CoreValue::Null;
let mut v_inline_data = CoreValue::Null;
let mut v_input_text = CoreValue::Null;
let mut v_input_transcription = CoreValue::Null;
let mut v_mime = CoreValue::Null;
let mut v_model_turn = CoreValue::Null;
let mut v_model_usage = CoreValue::Null;
let mut v_none_finish = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_output_transcription = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_results = CoreValue::Null;
let mut v_server = CoreValue::Null;
let mut v_text_parts = CoreValue::Null;
let mut v_top_function_call = CoreValue::Null;
let mut v_top_function_calls = CoreValue::Null;
let mut v_top_part = CoreValue::Null;
let mut v_top_tool_call = CoreValue::Null;
let mut v_transcript_text = CoreValue::Null;
let mut v_turn_complete = CoreValue::Null;
let mut v_usage = CoreValue::Null;
v_error_payload = core_get(&v_event, &CoreValue::from("error"), CoreValue::Null);
v_has_error = core_is_not_none(&[v_error_payload.clone()])?;
if core_truthy(&v_has_error) {
v_error_message = core_get(
&v_error_payload,
&CoreValue::from("message"),
CoreValue::from("Gemini Live realtime audio provider error"),
);
v_error = core_ai_error_response(&[v_error_message.clone(), v_event.clone()])?;
return Err(core_as_error(&v_error));
}
v_result = CoreValue::new_map();
core_set(&v_result, CoreValue::from("index"), CoreValue::Num(0f64))?;
core_set(&v_result, CoreValue::from("id"), CoreValue::from("0"))?;
core_set(&v_result, CoreValue::from("content"), CoreValue::from(""))?;
v_calls = CoreValue::new_list();
core_set(
&v_result,
CoreValue::from("function_calls"),
v_calls.clone(),
)?;
v_none_finish = core_none(&[])?;
core_set(
&v_result,
CoreValue::from("finish_reason"),
v_none_finish.clone(),
)?;
v_text_parts = CoreValue::new_list();
v_function_calls = CoreValue::new_list();
v_empty_top_tool_call = CoreValue::new_map();
v_top_tool_call = core_get(
&v_event,
&CoreValue::from("toolCall"),
v_empty_top_tool_call.clone(),
);
v_empty_top_function_calls = CoreValue::new_list();
v_top_function_calls = core_get(
&v_top_tool_call,
&CoreValue::from("functionCalls"),
v_empty_top_function_calls.clone(),
);
for v_top_function_call in core_iter(&v_top_function_calls)? {
let mut v_top_function_call = v_top_function_call;
v_top_part = CoreValue::new_map();
core_set(
&v_top_part,
CoreValue::from("functionCall"),
v_top_function_call.clone(),
)?;
_gemini_merge_response_part_impl(&[
v_result.clone(),
v_text_parts.clone(),
v_function_calls.clone(),
v_top_part.clone(),
])?;
}
v_empty_server = CoreValue::new_map();
v_server = core_get(
&v_event,
&CoreValue::from("serverContent"),
v_empty_server.clone(),
);
v_output_transcription = core_get(
&v_server,
&CoreValue::from("outputTranscription"),
CoreValue::Null,
);
v_has_output_transcription = core_is_not_none(&[v_output_transcription.clone()])?;
if core_truthy(&v_has_output_transcription) {
v_transcript_text = core_get(
&v_output_transcription,
&CoreValue::from("text"),
CoreValue::from(""),
);
core_append(&v_text_parts, v_transcript_text.clone())?;
}
v_input_transcription = core_get(
&v_server,
&CoreValue::from("inputTranscription"),
CoreValue::Null,
);
v_has_input_transcription = core_is_not_none(&[v_input_transcription.clone()])?;
if core_truthy(&v_has_input_transcription) {
v_input_text = core_get(
&v_input_transcription,
&CoreValue::from("text"),
CoreValue::from(""),
);
core_append(&v_text_parts, v_input_text.clone())?;
}
v_empty_model_turn = CoreValue::new_map();
v_model_turn = core_get(
&v_server,
&CoreValue::from("modelTurn"),
v_empty_model_turn.clone(),
);
v_empty_parts = CoreValue::new_list();
v_parts = core_get(
&v_model_turn,
&CoreValue::from("parts"),
v_empty_parts.clone(),
);
for v_part in core_iter(&v_parts)? {
let mut v_part = v_part;
v_inline_data = core_get(&v_part, &CoreValue::from("inlineData"), CoreValue::Null);
v_has_inline_data = core_is_not_none(&[v_inline_data.clone()])?;
if core_truthy(&v_has_inline_data) {
v_mime = core_get(
&v_inline_data,
&CoreValue::from("mimeType"),
CoreValue::from("audio/pcm"),
);
v_data = core_get(
&v_inline_data,
&CoreValue::from("data"),
CoreValue::from(""),
);
v_audio = CoreValue::new_map();
core_set(&v_audio, CoreValue::from("data"), v_data.clone())?;
core_set(&v_audio, CoreValue::from("mimeType"), v_mime.clone())?;
core_set(
&v_audio,
CoreValue::from("format"),
CoreValue::from("pcm16"),
)?;
core_set(
&v_audio,
CoreValue::from("sampleRate"),
CoreValue::Num(24000f64),
)?;
core_set(&v_audio, CoreValue::from("is_delta"), CoreValue::Bool(true))?;
core_set(&v_result, CoreValue::from("audio"), v_audio.clone())?;
} else {
_gemini_merge_response_part_impl(&[
v_result.clone(),
v_text_parts.clone(),
v_function_calls.clone(),
v_part.clone(),
])?;
}
}
v_content = core_string_join_intrinsic(&[CoreValue::from(""), v_text_parts.clone()])?;
core_set(&v_result, CoreValue::from("content"), v_content.clone())?;
v_call_count = core_len(&[v_function_calls.clone()])?;
v_has_calls = core_gt(&[v_call_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_calls) {
core_set(
&v_result,
CoreValue::from("function_calls"),
v_function_calls.clone(),
)?;
core_set(
&v_result,
CoreValue::from("finish_reason"),
CoreValue::from("function_call"),
)?;
}
v_turn_complete = core_get(
&v_server,
&CoreValue::from("turnComplete"),
CoreValue::Bool(false),
);
if core_truthy(&v_turn_complete) {
core_set(
&v_result,
CoreValue::from("finish_reason"),
CoreValue::from("stop"),
)?;
}
v_usage = core_get(&v_event, &CoreValue::from("usageMetadata"), CoreValue::Null);
v_gemini_usage = _gemini_usage_impl(&[v_usage.clone()])?;
v_model_usage =
_ai_model_usage_impl(&[v_ai_name.clone(), v_model.clone(), v_gemini_usage.clone()])?;
v_results = CoreValue::new_list();
core_append(&v_results, v_result.clone())?;
v_event_id = core_get(
&v_event,
&CoreValue::from("id"),
CoreValue::from("gemini-live"),
);
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("results"), v_results.clone())?;
core_set(&v_out, CoreValue::from("remote_id"), v_event_id.clone())?;
core_set(
&v_out,
CoreValue::from("model_usage"),
v_model_usage.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_build_chat_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_build_chat_request");
let mut v_request = core_arg(args, 0);
let mut v_contents = CoreValue::Null;
let mut v_decl = CoreValue::Null;
let mut v_empty_functions = CoreValue::Null;
let mut v_empty_model_config = CoreValue::Null;
let mut v_empty_prompt = CoreValue::Null;
let mut v_fn = CoreValue::Null;
let mut v_format_type = CoreValue::Null;
let mut v_function_declarations = CoreValue::Null;
let mut v_functions = CoreValue::Null;
let mut v_generation_config = CoreValue::Null;
let mut v_has_functions = CoreValue::Null;
let mut v_has_mapped = CoreValue::Null;
let mut v_has_response_format = CoreValue::Null;
let mut v_has_system = CoreValue::Null;
let mut v_is_gemini3 = CoreValue::Null;
let mut v_is_json_schema = CoreValue::Null;
let mut v_is_system = CoreValue::Null;
let mut v_mapped = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_missing_temperature = CoreValue::Null;
let mut v_model = CoreValue::Null;
let mut v_model_config = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_prompt = CoreValue::Null;
let mut v_response_format = CoreValue::Null;
let mut v_role = CoreValue::Null;
let mut v_schema = CoreValue::Null;
let mut v_schema_container = CoreValue::Null;
let mut v_system_count = CoreValue::Null;
let mut v_system_instruction = CoreValue::Null;
let mut v_system_part = CoreValue::Null;
let mut v_system_part_list = CoreValue::Null;
let mut v_system_parts = CoreValue::Null;
let mut v_system_text = CoreValue::Null;
let mut v_system_text_joined = CoreValue::Null;
let mut v_temperature = CoreValue::Null;
let mut v_too_low = CoreValue::Null;
let mut v_tool = CoreValue::Null;
let mut v_tool_config = CoreValue::Null;
let mut v_tools = CoreValue::Null;
v_payload = CoreValue::new_map();
v_empty_prompt = CoreValue::new_list();
v_prompt = core_get(
&v_request,
&CoreValue::from("chat_prompt"),
v_empty_prompt.clone(),
);
v_system_parts = CoreValue::new_list();
v_contents = CoreValue::new_list();
for v_message in core_iter(&v_prompt)? {
let mut v_message = v_message;
v_role = core_get(&v_message, &CoreValue::from("role"), CoreValue::Null);
v_is_system = core_eq(&[v_role.clone(), CoreValue::from("system")])?;
if core_truthy(&v_is_system) {
v_system_text = core_get(&v_message, &CoreValue::from("content"), CoreValue::from(""));
core_append(&v_system_parts, v_system_text.clone())?;
} else {
v_mapped = _gemini_message_impl(&[v_message.clone()])?;
v_has_mapped = core_is_not_none(&[v_mapped.clone()])?;
if core_truthy(&v_has_mapped) {
core_append(&v_contents, v_mapped.clone())?;
}
}
}
v_system_count = core_len(&[v_system_parts.clone()])?;
v_has_system = core_gt(&[v_system_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_system) {
v_system_text_joined =
core_string_join_intrinsic(&[CoreValue::from(" "), v_system_parts.clone()])?;
v_system_part = CoreValue::new_map();
core_set(
&v_system_part,
CoreValue::from("text"),
v_system_text_joined.clone(),
)?;
v_system_part_list = CoreValue::new_list();
core_append(&v_system_part_list, v_system_part.clone())?;
v_system_instruction = CoreValue::new_map();
core_set(
&v_system_instruction,
CoreValue::from("role"),
CoreValue::from("user"),
)?;
core_set(
&v_system_instruction,
CoreValue::from("parts"),
v_system_part_list.clone(),
)?;
core_set(
&v_payload,
CoreValue::from("systemInstruction"),
v_system_instruction.clone(),
)?;
}
core_set(&v_payload, CoreValue::from("contents"), v_contents.clone())?;
v_generation_config = CoreValue::new_map();
core_set(
&v_generation_config,
CoreValue::from("candidateCount"),
CoreValue::Num(1f64),
)?;
core_set(
&v_generation_config,
CoreValue::from("responseMimeType"),
CoreValue::from("text/plain"),
)?;
v_empty_model_config = CoreValue::new_map();
v_model_config = core_get(
&v_request,
&CoreValue::from("model_config"),
v_empty_model_config.clone(),
);
_gemini_apply_model_config_impl(&[v_generation_config.clone(), v_model_config.clone()])?;
v_response_format = core_get(
&v_request,
&CoreValue::from("response_format"),
CoreValue::Null,
);
v_has_response_format = core_truthy_value(&[v_response_format.clone()])?;
if core_truthy(&v_has_response_format) {
core_set(
&v_generation_config,
CoreValue::from("responseMimeType"),
CoreValue::from("application/json"),
)?;
v_format_type = core_get(
&v_response_format,
&CoreValue::from("type"),
CoreValue::from(""),
);
v_is_json_schema = core_eq(&[v_format_type.clone(), CoreValue::from("json_schema")])?;
if core_truthy(&v_is_json_schema) {
v_schema_container = core_get(
&v_response_format,
&CoreValue::from("schema"),
CoreValue::Null,
);
v_schema = core_get(
&v_schema_container,
&CoreValue::from("schema"),
v_schema_container.clone(),
);
core_set(
&v_generation_config,
CoreValue::from("responseJsonSchema"),
v_schema.clone(),
)?;
}
}
v_model = core_get(
&v_request,
&CoreValue::from("model"),
CoreValue::from("gemini-2.5-flash"),
);
v_is_gemini3 = core_string_starts_with(&[v_model.clone(), CoreValue::from("gemini-3")])?;
if core_truthy(&v_is_gemini3) {
v_temperature = core_get(
&v_generation_config,
&CoreValue::from("temperature"),
CoreValue::Null,
);
v_missing_temperature = core_is_none(&[v_temperature.clone()])?;
if core_truthy(&v_missing_temperature) {
core_set(
&v_generation_config,
CoreValue::from("temperature"),
CoreValue::Num(1f64),
)?;
} else {
v_too_low = core_lt(&[v_temperature.clone(), CoreValue::Num(1f64)])?;
if core_truthy(&v_too_low) {
core_set(
&v_generation_config,
CoreValue::from("temperature"),
CoreValue::Num(1f64),
)?;
}
}
}
core_set(
&v_payload,
CoreValue::from("generationConfig"),
v_generation_config.clone(),
)?;
v_empty_functions = CoreValue::new_list();
v_functions = core_get(
&v_request,
&CoreValue::from("functions"),
v_empty_functions.clone(),
);
v_has_functions = core_truthy_value(&[v_functions.clone()])?;
if core_truthy(&v_has_functions) {
v_function_declarations = CoreValue::new_list();
for v_fn in core_iter(&v_functions)? {
let mut v_fn = v_fn;
v_decl = _gemini_function_declaration_impl(&[v_fn.clone()])?;
core_append(&v_function_declarations, v_decl.clone())?;
}
v_tool = CoreValue::new_map();
core_set(
&v_tool,
CoreValue::from("function_declarations"),
v_function_declarations.clone(),
)?;
v_tools = CoreValue::new_list();
core_append(&v_tools, v_tool.clone())?;
core_set(&v_payload, CoreValue::from("tools"), v_tools.clone())?;
v_tool_config = _gemini_tool_config_impl(&[v_request.clone()])?;
core_set(
&v_payload,
CoreValue::from("toolConfig"),
v_tool_config.clone(),
)?;
}
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_apply_model_config_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_apply_model_config_impl");
let mut v_payload = core_arg(args, 0);
let mut v_model_config = core_arg(args, 1);
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("maxTokens"),
CoreValue::from("maxOutputTokens"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("max_tokens"),
CoreValue::from("maxOutputTokens"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("temperature"),
CoreValue::from("temperature"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("topP"),
CoreValue::from("topP"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("top_p"),
CoreValue::from("topP"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("topK"),
CoreValue::from("topK"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("top_k"),
CoreValue::from("topK"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("frequencyPenalty"),
CoreValue::from("frequencyPenalty"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("frequency_penalty"),
CoreValue::from("frequencyPenalty"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("n"),
CoreValue::from("candidateCount"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("stopSequences"),
CoreValue::from("stopSequences"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("stop_sequences"),
CoreValue::from("stopSequences"),
])?;
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_message_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_message_impl");
let mut v_message = core_arg(args, 0);
let mut v_args = CoreValue::Null;
let mut v_args_is_string = CoreValue::Null;
let mut v_call = CoreValue::Null;
let mut v_calls = CoreValue::Null;
let mut v_calls_camel = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_empty_args = CoreValue::Null;
let mut v_empty_calls = CoreValue::Null;
let mut v_function = CoreValue::Null;
let mut v_function_call = CoreValue::Null;
let mut v_function_id = CoreValue::Null;
let mut v_function_id_camel = CoreValue::Null;
let mut v_function_response = CoreValue::Null;
let mut v_has_content = CoreValue::Null;
let mut v_is_assistant = CoreValue::Null;
let mut v_is_function = CoreValue::Null;
let mut v_is_user = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_parse_error = CoreValue::Null;
let mut v_parsed = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_response = CoreValue::Null;
let mut v_result_value = CoreValue::Null;
let mut v_role = CoreValue::Null;
let mut v_text_part = CoreValue::Null;
v_role = core_get(&v_message, &CoreValue::from("role"), CoreValue::Null);
v_is_user = core_eq(&[v_role.clone(), CoreValue::from("user")])?;
if core_truthy(&v_is_user) {
v_content = core_get(&v_message, &CoreValue::from("content"), CoreValue::from(""));
v_parts = _gemini_content_parts_impl(&[v_content.clone()])?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("role"), CoreValue::from("user"))?;
core_set(&v_out, CoreValue::from("parts"), v_parts.clone())?;
return Ok(v_out.clone());
}
v_is_assistant = core_eq(&[v_role.clone(), CoreValue::from("assistant")])?;
if core_truthy(&v_is_assistant) {
v_parts = CoreValue::new_list();
v_content = core_get(&v_message, &CoreValue::from("content"), CoreValue::from(""));
v_has_content = core_truthy_value(&[v_content.clone()])?;
if core_truthy(&v_has_content) {
v_text_part = CoreValue::new_map();
core_set(&v_text_part, CoreValue::from("text"), v_content.clone())?;
core_append(&v_parts, v_text_part.clone())?;
}
v_empty_calls = CoreValue::new_list();
v_calls = core_get(
&v_message,
&CoreValue::from("function_calls"),
v_empty_calls.clone(),
);
v_calls_camel = core_get(
&v_message,
&CoreValue::from("functionCalls"),
v_calls.clone(),
);
for v_call in core_iter(&v_calls_camel)? {
let mut v_call = v_call;
v_function = core_get(&v_call, &CoreValue::from("function"), CoreValue::Null);
v_name = core_get(&v_function, &CoreValue::from("name"), CoreValue::Null);
v_empty_args = CoreValue::new_map();
v_args = core_get(
&v_function,
&CoreValue::from("params"),
v_empty_args.clone(),
);
v_args_is_string = core_type_is(&v_args, CoreValue::from("string"));
if core_truthy(&v_args_is_string) {
let __core_try: Result<CoreFlow, AxError> = (|| {
v_parsed = core_json_parse(&[v_args.clone()])?;
v_args = v_parsed.clone();
Ok(CoreFlow::Normal)
})();
match __core_try {
Ok(CoreFlow::Normal) => {}
Ok(CoreFlow::Return(value)) => return Ok(value),
Ok(CoreFlow::Break) => break,
Ok(CoreFlow::Continue) => continue,
Err(__core_caught) => {
v_parse_error = CoreValue::Error(std::rc::Rc::new(__core_caught));
v_args = CoreValue::new_map();
}
}
}
v_function_call = CoreValue::new_map();
core_set(&v_function_call, CoreValue::from("name"), v_name.clone())?;
core_set(&v_function_call, CoreValue::from("args"), v_args.clone())?;
v_part = CoreValue::new_map();
core_set(
&v_part,
CoreValue::from("functionCall"),
v_function_call.clone(),
)?;
core_append(&v_parts, v_part.clone())?;
}
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("role"), CoreValue::from("model"))?;
core_set(&v_out, CoreValue::from("parts"), v_parts.clone())?;
return Ok(v_out.clone());
}
v_is_function = core_eq(&[v_role.clone(), CoreValue::from("function")])?;
if core_truthy(&v_is_function) {
v_name = core_get(&v_message, &CoreValue::from("name"), CoreValue::Null);
v_function_id = core_get(&v_message, &CoreValue::from("function_id"), v_name.clone());
v_function_id_camel = core_get(
&v_message,
&CoreValue::from("functionId"),
v_function_id.clone(),
);
v_result_value = core_get(&v_message, &CoreValue::from("result"), CoreValue::Null);
v_response = CoreValue::new_map();
core_set(
&v_response,
CoreValue::from("result"),
v_result_value.clone(),
)?;
v_function_response = CoreValue::new_map();
core_set(
&v_function_response,
CoreValue::from("name"),
v_function_id_camel.clone(),
)?;
core_set(
&v_function_response,
CoreValue::from("response"),
v_response.clone(),
)?;
v_part = CoreValue::new_map();
core_set(
&v_part,
CoreValue::from("functionResponse"),
v_function_response.clone(),
)?;
v_parts = CoreValue::new_list();
core_append(&v_parts, v_part.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("role"), CoreValue::from("user"))?;
core_set(&v_out, CoreValue::from("parts"), v_parts.clone())?;
return Ok(v_out.clone());
}
v_none = core_none(&[])?;
return Ok(v_none.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_content_parts_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_content_parts_impl");
let mut v_content = core_arg(args, 0);
let mut v_is_list = CoreValue::Null;
let mut v_mapped = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_parts = CoreValue::Null;
v_parts = CoreValue::new_list();
v_is_list = core_type_is(&v_content, CoreValue::from("list"));
if core_truthy(&v_is_list) {
for v_part in core_iter(&v_content)? {
let mut v_part = v_part;
v_mapped = _gemini_content_part_impl(&[v_part.clone()])?;
core_append(&v_parts, v_mapped.clone())?;
}
} else {
v_part = CoreValue::new_map();
core_set(&v_part, CoreValue::from("text"), v_content.clone())?;
core_append(&v_parts, v_part.clone())?;
}
return Ok(v_parts.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_content_part_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_content_part_impl");
let mut v_part = core_arg(args, 0);
let mut v_audio_alt = CoreValue::Null;
let mut v_data = CoreValue::Null;
let mut v_default_mime = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_file_data = CoreValue::Null;
let mut v_file_uri = CoreValue::Null;
let mut v_format = CoreValue::Null;
let mut v_has_uri = CoreValue::Null;
let mut v_image = CoreValue::Null;
let mut v_image_alt = CoreValue::Null;
let mut v_inline = CoreValue::Null;
let mut v_is_audio = CoreValue::Null;
let mut v_is_file = CoreValue::Null;
let mut v_is_image = CoreValue::Null;
let mut v_is_text = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_mime = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_type = CoreValue::Null;
v_type = core_get(&v_part, &CoreValue::from("type"), CoreValue::from("text"));
v_is_text = core_eq(&[v_type.clone(), CoreValue::from("text")])?;
if core_truthy(&v_is_text) {
v_out = CoreValue::new_map();
v_text = core_get(&v_part, &CoreValue::from("text"), CoreValue::from(""));
core_set(&v_out, CoreValue::from("text"), v_text.clone())?;
return Ok(v_out.clone());
}
v_is_image = core_eq(&[v_type.clone(), CoreValue::from("image")])?;
if core_truthy(&v_is_image) {
v_mime = core_get(
&v_part,
&CoreValue::from("mimeType"),
CoreValue::from("image/png"),
);
v_image_alt = core_get(&v_part, &CoreValue::from("data"), CoreValue::Null);
v_image = core_get(&v_part, &CoreValue::from("image"), v_image_alt.clone());
v_inline = CoreValue::new_map();
core_set(&v_inline, CoreValue::from("mimeType"), v_mime.clone())?;
core_set(&v_inline, CoreValue::from("data"), v_image.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("inlineData"), v_inline.clone())?;
return Ok(v_out.clone());
}
v_is_audio = core_eq(&[v_type.clone(), CoreValue::from("audio")])?;
if core_truthy(&v_is_audio) {
v_format = core_get(&v_part, &CoreValue::from("format"), CoreValue::from("wav"));
v_default_mime = core_string_format(&[CoreValue::from("audio/{}"), v_format.clone()])?;
v_mime = core_get(
&v_part,
&CoreValue::from("mimeType"),
v_default_mime.clone(),
);
v_audio_alt = core_get(&v_part, &CoreValue::from("audio"), CoreValue::Null);
v_data = core_get(&v_part, &CoreValue::from("data"), v_audio_alt.clone());
v_inline = CoreValue::new_map();
core_set(&v_inline, CoreValue::from("mimeType"), v_mime.clone())?;
core_set(&v_inline, CoreValue::from("data"), v_data.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("inlineData"), v_inline.clone())?;
return Ok(v_out.clone());
}
v_is_file = core_eq(&[v_type.clone(), CoreValue::from("file")])?;
if core_truthy(&v_is_file) {
v_mime = core_get(
&v_part,
&CoreValue::from("mimeType"),
CoreValue::from("application/octet-stream"),
);
v_file_uri = core_get(&v_part, &CoreValue::from("fileUri"), CoreValue::Null);
v_has_uri = core_truthy_value(&[v_file_uri.clone()])?;
if core_truthy(&v_has_uri) {
v_file_data = CoreValue::new_map();
core_set(&v_file_data, CoreValue::from("mimeType"), v_mime.clone())?;
core_set(&v_file_data, CoreValue::from("fileUri"), v_file_uri.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("fileData"), v_file_data.clone())?;
return Ok(v_out.clone());
} else {
v_data = core_get(&v_part, &CoreValue::from("data"), CoreValue::Null);
v_inline = CoreValue::new_map();
core_set(&v_inline, CoreValue::from("mimeType"), v_mime.clone())?;
core_set(&v_inline, CoreValue::from("data"), v_data.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("inlineData"), v_inline.clone())?;
return Ok(v_out.clone());
}
}
v_message = core_string_format(&[
CoreValue::from("Chat prompt content type not supported: {}"),
v_type.clone(),
])?;
v_error = core_ai_error_unsupported(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_function_declaration_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_function_declaration_impl");
let mut v_fn = core_arg(args, 0);
let mut v_decl = CoreValue::Null;
let mut v_description = CoreValue::Null;
let mut v_empty_parameters = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_parameters = CoreValue::Null;
v_decl = CoreValue::new_map();
v_name = core_get(&v_fn, &CoreValue::from("name"), CoreValue::Null);
v_description = core_get(&v_fn, &CoreValue::from("description"), CoreValue::from(""));
v_empty_parameters = CoreValue::new_map();
v_parameters = core_get(
&v_fn,
&CoreValue::from("parameters"),
v_empty_parameters.clone(),
);
core_set(&v_decl, CoreValue::from("name"), v_name.clone())?;
core_set(
&v_decl,
CoreValue::from("description"),
v_description.clone(),
)?;
core_set(&v_decl, CoreValue::from("parameters"), v_parameters.clone())?;
return Ok(v_decl.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_tool_config_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_tool_config_impl");
let mut v_request = core_arg(args, 0);
let mut v_allowed = CoreValue::Null;
let mut v_config = CoreValue::Null;
let mut v_function = CoreValue::Null;
let mut v_function_call = CoreValue::Null;
let mut v_function_calling = CoreValue::Null;
let mut v_has_name = CoreValue::Null;
let mut v_is_auto = CoreValue::Null;
let mut v_is_none = CoreValue::Null;
let mut v_is_required = CoreValue::Null;
let mut v_name = CoreValue::Null;
v_function_call = core_get(
&v_request,
&CoreValue::from("function_call"),
CoreValue::from("auto"),
);
v_config = CoreValue::new_map();
v_function_calling = CoreValue::new_map();
v_is_none = core_eq(&[v_function_call.clone(), CoreValue::from("none")])?;
v_is_required = core_eq(&[v_function_call.clone(), CoreValue::from("required")])?;
v_is_auto = core_eq(&[v_function_call.clone(), CoreValue::from("auto")])?;
if core_truthy(&v_is_none) {
core_set(
&v_function_calling,
CoreValue::from("mode"),
CoreValue::from("NONE"),
)?;
} else {
if core_truthy(&v_is_required) {
core_set(
&v_function_calling,
CoreValue::from("mode"),
CoreValue::from("ANY"),
)?;
} else {
if core_truthy(&v_is_auto) {
core_set(
&v_function_calling,
CoreValue::from("mode"),
CoreValue::from("AUTO"),
)?;
} else {
core_set(
&v_function_calling,
CoreValue::from("mode"),
CoreValue::from("ANY"),
)?;
v_function = core_get(
&v_function_call,
&CoreValue::from("function"),
CoreValue::Null,
);
v_name = core_get(&v_function, &CoreValue::from("name"), CoreValue::Null);
v_has_name = core_truthy_value(&[v_name.clone()])?;
if core_truthy(&v_has_name) {
v_allowed = CoreValue::new_list();
core_append(&v_allowed, v_name.clone())?;
core_set(
&v_function_calling,
CoreValue::from("allowed_function_names"),
v_allowed.clone(),
)?;
}
}
}
}
core_set(
&v_config,
CoreValue::from("function_calling_config"),
v_function_calling.clone(),
)?;
return Ok(v_config.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_build_embed_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_build_embed_request");
let mut v_request = core_arg(args, 0);
let mut v_content = CoreValue::Null;
let mut v_empty_texts = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_model = CoreValue::Null;
let mut v_model_name = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_requests = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_texts = CoreValue::Null;
v_payload = CoreValue::new_map();
v_empty_texts = CoreValue::new_list();
v_texts = core_get(&v_request, &CoreValue::from("texts"), v_empty_texts.clone());
v_model = core_get(
&v_request,
&CoreValue::from("embed_model"),
CoreValue::from("gemini-embedding-2"),
);
v_requests = CoreValue::new_list();
for v_text in core_iter(&v_texts)? {
let mut v_text = v_text;
v_part = CoreValue::new_map();
core_set(&v_part, CoreValue::from("text"), v_text.clone())?;
v_parts = CoreValue::new_list();
core_append(&v_parts, v_part.clone())?;
v_content = CoreValue::new_map();
core_set(&v_content, CoreValue::from("parts"), v_parts.clone())?;
v_item = CoreValue::new_map();
v_model_name = core_string_format(&[CoreValue::from("models/{}"), v_model.clone()])?;
core_set(&v_item, CoreValue::from("model"), v_model_name.clone())?;
core_set(&v_item, CoreValue::from("content"), v_content.clone())?;
core_append(&v_requests, v_item.clone())?;
}
core_set(&v_payload, CoreValue::from("requests"), v_requests.clone())?;
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_normalize_chat_response(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_normalize_chat_response");
let mut v_raw = core_arg(args, 0);
let mut v_ai_name = core_arg(args, 1);
let mut v_model = core_arg(args, 2);
let mut v_call_count = CoreValue::Null;
let mut v_candidate = CoreValue::Null;
let mut v_candidates = CoreValue::Null;
let mut v_citations = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_content_text = CoreValue::Null;
let mut v_empty_candidates = CoreValue::Null;
let mut v_empty_content = CoreValue::Null;
let mut v_empty_parts = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_finish = CoreValue::Null;
let mut v_function_calls = CoreValue::Null;
let mut v_google = CoreValue::Null;
let mut v_grounding = CoreValue::Null;
let mut v_has_calls = CoreValue::Null;
let mut v_has_citations = CoreValue::Null;
let mut v_has_metadata = CoreValue::Null;
let mut v_has_model_version = CoreValue::Null;
let mut v_has_remote = CoreValue::Null;
let mut v_has_token = CoreValue::Null;
let mut v_has_widget = CoreValue::Null;
let mut v_is_max = CoreValue::Null;
let mut v_is_stop = CoreValue::Null;
let mut v_maps_widget_token = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_metadata = CoreValue::Null;
let mut v_model_usage = CoreValue::Null;
let mut v_model_version = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_raw_model = CoreValue::Null;
let mut v_remote_id = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_results = CoreValue::Null;
let mut v_text_parts = CoreValue::Null;
let mut v_token = CoreValue::Null;
let mut v_usage = CoreValue::Null;
let mut v_usage_raw = CoreValue::Null;
v_empty_candidates = CoreValue::new_list();
v_candidates = core_get(
&v_raw,
&CoreValue::from("candidates"),
v_empty_candidates.clone(),
);
v_results = CoreValue::new_list();
v_maps_widget_token = core_none(&[])?;
for v_candidate in core_iter(&v_candidates)? {
let mut v_candidate = v_candidate;
v_result = CoreValue::new_map();
core_set(&v_result, CoreValue::from("index"), CoreValue::Num(0f64))?;
v_finish = core_get(
&v_candidate,
&CoreValue::from("finishReason"),
CoreValue::from("STOP"),
);
v_is_max = core_eq(&[v_finish.clone(), CoreValue::from("MAX_TOKENS")])?;
if core_truthy(&v_is_max) {
core_set(
&v_result,
CoreValue::from("finish_reason"),
CoreValue::from("length"),
)?;
} else {
v_is_stop = core_eq(&[v_finish.clone(), CoreValue::from("STOP")])?;
if core_truthy(&v_is_stop) {
core_set(
&v_result,
CoreValue::from("finish_reason"),
CoreValue::from("stop"),
)?;
} else {
v_message = core_string_format(&[
CoreValue::from("Gemini finish reason was blocked: {}"),
v_finish.clone(),
])?;
v_error = core_ai_error_refusal(&[v_message.clone(), v_raw.clone()])?;
return Err(core_as_error(&v_error));
}
}
v_empty_content = CoreValue::new_map();
v_content = core_get(
&v_candidate,
&CoreValue::from("content"),
v_empty_content.clone(),
);
v_empty_parts = CoreValue::new_list();
v_parts = core_get(&v_content, &CoreValue::from("parts"), v_empty_parts.clone());
v_text_parts = CoreValue::new_list();
v_function_calls = CoreValue::new_list();
for v_part in core_iter(&v_parts)? {
let mut v_part = v_part;
_gemini_merge_response_part_impl(&[
v_result.clone(),
v_text_parts.clone(),
v_function_calls.clone(),
v_part.clone(),
])?;
}
v_content_text = core_string_join_intrinsic(&[CoreValue::from(""), v_text_parts.clone()])?;
core_set(
&v_result,
CoreValue::from("content"),
v_content_text.clone(),
)?;
core_set(
&v_result,
CoreValue::from("function_calls"),
v_function_calls.clone(),
)?;
v_call_count = core_len(&[v_function_calls.clone()])?;
v_has_calls = core_gt(&[v_call_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_calls) {
core_set(
&v_result,
CoreValue::from("finish_reason"),
CoreValue::from("function_call"),
)?;
}
v_citations = _gemini_extract_citations_impl(&[v_candidate.clone()])?;
v_has_citations = core_truthy_value(&[v_citations.clone()])?;
if core_truthy(&v_has_citations) {
core_set(&v_result, CoreValue::from("citations"), v_citations.clone())?;
}
core_append(&v_results, v_result.clone())?;
v_grounding = core_get(
&v_candidate,
&CoreValue::from("groundingMetadata"),
CoreValue::Null,
);
v_token = core_get(
&v_grounding,
&CoreValue::from("googleMapsWidgetContextToken"),
CoreValue::Null,
);
v_has_token = core_truthy_value(&[v_token.clone()])?;
if core_truthy(&v_has_token) {
v_maps_widget_token = v_token.clone();
}
}
v_usage_raw = core_get(&v_raw, &CoreValue::from("usageMetadata"), CoreValue::Null);
v_usage = _gemini_usage_impl(&[v_usage_raw.clone()])?;
v_model_version = core_get(&v_raw, &CoreValue::from("modelVersion"), CoreValue::Null);
v_raw_model = core_get(&v_raw, &CoreValue::from("modelVersion"), v_model.clone());
v_model_usage =
_ai_model_usage_impl(&[v_ai_name.clone(), v_raw_model.clone(), v_usage.clone()])?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("results"), v_results.clone())?;
v_remote_id = core_get(&v_raw, &CoreValue::from("responseId"), CoreValue::Null);
v_has_remote = core_truthy_value(&[v_remote_id.clone()])?;
if core_truthy(&v_has_remote) {
core_set(&v_out, CoreValue::from("remote_id"), v_remote_id.clone())?;
}
core_set(
&v_out,
CoreValue::from("model_usage"),
v_model_usage.clone(),
)?;
v_has_model_version = core_truthy_value(&[v_model_version.clone()])?;
v_has_widget = core_is_not_none(&[v_maps_widget_token.clone()])?;
v_has_metadata = core_or(&[v_has_model_version.clone(), v_has_widget.clone()])?;
if core_truthy(&v_has_metadata) {
v_google = CoreValue::new_map();
if core_truthy(&v_has_model_version) {
core_set(
&v_google,
CoreValue::from("modelVersion"),
v_model_version.clone(),
)?;
}
if core_truthy(&v_has_widget) {
core_set(
&v_google,
CoreValue::from("mapsWidgetContextToken"),
v_maps_widget_token.clone(),
)?;
}
v_metadata = CoreValue::new_map();
core_set(&v_metadata, CoreValue::from("google"), v_google.clone())?;
core_set(
&v_out,
CoreValue::from("provider_metadata"),
v_metadata.clone(),
)?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_merge_response_part_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_merge_response_part_impl");
let mut v_result = core_arg(args, 0);
let mut v_text_parts = core_arg(args, 1);
let mut v_function_calls = core_arg(args, 2);
let mut v_part = core_arg(args, 3);
let mut v_args = CoreValue::Null;
let mut v_call = CoreValue::Null;
let mut v_empty_args = CoreValue::Null;
let mut v_function = CoreValue::Null;
let mut v_function_call = CoreValue::Null;
let mut v_has_call = CoreValue::Null;
let mut v_has_text = CoreValue::Null;
let mut v_is_thought = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_text = CoreValue::Null;
v_text = core_get(&v_part, &CoreValue::from("text"), CoreValue::Null);
v_has_text = core_is_not_none(&[v_text.clone()])?;
if core_truthy(&v_has_text) {
v_is_thought = core_get(&v_part, &CoreValue::from("thought"), CoreValue::Bool(false));
if core_truthy(&v_is_thought) {
core_set(&v_result, CoreValue::from("thought"), v_text.clone())?;
} else {
core_append(&v_text_parts, v_text.clone())?;
}
}
v_function_call = core_get(&v_part, &CoreValue::from("functionCall"), CoreValue::Null);
v_has_call = core_is_not_none(&[v_function_call.clone()])?;
if core_truthy(&v_has_call) {
v_name = core_get(&v_function_call, &CoreValue::from("name"), CoreValue::Null);
v_empty_args = CoreValue::new_map();
v_args = core_get(
&v_function_call,
&CoreValue::from("args"),
v_empty_args.clone(),
);
v_function = CoreValue::new_map();
core_set(&v_function, CoreValue::from("name"), v_name.clone())?;
core_set(&v_function, CoreValue::from("params"), v_args.clone())?;
v_call = CoreValue::new_map();
core_set(&v_call, CoreValue::from("id"), v_name.clone())?;
core_set(
&v_call,
CoreValue::from("type"),
CoreValue::from("function"),
)?;
core_set(&v_call, CoreValue::from("function"), v_function.clone())?;
core_append(&v_function_calls, v_call.clone())?;
}
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_extract_citations_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_extract_citations_impl");
let mut v_candidate = core_arg(args, 0);
let mut v_chunk = CoreValue::Null;
let mut v_chunks = CoreValue::Null;
let mut v_citation = CoreValue::Null;
let mut v_citation_meta = CoreValue::Null;
let mut v_citations = CoreValue::Null;
let mut v_empty_citations = CoreValue::Null;
let mut v_grounding = CoreValue::Null;
let mut v_has_license = CoreValue::Null;
let mut v_has_maps = CoreValue::Null;
let mut v_has_media = CoreValue::Null;
let mut v_has_pages = CoreValue::Null;
let mut v_has_retrieved = CoreValue::Null;
let mut v_has_retrieved_uri = CoreValue::Null;
let mut v_has_title = CoreValue::Null;
let mut v_has_uri = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_license = CoreValue::Null;
let mut v_maps = CoreValue::Null;
let mut v_maps_uri = CoreValue::Null;
let mut v_media_id = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_pages = CoreValue::Null;
let mut v_retrieved = CoreValue::Null;
let mut v_retrieved_uri = CoreValue::Null;
let mut v_title = CoreValue::Null;
let mut v_uri = CoreValue::Null;
let mut v_url = CoreValue::Null;
v_out = CoreValue::new_list();
v_citation_meta = core_get(
&v_candidate,
&CoreValue::from("citationMetadata"),
CoreValue::Null,
);
v_empty_citations = CoreValue::new_list();
v_citations = core_get(
&v_citation_meta,
&CoreValue::from("citations"),
v_empty_citations.clone(),
);
for v_citation in core_iter(&v_citations)? {
let mut v_citation = v_citation;
v_uri = core_get(&v_citation, &CoreValue::from("uri"), CoreValue::Null);
v_has_uri = core_truthy_value(&[v_uri.clone()])?;
if core_truthy(&v_has_uri) {
v_item = CoreValue::new_map();
core_set(&v_item, CoreValue::from("url"), v_uri.clone())?;
v_title = core_get(&v_citation, &CoreValue::from("title"), CoreValue::Null);
v_has_title = core_is_not_none(&[v_title.clone()])?;
if core_truthy(&v_has_title) {
core_set(&v_item, CoreValue::from("title"), v_title.clone())?;
}
v_license = core_get(&v_citation, &CoreValue::from("license"), CoreValue::Null);
v_has_license = core_is_not_none(&[v_license.clone()])?;
if core_truthy(&v_has_license) {
core_set(&v_item, CoreValue::from("license"), v_license.clone())?;
}
core_append(&v_out, v_item.clone())?;
}
}
v_grounding = core_get(
&v_candidate,
&CoreValue::from("groundingMetadata"),
CoreValue::Null,
);
v_chunks = core_get(
&v_grounding,
&CoreValue::from("groundingChunks"),
v_empty_citations.clone(),
);
for v_chunk in core_iter(&v_chunks)? {
let mut v_chunk = v_chunk;
v_maps = core_get(&v_chunk, &CoreValue::from("maps"), CoreValue::Null);
v_maps_uri = core_get(&v_maps, &CoreValue::from("uri"), CoreValue::Null);
v_has_maps = core_truthy_value(&[v_maps_uri.clone()])?;
if core_truthy(&v_has_maps) {
v_item = CoreValue::new_map();
core_set(&v_item, CoreValue::from("url"), v_maps_uri.clone())?;
v_title = core_get(&v_maps, &CoreValue::from("title"), CoreValue::Null);
v_has_title = core_is_not_none(&[v_title.clone()])?;
if core_truthy(&v_has_title) {
core_set(&v_item, CoreValue::from("title"), v_title.clone())?;
}
core_append(&v_out, v_item.clone())?;
}
v_retrieved = core_get(
&v_chunk,
&CoreValue::from("retrievedContext"),
CoreValue::Null,
);
v_retrieved_uri = core_get(&v_retrieved, &CoreValue::from("uri"), CoreValue::Null);
v_media_id = core_get(&v_retrieved, &CoreValue::from("media_id"), CoreValue::Null);
v_has_retrieved_uri = core_truthy_value(&[v_retrieved_uri.clone()])?;
v_has_media = core_truthy_value(&[v_media_id.clone()])?;
v_has_retrieved = core_or(&[v_has_retrieved_uri.clone(), v_has_media.clone()])?;
if core_truthy(&v_has_retrieved) {
v_item = CoreValue::new_map();
v_url = core_get(&v_retrieved, &CoreValue::from("uri"), CoreValue::from(""));
core_set(&v_item, CoreValue::from("url"), v_url.clone())?;
v_title = core_get(&v_retrieved, &CoreValue::from("title"), CoreValue::Null);
v_has_title = core_is_not_none(&[v_title.clone()])?;
if core_truthy(&v_has_title) {
core_set(&v_item, CoreValue::from("title"), v_title.clone())?;
}
if core_truthy(&v_has_media) {
core_set(&v_item, CoreValue::from("mediaId"), v_media_id.clone())?;
}
v_pages = core_get(
&v_retrieved,
&CoreValue::from("page_numbers"),
CoreValue::Null,
);
v_has_pages = core_is_not_none(&[v_pages.clone()])?;
if core_truthy(&v_has_pages) {
core_set(&v_item, CoreValue::from("pageNumbers"), v_pages.clone())?;
}
core_append(&v_out, v_item.clone())?;
}
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_usage_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_usage_impl");
let mut v_usage = core_arg(args, 0);
let mut v_cached = CoreValue::Null;
let mut v_completion = CoreValue::Null;
let mut v_has_cached = CoreValue::Null;
let mut v_has_thoughts = CoreValue::Null;
let mut v_has_usage = CoreValue::Null;
let mut v_negative_cached = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_prompt = CoreValue::Null;
let mut v_prompt_raw = CoreValue::Null;
let mut v_thoughts = CoreValue::Null;
let mut v_total = CoreValue::Null;
v_has_usage = core_truthy_value(&[v_usage.clone()])?;
if core_truthy(&v_has_usage) {
} else {
v_none = core_none(&[])?;
return Ok(v_none.clone());
}
v_out = CoreValue::new_map();
v_cached = core_get(
&v_usage,
&CoreValue::from("cachedContentTokenCount"),
CoreValue::Num(0f64),
);
v_prompt_raw = core_get(
&v_usage,
&CoreValue::from("promptTokenCount"),
CoreValue::Num(0f64),
);
v_negative_cached = core_mul(&[CoreValue::Num(-1f64), v_cached.clone()])?;
v_prompt = core_add(&[v_prompt_raw.clone(), v_negative_cached.clone()])?;
v_completion = core_get(
&v_usage,
&CoreValue::from("candidatesTokenCount"),
CoreValue::Num(0f64),
);
v_total = core_get(
&v_usage,
&CoreValue::from("totalTokenCount"),
CoreValue::Num(0f64),
);
core_set(&v_out, CoreValue::from("prompt_tokens"), v_prompt.clone())?;
core_set(
&v_out,
CoreValue::from("completion_tokens"),
v_completion.clone(),
)?;
core_set(&v_out, CoreValue::from("total_tokens"), v_total.clone())?;
v_thoughts = core_get(
&v_usage,
&CoreValue::from("thoughtsTokenCount"),
CoreValue::Null,
);
v_has_thoughts = core_is_not_none(&[v_thoughts.clone()])?;
if core_truthy(&v_has_thoughts) {
core_set(
&v_out,
CoreValue::from("reasoning_tokens"),
v_thoughts.clone(),
)?;
}
v_has_cached = core_gt(&[v_cached.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_cached) {
core_set(
&v_out,
CoreValue::from("cache_read_tokens"),
v_cached.clone(),
)?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _gemini_normalize_embed_response(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_gemini_normalize_embed_response");
let mut v_raw = core_arg(args, 0);
let mut v_ai_name = core_arg(args, 1);
let mut v_model = core_arg(args, 2);
let mut v_embedding = CoreValue::Null;
let mut v_embeddings = CoreValue::Null;
let mut v_empty_predictions = CoreValue::Null;
let mut v_empty_raw_embeddings = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_prediction = CoreValue::Null;
let mut v_prediction_embedding = CoreValue::Null;
let mut v_predictions = CoreValue::Null;
let mut v_raw_embeddings = CoreValue::Null;
let mut v_values = CoreValue::Null;
v_out = CoreValue::new_map();
v_embeddings = CoreValue::new_list();
v_empty_raw_embeddings = CoreValue::new_list();
v_raw_embeddings = core_get(
&v_raw,
&CoreValue::from("embeddings"),
v_empty_raw_embeddings.clone(),
);
for v_embedding in core_iter(&v_raw_embeddings)? {
let mut v_embedding = v_embedding;
v_values = core_get(
&v_embedding,
&CoreValue::from("values"),
v_embedding.clone(),
);
core_append(&v_embeddings, v_values.clone())?;
}
v_empty_predictions = CoreValue::new_list();
v_predictions = core_get(
&v_raw,
&CoreValue::from("predictions"),
v_empty_predictions.clone(),
);
for v_prediction in core_iter(&v_predictions)? {
let mut v_prediction = v_prediction;
v_prediction_embedding = core_get(
&v_prediction,
&CoreValue::from("embeddings"),
CoreValue::Null,
);
v_values = core_get(
&v_prediction_embedding,
&CoreValue::from("values"),
v_prediction_embedding.clone(),
);
core_append(&v_embeddings, v_values.clone())?;
}
core_set(&v_out, CoreValue::from("embeddings"), v_embeddings.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _anthropic_build_chat_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_anthropic_build_chat_request");
let mut v_request = core_arg(args, 0);
let mut v_cache = CoreValue::Null;
let mut v_cache_control = CoreValue::Null;
let mut v_empty_functions = CoreValue::Null;
let mut v_empty_model_config = CoreValue::Null;
let mut v_empty_prompt = CoreValue::Null;
let mut v_fn = CoreValue::Null;
let mut v_format = CoreValue::Null;
let mut v_format_type = CoreValue::Null;
let mut v_functions = CoreValue::Null;
let mut v_has_choice = CoreValue::Null;
let mut v_has_functions = CoreValue::Null;
let mut v_has_response_format = CoreValue::Null;
let mut v_has_system = CoreValue::Null;
let mut v_hoist = CoreValue::Null;
let mut v_hoist_later = CoreValue::Null;
let mut v_is_json_schema = CoreValue::Null;
let mut v_is_system = CoreValue::Null;
let mut v_mapped = CoreValue::Null;
let mut v_mapped_system = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_messages = CoreValue::Null;
let mut v_model = CoreValue::Null;
let mut v_model_config = CoreValue::Null;
let mut v_output_config = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_prompt = CoreValue::Null;
let mut v_response_format = CoreValue::Null;
let mut v_role = CoreValue::Null;
let mut v_schema = CoreValue::Null;
let mut v_schema_container = CoreValue::Null;
let mut v_seen_non_system = CoreValue::Null;
let mut v_should_preserve = CoreValue::Null;
let mut v_supports_mid = CoreValue::Null;
let mut v_sys_item = CoreValue::Null;
let mut v_sys_text = CoreValue::Null;
let mut v_system = CoreValue::Null;
let mut v_system_count = CoreValue::Null;
let mut v_tool = CoreValue::Null;
let mut v_tool_choice = CoreValue::Null;
let mut v_tools = CoreValue::Null;
v_payload = CoreValue::new_map();
v_model = core_get(
&v_request,
&CoreValue::from("model"),
CoreValue::from("claude-3-7-sonnet-latest"),
);
core_set(&v_payload, CoreValue::from("model"), v_model.clone())?;
v_empty_prompt = CoreValue::new_list();
v_prompt = core_get(
&v_request,
&CoreValue::from("chat_prompt"),
v_empty_prompt.clone(),
);
v_supports_mid =
core_string_starts_with(&[v_model.clone(), CoreValue::from("claude-opus-4-8")])?;
v_system = CoreValue::new_list();
v_messages = CoreValue::new_list();
v_seen_non_system = CoreValue::Bool(false);
for v_message in core_iter(&v_prompt)? {
let mut v_message = v_message;
v_role = core_get(&v_message, &CoreValue::from("role"), CoreValue::from(""));
v_is_system = core_eq(&[v_role.clone(), CoreValue::from("system")])?;
if core_truthy(&v_is_system) {
v_hoist_later = core_not(&[v_supports_mid.clone()])?;
v_hoist = core_or(&[v_hoist_later.clone(), v_seen_non_system.clone()])?;
v_should_preserve = core_and(&[v_supports_mid.clone(), v_seen_non_system.clone()])?;
if core_truthy(&v_should_preserve) {
v_mapped_system = _anthropic_message_impl(&[v_message.clone()])?;
core_append(&v_messages, v_mapped_system.clone())?;
} else {
v_sys_item = CoreValue::new_map();
core_set(
&v_sys_item,
CoreValue::from("type"),
CoreValue::from("text"),
)?;
v_sys_text = core_get(&v_message, &CoreValue::from("content"), CoreValue::from(""));
core_set(&v_sys_item, CoreValue::from("text"), v_sys_text.clone())?;
v_cache = core_get(
&v_message,
&CoreValue::from("cache"),
CoreValue::Bool(false),
);
if core_truthy(&v_cache) {
v_cache_control =
core_json_parse(&[CoreValue::from("{\"type\":\"ephemeral\"}")])?;
core_set(
&v_sys_item,
CoreValue::from("cache_control"),
v_cache_control.clone(),
)?;
}
core_append(&v_system, v_sys_item.clone())?;
}
} else {
v_seen_non_system = CoreValue::Bool(true);
v_mapped = _anthropic_message_impl(&[v_message.clone()])?;
core_append(&v_messages, v_mapped.clone())?;
}
}
v_system_count = core_len(&[v_system.clone()])?;
v_has_system = core_gt(&[v_system_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_system) {
core_set(&v_payload, CoreValue::from("system"), v_system.clone())?;
}
core_set(&v_payload, CoreValue::from("messages"), v_messages.clone())?;
v_empty_model_config = CoreValue::new_map();
v_model_config = core_get(
&v_request,
&CoreValue::from("model_config"),
v_empty_model_config.clone(),
);
_anthropic_apply_model_config_impl(&[
v_payload.clone(),
v_model_config.clone(),
v_model.clone(),
])?;
v_response_format = core_get(
&v_request,
&CoreValue::from("response_format"),
CoreValue::Null,
);
v_has_response_format = core_truthy_value(&[v_response_format.clone()])?;
if core_truthy(&v_has_response_format) {
v_format_type = core_get(
&v_response_format,
&CoreValue::from("type"),
CoreValue::from(""),
);
v_is_json_schema = core_eq(&[v_format_type.clone(), CoreValue::from("json_schema")])?;
if core_truthy(&v_is_json_schema) {
v_schema_container = core_get(
&v_response_format,
&CoreValue::from("schema"),
CoreValue::Null,
);
v_schema = core_get(
&v_schema_container,
&CoreValue::from("schema"),
v_schema_container.clone(),
);
v_output_config = core_get(
&v_payload,
&CoreValue::from("output_config"),
v_empty_model_config.clone(),
);
v_format = CoreValue::new_map();
core_set(
&v_format,
CoreValue::from("type"),
CoreValue::from("json_schema"),
)?;
core_set(&v_format, CoreValue::from("schema"), v_schema.clone())?;
core_set(
&v_output_config,
CoreValue::from("format"),
v_format.clone(),
)?;
core_set(
&v_payload,
CoreValue::from("output_config"),
v_output_config.clone(),
)?;
}
}
v_empty_functions = CoreValue::new_list();
v_functions = core_get(
&v_request,
&CoreValue::from("functions"),
v_empty_functions.clone(),
);
v_has_functions = core_truthy_value(&[v_functions.clone()])?;
if core_truthy(&v_has_functions) {
v_tools = CoreValue::new_list();
for v_fn in core_iter(&v_functions)? {
let mut v_fn = v_fn;
v_tool = _anthropic_tool_spec_impl(&[v_fn.clone()])?;
core_append(&v_tools, v_tool.clone())?;
}
core_set(&v_payload, CoreValue::from("tools"), v_tools.clone())?;
v_tool_choice = _anthropic_tool_choice_impl(&[v_request.clone()])?;
v_has_choice = core_is_not_none(&[v_tool_choice.clone()])?;
if core_truthy(&v_has_choice) {
core_set(
&v_payload,
CoreValue::from("tool_choice"),
v_tool_choice.clone(),
)?;
}
}
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _anthropic_apply_model_config_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_anthropic_apply_model_config_impl");
let mut v_payload = core_arg(args, 0);
let mut v_model_config = core_arg(args, 1);
let mut v_model = core_arg(args, 2);
let mut v_budget = CoreValue::Null;
let mut v_budget_alt = CoreValue::Null;
let mut v_effort = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_has_budget = CoreValue::Null;
let mut v_has_effort = CoreValue::Null;
let mut v_has_max = CoreValue::Null;
let mut v_has_n = CoreValue::Null;
let mut v_has_output = CoreValue::Null;
let mut v_has_thinking = CoreValue::Null;
let mut v_missing_max = CoreValue::Null;
let mut v_n = CoreValue::Null;
let mut v_output_config = CoreValue::Null;
let mut v_thinking = CoreValue::Null;
let mut v_thinking_config = CoreValue::Null;
let mut v_too_many = CoreValue::Null;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("maxTokens"),
CoreValue::from("max_tokens"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("max_tokens"),
CoreValue::from("max_tokens"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("stopSequences"),
CoreValue::from("stop_sequences"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("stop_sequences"),
CoreValue::from("stop_sequences"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("temperature"),
CoreValue::from("temperature"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("topP"),
CoreValue::from("top_p"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("top_p"),
CoreValue::from("top_p"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("topK"),
CoreValue::from("top_k"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("top_k"),
CoreValue::from("top_k"),
])?;
_openai_copy_config_key_impl(&[
v_payload.clone(),
v_model_config.clone(),
CoreValue::from("stream"),
CoreValue::from("stream"),
])?;
v_has_max = core_get(&v_payload, &CoreValue::from("max_tokens"), CoreValue::Null);
v_missing_max = core_is_none(&[v_has_max.clone()])?;
if core_truthy(&v_missing_max) {
core_set(
&v_payload,
CoreValue::from("max_tokens"),
CoreValue::Num(40000f64),
)?;
}
v_n = core_get(&v_model_config, &CoreValue::from("n"), CoreValue::Null);
v_has_n = core_is_not_none(&[v_n.clone()])?;
if core_truthy(&v_has_n) {
v_too_many = core_gt(&[v_n.clone(), CoreValue::Num(1f64)])?;
if core_truthy(&v_too_many) {
v_error = core_ai_error_unsupported(&[CoreValue::from(
"Anthropic does not support sampling (n > 1)",
)])?;
return Err(core_as_error(&v_error));
}
}
v_budget = core_get(
&v_model_config,
&CoreValue::from("thinkingTokenBudget"),
CoreValue::Null,
);
v_budget_alt = core_get(
&v_model_config,
&CoreValue::from("thinking_token_budget"),
v_budget.clone(),
);
v_has_budget = core_truthy_value(&[v_budget_alt.clone()])?;
if core_truthy(&v_has_budget) {
v_thinking_config =
_anthropic_thinking_config_impl(&[v_model.clone(), v_budget_alt.clone()])?;
v_thinking = core_get(
&v_thinking_config,
&CoreValue::from("thinking"),
CoreValue::Null,
);
v_has_thinking = core_is_not_none(&[v_thinking.clone()])?;
if core_truthy(&v_has_thinking) {
core_set(&v_payload, CoreValue::from("thinking"), v_thinking.clone())?;
}
v_output_config = core_get(
&v_thinking_config,
&CoreValue::from("output_config"),
CoreValue::Null,
);
v_has_output = core_is_not_none(&[v_output_config.clone()])?;
if core_truthy(&v_has_output) {
core_set(
&v_payload,
CoreValue::from("output_config"),
v_output_config.clone(),
)?;
}
}
v_effort = core_get(&v_model_config, &CoreValue::from("effort"), CoreValue::Null);
v_has_effort = core_truthy_value(&[v_effort.clone()])?;
if core_truthy(&v_has_effort) {
v_output_config = core_get(
&v_payload,
&CoreValue::from("output_config"),
v_model_config.clone(),
);
core_set(
&v_output_config,
CoreValue::from("effort"),
v_effort.clone(),
)?;
core_set(
&v_payload,
CoreValue::from("output_config"),
v_output_config.clone(),
)?;
}
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _anthropic_thinking_config_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_anthropic_thinking_config_impl");
let mut v_model = core_arg(args, 0);
let mut v_level = core_arg(args, 1);
let mut v_budget = CoreValue::Null;
let mut v_effort = CoreValue::Null;
let mut v_is_45 = CoreValue::Null;
let mut v_is_46 = CoreValue::Null;
let mut v_is_47 = CoreValue::Null;
let mut v_is_47_plus = CoreValue::Null;
let mut v_is_48 = CoreValue::Null;
let mut v_is_adaptive = CoreValue::Null;
let mut v_is_adaptive_opus = CoreValue::Null;
let mut v_is_high = CoreValue::Null;
let mut v_is_highest = CoreValue::Null;
let mut v_is_low = CoreValue::Null;
let mut v_is_max = CoreValue::Null;
let mut v_is_minimal = CoreValue::Null;
let mut v_is_none = CoreValue::Null;
let mut v_is_sonnet_5 = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_output_config = CoreValue::Null;
let mut v_thinking = CoreValue::Null;
v_out = CoreValue::new_map();
v_is_none = core_eq(&[v_level.clone(), CoreValue::from("none")])?;
if core_truthy(&v_is_none) {
return Ok(v_out.clone());
}
v_budget = CoreValue::Num(10000f64);
v_effort = CoreValue::from("medium");
v_is_minimal = core_eq(&[v_level.clone(), CoreValue::from("minimal")])?;
if core_truthy(&v_is_minimal) {
v_budget = CoreValue::Num(1024f64);
v_effort = CoreValue::from("low");
}
v_is_low = core_eq(&[v_level.clone(), CoreValue::from("low")])?;
if core_truthy(&v_is_low) {
v_budget = CoreValue::Num(5000f64);
v_effort = CoreValue::from("low");
}
v_is_high = core_eq(&[v_level.clone(), CoreValue::from("high")])?;
if core_truthy(&v_is_high) {
v_budget = CoreValue::Num(20000f64);
v_effort = CoreValue::from("high");
}
v_is_highest = core_eq(&[v_level.clone(), CoreValue::from("highest")])?;
if core_truthy(&v_is_highest) {
v_budget = CoreValue::Num(32000f64);
v_effort = CoreValue::from("max");
}
v_is_48 = core_string_starts_with(&[v_model.clone(), CoreValue::from("claude-opus-4-8")])?;
v_is_47 = core_string_starts_with(&[v_model.clone(), CoreValue::from("claude-opus-4-7")])?;
v_is_46 = core_string_starts_with(&[v_model.clone(), CoreValue::from("claude-opus-4-6")])?;
v_is_sonnet_5 =
core_string_starts_with(&[v_model.clone(), CoreValue::from("claude-sonnet-5")])?;
v_is_47_plus = core_or(&[v_is_48.clone(), v_is_47.clone()])?;
v_is_adaptive_opus = core_or(&[v_is_47_plus.clone(), v_is_46.clone()])?;
v_is_adaptive = core_or(&[v_is_adaptive_opus.clone(), v_is_sonnet_5.clone()])?;
if core_truthy(&v_is_adaptive) {
v_thinking = CoreValue::new_map();
core_set(
&v_thinking,
CoreValue::from("type"),
CoreValue::from("adaptive"),
)?;
core_set(&v_out, CoreValue::from("thinking"), v_thinking.clone())?;
v_output_config = CoreValue::new_map();
core_set(
&v_output_config,
CoreValue::from("effort"),
v_effort.clone(),
)?;
core_set(
&v_out,
CoreValue::from("output_config"),
v_output_config.clone(),
)?;
} else {
v_thinking = CoreValue::new_map();
core_set(
&v_thinking,
CoreValue::from("type"),
CoreValue::from("enabled"),
)?;
core_set(
&v_thinking,
CoreValue::from("budget_tokens"),
v_budget.clone(),
)?;
core_set(&v_out, CoreValue::from("thinking"), v_thinking.clone())?;
v_is_45 = core_string_starts_with(&[v_model.clone(), CoreValue::from("claude-opus-4-5")])?;
if core_truthy(&v_is_45) {
v_output_config = CoreValue::new_map();
v_is_max = core_eq(&[v_effort.clone(), CoreValue::from("max")])?;
if core_truthy(&v_is_max) {
core_set(
&v_output_config,
CoreValue::from("effort"),
CoreValue::from("high"),
)?;
} else {
core_set(
&v_output_config,
CoreValue::from("effort"),
v_effort.clone(),
)?;
}
core_set(
&v_out,
CoreValue::from("output_config"),
v_output_config.clone(),
)?;
}
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _anthropic_message_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_anthropic_message_impl");
let mut v_message = core_arg(args, 0);
let mut v_block = CoreValue::Null;
let mut v_blocks = CoreValue::Null;
let mut v_cache = CoreValue::Null;
let mut v_cache_control = CoreValue::Null;
let mut v_call = CoreValue::Null;
let mut v_calls = CoreValue::Null;
let mut v_calls_camel = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_content_is_string = CoreValue::Null;
let mut v_content_value = CoreValue::Null;
let mut v_count = CoreValue::Null;
let mut v_empty_calls = CoreValue::Null;
let mut v_function = CoreValue::Null;
let mut v_function_id = CoreValue::Null;
let mut v_function_id_camel = CoreValue::Null;
let mut v_has_blocks = CoreValue::Null;
let mut v_has_content = CoreValue::Null;
let mut v_has_parts = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_index = CoreValue::Null;
let mut v_is_assistant = CoreValue::Null;
let mut v_is_error = CoreValue::Null;
let mut v_is_error_camel = CoreValue::Null;
let mut v_is_function = CoreValue::Null;
let mut v_is_system = CoreValue::Null;
let mut v_last = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_not_cache = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_params = CoreValue::Null;
let mut v_params_is_string = CoreValue::Null;
let mut v_parse_error = CoreValue::Null;
let mut v_parsed = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_plain_string = CoreValue::Null;
let mut v_raw_content = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_role = CoreValue::Null;
let mut v_system_content = CoreValue::Null;
let mut v_text_block = CoreValue::Null;
let mut v_tool_use = CoreValue::Null;
v_role = core_get(
&v_message,
&CoreValue::from("role"),
CoreValue::from("user"),
);
v_out = CoreValue::new_map();
v_is_system = core_eq(&[v_role.clone(), CoreValue::from("system")])?;
if core_truthy(&v_is_system) {
core_set(&v_out, CoreValue::from("role"), CoreValue::from("system"))?;
v_system_content = core_get(&v_message, &CoreValue::from("content"), CoreValue::from(""));
core_set(&v_out, CoreValue::from("content"), v_system_content.clone())?;
return Ok(v_out.clone());
}
v_is_function = core_eq(&[v_role.clone(), CoreValue::from("function")])?;
if core_truthy(&v_is_function) {
core_set(&v_out, CoreValue::from("role"), CoreValue::from("user"))?;
v_content = CoreValue::new_list();
v_block = CoreValue::new_map();
core_set(
&v_block,
CoreValue::from("type"),
CoreValue::from("tool_result"),
)?;
v_result = core_get(&v_message, &CoreValue::from("result"), CoreValue::from(""));
core_set(&v_block, CoreValue::from("content"), v_result.clone())?;
v_function_id = core_get(&v_message, &CoreValue::from("function_id"), CoreValue::Null);
v_function_id_camel = core_get(
&v_message,
&CoreValue::from("functionId"),
v_function_id.clone(),
);
core_set(
&v_block,
CoreValue::from("tool_use_id"),
v_function_id_camel.clone(),
)?;
v_is_error = core_get(
&v_message,
&CoreValue::from("is_error"),
CoreValue::Bool(false),
);
v_is_error_camel = core_get(&v_message, &CoreValue::from("isError"), v_is_error.clone());
if core_truthy(&v_is_error_camel) {
core_set(&v_block, CoreValue::from("is_error"), CoreValue::Bool(true))?;
}
v_cache = core_get(
&v_message,
&CoreValue::from("cache"),
CoreValue::Bool(false),
);
if core_truthy(&v_cache) {
v_cache_control = core_json_parse(&[CoreValue::from("{\"type\":\"ephemeral\"}")])?;
core_set(
&v_block,
CoreValue::from("cache_control"),
v_cache_control.clone(),
)?;
}
core_append(&v_content, v_block.clone())?;
core_set(&v_out, CoreValue::from("content"), v_content.clone())?;
return Ok(v_out.clone());
}
v_is_assistant = core_eq(&[v_role.clone(), CoreValue::from("assistant")])?;
if core_truthy(&v_is_assistant) {
core_set(
&v_out,
CoreValue::from("role"),
CoreValue::from("assistant"),
)?;
v_blocks = CoreValue::new_list();
v_content_value = core_get(&v_message, &CoreValue::from("content"), CoreValue::from(""));
v_has_content = core_truthy_value(&[v_content_value.clone()])?;
if core_truthy(&v_has_content) {
v_text_block = CoreValue::new_map();
core_set(
&v_text_block,
CoreValue::from("type"),
CoreValue::from("text"),
)?;
core_set(
&v_text_block,
CoreValue::from("text"),
v_content_value.clone(),
)?;
core_append(&v_blocks, v_text_block.clone())?;
}
v_empty_calls = CoreValue::new_list();
v_calls = core_get(
&v_message,
&CoreValue::from("function_calls"),
v_empty_calls.clone(),
);
v_calls_camel = core_get(
&v_message,
&CoreValue::from("functionCalls"),
v_calls.clone(),
);
for v_call in core_iter(&v_calls_camel)? {
let mut v_call = v_call;
v_function = core_get(&v_call, &CoreValue::from("function"), CoreValue::Null);
v_name = core_get(&v_function, &CoreValue::from("name"), CoreValue::from(""));
v_params = core_get(
&v_function,
&CoreValue::from("params"),
v_empty_calls.clone(),
);
v_params_is_string = core_type_is(&v_params, CoreValue::from("string"));
if core_truthy(&v_params_is_string) {
let __core_try: Result<CoreFlow, AxError> = (|| {
v_parsed = core_json_parse(&[v_params.clone()])?;
v_params = v_parsed.clone();
Ok(CoreFlow::Normal)
})();
match __core_try {
Ok(CoreFlow::Normal) => {}
Ok(CoreFlow::Return(value)) => return Ok(value),
Ok(CoreFlow::Break) => break,
Ok(CoreFlow::Continue) => continue,
Err(__core_caught) => {
v_parse_error = CoreValue::Error(std::rc::Rc::new(__core_caught));
v_params = CoreValue::new_map();
}
}
}
v_tool_use = CoreValue::new_map();
core_set(
&v_tool_use,
CoreValue::from("type"),
CoreValue::from("tool_use"),
)?;
v_id = core_get(&v_call, &CoreValue::from("id"), v_name.clone());
core_set(&v_tool_use, CoreValue::from("id"), v_id.clone())?;
core_set(&v_tool_use, CoreValue::from("name"), v_name.clone())?;
core_set(&v_tool_use, CoreValue::from("input"), v_params.clone())?;
core_append(&v_blocks, v_tool_use.clone())?;
}
v_cache = core_get(
&v_message,
&CoreValue::from("cache"),
CoreValue::Bool(false),
);
if core_truthy(&v_cache) {
v_count = core_len(&[v_blocks.clone()])?;
v_has_blocks = core_gt(&[v_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_blocks) {
v_index = core_add(&[v_count.clone(), CoreValue::Num(-1f64)])?;
v_last = core_get(&v_blocks, &v_index.clone(), CoreValue::Null);
v_cache_control = core_json_parse(&[CoreValue::from("{\"type\":\"ephemeral\"}")])?;
core_set(
&v_last,
CoreValue::from("cache_control"),
v_cache_control.clone(),
)?;
}
}
v_count = core_len(&[v_blocks.clone()])?;
v_has_blocks = core_gt(&[v_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_blocks) {
core_set(&v_out, CoreValue::from("content"), v_blocks.clone())?;
} else {
core_set(&v_out, CoreValue::from("content"), CoreValue::from(""))?;
}
return Ok(v_out.clone());
}
core_set(&v_out, CoreValue::from("role"), CoreValue::from("user"))?;
v_raw_content = core_get(&v_message, &CoreValue::from("content"), CoreValue::from(""));
v_cache = core_get(
&v_message,
&CoreValue::from("cache"),
CoreValue::Bool(false),
);
v_content_is_string = core_type_is(&v_raw_content, CoreValue::from("string"));
v_not_cache = core_not(&[v_cache.clone()])?;
v_plain_string = core_and(&[v_content_is_string.clone(), v_not_cache.clone()])?;
if core_truthy(&v_plain_string) {
core_set(&v_out, CoreValue::from("content"), v_raw_content.clone())?;
} else {
v_parts = _anthropic_content_parts_impl(&[v_raw_content.clone()])?;
if core_truthy(&v_cache) {
v_count = core_len(&[v_parts.clone()])?;
v_has_parts = core_gt(&[v_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_parts) {
v_index = core_add(&[v_count.clone(), CoreValue::Num(-1f64)])?;
v_last = core_get(&v_parts, &v_index.clone(), CoreValue::Null);
v_cache_control = core_json_parse(&[CoreValue::from("{\"type\":\"ephemeral\"}")])?;
core_set(
&v_last,
CoreValue::from("cache_control"),
v_cache_control.clone(),
)?;
}
}
core_set(&v_out, CoreValue::from("content"), v_parts.clone())?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _anthropic_content_parts_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_anthropic_content_parts_impl");
let mut v_content = core_arg(args, 0);
let mut v_is_list = CoreValue::Null;
let mut v_mapped = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_parts = CoreValue::Null;
v_parts = CoreValue::new_list();
v_is_list = core_type_is(&v_content, CoreValue::from("list"));
if core_truthy(&v_is_list) {
for v_part in core_iter(&v_content)? {
let mut v_part = v_part;
v_mapped = _anthropic_content_part_impl(&[v_part.clone()])?;
core_append(&v_parts, v_mapped.clone())?;
}
} else {
v_part = CoreValue::new_map();
core_set(&v_part, CoreValue::from("type"), CoreValue::from("text"))?;
core_set(&v_part, CoreValue::from("text"), v_content.clone())?;
core_append(&v_parts, v_part.clone())?;
}
return Ok(v_parts.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _anthropic_content_part_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_anthropic_content_part_impl");
let mut v_part = core_arg(args, 0);
let mut v_cache = CoreValue::Null;
let mut v_cache_control = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_image = CoreValue::Null;
let mut v_image_alt = CoreValue::Null;
let mut v_is_image = CoreValue::Null;
let mut v_is_text = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_mime = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_source = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_type = CoreValue::Null;
v_type = core_get(&v_part, &CoreValue::from("type"), CoreValue::from("text"));
v_is_text = core_eq(&[v_type.clone(), CoreValue::from("text")])?;
if core_truthy(&v_is_text) {
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("type"), CoreValue::from("text"))?;
v_text = core_get(&v_part, &CoreValue::from("text"), CoreValue::from(""));
core_set(&v_out, CoreValue::from("text"), v_text.clone())?;
v_cache = core_get(&v_part, &CoreValue::from("cache"), CoreValue::Bool(false));
if core_truthy(&v_cache) {
v_cache_control = core_json_parse(&[CoreValue::from("{\"type\":\"ephemeral\"}")])?;
core_set(
&v_out,
CoreValue::from("cache_control"),
v_cache_control.clone(),
)?;
}
return Ok(v_out.clone());
}
v_is_image = core_eq(&[v_type.clone(), CoreValue::from("image")])?;
if core_truthy(&v_is_image) {
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("type"), CoreValue::from("image"))?;
v_source = CoreValue::new_map();
core_set(
&v_source,
CoreValue::from("type"),
CoreValue::from("base64"),
)?;
v_mime = core_get(
&v_part,
&CoreValue::from("mimeType"),
CoreValue::from("image/png"),
);
core_set(&v_source, CoreValue::from("media_type"), v_mime.clone())?;
v_image_alt = core_get(&v_part, &CoreValue::from("data"), CoreValue::Null);
v_image = core_get(&v_part, &CoreValue::from("image"), v_image_alt.clone());
core_set(&v_source, CoreValue::from("data"), v_image.clone())?;
core_set(&v_out, CoreValue::from("source"), v_source.clone())?;
v_cache = core_get(&v_part, &CoreValue::from("cache"), CoreValue::Bool(false));
if core_truthy(&v_cache) {
v_cache_control = core_json_parse(&[CoreValue::from("{\"type\":\"ephemeral\"}")])?;
core_set(
&v_out,
CoreValue::from("cache_control"),
v_cache_control.clone(),
)?;
}
return Ok(v_out.clone());
}
v_message = core_string_format(&[
CoreValue::from("Anthropic content type not supported: {}"),
v_type.clone(),
])?;
v_error = core_ai_error_unsupported(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _anthropic_tool_spec_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_anthropic_tool_spec_impl");
let mut v_fn = core_arg(args, 0);
let mut v_cache = CoreValue::Null;
let mut v_cache_control = CoreValue::Null;
let mut v_description = CoreValue::Null;
let mut v_empty_schema = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_parameters = CoreValue::Null;
let mut v_tool = CoreValue::Null;
v_tool = CoreValue::new_map();
v_name = core_get(&v_fn, &CoreValue::from("name"), CoreValue::Null);
v_description = core_get(&v_fn, &CoreValue::from("description"), CoreValue::from(""));
v_empty_schema = CoreValue::new_map();
v_parameters = core_get(
&v_fn,
&CoreValue::from("parameters"),
v_empty_schema.clone(),
);
core_set(&v_tool, CoreValue::from("name"), v_name.clone())?;
core_set(
&v_tool,
CoreValue::from("description"),
v_description.clone(),
)?;
core_set(
&v_tool,
CoreValue::from("input_schema"),
v_parameters.clone(),
)?;
v_cache = core_get(&v_fn, &CoreValue::from("cache"), CoreValue::Bool(false));
if core_truthy(&v_cache) {
v_cache_control = core_json_parse(&[CoreValue::from("{\"type\":\"ephemeral\"}")])?;
core_set(
&v_tool,
CoreValue::from("cache_control"),
v_cache_control.clone(),
)?;
}
return Ok(v_tool.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _anthropic_tool_choice_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_anthropic_tool_choice_impl");
let mut v_request = core_arg(args, 0);
let mut v_choice = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_function = CoreValue::Null;
let mut v_function_call = CoreValue::Null;
let mut v_has_name = CoreValue::Null;
let mut v_is_auto = CoreValue::Null;
let mut v_is_none = CoreValue::Null;
let mut v_is_required = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_none = CoreValue::Null;
v_function_call = core_get(
&v_request,
&CoreValue::from("function_call"),
CoreValue::from("auto"),
);
v_choice = CoreValue::new_map();
v_is_none = core_eq(&[v_function_call.clone(), CoreValue::from("none")])?;
if core_truthy(&v_is_none) {
v_error = core_ai_error_unsupported(&[CoreValue::from("functionCall none not supported")])?;
return Err(core_as_error(&v_error));
}
v_is_required = core_eq(&[v_function_call.clone(), CoreValue::from("required")])?;
if core_truthy(&v_is_required) {
core_set(&v_choice, CoreValue::from("type"), CoreValue::from("any"))?;
return Ok(v_choice.clone());
}
v_is_auto = core_eq(&[v_function_call.clone(), CoreValue::from("auto")])?;
if core_truthy(&v_is_auto) {
core_set(&v_choice, CoreValue::from("type"), CoreValue::from("auto"))?;
return Ok(v_choice.clone());
}
v_function = core_get(
&v_function_call,
&CoreValue::from("function"),
CoreValue::Null,
);
v_name = core_get(&v_function, &CoreValue::from("name"), CoreValue::Null);
v_has_name = core_truthy_value(&[v_name.clone()])?;
if core_truthy(&v_has_name) {
core_set(&v_choice, CoreValue::from("type"), CoreValue::from("tool"))?;
core_set(&v_choice, CoreValue::from("name"), v_name.clone())?;
return Ok(v_choice.clone());
}
v_none = core_none(&[])?;
return Ok(v_none.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _anthropic_error_type_to_status(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_anthropic_error_type_to_status");
let mut v_type = core_arg(args, 0);
let mut v_is_api = CoreValue::Null;
let mut v_is_invalid = CoreValue::Null;
let mut v_is_not_found = CoreValue::Null;
let mut v_is_overloaded = CoreValue::Null;
let mut v_is_permission = CoreValue::Null;
let mut v_is_rate = CoreValue::Null;
let mut v_is_too_large = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_status = CoreValue::Null;
v_none = core_none(&[])?;
v_status = v_none.clone();
v_is_overloaded = core_eq(&[v_type.clone(), CoreValue::from("overloaded_error")])?;
if core_truthy(&v_is_overloaded) {
v_status = CoreValue::Num(529f64);
}
v_is_api = core_eq(&[v_type.clone(), CoreValue::from("api_error")])?;
if core_truthy(&v_is_api) {
v_status = CoreValue::Num(500f64);
}
v_is_rate = core_eq(&[v_type.clone(), CoreValue::from("rate_limit_error")])?;
if core_truthy(&v_is_rate) {
v_status = CoreValue::Num(429f64);
}
v_is_invalid = core_eq(&[v_type.clone(), CoreValue::from("invalid_request_error")])?;
if core_truthy(&v_is_invalid) {
v_status = CoreValue::Num(400f64);
}
v_is_permission = core_eq(&[v_type.clone(), CoreValue::from("permission_error")])?;
if core_truthy(&v_is_permission) {
v_status = CoreValue::Num(403f64);
}
v_is_not_found = core_eq(&[v_type.clone(), CoreValue::from("not_found_error")])?;
if core_truthy(&v_is_not_found) {
v_status = CoreValue::Num(404f64);
}
v_is_too_large = core_eq(&[v_type.clone(), CoreValue::from("request_too_large")])?;
if core_truthy(&v_is_too_large) {
v_status = CoreValue::Num(413f64);
}
return Ok(v_status.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _anthropic_map_error_event(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_anthropic_map_error_event");
let mut v_error = core_arg(args, 0);
let mut v_raw = core_arg(args, 1);
let mut v_auth_error = CoreValue::Null;
let mut v_has_status = CoreValue::Null;
let mut v_is_429 = CoreValue::Null;
let mut v_is_500 = CoreValue::Null;
let mut v_is_529 = CoreValue::Null;
let mut v_is_auth = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_refusal = CoreValue::Null;
let mut v_retry_left = CoreValue::Null;
let mut v_retryable = CoreValue::Null;
let mut v_status = CoreValue::Null;
let mut v_status_error = CoreValue::Null;
let mut v_type = CoreValue::Null;
v_type = core_get(&v_error, &CoreValue::from("type"), CoreValue::from(""));
v_message = core_get(
&v_error,
&CoreValue::from("message"),
CoreValue::from("Anthropic API error"),
);
v_none = core_none(&[])?;
v_is_auth = core_eq(&[v_type.clone(), CoreValue::from("authentication_error")])?;
if core_truthy(&v_is_auth) {
v_auth_error = core_ai_error_auth(&[
v_message.clone(),
v_none.clone(),
v_type.clone(),
v_raw.clone(),
v_none.clone(),
])?;
return Ok(v_auth_error.clone());
}
v_status = _anthropic_error_type_to_status(&[v_type.clone()])?;
v_has_status = core_is_not_none(&[v_status.clone()])?;
if core_truthy(&v_has_status) {
v_is_429 = core_eq(&[v_status.clone(), CoreValue::Num(429f64)])?;
v_is_500 = core_eq(&[v_status.clone(), CoreValue::Num(500f64)])?;
v_is_529 = core_eq(&[v_status.clone(), CoreValue::Num(529f64)])?;
v_retry_left = core_or(&[v_is_429.clone(), v_is_500.clone()])?;
v_retryable = core_or(&[v_retry_left.clone(), v_is_529.clone()])?;
v_status_error = core_ai_error_status(&[
v_message.clone(),
v_status.clone(),
v_type.clone(),
v_raw.clone(),
v_none.clone(),
v_retryable.clone(),
])?;
return Ok(v_status_error.clone());
}
v_refusal = core_ai_error_refusal(&[v_message.clone(), v_raw.clone()])?;
return Ok(v_refusal.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _anthropic_normalize_chat_response(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_anthropic_normalize_chat_response");
let mut v_raw = core_arg(args, 0);
let mut v_ai_name = core_arg(args, 1);
let mut v_model = core_arg(args, 2);
let mut v_block = CoreValue::Null;
let mut v_citations = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_details = CoreValue::Null;
let mut v_empty_content = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_error_body = CoreValue::Null;
let mut v_finish = CoreValue::Null;
let mut v_function_calls = CoreValue::Null;
let mut v_has_calls = CoreValue::Null;
let mut v_has_citations = CoreValue::Null;
let mut v_has_finish = CoreValue::Null;
let mut v_has_thought = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_is_error = CoreValue::Null;
let mut v_is_refusal = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_model_usage = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_raw_model = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_results = CoreValue::Null;
let mut v_stop_reason = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_text_parts = CoreValue::Null;
let mut v_thought = CoreValue::Null;
let mut v_thought_blocks = CoreValue::Null;
let mut v_thought_parts = CoreValue::Null;
let mut v_type = CoreValue::Null;
let mut v_usage = CoreValue::Null;
let mut v_usage_raw = CoreValue::Null;
v_type = core_get(&v_raw, &CoreValue::from("type"), CoreValue::from(""));
v_is_error = core_eq(&[v_type.clone(), CoreValue::from("error")])?;
if core_truthy(&v_is_error) {
v_error_body = core_get(&v_raw, &CoreValue::from("error"), CoreValue::Null);
v_error = _anthropic_map_error_event(&[v_error_body.clone(), v_raw.clone()])?;
return Err(core_as_error(&v_error));
}
v_stop_reason = core_get(&v_raw, &CoreValue::from("stop_reason"), CoreValue::Null);
v_is_refusal = core_eq(&[v_stop_reason.clone(), CoreValue::from("refusal")])?;
if core_truthy(&v_is_refusal) {
v_details = core_get(&v_raw, &CoreValue::from("stop_details"), CoreValue::Null);
v_message = core_get(
&v_details,
&CoreValue::from("explanation"),
CoreValue::from("Anthropic refused to fulfill this request"),
);
v_error = core_ai_error_refusal(&[v_message.clone(), v_raw.clone()])?;
return Err(core_as_error(&v_error));
}
v_text_parts = CoreValue::new_list();
v_function_calls = CoreValue::new_list();
v_thought_parts = CoreValue::new_list();
v_thought_blocks = CoreValue::new_list();
v_citations = CoreValue::new_list();
v_empty_content = CoreValue::new_list();
v_content = core_get(&v_raw, &CoreValue::from("content"), v_empty_content.clone());
for v_block in core_iter(&v_content)? {
let mut v_block = v_block;
_anthropic_merge_response_block_impl(&[
v_text_parts.clone(),
v_function_calls.clone(),
v_thought_parts.clone(),
v_thought_blocks.clone(),
v_citations.clone(),
v_block.clone(),
])?;
}
v_result = CoreValue::new_map();
core_set(&v_result, CoreValue::from("index"), CoreValue::Num(0f64))?;
v_id = core_get(&v_raw, &CoreValue::from("id"), CoreValue::from("0"));
core_set(&v_result, CoreValue::from("id"), v_id.clone())?;
v_finish = _anthropic_finish_reason_impl(&[v_stop_reason.clone()])?;
v_has_finish = core_is_not_none(&[v_finish.clone()])?;
if core_truthy(&v_has_finish) {
core_set(
&v_result,
CoreValue::from("finish_reason"),
v_finish.clone(),
)?;
}
v_text = core_string_join_intrinsic(&[CoreValue::from(""), v_text_parts.clone()])?;
core_set(&v_result, CoreValue::from("content"), v_text.clone())?;
core_set(
&v_result,
CoreValue::from("function_calls"),
v_function_calls.clone(),
)?;
v_has_calls = core_truthy_value(&[v_function_calls.clone()])?;
if core_truthy(&v_has_calls) {
core_set(
&v_result,
CoreValue::from("finish_reason"),
CoreValue::from("function_call"),
)?;
}
v_has_thought = core_truthy_value(&[v_thought_parts.clone()])?;
if core_truthy(&v_has_thought) {
v_thought = core_string_join_intrinsic(&[CoreValue::from(""), v_thought_parts.clone()])?;
core_set(&v_result, CoreValue::from("thought"), v_thought.clone())?;
core_set(
&v_result,
CoreValue::from("thought_blocks"),
v_thought_blocks.clone(),
)?;
}
v_has_citations = core_truthy_value(&[v_citations.clone()])?;
if core_truthy(&v_has_citations) {
core_set(&v_result, CoreValue::from("citations"), v_citations.clone())?;
}
v_results = CoreValue::new_list();
core_append(&v_results, v_result.clone())?;
v_usage_raw = core_get(&v_raw, &CoreValue::from("usage"), CoreValue::Null);
v_usage = _anthropic_usage_impl(&[v_usage_raw.clone()])?;
v_raw_model = core_get(&v_raw, &CoreValue::from("model"), v_model.clone());
v_model_usage =
_ai_model_usage_impl(&[v_ai_name.clone(), v_raw_model.clone(), v_usage.clone()])?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("results"), v_results.clone())?;
core_set(&v_out, CoreValue::from("remote_id"), v_id.clone())?;
core_set(
&v_out,
CoreValue::from("model_usage"),
v_model_usage.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _anthropic_merge_response_block_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_anthropic_merge_response_block_impl");
let mut v_text_parts = core_arg(args, 0);
let mut v_function_calls = core_arg(args, 1);
let mut v_thought_parts = core_arg(args, 2);
let mut v_thought_blocks = core_arg(args, 3);
let mut v_citations = core_arg(args, 4);
let mut v_block = core_arg(args, 5);
let mut v_call = CoreValue::Null;
let mut v_data = CoreValue::Null;
let mut v_data_alt = CoreValue::Null;
let mut v_function = CoreValue::Null;
let mut v_has_signature = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_input = CoreValue::Null;
let mut v_is_redacted = CoreValue::Null;
let mut v_is_text = CoreValue::Null;
let mut v_is_thinking = CoreValue::Null;
let mut v_is_tool = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_signature = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_thinking = CoreValue::Null;
let mut v_thought_block = CoreValue::Null;
let mut v_type = CoreValue::Null;
v_type = core_get(&v_block, &CoreValue::from("type"), CoreValue::from(""));
v_is_text = core_eq(&[v_type.clone(), CoreValue::from("text")])?;
if core_truthy(&v_is_text) {
v_text = core_get(&v_block, &CoreValue::from("text"), CoreValue::from(""));
core_append(&v_text_parts, v_text.clone())?;
_anthropic_append_citations_impl(&[v_citations.clone(), v_block.clone()])?;
}
v_is_tool = core_eq(&[v_type.clone(), CoreValue::from("tool_use")])?;
if core_truthy(&v_is_tool) {
v_function = CoreValue::new_map();
v_name = core_get(&v_block, &CoreValue::from("name"), CoreValue::from(""));
v_input = core_get(&v_block, &CoreValue::from("input"), CoreValue::from(""));
core_set(&v_function, CoreValue::from("name"), v_name.clone())?;
core_set(&v_function, CoreValue::from("params"), v_input.clone())?;
v_call = CoreValue::new_map();
v_id = core_get(&v_block, &CoreValue::from("id"), v_name.clone());
core_set(&v_call, CoreValue::from("id"), v_id.clone())?;
core_set(
&v_call,
CoreValue::from("type"),
CoreValue::from("function"),
)?;
core_set(&v_call, CoreValue::from("function"), v_function.clone())?;
core_append(&v_function_calls, v_call.clone())?;
}
v_is_thinking = core_eq(&[v_type.clone(), CoreValue::from("thinking")])?;
if core_truthy(&v_is_thinking) {
v_thinking = core_get(&v_block, &CoreValue::from("thinking"), CoreValue::from(""));
core_append(&v_thought_parts, v_thinking.clone())?;
v_thought_block = CoreValue::new_map();
core_set(
&v_thought_block,
CoreValue::from("data"),
v_thinking.clone(),
)?;
core_set(
&v_thought_block,
CoreValue::from("encrypted"),
CoreValue::Bool(false),
)?;
v_signature = core_get(&v_block, &CoreValue::from("signature"), CoreValue::Null);
v_has_signature = core_is_not_none(&[v_signature.clone()])?;
if core_truthy(&v_has_signature) {
core_set(
&v_thought_block,
CoreValue::from("signature"),
v_signature.clone(),
)?;
}
core_append(&v_thought_blocks, v_thought_block.clone())?;
}
v_is_redacted = core_eq(&[v_type.clone(), CoreValue::from("redacted_thinking")])?;
if core_truthy(&v_is_redacted) {
v_data = core_get(&v_block, &CoreValue::from("data"), CoreValue::Null);
v_data_alt = core_get(&v_block, &CoreValue::from("thinking"), v_data.clone());
core_append(&v_thought_parts, v_data_alt.clone())?;
v_thought_block = CoreValue::new_map();
core_set(
&v_thought_block,
CoreValue::from("data"),
v_data_alt.clone(),
)?;
core_set(
&v_thought_block,
CoreValue::from("encrypted"),
CoreValue::Bool(true),
)?;
v_signature = core_get(&v_block, &CoreValue::from("signature"), CoreValue::Null);
v_has_signature = core_is_not_none(&[v_signature.clone()])?;
if core_truthy(&v_has_signature) {
core_set(
&v_thought_block,
CoreValue::from("signature"),
v_signature.clone(),
)?;
}
core_append(&v_thought_blocks, v_thought_block.clone())?;
}
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _anthropic_append_citations_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_anthropic_append_citations_impl");
let mut v_out = core_arg(args, 0);
let mut v_block = core_arg(args, 1);
let mut v_citation = CoreValue::Null;
let mut v_citations = CoreValue::Null;
let mut v_empty = CoreValue::Null;
let mut v_has_snippet = CoreValue::Null;
let mut v_has_title = CoreValue::Null;
let mut v_has_url = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_snippet = CoreValue::Null;
let mut v_title = CoreValue::Null;
let mut v_url = CoreValue::Null;
v_empty = CoreValue::new_list();
v_citations = core_get(&v_block, &CoreValue::from("citations"), v_empty.clone());
for v_citation in core_iter(&v_citations)? {
let mut v_citation = v_citation;
v_url = core_get(&v_citation, &CoreValue::from("url"), CoreValue::Null);
v_has_url = core_truthy_value(&[v_url.clone()])?;
if core_truthy(&v_has_url) {
v_item = CoreValue::new_map();
core_set(&v_item, CoreValue::from("url"), v_url.clone())?;
v_title = core_get(&v_citation, &CoreValue::from("title"), CoreValue::Null);
v_has_title = core_is_not_none(&[v_title.clone()])?;
if core_truthy(&v_has_title) {
core_set(&v_item, CoreValue::from("title"), v_title.clone())?;
}
v_snippet = core_get(&v_citation, &CoreValue::from("cited_text"), CoreValue::Null);
v_has_snippet = core_is_not_none(&[v_snippet.clone()])?;
if core_truthy(&v_has_snippet) {
core_set(&v_item, CoreValue::from("snippet"), v_snippet.clone())?;
}
core_append(&v_out, v_item.clone())?;
}
}
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _anthropic_finish_reason_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_anthropic_finish_reason_impl");
let mut v_reason = core_arg(args, 0);
let mut v_is_context = CoreValue::Null;
let mut v_is_length = CoreValue::Null;
let mut v_is_max = CoreValue::Null;
let mut v_is_refusal = CoreValue::Null;
let mut v_is_tool = CoreValue::Null;
let mut v_missing = CoreValue::Null;
let mut v_none = CoreValue::Null;
v_missing = core_is_none(&[v_reason.clone()])?;
if core_truthy(&v_missing) {
v_none = core_none(&[])?;
return Ok(v_none.clone());
}
v_is_max = core_eq(&[v_reason.clone(), CoreValue::from("max_tokens")])?;
v_is_context = core_eq(&[
v_reason.clone(),
CoreValue::from("model_context_window_exceeded"),
])?;
v_is_length = core_or(&[v_is_max.clone(), v_is_context.clone()])?;
if core_truthy(&v_is_length) {
return Ok(CoreValue::from("length"));
}
v_is_tool = core_eq(&[v_reason.clone(), CoreValue::from("tool_use")])?;
if core_truthy(&v_is_tool) {
return Ok(CoreValue::from("function_call"));
}
v_is_refusal = core_eq(&[v_reason.clone(), CoreValue::from("refusal")])?;
if core_truthy(&v_is_refusal) {
return Ok(CoreValue::from("content_filter"));
}
return Ok(CoreValue::from("stop"));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _anthropic_usage_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_anthropic_usage_impl");
let mut v_usage = core_arg(args, 0);
let mut v_cache_creation = CoreValue::Null;
let mut v_cache_read = CoreValue::Null;
let mut v_completion = CoreValue::Null;
let mut v_has_creation = CoreValue::Null;
let mut v_has_read = CoreValue::Null;
let mut v_has_speed = CoreValue::Null;
let mut v_has_usage = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_prompt = CoreValue::Null;
let mut v_speed = CoreValue::Null;
let mut v_total = CoreValue::Null;
let mut v_total_base = CoreValue::Null;
let mut v_total_cache = CoreValue::Null;
v_has_usage = core_truthy_value(&[v_usage.clone()])?;
if core_truthy(&v_has_usage) {
} else {
v_none = core_none(&[])?;
return Ok(v_none.clone());
}
v_out = CoreValue::new_map();
v_prompt = core_get(
&v_usage,
&CoreValue::from("input_tokens"),
CoreValue::Num(0f64),
);
v_completion = core_get(
&v_usage,
&CoreValue::from("output_tokens"),
CoreValue::Num(0f64),
);
v_cache_creation = core_get(
&v_usage,
&CoreValue::from("cache_creation_input_tokens"),
CoreValue::Num(0f64),
);
v_cache_read = core_get(
&v_usage,
&CoreValue::from("cache_read_input_tokens"),
CoreValue::Num(0f64),
);
v_total_base = core_add(&[v_prompt.clone(), v_completion.clone()])?;
v_total_cache = core_add(&[v_cache_creation.clone(), v_cache_read.clone()])?;
v_total = core_add(&[v_total_base.clone(), v_total_cache.clone()])?;
core_set(&v_out, CoreValue::from("prompt_tokens"), v_prompt.clone())?;
core_set(
&v_out,
CoreValue::from("completion_tokens"),
v_completion.clone(),
)?;
core_set(&v_out, CoreValue::from("total_tokens"), v_total.clone())?;
v_has_creation = core_gt(&[v_cache_creation.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_creation) {
core_set(
&v_out,
CoreValue::from("cache_creation_tokens"),
v_cache_creation.clone(),
)?;
}
v_has_read = core_gt(&[v_cache_read.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_read) {
core_set(
&v_out,
CoreValue::from("cache_read_tokens"),
v_cache_read.clone(),
)?;
}
v_speed = core_get(&v_usage, &CoreValue::from("speed"), CoreValue::Null);
v_has_speed = core_is_not_none(&[v_speed.clone()])?;
if core_truthy(&v_has_speed) {
core_set(&v_out, CoreValue::from("speed"), v_speed.clone())?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _anthropic_normalize_stream_delta(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_anthropic_normalize_stream_delta");
let mut v_event = core_arg(args, 0);
let mut v_state = core_arg(args, 1);
let mut v_ai_name = core_arg(args, 2);
let mut v_model = core_arg(args, 3);
let mut v_block = CoreValue::Null;
let mut v_block_type = CoreValue::Null;
let mut v_blocks = CoreValue::Null;
let mut v_cache_creation = CoreValue::Null;
let mut v_cache_read = CoreValue::Null;
let mut v_call = CoreValue::Null;
let mut v_calls = CoreValue::Null;
let mut v_citations = CoreValue::Null;
let mut v_completion = CoreValue::Null;
let mut v_delta = CoreValue::Null;
let mut v_delta_type = CoreValue::Null;
let mut v_details = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_error_body = CoreValue::Null;
let mut v_event_index = CoreValue::Null;
let mut v_finish = CoreValue::Null;
let mut v_function = CoreValue::Null;
let mut v_has_citations = CoreValue::Null;
let mut v_has_finish = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_index = CoreValue::Null;
let mut v_is_block_start = CoreValue::Null;
let mut v_is_delta = CoreValue::Null;
let mut v_is_error = CoreValue::Null;
let mut v_is_json_delta = CoreValue::Null;
let mut v_is_message_delta = CoreValue::Null;
let mut v_is_refusal = CoreValue::Null;
let mut v_is_start = CoreValue::Null;
let mut v_is_text = CoreValue::Null;
let mut v_is_text_delta = CoreValue::Null;
let mut v_is_thinking = CoreValue::Null;
let mut v_is_thinking_delta = CoreValue::Null;
let mut v_is_tool = CoreValue::Null;
let mut v_key = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_model_usage = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_name_key = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_partial = CoreValue::Null;
let mut v_prompt = CoreValue::Null;
let mut v_remote_id = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_results = CoreValue::Null;
let mut v_stop = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_thinking = CoreValue::Null;
let mut v_thought_block = CoreValue::Null;
let mut v_total = CoreValue::Null;
let mut v_total_base = CoreValue::Null;
let mut v_total_cache = CoreValue::Null;
let mut v_type = CoreValue::Null;
let mut v_usage = CoreValue::Null;
let mut v_usage_delta = CoreValue::Null;
let mut v_usage_existing = CoreValue::Null;
let mut v_usage_raw = CoreValue::Null;
v_type = core_get(&v_event, &CoreValue::from("type"), CoreValue::from(""));
v_is_error = core_eq(&[v_type.clone(), CoreValue::from("error")])?;
if core_truthy(&v_is_error) {
v_error_body = core_get(&v_event, &CoreValue::from("error"), CoreValue::Null);
v_error = _anthropic_map_error_event(&[v_error_body.clone(), v_event.clone()])?;
return Err(core_as_error(&v_error));
}
v_index = CoreValue::Num(0f64);
v_is_start = core_eq(&[v_type.clone(), CoreValue::from("message_start")])?;
if core_truthy(&v_is_start) {
v_message = core_get(&v_event, &CoreValue::from("message"), CoreValue::Null);
v_id = core_get(&v_message, &CoreValue::from("id"), CoreValue::from(""));
core_set(&v_state, CoreValue::from("remote_id"), v_id.clone())?;
v_usage_raw = core_get(&v_message, &CoreValue::from("usage"), CoreValue::Null);
v_usage = _anthropic_usage_impl(&[v_usage_raw.clone()])?;
core_set(&v_state, CoreValue::from("usage"), v_usage.clone())?;
v_result = CoreValue::new_map();
core_set(&v_result, CoreValue::from("index"), v_index.clone())?;
core_set(&v_result, CoreValue::from("id"), v_id.clone())?;
core_set(&v_result, CoreValue::from("content"), CoreValue::from(""))?;
v_results = CoreValue::new_list();
core_append(&v_results, v_result.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("results"), v_results.clone())?;
core_set(&v_out, CoreValue::from("remote_id"), v_id.clone())?;
v_model_usage =
_ai_model_usage_impl(&[v_ai_name.clone(), v_model.clone(), v_usage.clone()])?;
core_set(
&v_out,
CoreValue::from("model_usage"),
v_model_usage.clone(),
)?;
return Ok(v_out.clone());
}
v_remote_id = core_get(&v_state, &CoreValue::from("remote_id"), CoreValue::Null);
v_is_block_start = core_eq(&[v_type.clone(), CoreValue::from("content_block_start")])?;
if core_truthy(&v_is_block_start) {
v_block = core_get(&v_event, &CoreValue::from("content_block"), CoreValue::Null);
v_block_type = core_get(&v_block, &CoreValue::from("type"), CoreValue::from(""));
v_is_text = core_eq(&[v_block_type.clone(), CoreValue::from("text")])?;
if core_truthy(&v_is_text) {
v_result = CoreValue::new_map();
core_set(&v_result, CoreValue::from("index"), v_index.clone())?;
v_text = core_get(&v_block, &CoreValue::from("text"), CoreValue::from(""));
core_set(&v_result, CoreValue::from("content"), v_text.clone())?;
v_citations = CoreValue::new_list();
_anthropic_append_citations_impl(&[v_citations.clone(), v_block.clone()])?;
v_has_citations = core_truthy_value(&[v_citations.clone()])?;
if core_truthy(&v_has_citations) {
core_set(&v_result, CoreValue::from("citations"), v_citations.clone())?;
}
v_results = CoreValue::new_list();
core_append(&v_results, v_result.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("results"), v_results.clone())?;
core_set(&v_out, CoreValue::from("remote_id"), v_remote_id.clone())?;
return Ok(v_out.clone());
}
v_is_thinking = core_eq(&[v_block_type.clone(), CoreValue::from("thinking")])?;
if core_truthy(&v_is_thinking) {
v_thinking = core_get(&v_block, &CoreValue::from("thinking"), CoreValue::from(""));
v_thought_block = CoreValue::new_map();
core_set(
&v_thought_block,
CoreValue::from("data"),
v_thinking.clone(),
)?;
core_set(
&v_thought_block,
CoreValue::from("encrypted"),
CoreValue::Bool(false),
)?;
v_blocks = CoreValue::new_list();
core_append(&v_blocks, v_thought_block.clone())?;
v_result = CoreValue::new_map();
core_set(&v_result, CoreValue::from("index"), v_index.clone())?;
core_set(&v_result, CoreValue::from("thought"), v_thinking.clone())?;
core_set(
&v_result,
CoreValue::from("thought_blocks"),
v_blocks.clone(),
)?;
v_results = CoreValue::new_list();
core_append(&v_results, v_result.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("results"), v_results.clone())?;
core_set(&v_out, CoreValue::from("remote_id"), v_remote_id.clone())?;
return Ok(v_out.clone());
}
v_is_tool = core_eq(&[v_block_type.clone(), CoreValue::from("tool_use")])?;
if core_truthy(&v_is_tool) {
v_event_index = core_get(&v_event, &CoreValue::from("index"), CoreValue::Num(0f64));
v_key = core_string_format(&[CoreValue::from("tool_id_{}"), v_event_index.clone()])?;
v_name_key =
core_string_format(&[CoreValue::from("tool_name_{}"), v_event_index.clone()])?;
v_id = core_get(&v_block, &CoreValue::from("id"), CoreValue::from(""));
v_name = core_get(&v_block, &CoreValue::from("name"), CoreValue::from(""));
core_set(&v_state, v_key.clone(), v_id.clone())?;
core_set(&v_state, v_name_key.clone(), v_name.clone())?;
v_function = CoreValue::new_map();
core_set(&v_function, CoreValue::from("name"), v_name.clone())?;
core_set(&v_function, CoreValue::from("params"), CoreValue::from(""))?;
v_call = CoreValue::new_map();
core_set(&v_call, CoreValue::from("id"), v_id.clone())?;
core_set(
&v_call,
CoreValue::from("type"),
CoreValue::from("function"),
)?;
core_set(&v_call, CoreValue::from("function"), v_function.clone())?;
v_calls = CoreValue::new_list();
core_append(&v_calls, v_call.clone())?;
v_result = CoreValue::new_map();
core_set(&v_result, CoreValue::from("index"), v_index.clone())?;
core_set(
&v_result,
CoreValue::from("function_calls"),
v_calls.clone(),
)?;
v_results = CoreValue::new_list();
core_append(&v_results, v_result.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("results"), v_results.clone())?;
core_set(&v_out, CoreValue::from("remote_id"), v_remote_id.clone())?;
return Ok(v_out.clone());
}
}
v_is_delta = core_eq(&[v_type.clone(), CoreValue::from("content_block_delta")])?;
if core_truthy(&v_is_delta) {
v_delta = core_get(&v_event, &CoreValue::from("delta"), CoreValue::Null);
v_delta_type = core_get(&v_delta, &CoreValue::from("type"), CoreValue::from(""));
v_is_text_delta = core_eq(&[v_delta_type.clone(), CoreValue::from("text_delta")])?;
if core_truthy(&v_is_text_delta) {
v_result = CoreValue::new_map();
core_set(&v_result, CoreValue::from("index"), v_index.clone())?;
v_text = core_get(&v_delta, &CoreValue::from("text"), CoreValue::from(""));
core_set(&v_result, CoreValue::from("content"), v_text.clone())?;
v_results = CoreValue::new_list();
core_append(&v_results, v_result.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("results"), v_results.clone())?;
core_set(&v_out, CoreValue::from("remote_id"), v_remote_id.clone())?;
return Ok(v_out.clone());
}
v_is_thinking_delta = core_eq(&[v_delta_type.clone(), CoreValue::from("thinking_delta")])?;
if core_truthy(&v_is_thinking_delta) {
v_thinking = core_get(&v_delta, &CoreValue::from("thinking"), CoreValue::from(""));
v_thought_block = CoreValue::new_map();
core_set(
&v_thought_block,
CoreValue::from("data"),
v_thinking.clone(),
)?;
core_set(
&v_thought_block,
CoreValue::from("encrypted"),
CoreValue::Bool(false),
)?;
v_blocks = CoreValue::new_list();
core_append(&v_blocks, v_thought_block.clone())?;
v_result = CoreValue::new_map();
core_set(&v_result, CoreValue::from("index"), v_index.clone())?;
core_set(&v_result, CoreValue::from("thought"), v_thinking.clone())?;
core_set(
&v_result,
CoreValue::from("thought_blocks"),
v_blocks.clone(),
)?;
v_results = CoreValue::new_list();
core_append(&v_results, v_result.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("results"), v_results.clone())?;
core_set(&v_out, CoreValue::from("remote_id"), v_remote_id.clone())?;
return Ok(v_out.clone());
}
v_is_json_delta = core_eq(&[v_delta_type.clone(), CoreValue::from("input_json_delta")])?;
if core_truthy(&v_is_json_delta) {
v_event_index = core_get(&v_event, &CoreValue::from("index"), CoreValue::Num(0f64));
v_key = core_string_format(&[CoreValue::from("tool_id_{}"), v_event_index.clone()])?;
v_name_key =
core_string_format(&[CoreValue::from("tool_name_{}"), v_event_index.clone()])?;
v_id = core_get(&v_state, &v_key.clone(), CoreValue::from(""));
v_name = core_get(&v_state, &v_name_key.clone(), CoreValue::from(""));
v_partial = core_get(
&v_delta,
&CoreValue::from("partial_json"),
CoreValue::from(""),
);
v_function = CoreValue::new_map();
core_set(&v_function, CoreValue::from("name"), v_name.clone())?;
core_set(&v_function, CoreValue::from("params"), v_partial.clone())?;
v_call = CoreValue::new_map();
core_set(&v_call, CoreValue::from("id"), v_id.clone())?;
core_set(
&v_call,
CoreValue::from("type"),
CoreValue::from("function"),
)?;
core_set(&v_call, CoreValue::from("function"), v_function.clone())?;
v_calls = CoreValue::new_list();
core_append(&v_calls, v_call.clone())?;
v_result = CoreValue::new_map();
core_set(&v_result, CoreValue::from("index"), v_index.clone())?;
core_set(
&v_result,
CoreValue::from("function_calls"),
v_calls.clone(),
)?;
v_results = CoreValue::new_list();
core_append(&v_results, v_result.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("results"), v_results.clone())?;
core_set(&v_out, CoreValue::from("remote_id"), v_remote_id.clone())?;
return Ok(v_out.clone());
}
}
v_is_message_delta = core_eq(&[v_type.clone(), CoreValue::from("message_delta")])?;
if core_truthy(&v_is_message_delta) {
v_delta = core_get(&v_event, &CoreValue::from("delta"), CoreValue::Null);
v_stop = core_get(&v_delta, &CoreValue::from("stop_reason"), CoreValue::Null);
v_is_refusal = core_eq(&[v_stop.clone(), CoreValue::from("refusal")])?;
if core_truthy(&v_is_refusal) {
v_details = core_get(&v_delta, &CoreValue::from("stop_details"), CoreValue::Null);
v_message = core_get(
&v_details,
&CoreValue::from("explanation"),
CoreValue::from("Anthropic refused to fulfill this request"),
);
v_error = core_ai_error_refusal(&[v_message.clone(), v_event.clone()])?;
return Err(core_as_error(&v_error));
}
v_usage_delta = core_get(&v_event, &CoreValue::from("usage"), CoreValue::Null);
v_usage_existing = core_get(&v_state, &CoreValue::from("usage"), v_usage_delta.clone());
v_completion = core_get(
&v_usage_delta,
&CoreValue::from("output_tokens"),
CoreValue::Num(0f64),
);
v_prompt = core_get(
&v_usage_existing,
&CoreValue::from("prompt_tokens"),
CoreValue::Num(0f64),
);
v_cache_creation = core_get(
&v_usage_existing,
&CoreValue::from("cache_creation_tokens"),
CoreValue::Num(0f64),
);
v_cache_read = core_get(
&v_usage_existing,
&CoreValue::from("cache_read_tokens"),
CoreValue::Num(0f64),
);
v_usage = CoreValue::new_map();
core_set(&v_usage, CoreValue::from("prompt_tokens"), v_prompt.clone())?;
core_set(
&v_usage,
CoreValue::from("completion_tokens"),
v_completion.clone(),
)?;
v_total_base = core_add(&[v_prompt.clone(), v_completion.clone()])?;
v_total_cache = core_add(&[v_cache_creation.clone(), v_cache_read.clone()])?;
v_total = core_add(&[v_total_base.clone(), v_total_cache.clone()])?;
core_set(&v_usage, CoreValue::from("total_tokens"), v_total.clone())?;
core_set(
&v_usage,
CoreValue::from("cache_creation_tokens"),
v_cache_creation.clone(),
)?;
core_set(
&v_usage,
CoreValue::from("cache_read_tokens"),
v_cache_read.clone(),
)?;
v_result = CoreValue::new_map();
core_set(&v_result, CoreValue::from("index"), v_index.clone())?;
core_set(&v_result, CoreValue::from("content"), CoreValue::from(""))?;
v_finish = _anthropic_finish_reason_impl(&[v_stop.clone()])?;
v_has_finish = core_is_not_none(&[v_finish.clone()])?;
if core_truthy(&v_has_finish) {
core_set(
&v_result,
CoreValue::from("finish_reason"),
v_finish.clone(),
)?;
}
v_results = CoreValue::new_list();
core_append(&v_results, v_result.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("results"), v_results.clone())?;
core_set(&v_out, CoreValue::from("remote_id"), v_remote_id.clone())?;
v_model_usage =
_ai_model_usage_impl(&[v_ai_name.clone(), v_model.clone(), v_usage.clone()])?;
core_set(
&v_out,
CoreValue::from("model_usage"),
v_model_usage.clone(),
)?;
return Ok(v_out.clone());
}
v_result = CoreValue::new_map();
core_set(&v_result, CoreValue::from("index"), v_index.clone())?;
core_set(&v_result, CoreValue::from("content"), CoreValue::from(""))?;
v_results = CoreValue::new_list();
core_append(&v_results, v_result.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("results"), v_results.clone())?;
core_set(&v_out, CoreValue::from("remote_id"), v_remote_id.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _build_gen_chat_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_build_gen_chat_request");
let mut v_gen = core_arg(args, 0);
let mut v_messages = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_code_schema = CoreValue::Null;
let mut v_code_schema_wrap = CoreValue::Null;
let mut v_fn = CoreValue::Null;
let mut v_fn_count = CoreValue::Null;
let mut v_frequency_penalty = CoreValue::Null;
let mut v_function_specs = CoreValue::Null;
let mut v_functions = CoreValue::Null;
let mut v_has_code_field = CoreValue::Null;
let mut v_has_frequency_penalty = CoreValue::Null;
let mut v_has_functions = CoreValue::Null;
let mut v_has_max_tokens = CoreValue::Null;
let mut v_has_n = CoreValue::Null;
let mut v_has_presence_penalty = CoreValue::Null;
let mut v_has_stop_sequences = CoreValue::Null;
let mut v_has_temperature = CoreValue::Null;
let mut v_has_top_p = CoreValue::Null;
let mut v_max_tokens = CoreValue::Null;
let mut v_mode = CoreValue::Null;
let mut v_mode_raw = CoreValue::Null;
let mut v_mode_snake = CoreValue::Null;
let mut v_model = CoreValue::Null;
let mut v_model_config = CoreValue::Null;
let mut v_n = CoreValue::Null;
let mut v_no_functions = CoreValue::Null;
let mut v_of = CoreValue::Null;
let mut v_of_is_code = CoreValue::Null;
let mut v_of_type = CoreValue::Null;
let mut v_of_type_name = CoreValue::Null;
let mut v_output_fields = CoreValue::Null;
let mut v_presence_penalty = CoreValue::Null;
let mut v_request = CoreValue::Null;
let mut v_response_format = CoreValue::Null;
let mut v_schema_options = CoreValue::Null;
let mut v_signature = CoreValue::Null;
let mut v_spec = CoreValue::Null;
let mut v_stop_sequences = CoreValue::Null;
let mut v_stream_bool = CoreValue::Null;
let mut v_stream_value = CoreValue::Null;
let mut v_temperature = CoreValue::Null;
let mut v_top_p = CoreValue::Null;
let mut v_use_json_schema = CoreValue::Null;
v_model_config = CoreValue::new_map();
v_stream_value = core_get(
&v_options,
&CoreValue::from("stream"),
CoreValue::Bool(false),
);
v_stream_bool = core_truthy_value(&[v_stream_value.clone()])?;
core_set(
&v_model_config,
CoreValue::from("stream"),
v_stream_bool.clone(),
)?;
v_temperature = core_get(&v_options, &CoreValue::from("temperature"), CoreValue::Null);
v_has_temperature = core_is_not_none(&[v_temperature.clone()])?;
if core_truthy(&v_has_temperature) {
core_set(
&v_model_config,
CoreValue::from("temperature"),
v_temperature.clone(),
)?;
}
v_max_tokens = core_get(&v_options, &CoreValue::from("max_tokens"), CoreValue::Null);
v_has_max_tokens = core_is_not_none(&[v_max_tokens.clone()])?;
if core_truthy(&v_has_max_tokens) {
core_set(
&v_model_config,
CoreValue::from("max_tokens"),
v_max_tokens.clone(),
)?;
}
v_top_p = core_get(&v_options, &CoreValue::from("top_p"), CoreValue::Null);
v_has_top_p = core_is_not_none(&[v_top_p.clone()])?;
if core_truthy(&v_has_top_p) {
core_set(&v_model_config, CoreValue::from("top_p"), v_top_p.clone())?;
}
v_presence_penalty = core_get(
&v_options,
&CoreValue::from("presence_penalty"),
CoreValue::Null,
);
v_has_presence_penalty = core_is_not_none(&[v_presence_penalty.clone()])?;
if core_truthy(&v_has_presence_penalty) {
core_set(
&v_model_config,
CoreValue::from("presence_penalty"),
v_presence_penalty.clone(),
)?;
}
v_frequency_penalty = core_get(
&v_options,
&CoreValue::from("frequency_penalty"),
CoreValue::Null,
);
v_has_frequency_penalty = core_is_not_none(&[v_frequency_penalty.clone()])?;
if core_truthy(&v_has_frequency_penalty) {
core_set(
&v_model_config,
CoreValue::from("frequency_penalty"),
v_frequency_penalty.clone(),
)?;
}
v_n = core_get(&v_options, &CoreValue::from("n"), CoreValue::Null);
v_has_n = core_is_not_none(&[v_n.clone()])?;
if core_truthy(&v_has_n) {
core_set(&v_model_config, CoreValue::from("n"), v_n.clone())?;
}
v_stop_sequences = core_get(
&v_options,
&CoreValue::from("stop_sequences"),
CoreValue::Null,
);
v_has_stop_sequences = core_is_not_none(&[v_stop_sequences.clone()])?;
if core_truthy(&v_has_stop_sequences) {
core_set(
&v_model_config,
CoreValue::from("stop_sequences"),
v_stop_sequences.clone(),
)?;
}
v_request = CoreValue::new_map();
v_model = core_get(&v_options, &CoreValue::from("model"), CoreValue::Null);
core_set(&v_request, CoreValue::from("model"), v_model.clone())?;
core_set(
&v_request,
CoreValue::from("chat_prompt"),
v_messages.clone(),
)?;
v_functions = core_get(&v_gen, &CoreValue::from("functions"), CoreValue::Null);
v_function_specs = CoreValue::new_list();
for v_fn in core_iter(&v_functions)? {
let mut v_fn = v_fn;
v_spec = _tool_spec_impl(&[v_fn.clone()])?;
core_append(&v_function_specs, v_spec.clone())?;
}
core_set(
&v_request,
CoreValue::from("functions"),
v_function_specs.clone(),
)?;
v_mode_snake = core_get(
&v_options,
&CoreValue::from("function_call_mode"),
CoreValue::Null,
);
v_mode_raw = core_get(
&v_options,
&CoreValue::from("functionCallMode"),
v_mode_snake.clone(),
);
v_mode = _function_call_mode_impl(&[v_mode_raw.clone()])?;
core_set(&v_request, CoreValue::from("function_call"), v_mode.clone())?;
v_signature = core_get(&v_gen, &CoreValue::from("signature"), CoreValue::Null);
v_output_fields = core_get(
&v_signature,
&CoreValue::from("output_fields"),
CoreValue::Null,
);
v_has_code_field = CoreValue::Bool(false);
for v_of in core_iter(&v_output_fields)? {
let mut v_of = v_of;
v_of_type = core_get(&v_of, &CoreValue::from("type"), CoreValue::Null);
v_of_type_name = core_get(&v_of_type, &CoreValue::from("name"), CoreValue::Null);
v_of_is_code = core_eq(&[v_of_type_name.clone(), CoreValue::from("code")])?;
if core_truthy(&v_of_is_code) {
v_has_code_field = CoreValue::Bool(true);
}
}
v_response_format = CoreValue::new_map();
v_fn_count = core_len(&[v_function_specs.clone()])?;
v_has_functions = core_gt(&[v_fn_count.clone(), CoreValue::Num(0f64)])?;
v_no_functions = core_not(&[v_has_functions.clone()])?;
v_use_json_schema = core_or(&[v_has_code_field.clone(), v_no_functions.clone()])?;
if core_truthy(&v_use_json_schema) {
v_schema_options = CoreValue::new_map();
core_set(
&v_schema_options,
CoreValue::from("strictStructuredOutputs"),
CoreValue::Bool(true),
)?;
core_set(
&v_schema_options,
CoreValue::from("flexibleJsonFieldsAsString"),
CoreValue::Bool(true),
)?;
v_code_schema = _schema_to_json_schema_impl(&[
v_output_fields.clone(),
CoreValue::from("output"),
v_schema_options.clone(),
])?;
v_code_schema_wrap = CoreValue::new_map();
core_set(
&v_code_schema_wrap,
CoreValue::from("name"),
CoreValue::from("output"),
)?;
core_set(
&v_code_schema_wrap,
CoreValue::from("strict"),
CoreValue::Bool(true),
)?;
core_set(
&v_code_schema_wrap,
CoreValue::from("schema"),
v_code_schema.clone(),
)?;
core_set(
&v_response_format,
CoreValue::from("type"),
CoreValue::from("json_schema"),
)?;
core_set(
&v_response_format,
CoreValue::from("schema"),
v_code_schema_wrap.clone(),
)?;
} else {
core_set(
&v_response_format,
CoreValue::from("type"),
CoreValue::from("json_object"),
)?;
}
core_set(
&v_request,
CoreValue::from("response_format"),
v_response_format.clone(),
)?;
core_set(
&v_request,
CoreValue::from("model_config"),
v_model_config.clone(),
)?;
return Ok(v_request.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn fold_stream(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("fold_stream");
let mut v_events = core_arg(args, 0);
let mut v_chunks = CoreValue::Null;
let mut v_event = CoreValue::Null;
let mut v_folded = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_parts = CoreValue::Null;
v_chunks = CoreValue::new_list();
for v_event in core_iter(&v_events)? {
let mut v_event = v_event;
v_parts = _stream_event_content_parts_impl(&[v_event.clone()])?;
for v_part in core_iter(&v_parts)? {
let mut v_part = v_part;
core_append(&v_chunks, v_part.clone())?;
}
}
v_folded = core_string_join(&CoreValue::from(""), &v_chunks)?;
return Ok(v_folded.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _execute_tool_call(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_execute_tool_call");
let mut v_functions = core_arg(args, 0);
let mut v_call = core_arg(args, 1);
let mut v_argument_params = CoreValue::Null;
let mut v_available = CoreValue::Null;
let mut v_available_joined = CoreValue::Null;
let mut v_available_name = CoreValue::Null;
let mut v_available_names = CoreValue::Null;
let mut v_direct_name = CoreValue::Null;
let mut v_direct_params = CoreValue::Null;
let mut v_empty_params = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_fn = CoreValue::Null;
let mut v_fn_call = CoreValue::Null;
let mut v_fn_name = CoreValue::Null;
let mut v_matches = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_missing_params = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_params = CoreValue::Null;
let mut v_params_is_string = CoreValue::Null;
let mut v_params_still_missing = CoreValue::Null;
let mut v_parsed_params = CoreValue::Null;
let mut v_result = CoreValue::Null;
v_fn_call = core_get(&v_call, &CoreValue::from("function"), CoreValue::Null);
v_direct_name = core_get(&v_call, &CoreValue::from("name"), CoreValue::Null);
v_name = core_get(&v_fn_call, &CoreValue::from("name"), v_direct_name.clone());
v_direct_params = core_get(&v_call, &CoreValue::from("params"), CoreValue::Null);
v_params = core_get(
&v_fn_call,
&CoreValue::from("params"),
v_direct_params.clone(),
);
v_missing_params = core_is_none(&[v_params.clone()])?;
if core_truthy(&v_missing_params) {
v_argument_params = core_get(&v_call, &CoreValue::from("arguments"), CoreValue::Null);
v_params = v_argument_params.clone();
}
v_params_is_string = core_type_is(&v_params, CoreValue::from("string"));
if core_truthy(&v_params_is_string) {
v_parsed_params = core_json_parse(&[v_params.clone()])?;
v_params = v_parsed_params.clone();
}
v_params_still_missing = core_is_none(&[v_params.clone()])?;
if core_truthy(&v_params_still_missing) {
v_empty_params = CoreValue::new_map();
v_params = v_empty_params.clone();
}
for v_fn in core_iter(&v_functions)? {
let mut v_fn = v_fn;
v_fn_name = core_get(&v_fn, &CoreValue::from("name"), CoreValue::Null);
v_matches = core_eq(&[v_fn_name.clone(), v_name.clone()])?;
if core_truthy(&v_matches) {
v_result = core_tool_invoke(&[v_fn.clone(), v_params.clone()])?;
return Ok(v_result.clone());
}
}
v_available_names = CoreValue::new_list();
for v_fn in core_iter(&v_functions)? {
let mut v_fn = v_fn;
v_available_name = core_get(&v_fn, &CoreValue::from("name"), CoreValue::Null);
core_append(&v_available_names, v_available_name.clone())?;
}
v_available_joined =
core_string_join_intrinsic(&[CoreValue::from(", "), v_available_names.clone()])?;
v_available =
core_string_default_if_empty(&[v_available_joined.clone(), CoreValue::from("(none)")])?;
v_message = core_string_format(&[CoreValue::from("Function not found: {}. Available functions: {}. Call one of these exact function names."), v_name.clone(), v_available.clone()])?;
v_error = core_validation_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _stream_event_content_parts_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_stream_event_content_parts_impl");
let mut v_event = core_arg(args, 0);
let mut v_parts = CoreValue::Null;
v_parts = core_stream_event_content_parts(&[v_event.clone()])?;
return Ok(v_parts.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _validate_optimization_component_value(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_validate_optimization_component_value");
let mut v_component = core_arg(args, 0);
let mut v_value = core_arg(args, 1);
let mut v_bad_boolean = CoreValue::Null;
let mut v_bad_list = CoreValue::Null;
let mut v_bad_number = CoreValue::Null;
let mut v_bad_object = CoreValue::Null;
let mut v_bad_snake = CoreValue::Null;
let mut v_bad_string = CoreValue::Null;
let mut v_current = CoreValue::Null;
let mut v_current_is_boolean = CoreValue::Null;
let mut v_current_is_list = CoreValue::Null;
let mut v_current_is_number = CoreValue::Null;
let mut v_current_is_object = CoreValue::Null;
let mut v_current_is_string = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_error_boolean = CoreValue::Null;
let mut v_error_list = CoreValue::Null;
let mut v_error_number = CoreValue::Null;
let mut v_error_object = CoreValue::Null;
let mut v_error_snake = CoreValue::Null;
let mut v_format = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_id_boolean = CoreValue::Null;
let mut v_id_list = CoreValue::Null;
let mut v_id_number = CoreValue::Null;
let mut v_id_object = CoreValue::Null;
let mut v_is_snake = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_message_boolean = CoreValue::Null;
let mut v_message_list = CoreValue::Null;
let mut v_message_number = CoreValue::Null;
let mut v_message_object = CoreValue::Null;
let mut v_snake_ok = CoreValue::Null;
let mut v_value_is_boolean = CoreValue::Null;
let mut v_value_is_list = CoreValue::Null;
let mut v_value_is_number = CoreValue::Null;
let mut v_value_is_object = CoreValue::Null;
let mut v_value_is_string = CoreValue::Null;
v_current = core_get(&v_component, &CoreValue::from("current"), CoreValue::Null);
v_current_is_string = core_type_is(&v_current, CoreValue::from("string"));
if core_truthy(&v_current_is_string) {
v_value_is_string = core_type_is(&v_value, CoreValue::from("string"));
v_bad_string = core_not(&[v_value_is_string.clone()])?;
if core_truthy(&v_bad_string) {
v_id = core_get(&v_component, &CoreValue::from("id"), CoreValue::from(""));
v_message = core_string_format(&[
CoreValue::from("invalid optimized component value for {}"),
v_id.clone(),
])?;
v_error = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
}
v_current_is_object = core_type_is(&v_current, CoreValue::from("object"));
if core_truthy(&v_current_is_object) {
v_value_is_object = core_type_is(&v_value, CoreValue::from("object"));
v_bad_object = core_not(&[v_value_is_object.clone()])?;
if core_truthy(&v_bad_object) {
v_id_object = core_get(&v_component, &CoreValue::from("id"), CoreValue::from(""));
v_message_object = core_string_format(&[
CoreValue::from("invalid optimized component value for {}"),
v_id_object.clone(),
])?;
v_error_object = core_runtime_error(&[v_message_object.clone()])?;
return Err(core_as_error(&v_error_object));
}
}
v_current_is_list = core_type_is(&v_current, CoreValue::from("list"));
if core_truthy(&v_current_is_list) {
v_value_is_list = core_type_is(&v_value, CoreValue::from("list"));
v_bad_list = core_not(&[v_value_is_list.clone()])?;
if core_truthy(&v_bad_list) {
v_id_list = core_get(&v_component, &CoreValue::from("id"), CoreValue::from(""));
v_message_list = core_string_format(&[
CoreValue::from("invalid optimized component value for {}"),
v_id_list.clone(),
])?;
v_error_list = core_runtime_error(&[v_message_list.clone()])?;
return Err(core_as_error(&v_error_list));
}
}
v_current_is_number = core_type_is(&v_current, CoreValue::from("number"));
if core_truthy(&v_current_is_number) {
v_value_is_number = core_type_is(&v_value, CoreValue::from("number"));
v_bad_number = core_not(&[v_value_is_number.clone()])?;
if core_truthy(&v_bad_number) {
v_id_number = core_get(&v_component, &CoreValue::from("id"), CoreValue::from(""));
v_message_number = core_string_format(&[
CoreValue::from("invalid optimized component value for {}"),
v_id_number.clone(),
])?;
v_error_number = core_runtime_error(&[v_message_number.clone()])?;
return Err(core_as_error(&v_error_number));
}
}
v_current_is_boolean = core_type_is(&v_current, CoreValue::from("boolean"));
if core_truthy(&v_current_is_boolean) {
v_value_is_boolean = core_type_is(&v_value, CoreValue::from("boolean"));
v_bad_boolean = core_not(&[v_value_is_boolean.clone()])?;
if core_truthy(&v_bad_boolean) {
v_id_boolean = core_get(&v_component, &CoreValue::from("id"), CoreValue::from(""));
v_message_boolean = core_string_format(&[
CoreValue::from("invalid optimized component value for {}"),
v_id_boolean.clone(),
])?;
v_error_boolean = core_runtime_error(&[v_message_boolean.clone()])?;
return Err(core_as_error(&v_error_boolean));
}
}
v_format = core_get(
&v_component,
&CoreValue::from("format"),
CoreValue::from(""),
);
v_is_snake = core_eq(&[v_format.clone(), CoreValue::from("snake_case")])?;
if core_truthy(&v_is_snake) {
v_snake_ok = core_regex_match(CoreValue::from("^[a-z][a-z0-9_]{0,31}$"), &v_value)?;
v_bad_snake = core_not(&[v_snake_ok.clone()])?;
if core_truthy(&v_bad_snake) {
v_error_snake =
core_runtime_error(&[CoreValue::from("invalid optimized function name")])?;
return Err(core_as_error(&v_error_snake));
}
}
return Ok(CoreValue::Bool(true));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _forward_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_forward_impl");
let mut v_gen = core_arg(args, 0);
let mut v_client = core_arg(args, 1);
let mut v_values = core_arg(args, 2);
let mut v_options = core_arg(args, 3);
let mut v_attempt = CoreValue::Null;
let mut v_base_options = CoreValue::Null;
let mut v_cached_messages = CoreValue::Null;
let mut v_call = CoreValue::Null;
let mut v_call_count = CoreValue::Null;
let mut v_calls = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_continue_after_tools = CoreValue::Null;
let mut v_demo_message = CoreValue::Null;
let mut v_demo_messages = CoreValue::Null;
let mut v_example_message = CoreValue::Null;
let mut v_example_messages = CoreValue::Null;
let mut v_functions = CoreValue::Null;
let mut v_has_calls = CoreValue::Null;
let mut v_infra_retries = CoreValue::Null;
let mut v_infra_retries_snake = CoreValue::Null;
let mut v_input_fields = CoreValue::Null;
let mut v_last_tool_result = CoreValue::Null;
let mut v_messages = CoreValue::Null;
let mut v_next_attempt = CoreValue::Null;
let mut v_ordered_messages = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_output_fields = CoreValue::Null;
let mut v_processed = CoreValue::Null;
let mut v_processed_tool_result = CoreValue::Null;
let mut v_prompt_template = CoreValue::Null;
let mut v_public_output = CoreValue::Null;
let mut v_public_tool_result = CoreValue::Null;
let mut v_recovered = CoreValue::Null;
let mut v_request = CoreValue::Null;
let mut v_response = CoreValue::Null;
let mut v_retries_exhausted = CoreValue::Null;
let mut v_runtime_options = CoreValue::Null;
let mut v_signature = CoreValue::Null;
let mut v_system_message = CoreValue::Null;
let mut v_tool_error = CoreValue::Null;
let mut v_tool_error_message = CoreValue::Null;
let mut v_tool_message = CoreValue::Null;
let mut v_tool_result = CoreValue::Null;
let mut v_user_message = CoreValue::Null;
let mut v_validated = CoreValue::Null;
let mut v_validated_tool_result = CoreValue::Null;
let mut v_validation_error = CoreValue::Null;
let mut v_validation_retries = CoreValue::Null;
let mut v_validation_retries_snake = CoreValue::Null;
v_base_options = core_get(&v_gen, &CoreValue::from("options"), CoreValue::Null);
v_runtime_options = core_map_merge(&[v_base_options.clone(), v_options.clone()])?;
v_signature = core_get(&v_gen, &CoreValue::from("signature"), CoreValue::Null);
v_input_fields = core_get(
&v_signature,
&CoreValue::from("input_fields"),
CoreValue::Null,
);
validate_fields(&[
v_input_fields.clone(),
v_values.clone(),
CoreValue::from("input"),
])?;
v_prompt_template = core_get(&v_gen, &CoreValue::from("prompt_template"), CoreValue::Null);
v_messages = core_object_call_method(&[
v_prompt_template.clone(),
CoreValue::from("render"),
v_values.clone(),
])?;
v_example_messages = _render_examples(&[v_gen.clone()])?;
v_demo_messages = _render_demos(&[v_gen.clone()])?;
v_system_message =
core_list_get(&[v_messages.clone(), CoreValue::Num(0f64), v_messages.clone()])?;
v_user_message =
core_list_get(&[v_messages.clone(), CoreValue::Num(1f64), v_messages.clone()])?;
v_ordered_messages = CoreValue::new_list();
core_append(&v_ordered_messages, v_system_message.clone())?;
for v_example_message in core_iter(&v_example_messages)? {
let mut v_example_message = v_example_message;
core_append(&v_ordered_messages, v_example_message.clone())?;
}
for v_demo_message in core_iter(&v_demo_messages)? {
let mut v_demo_message = v_demo_message;
core_append(&v_ordered_messages, v_demo_message.clone())?;
}
core_append(&v_ordered_messages, v_user_message.clone())?;
v_cached_messages = core_axgen_apply_context_cache(&[
v_gen.clone(),
v_ordered_messages.clone(),
v_options.clone(),
])?;
v_messages = v_cached_messages.clone();
core_axgen_memory_add_request(&[v_gen.clone(), v_messages.clone()])?;
v_validation_retries_snake = core_get(
&v_runtime_options,
&CoreValue::from("validation_retries"),
CoreValue::Num(2f64),
);
v_validation_retries = core_get(
&v_runtime_options,
&CoreValue::from("validationRetries"),
v_validation_retries_snake.clone(),
);
v_infra_retries_snake = core_get(
&v_runtime_options,
&CoreValue::from("infra_retries"),
CoreValue::Num(2f64),
);
v_infra_retries = core_get(
&v_runtime_options,
&CoreValue::from("infraRetries"),
v_infra_retries_snake.clone(),
);
v_attempt = CoreValue::Num(0f64);
v_output_fields = core_get(
&v_signature,
&CoreValue::from("output_fields"),
CoreValue::Null,
);
v_functions = core_get(&v_gen, &CoreValue::from("functions"), CoreValue::Null);
v_last_tool_result = core_none(&[])?;
loop {
v_request = _build_gen_chat_request(&[
v_gen.clone(),
v_messages.clone(),
v_runtime_options.clone(),
])?;
v_response = _complete_with_retries_impl(&[
v_client.clone(),
v_request.clone(),
v_infra_retries.clone(),
])?;
core_axgen_memory_add_response(&[v_gen.clone(), v_request.clone(), v_response.clone()])?;
core_axgen_record_chat_log(&[v_gen.clone(), v_request.clone(), v_response.clone()])?;
v_calls = _response_function_calls_impl(&[v_response.clone()])?;
v_call_count = core_len(&[v_calls.clone()])?;
v_has_calls = core_gt(&[v_call_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_calls) {
_append_tool_call_messages_impl(&[
v_messages.clone(),
v_response.clone(),
v_calls.clone(),
])?;
for v_call in core_iter(&v_calls)? {
let mut v_call = v_call;
let __core_try: Result<CoreFlow, AxError> = (|| {
v_tool_result = _execute_tool_call(&[v_functions.clone(), v_call.clone()])?;
v_last_tool_result = v_tool_result.clone();
v_tool_message =
_tool_result_message_impl(&[v_call.clone(), v_tool_result.clone()])?;
core_append(&v_messages, v_tool_message.clone())?;
core_axgen_memory_add_function_result(&[
v_gen.clone(),
v_call.clone(),
v_tool_result.clone(),
CoreValue::Bool(true),
])?;
core_axgen_record_function_call(&[
v_gen.clone(),
v_call.clone(),
v_tool_result.clone(),
CoreValue::from("ok"),
])?;
Ok(CoreFlow::Normal)
})();
match __core_try {
Ok(CoreFlow::Normal) => {}
Ok(CoreFlow::Return(value)) => return Ok(value),
Ok(CoreFlow::Break) => break,
Ok(CoreFlow::Continue) => continue,
Err(__core_caught) => {
v_tool_error = CoreValue::Error(std::rc::Rc::new(__core_caught));
v_tool_error_message =
_tool_error_message_impl(&[v_call.clone(), v_tool_error.clone()])?;
core_append(&v_messages, v_tool_error_message.clone())?;
core_axgen_memory_add_function_result(&[
v_gen.clone(),
v_call.clone(),
v_tool_error_message.clone(),
CoreValue::Bool(false),
])?;
core_axgen_record_function_call(&[
v_gen.clone(),
v_call.clone(),
v_tool_error_message.clone(),
CoreValue::from("error"),
])?;
}
}
}
v_continue_after_tools = _should_continue_steps(&[v_gen.clone(), v_calls.clone()])?;
if core_truthy(&v_continue_after_tools) {
continue;
} else {
v_validated_tool_result =
validate_output(&[v_output_fields.clone(), v_last_tool_result.clone()])?;
v_processed_tool_result =
_apply_field_processors(&[v_gen.clone(), v_validated_tool_result.clone()])?;
_run_assertions(&[v_gen.clone(), v_processed_tool_result.clone()])?;
v_public_tool_result =
strip_internal(&[v_output_fields.clone(), v_processed_tool_result.clone()])?;
core_axgen_memory_cleanup_corrections(&[v_gen.clone()])?;
_record_trace(&[
v_gen.clone(),
v_values.clone(),
v_public_tool_result.clone(),
CoreValue::from("ok"),
])?;
return Ok(v_public_tool_result.clone());
}
} else {
let __core_try: Result<CoreFlow, AxError> = (|| {
v_content = core_get(
&v_response,
&CoreValue::from("content"),
CoreValue::from(""),
);
v_output = _parse_output_impl(&[v_content.clone()])?;
v_recovered =
_parse_json_string_fields(&[v_output_fields.clone(), v_output.clone()])?;
v_validated = validate_output(&[v_output_fields.clone(), v_recovered.clone()])?;
v_processed = _apply_field_processors(&[v_gen.clone(), v_validated.clone()])?;
_run_assertions(&[v_gen.clone(), v_processed.clone()])?;
v_public_output = strip_internal(&[v_output_fields.clone(), v_processed.clone()])?;
core_axgen_memory_cleanup_corrections(&[v_gen.clone()])?;
_record_trace(&[
v_gen.clone(),
v_values.clone(),
v_public_output.clone(),
CoreValue::from("ok"),
])?;
return Ok(CoreFlow::Return(v_public_output.clone()));
Ok(CoreFlow::Normal)
})();
match __core_try {
Ok(CoreFlow::Normal) => {}
Ok(CoreFlow::Return(value)) => return Ok(value),
Ok(CoreFlow::Break) => break,
Ok(CoreFlow::Continue) => continue,
Err(__core_caught) => {
v_validation_error = CoreValue::Error(std::rc::Rc::new(__core_caught));
v_retries_exhausted =
core_gte(&[v_attempt.clone(), v_validation_retries.clone()])?;
if core_truthy(&v_retries_exhausted) {
return Err(core_as_error(&v_validation_error));
}
v_next_attempt = core_add(&[v_attempt.clone(), CoreValue::Num(1f64)])?;
v_attempt = v_next_attempt.clone();
_append_assertion_retry_messages(&[
v_messages.clone(),
v_response.clone(),
v_validation_error.clone(),
])?;
core_axgen_memory_add_correction(&[
v_gen.clone(),
v_response.clone(),
v_validation_error.clone(),
])?;
continue;
}
}
}
}
return Err(AxError::runtime("unreachable AxGen forward loop exit"));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _validate_optimization_component_map(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_validate_optimization_component_map");
let mut v_components = core_arg(args, 0);
let mut v_component_map = core_arg(args, 1);
let mut v_bad = CoreValue::Null;
let mut v_component = CoreValue::Null;
let mut v_component_by_id = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_keys = CoreValue::Null;
let mut v_known = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_ok = CoreValue::Null;
let mut v_value = CoreValue::Null;
v_known = CoreValue::new_list();
v_component_by_id = CoreValue::new_map();
for v_component in core_iter(&v_components)? {
let mut v_component = v_component;
v_id = core_get(&v_component, &CoreValue::from("id"), CoreValue::from(""));
core_append(&v_known, v_id.clone())?;
core_set(&v_component_by_id, v_id.clone(), v_component.clone())?;
}
v_keys = core_map_keys(&[v_component_map.clone()])?;
for v_id in core_iter(&v_keys)? {
let mut v_id = v_id;
v_ok = core_contains(&[v_known.clone(), v_id.clone()])?;
v_bad = core_not(&[v_ok.clone()])?;
if core_truthy(&v_bad) {
v_message = core_string_format(&[
CoreValue::from("unknown optimized component id: {}"),
v_id.clone(),
])?;
v_error = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
v_component = core_get(&v_component_by_id, &v_id.clone(), CoreValue::Null);
v_value = core_get(&v_component_map, &v_id.clone(), CoreValue::Null);
_validate_optimization_component_value(&[v_component.clone(), v_value.clone()])?;
}
return Ok(CoreValue::Bool(true));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _validate_optimized_artifact_provenance(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_validate_optimized_artifact_provenance");
let mut v_artifact = core_arg(args, 0);
let mut v_components = core_arg(args, 1);
let mut v_actual_owner = CoreValue::Null;
let mut v_bad_owners = CoreValue::Null;
let mut v_component = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_expected_owner = CoreValue::Null;
let mut v_has_expected_owner = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_owner_ok = CoreValue::Null;
let mut v_owners = CoreValue::Null;
let mut v_owners_error = CoreValue::Null;
let mut v_owners_is_object = CoreValue::Null;
let mut v_provenance = CoreValue::Null;
let mut v_stale_owner = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_provenance = core_get(
&v_artifact,
&CoreValue::from("provenance"),
v_empty_map.clone(),
);
v_owners = core_get(
&v_provenance,
&CoreValue::from("componentOwners"),
v_empty_map.clone(),
);
v_owners_is_object = core_type_is(&v_owners, CoreValue::from("object"));
v_bad_owners = core_not(&[v_owners_is_object.clone()])?;
if core_truthy(&v_bad_owners) {
v_owners_error = core_runtime_error(&[CoreValue::from(
"optimized artifact provenance componentOwners must be an object",
)])?;
return Err(core_as_error(&v_owners_error));
}
for v_component in core_iter(&v_components)? {
let mut v_component = v_component;
v_id = core_get(&v_component, &CoreValue::from("id"), CoreValue::from(""));
v_expected_owner = core_get(&v_owners, &v_id.clone(), CoreValue::Null);
v_has_expected_owner = core_is_not_none(&[v_expected_owner.clone()])?;
if core_truthy(&v_has_expected_owner) {
v_actual_owner = core_get(&v_component, &CoreValue::from("owner"), CoreValue::from(""));
v_owner_ok = core_eq(&[v_expected_owner.clone(), v_actual_owner.clone()])?;
v_stale_owner = core_not(&[v_owner_ok.clone()])?;
if core_truthy(&v_stale_owner) {
v_message = core_string_format(&[
CoreValue::from("stale optimized component owner: {}"),
v_id.clone(),
])?;
v_error = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
}
}
return Ok(CoreValue::Bool(true));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _validate_optimized_artifact(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_validate_optimized_artifact");
let mut v_artifact = core_arg(args, 0);
let mut v_components = core_arg(args, 1);
let mut v_bad_component_map = CoreValue::Null;
let mut v_bad_evidence = CoreValue::Null;
let mut v_bad_metadata = CoreValue::Null;
let mut v_bad_name = CoreValue::Null;
let mut v_bad_name_type = CoreValue::Null;
let mut v_bad_optimizer_version = CoreValue::Null;
let mut v_bad_optimizer_version_type = CoreValue::Null;
let mut v_bad_provenance = CoreValue::Null;
let mut v_bad_version = CoreValue::Null;
let mut v_component_map = CoreValue::Null;
let mut v_component_map_is_object = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_error_map = CoreValue::Null;
let mut v_error_version = CoreValue::Null;
let mut v_evidence = CoreValue::Null;
let mut v_evidence_error = CoreValue::Null;
let mut v_evidence_is_object = CoreValue::Null;
let mut v_is_object = CoreValue::Null;
let mut v_metadata = CoreValue::Null;
let mut v_metadata_error = CoreValue::Null;
let mut v_metadata_is_object = CoreValue::Null;
let mut v_name_empty = CoreValue::Null;
let mut v_name_error = CoreValue::Null;
let mut v_name_is_string = CoreValue::Null;
let mut v_not_object = CoreValue::Null;
let mut v_optimizer_name = CoreValue::Null;
let mut v_optimizer_version = CoreValue::Null;
let mut v_optimizer_version_empty = CoreValue::Null;
let mut v_optimizer_version_error = CoreValue::Null;
let mut v_provenance = CoreValue::Null;
let mut v_provenance_error = CoreValue::Null;
let mut v_provenance_is_object = CoreValue::Null;
let mut v_version = CoreValue::Null;
let mut v_version_is_string = CoreValue::Null;
let mut v_version_ok = CoreValue::Null;
v_is_object = core_type_is(&v_artifact, CoreValue::from("object"));
v_not_object = core_not(&[v_is_object.clone()])?;
if core_truthy(&v_not_object) {
v_error = core_runtime_error(&[CoreValue::from("optimized artifact must be an object")])?;
return Err(core_as_error(&v_error));
}
v_version = core_get(
&v_artifact,
&CoreValue::from("artifactVersion"),
CoreValue::from(""),
);
v_version_ok = core_eq(&[
v_version.clone(),
CoreValue::from("axir-optimized-artifact-v1"),
])?;
v_bad_version = core_not(&[v_version_ok.clone()])?;
if core_truthy(&v_bad_version) {
v_error_version =
core_runtime_error(&[CoreValue::from("unsupported optimized artifact version")])?;
return Err(core_as_error(&v_error_version));
}
v_optimizer_name = core_get(
&v_artifact,
&CoreValue::from("optimizerName"),
CoreValue::from(""),
);
v_name_is_string = core_type_is(&v_optimizer_name, CoreValue::from("string"));
v_name_empty = core_eq(&[v_optimizer_name.clone(), CoreValue::from("")])?;
v_bad_name_type = core_not(&[v_name_is_string.clone()])?;
v_bad_name = core_or(&[v_bad_name_type.clone(), v_name_empty.clone()])?;
if core_truthy(&v_bad_name) {
v_name_error = core_runtime_error(&[CoreValue::from(
"optimized artifact optimizerName must be a non-empty string",
)])?;
return Err(core_as_error(&v_name_error));
}
v_optimizer_version = core_get(
&v_artifact,
&CoreValue::from("optimizerVersion"),
CoreValue::from(""),
);
v_version_is_string = core_type_is(&v_optimizer_version, CoreValue::from("string"));
v_optimizer_version_empty = core_eq(&[v_optimizer_version.clone(), CoreValue::from("")])?;
v_bad_optimizer_version_type = core_not(&[v_version_is_string.clone()])?;
v_bad_optimizer_version = core_or(&[
v_bad_optimizer_version_type.clone(),
v_optimizer_version_empty.clone(),
])?;
if core_truthy(&v_bad_optimizer_version) {
v_optimizer_version_error = core_runtime_error(&[CoreValue::from(
"optimized artifact optimizerVersion must be a non-empty string",
)])?;
return Err(core_as_error(&v_optimizer_version_error));
}
v_empty_map = CoreValue::new_map();
v_component_map = core_get(
&v_artifact,
&CoreValue::from("componentMap"),
v_empty_map.clone(),
);
v_component_map_is_object = core_type_is(&v_component_map, CoreValue::from("object"));
v_bad_component_map = core_not(&[v_component_map_is_object.clone()])?;
if core_truthy(&v_bad_component_map) {
v_error_map = core_runtime_error(&[CoreValue::from(
"optimized artifact componentMap must be an object",
)])?;
return Err(core_as_error(&v_error_map));
}
v_metadata = core_get(&v_artifact, &CoreValue::from("metadata"), CoreValue::Null);
v_metadata_is_object = core_type_is(&v_metadata, CoreValue::from("object"));
v_bad_metadata = core_not(&[v_metadata_is_object.clone()])?;
if core_truthy(&v_bad_metadata) {
v_metadata_error = core_runtime_error(&[CoreValue::from(
"optimized artifact metadata must be an object",
)])?;
return Err(core_as_error(&v_metadata_error));
}
v_provenance = core_get(&v_artifact, &CoreValue::from("provenance"), CoreValue::Null);
v_provenance_is_object = core_type_is(&v_provenance, CoreValue::from("object"));
v_bad_provenance = core_not(&[v_provenance_is_object.clone()])?;
if core_truthy(&v_bad_provenance) {
v_provenance_error = core_runtime_error(&[CoreValue::from(
"optimized artifact provenance must be an object",
)])?;
return Err(core_as_error(&v_provenance_error));
}
v_evidence = core_get(&v_artifact, &CoreValue::from("evidence"), CoreValue::Null);
v_evidence_is_object = core_type_is(&v_evidence, CoreValue::from("object"));
v_bad_evidence = core_not(&[v_evidence_is_object.clone()])?;
if core_truthy(&v_bad_evidence) {
v_evidence_error = core_runtime_error(&[CoreValue::from(
"optimized artifact evidence must be an object",
)])?;
return Err(core_as_error(&v_evidence_error));
}
_validate_optimization_component_map(&[v_components.clone(), v_component_map.clone()])?;
_validate_optimized_artifact_provenance(&[v_artifact.clone(), v_components.clone()])?;
return Ok(v_artifact.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _set_examples(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_set_examples");
let mut v_gen = core_arg(args, 0);
let mut v_examples = core_arg(args, 1);
core_set(&v_gen, CoreValue::from("examples"), v_examples.clone())?;
return Ok(v_gen.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _set_demos(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_set_demos");
let mut v_gen = core_arg(args, 0);
let mut v_demos = core_arg(args, 1);
core_set(&v_gen, CoreValue::from("demos"), v_demos.clone())?;
return Ok(v_gen.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _render_examples(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_render_examples");
let mut v_gen = core_arg(args, 0);
let mut v_messages = CoreValue::Null;
v_messages = core_axgen_render_examples(&[v_gen.clone()])?;
return Ok(v_messages.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _render_demos(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_render_demos");
let mut v_gen = core_arg(args, 0);
let mut v_messages = CoreValue::Null;
v_messages = core_axgen_render_demos(&[v_gen.clone()])?;
return Ok(v_messages.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _serialize_optimized_artifact(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_serialize_optimized_artifact");
let mut v_artifact = core_arg(args, 0);
let mut v_text = CoreValue::Null;
v_text = core_json_stringify(&[v_artifact.clone()])?;
return Ok(v_text.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _apply_field_processors(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_apply_field_processors");
let mut v_gen = core_arg(args, 0);
let mut v_output = core_arg(args, 1);
let mut v_processed = CoreValue::Null;
v_processed = core_axgen_apply_field_processors(&[v_gen.clone(), v_output.clone()])?;
return Ok(v_processed.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _deserialize_optimized_artifact(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_deserialize_optimized_artifact");
let mut v_text = core_arg(args, 0);
let mut v_components = core_arg(args, 1);
let mut v_artifact = CoreValue::Null;
let mut v_validated = CoreValue::Null;
v_artifact = core_json_parse(&[v_text.clone()])?;
v_validated = _validate_optimized_artifact(&[v_artifact.clone(), v_components.clone()])?;
return Ok(v_validated.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _run_assertions(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_run_assertions");
let mut v_gen = core_arg(args, 0);
let mut v_output = core_arg(args, 1);
core_axgen_run_assertions(&[v_gen.clone(), v_output.clone()])?;
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _optimization_changed_components(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_optimization_changed_components");
let mut v_components = core_arg(args, 0);
let mut v_component_map = core_arg(args, 1);
let mut v_changed = CoreValue::Null;
let mut v_changes = CoreValue::Null;
let mut v_component = CoreValue::Null;
let mut v_current = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_next = CoreValue::Null;
let mut v_same = CoreValue::Null;
v_changes = CoreValue::new_list();
for v_component in core_iter(&v_components)? {
let mut v_component = v_component;
v_id = core_get(&v_component, &CoreValue::from("id"), CoreValue::from(""));
v_current = core_get(&v_component, &CoreValue::from("current"), CoreValue::Null);
v_next = core_get(&v_component_map, &v_id.clone(), v_current.clone());
v_same = core_eq(&[v_current.clone(), v_next.clone()])?;
v_changed = core_not(&[v_same.clone()])?;
if core_truthy(&v_changed) {
v_entry = CoreValue::new_map();
core_set(&v_entry, CoreValue::from("id"), v_id.clone())?;
core_set(&v_entry, CoreValue::from("current"), v_current.clone())?;
core_set(&v_entry, CoreValue::from("next"), v_next.clone())?;
core_append(&v_changes, v_entry.clone())?;
}
}
return Ok(v_changes.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _append_assertion_retry_messages(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_append_assertion_retry_messages");
let mut v_messages = core_arg(args, 0);
let mut v_response = core_arg(args, 1);
let mut v_error = core_arg(args, 2);
_append_validation_retry_messages_impl(&[
v_messages.clone(),
v_response.clone(),
v_error.clone(),
])?;
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _record_trace(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_record_trace");
let mut v_gen = core_arg(args, 0);
let mut v_input = core_arg(args, 1);
let mut v_output = core_arg(args, 2);
let mut v_status = core_arg(args, 3);
core_axgen_record_trace(&[
v_gen.clone(),
v_input.clone(),
v_output.clone(),
v_status.clone(),
])?;
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _optimization_component_current_map(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_optimization_component_current_map");
let mut v_components = core_arg(args, 0);
let mut v_component = CoreValue::Null;
let mut v_current = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_out = CoreValue::Null;
v_out = CoreValue::new_map();
for v_component in core_iter(&v_components)? {
let mut v_component = v_component;
v_id = core_get(&v_component, &CoreValue::from("id"), CoreValue::from(""));
v_current = core_get(&v_component, &CoreValue::from("current"), CoreValue::Null);
core_set(&v_out, v_id.clone(), v_current.clone())?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _should_continue_steps(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_should_continue_steps");
let mut v_gen = core_arg(args, 0);
let mut v_calls = core_arg(args, 1);
let mut v_should_continue = CoreValue::Null;
v_should_continue = core_axgen_should_continue_steps(&[v_gen.clone(), v_calls.clone()])?;
return Ok(v_should_continue.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_optimization_dataset(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_optimization_dataset");
let mut v_dataset = core_arg(args, 0);
let mut v_empty_list = CoreValue::Null;
let mut v_is_object = CoreValue::Null;
let mut v_out_list = CoreValue::Null;
let mut v_out_obj = CoreValue::Null;
let mut v_train = CoreValue::Null;
let mut v_validation = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_is_object = core_type_is(&v_dataset, CoreValue::from("object"));
if core_truthy(&v_is_object) {
v_train = core_get(&v_dataset, &CoreValue::from("train"), v_empty_list.clone());
v_validation = core_get(
&v_dataset,
&CoreValue::from("validation"),
v_empty_list.clone(),
);
v_out_obj = CoreValue::new_map();
core_set(&v_out_obj, CoreValue::from("train"), v_train.clone())?;
core_set(
&v_out_obj,
CoreValue::from("validation"),
v_validation.clone(),
)?;
return Ok(v_out_obj.clone());
}
v_out_list = CoreValue::new_map();
core_set(&v_out_list, CoreValue::from("train"), v_dataset.clone())?;
core_set(
&v_out_list,
CoreValue::from("validation"),
v_empty_list.clone(),
)?;
return Ok(v_out_list.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _complete_with_retries_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_complete_with_retries_impl");
let mut v_client = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_retries = core_arg(args, 2);
let mut v_attempt = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_exhausted = CoreValue::Null;
let mut v_last_error = CoreValue::Null;
let mut v_next_attempt = CoreValue::Null;
let mut v_response = CoreValue::Null;
v_attempt = CoreValue::Num(0f64);
v_last_error = core_none(&[])?;
loop {
let __core_try: Result<CoreFlow, AxError> = (|| {
v_response = core_ai_complete_once(&[v_client.clone(), v_request.clone()])?;
return Ok(CoreFlow::Return(v_response.clone()));
Ok(CoreFlow::Normal)
})();
match __core_try {
Ok(CoreFlow::Normal) => {}
Ok(CoreFlow::Return(value)) => return Ok(value),
Ok(CoreFlow::Break) => break,
Ok(CoreFlow::Continue) => continue,
Err(__core_caught) => {
v_error = CoreValue::Error(std::rc::Rc::new(__core_caught));
v_last_error = v_error.clone();
v_exhausted = core_gte(&[v_attempt.clone(), v_retries.clone()])?;
if core_truthy(&v_exhausted) {
return Err(core_as_error(&v_error));
}
core_retry_sleep(&[v_attempt.clone()])?;
v_next_attempt = core_add(&[v_attempt.clone(), CoreValue::Num(1f64)])?;
v_attempt = v_next_attempt.clone();
continue;
}
}
}
return Err(core_as_error(&v_last_error));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_optimization_metric_scores(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_optimization_metric_scores");
let mut v_raw = core_arg(args, 0);
let mut v_is_number = CoreValue::Null;
let mut v_is_object = CoreValue::Null;
let mut v_out_number = CoreValue::Null;
let mut v_out_zero = CoreValue::Null;
v_is_number = core_type_is(&v_raw, CoreValue::from("number"));
if core_truthy(&v_is_number) {
v_out_number = CoreValue::new_map();
core_set(&v_out_number, CoreValue::from("score"), v_raw.clone())?;
return Ok(v_out_number.clone());
}
v_is_object = core_type_is(&v_raw, CoreValue::from("object"));
if core_truthy(&v_is_object) {
return Ok(v_raw.clone());
}
v_out_zero = CoreValue::new_map();
core_set(&v_out_zero, CoreValue::from("score"), CoreValue::Num(0f64))?;
return Ok(v_out_zero.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _parse_output_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_parse_output_impl");
let mut v_content = core_arg(args, 0);
let mut v_output = CoreValue::Null;
let mut v_text = CoreValue::Null;
v_text = core_string_trim(&v_content);
v_output = core_json_parse(&[v_text.clone()])?;
return Ok(v_output.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _scalarize_optimization_scores(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_scalarize_optimization_scores");
let mut v_scores = core_arg(args, 0);
let mut v_options = core_arg(args, 1);
let mut v_avg = CoreValue::Null;
let mut v_count = CoreValue::Null;
let mut v_count_next = CoreValue::Null;
let mut v_empty = CoreValue::Null;
let mut v_has_metric = CoreValue::Null;
let mut v_metric_key = CoreValue::Null;
let mut v_picked = CoreValue::Null;
let mut v_sum = CoreValue::Null;
let mut v_sum_next = CoreValue::Null;
let mut v_value = CoreValue::Null;
let mut v_values = CoreValue::Null;
v_metric_key = core_get(
&v_options,
&CoreValue::from("paretoMetricKey"),
CoreValue::from(""),
);
v_has_metric = core_ne(&[v_metric_key.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_metric) {
v_picked = core_get(&v_scores, &v_metric_key.clone(), CoreValue::Num(0f64));
return Ok(v_picked.clone());
}
v_values = core_map_values(&[v_scores.clone()])?;
v_sum = CoreValue::Num(0f64);
v_count = CoreValue::Num(0f64);
for v_value in core_iter(&v_values)? {
let mut v_value = v_value;
v_sum_next = core_add(&[v_sum.clone(), v_value.clone()])?;
v_count_next = core_add(&[v_count.clone(), CoreValue::Num(1f64)])?;
v_sum = v_sum_next.clone();
v_count = v_count_next.clone();
}
v_empty = core_eq(&[v_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_empty) {
return Ok(CoreValue::Num(0f64));
}
v_avg = core_div(&[v_sum.clone(), v_count.clone()])?;
return Ok(v_avg.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _is_flexible_json_field(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_is_flexible_json_field");
let mut v_typ = core_arg(args, 0);
let mut v_fields = CoreValue::Null;
let mut v_flexible = CoreValue::Null;
let mut v_has_fields = CoreValue::Null;
let mut v_is_json = CoreValue::Null;
let mut v_is_object = CoreValue::Null;
let mut v_no_fields = CoreValue::Null;
let mut v_type_name = CoreValue::Null;
v_type_name = core_get(&v_typ, &CoreValue::from("name"), CoreValue::Null);
v_is_json = core_eq(&[v_type_name.clone(), CoreValue::from("json")])?;
v_is_object = core_eq(&[v_type_name.clone(), CoreValue::from("object")])?;
v_fields = core_get(&v_typ, &CoreValue::from("fields"), CoreValue::Null);
v_has_fields = core_truthy_value(&[v_fields.clone()])?;
v_no_fields = core_not(&[v_has_fields.clone()])?;
v_flexible = v_is_json.clone();
if core_truthy(&v_is_object) {
if core_truthy(&v_no_fields) {
v_flexible = CoreValue::Bool(true);
}
}
return Ok(v_flexible.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _optimization_action_name_matches(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_optimization_action_name_matches");
let mut v_expected = core_arg(args, 0);
let mut v_call = core_arg(args, 1);
let mut v_any_match = CoreValue::Null;
let mut v_direct_match = CoreValue::Null;
let mut v_dot_expected = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_name_match = CoreValue::Null;
let mut v_qualified = CoreValue::Null;
let mut v_qualified_match = CoreValue::Null;
let mut v_suffix_match = CoreValue::Null;
v_qualified = core_get(
&v_call,
&CoreValue::from("qualifiedName"),
CoreValue::from(""),
);
v_name = core_get(&v_call, &CoreValue::from("name"), CoreValue::from(""));
v_qualified_match = core_eq(&[v_qualified.clone(), v_expected.clone()])?;
v_name_match = core_eq(&[v_name.clone(), v_expected.clone()])?;
v_dot_expected = core_add(&[CoreValue::from("."), v_expected.clone()])?;
v_suffix_match = core_string_ends_with(&[v_qualified.clone(), v_dot_expected.clone()])?;
v_direct_match = core_or(&[v_qualified_match.clone(), v_name_match.clone()])?;
v_any_match = core_or(&[v_direct_match.clone(), v_suffix_match.clone()])?;
return Ok(v_any_match.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _parse_json_string_value(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_parse_json_string_value");
let mut v_value = core_arg(args, 0);
let mut v_is_string = CoreValue::Null;
let mut v_not_string = CoreValue::Null;
let mut v_parse_error = CoreValue::Null;
let mut v_parsed = CoreValue::Null;
let mut v_result = CoreValue::Null;
v_is_string = core_type_is(&v_value, CoreValue::from("string"));
v_not_string = core_not(&[v_is_string.clone()])?;
if core_truthy(&v_not_string) {
return Ok(v_value.clone());
}
v_result = v_value.clone();
let __core_try: Result<CoreFlow, AxError> = (|| {
v_parsed = core_json_parse(&[v_value.clone()])?;
v_result = v_parsed.clone();
Ok(CoreFlow::Normal)
})();
match __core_try {
Ok(CoreFlow::Normal) => {}
Ok(CoreFlow::Return(value)) => return Ok(value),
Ok(CoreFlow::Break) => unreachable!("break outside loop"),
Ok(CoreFlow::Continue) => unreachable!("continue outside loop"),
Err(__core_caught) => {
v_parse_error = CoreValue::Error(std::rc::Rc::new(__core_caught));
v_result = v_value.clone();
}
}
return Ok(v_result.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _adjust_optimization_score_for_actions(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_adjust_optimization_score_for_actions");
let mut v_score = core_arg(args, 0);
let mut v_task = core_arg(args, 1);
let mut v_prediction = core_arg(args, 2);
let mut v_adjusted = CoreValue::Null;
let mut v_adjusted_next = CoreValue::Null;
let mut v_bad_found = CoreValue::Null;
let mut v_bad_match = CoreValue::Null;
let mut v_call = CoreValue::Null;
let mut v_call_matches = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_expected = CoreValue::Null;
let mut v_expected_actions = CoreValue::Null;
let mut v_expected_count = CoreValue::Null;
let mut v_factor = CoreValue::Null;
let mut v_forbidden = CoreValue::Null;
let mut v_forbidden_actions = CoreValue::Null;
let mut v_found = CoreValue::Null;
let mut v_function_calls = CoreValue::Null;
let mut v_half_ratio = CoreValue::Null;
let mut v_has_expected = CoreValue::Null;
let mut v_matched = CoreValue::Null;
let mut v_matched_next = CoreValue::Null;
let mut v_penalized = CoreValue::Null;
let mut v_ratio = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_function_calls = core_get(
&v_prediction,
&CoreValue::from("functionCalls"),
v_empty_list.clone(),
);
v_expected_actions = core_get(
&v_task,
&CoreValue::from("expectedActions"),
v_empty_list.clone(),
);
v_forbidden_actions = core_get(
&v_task,
&CoreValue::from("forbiddenActions"),
v_empty_list.clone(),
);
v_adjusted = v_score.clone();
v_expected_count = core_len(&[v_expected_actions.clone()])?;
v_has_expected = core_gt(&[v_expected_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_expected) {
v_matched = CoreValue::Num(0f64);
for v_expected in core_iter(&v_expected_actions)? {
let mut v_expected = v_expected;
v_found = CoreValue::Bool(false);
for v_call in core_iter(&v_function_calls)? {
let mut v_call = v_call;
v_call_matches =
_optimization_action_name_matches(&[v_expected.clone(), v_call.clone()])?;
if core_truthy(&v_call_matches) {
v_found = CoreValue::Bool(true);
}
}
if core_truthy(&v_found) {
v_matched_next = core_add(&[v_matched.clone(), CoreValue::Num(1f64)])?;
v_matched = v_matched_next.clone();
}
}
v_ratio = core_div(&[v_matched.clone(), v_expected_count.clone()])?;
v_half_ratio = core_mul(&[CoreValue::Num(0.5f64), v_ratio.clone()])?;
v_factor = core_add(&[CoreValue::Num(0.5f64), v_half_ratio.clone()])?;
v_adjusted_next = core_mul(&[v_adjusted.clone(), v_factor.clone()])?;
v_adjusted = v_adjusted_next.clone();
}
for v_forbidden in core_iter(&v_forbidden_actions)? {
let mut v_forbidden = v_forbidden;
v_bad_found = CoreValue::Bool(false);
for v_call in core_iter(&v_function_calls)? {
let mut v_call = v_call;
v_bad_match =
_optimization_action_name_matches(&[v_forbidden.clone(), v_call.clone()])?;
if core_truthy(&v_bad_match) {
v_bad_found = CoreValue::Bool(true);
}
}
if core_truthy(&v_bad_found) {
v_penalized = core_mul(&[v_adjusted.clone(), CoreValue::Num(0.2f64)])?;
v_adjusted = v_penalized.clone();
}
}
return Ok(v_adjusted.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _parse_json_string_for_field(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_parse_json_string_for_field");
let mut v_field = core_arg(args, 0);
let mut v_value = core_arg(args, 1);
let mut v_flexible = CoreValue::Null;
let mut v_has_typ_fields = CoreValue::Null;
let mut v_is_array = CoreValue::Null;
let mut v_is_object = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_item_is_map = CoreValue::Null;
let mut v_not_list = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_parsed_item = CoreValue::Null;
let mut v_parsed_obj = CoreValue::Null;
let mut v_parsed_obj2 = CoreValue::Null;
let mut v_parsed_scalar = CoreValue::Null;
let mut v_rebuilt = CoreValue::Null;
let mut v_typ = CoreValue::Null;
let mut v_typ_fields = CoreValue::Null;
let mut v_type_name = CoreValue::Null;
let mut v_value_is_list = CoreValue::Null;
let mut v_value_is_none = CoreValue::Null;
v_typ = core_get(&v_field, &CoreValue::from("type"), CoreValue::Null);
v_value_is_none = core_is_none(&[v_value.clone()])?;
if core_truthy(&v_value_is_none) {
return Ok(v_value.clone());
}
v_flexible = _is_flexible_json_field(&[v_typ.clone()])?;
v_is_array = core_get(&v_typ, &CoreValue::from("is_array"), CoreValue::Bool(false));
v_typ_fields = core_get(&v_typ, &CoreValue::from("fields"), CoreValue::Null);
v_has_typ_fields = core_truthy_value(&[v_typ_fields.clone()])?;
if core_truthy(&v_is_array) {
v_value_is_list = core_type_is(&v_value, CoreValue::from("list"));
v_not_list = core_not(&[v_value_is_list.clone()])?;
if core_truthy(&v_not_list) {
return Ok(v_value.clone());
}
if core_truthy(&v_flexible) {
v_out = CoreValue::new_list();
for v_item in core_iter(&v_value)? {
let mut v_item = v_item;
v_parsed_item = _parse_json_string_value(&[v_item.clone()])?;
core_append(&v_out, v_parsed_item.clone())?;
}
return Ok(v_out.clone());
}
if core_truthy(&v_has_typ_fields) {
v_rebuilt = CoreValue::new_list();
for v_item in core_iter(&v_value)? {
let mut v_item = v_item;
v_item_is_map = core_type_is(&v_item, CoreValue::from("object"));
if core_truthy(&v_item_is_map) {
v_parsed_obj =
_parse_json_string_for_fields(&[v_typ_fields.clone(), v_item.clone()])?;
core_append(&v_rebuilt, v_parsed_obj.clone())?;
} else {
core_append(&v_rebuilt, v_item.clone())?;
}
}
return Ok(v_rebuilt.clone());
}
return Ok(v_value.clone());
}
if core_truthy(&v_flexible) {
v_parsed_scalar = _parse_json_string_value(&[v_value.clone()])?;
return Ok(v_parsed_scalar.clone());
}
v_type_name = core_get(&v_typ, &CoreValue::from("name"), CoreValue::Null);
v_is_object = core_eq(&[v_type_name.clone(), CoreValue::from("object")])?;
if core_truthy(&v_is_object) {
if core_truthy(&v_has_typ_fields) {
v_parsed_obj2 =
_parse_json_string_for_fields(&[v_typ_fields.clone(), v_value.clone()])?;
return Ok(v_parsed_obj2.clone());
}
}
return Ok(v_value.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _parse_json_string_fields(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_parse_json_string_fields");
let mut v_output_fields = core_arg(args, 0);
let mut v_values = core_arg(args, 1);
let mut v_field = CoreValue::Null;
let mut v_has_key = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_not_map = CoreValue::Null;
let mut v_parsed = CoreValue::Null;
let mut v_value = CoreValue::Null;
let mut v_values_is_map = CoreValue::Null;
v_values_is_map = core_type_is(&v_values, CoreValue::from("object"));
v_not_map = core_not(&[v_values_is_map.clone()])?;
if core_truthy(&v_not_map) {
return Ok(v_values.clone());
}
for v_field in core_iter(&v_output_fields)? {
let mut v_field = v_field;
v_name = core_get(&v_field, &CoreValue::from("name"), CoreValue::Null);
v_has_key = core_map_contains(&[v_values.clone(), v_name.clone()])?;
if core_truthy(&v_has_key) {
v_value = core_get(&v_values, &v_name.clone(), CoreValue::Null);
v_parsed = _parse_json_string_for_field(&[v_field.clone(), v_value.clone()])?;
core_set(&v_values, v_name.clone(), v_parsed.clone())?;
}
}
return Ok(v_values.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _parse_json_string_for_fields(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_parse_json_string_for_fields");
let mut v_fields_map = core_arg(args, 0);
let mut v_values = core_arg(args, 1);
let mut v_field = CoreValue::Null;
let mut v_has_key = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_nested_fields = CoreValue::Null;
let mut v_not_map = CoreValue::Null;
let mut v_parsed = CoreValue::Null;
let mut v_value = CoreValue::Null;
let mut v_values_is_map = CoreValue::Null;
v_values_is_map = core_type_is(&v_values, CoreValue::from("object"));
v_not_map = core_not(&[v_values_is_map.clone()])?;
if core_truthy(&v_not_map) {
return Ok(v_values.clone());
}
v_nested_fields = core_fields_from_map(&[v_fields_map.clone()])?;
for v_field in core_iter(&v_nested_fields)? {
let mut v_field = v_field;
v_name = core_get(&v_field, &CoreValue::from("name"), CoreValue::Null);
v_has_key = core_map_contains(&[v_values.clone(), v_name.clone()])?;
if core_truthy(&v_has_key) {
v_value = core_get(&v_values, &v_name.clone(), CoreValue::Null);
v_parsed = _parse_json_string_for_field(&[v_field.clone(), v_value.clone()])?;
core_set(&v_values, v_name.clone(), v_parsed.clone())?;
}
}
return Ok(v_values.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _build_optimization_eval_row(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_build_optimization_eval_row");
let mut v_task = core_arg(args, 0);
let mut v_prediction = core_arg(args, 1);
let mut v_scores = core_arg(args, 2);
let mut v_scalar = core_arg(args, 3);
let mut v_trace = core_arg(args, 4);
let mut v_error = core_arg(args, 5);
let mut v_has_error = CoreValue::Null;
let mut v_out = CoreValue::Null;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("input"), v_task.clone())?;
core_set(&v_out, CoreValue::from("prediction"), v_prediction.clone())?;
core_set(&v_out, CoreValue::from("scores"), v_scores.clone())?;
core_set(&v_out, CoreValue::from("scalar"), v_scalar.clone())?;
core_set(&v_out, CoreValue::from("trace"), v_trace.clone())?;
v_has_error = core_is_not_none(&[v_error.clone()])?;
if core_truthy(&v_has_error) {
core_set(&v_out, CoreValue::from("error"), v_error.clone())?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _tool_spec_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_tool_spec_impl");
let mut v_fn = core_arg(args, 0);
let mut v_description = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_parameters = CoreValue::Null;
let mut v_spec = CoreValue::Null;
v_spec = CoreValue::new_map();
v_name = core_get(&v_fn, &CoreValue::from("name"), CoreValue::Null);
v_description = core_get(&v_fn, &CoreValue::from("description"), CoreValue::Null);
v_parameters = core_get(&v_fn, &CoreValue::from("parameters"), CoreValue::Null);
core_set(&v_spec, CoreValue::from("name"), v_name.clone())?;
core_set(
&v_spec,
CoreValue::from("description"),
v_description.clone(),
)?;
core_set(&v_spec, CoreValue::from("parameters"), v_parameters.clone())?;
return Ok(v_spec.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _build_optimization_eval_result(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_build_optimization_eval_result");
let mut v_rows = core_arg(args, 0);
let mut v_candidate_map = core_arg(args, 1);
let mut v_phase = core_arg(args, 2);
let mut v_avg = CoreValue::Null;
let mut v_avg_next = CoreValue::Null;
let mut v_count = CoreValue::Null;
let mut v_count_next = CoreValue::Null;
let mut v_has_rows = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_row = CoreValue::Null;
let mut v_scalar = CoreValue::Null;
let mut v_sum = CoreValue::Null;
let mut v_sum_next = CoreValue::Null;
v_sum = CoreValue::Num(0f64);
v_count = CoreValue::Num(0f64);
for v_row in core_iter(&v_rows)? {
let mut v_row = v_row;
v_scalar = core_get(&v_row, &CoreValue::from("scalar"), CoreValue::Num(0f64));
v_sum_next = core_add(&[v_sum.clone(), v_scalar.clone()])?;
v_count_next = core_add(&[v_count.clone(), CoreValue::Num(1f64)])?;
v_sum = v_sum_next.clone();
v_count = v_count_next.clone();
}
v_avg = CoreValue::Num(0f64);
v_has_rows = core_gt(&[v_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_rows) {
v_avg_next = core_div(&[v_sum.clone(), v_count.clone()])?;
v_avg = v_avg_next.clone();
}
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("phase"), v_phase.clone())?;
core_set(
&v_out,
CoreValue::from("candidateMap"),
v_candidate_map.clone(),
)?;
core_set(&v_out, CoreValue::from("rows"), v_rows.clone())?;
core_set(&v_out, CoreValue::from("sum"), v_sum.clone())?;
core_set(&v_out, CoreValue::from("avg"), v_avg.clone())?;
core_set(&v_out, CoreValue::from("count"), v_count.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _function_call_mode_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_function_call_mode_impl");
let mut v_mode = core_arg(args, 0);
let mut v_is_auto = CoreValue::Null;
let mut v_is_native = CoreValue::Null;
let mut v_is_prompt = CoreValue::Null;
let mut v_missing = CoreValue::Null;
let mut v_native_or_auto = CoreValue::Null;
v_missing = core_is_none(&[v_mode.clone()])?;
if core_truthy(&v_missing) {
return Ok(CoreValue::from("auto"));
}
v_is_native = core_eq(&[v_mode.clone(), CoreValue::from("native")])?;
v_is_auto = core_eq(&[v_mode.clone(), CoreValue::from("auto")])?;
v_native_or_auto = core_or(&[v_is_native.clone(), v_is_auto.clone()])?;
if core_truthy(&v_native_or_auto) {
return Ok(CoreValue::from("auto"));
}
v_is_prompt = core_eq(&[v_mode.clone(), CoreValue::from("prompt")])?;
if core_truthy(&v_is_prompt) {
return Ok(CoreValue::from("none"));
}
return Ok(v_mode.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _response_function_calls_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_response_function_calls_impl");
let mut v_response = core_arg(args, 0);
let mut v_calls = CoreValue::Null;
let mut v_empty = CoreValue::Null;
v_empty = CoreValue::new_list();
v_calls = core_get(
&v_response,
&CoreValue::from("function_calls"),
v_empty.clone(),
);
return Ok(v_calls.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _filter_optimization_components(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_filter_optimization_components");
let mut v_components = core_arg(args, 0);
let mut v_target = core_arg(args, 1);
let mut v_actor_any_match = CoreValue::Null;
let mut v_actor_component_match = CoreValue::Null;
let mut v_actor_match = CoreValue::Null;
let mut v_component = CoreValue::Null;
let mut v_count = CoreValue::Null;
let mut v_empty = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_explicit_match = CoreValue::Null;
let mut v_flow_component = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_include = CoreValue::Null;
let mut v_is_actor = CoreValue::Null;
let mut v_is_all = CoreValue::Null;
let mut v_is_flow = CoreValue::Null;
let mut v_is_list = CoreValue::Null;
let mut v_is_responder = CoreValue::Null;
let mut v_kind = CoreValue::Null;
let mut v_listed = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_responder_any_match = CoreValue::Null;
let mut v_responder_component_match = CoreValue::Null;
let mut v_responder_match = CoreValue::Null;
v_out = CoreValue::new_list();
v_is_list = core_type_is(&v_target, CoreValue::from("list"));
v_is_all = core_eq(&[v_target.clone(), CoreValue::from("all")])?;
v_is_actor = core_eq(&[v_target.clone(), CoreValue::from("actor")])?;
v_is_responder = core_eq(&[v_target.clone(), CoreValue::from("responder")])?;
v_is_flow = core_eq(&[v_target.clone(), CoreValue::from("flow")])?;
for v_component in core_iter(&v_components)? {
let mut v_component = v_component;
v_id = core_get(&v_component, &CoreValue::from("id"), CoreValue::from(""));
v_kind = core_get(&v_component, &CoreValue::from("kind"), CoreValue::from(""));
v_include = CoreValue::Bool(false);
if core_truthy(&v_is_all) {
v_include = CoreValue::Bool(true);
}
if core_truthy(&v_is_list) {
v_listed = core_contains(&[v_target.clone(), v_id.clone()])?;
if core_truthy(&v_listed) {
v_include = CoreValue::Bool(true);
}
}
if core_truthy(&v_is_actor) {
v_actor_match = core_string_ends_with(&[v_id.clone(), CoreValue::from(".actor")])?;
v_actor_component_match = core_contains(&[v_id.clone(), CoreValue::from(".actor::")])?;
v_actor_any_match = core_or(&[v_actor_match.clone(), v_actor_component_match.clone()])?;
if core_truthy(&v_actor_any_match) {
v_include = CoreValue::Bool(true);
}
}
if core_truthy(&v_is_responder) {
v_responder_match =
core_string_ends_with(&[v_id.clone(), CoreValue::from(".responder")])?;
v_responder_component_match =
core_contains(&[v_id.clone(), CoreValue::from(".responder::")])?;
v_responder_any_match = core_or(&[
v_responder_match.clone(),
v_responder_component_match.clone(),
])?;
if core_truthy(&v_responder_any_match) {
v_include = CoreValue::Bool(true);
}
}
if core_truthy(&v_is_flow) {
v_flow_component = core_eq(&[v_kind.clone(), CoreValue::from("flow-graph")])?;
if core_truthy(&v_flow_component) {
v_include = CoreValue::Bool(true);
}
}
v_explicit_match = core_eq(&[v_target.clone(), v_id.clone()])?;
if core_truthy(&v_explicit_match) {
v_include = CoreValue::Bool(true);
}
if core_truthy(&v_include) {
core_append(&v_out, v_component.clone())?;
}
}
v_count = core_len(&[v_out.clone()])?;
v_empty = core_eq(&[v_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_empty) {
v_message = core_string_format(&[
CoreValue::from("no optimizable components match target: {}"),
v_target.clone(),
])?;
v_error = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _append_tool_call_messages_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_append_tool_call_messages_impl");
let mut v_messages = core_arg(args, 0);
let mut v_response = core_arg(args, 1);
let mut v_calls = core_arg(args, 2);
let mut v_call = CoreValue::Null;
let mut v_chat_call = CoreValue::Null;
let mut v_chat_calls = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_message = CoreValue::Null;
v_chat_calls = CoreValue::new_list();
for v_call in core_iter(&v_calls)? {
let mut v_call = v_call;
v_chat_call = _completion_call_to_chat_impl(&[v_call.clone()])?;
core_append(&v_chat_calls, v_chat_call.clone())?;
}
v_content = core_get(
&v_response,
&CoreValue::from("content"),
CoreValue::from(""),
);
v_message = CoreValue::new_map();
core_set(
&v_message,
CoreValue::from("role"),
CoreValue::from("assistant"),
)?;
core_set(&v_message, CoreValue::from("content"), v_content.clone())?;
core_set(
&v_message,
CoreValue::from("function_calls"),
v_chat_calls.clone(),
)?;
core_append(&v_messages, v_message.clone())?;
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _completion_call_to_chat_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_completion_call_to_chat_impl");
let mut v_call = core_arg(args, 0);
let mut v_function = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_params = CoreValue::Null;
v_id = core_get(&v_call, &CoreValue::from("id"), CoreValue::Null);
v_name = core_get(&v_call, &CoreValue::from("name"), CoreValue::Null);
v_params = core_get(&v_call, &CoreValue::from("params"), CoreValue::Null);
v_function = CoreValue::new_map();
core_set(&v_function, CoreValue::from("name"), v_name.clone())?;
core_set(&v_function, CoreValue::from("params"), v_params.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("id"), v_id.clone())?;
core_set(&v_out, CoreValue::from("type"), CoreValue::from("function"))?;
core_set(&v_out, CoreValue::from("function"), v_function.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _tool_result_message_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_tool_result_message_impl");
let mut v_call = core_arg(args, 0);
let mut v_result = core_arg(args, 1);
let mut v_id = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_result_json = CoreValue::Null;
v_id = core_get(&v_call, &CoreValue::from("id"), CoreValue::Null);
v_result_json = core_json_stringify(&[v_result.clone()])?;
v_message = CoreValue::new_map();
core_set(
&v_message,
CoreValue::from("role"),
CoreValue::from("function"),
)?;
core_set(&v_message, CoreValue::from("function_id"), v_id.clone())?;
core_set(&v_message, CoreValue::from("result"), v_result_json.clone())?;
return Ok(v_message.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _build_optimizer_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_build_optimizer_request");
let mut v_program_kind = core_arg(args, 0);
let mut v_components = core_arg(args, 1);
let mut v_dataset = core_arg(args, 2);
let mut v_options = core_arg(args, 3);
let mut v_trace = core_arg(args, 4);
let mut v_evaluator = CoreValue::Null;
let mut v_methods = CoreValue::Null;
let mut v_out = CoreValue::Null;
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("contractVersion"),
CoreValue::from("axir-optimize-contract-v1"),
)?;
core_set(
&v_out,
CoreValue::from("programKind"),
v_program_kind.clone(),
)?;
core_set(&v_out, CoreValue::from("components"), v_components.clone())?;
core_set(&v_out, CoreValue::from("dataset"), v_dataset.clone())?;
core_set(&v_out, CoreValue::from("options"), v_options.clone())?;
core_set(&v_out, CoreValue::from("trace"), v_trace.clone())?;
v_evaluator = CoreValue::new_map();
v_methods = CoreValue::new_list();
core_append(&v_methods, CoreValue::from("evaluate"))?;
core_set(
&v_evaluator,
CoreValue::from("available"),
CoreValue::Bool(true),
)?;
core_set(
&v_evaluator,
CoreValue::from("contractVersion"),
CoreValue::from("axir-optimizer-evaluator-v1"),
)?;
core_set(
&v_evaluator,
CoreValue::from("evidenceContractVersion"),
CoreValue::from("axir-optimizer-evidence-v1"),
)?;
core_set(&v_evaluator, CoreValue::from("methods"), v_methods.clone())?;
core_set(&v_out, CoreValue::from("evaluator"), v_evaluator.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _tool_error_message_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_tool_error_message_impl");
let mut v_call = core_arg(args, 0);
let mut v_error = core_arg(args, 1);
let mut v_error_text = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_payload_json = CoreValue::Null;
v_id = core_get(&v_call, &CoreValue::from("id"), CoreValue::Null);
v_error_text = core_exception_message(&[v_error.clone()])?;
v_payload = CoreValue::new_map();
core_set(&v_payload, CoreValue::from("error"), v_error_text.clone())?;
v_payload_json = core_json_stringify(&[v_payload.clone()])?;
v_message = CoreValue::new_map();
core_set(
&v_message,
CoreValue::from("role"),
CoreValue::from("function"),
)?;
core_set(&v_message, CoreValue::from("function_id"), v_id.clone())?;
core_set(
&v_message,
CoreValue::from("result"),
v_payload_json.clone(),
)?;
core_set(
&v_message,
CoreValue::from("is_error"),
CoreValue::Bool(true),
)?;
return Ok(v_message.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _append_validation_retry_messages_impl(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_append_validation_retry_messages_impl");
let mut v_messages = core_arg(args, 0);
let mut v_response = core_arg(args, 1);
let mut v_error = core_arg(args, 2);
let mut v_assistant_message = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_error_text = CoreValue::Null;
let mut v_prefix_message = CoreValue::Null;
let mut v_retry_content = CoreValue::Null;
let mut v_retry_message = CoreValue::Null;
v_content = core_get(
&v_response,
&CoreValue::from("content"),
CoreValue::from(""),
);
v_assistant_message = CoreValue::new_map();
core_set(
&v_assistant_message,
CoreValue::from("role"),
CoreValue::from("assistant"),
)?;
core_set(
&v_assistant_message,
CoreValue::from("content"),
v_content.clone(),
)?;
core_append(&v_messages, v_assistant_message.clone())?;
v_error_text = core_exception_message(&[v_error.clone()])?;
v_prefix_message = core_add(&[
CoreValue::from("The previous response failed validation: "),
v_error_text.clone(),
])?;
v_retry_content = core_add(&[
v_prefix_message.clone(),
CoreValue::from(". Return only corrected JSON."),
])?;
v_retry_message = CoreValue::new_map();
core_set(
&v_retry_message,
CoreValue::from("role"),
CoreValue::from("user"),
)?;
core_set(
&v_retry_message,
CoreValue::from("content"),
v_retry_content.clone(),
)?;
core_append(&v_messages, v_retry_message.clone())?;
return Ok(CoreValue::Null);
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _prepare_optimizer_run(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_prepare_optimizer_run");
let mut v_program_kind = core_arg(args, 0);
let mut v_components = core_arg(args, 1);
let mut v_dataset = core_arg(args, 2);
let mut v_options = core_arg(args, 3);
let mut v_trace = core_arg(args, 4);
let mut v_evaluator_available = core_arg(args, 5);
let mut v_empty_map = CoreValue::Null;
let mut v_evaluator = CoreValue::Null;
let mut v_normalized = CoreValue::Null;
let mut v_opts = CoreValue::Null;
let mut v_opts_missing = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_request = CoreValue::Null;
let mut v_request_options = CoreValue::Null;
let mut v_selected = CoreValue::Null;
let mut v_target = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_opts_missing = core_is_none(&[v_options.clone()])?;
v_opts = v_options.clone();
if core_truthy(&v_opts_missing) {
v_opts = v_empty_map.clone();
}
v_normalized = _normalize_optimization_dataset(&[v_dataset.clone()])?;
v_target = core_get(&v_opts, &CoreValue::from("target"), CoreValue::from("all"));
v_selected = _filter_optimization_components(&[v_components.clone(), v_target.clone()])?;
v_request_options = core_map_merge(&[v_empty_map.clone(), v_opts.clone()])?;
core_map_delete(&[v_request_options.clone(), CoreValue::from("client")])?;
core_map_delete(&[v_request_options.clone(), CoreValue::from("ai")])?;
core_map_delete(&[v_request_options.clone(), CoreValue::from("engine")])?;
core_map_delete(&[v_request_options.clone(), CoreValue::from("optimizer")])?;
v_request = _build_optimizer_request(&[
v_program_kind.clone(),
v_selected.clone(),
v_normalized.clone(),
v_request_options.clone(),
v_trace.clone(),
])?;
v_evaluator = core_get(&v_request, &CoreValue::from("evaluator"), CoreValue::Null);
core_set(
&v_evaluator,
CoreValue::from("available"),
v_evaluator_available.clone(),
)?;
core_set(
&v_request,
CoreValue::from("evaluator"),
v_evaluator.clone(),
)?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("components"), v_components.clone())?;
core_set(
&v_out,
CoreValue::from("selectedComponents"),
v_selected.clone(),
)?;
core_set(&v_out, CoreValue::from("dataset"), v_normalized.clone())?;
core_set(
&v_out,
CoreValue::from("options"),
v_request_options.clone(),
)?;
core_set(&v_out, CoreValue::from("request"), v_request.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_optimizer_engine_response(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_optimizer_engine_response");
let mut v_response = core_arg(args, 0);
let mut v_engine_name = core_arg(args, 1);
let mut v_engine_version = core_arg(args, 2);
let mut v_components = core_arg(args, 3);
let mut v_artifact = CoreValue::Null;
let mut v_artifact_error = CoreValue::Null;
let mut v_artifact_is_object = CoreValue::Null;
let mut v_artifact_source = CoreValue::Null;
let mut v_artifact_value = CoreValue::Null;
let mut v_bad_artifact = CoreValue::Null;
let mut v_bad_response = CoreValue::Null;
let mut v_changed = CoreValue::Null;
let mut v_component_map = CoreValue::Null;
let mut v_default_metadata = CoreValue::Null;
let mut v_empty_evidence = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_empty_provenance = CoreValue::Null;
let mut v_engine_ver = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_evidence = CoreValue::Null;
let mut v_has_artifact = CoreValue::Null;
let mut v_map = CoreValue::Null;
let mut v_metadata = CoreValue::Null;
let mut v_metadata_evidence = CoreValue::Null;
let mut v_metadata_final = CoreValue::Null;
let mut v_metadata_provenance = CoreValue::Null;
let mut v_missing_component_map = CoreValue::Null;
let mut v_missing_engine_ver = CoreValue::Null;
let mut v_missing_evidence = CoreValue::Null;
let mut v_missing_metadata = CoreValue::Null;
let mut v_missing_name = CoreValue::Null;
let mut v_missing_provenance = CoreValue::Null;
let mut v_missing_version = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_provenance = CoreValue::Null;
let mut v_response_is_object = CoreValue::Null;
let mut v_snake_map = CoreValue::Null;
let mut v_validated = CoreValue::Null;
let mut v_version = CoreValue::Null;
v_response_is_object = core_type_is(&v_response, CoreValue::from("object"));
v_bad_response = core_not(&[v_response_is_object.clone()])?;
if core_truthy(&v_bad_response) {
v_error = core_runtime_error(&[CoreValue::from(
"optimizer engine must return an optimized artifact",
)])?;
return Err(core_as_error(&v_error));
}
v_empty_map = CoreValue::new_map();
v_has_artifact = core_map_contains(&[v_response.clone(), CoreValue::from("artifact")])?;
v_artifact_source = v_response.clone();
if core_truthy(&v_has_artifact) {
v_artifact_value = core_get(&v_response, &CoreValue::from("artifact"), CoreValue::Null);
v_artifact_source = v_artifact_value.clone();
}
v_artifact = core_map_merge(&[v_empty_map.clone(), v_artifact_source.clone()])?;
v_artifact_is_object = core_type_is(&v_artifact, CoreValue::from("object"));
v_bad_artifact = core_not(&[v_artifact_is_object.clone()])?;
if core_truthy(&v_bad_artifact) {
v_artifact_error = core_runtime_error(&[CoreValue::from(
"optimizer engine must return an optimized artifact",
)])?;
return Err(core_as_error(&v_artifact_error));
}
v_version = core_get(
&v_artifact,
&CoreValue::from("artifactVersion"),
CoreValue::Null,
);
v_missing_version = core_is_none(&[v_version.clone()])?;
if core_truthy(&v_missing_version) {
core_set(
&v_artifact,
CoreValue::from("artifactVersion"),
CoreValue::from("axir-optimized-artifact-v1"),
)?;
}
v_name = core_get(
&v_artifact,
&CoreValue::from("optimizerName"),
CoreValue::Null,
);
v_missing_name = core_is_none(&[v_name.clone()])?;
if core_truthy(&v_missing_name) {
core_set(
&v_artifact,
CoreValue::from("optimizerName"),
v_engine_name.clone(),
)?;
}
v_engine_ver = core_get(
&v_artifact,
&CoreValue::from("optimizerVersion"),
CoreValue::Null,
);
v_missing_engine_ver = core_is_none(&[v_engine_ver.clone()])?;
if core_truthy(&v_missing_engine_ver) {
core_set(
&v_artifact,
CoreValue::from("optimizerVersion"),
v_engine_version.clone(),
)?;
}
v_component_map = core_get(
&v_artifact,
&CoreValue::from("componentMap"),
CoreValue::Null,
);
v_missing_component_map = core_is_none(&[v_component_map.clone()])?;
if core_truthy(&v_missing_component_map) {
v_snake_map = core_get(
&v_artifact,
&CoreValue::from("component_map"),
v_empty_map.clone(),
);
core_set(
&v_artifact,
CoreValue::from("componentMap"),
v_snake_map.clone(),
)?;
}
v_metadata = core_get(&v_artifact, &CoreValue::from("metadata"), CoreValue::Null);
v_missing_metadata = core_is_none(&[v_metadata.clone()])?;
if core_truthy(&v_missing_metadata) {
v_default_metadata = CoreValue::new_map();
core_set(
&v_artifact,
CoreValue::from("metadata"),
v_default_metadata.clone(),
)?;
}
v_metadata_final = core_get(&v_artifact, &CoreValue::from("metadata"), CoreValue::Null);
v_provenance = core_get(&v_artifact, &CoreValue::from("provenance"), CoreValue::Null);
v_missing_provenance = core_is_none(&[v_provenance.clone()])?;
if core_truthy(&v_missing_provenance) {
v_empty_provenance = CoreValue::new_map();
v_metadata_provenance = core_get(
&v_metadata_final,
&CoreValue::from("provenance"),
v_empty_provenance.clone(),
);
core_set(
&v_artifact,
CoreValue::from("provenance"),
v_metadata_provenance.clone(),
)?;
}
v_evidence = core_get(&v_artifact, &CoreValue::from("evidence"), CoreValue::Null);
v_missing_evidence = core_is_none(&[v_evidence.clone()])?;
if core_truthy(&v_missing_evidence) {
v_empty_evidence = CoreValue::new_map();
v_metadata_evidence = core_get(
&v_metadata_final,
&CoreValue::from("evidence"),
v_empty_evidence.clone(),
);
core_set(
&v_artifact,
CoreValue::from("evidence"),
v_metadata_evidence.clone(),
)?;
}
v_validated = _validate_optimized_artifact(&[v_artifact.clone(), v_components.clone()])?;
v_map = core_get(
&v_validated,
&CoreValue::from("componentMap"),
CoreValue::Null,
);
v_changed = _optimization_changed_components(&[v_components.clone(), v_map.clone()])?;
core_set(
&v_validated,
CoreValue::from("changedComponents"),
v_changed.clone(),
)?;
return Ok(v_validated.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _build_optimizer_evidence_batch(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_build_optimizer_evidence_batch");
let mut v_eval_result = core_arg(args, 0);
let mut v_components = core_arg(args, 1);
let mut v_avg = CoreValue::Null;
let mut v_candidate_map = CoreValue::Null;
let mut v_component = CoreValue::Null;
let mut v_count = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_has_error = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_items = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_outputs = CoreValue::Null;
let mut v_prediction = CoreValue::Null;
let mut v_prediction_error = CoreValue::Null;
let mut v_reflective = CoreValue::Null;
let mut v_row = CoreValue::Null;
let mut v_row_error = CoreValue::Null;
let mut v_rows = CoreValue::Null;
let mut v_scalar = CoreValue::Null;
let mut v_score_vectors = CoreValue::Null;
let mut v_scores = CoreValue::Null;
let mut v_sum = CoreValue::Null;
let mut v_trace = CoreValue::Null;
let mut v_trajectories = CoreValue::Null;
let mut v_trajectory = CoreValue::Null;
let mut v_vector = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_empty_map = CoreValue::new_map();
v_rows = core_get(
&v_eval_result,
&CoreValue::from("rows"),
v_empty_list.clone(),
);
v_outputs = CoreValue::new_list();
v_scores = CoreValue::new_list();
v_score_vectors = CoreValue::new_list();
v_trajectories = CoreValue::new_list();
for v_row in core_iter(&v_rows)? {
let mut v_row = v_row;
v_prediction = core_get(&v_row, &CoreValue::from("prediction"), v_empty_map.clone());
v_output = core_get(
&v_prediction,
&CoreValue::from("output"),
v_prediction.clone(),
);
core_append(&v_outputs, v_output.clone())?;
v_scalar = core_get(&v_row, &CoreValue::from("scalar"), CoreValue::Num(0f64));
core_append(&v_scores, v_scalar.clone())?;
v_vector = core_get(&v_row, &CoreValue::from("scores"), v_empty_map.clone());
core_append(&v_score_vectors, v_vector.clone())?;
v_trajectory = CoreValue::new_map();
v_trace = core_get(&v_row, &CoreValue::from("trace"), CoreValue::Null);
core_set(&v_trajectory, CoreValue::from("trace"), v_trace.clone())?;
core_set(&v_trajectory, CoreValue::from("output"), v_output.clone())?;
v_row_error = core_get(&v_row, &CoreValue::from("error"), CoreValue::Null);
v_prediction_error = core_get(
&v_prediction,
&CoreValue::from("error"),
v_row_error.clone(),
);
v_has_error = core_is_not_none(&[v_prediction_error.clone()])?;
if core_truthy(&v_has_error) {
core_set(
&v_trajectory,
CoreValue::from("error"),
v_prediction_error.clone(),
)?;
}
core_append(&v_trajectories, v_trajectory.clone())?;
}
v_reflective = CoreValue::new_map();
for v_component in core_iter(&v_components)? {
let mut v_component = v_component;
v_id = core_get(&v_component, &CoreValue::from("id"), CoreValue::from(""));
v_items = CoreValue::new_list();
for v_row in core_iter(&v_rows)? {
let mut v_row = v_row;
v_entry = CoreValue::new_map();
v_prediction = core_get(&v_row, &CoreValue::from("prediction"), v_empty_map.clone());
v_output = core_get(
&v_prediction,
&CoreValue::from("output"),
v_prediction.clone(),
);
v_scalar = core_get(&v_row, &CoreValue::from("scalar"), CoreValue::Num(0f64));
v_trace = core_get(&v_row, &CoreValue::from("trace"), CoreValue::Null);
core_set(&v_entry, CoreValue::from("score"), v_scalar.clone())?;
core_set(&v_entry, CoreValue::from("output"), v_output.clone())?;
core_set(&v_entry, CoreValue::from("trace"), v_trace.clone())?;
v_error = core_get(&v_row, &CoreValue::from("error"), CoreValue::Null);
v_has_error = core_is_not_none(&[v_error.clone()])?;
if core_truthy(&v_has_error) {
core_set(&v_entry, CoreValue::from("error"), v_error.clone())?;
}
core_append(&v_items, v_entry.clone())?;
}
core_set(&v_reflective, v_id.clone(), v_items.clone())?;
}
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("contractVersion"),
CoreValue::from("axir-optimizer-evidence-v1"),
)?;
v_candidate_map = core_get(
&v_eval_result,
&CoreValue::from("candidateMap"),
v_empty_map.clone(),
);
core_set(
&v_out,
CoreValue::from("candidateMap"),
v_candidate_map.clone(),
)?;
core_set(&v_out, CoreValue::from("outputs"), v_outputs.clone())?;
core_set(&v_out, CoreValue::from("scores"), v_scores.clone())?;
core_set(
&v_out,
CoreValue::from("scoreVectors"),
v_score_vectors.clone(),
)?;
core_set(
&v_out,
CoreValue::from("trajectories"),
v_trajectories.clone(),
)?;
v_avg = core_get(
&v_eval_result,
&CoreValue::from("avg"),
CoreValue::Num(0f64),
);
v_sum = core_get(
&v_eval_result,
&CoreValue::from("sum"),
CoreValue::Num(0f64),
);
v_count = core_get(
&v_eval_result,
&CoreValue::from("count"),
CoreValue::Num(0f64),
);
core_set(&v_out, CoreValue::from("avg"), v_avg.clone())?;
core_set(&v_out, CoreValue::from("sum"), v_sum.clone())?;
core_set(&v_out, CoreValue::from("count"), v_count.clone())?;
core_set(
&v_out,
CoreValue::from("reflectiveDataset"),
v_reflective.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _ace_estimate_token_count(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_ace_estimate_token_count");
let mut v_text = core_arg(args, 0);
let mut v_done = CoreValue::Null;
let mut v_len = CoreValue::Null;
let mut v_remaining = CoreValue::Null;
let mut v_remaining_next = CoreValue::Null;
let mut v_tokens = CoreValue::Null;
let mut v_tokens_next = CoreValue::Null;
v_len = core_len(&[v_text.clone()])?;
v_tokens = CoreValue::Num(0f64);
v_remaining = v_len.clone();
loop {
v_done = core_lte(&[v_remaining.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_done) {
break;
}
v_tokens_next = core_add(&[v_tokens.clone(), CoreValue::Num(1f64)])?;
v_tokens = v_tokens_next.clone();
v_remaining_next = core_add(&[v_remaining.clone(), CoreValue::Num(-4f64)])?;
v_remaining = v_remaining_next.clone();
}
return Ok(v_tokens.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _ace_recompute_playbook_stats(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_ace_recompute_playbook_stats");
let mut v_playbook = core_arg(args, 0);
let mut v_bullet = CoreValue::Null;
let mut v_bullet_count = CoreValue::Null;
let mut v_bullet_count_next = CoreValue::Null;
let mut v_bullet_tokens = CoreValue::Null;
let mut v_bullets = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_harmful = CoreValue::Null;
let mut v_harmful_count = CoreValue::Null;
let mut v_harmful_count_next = CoreValue::Null;
let mut v_helpful = CoreValue::Null;
let mut v_helpful_count = CoreValue::Null;
let mut v_helpful_count_next = CoreValue::Null;
let mut v_section_lists = CoreValue::Null;
let mut v_sections = CoreValue::Null;
let mut v_stats = CoreValue::Null;
let mut v_token_estimate = CoreValue::Null;
let mut v_token_estimate_next = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_sections = core_get(
&v_playbook,
&CoreValue::from("sections"),
v_empty_map.clone(),
);
v_bullet_count = CoreValue::Num(0f64);
v_helpful_count = CoreValue::Num(0f64);
v_harmful_count = CoreValue::Num(0f64);
v_token_estimate = CoreValue::Num(0f64);
v_section_lists = core_map_values(&[v_sections.clone()])?;
for v_bullets in core_iter(&v_section_lists)? {
let mut v_bullets = v_bullets;
for v_bullet in core_iter(&v_bullets)? {
let mut v_bullet = v_bullet;
v_bullet_count_next = core_add(&[v_bullet_count.clone(), CoreValue::Num(1f64)])?;
v_bullet_count = v_bullet_count_next.clone();
v_helpful = core_get(
&v_bullet,
&CoreValue::from("helpfulCount"),
CoreValue::Num(0f64),
);
v_harmful = core_get(
&v_bullet,
&CoreValue::from("harmfulCount"),
CoreValue::Num(0f64),
);
v_helpful_count_next = core_add(&[v_helpful_count.clone(), v_helpful.clone()])?;
v_helpful_count = v_helpful_count_next.clone();
v_harmful_count_next = core_add(&[v_harmful_count.clone(), v_harmful.clone()])?;
v_harmful_count = v_harmful_count_next.clone();
v_content = core_get(&v_bullet, &CoreValue::from("content"), CoreValue::from(""));
v_bullet_tokens = _ace_estimate_token_count(&[v_content.clone()])?;
v_token_estimate_next = core_add(&[v_token_estimate.clone(), v_bullet_tokens.clone()])?;
v_token_estimate = v_token_estimate_next.clone();
}
}
v_stats = CoreValue::new_map();
core_set(
&v_stats,
CoreValue::from("bulletCount"),
v_bullet_count.clone(),
)?;
core_set(
&v_stats,
CoreValue::from("helpfulCount"),
v_helpful_count.clone(),
)?;
core_set(
&v_stats,
CoreValue::from("harmfulCount"),
v_harmful_count.clone(),
)?;
core_set(
&v_stats,
CoreValue::from("tokenEstimate"),
v_token_estimate.clone(),
)?;
core_set(&v_playbook, CoreValue::from("stats"), v_stats.clone())?;
return Ok(v_playbook.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _ace_empty_playbook(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_ace_empty_playbook");
let mut v_description = core_arg(args, 0);
let mut v_now = core_arg(args, 1);
let mut v_has_description = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_sections = CoreValue::Null;
let mut v_stats = CoreValue::Null;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("version"), CoreValue::Num(1f64))?;
v_sections = CoreValue::new_map();
core_set(&v_out, CoreValue::from("sections"), v_sections.clone())?;
v_stats = CoreValue::new_map();
core_set(
&v_stats,
CoreValue::from("bulletCount"),
CoreValue::Num(0f64),
)?;
core_set(
&v_stats,
CoreValue::from("helpfulCount"),
CoreValue::Num(0f64),
)?;
core_set(
&v_stats,
CoreValue::from("harmfulCount"),
CoreValue::Num(0f64),
)?;
core_set(
&v_stats,
CoreValue::from("tokenEstimate"),
CoreValue::Num(0f64),
)?;
core_set(&v_out, CoreValue::from("stats"), v_stats.clone())?;
core_set(&v_out, CoreValue::from("updatedAt"), v_now.clone())?;
v_has_description = core_is_not_none(&[v_description.clone()])?;
if core_truthy(&v_has_description) {
core_set(
&v_out,
CoreValue::from("description"),
v_description.clone(),
)?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _ace_render_playbook(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_ace_render_playbook");
let mut v_playbook = core_arg(args, 0);
let mut v_block = CoreValue::Null;
let mut v_block_empty = CoreValue::Null;
let mut v_block_with_body = CoreValue::Null;
let mut v_body = CoreValue::Null;
let mut v_bullet = CoreValue::Null;
let mut v_bullet_lines = CoreValue::Null;
let mut v_bullets = CoreValue::Null;
let mut v_combined = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_description = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_has_body = CoreValue::Null;
let mut v_has_description = CoreValue::Null;
let mut v_header = CoreValue::Null;
let mut v_header_with_description = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_joined_sections = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_section_blocks = CoreValue::Null;
let mut v_section_name = CoreValue::Null;
let mut v_section_names = CoreValue::Null;
let mut v_sections = CoreValue::Null;
let mut v_trimmed_description = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_description = core_get(
&v_playbook,
&CoreValue::from("description"),
CoreValue::Null,
);
v_has_description = core_is_not_none(&[v_description.clone()])?;
v_header = CoreValue::from("## Context Playbook\n");
if core_truthy(&v_has_description) {
v_trimmed_description = core_string_trim(&v_description);
v_header_with_description = core_string_format(&[
CoreValue::from("## Context Playbook\n{}\n"),
v_trimmed_description.clone(),
])?;
v_header = v_header_with_description.clone();
}
v_sections = core_get(
&v_playbook,
&CoreValue::from("sections"),
v_empty_map.clone(),
);
v_section_names = core_map_keys(&[v_sections.clone()])?;
v_section_blocks = CoreValue::new_list();
for v_section_name in core_iter(&v_section_names)? {
let mut v_section_name = v_section_name;
v_bullets = core_get(&v_sections, &v_section_name.clone(), CoreValue::Null);
v_bullet_lines = CoreValue::new_list();
for v_bullet in core_iter(&v_bullets)? {
let mut v_bullet = v_bullet;
v_id = core_get(&v_bullet, &CoreValue::from("id"), CoreValue::from(""));
v_content = core_get(&v_bullet, &CoreValue::from("content"), CoreValue::from(""));
v_line = core_string_format(&[
CoreValue::from("- [{}] {}"),
v_id.clone(),
v_content.clone(),
])?;
core_append(&v_bullet_lines, v_line.clone())?;
}
v_body = core_string_join(&CoreValue::from("\n"), &v_bullet_lines)?;
v_has_body = core_ne(&[v_body.clone(), CoreValue::from("")])?;
v_block = CoreValue::from("");
if core_truthy(&v_has_body) {
v_block_with_body = core_string_format(&[
CoreValue::from("### {}\n{}"),
v_section_name.clone(),
v_body.clone(),
])?;
v_block = v_block_with_body.clone();
} else {
v_block_empty = core_string_format(&[
CoreValue::from("### {}\n_(empty)_"),
v_section_name.clone(),
])?;
v_block = v_block_empty.clone();
}
core_append(&v_section_blocks, v_block.clone())?;
}
v_joined_sections = core_string_join(&CoreValue::from("\n\n"), &v_section_blocks)?;
v_combined = core_string_format(&[
CoreValue::from("{}\n{}"),
v_header.clone(),
v_joined_sections.clone(),
])?;
v_result = core_string_trim(&v_combined);
return Ok(v_result.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _ace_update_bullet_feedback(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_ace_update_bullet_feedback");
let mut v_playbook = core_arg(args, 0);
let mut v_bullet_id = core_arg(args, 1);
let mut v_tag = core_arg(args, 2);
let mut v_now = core_arg(args, 3);
let mut v_already_found = CoreValue::Null;
let mut v_bullet = CoreValue::Null;
let mut v_bullets = CoreValue::Null;
let mut v_current_id = CoreValue::Null;
let mut v_did_find = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_found = CoreValue::Null;
let mut v_harmful = CoreValue::Null;
let mut v_harmful_next = CoreValue::Null;
let mut v_helpful = CoreValue::Null;
let mut v_helpful_next = CoreValue::Null;
let mut v_is_harmful = CoreValue::Null;
let mut v_is_helpful = CoreValue::Null;
let mut v_match = CoreValue::Null;
let mut v_section_name = CoreValue::Null;
let mut v_section_names = CoreValue::Null;
let mut v_sections = CoreValue::Null;
let mut v_still_open = CoreValue::Null;
let mut v_updated = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_sections = core_get(
&v_playbook,
&CoreValue::from("sections"),
v_empty_map.clone(),
);
v_section_names = core_map_keys(&[v_sections.clone()])?;
v_found = CoreValue::Bool(false);
for v_section_name in core_iter(&v_section_names)? {
let mut v_section_name = v_section_name;
v_already_found = v_found.clone();
if core_truthy(&v_already_found) {
} else {
v_bullets = core_get(&v_sections, &v_section_name.clone(), CoreValue::Null);
for v_bullet in core_iter(&v_bullets)? {
let mut v_bullet = v_bullet;
v_current_id = core_get(&v_bullet, &CoreValue::from("id"), CoreValue::from(""));
v_match = core_eq(&[v_bullet_id.clone(), v_current_id.clone()])?;
v_still_open = core_not(&[v_found.clone()])?;
if core_truthy(&v_match) {
if core_truthy(&v_still_open) {
v_is_helpful = core_eq(&[v_tag.clone(), CoreValue::from("helpful")])?;
if core_truthy(&v_is_helpful) {
v_helpful = core_get(
&v_bullet,
&CoreValue::from("helpfulCount"),
CoreValue::Num(0f64),
);
v_helpful_next = core_add(&[v_helpful.clone(), CoreValue::Num(1f64)])?;
core_set(
&v_bullet,
CoreValue::from("helpfulCount"),
v_helpful_next.clone(),
)?;
}
v_is_harmful = core_eq(&[v_tag.clone(), CoreValue::from("harmful")])?;
if core_truthy(&v_is_harmful) {
v_harmful = core_get(
&v_bullet,
&CoreValue::from("harmfulCount"),
CoreValue::Num(0f64),
);
v_harmful_next = core_add(&[v_harmful.clone(), CoreValue::Num(1f64)])?;
core_set(
&v_bullet,
CoreValue::from("harmfulCount"),
v_harmful_next.clone(),
)?;
}
core_set(&v_bullet, CoreValue::from("updatedAt"), v_now.clone())?;
v_found = CoreValue::Bool(true);
}
}
}
}
}
v_did_find = v_found.clone();
if core_truthy(&v_did_find) {
v_updated = _ace_recompute_playbook_stats(&[v_playbook.clone()])?;
return Ok(v_updated.clone());
}
return Ok(v_playbook.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _ace_dedupe_playbook(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_ace_dedupe_playbook");
let mut v_playbook = core_arg(args, 0);
let mut v_bullet = CoreValue::Null;
let mut v_bullet_harmful = CoreValue::Null;
let mut v_bullet_helpful = CoreValue::Null;
let mut v_bullet_updated_at = CoreValue::Null;
let mut v_bullets = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_existing = CoreValue::Null;
let mut v_existing_harmful = CoreValue::Null;
let mut v_existing_helpful = CoreValue::Null;
let mut v_has_existing = CoreValue::Null;
let mut v_key = CoreValue::Null;
let mut v_merged_harmful = CoreValue::Null;
let mut v_merged_helpful = CoreValue::Null;
let mut v_recomputed = CoreValue::Null;
let mut v_section_name = CoreValue::Null;
let mut v_section_names = CoreValue::Null;
let mut v_sections = CoreValue::Null;
let mut v_seen = CoreValue::Null;
let mut v_trimmed = CoreValue::Null;
let mut v_unique = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_sections = core_get(
&v_playbook,
&CoreValue::from("sections"),
v_empty_map.clone(),
);
v_section_names = core_map_keys(&[v_sections.clone()])?;
for v_section_name in core_iter(&v_section_names)? {
let mut v_section_name = v_section_name;
v_bullets = core_get(&v_sections, &v_section_name.clone(), CoreValue::Null);
v_seen = CoreValue::new_map();
v_unique = CoreValue::new_list();
for v_bullet in core_iter(&v_bullets)? {
let mut v_bullet = v_bullet;
v_content = core_get(&v_bullet, &CoreValue::from("content"), CoreValue::from(""));
v_trimmed = core_string_trim(&v_content);
v_key = core_string_lower(&[v_trimmed.clone()])?;
v_has_existing = core_map_contains(&[v_seen.clone(), v_key.clone()])?;
if core_truthy(&v_has_existing) {
v_existing = core_get(&v_seen, &v_key.clone(), CoreValue::Null);
v_existing_helpful = core_get(
&v_existing,
&CoreValue::from("helpfulCount"),
CoreValue::Num(0f64),
);
v_bullet_helpful = core_get(
&v_bullet,
&CoreValue::from("helpfulCount"),
CoreValue::Num(0f64),
);
v_merged_helpful =
core_add(&[v_existing_helpful.clone(), v_bullet_helpful.clone()])?;
core_set(
&v_existing,
CoreValue::from("helpfulCount"),
v_merged_helpful.clone(),
)?;
v_existing_harmful = core_get(
&v_existing,
&CoreValue::from("harmfulCount"),
CoreValue::Num(0f64),
);
v_bullet_harmful = core_get(
&v_bullet,
&CoreValue::from("harmfulCount"),
CoreValue::Num(0f64),
);
v_merged_harmful =
core_add(&[v_existing_harmful.clone(), v_bullet_harmful.clone()])?;
core_set(
&v_existing,
CoreValue::from("harmfulCount"),
v_merged_harmful.clone(),
)?;
v_bullet_updated_at = core_get(
&v_bullet,
&CoreValue::from("updatedAt"),
CoreValue::from(""),
);
core_set(
&v_existing,
CoreValue::from("updatedAt"),
v_bullet_updated_at.clone(),
)?;
} else {
core_set(&v_seen, v_key.clone(), v_bullet.clone())?;
core_append(&v_unique, v_bullet.clone())?;
}
}
core_set(&v_sections, v_section_name.clone(), v_unique.clone())?;
}
core_set(&v_playbook, CoreValue::from("sections"), v_sections.clone())?;
v_recomputed = _ace_recompute_playbook_stats(&[v_playbook.clone()])?;
return Ok(v_recomputed.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _ace_prune_section_for_addition(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_ace_prune_section_for_addition");
let mut v_section = core_arg(args, 0);
let mut v_protected_ids = core_arg(args, 1);
let mut v_bullet = CoreValue::Null;
let mut v_candidate_helpful = CoreValue::Null;
let mut v_candidate_index = CoreValue::Null;
let mut v_candidate_net = CoreValue::Null;
let mut v_candidate_recency = CoreValue::Null;
let mut v_created_at = CoreValue::Null;
let mut v_cursor = CoreValue::Null;
let mut v_cursor_next = CoreValue::Null;
let mut v_harmful = CoreValue::Null;
let mut v_harmful_weighted = CoreValue::Null;
let mut v_has_candidate = CoreValue::Null;
let mut v_helpful = CoreValue::Null;
let mut v_helpful_equal = CoreValue::Null;
let mut v_helpful_lower = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_index = CoreValue::Null;
let mut v_index_next = CoreValue::Null;
let mut v_is_protected = CoreValue::Null;
let mut v_is_target = CoreValue::Null;
let mut v_is_worse = CoreValue::Null;
let mut v_negative_harmful = CoreValue::Null;
let mut v_net_equal = CoreValue::Null;
let mut v_net_lower = CoreValue::Null;
let mut v_net_score = CoreValue::Null;
let mut v_new_section = CoreValue::Null;
let mut v_no_candidate = CoreValue::Null;
let mut v_not_protected = CoreValue::Null;
let mut v_null_pruned = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_pruned = CoreValue::Null;
let mut v_recency = CoreValue::Null;
let mut v_recency_lower = CoreValue::Null;
v_candidate_index = CoreValue::Num(-1f64);
v_candidate_net = CoreValue::Num(0f64);
v_candidate_helpful = CoreValue::Num(0f64);
v_candidate_recency = CoreValue::Num(0f64);
v_index = CoreValue::Num(0f64);
for v_bullet in core_iter(&v_section)? {
let mut v_bullet = v_bullet;
v_id = core_get(&v_bullet, &CoreValue::from("id"), CoreValue::from(""));
v_is_protected = core_contains(&[v_protected_ids.clone(), v_id.clone()])?;
v_not_protected = core_not(&[v_is_protected.clone()])?;
if core_truthy(&v_not_protected) {
v_helpful = core_get(
&v_bullet,
&CoreValue::from("helpfulCount"),
CoreValue::Num(0f64),
);
v_harmful = core_get(
&v_bullet,
&CoreValue::from("harmfulCount"),
CoreValue::Num(0f64),
);
v_harmful_weighted = core_mul(&[v_harmful.clone(), CoreValue::Num(2f64)])?;
v_negative_harmful = core_mul(&[v_harmful_weighted.clone(), CoreValue::Num(-1f64)])?;
v_net_score = core_add(&[v_helpful.clone(), v_negative_harmful.clone()])?;
v_created_at = core_get(
&v_bullet,
&CoreValue::from("createdAt"),
CoreValue::from(""),
);
v_recency = core_get(
&v_bullet,
&CoreValue::from("updatedAt"),
v_created_at.clone(),
);
v_no_candidate = core_lt(&[v_candidate_index.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_no_candidate) {
v_candidate_index = v_index.clone();
v_candidate_net = v_net_score.clone();
v_candidate_helpful = v_helpful.clone();
v_candidate_recency = v_recency.clone();
} else {
v_net_lower = core_lt(&[v_net_score.clone(), v_candidate_net.clone()])?;
v_net_equal = core_eq(&[v_net_score.clone(), v_candidate_net.clone()])?;
v_helpful_lower = core_lt(&[v_helpful.clone(), v_candidate_helpful.clone()])?;
v_helpful_equal = core_eq(&[v_helpful.clone(), v_candidate_helpful.clone()])?;
v_recency_lower = core_lt(&[v_recency.clone(), v_candidate_recency.clone()])?;
v_is_worse = v_net_lower.clone();
if core_truthy(&v_net_equal) {
if core_truthy(&v_helpful_lower) {
v_is_worse = CoreValue::Bool(true);
}
if core_truthy(&v_helpful_equal) {
if core_truthy(&v_recency_lower) {
v_is_worse = CoreValue::Bool(true);
}
}
}
if core_truthy(&v_is_worse) {
v_candidate_index = v_index.clone();
v_candidate_net = v_net_score.clone();
v_candidate_helpful = v_helpful.clone();
v_candidate_recency = v_recency.clone();
}
}
}
v_index_next = core_add(&[v_index.clone(), CoreValue::Num(1f64)])?;
v_index = v_index_next.clone();
}
v_out = CoreValue::new_map();
v_has_candidate = core_gte(&[v_candidate_index.clone(), CoreValue::Num(0f64)])?;
v_new_section = CoreValue::new_list();
if core_truthy(&v_has_candidate) {
v_pruned = core_none(&[])?;
v_cursor = CoreValue::Num(0f64);
for v_bullet in core_iter(&v_section)? {
let mut v_bullet = v_bullet;
v_is_target = core_eq(&[v_cursor.clone(), v_candidate_index.clone()])?;
if core_truthy(&v_is_target) {
v_pruned = v_bullet.clone();
} else {
core_append(&v_new_section, v_bullet.clone())?;
}
v_cursor_next = core_add(&[v_cursor.clone(), CoreValue::Num(1f64)])?;
v_cursor = v_cursor_next.clone();
}
core_set(&v_out, CoreValue::from("pruned"), v_pruned.clone())?;
core_set(&v_out, CoreValue::from("section"), v_new_section.clone())?;
return Ok(v_out.clone());
}
v_null_pruned = core_none(&[])?;
core_set(&v_out, CoreValue::from("pruned"), v_null_pruned.clone())?;
core_set(&v_out, CoreValue::from("section"), v_section.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _ace_apply_curator_operations(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_ace_apply_curator_operations");
let mut v_playbook = core_arg(args, 0);
let mut v_operations = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_now = core_arg(args, 3);
let mut v_allow_dynamic = CoreValue::Null;
let mut v_at_capacity = CoreValue::Null;
let mut v_at_capacity_raw = CoreValue::Null;
let mut v_auto_removed = CoreValue::Null;
let mut v_bullet = CoreValue::Null;
let mut v_bullet_id = CoreValue::Null;
let mut v_bullet_id_update = CoreValue::Null;
let mut v_bullet_match = CoreValue::Null;
let mut v_bullet_metadata = CoreValue::Null;
let mut v_bullet_remove_match = CoreValue::Null;
let mut v_candidate_bullet_id = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_content_is_string = CoreValue::Null;
let mut v_did_remove = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_enable_auto_prune = CoreValue::Null;
let mut v_existing_metadata = CoreValue::Null;
let mut v_has_bullet_id = CoreValue::Null;
let mut v_has_content = CoreValue::Null;
let mut v_has_max = CoreValue::Null;
let mut v_has_metadata = CoreValue::Null;
let mut v_has_metadata_update = CoreValue::Null;
let mut v_has_pruned = CoreValue::Null;
let mut v_has_section_name = CoreValue::Null;
let mut v_is_add = CoreValue::Null;
let mut v_is_remove = CoreValue::Null;
let mut v_is_update = CoreValue::Null;
let mut v_kept = CoreValue::Null;
let mut v_max_section_size = CoreValue::Null;
let mut v_merged_metadata = CoreValue::Null;
let mut v_missing_bullet_id = CoreValue::Null;
let mut v_missing_section = CoreValue::Null;
let mut v_new_section_list = CoreValue::Null;
let mut v_none_value = CoreValue::Null;
let mut v_op = CoreValue::Null;
let mut v_op_bullet_id = CoreValue::Null;
let mut v_op_content = CoreValue::Null;
let mut v_op_metadata = CoreValue::Null;
let mut v_op_metadata_update = CoreValue::Null;
let mut v_op_type = CoreValue::Null;
let mut v_opts = CoreValue::Null;
let mut v_opts_missing = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_proceed = CoreValue::Null;
let mut v_protected_ids = CoreValue::Null;
let mut v_prune_result = CoreValue::Null;
let mut v_pruned = CoreValue::Null;
let mut v_pruned_id = CoreValue::Null;
let mut v_pruned_metadata = CoreValue::Null;
let mut v_pruned_section = CoreValue::Null;
let mut v_raw_content = CoreValue::Null;
let mut v_recomputed = CoreValue::Null;
let mut v_removal = CoreValue::Null;
let mut v_removal_metadata = CoreValue::Null;
let mut v_remove_candidate_id = CoreValue::Null;
let mut v_remove_id = CoreValue::Null;
let mut v_removed_id = CoreValue::Null;
let mut v_section = CoreValue::Null;
let mut v_section_exists = CoreValue::Null;
let mut v_section_len = CoreValue::Null;
let mut v_section_name = CoreValue::Null;
let mut v_section_now_exists = CoreValue::Null;
let mut v_sections = CoreValue::Null;
let mut v_target_id = CoreValue::Null;
let mut v_updated_bullets = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_empty_list = CoreValue::new_list();
v_opts = v_options.clone();
v_opts_missing = core_is_none(&[v_options.clone()])?;
if core_truthy(&v_opts_missing) {
v_opts = v_empty_map.clone();
}
v_allow_dynamic = core_get(
&v_opts,
&CoreValue::from("allowDynamicSections"),
CoreValue::Bool(true),
);
v_enable_auto_prune = core_get(
&v_opts,
&CoreValue::from("enableAutoPrune"),
CoreValue::Bool(false),
);
v_has_max = core_map_contains(&[v_opts.clone(), CoreValue::from("maxSectionSize")])?;
v_max_section_size = core_get(
&v_opts,
&CoreValue::from("maxSectionSize"),
CoreValue::Num(0f64),
);
v_protected_ids = core_get(
&v_opts,
&CoreValue::from("protectedBulletIds"),
v_empty_list.clone(),
);
v_updated_bullets = CoreValue::new_list();
v_auto_removed = CoreValue::new_list();
v_sections = core_get(
&v_playbook,
&CoreValue::from("sections"),
v_empty_map.clone(),
);
for v_op in core_iter(&v_operations)? {
let mut v_op = v_op;
v_section_name = core_get(&v_op, &CoreValue::from("section"), CoreValue::from(""));
v_has_section_name = core_ne(&[v_section_name.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_section_name) {
v_section_exists = core_map_contains(&[v_sections.clone(), v_section_name.clone()])?;
v_missing_section = core_not(&[v_section_exists.clone()])?;
if core_truthy(&v_missing_section) {
if core_truthy(&v_allow_dynamic) {
v_new_section_list = CoreValue::new_list();
core_set(
&v_sections,
v_section_name.clone(),
v_new_section_list.clone(),
)?;
}
}
v_section_now_exists =
core_map_contains(&[v_sections.clone(), v_section_name.clone()])?;
if core_truthy(&v_section_now_exists) {
v_section = core_get(&v_sections, &v_section_name.clone(), CoreValue::Null);
v_op_type = core_get(&v_op, &CoreValue::from("type"), CoreValue::from(""));
v_is_add = core_eq(&[v_op_type.clone(), CoreValue::from("ADD")])?;
if core_truthy(&v_is_add) {
v_raw_content =
core_get(&v_op, &CoreValue::from("content"), CoreValue::from(""));
v_content = core_string_trim(&v_raw_content);
v_has_content = core_ne(&[v_content.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_content) {
v_section_len = core_len(&[v_section.clone()])?;
v_at_capacity_raw =
core_gte(&[v_section_len.clone(), v_max_section_size.clone()])?;
v_at_capacity = CoreValue::Bool(false);
if core_truthy(&v_has_max) {
if core_truthy(&v_at_capacity_raw) {
v_at_capacity = CoreValue::Bool(true);
}
}
v_proceed = CoreValue::Bool(true);
if core_truthy(&v_at_capacity) {
if core_truthy(&v_enable_auto_prune) {
v_prune_result = _ace_prune_section_for_addition(&[
v_section.clone(),
v_protected_ids.clone(),
])?;
v_pruned = core_get(
&v_prune_result,
&CoreValue::from("pruned"),
CoreValue::Null,
);
v_has_pruned = core_is_not_none(&[v_pruned.clone()])?;
if core_truthy(&v_has_pruned) {
v_pruned_section = core_get(
&v_prune_result,
&CoreValue::from("section"),
CoreValue::Null,
);
v_section = v_pruned_section.clone();
core_set(
&v_sections,
v_section_name.clone(),
v_section.clone(),
)?;
v_pruned_id = core_get(
&v_pruned,
&CoreValue::from("id"),
CoreValue::from(""),
);
core_append(&v_updated_bullets, v_pruned_id.clone())?;
v_removal = CoreValue::new_map();
core_set(
&v_removal,
CoreValue::from("type"),
CoreValue::from("REMOVE"),
)?;
core_set(
&v_removal,
CoreValue::from("section"),
v_section_name.clone(),
)?;
core_set(
&v_removal,
CoreValue::from("bulletId"),
v_pruned_id.clone(),
)?;
v_pruned_metadata = core_get(
&v_pruned,
&CoreValue::from("metadata"),
v_empty_map.clone(),
);
v_removal_metadata = core_map_merge(&[
v_empty_map.clone(),
v_pruned_metadata.clone(),
])?;
core_set(
&v_removal_metadata,
CoreValue::from("autoPruned"),
CoreValue::Bool(true),
)?;
core_set(
&v_removal_metadata,
CoreValue::from("removedAt"),
v_now.clone(),
)?;
core_set(
&v_removal,
CoreValue::from("metadata"),
v_removal_metadata.clone(),
)?;
core_append(&v_auto_removed, v_removal.clone())?;
} else {
v_proceed = CoreValue::Bool(false);
}
} else {
v_proceed = CoreValue::Bool(false);
}
}
if core_truthy(&v_proceed) {
v_op_bullet_id =
core_get(&v_op, &CoreValue::from("bulletId"), CoreValue::Null);
v_has_bullet_id = core_is_not_none(&[v_op_bullet_id.clone()])?;
v_bullet_id = v_op_bullet_id.clone();
v_missing_bullet_id = core_not(&[v_has_bullet_id.clone()])?;
if core_truthy(&v_missing_bullet_id) {
v_bullet_id = v_section_name.clone();
}
v_bullet = CoreValue::new_map();
core_set(&v_bullet, CoreValue::from("id"), v_bullet_id.clone())?;
core_set(
&v_bullet,
CoreValue::from("section"),
v_section_name.clone(),
)?;
core_set(&v_bullet, CoreValue::from("content"), v_content.clone())?;
core_set(
&v_bullet,
CoreValue::from("helpfulCount"),
CoreValue::Num(0f64),
)?;
core_set(
&v_bullet,
CoreValue::from("harmfulCount"),
CoreValue::Num(0f64),
)?;
core_set(&v_bullet, CoreValue::from("createdAt"), v_now.clone())?;
core_set(&v_bullet, CoreValue::from("updatedAt"), v_now.clone())?;
v_op_metadata =
core_get(&v_op, &CoreValue::from("metadata"), CoreValue::Null);
v_has_metadata = core_is_not_none(&[v_op_metadata.clone()])?;
if core_truthy(&v_has_metadata) {
v_bullet_metadata =
core_map_merge(&[v_empty_map.clone(), v_op_metadata.clone()])?;
core_set(
&v_bullet,
CoreValue::from("metadata"),
v_bullet_metadata.clone(),
)?;
}
core_append(&v_section, v_bullet.clone())?;
core_set(&v_sections, v_section_name.clone(), v_section.clone())?;
core_append(&v_updated_bullets, v_bullet_id.clone())?;
}
}
}
v_is_update = core_eq(&[v_op_type.clone(), CoreValue::from("UPDATE")])?;
if core_truthy(&v_is_update) {
v_target_id = core_get(&v_op, &CoreValue::from("bulletId"), CoreValue::Null);
for v_bullet in core_iter(&v_section)? {
let mut v_bullet = v_bullet;
v_candidate_bullet_id =
core_get(&v_bullet, &CoreValue::from("id"), CoreValue::from(""));
v_bullet_match =
core_eq(&[v_candidate_bullet_id.clone(), v_target_id.clone()])?;
if core_truthy(&v_bullet_match) {
v_op_content =
core_get(&v_op, &CoreValue::from("content"), CoreValue::Null);
v_content_is_string =
core_type_is(&v_op_content, CoreValue::from("string"));
if core_truthy(&v_content_is_string) {
core_set(
&v_bullet,
CoreValue::from("content"),
v_op_content.clone(),
)?;
}
core_set(&v_bullet, CoreValue::from("updatedAt"), v_now.clone())?;
v_op_metadata_update =
core_get(&v_op, &CoreValue::from("metadata"), CoreValue::Null);
v_has_metadata_update =
core_is_not_none(&[v_op_metadata_update.clone()])?;
if core_truthy(&v_has_metadata_update) {
v_existing_metadata = core_get(
&v_bullet,
&CoreValue::from("metadata"),
v_empty_map.clone(),
);
v_merged_metadata = core_map_merge(&[
v_existing_metadata.clone(),
v_op_metadata_update.clone(),
])?;
core_set(
&v_bullet,
CoreValue::from("metadata"),
v_merged_metadata.clone(),
)?;
}
v_bullet_id_update =
core_get(&v_bullet, &CoreValue::from("id"), CoreValue::from(""));
core_append(&v_updated_bullets, v_bullet_id_update.clone())?;
}
}
}
v_is_remove = core_eq(&[v_op_type.clone(), CoreValue::from("REMOVE")])?;
if core_truthy(&v_is_remove) {
v_remove_id = core_get(&v_op, &CoreValue::from("bulletId"), CoreValue::Null);
v_kept = CoreValue::new_list();
v_none_value = core_none(&[])?;
v_removed_id = v_none_value.clone();
for v_bullet in core_iter(&v_section)? {
let mut v_bullet = v_bullet;
v_remove_candidate_id =
core_get(&v_bullet, &CoreValue::from("id"), CoreValue::from(""));
v_bullet_remove_match =
core_eq(&[v_remove_candidate_id.clone(), v_remove_id.clone()])?;
if core_truthy(&v_bullet_remove_match) {
v_removed_id = v_remove_candidate_id.clone();
} else {
core_append(&v_kept, v_bullet.clone())?;
}
}
core_set(&v_sections, v_section_name.clone(), v_kept.clone())?;
v_did_remove = core_is_not_none(&[v_removed_id.clone()])?;
if core_truthy(&v_did_remove) {
core_append(&v_updated_bullets, v_removed_id.clone())?;
}
}
}
}
}
core_set(&v_playbook, CoreValue::from("sections"), v_sections.clone())?;
v_recomputed = _ace_recompute_playbook_stats(&[v_playbook.clone()])?;
core_set(&v_recomputed, CoreValue::from("updatedAt"), v_now.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("playbook"), v_recomputed.clone())?;
core_set(
&v_out,
CoreValue::from("updatedBulletIds"),
v_updated_bullets.clone(),
)?;
core_set(
&v_out,
CoreValue::from("autoRemoved"),
v_auto_removed.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _ace_is_noop_acknowledgment(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_ace_is_noop_acknowledgment");
let mut v_content = core_arg(args, 0);
let mut v_c = CoreValue::Null;
let mut v_empty = CoreValue::Null;
let mut v_has_keep_prefix = CoreValue::Null;
let mut v_has_remains = CoreValue::Null;
let mut v_has_subject = CoreValue::Null;
let mut v_is_noop = CoreValue::Null;
let mut v_keep_hit = CoreValue::Null;
let mut v_keep_prefix = CoreValue::Null;
let mut v_keep_prefixes = CoreValue::Null;
let mut v_lowered = CoreValue::Null;
let mut v_marker = CoreValue::Null;
let mut v_marker_hit = CoreValue::Null;
let mut v_markers = CoreValue::Null;
let mut v_nonempty = CoreValue::Null;
let mut v_phrase = CoreValue::Null;
let mut v_phrase_hit = CoreValue::Null;
let mut v_phrases = CoreValue::Null;
let mut v_qualifier = CoreValue::Null;
let mut v_qualifier_hit = CoreValue::Null;
let mut v_qualifiers = CoreValue::Null;
let mut v_referent = CoreValue::Null;
let mut v_referent_hit = CoreValue::Null;
let mut v_referents = CoreValue::Null;
let mut v_remains = CoreValue::Null;
let mut v_remains_hit = CoreValue::Null;
let mut v_remains_list = CoreValue::Null;
let mut v_stasis = CoreValue::Null;
let mut v_stasis_hit = CoreValue::Null;
let mut v_stasis_list = CoreValue::Null;
let mut v_subject = CoreValue::Null;
let mut v_subject_hit = CoreValue::Null;
let mut v_subjects = CoreValue::Null;
v_lowered = core_string_lower(&[v_content.clone()])?;
v_c = core_string_trim(&v_lowered);
v_is_noop = CoreValue::Bool(false);
v_empty = core_eq(&[v_c.clone(), CoreValue::from("")])?;
v_nonempty = core_not(&[v_empty.clone()])?;
if core_truthy(&v_nonempty) {
v_markers = CoreValue::new_list();
core_append(&v_markers, CoreValue::from("no-op"))?;
core_append(&v_markers, CoreValue::from("noop"))?;
for v_marker in core_iter(&v_markers)? {
let mut v_marker = v_marker;
v_marker_hit = core_string_starts_with(&[v_c.clone(), v_marker.clone()])?;
if core_truthy(&v_marker_hit) {
v_is_noop = CoreValue::Bool(true);
}
}
v_subjects = CoreValue::new_list();
core_append(&v_subjects, CoreValue::from("no update"))?;
core_append(&v_subjects, CoreValue::from("no updates"))?;
core_append(&v_subjects, CoreValue::from("no change"))?;
core_append(&v_subjects, CoreValue::from("no changes"))?;
core_append(&v_subjects, CoreValue::from("no modification"))?;
core_append(&v_subjects, CoreValue::from("no modifications"))?;
core_append(&v_subjects, CoreValue::from("no edit"))?;
core_append(&v_subjects, CoreValue::from("no edits"))?;
core_append(&v_subjects, CoreValue::from("no revision"))?;
core_append(&v_subjects, CoreValue::from("no revisions"))?;
core_append(&v_subjects, CoreValue::from("no action"))?;
core_append(&v_subjects, CoreValue::from("no adjustment"))?;
core_append(&v_subjects, CoreValue::from("no adjustments"))?;
core_append(&v_subjects, CoreValue::from("no new"))?;
core_append(&v_subjects, CoreValue::from("no additional"))?;
core_append(&v_subjects, CoreValue::from("no further"))?;
v_has_subject = CoreValue::Bool(false);
for v_subject in core_iter(&v_subjects)? {
let mut v_subject = v_subject;
v_subject_hit = core_contains(&[v_c.clone(), v_subject.clone()])?;
if core_truthy(&v_subject_hit) {
v_has_subject = CoreValue::Bool(true);
}
}
if core_truthy(&v_has_subject) {
v_qualifiers = CoreValue::new_list();
core_append(&v_qualifiers, CoreValue::from("needed"))?;
core_append(&v_qualifiers, CoreValue::from("required"))?;
core_append(&v_qualifiers, CoreValue::from("necessary"))?;
core_append(&v_qualifiers, CoreValue::from("warranted"))?;
for v_qualifier in core_iter(&v_qualifiers)? {
let mut v_qualifier = v_qualifier;
v_qualifier_hit = core_contains(&[v_c.clone(), v_qualifier.clone()])?;
if core_truthy(&v_qualifier_hit) {
v_is_noop = CoreValue::Bool(true);
}
}
}
v_phrases = CoreValue::new_list();
core_append(&v_phrases, CoreValue::from("nothing to add"))?;
core_append(&v_phrases, CoreValue::from("nothing to change"))?;
core_append(&v_phrases, CoreValue::from("nothing to update"))?;
core_append(&v_phrases, CoreValue::from("nothing to modify"))?;
core_append(&v_phrases, CoreValue::from("nothing to revise"))?;
core_append(&v_phrases, CoreValue::from("nothing needs"))?;
core_append(&v_phrases, CoreValue::from("nothing further"))?;
for v_phrase in core_iter(&v_phrases)? {
let mut v_phrase = v_phrase;
v_phrase_hit = core_contains(&[v_c.clone(), v_phrase.clone()])?;
if core_truthy(&v_phrase_hit) {
v_is_noop = CoreValue::Bool(true);
}
}
v_keep_prefixes = CoreValue::new_list();
core_append(&v_keep_prefixes, CoreValue::from("keep the existing"))?;
core_append(&v_keep_prefixes, CoreValue::from("leave the existing"))?;
core_append(&v_keep_prefixes, CoreValue::from("retain the existing"))?;
core_append(&v_keep_prefixes, CoreValue::from("preserve the existing"))?;
v_has_keep_prefix = CoreValue::Bool(false);
for v_keep_prefix in core_iter(&v_keep_prefixes)? {
let mut v_keep_prefix = v_keep_prefix;
v_keep_hit = core_string_starts_with(&[v_c.clone(), v_keep_prefix.clone()])?;
if core_truthy(&v_keep_hit) {
v_has_keep_prefix = CoreValue::Bool(true);
}
}
if core_truthy(&v_has_keep_prefix) {
v_stasis_list = CoreValue::new_list();
core_append(&v_stasis_list, CoreValue::from("unchanged"))?;
core_append(&v_stasis_list, CoreValue::from("as is"))?;
core_append(&v_stasis_list, CoreValue::from("as-is"))?;
core_append(&v_stasis_list, CoreValue::from("intact"))?;
core_append(&v_stasis_list, CoreValue::from("in place"))?;
for v_stasis in core_iter(&v_stasis_list)? {
let mut v_stasis = v_stasis;
v_stasis_hit = core_contains(&[v_c.clone(), v_stasis.clone()])?;
if core_truthy(&v_stasis_hit) {
v_is_noop = CoreValue::Bool(true);
}
}
}
v_remains_list = CoreValue::new_list();
core_append(&v_remains_list, CoreValue::from("remains correct"))?;
core_append(&v_remains_list, CoreValue::from("remains unchanged"))?;
core_append(&v_remains_list, CoreValue::from("remains the same"))?;
core_append(&v_remains_list, CoreValue::from("remains valid"))?;
core_append(&v_remains_list, CoreValue::from("remains accurate"))?;
core_append(&v_remains_list, CoreValue::from("already correct"))?;
v_has_remains = CoreValue::Bool(false);
for v_remains in core_iter(&v_remains_list)? {
let mut v_remains = v_remains;
v_remains_hit = core_contains(&[v_c.clone(), v_remains.clone()])?;
if core_truthy(&v_remains_hit) {
v_has_remains = CoreValue::Bool(true);
}
}
if core_truthy(&v_has_remains) {
v_referents = CoreValue::new_list();
core_append(&v_referents, CoreValue::from("existing"))?;
core_append(&v_referents, CoreValue::from("current"))?;
core_append(&v_referents, CoreValue::from("rule"))?;
core_append(&v_referents, CoreValue::from("guideline"))?;
core_append(&v_referents, CoreValue::from("guidance"))?;
core_append(&v_referents, CoreValue::from("playbook"))?;
core_append(&v_referents, CoreValue::from("bullet"))?;
core_append(&v_referents, CoreValue::from("entry"))?;
for v_referent in core_iter(&v_referents)? {
let mut v_referent = v_referent;
v_referent_hit = core_contains(&[v_c.clone(), v_referent.clone()])?;
if core_truthy(&v_referent_hit) {
v_is_noop = CoreValue::Bool(true);
}
}
}
}
return Ok(v_is_noop.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _ace_normalize_curator_operations(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_ace_normalize_curator_operations");
let mut v_operations = core_arg(args, 0);
let mut v_already_seen = CoreValue::Null;
let mut v_bullet_id = CoreValue::Null;
let mut v_bullet_id_is_string = CoreValue::Null;
let mut v_bullet_id_key = CoreValue::Null;
let mut v_bullet_id_nonempty = CoreValue::Null;
let mut v_bullet_id_raw = CoreValue::Null;
let mut v_bullet_id_source = CoreValue::Null;
let mut v_bullet_id_trimmed = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_content_empty = CoreValue::Null;
let mut v_content_is_string = CoreValue::Null;
let mut v_content_raw = CoreValue::Null;
let mut v_content_trimmed = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_metadata = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_fresh = CoreValue::Null;
let mut v_has_bullet_id = CoreValue::Null;
let mut v_has_bullet_id_field = CoreValue::Null;
let mut v_has_inner = CoreValue::Null;
let mut v_has_operations = CoreValue::Null;
let mut v_id_field = CoreValue::Null;
let mut v_inner = CoreValue::Null;
let mut v_is_add_type = CoreValue::Null;
let mut v_is_list = CoreValue::Null;
let mut v_is_noop = CoreValue::Null;
let mut v_is_object = CoreValue::Null;
let mut v_is_remove = CoreValue::Null;
let mut v_is_string = CoreValue::Null;
let mut v_is_update = CoreValue::Null;
let mut v_keep = CoreValue::Null;
let mut v_key = CoreValue::Null;
let mut v_key_a = CoreValue::Null;
let mut v_key_b = CoreValue::Null;
let mut v_lowered = CoreValue::Null;
let mut v_metadata_copy = CoreValue::Null;
let mut v_metadata_is_object = CoreValue::Null;
let mut v_metadata_raw = CoreValue::Null;
let mut v_missing = CoreValue::Null;
let mut v_none_value = CoreValue::Null;
let mut v_normalized = CoreValue::Null;
let mut v_normalized_entry = CoreValue::Null;
let mut v_normalized_from_object = CoreValue::Null;
let mut v_normalized_from_string = CoreValue::Null;
let mut v_not_remove = CoreValue::Null;
let mut v_parsed = CoreValue::Null;
let mut v_parsed_is_none = CoreValue::Null;
let mut v_section = CoreValue::Null;
let mut v_section_is_string = CoreValue::Null;
let mut v_section_nonempty = CoreValue::Null;
let mut v_section_raw = CoreValue::Null;
let mut v_section_trimmed = CoreValue::Null;
let mut v_seen = CoreValue::Null;
let mut v_type = CoreValue::Null;
let mut v_type_is_string = CoreValue::Null;
let mut v_type_lower = CoreValue::Null;
let mut v_type_raw = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_has_operations = core_is_not_none(&[v_operations.clone()])?;
v_missing = core_not(&[v_has_operations.clone()])?;
if core_truthy(&v_missing) {
return Ok(v_empty_list.clone());
}
v_is_list = core_type_is(&v_operations, CoreValue::from("list"));
if core_truthy(&v_is_list) {
v_normalized = CoreValue::new_list();
v_seen = CoreValue::new_map();
for v_entry in core_iter(&v_operations)? {
let mut v_entry = v_entry;
v_is_object = core_type_is(&v_entry, CoreValue::from("object"));
if core_truthy(&v_is_object) {
v_type_raw = core_get(&v_entry, &CoreValue::from("type"), CoreValue::from("ADD"));
v_type_is_string = core_type_is(&v_type_raw, CoreValue::from("string"));
v_type_lower = CoreValue::from("add");
if core_truthy(&v_type_is_string) {
v_lowered = core_string_lower(&[v_type_raw.clone()])?;
v_type_lower = v_lowered.clone();
}
v_is_update = core_eq(&[v_type_lower.clone(), CoreValue::from("update")])?;
v_is_remove = core_eq(&[v_type_lower.clone(), CoreValue::from("remove")])?;
v_type = CoreValue::from("ADD");
if core_truthy(&v_is_update) {
v_type = CoreValue::from("UPDATE");
}
if core_truthy(&v_is_remove) {
v_type = CoreValue::from("REMOVE");
}
v_section_raw = core_get(
&v_entry,
&CoreValue::from("section"),
CoreValue::from("Guidelines"),
);
v_section_is_string = core_type_is(&v_section_raw, CoreValue::from("string"));
v_section = CoreValue::from("Guidelines");
if core_truthy(&v_section_is_string) {
v_section_trimmed = core_string_trim(&v_section_raw);
v_section_nonempty =
core_ne(&[v_section_trimmed.clone(), CoreValue::from("")])?;
if core_truthy(&v_section_nonempty) {
v_section = v_section_trimmed.clone();
}
}
v_content_raw =
core_get(&v_entry, &CoreValue::from("content"), CoreValue::from(""));
v_content_is_string = core_type_is(&v_content_raw, CoreValue::from("string"));
v_content = CoreValue::from("");
if core_truthy(&v_content_is_string) {
v_content_trimmed = core_string_trim(&v_content_raw);
v_content = v_content_trimmed.clone();
}
v_not_remove = core_ne(&[v_type.clone(), CoreValue::from("REMOVE")])?;
v_content_empty = core_eq(&[v_content.clone(), CoreValue::from("")])?;
v_keep = CoreValue::Bool(true);
if core_truthy(&v_not_remove) {
if core_truthy(&v_content_empty) {
v_keep = CoreValue::Bool(false);
}
}
v_is_add_type = core_eq(&[v_type.clone(), CoreValue::from("ADD")])?;
if core_truthy(&v_is_add_type) {
v_is_noop = _ace_is_noop_acknowledgment(&[v_content.clone()])?;
if core_truthy(&v_is_noop) {
v_keep = CoreValue::Bool(false);
}
}
if core_truthy(&v_keep) {
v_bullet_id_raw =
core_get(&v_entry, &CoreValue::from("bulletId"), CoreValue::Null);
v_has_bullet_id_field = core_is_not_none(&[v_bullet_id_raw.clone()])?;
v_bullet_id_source = v_bullet_id_raw.clone();
if core_truthy(&v_has_bullet_id_field) {
} else {
v_id_field = core_get(&v_entry, &CoreValue::from("id"), CoreValue::Null);
v_bullet_id_source = v_id_field.clone();
}
v_bullet_id_is_string =
core_type_is(&v_bullet_id_source, CoreValue::from("string"));
v_none_value = core_none(&[])?;
v_bullet_id = v_none_value.clone();
if core_truthy(&v_bullet_id_is_string) {
v_bullet_id_trimmed = core_string_trim(&v_bullet_id_source);
v_bullet_id_nonempty =
core_ne(&[v_bullet_id_trimmed.clone(), CoreValue::from("")])?;
if core_truthy(&v_bullet_id_nonempty) {
v_bullet_id = v_bullet_id_trimmed.clone();
}
}
v_bullet_id_key = CoreValue::from("");
v_has_bullet_id = core_is_not_none(&[v_bullet_id.clone()])?;
if core_truthy(&v_has_bullet_id) {
v_bullet_id_key = v_bullet_id.clone();
}
v_key_a = core_string_format(&[
CoreValue::from("{}:{}"),
v_type.clone(),
v_section.clone(),
])?;
v_key_b = core_string_format(&[
CoreValue::from("{}:{}"),
v_content.clone(),
v_bullet_id_key.clone(),
])?;
v_key = core_string_format(&[
CoreValue::from("{}:{}"),
v_key_a.clone(),
v_key_b.clone(),
])?;
v_already_seen = core_map_contains(&[v_seen.clone(), v_key.clone()])?;
v_fresh = core_not(&[v_already_seen.clone()])?;
if core_truthy(&v_fresh) {
core_set(&v_seen, v_key.clone(), CoreValue::Bool(true))?;
v_normalized_entry = CoreValue::new_map();
core_set(&v_normalized_entry, CoreValue::from("type"), v_type.clone())?;
core_set(
&v_normalized_entry,
CoreValue::from("section"),
v_section.clone(),
)?;
if core_truthy(&v_not_remove) {
core_set(
&v_normalized_entry,
CoreValue::from("content"),
v_content.clone(),
)?;
}
if core_truthy(&v_has_bullet_id) {
core_set(
&v_normalized_entry,
CoreValue::from("bulletId"),
v_bullet_id.clone(),
)?;
}
v_metadata_raw =
core_get(&v_entry, &CoreValue::from("metadata"), CoreValue::Null);
v_metadata_is_object =
core_type_is(&v_metadata_raw, CoreValue::from("object"));
if core_truthy(&v_metadata_is_object) {
v_empty_metadata = CoreValue::new_map();
v_metadata_copy = core_map_merge(&[
v_empty_metadata.clone(),
v_metadata_raw.clone(),
])?;
core_set(
&v_normalized_entry,
CoreValue::from("metadata"),
v_metadata_copy.clone(),
)?;
}
core_append(&v_normalized, v_normalized_entry.clone())?;
}
}
}
}
return Ok(v_normalized.clone());
}
v_is_string = core_type_is(&v_operations, CoreValue::from("string"));
if core_truthy(&v_is_string) {
v_parsed = core_json_parse(&[v_operations.clone()])?;
v_parsed_is_none = core_is_none(&[v_parsed.clone()])?;
if core_truthy(&v_parsed_is_none) {
return Ok(v_empty_list.clone());
}
v_normalized_from_string = _ace_normalize_curator_operations(&[v_parsed.clone()])?;
return Ok(v_normalized_from_string.clone());
}
v_is_object = core_type_is(&v_operations, CoreValue::from("object"));
if core_truthy(&v_is_object) {
v_inner = core_get(
&v_operations,
&CoreValue::from("operations"),
CoreValue::Null,
);
v_has_inner = core_is_not_none(&[v_inner.clone()])?;
if core_truthy(&v_has_inner) {
v_normalized_from_object = _ace_normalize_curator_operations(&[v_inner.clone()])?;
return Ok(v_normalized_from_object.clone());
}
return Ok(v_empty_list.clone());
}
return Ok(v_empty_list.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _ace_locate_bullet_section(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_ace_locate_bullet_section");
let mut v_playbook = core_arg(args, 0);
let mut v_bullet_id = core_arg(args, 1);
let mut v_already = CoreValue::Null;
let mut v_bullet = CoreValue::Null;
let mut v_bullets = CoreValue::Null;
let mut v_current_id = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_found = CoreValue::Null;
let mut v_hit = CoreValue::Null;
let mut v_match = CoreValue::Null;
let mut v_none_value = CoreValue::Null;
let mut v_open = CoreValue::Null;
let mut v_section_name = CoreValue::Null;
let mut v_section_names = CoreValue::Null;
let mut v_sections = CoreValue::Null;
let mut v_still_open = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_sections = core_get(
&v_playbook,
&CoreValue::from("sections"),
v_empty_map.clone(),
);
v_section_names = core_map_keys(&[v_sections.clone()])?;
v_none_value = core_none(&[])?;
v_found = v_none_value.clone();
for v_section_name in core_iter(&v_section_names)? {
let mut v_section_name = v_section_name;
v_already = core_is_not_none(&[v_found.clone()])?;
v_still_open = core_not(&[v_already.clone()])?;
if core_truthy(&v_still_open) {
v_bullets = core_get(&v_sections, &v_section_name.clone(), CoreValue::Null);
for v_bullet in core_iter(&v_bullets)? {
let mut v_bullet = v_bullet;
v_open = core_is_none(&[v_found.clone()])?;
if core_truthy(&v_open) {
v_current_id = core_get(&v_bullet, &CoreValue::from("id"), CoreValue::from(""));
v_match = core_eq(&[v_current_id.clone(), v_bullet_id.clone()])?;
if core_truthy(&v_match) {
v_hit = CoreValue::new_map();
core_set(&v_hit, CoreValue::from("section"), v_section_name.clone())?;
core_set(&v_hit, CoreValue::from("id"), v_current_id.clone())?;
v_found = v_hit.clone();
}
}
}
}
}
return Ok(v_found.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _ace_resolve_curator_operation_targets(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_ace_resolve_curator_operation_targets");
let mut v_operations = core_arg(args, 0);
let mut v_playbook = core_arg(args, 1);
let mut v_reflection = core_arg(args, 2);
let mut v_generator_output = core_arg(args, 3);
let mut v_already_used = CoreValue::Null;
let mut v_bullet_id = CoreValue::Null;
let mut v_bullet_tags = CoreValue::Null;
let mut v_candidate = CoreValue::Null;
let mut v_candidate_found = CoreValue::Null;
let mut v_current_bullet_id = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_op = CoreValue::Null;
let mut v_existing_bullet_id = CoreValue::Null;
let mut v_existing_is_string = CoreValue::Null;
let mut v_final_bullet_id = CoreValue::Null;
let mut v_final_has_bullet_id = CoreValue::Null;
let mut v_gen_already_used = CoreValue::Null;
let mut v_gen_found = CoreValue::Null;
let mut v_gen_generator = CoreValue::Null;
let mut v_gen_generator_list = CoreValue::Null;
let mut v_gen_harmful = CoreValue::Null;
let mut v_gen_has_queue = CoreValue::Null;
let mut v_gen_id_is_string = CoreValue::Null;
let mut v_gen_located = CoreValue::Null;
let mut v_gen_located_id = CoreValue::Null;
let mut v_gen_missing_queue = CoreValue::Null;
let mut v_gen_new_queue = CoreValue::Null;
let mut v_gen_not_used = CoreValue::Null;
let mut v_gen_primary = CoreValue::Null;
let mut v_gen_queue = CoreValue::Null;
let mut v_gen_section = CoreValue::Null;
let mut v_generator_bullet_ids = CoreValue::Null;
let mut v_generator_list = CoreValue::Null;
let mut v_generator_present = CoreValue::Null;
let mut v_harmful_list = CoreValue::Null;
let mut v_has_bullet_id = CoreValue::Null;
let mut v_has_existing = CoreValue::Null;
let mut v_has_queue = CoreValue::Null;
let mut v_is_empty = CoreValue::Null;
let mut v_is_harmful = CoreValue::Null;
let mut v_keep = CoreValue::Null;
let mut v_located = CoreValue::Null;
let mut v_located_found = CoreValue::Null;
let mut v_located_id = CoreValue::Null;
let mut v_located_section = CoreValue::Null;
let mut v_missing_bullet_id = CoreValue::Null;
let mut v_missing_queue = CoreValue::Null;
let mut v_needs_target = CoreValue::Null;
let mut v_new_queue = CoreValue::Null;
let mut v_not_used = CoreValue::Null;
let mut v_op = CoreValue::Null;
let mut v_op_count = CoreValue::Null;
let mut v_op_is_remove = CoreValue::Null;
let mut v_op_is_update = CoreValue::Null;
let mut v_op_section = CoreValue::Null;
let mut v_op_type = CoreValue::Null;
let mut v_primary_list = CoreValue::Null;
let mut v_priority = CoreValue::Null;
let mut v_priority_list = CoreValue::Null;
let mut v_queue = CoreValue::Null;
let mut v_reflection_present = CoreValue::Null;
let mut v_resolved = CoreValue::Null;
let mut v_resolved_op = CoreValue::Null;
let mut v_section_queues = CoreValue::Null;
let mut v_tag = CoreValue::Null;
let mut v_tag_id = CoreValue::Null;
let mut v_tag_id_is_string = CoreValue::Null;
let mut v_tag_value = CoreValue::Null;
let mut v_used_ids = CoreValue::Null;
v_op_count = core_len(&[v_operations.clone()])?;
v_is_empty = core_eq(&[v_op_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_is_empty) {
return Ok(v_operations.clone());
}
v_used_ids = CoreValue::new_map();
for v_op in core_iter(&v_operations)? {
let mut v_op = v_op;
v_existing_bullet_id = core_get(&v_op, &CoreValue::from("bulletId"), CoreValue::Null);
v_has_existing = core_is_not_none(&[v_existing_bullet_id.clone()])?;
if core_truthy(&v_has_existing) {
v_existing_is_string = core_type_is(&v_existing_bullet_id, CoreValue::from("string"));
if core_truthy(&v_existing_is_string) {
core_set(
&v_used_ids,
v_existing_bullet_id.clone(),
CoreValue::Bool(true),
)?;
}
}
}
v_section_queues = CoreValue::new_map();
v_empty_list = CoreValue::new_list();
v_reflection_present = core_is_not_none(&[v_reflection.clone()])?;
if core_truthy(&v_reflection_present) {
v_bullet_tags = core_get(
&v_reflection,
&CoreValue::from("bulletTags"),
v_empty_list.clone(),
);
for v_tag in core_iter(&v_bullet_tags)? {
let mut v_tag = v_tag;
v_tag_id = core_get(&v_tag, &CoreValue::from("id"), CoreValue::Null);
v_tag_id_is_string = core_type_is(&v_tag_id, CoreValue::from("string"));
if core_truthy(&v_tag_id_is_string) {
v_already_used = core_map_contains(&[v_used_ids.clone(), v_tag_id.clone()])?;
v_not_used = core_not(&[v_already_used.clone()])?;
if core_truthy(&v_not_used) {
v_located =
_ace_locate_bullet_section(&[v_playbook.clone(), v_tag_id.clone()])?;
v_located_found = core_is_not_none(&[v_located.clone()])?;
if core_truthy(&v_located_found) {
v_located_section =
core_get(&v_located, &CoreValue::from("section"), CoreValue::Null);
v_located_id =
core_get(&v_located, &CoreValue::from("id"), CoreValue::Null);
v_tag_value =
core_get(&v_tag, &CoreValue::from("tag"), CoreValue::from(""));
v_is_harmful = core_eq(&[v_tag_value.clone(), CoreValue::from("harmful")])?;
v_priority = CoreValue::from("primary");
if core_truthy(&v_is_harmful) {
v_priority = CoreValue::from("harmful");
}
v_has_queue = core_map_contains(&[
v_section_queues.clone(),
v_located_section.clone(),
])?;
v_missing_queue = core_not(&[v_has_queue.clone()])?;
if core_truthy(&v_missing_queue) {
v_new_queue = CoreValue::new_map();
v_harmful_list = CoreValue::new_list();
core_set(
&v_new_queue,
CoreValue::from("harmful"),
v_harmful_list.clone(),
)?;
v_primary_list = CoreValue::new_list();
core_set(
&v_new_queue,
CoreValue::from("primary"),
v_primary_list.clone(),
)?;
v_generator_list = CoreValue::new_list();
core_set(
&v_new_queue,
CoreValue::from("generator"),
v_generator_list.clone(),
)?;
core_set(
&v_section_queues,
v_located_section.clone(),
v_new_queue.clone(),
)?;
}
v_queue = core_get(
&v_section_queues,
&v_located_section.clone(),
CoreValue::Null,
);
v_priority_list = core_get(&v_queue, &v_priority.clone(), CoreValue::Null);
core_append(&v_priority_list, v_located_id.clone())?;
core_set(&v_queue, v_priority.clone(), v_priority_list.clone())?;
core_set(
&v_section_queues,
v_located_section.clone(),
v_queue.clone(),
)?;
}
}
}
}
}
v_generator_present = core_is_not_none(&[v_generator_output.clone()])?;
if core_truthy(&v_generator_present) {
v_generator_bullet_ids = core_get(
&v_generator_output,
&CoreValue::from("bulletIds"),
v_empty_list.clone(),
);
for v_bullet_id in core_iter(&v_generator_bullet_ids)? {
let mut v_bullet_id = v_bullet_id;
v_gen_id_is_string = core_type_is(&v_bullet_id, CoreValue::from("string"));
if core_truthy(&v_gen_id_is_string) {
v_gen_already_used = core_map_contains(&[v_used_ids.clone(), v_bullet_id.clone()])?;
v_gen_not_used = core_not(&[v_gen_already_used.clone()])?;
if core_truthy(&v_gen_not_used) {
v_gen_located =
_ace_locate_bullet_section(&[v_playbook.clone(), v_bullet_id.clone()])?;
v_gen_found = core_is_not_none(&[v_gen_located.clone()])?;
if core_truthy(&v_gen_found) {
v_gen_section =
core_get(&v_gen_located, &CoreValue::from("section"), CoreValue::Null);
v_gen_located_id =
core_get(&v_gen_located, &CoreValue::from("id"), CoreValue::Null);
v_gen_has_queue =
core_map_contains(&[v_section_queues.clone(), v_gen_section.clone()])?;
v_gen_missing_queue = core_not(&[v_gen_has_queue.clone()])?;
if core_truthy(&v_gen_missing_queue) {
v_gen_new_queue = CoreValue::new_map();
v_gen_harmful = CoreValue::new_list();
core_set(
&v_gen_new_queue,
CoreValue::from("harmful"),
v_gen_harmful.clone(),
)?;
v_gen_primary = CoreValue::new_list();
core_set(
&v_gen_new_queue,
CoreValue::from("primary"),
v_gen_primary.clone(),
)?;
v_gen_generator = CoreValue::new_list();
core_set(
&v_gen_new_queue,
CoreValue::from("generator"),
v_gen_generator.clone(),
)?;
core_set(
&v_section_queues,
v_gen_section.clone(),
v_gen_new_queue.clone(),
)?;
}
v_gen_queue =
core_get(&v_section_queues, &v_gen_section.clone(), CoreValue::Null);
v_gen_generator_list =
core_get(&v_gen_queue, &CoreValue::from("generator"), CoreValue::Null);
core_append(&v_gen_generator_list, v_gen_located_id.clone())?;
core_set(
&v_gen_queue,
CoreValue::from("generator"),
v_gen_generator_list.clone(),
)?;
core_set(
&v_section_queues,
v_gen_section.clone(),
v_gen_queue.clone(),
)?;
}
}
}
}
}
v_resolved = CoreValue::new_list();
for v_op in core_iter(&v_operations)? {
let mut v_op = v_op;
v_op_type = core_get(&v_op, &CoreValue::from("type"), CoreValue::from(""));
v_op_is_update = core_eq(&[v_op_type.clone(), CoreValue::from("UPDATE")])?;
v_op_is_remove = core_eq(&[v_op_type.clone(), CoreValue::from("REMOVE")])?;
v_needs_target = core_or(&[v_op_is_update.clone(), v_op_is_remove.clone()])?;
v_current_bullet_id = core_get(&v_op, &CoreValue::from("bulletId"), CoreValue::Null);
v_has_bullet_id = core_is_not_none(&[v_current_bullet_id.clone()])?;
v_missing_bullet_id = core_not(&[v_has_bullet_id.clone()])?;
v_empty_op = CoreValue::new_map();
v_resolved_op = core_map_merge(&[v_empty_op.clone(), v_op.clone()])?;
if core_truthy(&v_needs_target) {
if core_truthy(&v_missing_bullet_id) {
v_op_section = core_get(&v_op, &CoreValue::from("section"), CoreValue::from(""));
v_candidate = _ace_dequeue_section_candidate(&[
v_section_queues.clone(),
v_op_section.clone(),
v_used_ids.clone(),
v_playbook.clone(),
])?;
v_candidate_found = core_is_not_none(&[v_candidate.clone()])?;
if core_truthy(&v_candidate_found) {
core_set(
&v_resolved_op,
CoreValue::from("bulletId"),
v_candidate.clone(),
)?;
core_set(&v_used_ids, v_candidate.clone(), CoreValue::Bool(true))?;
}
}
}
v_final_bullet_id = core_get(
&v_resolved_op,
&CoreValue::from("bulletId"),
CoreValue::Null,
);
v_final_has_bullet_id = core_is_not_none(&[v_final_bullet_id.clone()])?;
v_keep = CoreValue::Bool(true);
if core_truthy(&v_needs_target) {
v_keep = v_final_has_bullet_id.clone();
}
if core_truthy(&v_keep) {
core_append(&v_resolved, v_resolved_op.clone())?;
}
}
return Ok(v_resolved.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _ace_dequeue_section_candidate(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_ace_dequeue_section_candidate");
let mut v_section_queues = core_arg(args, 0);
let mut v_section = core_arg(args, 1);
let mut v_used_ids = core_arg(args, 2);
let mut v_playbook = core_arg(args, 3);
let mut v_bullet = CoreValue::Null;
let mut v_bullet_id = CoreValue::Null;
let mut v_candidate = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_fallback_bullets = CoreValue::Null;
let mut v_fallback_present = CoreValue::Null;
let mut v_generator_list = CoreValue::Null;
let mut v_harmful_list = CoreValue::Null;
let mut v_has_queue = CoreValue::Null;
let mut v_none_value = CoreValue::Null;
let mut v_not_used = CoreValue::Null;
let mut v_open = CoreValue::Null;
let mut v_picked = CoreValue::Null;
let mut v_primary_list = CoreValue::Null;
let mut v_queue = CoreValue::Null;
let mut v_sections = CoreValue::Null;
let mut v_still_open = CoreValue::Null;
let mut v_used = CoreValue::Null;
v_none_value = core_none(&[])?;
v_picked = v_none_value.clone();
v_has_queue = core_map_contains(&[v_section_queues.clone(), v_section.clone()])?;
if core_truthy(&v_has_queue) {
v_queue = core_get(&v_section_queues, &v_section.clone(), CoreValue::Null);
v_empty_list = CoreValue::new_list();
v_harmful_list = core_get(&v_queue, &CoreValue::from("harmful"), v_empty_list.clone());
for v_candidate in core_iter(&v_harmful_list)? {
let mut v_candidate = v_candidate;
v_open = core_is_none(&[v_picked.clone()])?;
if core_truthy(&v_open) {
v_used = core_map_contains(&[v_used_ids.clone(), v_candidate.clone()])?;
v_not_used = core_not(&[v_used.clone()])?;
if core_truthy(&v_not_used) {
v_picked = v_candidate.clone();
}
}
}
v_primary_list = core_get(&v_queue, &CoreValue::from("primary"), v_empty_list.clone());
for v_candidate in core_iter(&v_primary_list)? {
let mut v_candidate = v_candidate;
v_open = core_is_none(&[v_picked.clone()])?;
if core_truthy(&v_open) {
v_used = core_map_contains(&[v_used_ids.clone(), v_candidate.clone()])?;
v_not_used = core_not(&[v_used.clone()])?;
if core_truthy(&v_not_used) {
v_picked = v_candidate.clone();
}
}
}
v_generator_list = core_get(
&v_queue,
&CoreValue::from("generator"),
v_empty_list.clone(),
);
for v_candidate in core_iter(&v_generator_list)? {
let mut v_candidate = v_candidate;
v_open = core_is_none(&[v_picked.clone()])?;
if core_truthy(&v_open) {
v_used = core_map_contains(&[v_used_ids.clone(), v_candidate.clone()])?;
v_not_used = core_not(&[v_used.clone()])?;
if core_truthy(&v_not_used) {
v_picked = v_candidate.clone();
}
}
}
}
v_still_open = core_is_none(&[v_picked.clone()])?;
if core_truthy(&v_still_open) {
v_empty_map = CoreValue::new_map();
v_sections = core_get(
&v_playbook,
&CoreValue::from("sections"),
v_empty_map.clone(),
);
v_fallback_bullets = core_get(&v_sections, &v_section.clone(), CoreValue::Null);
v_fallback_present = core_is_not_none(&[v_fallback_bullets.clone()])?;
if core_truthy(&v_fallback_present) {
for v_bullet in core_iter(&v_fallback_bullets)? {
let mut v_bullet = v_bullet;
v_open = core_is_none(&[v_picked.clone()])?;
if core_truthy(&v_open) {
v_bullet_id = core_get(&v_bullet, &CoreValue::from("id"), CoreValue::from(""));
v_used = core_map_contains(&[v_used_ids.clone(), v_bullet_id.clone()])?;
v_not_used = core_not(&[v_used.clone()])?;
if core_truthy(&v_not_used) {
v_picked = v_bullet_id.clone();
}
}
}
}
}
return Ok(v_picked.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_factory(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_factory");
let mut v_signature = core_arg(args, 0);
let mut v_options = core_arg(args, 1);
let mut v_action_log = CoreValue::Null;
let mut v_actor_model_state = CoreValue::Null;
let mut v_actor_prompt_policy = CoreValue::Null;
let mut v_auto_upgrade = CoreValue::Null;
let mut v_callable_inventory = CoreValue::Null;
let mut v_callable_split = CoreValue::Null;
let mut v_chat_log = CoreValue::Null;
let mut v_cm_cfg_infinite = CoreValue::Null;
let mut v_cm_cfg_max = CoreValue::Null;
let mut v_cm_cfg_next = CoreValue::Null;
let mut v_cm_cfg_steps = CoreValue::Null;
let mut v_cm_empty_scores = CoreValue::Null;
let mut v_cm_evolve_steps = CoreValue::Null;
let mut v_cm_infinite = CoreValue::Null;
let mut v_cm_initial = CoreValue::Null;
let mut v_cm_map_is_object = CoreValue::Null;
let mut v_cm_map_is_string = CoreValue::Null;
let mut v_cm_map_value = CoreValue::Null;
let mut v_cm_max = CoreValue::Null;
let mut v_cm_next = CoreValue::Null;
let mut v_cm_scores = CoreValue::Null;
let mut v_cm_steps = CoreValue::Null;
let mut v_cm_text = CoreValue::Null;
let mut v_code_field_name = CoreValue::Null;
let mut v_context_camel = CoreValue::Null;
let mut v_context_events = CoreValue::Null;
let mut v_context_fields = CoreValue::Null;
let mut v_context_map_config = CoreValue::Null;
let mut v_context_policy = CoreValue::Null;
let mut v_ctx = CoreValue::Null;
let mut v_discovered_tool_docs = CoreValue::Null;
let mut v_discovery_catalog = CoreValue::Null;
let mut v_distiller_description = CoreValue::Null;
let mut v_distiller_signature = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_executor_description = CoreValue::Null;
let mut v_executor_exclude = CoreValue::Null;
let mut v_executor_exclude_camel = CoreValue::Null;
let mut v_executor_model_policy = CoreValue::Null;
let mut v_executor_options = CoreValue::Null;
let mut v_executor_options_camel = CoreValue::Null;
let mut v_executor_signature = CoreValue::Null;
let mut v_field = CoreValue::Null;
let mut v_field_name = CoreValue::Null;
let mut v_found = CoreValue::Null;
let mut v_function_call_traces = CoreValue::Null;
let mut v_guidance_log = CoreValue::Null;
let mut v_has_any_runtime_config = CoreValue::Null;
let mut v_has_cm_config = CoreValue::Null;
let mut v_has_runtime_config = CoreValue::Null;
let mut v_has_runtime_config_snake = CoreValue::Null;
let mut v_has_runtime_direct = CoreValue::Null;
let mut v_input_fields = CoreValue::Null;
let mut v_is_string = CoreValue::Null;
let mut v_llm_query_description = CoreValue::Null;
let mut v_llm_query_signature = CoreValue::Null;
let mut v_loaded_memories = CoreValue::Null;
let mut v_loaded_skill_docs = CoreValue::Null;
let mut v_matches = CoreValue::Null;
let mut v_memories_catalog = CoreValue::Null;
let mut v_memories_catalog_camel = CoreValue::Null;
let mut v_memories_catalog_is_list = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_missing = CoreValue::Null;
let mut v_optimizer_metadata = CoreValue::Null;
let mut v_parsed_sig = CoreValue::Null;
let mut v_policy = CoreValue::Null;
let mut v_policy_flags = CoreValue::Null;
let mut v_policy_registry = CoreValue::Null;
let mut v_policy_trace = CoreValue::Null;
let mut v_responder_description = CoreValue::Null;
let mut v_responder_exclude = CoreValue::Null;
let mut v_responder_exclude_camel = CoreValue::Null;
let mut v_responder_options = CoreValue::Null;
let mut v_responder_options_camel = CoreValue::Null;
let mut v_responder_signature = CoreValue::Null;
let mut v_runtime_contract = CoreValue::Null;
let mut v_runtime_distiller_signature = CoreValue::Null;
let mut v_runtime_enabled = CoreValue::Null;
let mut v_runtime_executor_signature = CoreValue::Null;
let mut v_sig = CoreValue::Null;
let mut v_skills_catalog = CoreValue::Null;
let mut v_skills_catalog_camel = CoreValue::Null;
let mut v_skills_catalog_is_list = CoreValue::Null;
let mut v_state = CoreValue::Null;
let mut v_state_alpha = CoreValue::Null;
let mut v_status_log = CoreValue::Null;
let mut v_trace = CoreValue::Null;
let mut v_trace_events = CoreValue::Null;
let mut v_usage = CoreValue::Null;
let mut v_used_memories = CoreValue::Null;
let mut v_used_skills = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_empty_map = CoreValue::new_map();
v_sig = v_signature.clone();
v_is_string = core_type_is(&v_signature, CoreValue::from("string"));
if core_truthy(&v_is_string) {
v_parsed_sig = parse_signature(&[v_signature.clone()])?;
v_sig = v_parsed_sig.clone();
} else {
v_sig = v_signature.clone();
}
v_context_camel = core_get(
&v_options,
&CoreValue::from("contextFields"),
v_empty_list.clone(),
);
v_context_fields = core_get(
&v_options,
&CoreValue::from("context_fields"),
v_context_camel.clone(),
);
v_executor_options = core_get(
&v_options,
&CoreValue::from("executor_options"),
v_empty_map.clone(),
);
v_executor_options_camel = core_get(
&v_options,
&CoreValue::from("executorOptions"),
v_executor_options.clone(),
);
v_responder_options = core_get(
&v_options,
&CoreValue::from("responder_options"),
v_empty_map.clone(),
);
v_responder_options_camel = core_get(
&v_options,
&CoreValue::from("responderOptions"),
v_responder_options.clone(),
);
v_executor_exclude_camel = core_get(
&v_executor_options_camel,
&CoreValue::from("excludeFields"),
v_empty_list.clone(),
);
v_executor_exclude = core_get(
&v_executor_options_camel,
&CoreValue::from("exclude_fields"),
v_executor_exclude_camel.clone(),
);
v_responder_exclude_camel = core_get(
&v_responder_options_camel,
&CoreValue::from("excludeFields"),
v_empty_list.clone(),
);
v_responder_exclude = core_get(
&v_responder_options_camel,
&CoreValue::from("exclude_fields"),
v_responder_exclude_camel.clone(),
);
v_input_fields = core_get(
&v_sig,
&CoreValue::from("input_fields"),
v_empty_list.clone(),
);
for v_ctx in core_iter(&v_context_fields)? {
let mut v_ctx = v_ctx;
v_found = CoreValue::Bool(false);
for v_field in core_iter(&v_input_fields)? {
let mut v_field = v_field;
v_field_name = core_get(&v_field, &CoreValue::from("name"), CoreValue::Null);
v_matches = core_eq(&[v_field_name.clone(), v_ctx.clone()])?;
if core_truthy(&v_matches) {
v_found = CoreValue::Bool(true);
}
}
v_missing = core_not(&[v_found.clone()])?;
if core_truthy(&v_missing) {
v_message = core_string_format(&[
CoreValue::from("context field not found: {}"),
v_ctx.clone(),
])?;
v_error = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
}
v_chat_log = CoreValue::new_list();
v_usage = CoreValue::new_map();
v_state_alpha = CoreValue::new_map();
v_action_log = CoreValue::new_list();
v_status_log = CoreValue::new_list();
v_state = CoreValue::new_map();
v_runtime_contract = _normalize_agent_runtime(&[v_options.clone()])?;
v_has_runtime_direct = core_map_contains(&[v_options.clone(), CoreValue::from("runtime")])?;
v_has_runtime_config =
core_map_contains(&[v_options.clone(), CoreValue::from("runtimeConfig")])?;
v_has_runtime_config_snake =
core_map_contains(&[v_options.clone(), CoreValue::from("runtime_config")])?;
v_has_any_runtime_config = core_or(&[
v_has_runtime_config.clone(),
v_has_runtime_config_snake.clone(),
])?;
v_runtime_enabled = core_or(&[
v_has_runtime_direct.clone(),
v_has_any_runtime_config.clone(),
])?;
v_context_policy = _resolve_agent_context_policy(&[v_options.clone()])?;
v_executor_model_policy = _resolve_agent_executor_model_policy(&[v_options.clone()])?;
v_callable_inventory = _normalize_agent_callable_inventory(&[v_options.clone()])?;
v_callable_split = _split_agent_callable_inventory(&[v_callable_inventory.clone()])?;
v_auto_upgrade = _resolve_agent_auto_upgrade(&[v_options.clone()])?;
v_policy = _normalize_agent_policy(&[v_options.clone()])?;
v_policy_flags = _agent_policy_flags(&[
v_options.clone(),
v_callable_split.clone(),
v_auto_upgrade.clone(),
])?;
v_policy_registry = _agent_policy_registry(&[v_policy.clone(), v_policy_flags.clone()])?;
v_discovery_catalog = _render_agent_discovery_catalog(&[v_callable_split.clone()])?;
v_skills_catalog_camel = core_get(
&v_options,
&CoreValue::from("skillsCatalog"),
v_empty_list.clone(),
);
v_skills_catalog = core_get(
&v_options,
&CoreValue::from("skills_catalog"),
v_skills_catalog_camel.clone(),
);
v_skills_catalog_is_list = core_type_is(&v_skills_catalog, CoreValue::from("list"));
if core_truthy(&v_skills_catalog_is_list) {
} else {
v_skills_catalog = v_empty_list.clone();
}
v_memories_catalog_camel = core_get(
&v_options,
&CoreValue::from("memoriesCatalog"),
v_empty_list.clone(),
);
v_memories_catalog = core_get(
&v_options,
&CoreValue::from("memories_catalog"),
v_memories_catalog_camel.clone(),
);
v_memories_catalog_is_list = core_type_is(&v_memories_catalog, CoreValue::from("list"));
if core_truthy(&v_memories_catalog_is_list) {
} else {
v_memories_catalog = v_empty_list.clone();
}
v_discovered_tool_docs = CoreValue::new_list();
v_loaded_skill_docs = CoreValue::new_list();
v_loaded_memories = CoreValue::new_list();
v_used_memories = CoreValue::new_list();
v_used_skills = CoreValue::new_list();
v_guidance_log = CoreValue::new_list();
v_function_call_traces = CoreValue::new_list();
v_policy_trace = CoreValue::new_list();
v_context_events = CoreValue::new_list();
v_actor_model_state = CoreValue::new_map();
v_trace_events = CoreValue::new_list();
v_trace = CoreValue::new_map();
core_set(
&v_trace,
CoreValue::from("schema_version"),
CoreValue::from("axir-agent-trace-v1"),
)?;
core_set(
&v_trace,
CoreValue::from("kind"),
CoreValue::from("agent_run"),
)?;
core_set(&v_trace, CoreValue::from("status"), CoreValue::from("idle"))?;
core_set(&v_trace, CoreValue::from("events"), v_trace_events.clone())?;
core_set(&v_state, CoreValue::from("signature"), v_sig.clone())?;
core_set(&v_state, CoreValue::from("options"), v_options.clone())?;
core_set(
&v_state,
CoreValue::from("context_fields"),
v_context_fields.clone(),
)?;
core_set(
&v_state,
CoreValue::from("executor_exclude_fields"),
v_executor_exclude.clone(),
)?;
core_set(
&v_state,
CoreValue::from("responder_exclude_fields"),
v_responder_exclude.clone(),
)?;
v_code_field_name = core_get(
&v_runtime_contract,
&CoreValue::from("code_field_name"),
CoreValue::from("javascriptCode"),
);
v_runtime_distiller_signature = core_string_format(&[CoreValue::from("input:json, context:json, memories?:json, discoveredToolDocs?:string, loadedSkills?:string, summarizedActorLog?:string, guidanceLog?:string, actionLog:string, liveRuntimeState?:string, contextPressure?:string -> {}:code"), v_code_field_name.clone()])?;
v_distiller_signature = CoreValue::from("input:json, context:json -> completion:json");
if core_truthy(&v_runtime_enabled) {
v_distiller_signature = v_runtime_distiller_signature.clone();
}
core_set(
&v_state,
CoreValue::from("distiller_signature"),
v_distiller_signature.clone(),
)?;
v_runtime_executor_signature = core_string_format(&[CoreValue::from("input:json, executorRequest:string, distilledContextSummary?:string, contextMetadata?:string, memories?:json, discoveredToolDocs?:string, loadedSkills?:string, relevanceHints?:string, summarizedActorLog?:string, guidanceLog?:string, actionLog:string, liveRuntimeState?:string, contextPressure?:string -> {}:code"), v_code_field_name.clone()])?;
v_executor_signature = CoreValue::from(
"input:json, executorRequest:string, distilledContext:json -> completion:json",
);
if core_truthy(&v_runtime_enabled) {
v_executor_signature = v_runtime_executor_signature.clone();
}
core_set(
&v_state,
CoreValue::from("executor_signature"),
v_executor_signature.clone(),
)?;
v_llm_query_signature = CoreValue::from("task:string, context:json -> answer:string");
core_set(
&v_state,
CoreValue::from("llm_query_signature"),
v_llm_query_signature.clone(),
)?;
v_llm_query_description = CoreValue::from("You answer ONE focused question using only the provided context object. Return just the answer text — concise, specific, and grounded in the context. Do not restate the question.");
core_set(
&v_state,
CoreValue::from("llm_query_description"),
v_llm_query_description.clone(),
)?;
v_responder_signature = _build_responder_signature(&[v_sig.clone(), v_context_fields.clone()])?;
core_set(
&v_state,
CoreValue::from("responder_signature"),
v_responder_signature.clone(),
)?;
core_set(&v_state, CoreValue::from("chat_log"), v_chat_log.clone())?;
core_set(&v_state, CoreValue::from("usage"), v_usage.clone())?;
core_set(
&v_state,
CoreValue::from("runtime_state"),
v_state_alpha.clone(),
)?;
core_set(
&v_state,
CoreValue::from("action_log"),
v_action_log.clone(),
)?;
core_set(
&v_state,
CoreValue::from("status_log"),
v_status_log.clone(),
)?;
core_set(
&v_state,
CoreValue::from("runtime_contract"),
v_runtime_contract.clone(),
)?;
core_set(
&v_state,
CoreValue::from("runtime_enabled"),
v_runtime_enabled.clone(),
)?;
core_set(&v_state, CoreValue::from("policy"), v_policy.clone())?;
core_set(
&v_state,
CoreValue::from("policy_flags"),
v_policy_flags.clone(),
)?;
core_set(
&v_state,
CoreValue::from("policy_registry"),
v_policy_registry.clone(),
)?;
core_set(
&v_state,
CoreValue::from("context_policy"),
v_context_policy.clone(),
)?;
core_set(
&v_state,
CoreValue::from("auto_upgrade"),
v_auto_upgrade.clone(),
)?;
v_context_map_config = core_get(&v_options, &CoreValue::from("contextMap"), CoreValue::Null);
v_has_cm_config = core_is_not_none(&[v_context_map_config.clone()])?;
if core_truthy(&v_has_cm_config) {
v_cm_initial = CoreValue::new_map();
v_cm_map_value = core_get(
&v_context_map_config,
&CoreValue::from("map"),
CoreValue::Null,
);
v_cm_map_is_object = core_type_is(&v_cm_map_value, CoreValue::from("object"));
if core_truthy(&v_cm_map_is_object) {
v_cm_initial = core_map_merge(&[v_cm_initial.clone(), v_cm_map_value.clone()])?;
}
v_cm_map_is_string = core_type_is(&v_cm_map_value, CoreValue::from("string"));
if core_truthy(&v_cm_map_is_string) {
core_set(
&v_cm_initial,
CoreValue::from("text"),
v_cm_map_value.clone(),
)?;
}
v_cm_text = core_get(&v_cm_initial, &CoreValue::from("text"), CoreValue::from(""));
core_set(&v_cm_initial, CoreValue::from("text"), v_cm_text.clone())?;
v_cm_steps = core_get(
&v_cm_initial,
&CoreValue::from("steps"),
CoreValue::Num(0f64),
);
core_set(&v_cm_initial, CoreValue::from("steps"), v_cm_steps.clone())?;
v_cm_empty_scores = CoreValue::new_map();
v_cm_scores = core_get(
&v_cm_initial,
&CoreValue::from("scores"),
v_cm_empty_scores.clone(),
);
core_set(
&v_cm_initial,
CoreValue::from("scores"),
v_cm_scores.clone(),
)?;
v_cm_cfg_max = core_get(
&v_context_map_config,
&CoreValue::from("maxChars"),
CoreValue::Num(4000f64),
);
v_cm_max = core_get(
&v_cm_initial,
&CoreValue::from("maxChars"),
v_cm_cfg_max.clone(),
);
core_set(&v_cm_initial, CoreValue::from("maxChars"), v_cm_max.clone())?;
v_cm_cfg_infinite = core_get(
&v_context_map_config,
&CoreValue::from("infiniteEvolve"),
CoreValue::Bool(true),
);
v_cm_infinite = core_get(
&v_cm_initial,
&CoreValue::from("infiniteEvolve"),
v_cm_cfg_infinite.clone(),
);
core_set(
&v_cm_initial,
CoreValue::from("infiniteEvolve"),
v_cm_infinite.clone(),
)?;
v_cm_cfg_steps = core_get(
&v_context_map_config,
&CoreValue::from("evolveSteps"),
CoreValue::Num(0f64),
);
v_cm_evolve_steps = core_get(
&v_cm_initial,
&CoreValue::from("evolveSteps"),
v_cm_cfg_steps.clone(),
);
core_set(
&v_cm_initial,
CoreValue::from("evolveSteps"),
v_cm_evolve_steps.clone(),
)?;
v_cm_cfg_next = core_get(
&v_context_map_config,
&CoreValue::from("next_id"),
CoreValue::Num(1f64),
);
v_cm_next = core_get(
&v_cm_initial,
&CoreValue::from("next_id"),
v_cm_cfg_next.clone(),
);
core_set(&v_cm_initial, CoreValue::from("next_id"), v_cm_next.clone())?;
core_set(
&v_state,
CoreValue::from("context_map"),
v_cm_initial.clone(),
)?;
}
core_set(
&v_state,
CoreValue::from("executor_model_policy"),
v_executor_model_policy.clone(),
)?;
core_set(
&v_state,
CoreValue::from("context_events"),
v_context_events.clone(),
)?;
core_set(
&v_state,
CoreValue::from("actor_model_state"),
v_actor_model_state.clone(),
)?;
core_set(
&v_state,
CoreValue::from("callable_inventory"),
v_callable_inventory.clone(),
)?;
core_set(
&v_state,
CoreValue::from("callable_split"),
v_callable_split.clone(),
)?;
core_set(
&v_state,
CoreValue::from("discovery_catalog"),
v_discovery_catalog.clone(),
)?;
core_set(
&v_state,
CoreValue::from("skills_catalog"),
v_skills_catalog.clone(),
)?;
core_set(
&v_state,
CoreValue::from("memories_catalog"),
v_memories_catalog.clone(),
)?;
core_set(
&v_state,
CoreValue::from("discovered_tool_docs"),
v_discovered_tool_docs.clone(),
)?;
core_set(
&v_state,
CoreValue::from("loaded_skill_docs"),
v_loaded_skill_docs.clone(),
)?;
core_set(
&v_state,
CoreValue::from("loaded_memories"),
v_loaded_memories.clone(),
)?;
core_set(
&v_state,
CoreValue::from("used_memories"),
v_used_memories.clone(),
)?;
core_set(
&v_state,
CoreValue::from("used_skills"),
v_used_skills.clone(),
)?;
core_set(
&v_state,
CoreValue::from("guidance_log"),
v_guidance_log.clone(),
)?;
core_set(
&v_state,
CoreValue::from("function_call_traces"),
v_function_call_traces.clone(),
)?;
core_set(
&v_state,
CoreValue::from("policy_trace"),
v_policy_trace.clone(),
)?;
core_set(&v_state, CoreValue::from("trace"), v_trace.clone())?;
v_optimizer_metadata = _agent_optimizer_metadata(&[v_state.clone()])?;
core_set(
&v_state,
CoreValue::from("optimizer_metadata"),
v_optimizer_metadata.clone(),
)?;
v_actor_prompt_policy = _build_agent_actor_prompt_policy(&[v_state.clone()])?;
core_set(
&v_state,
CoreValue::from("actor_prompt_policy"),
v_actor_prompt_policy.clone(),
)?;
if core_truthy(&v_runtime_enabled) {
v_executor_description =
_render_rlm_executor_description(&[v_state.clone(), v_options.clone()])?;
core_set(
&v_state,
CoreValue::from("executor_description"),
v_executor_description.clone(),
)?;
v_responder_description =
_render_rlm_responder_description(&[v_state.clone(), v_options.clone()])?;
core_set(
&v_state,
CoreValue::from("responder_description"),
v_responder_description.clone(),
)?;
v_distiller_description =
_render_rlm_distiller_description(&[v_state.clone(), v_options.clone()])?;
core_set(
&v_state,
CoreValue::from("distiller_description"),
v_distiller_description.clone(),
)?;
}
return Ok(v_state.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _optimization_component(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_optimization_component");
let mut v_id = core_arg(args, 0);
let mut v_owner = core_arg(args, 1);
let mut v_kind = core_arg(args, 2);
let mut v_current = core_arg(args, 3);
let mut v_description = core_arg(args, 4);
let mut v_constraints = core_arg(args, 5);
let mut v_depends_on = core_arg(args, 6);
let mut v_preserve = core_arg(args, 7);
let mut v_format = core_arg(args, 8);
let mut v_validation = core_arg(args, 9);
let mut v_out = CoreValue::Null;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("id"), v_id.clone())?;
core_set(&v_out, CoreValue::from("owner"), v_owner.clone())?;
core_set(&v_out, CoreValue::from("kind"), v_kind.clone())?;
core_set(&v_out, CoreValue::from("current"), v_current.clone())?;
core_set(
&v_out,
CoreValue::from("description"),
v_description.clone(),
)?;
core_set(
&v_out,
CoreValue::from("constraints"),
v_constraints.clone(),
)?;
core_set(&v_out, CoreValue::from("dependsOn"), v_depends_on.clone())?;
core_set(&v_out, CoreValue::from("preserve"), v_preserve.clone())?;
core_set(&v_out, CoreValue::from("format"), v_format.clone())?;
core_set(&v_out, CoreValue::from("validation"), v_validation.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _optimized_artifact(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_optimized_artifact");
let mut v_optimizer_name = core_arg(args, 0);
let mut v_optimizer_version = core_arg(args, 1);
let mut v_component_map = core_arg(args, 2);
let mut v_metadata = core_arg(args, 3);
let mut v_empty_map = CoreValue::Null;
let mut v_evidence = CoreValue::Null;
let mut v_meta = CoreValue::Null;
let mut v_meta_missing = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_provenance = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("artifactVersion"),
CoreValue::from("axir-optimized-artifact-v1"),
)?;
core_set(
&v_out,
CoreValue::from("optimizerName"),
v_optimizer_name.clone(),
)?;
core_set(
&v_out,
CoreValue::from("optimizerVersion"),
v_optimizer_version.clone(),
)?;
core_set(
&v_out,
CoreValue::from("componentMap"),
v_component_map.clone(),
)?;
v_meta = v_metadata.clone();
v_meta_missing = core_is_none(&[v_metadata.clone()])?;
if core_truthy(&v_meta_missing) {
v_meta = v_empty_map.clone();
}
core_set(&v_out, CoreValue::from("metadata"), v_meta.clone())?;
v_provenance = core_get(&v_meta, &CoreValue::from("provenance"), v_empty_map.clone());
v_evidence = core_get(&v_meta, &CoreValue::from("evidence"), v_empty_map.clone());
core_set(&v_out, CoreValue::from("provenance"), v_provenance.clone())?;
core_set(&v_out, CoreValue::from("evidence"), v_evidence.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_reserved_runtime_names(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_reserved_runtime_names");
let mut v_names = CoreValue::Null;
let mut v_names_is_list = CoreValue::Null;
let mut v_registry = CoreValue::Null;
v_registry = _agent_policy_vocabulary_registry(&[])?;
v_names = core_get(
&v_registry,
&CoreValue::from("reserved_runtime_names"),
CoreValue::Null,
);
v_names_is_list = core_type_is(&v_names, CoreValue::from("list"));
if core_truthy(&v_names_is_list) {
} else {
v_names = CoreValue::new_list();
}
return Ok(v_names.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_runtime_language_tokens(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_runtime_language_tokens");
let mut v_language = core_arg(args, 0);
let mut v_plus_spaced = CoreValue::Null;
let mut v_sharp_spaced = CoreValue::Null;
let mut v_tokens = CoreValue::Null;
let mut v_trimmed = CoreValue::Null;
let mut v_word_spaced = CoreValue::Null;
v_trimmed = core_string_trim(&v_language);
v_sharp_spaced = core_regex_replace(&[
CoreValue::from("#"),
CoreValue::from(" Sharp "),
v_trimmed.clone(),
])?;
v_plus_spaced = core_regex_replace(&[
CoreValue::from("\\+"),
CoreValue::from(" Plus "),
v_sharp_spaced.clone(),
])?;
v_word_spaced = core_regex_replace(&[
CoreValue::from("[^A-Za-z0-9]+"),
CoreValue::from(" "),
v_plus_spaced.clone(),
])?;
v_tokens = core_string_words(&[v_word_spaced.clone()])?;
return Ok(v_tokens.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_runtime_language_alias_key(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_runtime_language_alias_key");
let mut v_tokens = core_arg(args, 0);
let mut v_alias_key = CoreValue::Null;
let mut v_joined = CoreValue::Null;
v_joined = core_string_join_intrinsic(&[CoreValue::from(""), v_tokens.clone()])?;
v_alias_key = core_string_lower(&[v_joined.clone()])?;
return Ok(v_alias_key.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_runtime_is_javascript_alias(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_runtime_is_javascript_alias");
let mut v_alias_key = core_arg(args, 0);
let mut v_is_ecmascript = CoreValue::Null;
let mut v_is_javascript = CoreValue::Null;
let mut v_is_js = CoreValue::Null;
let mut v_is_js_or_javascript = CoreValue::Null;
let mut v_out = CoreValue::Null;
v_is_javascript = core_eq(&[v_alias_key.clone(), CoreValue::from("javascript")])?;
v_is_js = core_eq(&[v_alias_key.clone(), CoreValue::from("js")])?;
v_is_ecmascript = core_eq(&[v_alias_key.clone(), CoreValue::from("ecmascript")])?;
v_is_js_or_javascript = core_or(&[v_is_javascript.clone(), v_is_js.clone()])?;
v_out = core_or(&[v_is_js_or_javascript.clone(), v_is_ecmascript.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_runtime_code_field_name(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_runtime_code_field_name");
let mut v_tokens = core_arg(args, 0);
let mut v_is_javascript = core_arg(args, 1);
let mut v_count = CoreValue::Null;
let mut v_has_tokens = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_prefix = CoreValue::Null;
v_out = CoreValue::from("javascriptCode");
if core_truthy(&v_is_javascript) {
v_out = CoreValue::from("javascriptCode");
} else {
v_count = core_len(&[v_tokens.clone()])?;
v_has_tokens = core_gt(&[v_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_tokens) {
v_prefix = core_string_lower_camel(&[v_tokens.clone()])?;
v_out = core_string_format(&[CoreValue::from("{}Code"), v_prefix.clone()])?;
} else {
v_out = CoreValue::from("runtimeCode");
}
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_runtime_code_fence_language(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_runtime_code_fence_language");
let mut v_tokens = core_arg(args, 0);
let mut v_alias_key = core_arg(args, 1);
let mut v_is_javascript = core_arg(args, 2);
let mut v_count = CoreValue::Null;
let mut v_has_tokens = CoreValue::Null;
let mut v_out = CoreValue::Null;
v_out = CoreValue::from("js");
if core_truthy(&v_is_javascript) {
v_out = CoreValue::from("js");
} else {
v_count = core_len(&[v_tokens.clone()])?;
v_has_tokens = core_gt(&[v_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_tokens) {
v_out = v_alias_key.clone();
} else {
v_out = CoreValue::from("text");
}
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_agent_runtime(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_agent_runtime");
let mut v_options = core_arg(args, 0);
let mut v_alias_key = CoreValue::Null;
let mut v_code_fence_camel = CoreValue::Null;
let mut v_code_fence_language = CoreValue::Null;
let mut v_code_field_camel = CoreValue::Null;
let mut v_code_field_name = CoreValue::Null;
let mut v_code_field_title = CoreValue::Null;
let mut v_code_title_camel = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_is_js = CoreValue::Null;
let mut v_language = CoreValue::Null;
let mut v_language_missing = CoreValue::Null;
let mut v_language_tokens = CoreValue::Null;
let mut v_missing_code_field = CoreValue::Null;
let mut v_missing_fence = CoreValue::Null;
let mut v_missing_title = CoreValue::Null;
let mut v_missing_usage = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_primitives = CoreValue::Null;
let mut v_raw_language = CoreValue::Null;
let mut v_runtime = CoreValue::Null;
let mut v_runtime_camel = CoreValue::Null;
let mut v_state_hooks = CoreValue::Null;
let mut v_trimmed_language = CoreValue::Null;
let mut v_usage_camel = CoreValue::Null;
let mut v_usage_instructions = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_runtime_camel = core_get(
&v_options,
&CoreValue::from("runtimeConfig"),
v_empty_map.clone(),
);
v_runtime = core_get(
&v_options,
&CoreValue::from("runtime"),
v_runtime_camel.clone(),
);
v_raw_language = core_get(
&v_runtime,
&CoreValue::from("language"),
CoreValue::from("JavaScript"),
);
v_trimmed_language = core_string_trim(&v_raw_language);
v_language_missing = core_eq(&[v_trimmed_language.clone(), CoreValue::from("")])?;
v_language = v_trimmed_language.clone();
if core_truthy(&v_language_missing) {
v_language = CoreValue::from("JavaScript");
}
v_language_tokens = _agent_runtime_language_tokens(&[v_language.clone()])?;
v_alias_key = _agent_runtime_language_alias_key(&[v_language_tokens.clone()])?;
v_is_js = _agent_runtime_is_javascript_alias(&[v_alias_key.clone()])?;
v_code_field_camel = core_get(
&v_runtime,
&CoreValue::from("codeFieldName"),
CoreValue::from(""),
);
v_code_field_name = core_get(
&v_runtime,
&CoreValue::from("code_field_name"),
v_code_field_camel.clone(),
);
v_missing_code_field = core_eq(&[v_code_field_name.clone(), CoreValue::from("")])?;
if core_truthy(&v_missing_code_field) {
v_code_field_name =
_agent_runtime_code_field_name(&[v_language_tokens.clone(), v_is_js.clone()])?;
}
v_code_title_camel = core_get(
&v_runtime,
&CoreValue::from("codeFieldTitle"),
CoreValue::from(""),
);
v_code_field_title = core_get(
&v_runtime,
&CoreValue::from("code_field_title"),
v_code_title_camel.clone(),
);
v_missing_title = core_eq(&[v_code_field_title.clone(), CoreValue::from("")])?;
if core_truthy(&v_missing_title) {
v_code_field_title = core_string_title_from_camel(&[v_code_field_name.clone()])?;
}
v_code_fence_camel = core_get(
&v_runtime,
&CoreValue::from("codeFenceLanguage"),
CoreValue::from(""),
);
v_code_fence_language = core_get(
&v_runtime,
&CoreValue::from("code_fence_language"),
v_code_fence_camel.clone(),
);
v_missing_fence = core_eq(&[v_code_fence_language.clone(), CoreValue::from("")])?;
if core_truthy(&v_missing_fence) {
v_code_fence_language = _agent_runtime_code_fence_language(&[
v_language_tokens.clone(),
v_alias_key.clone(),
v_is_js.clone(),
])?;
}
v_usage_camel = core_get(
&v_runtime,
&CoreValue::from("usageInstructions"),
CoreValue::from(""),
);
v_usage_instructions = core_get(
&v_runtime,
&CoreValue::from("usage_instructions"),
v_usage_camel.clone(),
);
v_missing_usage = core_eq(&[v_usage_instructions.clone(), CoreValue::from("")])?;
if core_truthy(&v_missing_usage) {
v_usage_instructions = CoreValue::from("Use the active runtime language. Read inputs, call namespaced tools or child agents, use discover(...) before unknown callables, final(...) when complete, and askClarification(...) when blocked.");
}
v_primitives = _agent_reserved_runtime_names(&[])?;
v_state_hooks = CoreValue::new_list();
core_append(&v_state_hooks, CoreValue::from("create_session"))?;
core_append(&v_state_hooks, CoreValue::from("execute_code"))?;
core_append(&v_state_hooks, CoreValue::from("inspect_globals"))?;
core_append(&v_state_hooks, CoreValue::from("export_state"))?;
core_append(&v_state_hooks, CoreValue::from("restore_state"))?;
core_append(&v_state_hooks, CoreValue::from("close_session"))?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("language"), v_language.clone())?;
core_set(
&v_out,
CoreValue::from("code_field_name"),
v_code_field_name.clone(),
)?;
core_set(
&v_out,
CoreValue::from("code_field_title"),
v_code_field_title.clone(),
)?;
core_set(
&v_out,
CoreValue::from("code_fence_language"),
v_code_fence_language.clone(),
)?;
core_set(&v_out, CoreValue::from("is_javascript"), v_is_js.clone())?;
core_set(
&v_out,
CoreValue::from("usage_instructions"),
v_usage_instructions.clone(),
)?;
core_set(
&v_out,
CoreValue::from("callable_format"),
CoreValue::from("namespaced_runtime_call"),
)?;
core_set(&v_out, CoreValue::from("primitives"), v_primitives.clone())?;
core_set(
&v_out,
CoreValue::from("state_hooks"),
v_state_hooks.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_agent_policy(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_agent_policy");
let mut v_options = core_arg(args, 0);
let mut v_delegation_default = CoreValue::Null;
let mut v_discovery_default = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_policy_camel = CoreValue::Null;
let mut v_policy_in = CoreValue::Null;
let mut v_prompt_placement = CoreValue::Null;
let mut v_skills_default = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_policy_camel = core_get(
&v_options,
&CoreValue::from("agentPolicy"),
v_empty_map.clone(),
);
v_policy_in = core_get(
&v_options,
&CoreValue::from("agent_policy"),
v_policy_camel.clone(),
);
v_discovery_default = core_get(
&v_policy_in,
&CoreValue::from("discovery_default"),
CoreValue::from("compact_catalog_prompt_full_docs_runtime_discover"),
);
v_delegation_default = core_get(
&v_policy_in,
&CoreValue::from("delegation_default"),
CoreValue::from("child_agents_as_namespaced_tools"),
);
v_skills_default = core_get(
&v_policy_in,
&CoreValue::from("skills_default"),
CoreValue::from("host_callback_loads_skill_docs_next_executor_prompt"),
);
v_prompt_placement = core_get(
&v_policy_in,
&CoreValue::from("prompt_placement"),
CoreValue::from("runtime_usage_catalog_in_actor_prompt_loaded_docs_next_turn"),
);
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("policy_version"),
CoreValue::from("agent-runtime-decision-v1"),
)?;
core_set(
&v_out,
CoreValue::from("policy_schema_version"),
CoreValue::from("axir-agent-policy-v1"),
)?;
core_set(
&v_out,
CoreValue::from("discovery_default"),
v_discovery_default.clone(),
)?;
core_set(
&v_out,
CoreValue::from("delegation_default"),
v_delegation_default.clone(),
)?;
core_set(
&v_out,
CoreValue::from("skills_default"),
v_skills_default.clone(),
)?;
core_set(
&v_out,
CoreValue::from("prompt_placement"),
v_prompt_placement.clone(),
)?;
core_set(
&v_out,
CoreValue::from("discover_returns"),
CoreValue::from("void"),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _resolve_agent_auto_upgrade(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_resolve_agent_auto_upgrade");
let mut v_options = core_arg(args, 0);
let mut v_above = CoreValue::Null;
let mut v_above_bad_type = CoreValue::Null;
let mut v_above_camel = CoreValue::Null;
let mut v_above_is_number = CoreValue::Null;
let mut v_above_too_low = CoreValue::Null;
let mut v_context = CoreValue::Null;
let mut v_context_cfg = CoreValue::Null;
let mut v_context_enabled = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_error2 = CoreValue::Null;
let mut v_error3 = CoreValue::Null;
let mut v_error4 = CoreValue::Null;
let mut v_error5 = CoreValue::Null;
let mut v_error6 = CoreValue::Null;
let mut v_function = CoreValue::Null;
let mut v_function_cfg = CoreValue::Null;
let mut v_function_enabled = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_preview = CoreValue::Null;
let mut v_preview_bad_type = CoreValue::Null;
let mut v_preview_camel = CoreValue::Null;
let mut v_preview_is_number = CoreValue::Null;
let mut v_preview_too_low = CoreValue::Null;
let mut v_promote = CoreValue::Null;
let mut v_promote_bad_type = CoreValue::Null;
let mut v_promote_camel = CoreValue::Null;
let mut v_promote_is_number = CoreValue::Null;
let mut v_promote_too_low = CoreValue::Null;
let mut v_raw = CoreValue::Null;
let mut v_raw_camel = CoreValue::Null;
let mut v_raw_context = CoreValue::Null;
let mut v_raw_context_is_bool = CoreValue::Null;
let mut v_raw_context_is_object = CoreValue::Null;
let mut v_raw_function = CoreValue::Null;
let mut v_raw_function_is_bool = CoreValue::Null;
let mut v_raw_function_is_object = CoreValue::Null;
let mut v_root_enabled = CoreValue::Null;
let mut v_root_is_bool = CoreValue::Null;
let mut v_root_is_object = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_raw_camel = core_get(
&v_options,
&CoreValue::from("autoUpgrade"),
CoreValue::Bool(true),
);
v_raw = core_get(
&v_options,
&CoreValue::from("auto_upgrade"),
v_raw_camel.clone(),
);
v_root_is_bool = core_type_is(&v_raw, CoreValue::from("bool"));
v_root_is_object = core_type_is(&v_raw, CoreValue::from("object"));
v_root_enabled = CoreValue::Bool(true);
v_function_enabled = CoreValue::Bool(true);
v_context_enabled = CoreValue::Bool(true);
v_function_cfg = v_empty_map.clone();
v_context_cfg = v_empty_map.clone();
if core_truthy(&v_root_is_bool) {
v_root_enabled = v_raw.clone();
v_function_enabled = v_raw.clone();
v_context_enabled = v_raw.clone();
} else {
if core_truthy(&v_root_is_object) {
v_raw_function = core_get(
&v_raw,
&CoreValue::from("functionDiscovery"),
CoreValue::Bool(true),
);
v_raw_function = core_get(
&v_raw,
&CoreValue::from("function_discovery"),
v_raw_function.clone(),
);
v_raw_context = core_get(
&v_raw,
&CoreValue::from("contextFields"),
CoreValue::Bool(true),
);
v_raw_context = core_get(
&v_raw,
&CoreValue::from("context_fields"),
v_raw_context.clone(),
);
v_raw_function_is_bool = core_type_is(&v_raw_function, CoreValue::from("bool"));
if core_truthy(&v_raw_function_is_bool) {
v_function_enabled = v_raw_function.clone();
} else {
v_raw_function_is_object = core_type_is(&v_raw_function, CoreValue::from("object"));
if core_truthy(&v_raw_function_is_object) {
v_function_cfg = v_raw_function.clone();
v_function_enabled = CoreValue::Bool(true);
}
}
v_raw_context_is_bool = core_type_is(&v_raw_context, CoreValue::from("bool"));
if core_truthy(&v_raw_context_is_bool) {
v_context_enabled = v_raw_context.clone();
} else {
v_raw_context_is_object = core_type_is(&v_raw_context, CoreValue::from("object"));
if core_truthy(&v_raw_context_is_object) {
v_context_cfg = v_raw_context.clone();
v_context_enabled = CoreValue::Bool(true);
}
}
} else {
v_root_enabled = CoreValue::Bool(true);
}
}
v_above_camel = core_get(
&v_function_cfg,
&CoreValue::from("aboveFunctionDocChars"),
CoreValue::Num(10000f64),
);
v_above = core_get(
&v_function_cfg,
&CoreValue::from("above_function_doc_chars"),
v_above_camel.clone(),
);
v_promote_camel = core_get(
&v_context_cfg,
&CoreValue::from("promoteAboveChars"),
CoreValue::Num(8000f64),
);
v_promote = core_get(
&v_context_cfg,
&CoreValue::from("promote_above_chars"),
v_promote_camel.clone(),
);
v_preview_camel = core_get(
&v_context_cfg,
&CoreValue::from("previewChars"),
CoreValue::Num(1200f64),
);
v_preview = core_get(
&v_context_cfg,
&CoreValue::from("preview_chars"),
v_preview_camel.clone(),
);
v_above_is_number = core_type_is(&v_above, CoreValue::from("number"));
v_promote_is_number = core_type_is(&v_promote, CoreValue::from("number"));
v_preview_is_number = core_type_is(&v_preview, CoreValue::from("number"));
v_above_bad_type = core_not(&[v_above_is_number.clone()])?;
if core_truthy(&v_above_bad_type) {
v_error = core_runtime_error(&[CoreValue::from(
"autoUpgrade.functionDiscovery.aboveFunctionDocChars must be a finite number > 0",
)])?;
return Err(core_as_error(&v_error));
}
v_above_too_low = core_lte(&[v_above.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_above_too_low) {
v_error2 = core_runtime_error(&[CoreValue::from(
"autoUpgrade.functionDiscovery.aboveFunctionDocChars must be a finite number > 0",
)])?;
return Err(core_as_error(&v_error2));
}
v_promote_bad_type = core_not(&[v_promote_is_number.clone()])?;
if core_truthy(&v_promote_bad_type) {
v_error3 = core_runtime_error(&[CoreValue::from(
"autoUpgrade.contextFields.promoteAboveChars must be a finite number > 0",
)])?;
return Err(core_as_error(&v_error3));
}
v_promote_too_low = core_lte(&[v_promote.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_promote_too_low) {
v_error4 = core_runtime_error(&[CoreValue::from(
"autoUpgrade.contextFields.promoteAboveChars must be a finite number > 0",
)])?;
return Err(core_as_error(&v_error4));
}
v_preview_bad_type = core_not(&[v_preview_is_number.clone()])?;
if core_truthy(&v_preview_bad_type) {
v_error5 = core_runtime_error(&[CoreValue::from(
"autoUpgrade.contextFields.previewChars must be a finite number > -1",
)])?;
return Err(core_as_error(&v_error5));
}
v_preview_too_low = core_lt(&[v_preview.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_preview_too_low) {
v_error6 = core_runtime_error(&[CoreValue::from(
"autoUpgrade.contextFields.previewChars must be a finite number > -1",
)])?;
return Err(core_as_error(&v_error6));
}
v_function = CoreValue::new_map();
core_set(
&v_function,
CoreValue::from("enabled"),
v_function_enabled.clone(),
)?;
core_set(
&v_function,
CoreValue::from("aboveFunctionDocChars"),
v_above.clone(),
)?;
core_set(
&v_function,
CoreValue::from("above_function_doc_chars"),
v_above.clone(),
)?;
v_context = CoreValue::new_map();
core_set(
&v_context,
CoreValue::from("enabled"),
v_context_enabled.clone(),
)?;
core_set(
&v_context,
CoreValue::from("promoteAboveChars"),
v_promote.clone(),
)?;
core_set(
&v_context,
CoreValue::from("promote_above_chars"),
v_promote.clone(),
)?;
core_set(
&v_context,
CoreValue::from("previewChars"),
v_preview.clone(),
)?;
core_set(
&v_context,
CoreValue::from("preview_chars"),
v_preview.clone(),
)?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("enabled"), v_root_enabled.clone())?;
core_set(
&v_out,
CoreValue::from("functionDiscovery"),
v_function.clone(),
)?;
core_set(
&v_out,
CoreValue::from("function_discovery"),
v_function.clone(),
)?;
core_set(&v_out, CoreValue::from("contextFields"), v_context.clone())?;
core_set(&v_out, CoreValue::from("context_fields"), v_context.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _map_optimization_judge_quality_to_score(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_map_optimization_judge_quality_to_score");
let mut v_quality = core_arg(args, 0);
let mut v_is_acceptable = CoreValue::Null;
let mut v_is_excellent = CoreValue::Null;
let mut v_is_good = CoreValue::Null;
let mut v_is_poor = CoreValue::Null;
let mut v_is_unacceptable = CoreValue::Null;
let mut v_normalized = CoreValue::Null;
v_normalized = core_string_lower(&[v_quality.clone()])?;
v_is_excellent = core_eq(&[v_normalized.clone(), CoreValue::from("excellent")])?;
if core_truthy(&v_is_excellent) {
return Ok(CoreValue::Num(1f64));
}
v_is_good = core_eq(&[v_normalized.clone(), CoreValue::from("good")])?;
if core_truthy(&v_is_good) {
return Ok(CoreValue::Num(0.8f64));
}
v_is_acceptable = core_eq(&[v_normalized.clone(), CoreValue::from("acceptable")])?;
if core_truthy(&v_is_acceptable) {
return Ok(CoreValue::Num(0.5f64));
}
v_is_poor = core_eq(&[v_normalized.clone(), CoreValue::from("poor")])?;
if core_truthy(&v_is_poor) {
return Ok(CoreValue::Num(0.2f64));
}
v_is_unacceptable = core_eq(&[v_normalized.clone(), CoreValue::from("unacceptable")])?;
if core_truthy(&v_is_unacceptable) {
return Ok(CoreValue::Num(0f64));
}
return Ok(CoreValue::Num(0.5f64));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _build_optimization_judge_payload(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_build_optimization_judge_payload");
let mut v_task = core_arg(args, 0);
let mut v_prediction = core_arg(args, 1);
let mut v_criteria = core_arg(args, 2);
let mut v_action_log = CoreValue::Null;
let mut v_clarification = CoreValue::Null;
let mut v_completion_type = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_expected_actions = CoreValue::Null;
let mut v_expected_output = CoreValue::Null;
let mut v_final_output = CoreValue::Null;
let mut v_forbidden_actions = CoreValue::Null;
let mut v_function_calls = CoreValue::Null;
let mut v_guidance_log = CoreValue::Null;
let mut v_metadata = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_task_criteria = CoreValue::Null;
let mut v_task_input = CoreValue::Null;
let mut v_tool_errors = CoreValue::Null;
let mut v_trace = CoreValue::Null;
let mut v_turn_count = CoreValue::Null;
let mut v_usage = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_out = CoreValue::new_map();
v_task_input = core_get(&v_task, &CoreValue::from("input"), v_task.clone());
core_set(&v_out, CoreValue::from("taskInput"), v_task_input.clone())?;
v_task_criteria = core_get(&v_task, &CoreValue::from("criteria"), v_criteria.clone());
core_set(&v_out, CoreValue::from("criteria"), v_task_criteria.clone())?;
v_expected_output = core_get(&v_task, &CoreValue::from("expectedOutput"), CoreValue::Null);
core_set(
&v_out,
CoreValue::from("expectedOutput"),
v_expected_output.clone(),
)?;
v_expected_actions = core_get(
&v_task,
&CoreValue::from("expectedActions"),
v_empty_list.clone(),
);
core_set(
&v_out,
CoreValue::from("expectedActions"),
v_expected_actions.clone(),
)?;
v_forbidden_actions = core_get(
&v_task,
&CoreValue::from("forbiddenActions"),
v_empty_list.clone(),
);
core_set(
&v_out,
CoreValue::from("forbiddenActions"),
v_forbidden_actions.clone(),
)?;
v_metadata = core_get(&v_task, &CoreValue::from("metadata"), CoreValue::Null);
core_set(&v_out, CoreValue::from("metadata"), v_metadata.clone())?;
v_completion_type = core_get(
&v_prediction,
&CoreValue::from("completionType"),
CoreValue::from("error"),
);
core_set(
&v_out,
CoreValue::from("completionType"),
v_completion_type.clone(),
)?;
v_clarification = core_get(
&v_prediction,
&CoreValue::from("clarification"),
CoreValue::Null,
);
core_set(
&v_out,
CoreValue::from("clarification"),
v_clarification.clone(),
)?;
v_final_output = core_get(
&v_prediction,
&CoreValue::from("output"),
v_prediction.clone(),
);
core_set(
&v_out,
CoreValue::from("finalOutput"),
v_final_output.clone(),
)?;
v_guidance_log = core_get(
&v_prediction,
&CoreValue::from("guidanceLog"),
CoreValue::from(""),
);
core_set(
&v_out,
CoreValue::from("guidanceLog"),
v_guidance_log.clone(),
)?;
v_action_log = core_get(
&v_prediction,
&CoreValue::from("actionLog"),
v_empty_list.clone(),
);
core_set(&v_out, CoreValue::from("actionLog"), v_action_log.clone())?;
v_function_calls = core_get(
&v_prediction,
&CoreValue::from("functionCalls"),
v_empty_list.clone(),
);
core_set(
&v_out,
CoreValue::from("functionCalls"),
v_function_calls.clone(),
)?;
v_tool_errors = core_get(
&v_prediction,
&CoreValue::from("toolErrors"),
v_empty_list.clone(),
);
core_set(&v_out, CoreValue::from("toolErrors"), v_tool_errors.clone())?;
v_turn_count = core_get(
&v_prediction,
&CoreValue::from("turnCount"),
CoreValue::Num(0f64),
);
core_set(&v_out, CoreValue::from("turnCount"), v_turn_count.clone())?;
v_usage = core_get(
&v_prediction,
&CoreValue::from("usage"),
v_empty_list.clone(),
);
core_set(&v_out, CoreValue::from("usage"), v_usage.clone())?;
v_trace = core_get(&v_prediction, &CoreValue::from("trace"), CoreValue::Null);
core_set(&v_out, CoreValue::from("trace"), v_trace.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_discoverable_doc_chars(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_discoverable_doc_chars");
let mut v_callable_split = core_arg(args, 0);
let mut v_chars = CoreValue::Null;
let mut v_discoverable = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_text = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_discoverable = core_get(
&v_callable_split,
&CoreValue::from("discoverable"),
v_empty_list.clone(),
);
v_text = core_json_stringify(&[v_discoverable.clone()])?;
v_chars = core_len(&[v_text.clone()])?;
return Ok(v_chars.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_has_discover_namespace(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_has_discover_namespace");
let mut v_callable_split = core_arg(args, 0);
let mut v_discoverable = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_group = CoreValue::Null;
let mut v_group2 = CoreValue::Null;
let mut v_inline = CoreValue::Null;
let mut v_is_discover = CoreValue::Null;
let mut v_is_discover2 = CoreValue::Null;
let mut v_namespace = CoreValue::Null;
let mut v_namespace2 = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_inline = core_get(
&v_callable_split,
&CoreValue::from("inline"),
v_empty_list.clone(),
);
v_discoverable = core_get(
&v_callable_split,
&CoreValue::from("discoverable"),
v_empty_list.clone(),
);
for v_group in core_iter(&v_inline)? {
let mut v_group = v_group;
v_namespace = core_get(&v_group, &CoreValue::from("namespace"), CoreValue::from(""));
v_is_discover = core_eq(&[v_namespace.clone(), CoreValue::from("discover")])?;
if core_truthy(&v_is_discover) {
return Ok(CoreValue::Bool(true));
}
}
for v_group2 in core_iter(&v_discoverable)? {
let mut v_group2 = v_group2;
v_namespace2 = core_get(
&v_group2,
&CoreValue::from("namespace"),
CoreValue::from(""),
);
v_is_discover2 = core_eq(&[v_namespace2.clone(), CoreValue::from("discover")])?;
if core_truthy(&v_is_discover2) {
return Ok(CoreValue::Bool(true));
}
}
return Ok(CoreValue::Bool(false));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_policy_flags(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_policy_flags");
let mut v_options = core_arg(args, 0);
let mut v_callable_split = core_arg(args, 1);
let mut v_auto_upgrade = core_arg(args, 2);
let mut v_above_threshold = CoreValue::Null;
let mut v_auto_allowed = CoreValue::Null;
let mut v_auto_enabled = CoreValue::Null;
let mut v_auto_function = CoreValue::Null;
let mut v_auto_function_enabled = CoreValue::Null;
let mut v_auto_threshold = CoreValue::Null;
let mut v_callable_count = CoreValue::Null;
let mut v_combined_discovery_skills = CoreValue::Null;
let mut v_context_config = CoreValue::Null;
let mut v_direct_respond_enabled = CoreValue::Null;
let mut v_direct_respond_mode = CoreValue::Null;
let mut v_direct_respond_only = CoreValue::Null;
let mut v_direct_respond_static = CoreValue::Null;
let mut v_direct_response = CoreValue::Null;
let mut v_direct_response_camel = CoreValue::Null;
let mut v_direct_response_error = CoreValue::Null;
let mut v_direct_response_invalid = CoreValue::Null;
let mut v_direct_response_is_auto = CoreValue::Null;
let mut v_direct_response_is_off = CoreValue::Null;
let mut v_direct_response_valid = CoreValue::Null;
let mut v_discoverable_callable_count = CoreValue::Null;
let mut v_discoverable_callables = CoreValue::Null;
let mut v_doc_chars = CoreValue::Null;
let mut v_domain_hint_left = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_function_discovery = CoreValue::Null;
let mut v_function_discovery_camel = CoreValue::Null;
let mut v_function_discovery_direct = CoreValue::Null;
let mut v_has_any_memories_callback = CoreValue::Null;
let mut v_has_any_skills_callback = CoreValue::Null;
let mut v_has_callables = CoreValue::Null;
let mut v_has_context_config = CoreValue::Null;
let mut v_has_discover_namespace = CoreValue::Null;
let mut v_has_function_discovery = CoreValue::Null;
let mut v_has_function_discovery_camel = CoreValue::Null;
let mut v_has_function_discovery_snake = CoreValue::Null;
let mut v_has_memories_callback = CoreValue::Null;
let mut v_has_memories_callback_snake = CoreValue::Null;
let mut v_has_memories_catalog = CoreValue::Null;
let mut v_has_skills_callback = CoreValue::Null;
let mut v_has_skills_callback_snake = CoreValue::Null;
let mut v_has_skills_catalog = CoreValue::Null;
let mut v_has_status_callback = CoreValue::Null;
let mut v_inline_callable_count = CoreValue::Null;
let mut v_inline_callables = CoreValue::Null;
let mut v_inspect_camel = CoreValue::Null;
let mut v_inspect_direct = CoreValue::Null;
let mut v_inspect_mode = CoreValue::Null;
let mut v_memories_callback_mode = CoreValue::Null;
let mut v_memories_camel = CoreValue::Null;
let mut v_memories_catalog = CoreValue::Null;
let mut v_memories_catalog_camel = CoreValue::Null;
let mut v_memories_catalog_count = CoreValue::Null;
let mut v_memories_catalog_is_list = CoreValue::Null;
let mut v_memories_direct = CoreValue::Null;
let mut v_memories_hint_enabled = CoreValue::Null;
let mut v_memories_mode = CoreValue::Null;
let mut v_module_hint_enabled = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_relevance_camel = CoreValue::Null;
let mut v_relevance_enabled = CoreValue::Null;
let mut v_relevance_hints_enabled = CoreValue::Null;
let mut v_relevance_is_false = CoreValue::Null;
let mut v_relevance_raw = CoreValue::Null;
let mut v_safe_namespace = CoreValue::Null;
let mut v_skills_callback_mode = CoreValue::Null;
let mut v_skills_camel = CoreValue::Null;
let mut v_skills_catalog = CoreValue::Null;
let mut v_skills_catalog_camel = CoreValue::Null;
let mut v_skills_catalog_count = CoreValue::Null;
let mut v_skills_catalog_is_list = CoreValue::Null;
let mut v_skills_direct = CoreValue::Null;
let mut v_skills_hint_enabled = CoreValue::Null;
let mut v_skills_mode = CoreValue::Null;
let mut v_status_camel = CoreValue::Null;
let mut v_status_direct = CoreValue::Null;
let mut v_status_mode = CoreValue::Null;
let mut v_usage_camel = CoreValue::Null;
let mut v_usage_enabled = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_has_function_discovery_camel =
core_map_contains(&[v_options.clone(), CoreValue::from("functionDiscovery")])?;
v_has_function_discovery_snake =
core_map_contains(&[v_options.clone(), CoreValue::from("function_discovery")])?;
v_has_function_discovery = core_or(&[
v_has_function_discovery_camel.clone(),
v_has_function_discovery_snake.clone(),
])?;
v_function_discovery_camel = core_get(
&v_options,
&CoreValue::from("functionDiscovery"),
CoreValue::Bool(false),
);
v_function_discovery_direct = core_get(
&v_options,
&CoreValue::from("function_discovery"),
v_function_discovery_camel.clone(),
);
v_function_discovery = v_function_discovery_direct.clone();
if core_truthy(&v_has_function_discovery) {
} else {
v_auto_function = core_get(
&v_auto_upgrade,
&CoreValue::from("functionDiscovery"),
CoreValue::Null,
);
v_auto_function_enabled = core_get(
&v_auto_function,
&CoreValue::from("enabled"),
CoreValue::Bool(true),
);
v_auto_threshold = core_get(
&v_auto_function,
&CoreValue::from("aboveFunctionDocChars"),
CoreValue::Num(10000f64),
);
v_doc_chars = _agent_discoverable_doc_chars(&[v_callable_split.clone()])?;
v_above_threshold = core_gt(&[v_doc_chars.clone(), v_auto_threshold.clone()])?;
v_has_discover_namespace = _agent_has_discover_namespace(&[v_callable_split.clone()])?;
v_safe_namespace = core_not(&[v_has_discover_namespace.clone()])?;
v_auto_allowed = core_and(&[v_auto_function_enabled.clone(), v_above_threshold.clone()])?;
v_auto_enabled = core_and(&[v_auto_allowed.clone(), v_safe_namespace.clone()])?;
if core_truthy(&v_auto_enabled) {
v_function_discovery = CoreValue::Bool(true);
} else {
v_function_discovery = CoreValue::Bool(false);
}
}
v_skills_camel = core_get(
&v_options,
&CoreValue::from("skillsMode"),
CoreValue::Bool(false),
);
v_skills_direct = core_get(
&v_options,
&CoreValue::from("skills_mode"),
v_skills_camel.clone(),
);
v_has_skills_callback =
core_map_contains(&[v_options.clone(), CoreValue::from("onSkillsSearch")])?;
v_has_skills_callback_snake =
core_map_contains(&[v_options.clone(), CoreValue::from("on_skills_search")])?;
v_has_any_skills_callback = core_or(&[
v_has_skills_callback.clone(),
v_has_skills_callback_snake.clone(),
])?;
v_skills_catalog_camel = core_get(
&v_options,
&CoreValue::from("skillsCatalog"),
v_empty_list.clone(),
);
v_skills_catalog = core_get(
&v_options,
&CoreValue::from("skills_catalog"),
v_skills_catalog_camel.clone(),
);
v_skills_catalog_is_list = core_type_is(&v_skills_catalog, CoreValue::from("list"));
v_skills_catalog_count = CoreValue::Num(0f64);
if core_truthy(&v_skills_catalog_is_list) {
v_skills_catalog_count = core_len(&[v_skills_catalog.clone()])?;
}
v_has_skills_catalog = core_gt(&[v_skills_catalog_count.clone(), CoreValue::Num(0f64)])?;
v_skills_callback_mode =
core_or(&[v_skills_direct.clone(), v_has_any_skills_callback.clone()])?;
v_skills_mode = core_or(&[v_skills_callback_mode.clone(), v_has_skills_catalog.clone()])?;
v_memories_camel = core_get(
&v_options,
&CoreValue::from("memoriesMode"),
CoreValue::Bool(false),
);
v_memories_direct = core_get(
&v_options,
&CoreValue::from("memories_mode"),
v_memories_camel.clone(),
);
v_has_memories_callback =
core_map_contains(&[v_options.clone(), CoreValue::from("onMemoriesSearch")])?;
v_has_memories_callback_snake =
core_map_contains(&[v_options.clone(), CoreValue::from("on_memories_search")])?;
v_has_any_memories_callback = core_or(&[
v_has_memories_callback.clone(),
v_has_memories_callback_snake.clone(),
])?;
v_memories_catalog_camel = core_get(
&v_options,
&CoreValue::from("memoriesCatalog"),
v_empty_list.clone(),
);
v_memories_catalog = core_get(
&v_options,
&CoreValue::from("memories_catalog"),
v_memories_catalog_camel.clone(),
);
v_memories_catalog_is_list = core_type_is(&v_memories_catalog, CoreValue::from("list"));
v_memories_catalog_count = CoreValue::Num(0f64);
if core_truthy(&v_memories_catalog_is_list) {
v_memories_catalog_count = core_len(&[v_memories_catalog.clone()])?;
}
v_has_memories_catalog = core_gt(&[v_memories_catalog_count.clone(), CoreValue::Num(0f64)])?;
v_memories_callback_mode = core_or(&[
v_memories_direct.clone(),
v_has_any_memories_callback.clone(),
])?;
v_memories_mode = core_or(&[
v_memories_callback_mode.clone(),
v_has_memories_catalog.clone(),
])?;
v_usage_camel = core_get(
&v_options,
&CoreValue::from("usageTrackingMode"),
CoreValue::Bool(false),
);
v_usage_enabled = core_get(
&v_options,
&CoreValue::from("usage_tracking_mode"),
v_usage_camel.clone(),
);
v_status_camel = core_get(
&v_options,
&CoreValue::from("hasAgentStatusCallback"),
CoreValue::Bool(false),
);
v_status_direct = core_get(
&v_options,
&CoreValue::from("has_agent_status_callback"),
v_status_camel.clone(),
);
v_has_status_callback =
core_map_contains(&[v_options.clone(), CoreValue::from("agentStatusCallback")])?;
v_status_mode = core_or(&[v_status_direct.clone(), v_has_status_callback.clone()])?;
v_inspect_camel = core_get(
&v_options,
&CoreValue::from("hasInspectRuntime"),
CoreValue::Bool(false),
);
v_inspect_direct = core_get(
&v_options,
&CoreValue::from("has_inspect_runtime"),
v_inspect_camel.clone(),
);
v_context_config = core_get(&v_options, &CoreValue::from("context"), CoreValue::Null);
v_has_context_config = core_type_is(&v_context_config, CoreValue::from("object"));
v_inspect_mode = core_or(&[v_inspect_direct.clone(), v_has_context_config.clone()])?;
v_relevance_camel = core_get(
&v_options,
&CoreValue::from("relevanceRanking"),
CoreValue::Bool(true),
);
v_relevance_raw = core_get(
&v_options,
&CoreValue::from("relevance_ranking"),
v_relevance_camel.clone(),
);
v_relevance_is_false = core_eq(&[v_relevance_raw.clone(), CoreValue::Bool(false)])?;
v_relevance_enabled = core_not(&[v_relevance_is_false.clone()])?;
v_module_hint_enabled = core_and(&[v_relevance_enabled.clone(), v_function_discovery.clone()])?;
v_skills_hint_enabled = core_and(&[v_relevance_enabled.clone(), v_has_skills_catalog.clone()])?;
v_memories_hint_enabled =
core_and(&[v_relevance_enabled.clone(), v_has_memories_catalog.clone()])?;
v_domain_hint_left = core_or(&[v_module_hint_enabled.clone(), v_skills_hint_enabled.clone()])?;
v_relevance_hints_enabled =
core_or(&[v_domain_hint_left.clone(), v_memories_hint_enabled.clone()])?;
v_combined_discovery_skills = core_and(&[v_function_discovery.clone(), v_skills_mode.clone()])?;
v_direct_response_camel = core_get(
&v_options,
&CoreValue::from("directResponse"),
CoreValue::from("auto"),
);
v_direct_response = core_get(
&v_options,
&CoreValue::from("direct_response"),
v_direct_response_camel.clone(),
);
v_direct_response_is_auto = core_eq(&[v_direct_response.clone(), CoreValue::from("auto")])?;
v_direct_response_is_off = core_eq(&[v_direct_response.clone(), CoreValue::from("off")])?;
v_direct_response_valid = core_or(&[
v_direct_response_is_auto.clone(),
v_direct_response_is_off.clone(),
])?;
v_direct_response_invalid = core_not(&[v_direct_response_valid.clone()])?;
if core_truthy(&v_direct_response_invalid) {
v_direct_response_error =
core_runtime_error(&[CoreValue::from("directResponse must be 'auto' or 'off'")])?;
return Err(core_as_error(&v_direct_response_error));
}
v_direct_respond_enabled = core_not(&[v_direct_response_is_off.clone()])?;
v_inline_callables = core_get(
&v_callable_split,
&CoreValue::from("inline"),
v_empty_list.clone(),
);
v_discoverable_callables = core_get(
&v_callable_split,
&CoreValue::from("discoverable"),
v_empty_list.clone(),
);
v_inline_callable_count = core_len(&[v_inline_callables.clone()])?;
v_discoverable_callable_count = core_len(&[v_discoverable_callables.clone()])?;
v_callable_count = core_add(&[
v_inline_callable_count.clone(),
v_discoverable_callable_count.clone(),
])?;
v_has_callables = core_gt(&[v_callable_count.clone(), CoreValue::Num(0f64)])?;
v_direct_respond_static = core_not(&[v_has_callables.clone()])?;
v_direct_respond_mode = core_and(&[v_direct_respond_enabled.clone(), v_has_callables.clone()])?;
v_direct_respond_only = core_and(&[
v_direct_respond_enabled.clone(),
v_direct_respond_static.clone(),
])?;
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("discoveryMode"),
v_function_discovery.clone(),
)?;
core_set(&v_out, CoreValue::from("skillsMode"), v_skills_mode.clone())?;
core_set(
&v_out,
CoreValue::from("memoriesMode"),
v_memories_mode.clone(),
)?;
core_set(
&v_out,
CoreValue::from("usageTrackingMode"),
v_usage_enabled.clone(),
)?;
core_set(
&v_out,
CoreValue::from("hasAgentStatusCallback"),
v_status_mode.clone(),
)?;
core_set(
&v_out,
CoreValue::from("hasInspectRuntime"),
v_inspect_mode.clone(),
)?;
core_set(
&v_out,
CoreValue::from("relevanceRanking"),
v_relevance_enabled.clone(),
)?;
core_set(
&v_out,
CoreValue::from("moduleHintEnabled"),
v_module_hint_enabled.clone(),
)?;
core_set(
&v_out,
CoreValue::from("skillsHintEnabled"),
v_skills_hint_enabled.clone(),
)?;
core_set(
&v_out,
CoreValue::from("memoriesHintEnabled"),
v_memories_hint_enabled.clone(),
)?;
core_set(
&v_out,
CoreValue::from("relevanceHintsEnabled"),
v_relevance_hints_enabled.clone(),
)?;
core_set(
&v_out,
CoreValue::from("directRespondEnabled"),
v_direct_respond_enabled.clone(),
)?;
core_set(
&v_out,
CoreValue::from("directRespondMode"),
v_direct_respond_mode.clone(),
)?;
core_set(
&v_out,
CoreValue::from("directRespondOnly"),
v_direct_respond_only.clone(),
)?;
core_set(
&v_out,
CoreValue::from("discoveryMode+skillsMode"),
v_combined_discovery_skills.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_policy_action(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_policy_action");
let mut v_id = core_arg(args, 0);
let mut v_category = core_arg(args, 1);
let mut v_kind = core_arg(args, 2);
let mut v_stages = core_arg(args, 3);
let mut v_availability = core_arg(args, 4);
let mut v_effect = core_arg(args, 5);
let mut v_host_boundary = core_arg(args, 6);
let mut v_actor_visible = core_arg(args, 7);
let mut v_entry = CoreValue::Null;
v_entry = CoreValue::new_map();
core_set(&v_entry, CoreValue::from("id"), v_id.clone())?;
core_set(&v_entry, CoreValue::from("public_name"), v_id.clone())?;
core_set(&v_entry, CoreValue::from("category"), v_category.clone())?;
core_set(&v_entry, CoreValue::from("kind"), v_kind.clone())?;
core_set(&v_entry, CoreValue::from("stages"), v_stages.clone())?;
core_set(
&v_entry,
CoreValue::from("availability_condition"),
v_availability.clone(),
)?;
core_set(&v_entry, CoreValue::from("effect"), v_effect.clone())?;
core_set(
&v_entry,
CoreValue::from("host_boundary"),
v_host_boundary.clone(),
)?;
core_set(
&v_entry,
CoreValue::from("actor_visible"),
v_actor_visible.clone(),
)?;
core_set(&v_entry, CoreValue::from("trace_event"), v_id.clone())?;
return Ok(v_entry.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_policy_vocabulary_registry(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_policy_vocabulary_registry");
let mut v_adaptive_recent = CoreValue::Null;
let mut v_allowed_keys = CoreValue::Null;
let mut v_budget_balanced = CoreValue::Null;
let mut v_budget_compact = CoreValue::Null;
let mut v_budget_expanded = CoreValue::Null;
let mut v_budget_math = CoreValue::Null;
let mut v_budgets = CoreValue::Null;
let mut v_checkpointed_recent = CoreValue::Null;
let mut v_context = CoreValue::Null;
let mut v_effect_only = CoreValue::Null;
let mut v_event_names = CoreValue::Null;
let mut v_event_reasons = CoreValue::Null;
let mut v_executor_model = CoreValue::Null;
let mut v_hygiene_modes = CoreValue::Null;
let mut v_lean_recent = CoreValue::Null;
let mut v_legacy_keys = CoreValue::Null;
let mut v_migration_errors = CoreValue::Null;
let mut v_none_value = CoreValue::Null;
let mut v_option_keys = CoreValue::Null;
let mut v_preset_adaptive = CoreValue::Null;
let mut v_preset_checkpointed = CoreValue::Null;
let mut v_preset_full = CoreValue::Null;
let mut v_preset_lean = CoreValue::Null;
let mut v_presets = CoreValue::Null;
let mut v_pressure_critical = CoreValue::Null;
let mut v_pressure_levels = CoreValue::Null;
let mut v_pressure_ok = CoreValue::Null;
let mut v_pressure_watch = CoreValue::Null;
let mut v_primitive_names = CoreValue::Null;
let mut v_registry = CoreValue::Null;
let mut v_reserved = CoreValue::Null;
let mut v_runtime_output_budget = CoreValue::Null;
let mut v_smart_stringify = CoreValue::Null;
v_registry = CoreValue::new_map();
v_none_value = core_none(&[])?;
core_set(
&v_registry,
CoreValue::from("policy_schema_version"),
CoreValue::from("axir-agent-policy-vocabulary-v1"),
)?;
core_set(
&v_registry,
CoreValue::from("policy_version"),
CoreValue::from("agent-runtime-decision-v1"),
)?;
v_primitive_names = CoreValue::new_map();
core_set(
&v_primitive_names,
CoreValue::from("llm_query"),
CoreValue::from("llmQuery"),
)?;
core_set(
&v_primitive_names,
CoreValue::from("final"),
CoreValue::from("final"),
)?;
core_set(
&v_primitive_names,
CoreValue::from("respond"),
CoreValue::from("respond"),
)?;
core_set(
&v_primitive_names,
CoreValue::from("ask_clarification"),
CoreValue::from("askClarification"),
)?;
core_set(
&v_primitive_names,
CoreValue::from("report_success"),
CoreValue::from("reportSuccess"),
)?;
core_set(
&v_primitive_names,
CoreValue::from("report_failure"),
CoreValue::from("reportFailure"),
)?;
core_set(
&v_primitive_names,
CoreValue::from("inspect_runtime"),
CoreValue::from("inspectRuntime"),
)?;
core_set(
&v_primitive_names,
CoreValue::from("discover"),
CoreValue::from("discover"),
)?;
core_set(
&v_primitive_names,
CoreValue::from("recall"),
CoreValue::from("recall"),
)?;
core_set(
&v_primitive_names,
CoreValue::from("used"),
CoreValue::from("used"),
)?;
core_set(
&v_primitive_names,
CoreValue::from("guide_agent"),
CoreValue::from("guideAgent"),
)?;
core_set(
&v_primitive_names,
CoreValue::from("inputs"),
CoreValue::from("inputs"),
)?;
core_set(
&v_registry,
CoreValue::from("actor_primitive_names"),
v_primitive_names.clone(),
)?;
v_reserved = CoreValue::new_list();
core_append(&v_reserved, CoreValue::from("inputs"))?;
core_append(&v_reserved, CoreValue::from("final"))?;
core_append(&v_reserved, CoreValue::from("respond"))?;
core_append(&v_reserved, CoreValue::from("askClarification"))?;
core_append(&v_reserved, CoreValue::from("discover"))?;
core_append(&v_reserved, CoreValue::from("recall"))?;
core_append(&v_reserved, CoreValue::from("llmQuery"))?;
core_append(&v_reserved, CoreValue::from("inspectRuntime"))?;
core_append(&v_reserved, CoreValue::from("reportSuccess"))?;
core_append(&v_reserved, CoreValue::from("reportFailure"))?;
core_set(
&v_registry,
CoreValue::from("reserved_runtime_names"),
v_reserved.clone(),
)?;
v_effect_only = CoreValue::new_list();
core_append(&v_effect_only, CoreValue::from("discover"))?;
core_append(&v_effect_only, CoreValue::from("recall"))?;
core_append(&v_effect_only, CoreValue::from("used"))?;
core_set(
&v_registry,
CoreValue::from("effect_only_actions"),
v_effect_only.clone(),
)?;
v_context = CoreValue::new_map();
core_set(
&v_context,
CoreValue::from("default_preset"),
CoreValue::from("checkpointed"),
)?;
core_set(
&v_context,
CoreValue::from("default_budget"),
CoreValue::from("balanced"),
)?;
core_set(
&v_context,
CoreValue::from("full_preset"),
CoreValue::from("full"),
)?;
core_set(
&v_context,
CoreValue::from("default_max_runtime_chars"),
CoreValue::Num(3000f64),
)?;
core_set(
&v_context,
CoreValue::from("state_summary_max_chars"),
CoreValue::Num(1200f64),
)?;
v_option_keys = CoreValue::new_map();
core_set(
&v_option_keys,
CoreValue::from("camel"),
CoreValue::from("contextPolicy"),
)?;
core_set(
&v_option_keys,
CoreValue::from("snake"),
CoreValue::from("context_policy"),
)?;
core_set(
&v_option_keys,
CoreValue::from("preset"),
CoreValue::from("preset"),
)?;
core_set(
&v_option_keys,
CoreValue::from("budget"),
CoreValue::from("budget"),
)?;
core_set(
&v_option_keys,
CoreValue::from("summarizer_camel"),
CoreValue::from("summarizerOptions"),
)?;
core_set(
&v_option_keys,
CoreValue::from("summarizer_snake"),
CoreValue::from("summarizer_options"),
)?;
core_set(
&v_option_keys,
CoreValue::from("max_runtime_camel"),
CoreValue::from("maxRuntimeChars"),
)?;
core_set(
&v_option_keys,
CoreValue::from("max_runtime_snake"),
CoreValue::from("max_runtime_chars"),
)?;
core_set(
&v_context,
CoreValue::from("option_keys"),
v_option_keys.clone(),
)?;
v_allowed_keys = CoreValue::new_list();
core_append(&v_allowed_keys, CoreValue::from("preset"))?;
core_append(&v_allowed_keys, CoreValue::from("budget"))?;
core_set(
&v_context,
CoreValue::from("allowed_keys"),
v_allowed_keys.clone(),
)?;
v_migration_errors = CoreValue::new_map();
core_set(
&v_migration_errors,
CoreValue::from("state"),
CoreValue::from(
"contextPolicy.state.* has been removed. Use contextPolicy.budget instead.",
),
)?;
core_set(
&v_migration_errors,
CoreValue::from("checkpoints"),
CoreValue::from(
"contextPolicy.checkpoints.* has been removed. Use contextPolicy.budget instead.",
),
)?;
core_set(
&v_migration_errors,
CoreValue::from("summarizerOptions"),
CoreValue::from(
"contextPolicy.summarizerOptions has moved to top-level summarizerOptions.",
),
)?;
core_set(&v_migration_errors, CoreValue::from("default"), CoreValue::from("contextPolicy now only supports { preset?, budget? }. Use contextPolicy.budget instead of contextPolicy.state.*, contextPolicy.checkpoints.*, or other manual cutoff options."))?;
core_set(
&v_context,
CoreValue::from("migration_errors"),
v_migration_errors.clone(),
)?;
v_budgets = CoreValue::new_map();
v_budget_compact = CoreValue::new_map();
core_set(
&v_budget_compact,
CoreValue::from("id"),
CoreValue::from("compact"),
)?;
core_set(
&v_budget_compact,
CoreValue::from("targetPromptChars"),
CoreValue::Num(12000f64),
)?;
core_set(
&v_budget_compact,
CoreValue::from("inspectThreshold"),
CoreValue::Num(10200f64),
)?;
core_set(
&v_budgets,
CoreValue::from("compact"),
v_budget_compact.clone(),
)?;
v_budget_balanced = CoreValue::new_map();
core_set(
&v_budget_balanced,
CoreValue::from("id"),
CoreValue::from("balanced"),
)?;
core_set(
&v_budget_balanced,
CoreValue::from("targetPromptChars"),
CoreValue::Num(16000f64),
)?;
core_set(
&v_budget_balanced,
CoreValue::from("inspectThreshold"),
CoreValue::Num(13600f64),
)?;
core_set(
&v_budgets,
CoreValue::from("balanced"),
v_budget_balanced.clone(),
)?;
v_budget_expanded = CoreValue::new_map();
core_set(
&v_budget_expanded,
CoreValue::from("id"),
CoreValue::from("expanded"),
)?;
core_set(
&v_budget_expanded,
CoreValue::from("targetPromptChars"),
CoreValue::Num(20000f64),
)?;
core_set(
&v_budget_expanded,
CoreValue::from("inspectThreshold"),
CoreValue::Num(17000f64),
)?;
core_set(
&v_budgets,
CoreValue::from("expanded"),
v_budget_expanded.clone(),
)?;
core_set(&v_context, CoreValue::from("budgets"), v_budgets.clone())?;
v_presets = CoreValue::new_map();
v_preset_full = CoreValue::new_map();
core_set(
&v_preset_full,
CoreValue::from("id"),
CoreValue::from("full"),
)?;
core_set(
&v_preset_full,
CoreValue::from("actionReplay"),
CoreValue::from("full"),
)?;
core_set(
&v_preset_full,
CoreValue::from("recentFullActions"),
CoreValue::Num(1f64),
)?;
core_set(
&v_preset_full,
CoreValue::from("errorPruning"),
CoreValue::Bool(false),
)?;
core_set(
&v_preset_full,
CoreValue::from("hindsight"),
CoreValue::Bool(false),
)?;
core_set(
&v_preset_full,
CoreValue::from("pruneRank"),
CoreValue::Num(2f64),
)?;
core_set(
&v_preset_full,
CoreValue::from("stateSummary"),
CoreValue::Bool(false),
)?;
core_set(
&v_preset_full,
CoreValue::from("inspect"),
CoreValue::Bool(false),
)?;
core_set(
&v_preset_full,
CoreValue::from("maxEntries"),
v_none_value.clone(),
)?;
core_set(
&v_preset_full,
CoreValue::from("defaultHygieneMode"),
CoreValue::from("none"),
)?;
core_set(
&v_preset_full,
CoreValue::from("pressureHygieneMode"),
v_none_value.clone(),
)?;
core_set(
&v_preset_full,
CoreValue::from("checkpointsEnabled"),
CoreValue::Bool(false),
)?;
core_set(
&v_preset_full,
CoreValue::from("checkpointTriggerRatio"),
v_none_value.clone(),
)?;
core_set(&v_presets, CoreValue::from("full"), v_preset_full.clone())?;
v_preset_adaptive = CoreValue::new_map();
v_adaptive_recent = CoreValue::new_map();
core_set(
&v_adaptive_recent,
CoreValue::from("compact"),
CoreValue::Num(1f64),
)?;
core_set(
&v_adaptive_recent,
CoreValue::from("balanced"),
CoreValue::Num(2f64),
)?;
core_set(
&v_adaptive_recent,
CoreValue::from("expanded"),
CoreValue::Num(3f64),
)?;
core_set(
&v_preset_adaptive,
CoreValue::from("id"),
CoreValue::from("adaptive"),
)?;
core_set(
&v_preset_adaptive,
CoreValue::from("actionReplay"),
CoreValue::from("adaptive"),
)?;
core_set(
&v_preset_adaptive,
CoreValue::from("recentFullActionsByBudget"),
v_adaptive_recent.clone(),
)?;
core_set(
&v_preset_adaptive,
CoreValue::from("recentFullActions"),
CoreValue::Num(1f64),
)?;
core_set(
&v_preset_adaptive,
CoreValue::from("errorPruning"),
CoreValue::Bool(true),
)?;
core_set(
&v_preset_adaptive,
CoreValue::from("hindsight"),
CoreValue::Bool(false),
)?;
core_set(
&v_preset_adaptive,
CoreValue::from("pruneRank"),
CoreValue::Num(2f64),
)?;
core_set(
&v_preset_adaptive,
CoreValue::from("stateSummary"),
CoreValue::Bool(true),
)?;
core_set(
&v_preset_adaptive,
CoreValue::from("inspect"),
CoreValue::Bool(true),
)?;
core_set(
&v_preset_adaptive,
CoreValue::from("maxEntries"),
CoreValue::Num(8f64),
)?;
core_set(
&v_preset_adaptive,
CoreValue::from("defaultHygieneMode"),
CoreValue::from("proactive"),
)?;
core_set(
&v_preset_adaptive,
CoreValue::from("pressureHygieneMode"),
CoreValue::from("proactive"),
)?;
core_set(
&v_preset_adaptive,
CoreValue::from("checkpointsEnabled"),
CoreValue::Bool(true),
)?;
core_set(
&v_preset_adaptive,
CoreValue::from("checkpointTriggerRatio"),
CoreValue::Num(0.75f64),
)?;
core_set(
&v_presets,
CoreValue::from("adaptive"),
v_preset_adaptive.clone(),
)?;
v_preset_lean = CoreValue::new_map();
v_lean_recent = CoreValue::new_map();
core_set(
&v_lean_recent,
CoreValue::from("compact"),
CoreValue::Num(1f64),
)?;
core_set(
&v_lean_recent,
CoreValue::from("balanced"),
CoreValue::Num(1f64),
)?;
core_set(
&v_lean_recent,
CoreValue::from("expanded"),
CoreValue::Num(2f64),
)?;
core_set(
&v_preset_lean,
CoreValue::from("id"),
CoreValue::from("lean"),
)?;
core_set(
&v_preset_lean,
CoreValue::from("actionReplay"),
CoreValue::from("minimal"),
)?;
core_set(
&v_preset_lean,
CoreValue::from("recentFullActionsByBudget"),
v_lean_recent.clone(),
)?;
core_set(
&v_preset_lean,
CoreValue::from("recentFullActions"),
CoreValue::Num(1f64),
)?;
core_set(
&v_preset_lean,
CoreValue::from("errorPruning"),
CoreValue::Bool(true),
)?;
core_set(
&v_preset_lean,
CoreValue::from("hindsight"),
CoreValue::Bool(false),
)?;
core_set(
&v_preset_lean,
CoreValue::from("pruneRank"),
CoreValue::Num(2f64),
)?;
core_set(
&v_preset_lean,
CoreValue::from("stateSummary"),
CoreValue::Bool(true),
)?;
core_set(
&v_preset_lean,
CoreValue::from("inspect"),
CoreValue::Bool(true),
)?;
core_set(
&v_preset_lean,
CoreValue::from("maxEntries"),
CoreValue::Num(4f64),
)?;
core_set(
&v_preset_lean,
CoreValue::from("defaultHygieneMode"),
CoreValue::from("aggressive"),
)?;
core_set(
&v_preset_lean,
CoreValue::from("pressureHygieneMode"),
CoreValue::from("aggressive"),
)?;
core_set(
&v_preset_lean,
CoreValue::from("checkpointsEnabled"),
CoreValue::Bool(true),
)?;
core_set(
&v_preset_lean,
CoreValue::from("checkpointTriggerRatio"),
CoreValue::Num(0.6f64),
)?;
core_set(&v_presets, CoreValue::from("lean"), v_preset_lean.clone())?;
v_preset_checkpointed = CoreValue::new_map();
v_checkpointed_recent = CoreValue::new_map();
core_set(
&v_checkpointed_recent,
CoreValue::from("compact"),
CoreValue::Num(2f64),
)?;
core_set(
&v_checkpointed_recent,
CoreValue::from("balanced"),
CoreValue::Num(3f64),
)?;
core_set(
&v_checkpointed_recent,
CoreValue::from("expanded"),
CoreValue::Num(4f64),
)?;
core_set(
&v_preset_checkpointed,
CoreValue::from("id"),
CoreValue::from("checkpointed"),
)?;
core_set(
&v_preset_checkpointed,
CoreValue::from("actionReplay"),
CoreValue::from("checkpointed"),
)?;
core_set(
&v_preset_checkpointed,
CoreValue::from("recentFullActionsByBudget"),
v_checkpointed_recent.clone(),
)?;
core_set(
&v_preset_checkpointed,
CoreValue::from("recentFullActions"),
CoreValue::Num(2f64),
)?;
core_set(
&v_preset_checkpointed,
CoreValue::from("errorPruning"),
CoreValue::Bool(false),
)?;
core_set(
&v_preset_checkpointed,
CoreValue::from("hindsight"),
CoreValue::Bool(false),
)?;
core_set(
&v_preset_checkpointed,
CoreValue::from("pruneRank"),
CoreValue::Num(2f64),
)?;
core_set(
&v_preset_checkpointed,
CoreValue::from("stateSummary"),
CoreValue::Bool(true),
)?;
core_set(
&v_preset_checkpointed,
CoreValue::from("inspect"),
CoreValue::Bool(false),
)?;
core_set(
&v_preset_checkpointed,
CoreValue::from("maxEntries"),
CoreValue::Num(8f64),
)?;
core_set(
&v_preset_checkpointed,
CoreValue::from("defaultHygieneMode"),
CoreValue::from("none"),
)?;
core_set(
&v_preset_checkpointed,
CoreValue::from("pressureHygieneMode"),
CoreValue::from("pressure"),
)?;
core_set(
&v_preset_checkpointed,
CoreValue::from("checkpointsEnabled"),
CoreValue::Bool(true),
)?;
core_set(
&v_preset_checkpointed,
CoreValue::from("checkpointTriggerRatio"),
CoreValue::Num(1f64),
)?;
core_set(
&v_presets,
CoreValue::from("checkpointed"),
v_preset_checkpointed.clone(),
)?;
core_set(&v_context, CoreValue::from("presets"), v_presets.clone())?;
v_budget_math = CoreValue::new_map();
core_set(
&v_budget_math,
CoreValue::from("maxSystemPromptChars"),
CoreValue::Num(30000f64),
)?;
core_set(
&v_budget_math,
CoreValue::from("minEffectiveBudgetRatio"),
CoreValue::Num(0.25f64),
)?;
core_set(
&v_context,
CoreValue::from("budget_math"),
v_budget_math.clone(),
)?;
v_runtime_output_budget = CoreValue::new_map();
core_set(
&v_runtime_output_budget,
CoreValue::from("floorRatio"),
CoreValue::Num(0.15f64),
)?;
core_set(
&v_runtime_output_budget,
CoreValue::from("minRuntimeChars"),
CoreValue::Num(400f64),
)?;
core_set(
&v_context,
CoreValue::from("runtime_output_budget"),
v_runtime_output_budget.clone(),
)?;
v_smart_stringify = CoreValue::new_map();
core_set(
&v_smart_stringify,
CoreValue::from("arrayThreshold"),
CoreValue::Num(10f64),
)?;
core_set(
&v_smart_stringify,
CoreValue::from("arrayHeadItems"),
CoreValue::Num(3f64),
)?;
core_set(
&v_smart_stringify,
CoreValue::from("arrayTailItems"),
CoreValue::Num(2f64),
)?;
core_set(
&v_context,
CoreValue::from("smart_stringify"),
v_smart_stringify.clone(),
)?;
v_pressure_levels = CoreValue::new_map();
v_pressure_ok = CoreValue::new_map();
core_set(&v_pressure_ok, CoreValue::from("id"), CoreValue::from("ok"))?;
core_set(
&v_pressure_ok,
CoreValue::from("threshold"),
CoreValue::Num(0f64),
)?;
core_set(
&v_pressure_ok,
CoreValue::from("text"),
CoreValue::from("ok - normal context pressure; continue with focused, useful inspections."),
)?;
core_set(
&v_pressure_levels,
CoreValue::from("ok"),
v_pressure_ok.clone(),
)?;
v_pressure_watch = CoreValue::new_map();
core_set(
&v_pressure_watch,
CoreValue::from("id"),
CoreValue::from("watch"),
)?;
core_set(
&v_pressure_watch,
CoreValue::from("threshold"),
CoreValue::Num(0.7f64),
)?;
core_set(
&v_pressure_watch,
CoreValue::from("text"),
CoreValue::from("watch - keep inspections compact and avoid logging large raw values."),
)?;
core_set(
&v_pressure_levels,
CoreValue::from("watch"),
v_pressure_watch.clone(),
)?;
v_pressure_critical = CoreValue::new_map();
core_set(
&v_pressure_critical,
CoreValue::from("id"),
CoreValue::from("critical"),
)?;
core_set(
&v_pressure_critical,
CoreValue::from("threshold"),
CoreValue::Num(0.9f64),
)?;
core_set(&v_pressure_critical, CoreValue::from("text"), CoreValue::from("critical - prefer compact inspections, avoid large logs, and rely on liveRuntimeState/checkpoints for older work."))?;
core_set(
&v_pressure_levels,
CoreValue::from("critical"),
v_pressure_critical.clone(),
)?;
core_set(
&v_context,
CoreValue::from("pressure_levels"),
v_pressure_levels.clone(),
)?;
v_event_names = CoreValue::new_map();
core_set(
&v_event_names,
CoreValue::from("budget_check"),
CoreValue::from("budget_check"),
)?;
core_set(
&v_event_names,
CoreValue::from("action_compacted"),
CoreValue::from("action_compacted"),
)?;
core_set(
&v_event_names,
CoreValue::from("checkpoint_created"),
CoreValue::from("checkpoint_created"),
)?;
core_set(
&v_event_names,
CoreValue::from("checkpoint_cleared"),
CoreValue::from("checkpoint_cleared"),
)?;
core_set(
&v_event_names,
CoreValue::from("tombstone_created"),
CoreValue::from("tombstone_created"),
)?;
core_set(
&v_context,
CoreValue::from("event_names"),
v_event_names.clone(),
)?;
v_event_reasons = CoreValue::new_map();
core_set(
&v_event_reasons,
CoreValue::from("over_budget"),
CoreValue::from("over_budget"),
)?;
core_set(
&v_event_reasons,
CoreValue::from("under_budget"),
CoreValue::from("under_budget"),
)?;
core_set(
&v_event_reasons,
CoreValue::from("disabled"),
CoreValue::from("disabled"),
)?;
core_set(
&v_event_reasons,
CoreValue::from("pressure"),
CoreValue::from("pressure"),
)?;
core_set(
&v_event_reasons,
CoreValue::from("proactive"),
CoreValue::from("proactive"),
)?;
core_set(
&v_event_reasons,
CoreValue::from("lean"),
CoreValue::from("lean"),
)?;
core_set(
&v_context,
CoreValue::from("event_reasons"),
v_event_reasons.clone(),
)?;
v_hygiene_modes = CoreValue::new_map();
core_set(
&v_hygiene_modes,
CoreValue::from("none"),
CoreValue::from("none"),
)?;
core_set(
&v_hygiene_modes,
CoreValue::from("proactive"),
CoreValue::from("proactive"),
)?;
core_set(
&v_hygiene_modes,
CoreValue::from("pressure"),
CoreValue::from("pressure"),
)?;
core_set(
&v_hygiene_modes,
CoreValue::from("aggressive"),
CoreValue::from("aggressive"),
)?;
core_set(
&v_context,
CoreValue::from("hygiene_modes"),
v_hygiene_modes.clone(),
)?;
v_executor_model = CoreValue::new_map();
core_set(&v_executor_model, CoreValue::from("migration_error"), CoreValue::from("executorModelPolicy now expects an ordered array of { model, namespaces?, aboveErrorTurns? } entries. Manage prompt pressure with contextPolicy.budget instead of abovePromptChars."))?;
v_legacy_keys = CoreValue::new_list();
core_append(&v_legacy_keys, CoreValue::from("escalatedModel"))?;
core_append(&v_legacy_keys, CoreValue::from("baseModel"))?;
core_append(&v_legacy_keys, CoreValue::from("abovePromptChars"))?;
core_append(&v_legacy_keys, CoreValue::from("escalateAtPromptChars"))?;
core_append(
&v_legacy_keys,
CoreValue::from("escalateAtPromptCharsWhenCheckpointed"),
)?;
core_append(&v_legacy_keys, CoreValue::from("recentErrorWindowTurns"))?;
core_append(&v_legacy_keys, CoreValue::from("recentErrorThreshold"))?;
core_append(&v_legacy_keys, CoreValue::from("discoveryStallTurns"))?;
core_append(
&v_legacy_keys,
CoreValue::from("deescalateBelowPromptChars"),
)?;
core_append(
&v_legacy_keys,
CoreValue::from("stableTurnsBeforeDeescalate"),
)?;
core_append(&v_legacy_keys, CoreValue::from("minEscalatedTurns"))?;
core_set(
&v_executor_model,
CoreValue::from("legacy_keys"),
v_legacy_keys.clone(),
)?;
core_set(
&v_context,
CoreValue::from("executor_model_policy"),
v_executor_model.clone(),
)?;
core_set(
&v_registry,
CoreValue::from("context_policy"),
v_context.clone(),
)?;
return Ok(v_registry.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _build_agent_eval_prediction(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_build_agent_eval_prediction");
let mut v_output = core_arg(args, 0);
let mut v_action_log = core_arg(args, 1);
let mut v_usage = core_arg(args, 2);
let mut v_trace = core_arg(args, 3);
let mut v_empty_list = CoreValue::Null;
let mut v_out = CoreValue::Null;
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("completionType"),
CoreValue::from("final"),
)?;
core_set(&v_out, CoreValue::from("output"), v_output.clone())?;
core_set(&v_out, CoreValue::from("finalOutput"), v_output.clone())?;
core_set(&v_out, CoreValue::from("actionLog"), v_action_log.clone())?;
core_set(&v_out, CoreValue::from("usage"), v_usage.clone())?;
core_set(&v_out, CoreValue::from("trace"), v_trace.clone())?;
v_empty_list = CoreValue::new_list();
core_set(
&v_out,
CoreValue::from("functionCalls"),
v_empty_list.clone(),
)?;
core_set(&v_out, CoreValue::from("toolErrors"), v_empty_list.clone())?;
core_set(&v_out, CoreValue::from("turnCount"), CoreValue::Num(0f64))?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_context_policy_registry(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_context_policy_registry");
let mut v_context = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_registry = CoreValue::Null;
v_registry = _agent_policy_vocabulary_registry(&[])?;
v_empty_map = CoreValue::new_map();
v_context = core_get(
&v_registry,
&CoreValue::from("context_policy"),
v_empty_map.clone(),
);
return Ok(v_context.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_context_policy_migration_error(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_context_policy_migration_error");
let mut v_key = core_arg(args, 0);
let mut v_context = CoreValue::Null;
let mut v_default_message = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_errors = CoreValue::Null;
let mut v_message = CoreValue::Null;
v_context = _agent_context_policy_registry(&[])?;
v_empty_map = CoreValue::new_map();
v_errors = core_get(
&v_context,
&CoreValue::from("migration_errors"),
v_empty_map.clone(),
);
v_default_message = core_get(
&v_errors,
&CoreValue::from("default"),
CoreValue::from("contextPolicy now only supports { preset?, budget? }."),
);
v_message = core_get(&v_errors, &v_key.clone(), v_default_message.clone());
return Ok(v_message.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_context_budget_profile(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_context_budget_profile");
let mut v_budget = core_arg(args, 0);
let mut v_budgets = CoreValue::Null;
let mut v_context = CoreValue::Null;
let mut v_default_budget = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_fallback = CoreValue::Null;
let mut v_is_map = CoreValue::Null;
let mut v_profile = CoreValue::Null;
v_context = _agent_context_policy_registry(&[])?;
v_empty_map = CoreValue::new_map();
v_budgets = core_get(&v_context, &CoreValue::from("budgets"), v_empty_map.clone());
v_default_budget = core_get(
&v_context,
&CoreValue::from("default_budget"),
CoreValue::from("balanced"),
);
v_fallback = core_get(&v_budgets, &v_default_budget.clone(), v_empty_map.clone());
v_profile = core_get(&v_budgets, &v_budget.clone(), v_fallback.clone());
v_is_map = core_type_is(&v_profile, CoreValue::from("object"));
if core_truthy(&v_is_map) {
} else {
v_profile = v_fallback.clone();
}
return Ok(v_profile.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_context_preset_profile(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_context_preset_profile");
let mut v_preset = core_arg(args, 0);
let mut v_context = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_fallback = CoreValue::Null;
let mut v_full_preset = CoreValue::Null;
let mut v_is_map = CoreValue::Null;
let mut v_presets = CoreValue::Null;
let mut v_profile = CoreValue::Null;
v_context = _agent_context_policy_registry(&[])?;
v_empty_map = CoreValue::new_map();
v_presets = core_get(&v_context, &CoreValue::from("presets"), v_empty_map.clone());
v_full_preset = core_get(
&v_context,
&CoreValue::from("full_preset"),
CoreValue::from("full"),
);
v_fallback = core_get(&v_presets, &v_full_preset.clone(), v_empty_map.clone());
v_profile = core_get(&v_presets, &v_preset.clone(), v_fallback.clone());
v_is_map = core_type_is(&v_profile, CoreValue::from("object"));
if core_truthy(&v_is_map) {
} else {
v_profile = v_fallback.clone();
}
return Ok(v_profile.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_context_event_name(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_context_event_name");
let mut v_stable_id = core_arg(args, 0);
let mut v_context = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_names = CoreValue::Null;
v_context = _agent_context_policy_registry(&[])?;
v_empty_map = CoreValue::new_map();
v_names = core_get(
&v_context,
&CoreValue::from("event_names"),
v_empty_map.clone(),
);
v_name = core_get(&v_names, &v_stable_id.clone(), v_stable_id.clone());
return Ok(v_name.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_context_event_reason(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_context_event_reason");
let mut v_stable_id = core_arg(args, 0);
let mut v_context = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_names = CoreValue::Null;
v_context = _agent_context_policy_registry(&[])?;
v_empty_map = CoreValue::new_map();
v_names = core_get(
&v_context,
&CoreValue::from("event_reasons"),
v_empty_map.clone(),
);
v_name = core_get(&v_names, &v_stable_id.clone(), v_stable_id.clone());
return Ok(v_name.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_policy_registry(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_policy_registry");
let mut v_policy = core_arg(args, 0);
let mut v_flags = core_arg(args, 1);
let mut v_actor_primitives = CoreValue::Null;
let mut v_all_actor = CoreValue::Null;
let mut v_ask_clarification_name = CoreValue::Null;
let mut v_bootstrap = CoreValue::Null;
let mut v_callables = CoreValue::Null;
let mut v_child_boundary = CoreValue::Null;
let mut v_clarify = CoreValue::Null;
let mut v_discover = CoreValue::Null;
let mut v_discover_name = CoreValue::Null;
let mut v_distiller_executor = CoreValue::Null;
let mut v_distiller_only = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_executor_only = CoreValue::Null;
let mut v_failure = CoreValue::Null;
let mut v_final_action = CoreValue::Null;
let mut v_final_name = CoreValue::Null;
let mut v_guide = CoreValue::Null;
let mut v_guide_agent_name = CoreValue::Null;
let mut v_host_boundaries = CoreValue::Null;
let mut v_inputs = CoreValue::Null;
let mut v_inputs_name = CoreValue::Null;
let mut v_inspect = CoreValue::Null;
let mut v_inspect_boundary = CoreValue::Null;
let mut v_inspect_runtime_name = CoreValue::Null;
let mut v_llm = CoreValue::Null;
let mut v_llm_query_name = CoreValue::Null;
let mut v_memory_boundary = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_policy_version = CoreValue::Null;
let mut v_primitive_names = CoreValue::Null;
let mut v_protocol_actions = CoreValue::Null;
let mut v_protocol_clarify = CoreValue::Null;
let mut v_protocol_failed = CoreValue::Null;
let mut v_protocol_final_action = CoreValue::Null;
let mut v_protocol_success = CoreValue::Null;
let mut v_recall = CoreValue::Null;
let mut v_recall_name = CoreValue::Null;
let mut v_report_failure_name = CoreValue::Null;
let mut v_report_success_name = CoreValue::Null;
let mut v_respond_action = CoreValue::Null;
let mut v_respond_name = CoreValue::Null;
let mut v_runtime_boundary = CoreValue::Null;
let mut v_runtime_globals = CoreValue::Null;
let mut v_schema_version = CoreValue::Null;
let mut v_skill_boundary = CoreValue::Null;
let mut v_status_boundary = CoreValue::Null;
let mut v_subquery_boundary = CoreValue::Null;
let mut v_success = CoreValue::Null;
let mut v_tool_boundary = CoreValue::Null;
let mut v_used = CoreValue::Null;
let mut v_used_name = CoreValue::Null;
let mut v_vocabulary = CoreValue::Null;
v_vocabulary = _agent_policy_vocabulary_registry(&[])?;
v_empty_map = CoreValue::new_map();
v_primitive_names = core_get(
&v_vocabulary,
&CoreValue::from("actor_primitive_names"),
v_empty_map.clone(),
);
v_llm_query_name = core_get(
&v_primitive_names,
&CoreValue::from("llm_query"),
CoreValue::from("llmQuery"),
);
v_final_name = core_get(
&v_primitive_names,
&CoreValue::from("final"),
CoreValue::from("final"),
);
v_ask_clarification_name = core_get(
&v_primitive_names,
&CoreValue::from("ask_clarification"),
CoreValue::from("askClarification"),
);
v_report_success_name = core_get(
&v_primitive_names,
&CoreValue::from("report_success"),
CoreValue::from("reportSuccess"),
);
v_report_failure_name = core_get(
&v_primitive_names,
&CoreValue::from("report_failure"),
CoreValue::from("reportFailure"),
);
v_inspect_runtime_name = core_get(
&v_primitive_names,
&CoreValue::from("inspect_runtime"),
CoreValue::from("inspectRuntime"),
);
v_discover_name = core_get(
&v_primitive_names,
&CoreValue::from("discover"),
CoreValue::from("discover"),
);
v_recall_name = core_get(
&v_primitive_names,
&CoreValue::from("recall"),
CoreValue::from("recall"),
);
v_used_name = core_get(
&v_primitive_names,
&CoreValue::from("used"),
CoreValue::from("used"),
);
v_guide_agent_name = core_get(
&v_primitive_names,
&CoreValue::from("guide_agent"),
CoreValue::from("guideAgent"),
);
v_inputs_name = core_get(
&v_primitive_names,
&CoreValue::from("inputs"),
CoreValue::from("inputs"),
);
v_distiller_executor = CoreValue::new_list();
core_append(&v_distiller_executor, CoreValue::from("distiller"))?;
core_append(&v_distiller_executor, CoreValue::from("executor"))?;
v_executor_only = CoreValue::new_list();
core_append(&v_executor_only, CoreValue::from("executor"))?;
v_all_actor = CoreValue::new_list();
core_append(&v_all_actor, CoreValue::from("distiller"))?;
core_append(&v_all_actor, CoreValue::from("executor"))?;
v_actor_primitives = CoreValue::new_list();
v_llm = _agent_policy_action(&[
v_llm_query_name.clone(),
CoreValue::from("actor_primitive"),
CoreValue::from("sub_agent_query"),
v_distiller_executor.clone(),
CoreValue::from("always"),
CoreValue::from("returns string or string[]"),
CoreValue::from("sub_agent_llm_query"),
CoreValue::Bool(true),
])?;
core_append(&v_actor_primitives, v_llm.clone())?;
v_final_action = _agent_policy_action(&[
v_final_name.clone(),
CoreValue::from("actor_primitive"),
CoreValue::from("completion"),
v_distiller_executor.clone(),
CoreValue::from("always"),
CoreValue::from("ends actor turn with final payload"),
CoreValue::from("runtime_completion_signal"),
CoreValue::Bool(true),
])?;
core_append(&v_actor_primitives, v_final_action.clone())?;
v_respond_name = core_get(
&v_primitive_names,
&CoreValue::from("respond"),
CoreValue::from("respond"),
);
v_distiller_only = CoreValue::new_list();
core_append(&v_distiller_only, CoreValue::from("distiller"))?;
v_respond_action = _agent_policy_action(&[
v_respond_name.clone(),
CoreValue::from("actor_primitive"),
CoreValue::from("completion"),
v_distiller_only.clone(),
CoreValue::from("directRespondEnabled"),
CoreValue::from("ends the run and skips the executor with a respond payload"),
CoreValue::from("runtime_completion_signal"),
CoreValue::Bool(true),
])?;
core_append(&v_actor_primitives, v_respond_action.clone())?;
v_clarify = _agent_policy_action(&[
v_ask_clarification_name.clone(),
CoreValue::from("actor_primitive"),
CoreValue::from("completion"),
v_distiller_executor.clone(),
CoreValue::from("always"),
CoreValue::from("throws clarification payload"),
CoreValue::from("runtime_completion_signal"),
CoreValue::Bool(true),
])?;
core_append(&v_actor_primitives, v_clarify.clone())?;
v_success = _agent_policy_action(&[
v_report_success_name.clone(),
CoreValue::from("actor_primitive"),
CoreValue::from("status"),
v_executor_only.clone(),
CoreValue::from("hasAgentStatusCallback"),
CoreValue::from("records successful progress status"),
CoreValue::from("status_callback"),
CoreValue::Bool(true),
])?;
core_append(&v_actor_primitives, v_success.clone())?;
v_failure = _agent_policy_action(&[
v_report_failure_name.clone(),
CoreValue::from("actor_primitive"),
CoreValue::from("status"),
v_executor_only.clone(),
CoreValue::from("hasAgentStatusCallback"),
CoreValue::from("records failed progress status"),
CoreValue::from("status_callback"),
CoreValue::Bool(true),
])?;
core_append(&v_actor_primitives, v_failure.clone())?;
v_inspect = _agent_policy_action(&[
v_inspect_runtime_name.clone(),
CoreValue::from("actor_primitive"),
CoreValue::from("runtime_inspection"),
v_distiller_executor.clone(),
CoreValue::from("hasInspectRuntime"),
CoreValue::from("returns compact runtime state"),
CoreValue::from("runtime_inspection"),
CoreValue::Bool(true),
])?;
core_append(&v_actor_primitives, v_inspect.clone())?;
v_discover = _agent_policy_action(&[
v_discover_name.clone(),
CoreValue::from("actor_primitive"),
CoreValue::from("discovery"),
v_executor_only.clone(),
CoreValue::from("discoveryMode|skillsMode"),
CoreValue::from("loads tool docs or skill guides for next turn"),
CoreValue::from("tool_or_skill_discovery"),
CoreValue::Bool(true),
])?;
core_append(&v_actor_primitives, v_discover.clone())?;
v_recall = _agent_policy_action(&[
v_recall_name.clone(),
CoreValue::from("actor_primitive"),
CoreValue::from("memory"),
v_distiller_executor.clone(),
CoreValue::from("memoriesMode"),
CoreValue::from("loads memories for next turn"),
CoreValue::from("memory_search"),
CoreValue::Bool(true),
])?;
core_append(&v_actor_primitives, v_recall.clone())?;
v_used = _agent_policy_action(&[
v_used_name.clone(),
CoreValue::from("actor_primitive"),
CoreValue::from("usage_tracking"),
v_distiller_executor.clone(),
CoreValue::from("usageTrackingMode"),
CoreValue::from("records loaded memory or skill usage"),
CoreValue::from("usage_tracking_callback"),
CoreValue::Bool(true),
])?;
core_append(&v_actor_primitives, v_used.clone())?;
v_protocol_actions = CoreValue::new_list();
v_protocol_final_action = _agent_policy_action(&[
v_final_name.clone(),
CoreValue::from("protocol_action"),
CoreValue::from("completion"),
v_all_actor.clone(),
CoreValue::from("always"),
CoreValue::from("normalizes final protocol payload"),
CoreValue::from("completion_protocol"),
CoreValue::Bool(false),
])?;
core_append(&v_protocol_actions, v_protocol_final_action.clone())?;
v_protocol_clarify = _agent_policy_action(&[
v_ask_clarification_name.clone(),
CoreValue::from("protocol_action"),
CoreValue::from("completion"),
v_all_actor.clone(),
CoreValue::from("always"),
CoreValue::from("normalizes clarification protocol payload"),
CoreValue::from("completion_protocol"),
CoreValue::Bool(false),
])?;
core_append(&v_protocol_actions, v_protocol_clarify.clone())?;
v_guide = _agent_policy_action(&[
v_guide_agent_name.clone(),
CoreValue::from("protocol_action"),
CoreValue::from("guidance"),
v_executor_only.clone(),
CoreValue::from("host_protocol_only"),
CoreValue::from("adds trusted guidance and continues actor loop"),
CoreValue::from("host_function_protocol"),
CoreValue::Bool(false),
])?;
core_append(&v_protocol_actions, v_guide.clone())?;
v_protocol_success = _agent_policy_action(&[
CoreValue::from("success"),
CoreValue::from("protocol_action"),
CoreValue::from("status"),
v_executor_only.clone(),
CoreValue::from("hasAgentStatusCallback"),
CoreValue::from("reports successful status"),
CoreValue::from("status_callback"),
CoreValue::Bool(false),
])?;
core_append(&v_protocol_actions, v_protocol_success.clone())?;
v_protocol_failed = _agent_policy_action(&[
CoreValue::from("failed"),
CoreValue::from("protocol_action"),
CoreValue::from("status"),
v_executor_only.clone(),
CoreValue::from("hasAgentStatusCallback"),
CoreValue::from("reports failed status"),
CoreValue::from("status_callback"),
CoreValue::Bool(false),
])?;
core_append(&v_protocol_actions, v_protocol_failed.clone())?;
v_runtime_globals = CoreValue::new_list();
v_inputs = _agent_policy_action(&[
v_inputs_name.clone(),
CoreValue::from("runtime_global"),
CoreValue::from("data"),
v_all_actor.clone(),
CoreValue::from("always"),
CoreValue::from("contains current actor inputs"),
CoreValue::from("runtime_global"),
CoreValue::Bool(false),
])?;
core_append(&v_runtime_globals, v_inputs.clone())?;
v_callables = _agent_policy_action(&[
CoreValue::from("callable_namespaces"),
CoreValue::from("runtime_global"),
CoreValue::from("callable_namespace"),
v_executor_only.clone(),
CoreValue::from("has_callables"),
CoreValue::from("namespaced tools and child agents"),
CoreValue::from("tool_or_child_agent_handler"),
CoreValue::Bool(false),
])?;
core_append(&v_runtime_globals, v_callables.clone())?;
v_bootstrap = _agent_policy_action(&[
CoreValue::from("safe_bootstrap_globals"),
CoreValue::from("runtime_global"),
CoreValue::from("bootstrap"),
v_all_actor.clone(),
CoreValue::from("has_bootstrap_context"),
CoreValue::from("safe context aliases only"),
CoreValue::from("runtime_session_bootstrap"),
CoreValue::Bool(false),
])?;
core_append(&v_runtime_globals, v_bootstrap.clone())?;
v_host_boundaries = CoreValue::new_list();
v_tool_boundary = _agent_policy_action(&[
CoreValue::from("tool_handler"),
CoreValue::from("host_boundary"),
CoreValue::from("callback"),
v_executor_only.clone(),
CoreValue::from("has_callables"),
CoreValue::from("invokes target-native tool handler"),
CoreValue::from("tool_handler"),
CoreValue::Bool(false),
])?;
core_append(&v_host_boundaries, v_tool_boundary.clone())?;
v_child_boundary = _agent_policy_action(&[
CoreValue::from("child_agent"),
CoreValue::from("host_boundary"),
CoreValue::from("callback"),
v_executor_only.clone(),
CoreValue::from("has_child_agents"),
CoreValue::from("invokes child agent as callable"),
CoreValue::from("child_agent_forward"),
CoreValue::Bool(false),
])?;
core_append(&v_host_boundaries, v_child_boundary.clone())?;
v_memory_boundary = _agent_policy_action(&[
CoreValue::from("memory_search"),
CoreValue::from("host_boundary"),
CoreValue::from("callback"),
v_distiller_executor.clone(),
CoreValue::from("memoriesMode"),
CoreValue::from("loads host memory results"),
CoreValue::from("memory_search_callback"),
CoreValue::Bool(false),
])?;
core_append(&v_host_boundaries, v_memory_boundary.clone())?;
v_skill_boundary = _agent_policy_action(&[
CoreValue::from("skill_search"),
CoreValue::from("host_boundary"),
CoreValue::from("callback"),
v_executor_only.clone(),
CoreValue::from("skillsMode"),
CoreValue::from("loads host skill docs"),
CoreValue::from("skill_search_callback"),
CoreValue::Bool(false),
])?;
core_append(&v_host_boundaries, v_skill_boundary.clone())?;
v_status_boundary = _agent_policy_action(&[
CoreValue::from("status_callback"),
CoreValue::from("host_boundary"),
CoreValue::from("callback"),
v_executor_only.clone(),
CoreValue::from("hasAgentStatusCallback"),
CoreValue::from("reports progress status"),
CoreValue::from("status_callback"),
CoreValue::Bool(false),
])?;
core_append(&v_host_boundaries, v_status_boundary.clone())?;
v_runtime_boundary = _agent_policy_action(&[
CoreValue::from("runtime_execution"),
CoreValue::from("host_boundary"),
CoreValue::from("runtime"),
v_all_actor.clone(),
CoreValue::from("has_runtime"),
CoreValue::from("executes opaque runtime code"),
CoreValue::from("code_runtime_session"),
CoreValue::Bool(false),
])?;
core_append(&v_host_boundaries, v_runtime_boundary.clone())?;
v_inspect_boundary = _agent_policy_action(&[
CoreValue::from("runtime_inspection"),
CoreValue::from("host_boundary"),
CoreValue::from("runtime"),
v_all_actor.clone(),
CoreValue::from("hasInspectRuntime"),
CoreValue::from("inspects runtime state"),
CoreValue::from("code_runtime_inspection"),
CoreValue::Bool(false),
])?;
core_append(&v_host_boundaries, v_inspect_boundary.clone())?;
v_subquery_boundary = _agent_policy_action(&[
CoreValue::from("sub_agent_llm_query"),
CoreValue::from("host_boundary"),
CoreValue::from("ai"),
v_distiller_executor.clone(),
CoreValue::from("always"),
CoreValue::from("runs focused AxGen sub-query"),
CoreValue::from("axgen_sub_agent"),
CoreValue::Bool(false),
])?;
core_append(&v_host_boundaries, v_subquery_boundary.clone())?;
v_out = CoreValue::new_map();
v_policy_version = core_get(
&v_policy,
&CoreValue::from("policy_version"),
CoreValue::from("agent-runtime-decision-v1"),
);
v_schema_version = core_get(
&v_policy,
&CoreValue::from("policy_schema_version"),
CoreValue::from("axir-agent-policy-v1"),
);
core_set(
&v_out,
CoreValue::from("policy_version"),
v_policy_version.clone(),
)?;
core_set(
&v_out,
CoreValue::from("policy_schema_version"),
v_schema_version.clone(),
)?;
core_set(&v_out, CoreValue::from("flags"), v_flags.clone())?;
core_set(
&v_out,
CoreValue::from("actor_primitives"),
v_actor_primitives.clone(),
)?;
core_set(
&v_out,
CoreValue::from("protocol_actions"),
v_protocol_actions.clone(),
)?;
core_set(
&v_out,
CoreValue::from("runtime_globals"),
v_runtime_globals.clone(),
)?;
core_set(
&v_out,
CoreValue::from("host_boundaries"),
v_host_boundaries.clone(),
)?;
core_set(&v_out, CoreValue::from("vocabulary"), v_vocabulary.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _policy_flag_enabled(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_policy_flag_enabled");
let mut v_flags = core_arg(args, 0);
let mut v_condition = core_arg(args, 1);
let mut v_always = CoreValue::Null;
let mut v_discovery = CoreValue::Null;
let mut v_discovery_or_skills = CoreValue::Null;
let mut v_host_only = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_skills = CoreValue::Null;
let mut v_value = CoreValue::Null;
v_out = CoreValue::Bool(false);
v_always = core_eq(&[v_condition.clone(), CoreValue::from("always")])?;
if core_truthy(&v_always) {
v_out = CoreValue::Bool(true);
} else {
v_discovery_or_skills = core_eq(&[
v_condition.clone(),
CoreValue::from("discoveryMode|skillsMode"),
])?;
if core_truthy(&v_discovery_or_skills) {
v_discovery = core_get(
&v_flags,
&CoreValue::from("discoveryMode"),
CoreValue::Bool(false),
);
v_skills = core_get(
&v_flags,
&CoreValue::from("skillsMode"),
CoreValue::Bool(false),
);
v_out = core_or(&[v_discovery.clone(), v_skills.clone()])?;
} else {
v_host_only = core_eq(&[v_condition.clone(), CoreValue::from("host_protocol_only")])?;
if core_truthy(&v_host_only) {
v_out = CoreValue::Bool(true);
} else {
v_value = core_get(&v_flags, &v_condition.clone(), CoreValue::Bool(false));
v_out = v_value.clone();
}
}
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _select_actor_primitives(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_select_actor_primitives");
let mut v_registry = core_arg(args, 0);
let mut v_stage = core_arg(args, 1);
let mut v_condition = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_enabled = CoreValue::Null;
let mut v_flags = CoreValue::Null;
let mut v_in_stage = CoreValue::Null;
let mut v_include = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_primitive = CoreValue::Null;
let mut v_primitives = CoreValue::Null;
let mut v_stages = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_out = CoreValue::new_list();
v_flags = core_get(&v_registry, &CoreValue::from("flags"), v_empty_list.clone());
v_primitives = core_get(
&v_registry,
&CoreValue::from("actor_primitives"),
v_empty_list.clone(),
);
for v_primitive in core_iter(&v_primitives)? {
let mut v_primitive = v_primitive;
v_stages = core_get(
&v_primitive,
&CoreValue::from("stages"),
v_empty_list.clone(),
);
v_in_stage = core_contains(&[v_stages.clone(), v_stage.clone()])?;
v_condition = core_get(
&v_primitive,
&CoreValue::from("availability_condition"),
CoreValue::from("always"),
);
v_enabled = _policy_flag_enabled(&[v_flags.clone(), v_condition.clone()])?;
v_include = core_and(&[v_in_stage.clone(), v_enabled.clone()])?;
if core_truthy(&v_include) {
core_append(&v_out, v_primitive.clone())?;
}
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _select_protocol_actions(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_select_protocol_actions");
let mut v_registry = core_arg(args, 0);
let mut v_actions = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_actions = core_get(
&v_registry,
&CoreValue::from("protocol_actions"),
v_empty_list.clone(),
);
return Ok(v_actions.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _select_runtime_globals(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_select_runtime_globals");
let mut v_registry = core_arg(args, 0);
let mut v_empty_list = CoreValue::Null;
let mut v_globals = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_globals = core_get(
&v_registry,
&CoreValue::from("runtime_globals"),
v_empty_list.clone(),
);
return Ok(v_globals.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _validate_policy_reserved_names(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_validate_policy_reserved_names");
let mut v_registry = core_arg(args, 0);
let mut v_name = core_arg(args, 1);
let mut v_conflicts = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_reserved = CoreValue::Null;
v_reserved = _agent_reserved_runtime_names(&[])?;
v_conflicts = core_contains(&[v_reserved.clone(), v_name.clone()])?;
if core_truthy(&v_conflicts) {
v_message = core_string_format(&[
CoreValue::from("agent callable namespace conflicts with reserved runtime name: {}"),
v_name.clone(),
])?;
v_error = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
v_none = core_none(&[])?;
return Ok(v_none.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _render_actor_primitive_guidance(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_render_actor_primitive_guidance");
let mut v_registry = core_arg(args, 0);
let mut v_stage = core_arg(args, 1);
let mut v_effect = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_lines = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_primitive = CoreValue::Null;
let mut v_primitives = CoreValue::Null;
v_primitives = _select_actor_primitives(&[v_registry.clone(), v_stage.clone()])?;
v_lines = CoreValue::new_list();
for v_primitive in core_iter(&v_primitives)? {
let mut v_primitive = v_primitive;
v_id = core_get(&v_primitive, &CoreValue::from("id"), CoreValue::Null);
v_effect = core_get(
&v_primitive,
&CoreValue::from("effect"),
CoreValue::from(""),
);
v_line =
core_string_format(&[CoreValue::from("- {}: {}"), v_id.clone(), v_effect.clone()])?;
core_append(&v_lines, v_line.clone())?;
}
v_out = core_string_join_intrinsic(&[CoreValue::from("\n"), v_lines.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _rlm_flag_enabled(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_rlm_flag_enabled");
let mut v_flags = core_arg(args, 0);
let mut v_flag = core_arg(args, 1);
let mut v_is_empty = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_value = CoreValue::Null;
v_is_empty = core_eq(&[v_flag.clone(), CoreValue::from("")])?;
if core_truthy(&v_is_empty) {
return Ok(CoreValue::Bool(true));
}
v_value = core_get(&v_flags, &v_flag.clone(), CoreValue::Bool(false));
v_out = core_truthy_value(&[v_value.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _rlm_any_flag_enabled(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_rlm_any_flag_enabled");
let mut v_flags = core_arg(args, 0);
let mut v_flag_names = core_arg(args, 1);
let mut v_count = CoreValue::Null;
let mut v_enabled = CoreValue::Null;
let mut v_is_empty = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_out = CoreValue::Null;
v_count = core_len(&[v_flag_names.clone()])?;
v_is_empty = core_eq(&[v_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_is_empty) {
return Ok(CoreValue::Bool(true));
}
v_out = CoreValue::Bool(false);
for v_name in core_iter(&v_flag_names)? {
let mut v_name = v_name;
v_enabled = _rlm_flag_enabled(&[v_flags.clone(), v_name.clone()])?;
v_out = core_or(&[v_out.clone(), v_enabled.clone()])?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _rlm_entry_enabled(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_rlm_entry_enabled");
let mut v_entry = core_arg(args, 0);
let mut v_flags = core_arg(args, 1);
let mut v_a = CoreValue::Null;
let mut v_ab = CoreValue::Null;
let mut v_b = CoreValue::Null;
let mut v_disabled_active = CoreValue::Null;
let mut v_disabled_by = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_enabled_by = CoreValue::Null;
let mut v_enabled_by_any = CoreValue::Null;
let mut v_no_disabled = CoreValue::Null;
let mut v_not_disabled = CoreValue::Null;
let mut v_out = CoreValue::Null;
v_enabled_by = core_get(&v_entry, &CoreValue::from("enabledBy"), CoreValue::from(""));
v_a = _rlm_flag_enabled(&[v_flags.clone(), v_enabled_by.clone()])?;
v_empty_list = CoreValue::new_list();
v_enabled_by_any = core_get(
&v_entry,
&CoreValue::from("enabledByAny"),
v_empty_list.clone(),
);
v_b = _rlm_any_flag_enabled(&[v_flags.clone(), v_enabled_by_any.clone()])?;
v_ab = core_and(&[v_a.clone(), v_b.clone()])?;
v_disabled_by = core_get(
&v_entry,
&CoreValue::from("disabledBy"),
CoreValue::from(""),
);
v_no_disabled = core_eq(&[v_disabled_by.clone(), CoreValue::from("")])?;
v_out = v_ab.clone();
if core_truthy(&v_no_disabled) {
v_out = v_ab.clone();
} else {
v_disabled_active = _rlm_flag_enabled(&[v_flags.clone(), v_disabled_by.clone()])?;
v_not_disabled = core_not(&[v_disabled_active.clone()])?;
v_out = core_and(&[v_ab.clone(), v_not_disabled.clone()])?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _render_runtime_primitive(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_render_runtime_primitive");
let mut v_primitive = core_arg(args, 0);
let mut v_flags = core_arg(args, 1);
let mut v_code = CoreValue::Null;
let mut v_description = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_ex_code = CoreValue::Null;
let mut v_ex_ok = CoreValue::Null;
let mut v_example = CoreValue::Null;
let mut v_example_block = CoreValue::Null;
let mut v_example_count = CoreValue::Null;
let mut v_example_lines = CoreValue::Null;
let mut v_examples = CoreValue::Null;
let mut v_has_examples = CoreValue::Null;
let mut v_joined_examples = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_sig_ok = CoreValue::Null;
let mut v_signature = CoreValue::Null;
let mut v_signatures = CoreValue::Null;
v_parts = CoreValue::new_list();
v_description = core_get(
&v_primitive,
&CoreValue::from("description"),
CoreValue::from(""),
);
core_append(&v_parts, v_description.clone())?;
v_empty_list = CoreValue::new_list();
v_signatures = core_get(
&v_primitive,
&CoreValue::from("signatures"),
v_empty_list.clone(),
);
for v_signature in core_iter(&v_signatures)? {
let mut v_signature = v_signature;
v_sig_ok = _rlm_entry_enabled(&[v_signature.clone(), v_flags.clone()])?;
if core_truthy(&v_sig_ok) {
v_code = core_get(&v_signature, &CoreValue::from("code"), CoreValue::from(""));
v_line = core_string_format(&[CoreValue::from("`{}`"), v_code.clone()])?;
core_append(&v_parts, v_line.clone())?;
}
}
v_examples = core_get(
&v_primitive,
&CoreValue::from("examples"),
v_empty_list.clone(),
);
v_example_lines = CoreValue::new_list();
for v_example in core_iter(&v_examples)? {
let mut v_example = v_example;
v_ex_ok = _rlm_entry_enabled(&[v_example.clone(), v_flags.clone()])?;
if core_truthy(&v_ex_ok) {
v_ex_code = core_get(&v_example, &CoreValue::from("code"), CoreValue::from(""));
core_append(&v_example_lines, v_ex_code.clone())?;
}
}
v_example_count = core_len(&[v_example_lines.clone()])?;
v_has_examples = core_gt(&[v_example_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_examples) {
v_joined_examples =
core_string_join_intrinsic(&[CoreValue::from("\n"), v_example_lines.clone()])?;
v_example_block = core_string_format(&[
CoreValue::from("Examples:\n```js\n{}\n```"),
v_joined_examples.clone(),
])?;
core_append(&v_parts, v_example_block.clone())?;
}
v_out = core_string_join_intrinsic(&[CoreValue::from("\n"), v_parts.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _render_actor_primitives_list(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_render_actor_primitives_list");
let mut v_stage = core_arg(args, 0);
let mut v_flags = core_arg(args, 1);
let mut v_block = CoreValue::Null;
let mut v_blocks = CoreValue::Null;
let mut v_data = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_enabled = CoreValue::Null;
let mut v_in_stage = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_primitive = CoreValue::Null;
let mut v_primitives = CoreValue::Null;
let mut v_stages = CoreValue::Null;
v_data = core_json_parse(&[CoreValue::from("{\n \"schema_version\": \"axir-rlm-prompts-v1\",\n \"executor_template\": \"## Executor\\n\\nYou (`executor`) are the task-execution stage in a two-stage pipeline. Your ONLY job is to write {{ runtimeLanguageName }} code that runs in the {{ runtimeLanguageName }} runtime (REPL) to complete tasks using the tools available to you. A separate (`responder`) agent downstream synthesizes the final answer.\\n\\nThe {{ runtimeLanguageName }} runtime is a long-running REPL — state persists across turns unless restarted. Each **turn**: write code → it executes → you see output → write the next block.\\n\\n### Executor Request & Distilled Context\\n\\nThe prior distiller (context) phase ran in this same {{ runtimeLanguageName }} runtime session and handed off:\\n\\n- `inputs.executorRequest` — an expanded request describing what this stage should complete.\\n- `inputs.distilledContext` — the evidence object the distiller selected, live in the runtime. The `Distilled Context Summary` input field describes its shape; the data itself exists only in the runtime — read it with code.\\n- Variables the distiller created remain live (see Live Runtime State). When a `Context Metadata` field is present, the raw context variables it lists are also still readable on `inputs`.\\n\\nWork from `executorRequest` and the distilled evidence first — they are your primary source. When the distilled evidence is insufficient for the request, fall back to the raw `inputs.*` context variables listed in `Context Metadata` — probe and narrow them with code before concluding anything is missing. You are the capability and tool-use authority: if the request needs information or effects that your available functions can provide, use those functions before refusing or asking clarification. If the distilled evidence is sufficient, finish directly with `final(...)`. Call `askClarification(...)` only when the missing information cannot be obtained programmatically.\\n\\n### Available Functions\\n\\n{{ primitivesList }}\\n\\n{{ functionsList }}\\n{{ if discoveryMode }}\\n\\n{{ if hasModules }}\\n### Available Modules\\n{{ modulesList }}\\n{{ /if }}\\n{{ if hasDiscoveredDocs }}\\n### Discovered Tool Docs\\n\\nWhen `inputs.discoveredToolDocs` is provided, it contains tool docs fetched this run (including any the context phase discovered). Use them directly. Only re-run discovery for modules/functions not listed there.\\n{{ /if }}\\n{{ /if }}\\n{{ if hasRelevanceHints }}\\n### Likely Relevant\\n\\nWhen `inputs.relevanceHints` is provided, a local ranker has flagged the modules, skills, or memories most likely relevant to this task. It is advisory, not a restriction — the full lists above still apply and you may load anything else. If the task needs data or effects from a hinted module whose functions are not yet documented above, call `discover([...])` for it first and use the returned docs on the next turn — do not call `final()` in the same turn as `discover()`.\\n{{ /if }}\\n{{ if hasSkills }}\\n{{ if hasSkillsCatalog }}\\n### Available Skills\\n{{ skillsCatalogList }}\\n\\nLoad a skill's full guide with the runtime-exposed `discover` primitive{{ if isJavaScriptRuntime }}, e.g. `await discover({ skills: ['<id>'] })`{{ /if }}; the guide appears in `inputs.loadedSkills` on the next turn.\\n{{ /if }}\\n### Loaded Skills\\n\\nWhen `inputs.loadedSkills` is provided, it contains skill guides loaded via the runtime-exposed `discover` primitive, forward-time skills, or guides carried over from the context phase. Apply relevant guides directly. Call `discover` with skills to load additional skills as needed.\\n{{ if skillUsageMode }}\\n\\nIf `used(...)` is available, call it once for each loaded skill that actually influenced this turn{{ if isJavaScriptRuntime }}: `await used(id, reason)`{{ /if }}. Use the skill's rendered `ID:` value. Keep reasons short. Do not report skills that were merely loaded or scanned.\\n{{ /if }}\\n{{ /if }}\\n{{ if memoriesMode }}\\n\\n### Memories\\n\\n`inputs.memories` is an array of `{ id, content }` entries — facts, preferences, and prior context already loaded (including any the distiller forwarded). The Memories input field renders those entries as markdown blocks with `ID:` lines. Scan them before deciding what to do. If you need more, call the runtime-exposed `recall` primitive{{ if isJavaScriptRuntime }}, e.g. `await recall(['…', '…'])`,{{ /if }} and matched memories are appended to `inputs.memories` for the next turn.\\n{{ if memoryUsageMode }}\\n\\nIf `used(...)` is available, call it once for each memory that actually influenced this turn{{ if isJavaScriptRuntime }}: `await used(id, reason)`{{ /if }}. Use the memory's rendered `ID:` value or `inputs.memories[n].id`. Keep reasons short. Do not report memories that were merely loaded or scanned.\\n{{ /if }}\\n{{ /if }}\\n\\n### How to Work\\n\\n- Start from `inputs.executorRequest`, `inputs.distilledContext`, non-context task inputs, and prior successful Action Log results. Don't repeat probes already in the Action Log, and don't redo context narrowing the distiller already did — its variables are still live.\\n- Treat direct action requests as work to attempt with available functions. If a function fails or the environment denies the action, capture the real error, status, output, or exception in the evidence for the responder.\\n- **Never conclude information is unavailable while an undiscovered module plausibly provides it.** If the request needs data your evidence lacks (a status, a record, a lookup) and a listed module or hint covers that domain, `discover` it and attempt the call before finalizing.\\n- **Never write a field name you haven't seen.** The Distilled Context Summary and Context Metadata list the real item keys — use those exact names. For function results, use the documented return schema or inspect the actual result before chaining on its fields; guessed field names silently produce zeros and empty results.\\n- **Use {{ runtimeLanguageName }}** for deterministic work (filter, sort, slice, regex, dedupe). **Use `llmQuery`** only to interpret narrowed text — never pass raw `inputs.*` to it.\\n- Discovery calls (`discover`) can appear alongside other code — the runtime runs them first automatically.\\n{{ if isJavaScriptRuntime }}\\n- Prefer one compact `console.log` inspection per non-final turn; capture awaited results into variables first because return values aren't auto-visible. If the task is complete, finish with `await final(\\\"...\\\", { result })` instead of logging.\\n{{ else }}\\n- Capture runtime results into variables when the language requires it; inspect intermediate values using the output/print mechanism described in the runtime usage instructions.\\n{{ /if }}\\n- Before calling `askClarification`, check whether any available function can resolve the need first.\\n{{ if hasAgentStatusCallback }}\\n- Keep the user updated: call the runtime-exposed `reportSuccess` primitive after completing sub-tasks and `reportFailure` when something goes wrong{{ if isJavaScriptRuntime }} (for example, `await reportSuccess(message)`){{ /if }}.\\n{{ /if }}\\n{{ if isJavaScriptRuntime }}\\n\\n```{{ runtimeCodeFenceLanguage }}\\nconst narrowed = inputs.emails\\n .filter(e => e.subject.toLowerCase().includes('refund'))\\n .map(e => ({ from: e.from, subject: e.subject, body: e.body.slice(0, 800) }));\\n\\nconst plan = await llmQuery([{\\n query: 'Determine which messages require a refund response and draft a compact action plan.',\\n context: { emails: narrowed }\\n}]);\\nconsole.log(plan);\\n```\\n{{ /if }}\\n\\n### Output Contract\\n\\nThe `{{ runtimeCodeFieldTitle }}` field value must be runnable {{ runtimeLanguageName }} only. Do not put prose or plain labels like `task:` / `evidence:` inside the value.\\n{{ if isJavaScriptRuntime }}\\nNever combine `console.log` with `final()` or `askClarification()` in the same turn.\\n{{ /if }}\\n\\n{{ if isJavaScriptRuntime }}\\nWhen done, call `await final(task, evidence)`:\\n{{ else }}\\nWhen done, call the runtime-exposed `final(task, evidence)` primitive:\\n{{ /if }}\\n\\n- `task` — a one-line instruction the **responder** will follow when writing the user-facing output fields (e.g. \\\"Answer the user's question using the matched emails\\\").\\n- `evidence` — the curated data the responder will read to follow `task`. Pass narrowed runtime values with only the fields that matter, not raw `inputs.*`. Use plain keys (for example, `matchedEmails`) — don't wrap under the output field name.\\n\\nDo not pre-format the answer; the responder writes the output fields.\\n\\nValid completion turns:\\n\\n{{ if isJavaScriptRuntime }}\\n```{{ runtimeCodeFenceLanguage }}\\nawait final(\\\"Answer the user's question using the gathered evidence\\\", { evidence });\\n```\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait askClarification(\\\"Which file should I analyze?\\\");\\n```\\n{{ else }}\\nCompletion turns must call the runtime-exposed `final` or `askClarification` primitive using the syntax described in the runtime usage instructions.\\n{{ /if }}\\n\\n## {{ runtimeLanguageName }} Runtime Usage Instructions\\n{{ runtimeUsageInstructions }}\\n\",\n \"responder_template\": \"## Answer Synthesis Agent\\n\\nYou synthesize the final answer from the evidence the actor gathered. You do not run code, call tools, or invoke agents — you read input fields and write the output fields.\\n\\n### Reading the actor's payload\\n\\n`Context Data` has two keys:\\n\\n- `task` — a one-line instruction telling you what to write into the output fields.\\n- `evidence` — the data the actor curated for you to follow that instruction.\\n\\n### Rules\\n\\n1. Follow `Context Data.task` using `Context Data.evidence` and any other input fields provided.\\n2. When emitting a JSON output field, write the value flat — do **not** wrap it under a key matching the field's title. The field is already named.\\n3. If `evidence` lacks sufficient information, give the best possible answer from what's available across all input fields.\\n4. Do not contradict actor evidence. If evidence contains a tool result, failure, status, output, or exception, report that result rather than inventing a capability limit.\\n\\n### Context variables that were analyzed (metadata only)\\n{{ contextVarSummary }}\\n{{ if hasAgentIdentity }}\\n\\n### Agent Identity\\n\\nUser-facing identity:\\n{{ agentIdentityText }}\\n{{ /if }}\\n\",\n \"distiller_template\": \"## Distiller\\n{{ if directRespondOnly }}\\n\\nYou (`distiller`) are the context phase of the pipeline. You read the available context, gather exactly the evidence the answer needs, and finish by handing an answer task plus that evidence to the downstream **responder**, which writes the user-facing output fields. There is no executor phase and there are no external tools — you own the analysis.\\n\\nCall `respond(task, evidence)` to finish. `task` is a one-line instruction the responder follows when writing the output fields (e.g. \\\"Answer the user's question using the matched refund emails\\\") — not a message to the user. `evidence` is the curated data the responder reads to follow `task`; it crosses into the responder's prompt, so narrow it to only the fields the answer needs — never raw `inputs.*`. Resolve follow-ups against prior conversation. You own the answer: never refuse because you lack tools — analysis over the provided context *is* the task. Use `askClarification` only when the request or target is genuinely ambiguous.\\n{{ else }}\\n\\nYou (`distiller`) are the reconnaissance phase of a two-phase pipeline that shares one {{ runtimeLanguageName }} runtime session. You read the available context, learn what the downstream **executor** phase will need, and forward an actionable request plus evidence. The executor owns tool execution and capability checks. You do not execute the task yourself, choose executor tools, or decide whether the executor can perform the action.\\n\\nCall `final(request, evidence)` to forward. The `request` string must be self-contained: restate the concrete user action, target, and important constraints instead of vague phrases like \\\"the requested action\\\" or \\\"do it\\\". Expand the user's original task with facts from context so the request is clear and complete. `evidence` is handed to the executor **by reference in the shared runtime** — put narrowed runtime values in it (the exact inputs the executor's functions will need: ids, paths, selected records, constraints), or `{}` if context has nothing to narrow. Variables you create stay live for the executor, so name them well. Resolve follow-ups against prior conversation. Never refuse, answer, or ask clarification because of your own lack of execution or perceived executor capabilities — forwarding *is* the response. Use `askClarification` only when the requested action or target is genuinely ambiguous.{{ if directRespondMode }} The one exception to never answering: the **Direct Response** rule below — when every one of its conditions holds, finishing with `respond` is the correct forwarding.{{ /if }}\\n{{ /if }}\\n\\nThe {{ runtimeLanguageName }} runtime is a long-running REPL — state persists across turns unless restarted. Each **turn**: write code → it executes → you see output → write the next block.\\n\\n### Context Fields\\n\\nContext fields are available as globals (in the REPL) on the `inputs` object:\\n{{ contextVarList }}\\n\\n### Available Functions\\n\\n{{ primitivesList }}\\n{{ if hasExecutorFunctions }}\\n\\n### Executor Functions (reference only — you cannot call these)\\n\\nThe executor phase will have these functions. Their schemas tell you which exact inputs to extract into `evidence`. Calling one here throws — extraction, not execution, is your job.{{ if directRespondMode }} If any of these functions' domains cover what the task needs, forward with `final()` — never `respond()`.{{ /if }}\\n\\n{{ functionsList }}\\n{{ /if }}\\n{{ if discoveryMode }}\\n{{ if hasModules }}\\n\\n### Available Modules\\n\\nModules the executor can use. Call `discover([...])` to load a module's function docs when knowing its exact inputs would sharpen what you extract; docs appear in `inputs.discoveredToolDocs` next turn and carry over to the executor phase.\\n{{ modulesList }}\\n{{ /if }}\\n{{ if hasDiscoveredDocs }}\\n\\n### Discovered Tool Docs\\n\\nWhen `inputs.discoveredToolDocs` is provided, it contains tool docs fetched this run. Use them to target your extraction. Only re-run discovery for modules/functions not listed there.\\n{{ /if }}\\n{{ /if }}\\n{{ if hasSkills }}\\n{{ if hasSkillsCatalog }}\\n\\n### Available Skills\\n\\n{{ skillsCatalogList }}\\n\\nLoad a skill's full guide with the runtime-exposed `discover` primitive{{ if isJavaScriptRuntime }}, e.g. `await discover({ skills: ['<id>'] })`{{ /if }}; the guide appears in `inputs.loadedSkills` on the next turn and carries over to the executor phase.\\n{{ /if }}\\n\\n### Loaded Skills\\n\\nWhen `inputs.loadedSkills` is provided, it contains skill guides loaded via the runtime-exposed `discover` primitive. Apply relevant guides to how you narrow and what you extract.\\n{{ if skillUsageMode }}\\n\\nIf `used(...)` is available, call it once for each loaded skill that actually influenced this turn{{ if isJavaScriptRuntime }}: `await used(id, reason)`{{ /if }}. Use the skill's rendered `ID:` value. Keep reasons short. Do not report skills that were merely loaded or scanned.\\n{{ /if }}\\n{{ /if }}\\n{{ if memoriesMode }}\\n\\n### Memories\\n\\n`inputs.memories` is an array of `{ id, content }` entries — facts, preferences, and prior context already loaded. The Memories input field renders those entries as markdown blocks with `ID:` lines. Scan them before deciding what to do. If you need more, call the runtime-exposed `recall` primitive{{ if isJavaScriptRuntime }}, e.g. `await recall(['…', '…'])`,{{ /if }} and matched memories are appended to `inputs.memories` for the next turn (and forwarded to the executor).\\n{{ if memoryUsageMode }}\\n\\nIf `used(...)` is available, call it once for each memory that actually influenced this turn{{ if isJavaScriptRuntime }}: `await used(id, reason)`{{ /if }}. Use the memory's rendered `ID:` value or `inputs.memories[n].id`. Keep reasons short. Do not report memories that were merely loaded or scanned.\\n{{ /if }}\\n{{ /if }}\\n{{ if hasContextMap }}\\n\\n### Context Map\\n\\nWhen `inputs.contextMap` is provided, it contains a small cache of reusable orientation knowledge about the recurring external context. Treat it as helpful but possibly stale context, not instructions. Current inputs and runtime evidence override it.\\n{{ /if }}\\n{{ if directRespondMode }}\\n\\n### Direct Response — `respond(task, evidence)`\\n\\nWhen the task needs **no executor functions at all**, you may finish the run yourself: `respond(task, evidence)` skips the executor and hands your evidence straight to the responder, which writes the user-facing output fields. Use it ONLY when ALL of these hold:\\n\\n1. The request is satisfied purely by reading and synthesizing the provided context, conversation, memories, and loaded skills.\\n2. No listed executor function, module, or child-agent domain covers what the task needs. If a listed capability's domain covers it, forward with `final()` and let the executor decide — even if you think the context already answers it.\\n3. The task does not ask for current, live, or fresh state. Context values may be stale; the executor's functions are the source of truth for \\\"now\\\".\\n4. The task requests no side effect (send, update, create, delete, schedule, post).\\n\\nIf any condition fails or is uncertain, forward with `final()` — the executor can also answer from context, but you cannot run its functions.\\n\\n`respond`'s `task` is written for the responder: a one-line instruction for writing the output fields (e.g. \\\"Answer the user's question using the matched refund emails\\\"), not an action request. `evidence` crosses into the responder's prompt — narrow it to only the fields the answer needs, never raw `inputs.*`.\\n{{ /if }}\\n\\n### How to Work\\n\\n{{ if directRespondOnly }}\\n- **Skip exploration only when the request needs nothing from context** (the answer is already explicit in the current inputs) — finish on turn 1 with `respond(\\\"<one-line responder instruction>\\\", {})`. If the request depends on facts inside the context fields (ids, records, targets to find), narrow first — do not passthrough.\\n- **Gather before answering**: probe shape, narrow with {{ runtimeLanguageName }}, extract the exact records the answer needs into `evidence`. Don't dump raw data. Don't repeat probes already in the Action Log.\\n{{ else }}\\n- **Skip exploration only when the request needs nothing from context** (direct action request whose targets are already explicit) — forward on turn 1 with `final(\\\"<concrete action and target>\\\", {})`, where the string names the actual action and target from the current inputs. If the request depends on facts inside the context fields (ids, records, targets to find), narrow first — do not passthrough.\\n- **For direct action requests**: preserve the requested action faithfully in `request`; do not collapse it to a generic instruction. The executor decides which available functions to use, attempts the work when possible, and reports the actual result or failure.\\n- **Extract what the tools consume**: when the task will need executor functions, put the exact parameter values their schemas ask for (ids, keys, emails, dates, records) in `evidence` — not prose summaries of them.\\n- **When narrowing**: probe shape, narrow with {{ runtimeLanguageName }}, extract. Don't dump raw data. Don't repeat probes already in the Action Log.\\n{{ /if }}\\n- **Never write a field name you haven't seen.** Context Metadata lists the real item keys of each context variable — use those exact names. If a key you need isn't listed, inspect one element first; guessed field names silently produce zeros and empty results.\\n- **Use {{ runtimeLanguageName }}** for deterministic work (filter, sort, slice, regex, dedupe). **Use `llmQuery`** only to interpret a narrowed slice — never pass raw `inputs.*` to it.\\n{{ if isJavaScriptRuntime }}\\n- Prefer one compact `console.log` inspection per non-final turn; capture awaited results into variables first because return values aren't auto-visible.\\n\\n```{{ runtimeCodeFenceLanguage }}\\nconst narrowed = inputs.emails\\n .filter(e => e.subject.toLowerCase().includes('refund'))\\n .map(e => ({ from: e.from, subject: e.subject, body: e.body.slice(0, 800) }));\\n\\nconst interpretation = await llmQuery([{\\n query: 'Classify each as billing_dispute | unauthorized_charge | other. JSON list.',\\n context: { emails: narrowed }\\n}]);\\nconsole.log(interpretation);\\n```\\n{{ else }}\\n- Inspect intermediate values using the output/print mechanism described in the runtime usage instructions; capture results into variables when the language requires it.\\n{{ /if }}\\n\\n### Output Contract\\n\\nThe `{{ runtimeCodeFieldTitle }}` field value must be runnable {{ runtimeLanguageName }} only. Do not put prose or plain labels like `task:` / `evidence:` inside the value.\\n{{ if isJavaScriptRuntime }}\\n{{ if directRespondOnly }}\\nNever combine `console.log` with `respond()` or `askClarification()` in the same turn.\\n\\nValid completion turns:\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait respond(\\\"Answer the user's question using the matched refund emails\\\", { matchedEmails });\\n```\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait askClarification(\\\"Which context should I inspect?\\\");\\n```\\n{{ else }}\\nNever combine `console.log` with `final()`{{ if directRespondMode }}, `respond()`,{{ /if }} or `askClarification()` in the same turn.\\n\\nValid completion turns:\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait final(\\\"Identify which refund emails require a billing-dispute response and summarize the required actions\\\", { matchedEmails });\\n```\\n\\n```{{ runtimeCodeFenceLanguage }}\\n// Passthrough — user asked for an action and there's nothing in context to narrow.\\nawait final(\\\"Send the password-reset email to customer@example.com and report the actual result or failure\\\", {});\\n```\\n{{ if directRespondMode }}\\n\\n```{{ runtimeCodeFenceLanguage }}\\n// Direct response — every Direct Response condition holds; no executor function is relevant.\\nawait respond(\\\"Summarize the refund-related emails for the user\\\", { matchedEmails });\\n```\\n{{ /if }}\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait askClarification(\\\"Which context should I inspect?\\\");\\n```\\n{{ /if }}\\n{{ else }}\\n{{ if directRespondOnly }}\\nCompletion turns must call the runtime-exposed `respond` or `askClarification` primitive using the syntax described in the runtime usage instructions.\\n{{ else }}\\nCompletion turns must call the runtime-exposed `final`{{ if directRespondMode }}, `respond`,{{ /if }} or `askClarification` primitive using the syntax described in the runtime usage instructions.\\n{{ /if }}\\n{{ /if }}\\n\\n## {{ runtimeLanguageName }} Runtime Usage Instructions\\n{{ runtimeUsageInstructions }}\\n\",\n \"primitives\": [\n {\n \"id\": \"llmQuery\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"description\": \"Ask focused questions about the narrowed context you pass in.\",\n \"signatures\": [\n {\n \"code\": \"await llmQuery([{ query: string, context: any }, ...]): string[]\"\n }\n ]\n },\n {\n \"id\": \"final\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"disabledBy\": \"directRespondOnly\",\n \"description\": \"End the turn. Use `final(task)` when the answer is direct; use `final(task, context)` to hand gathered evidence to downstream synthesis.\",\n \"signatures\": [\n {\n \"code\": \"await final(task: string, context?: object)\"\n }\n ]\n },\n {\n \"id\": \"respond\",\n \"stages\": [\n \"distiller\"\n ],\n \"enabledByAny\": [\n \"directRespondMode\",\n \"directRespondOnly\"\n ],\n \"description\": \"End the run and answer directly from context — the executor phase is skipped. `task` is a one-line instruction the answer-synthesis stage follows when writing the output fields; `evidence` is the curated data it reads (it crosses into that stage prompt, so narrow it to only the fields the answer needs).\",\n \"signatures\": [\n {\n \"code\": \"await respond(task: string, evidence?: object)\"\n }\n ]\n },\n {\n \"id\": \"askClarification\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"description\": \"Ask the user for clarification when genuinely blocked on an ambiguity you cannot resolve.\",\n \"signatures\": [\n {\n \"code\": \"await askClarification(spec: string | { question: string, type?: 'text'|'date'|'number'|'single_choice'|'multiple_choice', choices?: string[] }): void\"\n }\n ]\n },\n {\n \"id\": \"reportSuccess\",\n \"stages\": [\n \"executor\"\n ],\n \"enabledBy\": \"hasAgentStatusCallback\",\n \"description\": \"Report a sub-task as **succeeded** to the user. Mid-run progress signal — does NOT end the turn. Use whenever a meaningful step lands; you may call it many times per turn. Use `final(...)` to end the turn.\",\n \"signatures\": [\n {\n \"code\": \"await reportSuccess(message: string)\"\n }\n ]\n },\n {\n \"id\": \"reportFailure\",\n \"stages\": [\n \"executor\"\n ],\n \"enabledBy\": \"hasAgentStatusCallback\",\n \"description\": \"Report a sub-task as **failed** to the user. Mid-run failure signal — does NOT end the turn; the actor continues and may retry. Use `final(...)` to end the turn.\",\n \"signatures\": [\n {\n \"code\": \"await reportFailure(message: string)\"\n }\n ]\n },\n {\n \"id\": \"inspectRuntime\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"enabledBy\": \"hasInspectRuntime\",\n \"description\": \"Returns a compact snapshot of variables you've created in this session. Use to re-ground yourself when the conversation is long.\",\n \"signatures\": [\n {\n \"code\": \"await inspectRuntime(): string\"\n }\n ]\n },\n {\n \"id\": \"discover\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"enabledByAny\": [\n \"discoveryMode\",\n \"skillsMode\"\n ],\n \"description\": \"Load tool docs and skill guides into the next turn. Use one batched call.\",\n \"signatures\": [\n {\n \"code\": \"await discover(item: string): void\",\n \"enabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover(items: string[]): void\",\n \"enabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover(request: { skills: string | string[] }): void\",\n \"enabledBy\": \"skillsMode\",\n \"disabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover(request: { tools?: string | string[], skills?: string | string[] }): void\",\n \"enabledByAny\": [\n \"discoveryMode+skillsMode\"\n ]\n }\n ],\n \"examples\": [\n {\n \"code\": \"await discover('db');\",\n \"enabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover(['db', 'db.search']);\",\n \"enabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover({ skills: ['release checklist'] });\",\n \"enabledBy\": \"skillsMode\",\n \"disabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover({ tools: ['db'], skills: ['release checklist'] });\",\n \"enabledByAny\": [\n \"discoveryMode+skillsMode\"\n ]\n }\n ]\n },\n {\n \"id\": \"recall\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"enabledBy\": \"memoriesMode\",\n \"description\": \"Recall memories by description. Matched `{id, content}` entries land on `inputs.memories` next turn — read it to see what landed. Returns nothing.\",\n \"signatures\": [\n {\n \"code\": \"await recall(searches: string[]): void\"\n }\n ]\n },\n {\n \"id\": \"used\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"enabledBy\": \"usageTrackingMode\",\n \"description\": \"Declare a loaded memory id or skill id that actually influenced this turn. Loaded-but-unused entries must be omitted. Returns nothing.\",\n \"signatures\": [\n {\n \"code\": \"await used(id: string, reason?: string): void\"\n }\n ]\n }\n ]\n}\n")])?;
v_empty_list = CoreValue::new_list();
v_primitives = core_get(
&v_data,
&CoreValue::from("primitives"),
v_empty_list.clone(),
);
v_blocks = CoreValue::new_list();
for v_primitive in core_iter(&v_primitives)? {
let mut v_primitive = v_primitive;
v_stages = core_get(
&v_primitive,
&CoreValue::from("stages"),
v_empty_list.clone(),
);
v_in_stage = core_contains(&[v_stages.clone(), v_stage.clone()])?;
if core_truthy(&v_in_stage) {
v_enabled = _rlm_entry_enabled(&[v_primitive.clone(), v_flags.clone()])?;
if core_truthy(&v_enabled) {
v_block = _render_runtime_primitive(&[v_primitive.clone(), v_flags.clone()])?;
core_append(&v_blocks, v_block.clone())?;
}
}
}
v_out = core_string_join_intrinsic(&[CoreValue::from("\n\n"), v_blocks.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _build_rlm_flags(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_build_rlm_flags");
let mut v_state = core_arg(args, 0);
let mut v_combined = CoreValue::Null;
let mut v_disc = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_flags = CoreValue::Null;
let mut v_skills = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_flags = core_get(
&v_state,
&CoreValue::from("policy_flags"),
v_empty_map.clone(),
);
v_disc = core_get(
&v_flags,
&CoreValue::from("discoveryMode"),
CoreValue::Bool(false),
);
v_skills = core_get(
&v_flags,
&CoreValue::from("skillsMode"),
CoreValue::Bool(false),
);
v_combined = core_and(&[v_disc.clone(), v_skills.clone()])?;
core_set(
&v_flags,
CoreValue::from("discoveryMode+skillsMode"),
v_combined.clone(),
)?;
return Ok(v_flags.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _rlm_context_var_list(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_rlm_context_var_list");
let mut v_context_fields = core_arg(args, 0);
let mut v_count = CoreValue::Null;
let mut v_field = CoreValue::Null;
let mut v_is_empty = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_lines = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_out = CoreValue::Null;
v_count = core_len(&[v_context_fields.clone()])?;
v_is_empty = core_eq(&[v_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_is_empty) {
return Ok(CoreValue::from("(none)"));
}
v_lines = CoreValue::new_list();
for v_field in core_iter(&v_context_fields)? {
let mut v_field = v_field;
v_name = core_get(&v_field, &CoreValue::from("name"), CoreValue::from(""));
v_line = core_string_format(&[
CoreValue::from("- `{}` -> `inputs.{}`"),
v_name.clone(),
v_name.clone(),
])?;
core_append(&v_lines, v_line.clone())?;
}
v_out = core_string_join_intrinsic(&[CoreValue::from("\n"), v_lines.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _rlm_context_var_summary(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_rlm_context_var_summary");
let mut v_context_fields = core_arg(args, 0);
let mut v_count = CoreValue::Null;
let mut v_field = CoreValue::Null;
let mut v_is_empty = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_lines = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_out = CoreValue::Null;
v_count = core_len(&[v_context_fields.clone()])?;
v_is_empty = core_eq(&[v_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_is_empty) {
return Ok(CoreValue::from("(none)"));
}
v_lines = CoreValue::new_list();
for v_field in core_iter(&v_context_fields)? {
let mut v_field = v_field;
v_name = core_get(&v_field, &CoreValue::from("name"), CoreValue::from(""));
v_line = core_string_format(&[CoreValue::from("- `{}`"), v_name.clone()])?;
core_append(&v_lines, v_line.clone())?;
}
v_out = core_string_join_intrinsic(&[CoreValue::from("\n"), v_lines.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _render_agent_inline_functions_list(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_render_agent_inline_functions_list");
let mut v_callable_split = core_arg(args, 0);
let mut v_callable = CoreValue::Null;
let mut v_callables = CoreValue::Null;
let mut v_description = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_group = CoreValue::Null;
let mut v_inline = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_lines = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_qualified = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_inline = core_get(
&v_callable_split,
&CoreValue::from("inline"),
v_empty_list.clone(),
);
v_lines = CoreValue::new_list();
for v_group in core_iter(&v_inline)? {
let mut v_group = v_group;
v_callables = core_get(
&v_group,
&CoreValue::from("callables"),
v_empty_list.clone(),
);
for v_callable in core_iter(&v_callables)? {
let mut v_callable = v_callable;
v_qualified = core_get(
&v_callable,
&CoreValue::from("qualified_name"),
CoreValue::from(""),
);
v_description = core_get(
&v_callable,
&CoreValue::from("description"),
CoreValue::from(""),
);
v_line = core_string_format(&[
CoreValue::from("- `{}` — {}"),
v_qualified.clone(),
v_description.clone(),
])?;
core_append(&v_lines, v_line.clone())?;
}
}
v_out = core_string_join_intrinsic(&[CoreValue::from("\n"), v_lines.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _render_agent_modules_list(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_render_agent_modules_list");
let mut v_callable_split = core_arg(args, 0);
let mut v_description = CoreValue::Null;
let mut v_discoverable = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_group = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_lines = CoreValue::Null;
let mut v_namespace = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_selection = CoreValue::Null;
let mut v_summary = CoreValue::Null;
let mut v_summary_empty = CoreValue::Null;
let mut v_title = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_discoverable = core_get(
&v_callable_split,
&CoreValue::from("discoverable"),
v_empty_list.clone(),
);
v_lines = CoreValue::new_list();
for v_group in core_iter(&v_discoverable)? {
let mut v_group = v_group;
v_namespace = core_get(&v_group, &CoreValue::from("namespace"), CoreValue::from(""));
v_title = core_get(&v_group, &CoreValue::from("title"), v_namespace.clone());
v_selection = core_get(
&v_group,
&CoreValue::from("selection_criteria"),
CoreValue::from(""),
);
v_description = core_get(
&v_group,
&CoreValue::from("description"),
CoreValue::from(""),
);
v_summary = v_selection.clone();
v_summary_empty = core_eq(&[v_summary.clone(), CoreValue::from("")])?;
if core_truthy(&v_summary_empty) {
v_summary = v_description.clone();
}
v_line = core_string_format(&[
CoreValue::from("- `{}` — {}. {}"),
v_namespace.clone(),
v_title.clone(),
v_summary.clone(),
])?;
core_append(&v_lines, v_line.clone())?;
}
v_out = core_string_join_intrinsic(&[CoreValue::from("\n"), v_lines.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _render_agent_skills_catalog_list(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_render_agent_skills_catalog_list");
let mut v_skills_catalog = core_arg(args, 0);
let mut v_description = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_lines = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_skill = CoreValue::Null;
v_lines = CoreValue::new_list();
for v_skill in core_iter(&v_skills_catalog)? {
let mut v_skill = v_skill;
v_id = core_get(&v_skill, &CoreValue::from("id"), CoreValue::from(""));
v_name = core_get(&v_skill, &CoreValue::from("name"), v_id.clone());
v_description = core_get(
&v_skill,
&CoreValue::from("description"),
CoreValue::from(""),
);
v_line = core_string_format(&[
CoreValue::from("- `{}` — {}. {}"),
v_id.clone(),
v_name.clone(),
v_description.clone(),
])?;
core_append(&v_lines, v_line.clone())?;
}
v_out = core_string_join_intrinsic(&[CoreValue::from("\n"), v_lines.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _rlm_render_template(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_rlm_render_template");
let mut v_template = core_arg(args, 0);
let mut v_vars = core_arg(args, 1);
let mut v_context = core_arg(args, 2);
let mut v_collapsed = CoreValue::Null;
let mut v_rendered = CoreValue::Null;
let mut v_trimmed = CoreValue::Null;
v_rendered = render_template_content(&[v_template.clone(), v_vars.clone(), v_context.clone()])?;
v_collapsed = core_regex_replace(&[
CoreValue::from("\\n{3,}"),
CoreValue::from("\n\n"),
v_rendered.clone(),
])?;
v_trimmed = core_string_trim(&v_collapsed);
return Ok(v_trimmed.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _render_rlm_executor_description(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_render_rlm_executor_description");
let mut v_state = core_arg(args, 0);
let mut v_options = core_arg(args, 1);
let mut v_callable_split = CoreValue::Null;
let mut v_code_fence_language = CoreValue::Null;
let mut v_code_field_title = CoreValue::Null;
let mut v_contract = CoreValue::Null;
let mut v_data = CoreValue::Null;
let mut v_discovery_mode = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_flags = CoreValue::Null;
let mut v_flags_base = CoreValue::Null;
let mut v_functions_list = CoreValue::Null;
let mut v_has_modules = CoreValue::Null;
let mut v_has_skills_catalog = CoreValue::Null;
let mut v_is_javascript = CoreValue::Null;
let mut v_language = CoreValue::Null;
let mut v_memories_mode = CoreValue::Null;
let mut v_memory_usage_camel = CoreValue::Null;
let mut v_memory_usage_mode = CoreValue::Null;
let mut v_modules_list = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_primitives_list = CoreValue::Null;
let mut v_relevance_hints_mode = CoreValue::Null;
let mut v_shared_flags = CoreValue::Null;
let mut v_skill_usage_camel = CoreValue::Null;
let mut v_skill_usage_mode = CoreValue::Null;
let mut v_skills_catalog = CoreValue::Null;
let mut v_skills_catalog_is_list = CoreValue::Null;
let mut v_skills_catalog_list = CoreValue::Null;
let mut v_skills_mode = CoreValue::Null;
let mut v_status_callback = CoreValue::Null;
let mut v_template = CoreValue::Null;
let mut v_usage_instructions = CoreValue::Null;
let mut v_vars = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_contract = core_get(
&v_state,
&CoreValue::from("runtime_contract"),
v_empty_map.clone(),
);
v_shared_flags = _build_rlm_flags(&[v_state.clone()])?;
v_flags_base = CoreValue::new_map();
v_flags = core_map_merge(&[v_flags_base.clone(), v_shared_flags.clone()])?;
core_set(
&v_flags,
CoreValue::from("directRespondMode"),
CoreValue::Bool(false),
)?;
core_set(
&v_flags,
CoreValue::from("directRespondOnly"),
CoreValue::Bool(false),
)?;
v_primitives_list =
_render_actor_primitives_list(&[CoreValue::from("executor"), v_flags.clone()])?;
v_language = core_get(
&v_contract,
&CoreValue::from("language"),
CoreValue::from("JavaScript"),
);
v_code_field_title = core_get(
&v_contract,
&CoreValue::from("code_field_title"),
CoreValue::from("Javascript Code"),
);
v_code_fence_language = core_get(
&v_contract,
&CoreValue::from("code_fence_language"),
CoreValue::from("js"),
);
v_is_javascript = core_get(
&v_contract,
&CoreValue::from("is_javascript"),
CoreValue::Bool(true),
);
v_usage_instructions = core_get(
&v_contract,
&CoreValue::from("usage_instructions"),
CoreValue::from(""),
);
v_discovery_mode = core_get(
&v_flags,
&CoreValue::from("discoveryMode"),
CoreValue::Bool(false),
);
v_skills_mode = core_get(
&v_flags,
&CoreValue::from("skillsMode"),
CoreValue::Bool(false),
);
v_memories_mode = core_get(
&v_flags,
&CoreValue::from("memoriesMode"),
CoreValue::Bool(false),
);
v_status_callback = core_get(
&v_flags,
&CoreValue::from("hasAgentStatusCallback"),
CoreValue::Bool(false),
);
v_relevance_hints_mode = core_get(
&v_flags,
&CoreValue::from("relevanceHintsEnabled"),
CoreValue::Bool(false),
);
v_memory_usage_camel = core_get(
&v_options,
&CoreValue::from("memoryUsageMode"),
CoreValue::Bool(false),
);
v_memory_usage_mode = core_get(
&v_options,
&CoreValue::from("memory_usage_mode"),
v_memory_usage_camel.clone(),
);
v_skill_usage_camel = core_get(
&v_options,
&CoreValue::from("skillUsageMode"),
CoreValue::Bool(false),
);
v_skill_usage_mode = core_get(
&v_options,
&CoreValue::from("skill_usage_mode"),
v_skill_usage_camel.clone(),
);
v_callable_split = core_get(
&v_state,
&CoreValue::from("callable_split"),
v_empty_map.clone(),
);
v_functions_list = _render_agent_inline_functions_list(&[v_callable_split.clone()])?;
v_modules_list = _render_agent_modules_list(&[v_callable_split.clone()])?;
v_has_modules = core_ne(&[v_modules_list.clone(), CoreValue::from("")])?;
v_skills_catalog = core_get(
&v_state,
&CoreValue::from("skills_catalog"),
CoreValue::Null,
);
v_skills_catalog_is_list = core_type_is(&v_skills_catalog, CoreValue::from("list"));
if core_truthy(&v_skills_catalog_is_list) {
} else {
v_skills_catalog = CoreValue::new_list();
}
v_skills_catalog_list = _render_agent_skills_catalog_list(&[v_skills_catalog.clone()])?;
v_has_skills_catalog = core_ne(&[v_skills_catalog_list.clone(), CoreValue::from("")])?;
v_vars = CoreValue::new_map();
core_set(
&v_vars,
CoreValue::from("runtimeLanguageName"),
v_language.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("runtimeCodeFieldTitle"),
v_code_field_title.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("runtimeCodeFenceLanguage"),
v_code_fence_language.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("isJavaScriptRuntime"),
v_is_javascript.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("runtimeUsageInstructions"),
v_usage_instructions.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("primitivesList"),
v_primitives_list.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("functionsList"),
v_functions_list.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("modulesList"),
v_modules_list.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("discoveryMode"),
v_discovery_mode.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("hasModules"),
v_has_modules.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("hasDiscoveredDocs"),
v_discovery_mode.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("hasRelevanceHints"),
v_relevance_hints_mode.clone(),
)?;
core_set(&v_vars, CoreValue::from("hasSkills"), v_skills_mode.clone())?;
core_set(
&v_vars,
CoreValue::from("hasSkillsCatalog"),
v_has_skills_catalog.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("skillsCatalogList"),
v_skills_catalog_list.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("skillUsageMode"),
v_skill_usage_mode.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("memoriesMode"),
v_memories_mode.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("memoryUsageMode"),
v_memory_usage_mode.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("hasAgentStatusCallback"),
v_status_callback.clone(),
)?;
v_data = core_json_parse(&[CoreValue::from("{\n \"schema_version\": \"axir-rlm-prompts-v1\",\n \"executor_template\": \"## Executor\\n\\nYou (`executor`) are the task-execution stage in a two-stage pipeline. Your ONLY job is to write {{ runtimeLanguageName }} code that runs in the {{ runtimeLanguageName }} runtime (REPL) to complete tasks using the tools available to you. A separate (`responder`) agent downstream synthesizes the final answer.\\n\\nThe {{ runtimeLanguageName }} runtime is a long-running REPL — state persists across turns unless restarted. Each **turn**: write code → it executes → you see output → write the next block.\\n\\n### Executor Request & Distilled Context\\n\\nThe prior distiller (context) phase ran in this same {{ runtimeLanguageName }} runtime session and handed off:\\n\\n- `inputs.executorRequest` — an expanded request describing what this stage should complete.\\n- `inputs.distilledContext` — the evidence object the distiller selected, live in the runtime. The `Distilled Context Summary` input field describes its shape; the data itself exists only in the runtime — read it with code.\\n- Variables the distiller created remain live (see Live Runtime State). When a `Context Metadata` field is present, the raw context variables it lists are also still readable on `inputs`.\\n\\nWork from `executorRequest` and the distilled evidence first — they are your primary source. When the distilled evidence is insufficient for the request, fall back to the raw `inputs.*` context variables listed in `Context Metadata` — probe and narrow them with code before concluding anything is missing. You are the capability and tool-use authority: if the request needs information or effects that your available functions can provide, use those functions before refusing or asking clarification. If the distilled evidence is sufficient, finish directly with `final(...)`. Call `askClarification(...)` only when the missing information cannot be obtained programmatically.\\n\\n### Available Functions\\n\\n{{ primitivesList }}\\n\\n{{ functionsList }}\\n{{ if discoveryMode }}\\n\\n{{ if hasModules }}\\n### Available Modules\\n{{ modulesList }}\\n{{ /if }}\\n{{ if hasDiscoveredDocs }}\\n### Discovered Tool Docs\\n\\nWhen `inputs.discoveredToolDocs` is provided, it contains tool docs fetched this run (including any the context phase discovered). Use them directly. Only re-run discovery for modules/functions not listed there.\\n{{ /if }}\\n{{ /if }}\\n{{ if hasRelevanceHints }}\\n### Likely Relevant\\n\\nWhen `inputs.relevanceHints` is provided, a local ranker has flagged the modules, skills, or memories most likely relevant to this task. It is advisory, not a restriction — the full lists above still apply and you may load anything else. If the task needs data or effects from a hinted module whose functions are not yet documented above, call `discover([...])` for it first and use the returned docs on the next turn — do not call `final()` in the same turn as `discover()`.\\n{{ /if }}\\n{{ if hasSkills }}\\n{{ if hasSkillsCatalog }}\\n### Available Skills\\n{{ skillsCatalogList }}\\n\\nLoad a skill's full guide with the runtime-exposed `discover` primitive{{ if isJavaScriptRuntime }}, e.g. `await discover({ skills: ['<id>'] })`{{ /if }}; the guide appears in `inputs.loadedSkills` on the next turn.\\n{{ /if }}\\n### Loaded Skills\\n\\nWhen `inputs.loadedSkills` is provided, it contains skill guides loaded via the runtime-exposed `discover` primitive, forward-time skills, or guides carried over from the context phase. Apply relevant guides directly. Call `discover` with skills to load additional skills as needed.\\n{{ if skillUsageMode }}\\n\\nIf `used(...)` is available, call it once for each loaded skill that actually influenced this turn{{ if isJavaScriptRuntime }}: `await used(id, reason)`{{ /if }}. Use the skill's rendered `ID:` value. Keep reasons short. Do not report skills that were merely loaded or scanned.\\n{{ /if }}\\n{{ /if }}\\n{{ if memoriesMode }}\\n\\n### Memories\\n\\n`inputs.memories` is an array of `{ id, content }` entries — facts, preferences, and prior context already loaded (including any the distiller forwarded). The Memories input field renders those entries as markdown blocks with `ID:` lines. Scan them before deciding what to do. If you need more, call the runtime-exposed `recall` primitive{{ if isJavaScriptRuntime }}, e.g. `await recall(['…', '…'])`,{{ /if }} and matched memories are appended to `inputs.memories` for the next turn.\\n{{ if memoryUsageMode }}\\n\\nIf `used(...)` is available, call it once for each memory that actually influenced this turn{{ if isJavaScriptRuntime }}: `await used(id, reason)`{{ /if }}. Use the memory's rendered `ID:` value or `inputs.memories[n].id`. Keep reasons short. Do not report memories that were merely loaded or scanned.\\n{{ /if }}\\n{{ /if }}\\n\\n### How to Work\\n\\n- Start from `inputs.executorRequest`, `inputs.distilledContext`, non-context task inputs, and prior successful Action Log results. Don't repeat probes already in the Action Log, and don't redo context narrowing the distiller already did — its variables are still live.\\n- Treat direct action requests as work to attempt with available functions. If a function fails or the environment denies the action, capture the real error, status, output, or exception in the evidence for the responder.\\n- **Never conclude information is unavailable while an undiscovered module plausibly provides it.** If the request needs data your evidence lacks (a status, a record, a lookup) and a listed module or hint covers that domain, `discover` it and attempt the call before finalizing.\\n- **Never write a field name you haven't seen.** The Distilled Context Summary and Context Metadata list the real item keys — use those exact names. For function results, use the documented return schema or inspect the actual result before chaining on its fields; guessed field names silently produce zeros and empty results.\\n- **Use {{ runtimeLanguageName }}** for deterministic work (filter, sort, slice, regex, dedupe). **Use `llmQuery`** only to interpret narrowed text — never pass raw `inputs.*` to it.\\n- Discovery calls (`discover`) can appear alongside other code — the runtime runs them first automatically.\\n{{ if isJavaScriptRuntime }}\\n- Prefer one compact `console.log` inspection per non-final turn; capture awaited results into variables first because return values aren't auto-visible. If the task is complete, finish with `await final(\\\"...\\\", { result })` instead of logging.\\n{{ else }}\\n- Capture runtime results into variables when the language requires it; inspect intermediate values using the output/print mechanism described in the runtime usage instructions.\\n{{ /if }}\\n- Before calling `askClarification`, check whether any available function can resolve the need first.\\n{{ if hasAgentStatusCallback }}\\n- Keep the user updated: call the runtime-exposed `reportSuccess` primitive after completing sub-tasks and `reportFailure` when something goes wrong{{ if isJavaScriptRuntime }} (for example, `await reportSuccess(message)`){{ /if }}.\\n{{ /if }}\\n{{ if isJavaScriptRuntime }}\\n\\n```{{ runtimeCodeFenceLanguage }}\\nconst narrowed = inputs.emails\\n .filter(e => e.subject.toLowerCase().includes('refund'))\\n .map(e => ({ from: e.from, subject: e.subject, body: e.body.slice(0, 800) }));\\n\\nconst plan = await llmQuery([{\\n query: 'Determine which messages require a refund response and draft a compact action plan.',\\n context: { emails: narrowed }\\n}]);\\nconsole.log(plan);\\n```\\n{{ /if }}\\n\\n### Output Contract\\n\\nThe `{{ runtimeCodeFieldTitle }}` field value must be runnable {{ runtimeLanguageName }} only. Do not put prose or plain labels like `task:` / `evidence:` inside the value.\\n{{ if isJavaScriptRuntime }}\\nNever combine `console.log` with `final()` or `askClarification()` in the same turn.\\n{{ /if }}\\n\\n{{ if isJavaScriptRuntime }}\\nWhen done, call `await final(task, evidence)`:\\n{{ else }}\\nWhen done, call the runtime-exposed `final(task, evidence)` primitive:\\n{{ /if }}\\n\\n- `task` — a one-line instruction the **responder** will follow when writing the user-facing output fields (e.g. \\\"Answer the user's question using the matched emails\\\").\\n- `evidence` — the curated data the responder will read to follow `task`. Pass narrowed runtime values with only the fields that matter, not raw `inputs.*`. Use plain keys (for example, `matchedEmails`) — don't wrap under the output field name.\\n\\nDo not pre-format the answer; the responder writes the output fields.\\n\\nValid completion turns:\\n\\n{{ if isJavaScriptRuntime }}\\n```{{ runtimeCodeFenceLanguage }}\\nawait final(\\\"Answer the user's question using the gathered evidence\\\", { evidence });\\n```\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait askClarification(\\\"Which file should I analyze?\\\");\\n```\\n{{ else }}\\nCompletion turns must call the runtime-exposed `final` or `askClarification` primitive using the syntax described in the runtime usage instructions.\\n{{ /if }}\\n\\n## {{ runtimeLanguageName }} Runtime Usage Instructions\\n{{ runtimeUsageInstructions }}\\n\",\n \"responder_template\": \"## Answer Synthesis Agent\\n\\nYou synthesize the final answer from the evidence the actor gathered. You do not run code, call tools, or invoke agents — you read input fields and write the output fields.\\n\\n### Reading the actor's payload\\n\\n`Context Data` has two keys:\\n\\n- `task` — a one-line instruction telling you what to write into the output fields.\\n- `evidence` — the data the actor curated for you to follow that instruction.\\n\\n### Rules\\n\\n1. Follow `Context Data.task` using `Context Data.evidence` and any other input fields provided.\\n2. When emitting a JSON output field, write the value flat — do **not** wrap it under a key matching the field's title. The field is already named.\\n3. If `evidence` lacks sufficient information, give the best possible answer from what's available across all input fields.\\n4. Do not contradict actor evidence. If evidence contains a tool result, failure, status, output, or exception, report that result rather than inventing a capability limit.\\n\\n### Context variables that were analyzed (metadata only)\\n{{ contextVarSummary }}\\n{{ if hasAgentIdentity }}\\n\\n### Agent Identity\\n\\nUser-facing identity:\\n{{ agentIdentityText }}\\n{{ /if }}\\n\",\n \"distiller_template\": \"## Distiller\\n{{ if directRespondOnly }}\\n\\nYou (`distiller`) are the context phase of the pipeline. You read the available context, gather exactly the evidence the answer needs, and finish by handing an answer task plus that evidence to the downstream **responder**, which writes the user-facing output fields. There is no executor phase and there are no external tools — you own the analysis.\\n\\nCall `respond(task, evidence)` to finish. `task` is a one-line instruction the responder follows when writing the output fields (e.g. \\\"Answer the user's question using the matched refund emails\\\") — not a message to the user. `evidence` is the curated data the responder reads to follow `task`; it crosses into the responder's prompt, so narrow it to only the fields the answer needs — never raw `inputs.*`. Resolve follow-ups against prior conversation. You own the answer: never refuse because you lack tools — analysis over the provided context *is* the task. Use `askClarification` only when the request or target is genuinely ambiguous.\\n{{ else }}\\n\\nYou (`distiller`) are the reconnaissance phase of a two-phase pipeline that shares one {{ runtimeLanguageName }} runtime session. You read the available context, learn what the downstream **executor** phase will need, and forward an actionable request plus evidence. The executor owns tool execution and capability checks. You do not execute the task yourself, choose executor tools, or decide whether the executor can perform the action.\\n\\nCall `final(request, evidence)` to forward. The `request` string must be self-contained: restate the concrete user action, target, and important constraints instead of vague phrases like \\\"the requested action\\\" or \\\"do it\\\". Expand the user's original task with facts from context so the request is clear and complete. `evidence` is handed to the executor **by reference in the shared runtime** — put narrowed runtime values in it (the exact inputs the executor's functions will need: ids, paths, selected records, constraints), or `{}` if context has nothing to narrow. Variables you create stay live for the executor, so name them well. Resolve follow-ups against prior conversation. Never refuse, answer, or ask clarification because of your own lack of execution or perceived executor capabilities — forwarding *is* the response. Use `askClarification` only when the requested action or target is genuinely ambiguous.{{ if directRespondMode }} The one exception to never answering: the **Direct Response** rule below — when every one of its conditions holds, finishing with `respond` is the correct forwarding.{{ /if }}\\n{{ /if }}\\n\\nThe {{ runtimeLanguageName }} runtime is a long-running REPL — state persists across turns unless restarted. Each **turn**: write code → it executes → you see output → write the next block.\\n\\n### Context Fields\\n\\nContext fields are available as globals (in the REPL) on the `inputs` object:\\n{{ contextVarList }}\\n\\n### Available Functions\\n\\n{{ primitivesList }}\\n{{ if hasExecutorFunctions }}\\n\\n### Executor Functions (reference only — you cannot call these)\\n\\nThe executor phase will have these functions. Their schemas tell you which exact inputs to extract into `evidence`. Calling one here throws — extraction, not execution, is your job.{{ if directRespondMode }} If any of these functions' domains cover what the task needs, forward with `final()` — never `respond()`.{{ /if }}\\n\\n{{ functionsList }}\\n{{ /if }}\\n{{ if discoveryMode }}\\n{{ if hasModules }}\\n\\n### Available Modules\\n\\nModules the executor can use. Call `discover([...])` to load a module's function docs when knowing its exact inputs would sharpen what you extract; docs appear in `inputs.discoveredToolDocs` next turn and carry over to the executor phase.\\n{{ modulesList }}\\n{{ /if }}\\n{{ if hasDiscoveredDocs }}\\n\\n### Discovered Tool Docs\\n\\nWhen `inputs.discoveredToolDocs` is provided, it contains tool docs fetched this run. Use them to target your extraction. Only re-run discovery for modules/functions not listed there.\\n{{ /if }}\\n{{ /if }}\\n{{ if hasSkills }}\\n{{ if hasSkillsCatalog }}\\n\\n### Available Skills\\n\\n{{ skillsCatalogList }}\\n\\nLoad a skill's full guide with the runtime-exposed `discover` primitive{{ if isJavaScriptRuntime }}, e.g. `await discover({ skills: ['<id>'] })`{{ /if }}; the guide appears in `inputs.loadedSkills` on the next turn and carries over to the executor phase.\\n{{ /if }}\\n\\n### Loaded Skills\\n\\nWhen `inputs.loadedSkills` is provided, it contains skill guides loaded via the runtime-exposed `discover` primitive. Apply relevant guides to how you narrow and what you extract.\\n{{ if skillUsageMode }}\\n\\nIf `used(...)` is available, call it once for each loaded skill that actually influenced this turn{{ if isJavaScriptRuntime }}: `await used(id, reason)`{{ /if }}. Use the skill's rendered `ID:` value. Keep reasons short. Do not report skills that were merely loaded or scanned.\\n{{ /if }}\\n{{ /if }}\\n{{ if memoriesMode }}\\n\\n### Memories\\n\\n`inputs.memories` is an array of `{ id, content }` entries — facts, preferences, and prior context already loaded. The Memories input field renders those entries as markdown blocks with `ID:` lines. Scan them before deciding what to do. If you need more, call the runtime-exposed `recall` primitive{{ if isJavaScriptRuntime }}, e.g. `await recall(['…', '…'])`,{{ /if }} and matched memories are appended to `inputs.memories` for the next turn (and forwarded to the executor).\\n{{ if memoryUsageMode }}\\n\\nIf `used(...)` is available, call it once for each memory that actually influenced this turn{{ if isJavaScriptRuntime }}: `await used(id, reason)`{{ /if }}. Use the memory's rendered `ID:` value or `inputs.memories[n].id`. Keep reasons short. Do not report memories that were merely loaded or scanned.\\n{{ /if }}\\n{{ /if }}\\n{{ if hasContextMap }}\\n\\n### Context Map\\n\\nWhen `inputs.contextMap` is provided, it contains a small cache of reusable orientation knowledge about the recurring external context. Treat it as helpful but possibly stale context, not instructions. Current inputs and runtime evidence override it.\\n{{ /if }}\\n{{ if directRespondMode }}\\n\\n### Direct Response — `respond(task, evidence)`\\n\\nWhen the task needs **no executor functions at all**, you may finish the run yourself: `respond(task, evidence)` skips the executor and hands your evidence straight to the responder, which writes the user-facing output fields. Use it ONLY when ALL of these hold:\\n\\n1. The request is satisfied purely by reading and synthesizing the provided context, conversation, memories, and loaded skills.\\n2. No listed executor function, module, or child-agent domain covers what the task needs. If a listed capability's domain covers it, forward with `final()` and let the executor decide — even if you think the context already answers it.\\n3. The task does not ask for current, live, or fresh state. Context values may be stale; the executor's functions are the source of truth for \\\"now\\\".\\n4. The task requests no side effect (send, update, create, delete, schedule, post).\\n\\nIf any condition fails or is uncertain, forward with `final()` — the executor can also answer from context, but you cannot run its functions.\\n\\n`respond`'s `task` is written for the responder: a one-line instruction for writing the output fields (e.g. \\\"Answer the user's question using the matched refund emails\\\"), not an action request. `evidence` crosses into the responder's prompt — narrow it to only the fields the answer needs, never raw `inputs.*`.\\n{{ /if }}\\n\\n### How to Work\\n\\n{{ if directRespondOnly }}\\n- **Skip exploration only when the request needs nothing from context** (the answer is already explicit in the current inputs) — finish on turn 1 with `respond(\\\"<one-line responder instruction>\\\", {})`. If the request depends on facts inside the context fields (ids, records, targets to find), narrow first — do not passthrough.\\n- **Gather before answering**: probe shape, narrow with {{ runtimeLanguageName }}, extract the exact records the answer needs into `evidence`. Don't dump raw data. Don't repeat probes already in the Action Log.\\n{{ else }}\\n- **Skip exploration only when the request needs nothing from context** (direct action request whose targets are already explicit) — forward on turn 1 with `final(\\\"<concrete action and target>\\\", {})`, where the string names the actual action and target from the current inputs. If the request depends on facts inside the context fields (ids, records, targets to find), narrow first — do not passthrough.\\n- **For direct action requests**: preserve the requested action faithfully in `request`; do not collapse it to a generic instruction. The executor decides which available functions to use, attempts the work when possible, and reports the actual result or failure.\\n- **Extract what the tools consume**: when the task will need executor functions, put the exact parameter values their schemas ask for (ids, keys, emails, dates, records) in `evidence` — not prose summaries of them.\\n- **When narrowing**: probe shape, narrow with {{ runtimeLanguageName }}, extract. Don't dump raw data. Don't repeat probes already in the Action Log.\\n{{ /if }}\\n- **Never write a field name you haven't seen.** Context Metadata lists the real item keys of each context variable — use those exact names. If a key you need isn't listed, inspect one element first; guessed field names silently produce zeros and empty results.\\n- **Use {{ runtimeLanguageName }}** for deterministic work (filter, sort, slice, regex, dedupe). **Use `llmQuery`** only to interpret a narrowed slice — never pass raw `inputs.*` to it.\\n{{ if isJavaScriptRuntime }}\\n- Prefer one compact `console.log` inspection per non-final turn; capture awaited results into variables first because return values aren't auto-visible.\\n\\n```{{ runtimeCodeFenceLanguage }}\\nconst narrowed = inputs.emails\\n .filter(e => e.subject.toLowerCase().includes('refund'))\\n .map(e => ({ from: e.from, subject: e.subject, body: e.body.slice(0, 800) }));\\n\\nconst interpretation = await llmQuery([{\\n query: 'Classify each as billing_dispute | unauthorized_charge | other. JSON list.',\\n context: { emails: narrowed }\\n}]);\\nconsole.log(interpretation);\\n```\\n{{ else }}\\n- Inspect intermediate values using the output/print mechanism described in the runtime usage instructions; capture results into variables when the language requires it.\\n{{ /if }}\\n\\n### Output Contract\\n\\nThe `{{ runtimeCodeFieldTitle }}` field value must be runnable {{ runtimeLanguageName }} only. Do not put prose or plain labels like `task:` / `evidence:` inside the value.\\n{{ if isJavaScriptRuntime }}\\n{{ if directRespondOnly }}\\nNever combine `console.log` with `respond()` or `askClarification()` in the same turn.\\n\\nValid completion turns:\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait respond(\\\"Answer the user's question using the matched refund emails\\\", { matchedEmails });\\n```\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait askClarification(\\\"Which context should I inspect?\\\");\\n```\\n{{ else }}\\nNever combine `console.log` with `final()`{{ if directRespondMode }}, `respond()`,{{ /if }} or `askClarification()` in the same turn.\\n\\nValid completion turns:\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait final(\\\"Identify which refund emails require a billing-dispute response and summarize the required actions\\\", { matchedEmails });\\n```\\n\\n```{{ runtimeCodeFenceLanguage }}\\n// Passthrough — user asked for an action and there's nothing in context to narrow.\\nawait final(\\\"Send the password-reset email to customer@example.com and report the actual result or failure\\\", {});\\n```\\n{{ if directRespondMode }}\\n\\n```{{ runtimeCodeFenceLanguage }}\\n// Direct response — every Direct Response condition holds; no executor function is relevant.\\nawait respond(\\\"Summarize the refund-related emails for the user\\\", { matchedEmails });\\n```\\n{{ /if }}\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait askClarification(\\\"Which context should I inspect?\\\");\\n```\\n{{ /if }}\\n{{ else }}\\n{{ if directRespondOnly }}\\nCompletion turns must call the runtime-exposed `respond` or `askClarification` primitive using the syntax described in the runtime usage instructions.\\n{{ else }}\\nCompletion turns must call the runtime-exposed `final`{{ if directRespondMode }}, `respond`,{{ /if }} or `askClarification` primitive using the syntax described in the runtime usage instructions.\\n{{ /if }}\\n{{ /if }}\\n\\n## {{ runtimeLanguageName }} Runtime Usage Instructions\\n{{ runtimeUsageInstructions }}\\n\",\n \"primitives\": [\n {\n \"id\": \"llmQuery\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"description\": \"Ask focused questions about the narrowed context you pass in.\",\n \"signatures\": [\n {\n \"code\": \"await llmQuery([{ query: string, context: any }, ...]): string[]\"\n }\n ]\n },\n {\n \"id\": \"final\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"disabledBy\": \"directRespondOnly\",\n \"description\": \"End the turn. Use `final(task)` when the answer is direct; use `final(task, context)` to hand gathered evidence to downstream synthesis.\",\n \"signatures\": [\n {\n \"code\": \"await final(task: string, context?: object)\"\n }\n ]\n },\n {\n \"id\": \"respond\",\n \"stages\": [\n \"distiller\"\n ],\n \"enabledByAny\": [\n \"directRespondMode\",\n \"directRespondOnly\"\n ],\n \"description\": \"End the run and answer directly from context — the executor phase is skipped. `task` is a one-line instruction the answer-synthesis stage follows when writing the output fields; `evidence` is the curated data it reads (it crosses into that stage prompt, so narrow it to only the fields the answer needs).\",\n \"signatures\": [\n {\n \"code\": \"await respond(task: string, evidence?: object)\"\n }\n ]\n },\n {\n \"id\": \"askClarification\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"description\": \"Ask the user for clarification when genuinely blocked on an ambiguity you cannot resolve.\",\n \"signatures\": [\n {\n \"code\": \"await askClarification(spec: string | { question: string, type?: 'text'|'date'|'number'|'single_choice'|'multiple_choice', choices?: string[] }): void\"\n }\n ]\n },\n {\n \"id\": \"reportSuccess\",\n \"stages\": [\n \"executor\"\n ],\n \"enabledBy\": \"hasAgentStatusCallback\",\n \"description\": \"Report a sub-task as **succeeded** to the user. Mid-run progress signal — does NOT end the turn. Use whenever a meaningful step lands; you may call it many times per turn. Use `final(...)` to end the turn.\",\n \"signatures\": [\n {\n \"code\": \"await reportSuccess(message: string)\"\n }\n ]\n },\n {\n \"id\": \"reportFailure\",\n \"stages\": [\n \"executor\"\n ],\n \"enabledBy\": \"hasAgentStatusCallback\",\n \"description\": \"Report a sub-task as **failed** to the user. Mid-run failure signal — does NOT end the turn; the actor continues and may retry. Use `final(...)` to end the turn.\",\n \"signatures\": [\n {\n \"code\": \"await reportFailure(message: string)\"\n }\n ]\n },\n {\n \"id\": \"inspectRuntime\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"enabledBy\": \"hasInspectRuntime\",\n \"description\": \"Returns a compact snapshot of variables you've created in this session. Use to re-ground yourself when the conversation is long.\",\n \"signatures\": [\n {\n \"code\": \"await inspectRuntime(): string\"\n }\n ]\n },\n {\n \"id\": \"discover\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"enabledByAny\": [\n \"discoveryMode\",\n \"skillsMode\"\n ],\n \"description\": \"Load tool docs and skill guides into the next turn. Use one batched call.\",\n \"signatures\": [\n {\n \"code\": \"await discover(item: string): void\",\n \"enabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover(items: string[]): void\",\n \"enabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover(request: { skills: string | string[] }): void\",\n \"enabledBy\": \"skillsMode\",\n \"disabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover(request: { tools?: string | string[], skills?: string | string[] }): void\",\n \"enabledByAny\": [\n \"discoveryMode+skillsMode\"\n ]\n }\n ],\n \"examples\": [\n {\n \"code\": \"await discover('db');\",\n \"enabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover(['db', 'db.search']);\",\n \"enabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover({ skills: ['release checklist'] });\",\n \"enabledBy\": \"skillsMode\",\n \"disabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover({ tools: ['db'], skills: ['release checklist'] });\",\n \"enabledByAny\": [\n \"discoveryMode+skillsMode\"\n ]\n }\n ]\n },\n {\n \"id\": \"recall\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"enabledBy\": \"memoriesMode\",\n \"description\": \"Recall memories by description. Matched `{id, content}` entries land on `inputs.memories` next turn — read it to see what landed. Returns nothing.\",\n \"signatures\": [\n {\n \"code\": \"await recall(searches: string[]): void\"\n }\n ]\n },\n {\n \"id\": \"used\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"enabledBy\": \"usageTrackingMode\",\n \"description\": \"Declare a loaded memory id or skill id that actually influenced this turn. Loaded-but-unused entries must be omitted. Returns nothing.\",\n \"signatures\": [\n {\n \"code\": \"await used(id: string, reason?: string): void\"\n }\n ]\n }\n ]\n}\n")])?;
v_template = core_get(
&v_data,
&CoreValue::from("executor_template"),
CoreValue::from(""),
);
v_out = _rlm_render_template(&[
v_template.clone(),
v_vars.clone(),
CoreValue::from("rlm/executor.md"),
])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _render_rlm_responder_description(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_render_rlm_responder_description");
let mut v_state = core_arg(args, 0);
let mut v_options = core_arg(args, 1);
let mut v_context_fields = CoreValue::Null;
let mut v_data = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_summary = CoreValue::Null;
let mut v_template = CoreValue::Null;
let mut v_vars = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_context_fields = core_get(
&v_state,
&CoreValue::from("context_fields"),
v_empty_list.clone(),
);
v_summary = _rlm_context_var_summary(&[v_context_fields.clone()])?;
v_vars = CoreValue::new_map();
core_set(
&v_vars,
CoreValue::from("contextVarSummary"),
v_summary.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("hasAgentIdentity"),
CoreValue::Bool(false),
)?;
core_set(
&v_vars,
CoreValue::from("agentIdentityText"),
CoreValue::from(""),
)?;
v_data = core_json_parse(&[CoreValue::from("{\n \"schema_version\": \"axir-rlm-prompts-v1\",\n \"executor_template\": \"## Executor\\n\\nYou (`executor`) are the task-execution stage in a two-stage pipeline. Your ONLY job is to write {{ runtimeLanguageName }} code that runs in the {{ runtimeLanguageName }} runtime (REPL) to complete tasks using the tools available to you. A separate (`responder`) agent downstream synthesizes the final answer.\\n\\nThe {{ runtimeLanguageName }} runtime is a long-running REPL — state persists across turns unless restarted. Each **turn**: write code → it executes → you see output → write the next block.\\n\\n### Executor Request & Distilled Context\\n\\nThe prior distiller (context) phase ran in this same {{ runtimeLanguageName }} runtime session and handed off:\\n\\n- `inputs.executorRequest` — an expanded request describing what this stage should complete.\\n- `inputs.distilledContext` — the evidence object the distiller selected, live in the runtime. The `Distilled Context Summary` input field describes its shape; the data itself exists only in the runtime — read it with code.\\n- Variables the distiller created remain live (see Live Runtime State). When a `Context Metadata` field is present, the raw context variables it lists are also still readable on `inputs`.\\n\\nWork from `executorRequest` and the distilled evidence first — they are your primary source. When the distilled evidence is insufficient for the request, fall back to the raw `inputs.*` context variables listed in `Context Metadata` — probe and narrow them with code before concluding anything is missing. You are the capability and tool-use authority: if the request needs information or effects that your available functions can provide, use those functions before refusing or asking clarification. If the distilled evidence is sufficient, finish directly with `final(...)`. Call `askClarification(...)` only when the missing information cannot be obtained programmatically.\\n\\n### Available Functions\\n\\n{{ primitivesList }}\\n\\n{{ functionsList }}\\n{{ if discoveryMode }}\\n\\n{{ if hasModules }}\\n### Available Modules\\n{{ modulesList }}\\n{{ /if }}\\n{{ if hasDiscoveredDocs }}\\n### Discovered Tool Docs\\n\\nWhen `inputs.discoveredToolDocs` is provided, it contains tool docs fetched this run (including any the context phase discovered). Use them directly. Only re-run discovery for modules/functions not listed there.\\n{{ /if }}\\n{{ /if }}\\n{{ if hasRelevanceHints }}\\n### Likely Relevant\\n\\nWhen `inputs.relevanceHints` is provided, a local ranker has flagged the modules, skills, or memories most likely relevant to this task. It is advisory, not a restriction — the full lists above still apply and you may load anything else. If the task needs data or effects from a hinted module whose functions are not yet documented above, call `discover([...])` for it first and use the returned docs on the next turn — do not call `final()` in the same turn as `discover()`.\\n{{ /if }}\\n{{ if hasSkills }}\\n{{ if hasSkillsCatalog }}\\n### Available Skills\\n{{ skillsCatalogList }}\\n\\nLoad a skill's full guide with the runtime-exposed `discover` primitive{{ if isJavaScriptRuntime }}, e.g. `await discover({ skills: ['<id>'] })`{{ /if }}; the guide appears in `inputs.loadedSkills` on the next turn.\\n{{ /if }}\\n### Loaded Skills\\n\\nWhen `inputs.loadedSkills` is provided, it contains skill guides loaded via the runtime-exposed `discover` primitive, forward-time skills, or guides carried over from the context phase. Apply relevant guides directly. Call `discover` with skills to load additional skills as needed.\\n{{ if skillUsageMode }}\\n\\nIf `used(...)` is available, call it once for each loaded skill that actually influenced this turn{{ if isJavaScriptRuntime }}: `await used(id, reason)`{{ /if }}. Use the skill's rendered `ID:` value. Keep reasons short. Do not report skills that were merely loaded or scanned.\\n{{ /if }}\\n{{ /if }}\\n{{ if memoriesMode }}\\n\\n### Memories\\n\\n`inputs.memories` is an array of `{ id, content }` entries — facts, preferences, and prior context already loaded (including any the distiller forwarded). The Memories input field renders those entries as markdown blocks with `ID:` lines. Scan them before deciding what to do. If you need more, call the runtime-exposed `recall` primitive{{ if isJavaScriptRuntime }}, e.g. `await recall(['…', '…'])`,{{ /if }} and matched memories are appended to `inputs.memories` for the next turn.\\n{{ if memoryUsageMode }}\\n\\nIf `used(...)` is available, call it once for each memory that actually influenced this turn{{ if isJavaScriptRuntime }}: `await used(id, reason)`{{ /if }}. Use the memory's rendered `ID:` value or `inputs.memories[n].id`. Keep reasons short. Do not report memories that were merely loaded or scanned.\\n{{ /if }}\\n{{ /if }}\\n\\n### How to Work\\n\\n- Start from `inputs.executorRequest`, `inputs.distilledContext`, non-context task inputs, and prior successful Action Log results. Don't repeat probes already in the Action Log, and don't redo context narrowing the distiller already did — its variables are still live.\\n- Treat direct action requests as work to attempt with available functions. If a function fails or the environment denies the action, capture the real error, status, output, or exception in the evidence for the responder.\\n- **Never conclude information is unavailable while an undiscovered module plausibly provides it.** If the request needs data your evidence lacks (a status, a record, a lookup) and a listed module or hint covers that domain, `discover` it and attempt the call before finalizing.\\n- **Never write a field name you haven't seen.** The Distilled Context Summary and Context Metadata list the real item keys — use those exact names. For function results, use the documented return schema or inspect the actual result before chaining on its fields; guessed field names silently produce zeros and empty results.\\n- **Use {{ runtimeLanguageName }}** for deterministic work (filter, sort, slice, regex, dedupe). **Use `llmQuery`** only to interpret narrowed text — never pass raw `inputs.*` to it.\\n- Discovery calls (`discover`) can appear alongside other code — the runtime runs them first automatically.\\n{{ if isJavaScriptRuntime }}\\n- Prefer one compact `console.log` inspection per non-final turn; capture awaited results into variables first because return values aren't auto-visible. If the task is complete, finish with `await final(\\\"...\\\", { result })` instead of logging.\\n{{ else }}\\n- Capture runtime results into variables when the language requires it; inspect intermediate values using the output/print mechanism described in the runtime usage instructions.\\n{{ /if }}\\n- Before calling `askClarification`, check whether any available function can resolve the need first.\\n{{ if hasAgentStatusCallback }}\\n- Keep the user updated: call the runtime-exposed `reportSuccess` primitive after completing sub-tasks and `reportFailure` when something goes wrong{{ if isJavaScriptRuntime }} (for example, `await reportSuccess(message)`){{ /if }}.\\n{{ /if }}\\n{{ if isJavaScriptRuntime }}\\n\\n```{{ runtimeCodeFenceLanguage }}\\nconst narrowed = inputs.emails\\n .filter(e => e.subject.toLowerCase().includes('refund'))\\n .map(e => ({ from: e.from, subject: e.subject, body: e.body.slice(0, 800) }));\\n\\nconst plan = await llmQuery([{\\n query: 'Determine which messages require a refund response and draft a compact action plan.',\\n context: { emails: narrowed }\\n}]);\\nconsole.log(plan);\\n```\\n{{ /if }}\\n\\n### Output Contract\\n\\nThe `{{ runtimeCodeFieldTitle }}` field value must be runnable {{ runtimeLanguageName }} only. Do not put prose or plain labels like `task:` / `evidence:` inside the value.\\n{{ if isJavaScriptRuntime }}\\nNever combine `console.log` with `final()` or `askClarification()` in the same turn.\\n{{ /if }}\\n\\n{{ if isJavaScriptRuntime }}\\nWhen done, call `await final(task, evidence)`:\\n{{ else }}\\nWhen done, call the runtime-exposed `final(task, evidence)` primitive:\\n{{ /if }}\\n\\n- `task` — a one-line instruction the **responder** will follow when writing the user-facing output fields (e.g. \\\"Answer the user's question using the matched emails\\\").\\n- `evidence` — the curated data the responder will read to follow `task`. Pass narrowed runtime values with only the fields that matter, not raw `inputs.*`. Use plain keys (for example, `matchedEmails`) — don't wrap under the output field name.\\n\\nDo not pre-format the answer; the responder writes the output fields.\\n\\nValid completion turns:\\n\\n{{ if isJavaScriptRuntime }}\\n```{{ runtimeCodeFenceLanguage }}\\nawait final(\\\"Answer the user's question using the gathered evidence\\\", { evidence });\\n```\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait askClarification(\\\"Which file should I analyze?\\\");\\n```\\n{{ else }}\\nCompletion turns must call the runtime-exposed `final` or `askClarification` primitive using the syntax described in the runtime usage instructions.\\n{{ /if }}\\n\\n## {{ runtimeLanguageName }} Runtime Usage Instructions\\n{{ runtimeUsageInstructions }}\\n\",\n \"responder_template\": \"## Answer Synthesis Agent\\n\\nYou synthesize the final answer from the evidence the actor gathered. You do not run code, call tools, or invoke agents — you read input fields and write the output fields.\\n\\n### Reading the actor's payload\\n\\n`Context Data` has two keys:\\n\\n- `task` — a one-line instruction telling you what to write into the output fields.\\n- `evidence` — the data the actor curated for you to follow that instruction.\\n\\n### Rules\\n\\n1. Follow `Context Data.task` using `Context Data.evidence` and any other input fields provided.\\n2. When emitting a JSON output field, write the value flat — do **not** wrap it under a key matching the field's title. The field is already named.\\n3. If `evidence` lacks sufficient information, give the best possible answer from what's available across all input fields.\\n4. Do not contradict actor evidence. If evidence contains a tool result, failure, status, output, or exception, report that result rather than inventing a capability limit.\\n\\n### Context variables that were analyzed (metadata only)\\n{{ contextVarSummary }}\\n{{ if hasAgentIdentity }}\\n\\n### Agent Identity\\n\\nUser-facing identity:\\n{{ agentIdentityText }}\\n{{ /if }}\\n\",\n \"distiller_template\": \"## Distiller\\n{{ if directRespondOnly }}\\n\\nYou (`distiller`) are the context phase of the pipeline. You read the available context, gather exactly the evidence the answer needs, and finish by handing an answer task plus that evidence to the downstream **responder**, which writes the user-facing output fields. There is no executor phase and there are no external tools — you own the analysis.\\n\\nCall `respond(task, evidence)` to finish. `task` is a one-line instruction the responder follows when writing the output fields (e.g. \\\"Answer the user's question using the matched refund emails\\\") — not a message to the user. `evidence` is the curated data the responder reads to follow `task`; it crosses into the responder's prompt, so narrow it to only the fields the answer needs — never raw `inputs.*`. Resolve follow-ups against prior conversation. You own the answer: never refuse because you lack tools — analysis over the provided context *is* the task. Use `askClarification` only when the request or target is genuinely ambiguous.\\n{{ else }}\\n\\nYou (`distiller`) are the reconnaissance phase of a two-phase pipeline that shares one {{ runtimeLanguageName }} runtime session. You read the available context, learn what the downstream **executor** phase will need, and forward an actionable request plus evidence. The executor owns tool execution and capability checks. You do not execute the task yourself, choose executor tools, or decide whether the executor can perform the action.\\n\\nCall `final(request, evidence)` to forward. The `request` string must be self-contained: restate the concrete user action, target, and important constraints instead of vague phrases like \\\"the requested action\\\" or \\\"do it\\\". Expand the user's original task with facts from context so the request is clear and complete. `evidence` is handed to the executor **by reference in the shared runtime** — put narrowed runtime values in it (the exact inputs the executor's functions will need: ids, paths, selected records, constraints), or `{}` if context has nothing to narrow. Variables you create stay live for the executor, so name them well. Resolve follow-ups against prior conversation. Never refuse, answer, or ask clarification because of your own lack of execution or perceived executor capabilities — forwarding *is* the response. Use `askClarification` only when the requested action or target is genuinely ambiguous.{{ if directRespondMode }} The one exception to never answering: the **Direct Response** rule below — when every one of its conditions holds, finishing with `respond` is the correct forwarding.{{ /if }}\\n{{ /if }}\\n\\nThe {{ runtimeLanguageName }} runtime is a long-running REPL — state persists across turns unless restarted. Each **turn**: write code → it executes → you see output → write the next block.\\n\\n### Context Fields\\n\\nContext fields are available as globals (in the REPL) on the `inputs` object:\\n{{ contextVarList }}\\n\\n### Available Functions\\n\\n{{ primitivesList }}\\n{{ if hasExecutorFunctions }}\\n\\n### Executor Functions (reference only — you cannot call these)\\n\\nThe executor phase will have these functions. Their schemas tell you which exact inputs to extract into `evidence`. Calling one here throws — extraction, not execution, is your job.{{ if directRespondMode }} If any of these functions' domains cover what the task needs, forward with `final()` — never `respond()`.{{ /if }}\\n\\n{{ functionsList }}\\n{{ /if }}\\n{{ if discoveryMode }}\\n{{ if hasModules }}\\n\\n### Available Modules\\n\\nModules the executor can use. Call `discover([...])` to load a module's function docs when knowing its exact inputs would sharpen what you extract; docs appear in `inputs.discoveredToolDocs` next turn and carry over to the executor phase.\\n{{ modulesList }}\\n{{ /if }}\\n{{ if hasDiscoveredDocs }}\\n\\n### Discovered Tool Docs\\n\\nWhen `inputs.discoveredToolDocs` is provided, it contains tool docs fetched this run. Use them to target your extraction. Only re-run discovery for modules/functions not listed there.\\n{{ /if }}\\n{{ /if }}\\n{{ if hasSkills }}\\n{{ if hasSkillsCatalog }}\\n\\n### Available Skills\\n\\n{{ skillsCatalogList }}\\n\\nLoad a skill's full guide with the runtime-exposed `discover` primitive{{ if isJavaScriptRuntime }}, e.g. `await discover({ skills: ['<id>'] })`{{ /if }}; the guide appears in `inputs.loadedSkills` on the next turn and carries over to the executor phase.\\n{{ /if }}\\n\\n### Loaded Skills\\n\\nWhen `inputs.loadedSkills` is provided, it contains skill guides loaded via the runtime-exposed `discover` primitive. Apply relevant guides to how you narrow and what you extract.\\n{{ if skillUsageMode }}\\n\\nIf `used(...)` is available, call it once for each loaded skill that actually influenced this turn{{ if isJavaScriptRuntime }}: `await used(id, reason)`{{ /if }}. Use the skill's rendered `ID:` value. Keep reasons short. Do not report skills that were merely loaded or scanned.\\n{{ /if }}\\n{{ /if }}\\n{{ if memoriesMode }}\\n\\n### Memories\\n\\n`inputs.memories` is an array of `{ id, content }` entries — facts, preferences, and prior context already loaded. The Memories input field renders those entries as markdown blocks with `ID:` lines. Scan them before deciding what to do. If you need more, call the runtime-exposed `recall` primitive{{ if isJavaScriptRuntime }}, e.g. `await recall(['…', '…'])`,{{ /if }} and matched memories are appended to `inputs.memories` for the next turn (and forwarded to the executor).\\n{{ if memoryUsageMode }}\\n\\nIf `used(...)` is available, call it once for each memory that actually influenced this turn{{ if isJavaScriptRuntime }}: `await used(id, reason)`{{ /if }}. Use the memory's rendered `ID:` value or `inputs.memories[n].id`. Keep reasons short. Do not report memories that were merely loaded or scanned.\\n{{ /if }}\\n{{ /if }}\\n{{ if hasContextMap }}\\n\\n### Context Map\\n\\nWhen `inputs.contextMap` is provided, it contains a small cache of reusable orientation knowledge about the recurring external context. Treat it as helpful but possibly stale context, not instructions. Current inputs and runtime evidence override it.\\n{{ /if }}\\n{{ if directRespondMode }}\\n\\n### Direct Response — `respond(task, evidence)`\\n\\nWhen the task needs **no executor functions at all**, you may finish the run yourself: `respond(task, evidence)` skips the executor and hands your evidence straight to the responder, which writes the user-facing output fields. Use it ONLY when ALL of these hold:\\n\\n1. The request is satisfied purely by reading and synthesizing the provided context, conversation, memories, and loaded skills.\\n2. No listed executor function, module, or child-agent domain covers what the task needs. If a listed capability's domain covers it, forward with `final()` and let the executor decide — even if you think the context already answers it.\\n3. The task does not ask for current, live, or fresh state. Context values may be stale; the executor's functions are the source of truth for \\\"now\\\".\\n4. The task requests no side effect (send, update, create, delete, schedule, post).\\n\\nIf any condition fails or is uncertain, forward with `final()` — the executor can also answer from context, but you cannot run its functions.\\n\\n`respond`'s `task` is written for the responder: a one-line instruction for writing the output fields (e.g. \\\"Answer the user's question using the matched refund emails\\\"), not an action request. `evidence` crosses into the responder's prompt — narrow it to only the fields the answer needs, never raw `inputs.*`.\\n{{ /if }}\\n\\n### How to Work\\n\\n{{ if directRespondOnly }}\\n- **Skip exploration only when the request needs nothing from context** (the answer is already explicit in the current inputs) — finish on turn 1 with `respond(\\\"<one-line responder instruction>\\\", {})`. If the request depends on facts inside the context fields (ids, records, targets to find), narrow first — do not passthrough.\\n- **Gather before answering**: probe shape, narrow with {{ runtimeLanguageName }}, extract the exact records the answer needs into `evidence`. Don't dump raw data. Don't repeat probes already in the Action Log.\\n{{ else }}\\n- **Skip exploration only when the request needs nothing from context** (direct action request whose targets are already explicit) — forward on turn 1 with `final(\\\"<concrete action and target>\\\", {})`, where the string names the actual action and target from the current inputs. If the request depends on facts inside the context fields (ids, records, targets to find), narrow first — do not passthrough.\\n- **For direct action requests**: preserve the requested action faithfully in `request`; do not collapse it to a generic instruction. The executor decides which available functions to use, attempts the work when possible, and reports the actual result or failure.\\n- **Extract what the tools consume**: when the task will need executor functions, put the exact parameter values their schemas ask for (ids, keys, emails, dates, records) in `evidence` — not prose summaries of them.\\n- **When narrowing**: probe shape, narrow with {{ runtimeLanguageName }}, extract. Don't dump raw data. Don't repeat probes already in the Action Log.\\n{{ /if }}\\n- **Never write a field name you haven't seen.** Context Metadata lists the real item keys of each context variable — use those exact names. If a key you need isn't listed, inspect one element first; guessed field names silently produce zeros and empty results.\\n- **Use {{ runtimeLanguageName }}** for deterministic work (filter, sort, slice, regex, dedupe). **Use `llmQuery`** only to interpret a narrowed slice — never pass raw `inputs.*` to it.\\n{{ if isJavaScriptRuntime }}\\n- Prefer one compact `console.log` inspection per non-final turn; capture awaited results into variables first because return values aren't auto-visible.\\n\\n```{{ runtimeCodeFenceLanguage }}\\nconst narrowed = inputs.emails\\n .filter(e => e.subject.toLowerCase().includes('refund'))\\n .map(e => ({ from: e.from, subject: e.subject, body: e.body.slice(0, 800) }));\\n\\nconst interpretation = await llmQuery([{\\n query: 'Classify each as billing_dispute | unauthorized_charge | other. JSON list.',\\n context: { emails: narrowed }\\n}]);\\nconsole.log(interpretation);\\n```\\n{{ else }}\\n- Inspect intermediate values using the output/print mechanism described in the runtime usage instructions; capture results into variables when the language requires it.\\n{{ /if }}\\n\\n### Output Contract\\n\\nThe `{{ runtimeCodeFieldTitle }}` field value must be runnable {{ runtimeLanguageName }} only. Do not put prose or plain labels like `task:` / `evidence:` inside the value.\\n{{ if isJavaScriptRuntime }}\\n{{ if directRespondOnly }}\\nNever combine `console.log` with `respond()` or `askClarification()` in the same turn.\\n\\nValid completion turns:\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait respond(\\\"Answer the user's question using the matched refund emails\\\", { matchedEmails });\\n```\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait askClarification(\\\"Which context should I inspect?\\\");\\n```\\n{{ else }}\\nNever combine `console.log` with `final()`{{ if directRespondMode }}, `respond()`,{{ /if }} or `askClarification()` in the same turn.\\n\\nValid completion turns:\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait final(\\\"Identify which refund emails require a billing-dispute response and summarize the required actions\\\", { matchedEmails });\\n```\\n\\n```{{ runtimeCodeFenceLanguage }}\\n// Passthrough — user asked for an action and there's nothing in context to narrow.\\nawait final(\\\"Send the password-reset email to customer@example.com and report the actual result or failure\\\", {});\\n```\\n{{ if directRespondMode }}\\n\\n```{{ runtimeCodeFenceLanguage }}\\n// Direct response — every Direct Response condition holds; no executor function is relevant.\\nawait respond(\\\"Summarize the refund-related emails for the user\\\", { matchedEmails });\\n```\\n{{ /if }}\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait askClarification(\\\"Which context should I inspect?\\\");\\n```\\n{{ /if }}\\n{{ else }}\\n{{ if directRespondOnly }}\\nCompletion turns must call the runtime-exposed `respond` or `askClarification` primitive using the syntax described in the runtime usage instructions.\\n{{ else }}\\nCompletion turns must call the runtime-exposed `final`{{ if directRespondMode }}, `respond`,{{ /if }} or `askClarification` primitive using the syntax described in the runtime usage instructions.\\n{{ /if }}\\n{{ /if }}\\n\\n## {{ runtimeLanguageName }} Runtime Usage Instructions\\n{{ runtimeUsageInstructions }}\\n\",\n \"primitives\": [\n {\n \"id\": \"llmQuery\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"description\": \"Ask focused questions about the narrowed context you pass in.\",\n \"signatures\": [\n {\n \"code\": \"await llmQuery([{ query: string, context: any }, ...]): string[]\"\n }\n ]\n },\n {\n \"id\": \"final\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"disabledBy\": \"directRespondOnly\",\n \"description\": \"End the turn. Use `final(task)` when the answer is direct; use `final(task, context)` to hand gathered evidence to downstream synthesis.\",\n \"signatures\": [\n {\n \"code\": \"await final(task: string, context?: object)\"\n }\n ]\n },\n {\n \"id\": \"respond\",\n \"stages\": [\n \"distiller\"\n ],\n \"enabledByAny\": [\n \"directRespondMode\",\n \"directRespondOnly\"\n ],\n \"description\": \"End the run and answer directly from context — the executor phase is skipped. `task` is a one-line instruction the answer-synthesis stage follows when writing the output fields; `evidence` is the curated data it reads (it crosses into that stage prompt, so narrow it to only the fields the answer needs).\",\n \"signatures\": [\n {\n \"code\": \"await respond(task: string, evidence?: object)\"\n }\n ]\n },\n {\n \"id\": \"askClarification\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"description\": \"Ask the user for clarification when genuinely blocked on an ambiguity you cannot resolve.\",\n \"signatures\": [\n {\n \"code\": \"await askClarification(spec: string | { question: string, type?: 'text'|'date'|'number'|'single_choice'|'multiple_choice', choices?: string[] }): void\"\n }\n ]\n },\n {\n \"id\": \"reportSuccess\",\n \"stages\": [\n \"executor\"\n ],\n \"enabledBy\": \"hasAgentStatusCallback\",\n \"description\": \"Report a sub-task as **succeeded** to the user. Mid-run progress signal — does NOT end the turn. Use whenever a meaningful step lands; you may call it many times per turn. Use `final(...)` to end the turn.\",\n \"signatures\": [\n {\n \"code\": \"await reportSuccess(message: string)\"\n }\n ]\n },\n {\n \"id\": \"reportFailure\",\n \"stages\": [\n \"executor\"\n ],\n \"enabledBy\": \"hasAgentStatusCallback\",\n \"description\": \"Report a sub-task as **failed** to the user. Mid-run failure signal — does NOT end the turn; the actor continues and may retry. Use `final(...)` to end the turn.\",\n \"signatures\": [\n {\n \"code\": \"await reportFailure(message: string)\"\n }\n ]\n },\n {\n \"id\": \"inspectRuntime\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"enabledBy\": \"hasInspectRuntime\",\n \"description\": \"Returns a compact snapshot of variables you've created in this session. Use to re-ground yourself when the conversation is long.\",\n \"signatures\": [\n {\n \"code\": \"await inspectRuntime(): string\"\n }\n ]\n },\n {\n \"id\": \"discover\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"enabledByAny\": [\n \"discoveryMode\",\n \"skillsMode\"\n ],\n \"description\": \"Load tool docs and skill guides into the next turn. Use one batched call.\",\n \"signatures\": [\n {\n \"code\": \"await discover(item: string): void\",\n \"enabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover(items: string[]): void\",\n \"enabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover(request: { skills: string | string[] }): void\",\n \"enabledBy\": \"skillsMode\",\n \"disabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover(request: { tools?: string | string[], skills?: string | string[] }): void\",\n \"enabledByAny\": [\n \"discoveryMode+skillsMode\"\n ]\n }\n ],\n \"examples\": [\n {\n \"code\": \"await discover('db');\",\n \"enabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover(['db', 'db.search']);\",\n \"enabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover({ skills: ['release checklist'] });\",\n \"enabledBy\": \"skillsMode\",\n \"disabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover({ tools: ['db'], skills: ['release checklist'] });\",\n \"enabledByAny\": [\n \"discoveryMode+skillsMode\"\n ]\n }\n ]\n },\n {\n \"id\": \"recall\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"enabledBy\": \"memoriesMode\",\n \"description\": \"Recall memories by description. Matched `{id, content}` entries land on `inputs.memories` next turn — read it to see what landed. Returns nothing.\",\n \"signatures\": [\n {\n \"code\": \"await recall(searches: string[]): void\"\n }\n ]\n },\n {\n \"id\": \"used\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"enabledBy\": \"usageTrackingMode\",\n \"description\": \"Declare a loaded memory id or skill id that actually influenced this turn. Loaded-but-unused entries must be omitted. Returns nothing.\",\n \"signatures\": [\n {\n \"code\": \"await used(id: string, reason?: string): void\"\n }\n ]\n }\n ]\n}\n")])?;
v_template = core_get(
&v_data,
&CoreValue::from("responder_template"),
CoreValue::from(""),
);
v_out = _rlm_render_template(&[
v_template.clone(),
v_vars.clone(),
CoreValue::from("rlm/responder.md"),
])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _render_rlm_distiller_description(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_render_rlm_distiller_description");
let mut v_state = core_arg(args, 0);
let mut v_options = core_arg(args, 1);
let mut v_callable_split = CoreValue::Null;
let mut v_cm_has = CoreValue::Null;
let mut v_cm_state = CoreValue::Null;
let mut v_cm_text = CoreValue::Null;
let mut v_code_fence_language = CoreValue::Null;
let mut v_code_field_title = CoreValue::Null;
let mut v_context_fields = CoreValue::Null;
let mut v_context_var_list = CoreValue::Null;
let mut v_contract = CoreValue::Null;
let mut v_data = CoreValue::Null;
let mut v_direct_respond_mode = CoreValue::Null;
let mut v_direct_respond_only = CoreValue::Null;
let mut v_discovery_mode = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_flags = CoreValue::Null;
let mut v_functions_list = CoreValue::Null;
let mut v_has_executor_functions = CoreValue::Null;
let mut v_has_modules = CoreValue::Null;
let mut v_has_skills_catalog = CoreValue::Null;
let mut v_is_javascript = CoreValue::Null;
let mut v_language = CoreValue::Null;
let mut v_memories_mode = CoreValue::Null;
let mut v_memory_usage_camel = CoreValue::Null;
let mut v_memory_usage_mode = CoreValue::Null;
let mut v_modules_list = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_primitives_list = CoreValue::Null;
let mut v_skill_usage_camel = CoreValue::Null;
let mut v_skill_usage_mode = CoreValue::Null;
let mut v_skills_catalog = CoreValue::Null;
let mut v_skills_catalog_is_list = CoreValue::Null;
let mut v_skills_catalog_list = CoreValue::Null;
let mut v_skills_mode = CoreValue::Null;
let mut v_template = CoreValue::Null;
let mut v_usage_instructions = CoreValue::Null;
let mut v_vars = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_empty_list = CoreValue::new_list();
v_contract = core_get(
&v_state,
&CoreValue::from("runtime_contract"),
v_empty_map.clone(),
);
v_flags = _build_rlm_flags(&[v_state.clone()])?;
v_primitives_list =
_render_actor_primitives_list(&[CoreValue::from("distiller"), v_flags.clone()])?;
v_context_fields = core_get(
&v_state,
&CoreValue::from("context_fields"),
v_empty_list.clone(),
);
v_context_var_list = _rlm_context_var_list(&[v_context_fields.clone()])?;
v_language = core_get(
&v_contract,
&CoreValue::from("language"),
CoreValue::from("JavaScript"),
);
v_code_field_title = core_get(
&v_contract,
&CoreValue::from("code_field_title"),
CoreValue::from("Javascript Code"),
);
v_code_fence_language = core_get(
&v_contract,
&CoreValue::from("code_fence_language"),
CoreValue::from("js"),
);
v_is_javascript = core_get(
&v_contract,
&CoreValue::from("is_javascript"),
CoreValue::Bool(true),
);
v_usage_instructions = core_get(
&v_contract,
&CoreValue::from("usage_instructions"),
CoreValue::from(""),
);
v_memories_mode = core_get(
&v_flags,
&CoreValue::from("memoriesMode"),
CoreValue::Bool(false),
);
v_discovery_mode = core_get(
&v_flags,
&CoreValue::from("discoveryMode"),
CoreValue::Bool(false),
);
v_skills_mode = core_get(
&v_flags,
&CoreValue::from("skillsMode"),
CoreValue::Bool(false),
);
v_memory_usage_camel = core_get(
&v_options,
&CoreValue::from("memoryUsageMode"),
CoreValue::Bool(false),
);
v_memory_usage_mode = core_get(
&v_options,
&CoreValue::from("memory_usage_mode"),
v_memory_usage_camel.clone(),
);
v_skill_usage_camel = core_get(
&v_options,
&CoreValue::from("skillUsageMode"),
CoreValue::Bool(false),
);
v_skill_usage_mode = core_get(
&v_options,
&CoreValue::from("skill_usage_mode"),
v_skill_usage_camel.clone(),
);
v_callable_split = core_get(
&v_state,
&CoreValue::from("callable_split"),
v_empty_map.clone(),
);
v_functions_list = _render_agent_inline_functions_list(&[v_callable_split.clone()])?;
v_modules_list = _render_agent_modules_list(&[v_callable_split.clone()])?;
v_has_executor_functions = core_ne(&[v_functions_list.clone(), CoreValue::from("")])?;
v_has_modules = core_ne(&[v_modules_list.clone(), CoreValue::from("")])?;
v_skills_catalog = core_get(
&v_state,
&CoreValue::from("skills_catalog"),
CoreValue::Null,
);
v_skills_catalog_is_list = core_type_is(&v_skills_catalog, CoreValue::from("list"));
if core_truthy(&v_skills_catalog_is_list) {
} else {
v_skills_catalog = CoreValue::new_list();
}
v_skills_catalog_list = _render_agent_skills_catalog_list(&[v_skills_catalog.clone()])?;
v_has_skills_catalog = core_ne(&[v_skills_catalog_list.clone(), CoreValue::from("")])?;
v_cm_state = core_get(&v_state, &CoreValue::from("context_map"), CoreValue::Null);
v_cm_text = core_get(&v_cm_state, &CoreValue::from("text"), CoreValue::from(""));
v_cm_has = core_ne(&[v_cm_text.clone(), CoreValue::from("")])?;
v_vars = CoreValue::new_map();
core_set(
&v_vars,
CoreValue::from("contextVarList"),
v_context_var_list.clone(),
)?;
core_set(&v_vars, CoreValue::from("hasContextMap"), v_cm_has.clone())?;
core_set(
&v_vars,
CoreValue::from("contextMapText"),
v_cm_text.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("functionsList"),
v_functions_list.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("modulesList"),
v_modules_list.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("hasExecutorFunctions"),
v_has_executor_functions.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("discoveryMode"),
v_discovery_mode.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("hasModules"),
v_has_modules.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("hasDiscoveredDocs"),
v_discovery_mode.clone(),
)?;
core_set(&v_vars, CoreValue::from("hasSkills"), v_skills_mode.clone())?;
core_set(
&v_vars,
CoreValue::from("hasSkillsCatalog"),
v_has_skills_catalog.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("skillsCatalogList"),
v_skills_catalog_list.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("isJavaScriptRuntime"),
v_is_javascript.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("memoriesMode"),
v_memories_mode.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("memoryUsageMode"),
v_memory_usage_mode.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("skillUsageMode"),
v_skill_usage_mode.clone(),
)?;
v_direct_respond_mode = core_get(
&v_flags,
&CoreValue::from("directRespondMode"),
CoreValue::Bool(false),
);
v_direct_respond_only = core_get(
&v_flags,
&CoreValue::from("directRespondOnly"),
CoreValue::Bool(false),
);
core_set(
&v_vars,
CoreValue::from("directRespondMode"),
v_direct_respond_mode.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("directRespondOnly"),
v_direct_respond_only.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("primitivesList"),
v_primitives_list.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("runtimeCodeFenceLanguage"),
v_code_fence_language.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("runtimeCodeFieldTitle"),
v_code_field_title.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("runtimeLanguageName"),
v_language.clone(),
)?;
core_set(
&v_vars,
CoreValue::from("runtimeUsageInstructions"),
v_usage_instructions.clone(),
)?;
v_data = core_json_parse(&[CoreValue::from("{\n \"schema_version\": \"axir-rlm-prompts-v1\",\n \"executor_template\": \"## Executor\\n\\nYou (`executor`) are the task-execution stage in a two-stage pipeline. Your ONLY job is to write {{ runtimeLanguageName }} code that runs in the {{ runtimeLanguageName }} runtime (REPL) to complete tasks using the tools available to you. A separate (`responder`) agent downstream synthesizes the final answer.\\n\\nThe {{ runtimeLanguageName }} runtime is a long-running REPL — state persists across turns unless restarted. Each **turn**: write code → it executes → you see output → write the next block.\\n\\n### Executor Request & Distilled Context\\n\\nThe prior distiller (context) phase ran in this same {{ runtimeLanguageName }} runtime session and handed off:\\n\\n- `inputs.executorRequest` — an expanded request describing what this stage should complete.\\n- `inputs.distilledContext` — the evidence object the distiller selected, live in the runtime. The `Distilled Context Summary` input field describes its shape; the data itself exists only in the runtime — read it with code.\\n- Variables the distiller created remain live (see Live Runtime State). When a `Context Metadata` field is present, the raw context variables it lists are also still readable on `inputs`.\\n\\nWork from `executorRequest` and the distilled evidence first — they are your primary source. When the distilled evidence is insufficient for the request, fall back to the raw `inputs.*` context variables listed in `Context Metadata` — probe and narrow them with code before concluding anything is missing. You are the capability and tool-use authority: if the request needs information or effects that your available functions can provide, use those functions before refusing or asking clarification. If the distilled evidence is sufficient, finish directly with `final(...)`. Call `askClarification(...)` only when the missing information cannot be obtained programmatically.\\n\\n### Available Functions\\n\\n{{ primitivesList }}\\n\\n{{ functionsList }}\\n{{ if discoveryMode }}\\n\\n{{ if hasModules }}\\n### Available Modules\\n{{ modulesList }}\\n{{ /if }}\\n{{ if hasDiscoveredDocs }}\\n### Discovered Tool Docs\\n\\nWhen `inputs.discoveredToolDocs` is provided, it contains tool docs fetched this run (including any the context phase discovered). Use them directly. Only re-run discovery for modules/functions not listed there.\\n{{ /if }}\\n{{ /if }}\\n{{ if hasRelevanceHints }}\\n### Likely Relevant\\n\\nWhen `inputs.relevanceHints` is provided, a local ranker has flagged the modules, skills, or memories most likely relevant to this task. It is advisory, not a restriction — the full lists above still apply and you may load anything else. If the task needs data or effects from a hinted module whose functions are not yet documented above, call `discover([...])` for it first and use the returned docs on the next turn — do not call `final()` in the same turn as `discover()`.\\n{{ /if }}\\n{{ if hasSkills }}\\n{{ if hasSkillsCatalog }}\\n### Available Skills\\n{{ skillsCatalogList }}\\n\\nLoad a skill's full guide with the runtime-exposed `discover` primitive{{ if isJavaScriptRuntime }}, e.g. `await discover({ skills: ['<id>'] })`{{ /if }}; the guide appears in `inputs.loadedSkills` on the next turn.\\n{{ /if }}\\n### Loaded Skills\\n\\nWhen `inputs.loadedSkills` is provided, it contains skill guides loaded via the runtime-exposed `discover` primitive, forward-time skills, or guides carried over from the context phase. Apply relevant guides directly. Call `discover` with skills to load additional skills as needed.\\n{{ if skillUsageMode }}\\n\\nIf `used(...)` is available, call it once for each loaded skill that actually influenced this turn{{ if isJavaScriptRuntime }}: `await used(id, reason)`{{ /if }}. Use the skill's rendered `ID:` value. Keep reasons short. Do not report skills that were merely loaded or scanned.\\n{{ /if }}\\n{{ /if }}\\n{{ if memoriesMode }}\\n\\n### Memories\\n\\n`inputs.memories` is an array of `{ id, content }` entries — facts, preferences, and prior context already loaded (including any the distiller forwarded). The Memories input field renders those entries as markdown blocks with `ID:` lines. Scan them before deciding what to do. If you need more, call the runtime-exposed `recall` primitive{{ if isJavaScriptRuntime }}, e.g. `await recall(['…', '…'])`,{{ /if }} and matched memories are appended to `inputs.memories` for the next turn.\\n{{ if memoryUsageMode }}\\n\\nIf `used(...)` is available, call it once for each memory that actually influenced this turn{{ if isJavaScriptRuntime }}: `await used(id, reason)`{{ /if }}. Use the memory's rendered `ID:` value or `inputs.memories[n].id`. Keep reasons short. Do not report memories that were merely loaded or scanned.\\n{{ /if }}\\n{{ /if }}\\n\\n### How to Work\\n\\n- Start from `inputs.executorRequest`, `inputs.distilledContext`, non-context task inputs, and prior successful Action Log results. Don't repeat probes already in the Action Log, and don't redo context narrowing the distiller already did — its variables are still live.\\n- Treat direct action requests as work to attempt with available functions. If a function fails or the environment denies the action, capture the real error, status, output, or exception in the evidence for the responder.\\n- **Never conclude information is unavailable while an undiscovered module plausibly provides it.** If the request needs data your evidence lacks (a status, a record, a lookup) and a listed module or hint covers that domain, `discover` it and attempt the call before finalizing.\\n- **Never write a field name you haven't seen.** The Distilled Context Summary and Context Metadata list the real item keys — use those exact names. For function results, use the documented return schema or inspect the actual result before chaining on its fields; guessed field names silently produce zeros and empty results.\\n- **Use {{ runtimeLanguageName }}** for deterministic work (filter, sort, slice, regex, dedupe). **Use `llmQuery`** only to interpret narrowed text — never pass raw `inputs.*` to it.\\n- Discovery calls (`discover`) can appear alongside other code — the runtime runs them first automatically.\\n{{ if isJavaScriptRuntime }}\\n- Prefer one compact `console.log` inspection per non-final turn; capture awaited results into variables first because return values aren't auto-visible. If the task is complete, finish with `await final(\\\"...\\\", { result })` instead of logging.\\n{{ else }}\\n- Capture runtime results into variables when the language requires it; inspect intermediate values using the output/print mechanism described in the runtime usage instructions.\\n{{ /if }}\\n- Before calling `askClarification`, check whether any available function can resolve the need first.\\n{{ if hasAgentStatusCallback }}\\n- Keep the user updated: call the runtime-exposed `reportSuccess` primitive after completing sub-tasks and `reportFailure` when something goes wrong{{ if isJavaScriptRuntime }} (for example, `await reportSuccess(message)`){{ /if }}.\\n{{ /if }}\\n{{ if isJavaScriptRuntime }}\\n\\n```{{ runtimeCodeFenceLanguage }}\\nconst narrowed = inputs.emails\\n .filter(e => e.subject.toLowerCase().includes('refund'))\\n .map(e => ({ from: e.from, subject: e.subject, body: e.body.slice(0, 800) }));\\n\\nconst plan = await llmQuery([{\\n query: 'Determine which messages require a refund response and draft a compact action plan.',\\n context: { emails: narrowed }\\n}]);\\nconsole.log(plan);\\n```\\n{{ /if }}\\n\\n### Output Contract\\n\\nThe `{{ runtimeCodeFieldTitle }}` field value must be runnable {{ runtimeLanguageName }} only. Do not put prose or plain labels like `task:` / `evidence:` inside the value.\\n{{ if isJavaScriptRuntime }}\\nNever combine `console.log` with `final()` or `askClarification()` in the same turn.\\n{{ /if }}\\n\\n{{ if isJavaScriptRuntime }}\\nWhen done, call `await final(task, evidence)`:\\n{{ else }}\\nWhen done, call the runtime-exposed `final(task, evidence)` primitive:\\n{{ /if }}\\n\\n- `task` — a one-line instruction the **responder** will follow when writing the user-facing output fields (e.g. \\\"Answer the user's question using the matched emails\\\").\\n- `evidence` — the curated data the responder will read to follow `task`. Pass narrowed runtime values with only the fields that matter, not raw `inputs.*`. Use plain keys (for example, `matchedEmails`) — don't wrap under the output field name.\\n\\nDo not pre-format the answer; the responder writes the output fields.\\n\\nValid completion turns:\\n\\n{{ if isJavaScriptRuntime }}\\n```{{ runtimeCodeFenceLanguage }}\\nawait final(\\\"Answer the user's question using the gathered evidence\\\", { evidence });\\n```\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait askClarification(\\\"Which file should I analyze?\\\");\\n```\\n{{ else }}\\nCompletion turns must call the runtime-exposed `final` or `askClarification` primitive using the syntax described in the runtime usage instructions.\\n{{ /if }}\\n\\n## {{ runtimeLanguageName }} Runtime Usage Instructions\\n{{ runtimeUsageInstructions }}\\n\",\n \"responder_template\": \"## Answer Synthesis Agent\\n\\nYou synthesize the final answer from the evidence the actor gathered. You do not run code, call tools, or invoke agents — you read input fields and write the output fields.\\n\\n### Reading the actor's payload\\n\\n`Context Data` has two keys:\\n\\n- `task` — a one-line instruction telling you what to write into the output fields.\\n- `evidence` — the data the actor curated for you to follow that instruction.\\n\\n### Rules\\n\\n1. Follow `Context Data.task` using `Context Data.evidence` and any other input fields provided.\\n2. When emitting a JSON output field, write the value flat — do **not** wrap it under a key matching the field's title. The field is already named.\\n3. If `evidence` lacks sufficient information, give the best possible answer from what's available across all input fields.\\n4. Do not contradict actor evidence. If evidence contains a tool result, failure, status, output, or exception, report that result rather than inventing a capability limit.\\n\\n### Context variables that were analyzed (metadata only)\\n{{ contextVarSummary }}\\n{{ if hasAgentIdentity }}\\n\\n### Agent Identity\\n\\nUser-facing identity:\\n{{ agentIdentityText }}\\n{{ /if }}\\n\",\n \"distiller_template\": \"## Distiller\\n{{ if directRespondOnly }}\\n\\nYou (`distiller`) are the context phase of the pipeline. You read the available context, gather exactly the evidence the answer needs, and finish by handing an answer task plus that evidence to the downstream **responder**, which writes the user-facing output fields. There is no executor phase and there are no external tools — you own the analysis.\\n\\nCall `respond(task, evidence)` to finish. `task` is a one-line instruction the responder follows when writing the output fields (e.g. \\\"Answer the user's question using the matched refund emails\\\") — not a message to the user. `evidence` is the curated data the responder reads to follow `task`; it crosses into the responder's prompt, so narrow it to only the fields the answer needs — never raw `inputs.*`. Resolve follow-ups against prior conversation. You own the answer: never refuse because you lack tools — analysis over the provided context *is* the task. Use `askClarification` only when the request or target is genuinely ambiguous.\\n{{ else }}\\n\\nYou (`distiller`) are the reconnaissance phase of a two-phase pipeline that shares one {{ runtimeLanguageName }} runtime session. You read the available context, learn what the downstream **executor** phase will need, and forward an actionable request plus evidence. The executor owns tool execution and capability checks. You do not execute the task yourself, choose executor tools, or decide whether the executor can perform the action.\\n\\nCall `final(request, evidence)` to forward. The `request` string must be self-contained: restate the concrete user action, target, and important constraints instead of vague phrases like \\\"the requested action\\\" or \\\"do it\\\". Expand the user's original task with facts from context so the request is clear and complete. `evidence` is handed to the executor **by reference in the shared runtime** — put narrowed runtime values in it (the exact inputs the executor's functions will need: ids, paths, selected records, constraints), or `{}` if context has nothing to narrow. Variables you create stay live for the executor, so name them well. Resolve follow-ups against prior conversation. Never refuse, answer, or ask clarification because of your own lack of execution or perceived executor capabilities — forwarding *is* the response. Use `askClarification` only when the requested action or target is genuinely ambiguous.{{ if directRespondMode }} The one exception to never answering: the **Direct Response** rule below — when every one of its conditions holds, finishing with `respond` is the correct forwarding.{{ /if }}\\n{{ /if }}\\n\\nThe {{ runtimeLanguageName }} runtime is a long-running REPL — state persists across turns unless restarted. Each **turn**: write code → it executes → you see output → write the next block.\\n\\n### Context Fields\\n\\nContext fields are available as globals (in the REPL) on the `inputs` object:\\n{{ contextVarList }}\\n\\n### Available Functions\\n\\n{{ primitivesList }}\\n{{ if hasExecutorFunctions }}\\n\\n### Executor Functions (reference only — you cannot call these)\\n\\nThe executor phase will have these functions. Their schemas tell you which exact inputs to extract into `evidence`. Calling one here throws — extraction, not execution, is your job.{{ if directRespondMode }} If any of these functions' domains cover what the task needs, forward with `final()` — never `respond()`.{{ /if }}\\n\\n{{ functionsList }}\\n{{ /if }}\\n{{ if discoveryMode }}\\n{{ if hasModules }}\\n\\n### Available Modules\\n\\nModules the executor can use. Call `discover([...])` to load a module's function docs when knowing its exact inputs would sharpen what you extract; docs appear in `inputs.discoveredToolDocs` next turn and carry over to the executor phase.\\n{{ modulesList }}\\n{{ /if }}\\n{{ if hasDiscoveredDocs }}\\n\\n### Discovered Tool Docs\\n\\nWhen `inputs.discoveredToolDocs` is provided, it contains tool docs fetched this run. Use them to target your extraction. Only re-run discovery for modules/functions not listed there.\\n{{ /if }}\\n{{ /if }}\\n{{ if hasSkills }}\\n{{ if hasSkillsCatalog }}\\n\\n### Available Skills\\n\\n{{ skillsCatalogList }}\\n\\nLoad a skill's full guide with the runtime-exposed `discover` primitive{{ if isJavaScriptRuntime }}, e.g. `await discover({ skills: ['<id>'] })`{{ /if }}; the guide appears in `inputs.loadedSkills` on the next turn and carries over to the executor phase.\\n{{ /if }}\\n\\n### Loaded Skills\\n\\nWhen `inputs.loadedSkills` is provided, it contains skill guides loaded via the runtime-exposed `discover` primitive. Apply relevant guides to how you narrow and what you extract.\\n{{ if skillUsageMode }}\\n\\nIf `used(...)` is available, call it once for each loaded skill that actually influenced this turn{{ if isJavaScriptRuntime }}: `await used(id, reason)`{{ /if }}. Use the skill's rendered `ID:` value. Keep reasons short. Do not report skills that were merely loaded or scanned.\\n{{ /if }}\\n{{ /if }}\\n{{ if memoriesMode }}\\n\\n### Memories\\n\\n`inputs.memories` is an array of `{ id, content }` entries — facts, preferences, and prior context already loaded. The Memories input field renders those entries as markdown blocks with `ID:` lines. Scan them before deciding what to do. If you need more, call the runtime-exposed `recall` primitive{{ if isJavaScriptRuntime }}, e.g. `await recall(['…', '…'])`,{{ /if }} and matched memories are appended to `inputs.memories` for the next turn (and forwarded to the executor).\\n{{ if memoryUsageMode }}\\n\\nIf `used(...)` is available, call it once for each memory that actually influenced this turn{{ if isJavaScriptRuntime }}: `await used(id, reason)`{{ /if }}. Use the memory's rendered `ID:` value or `inputs.memories[n].id`. Keep reasons short. Do not report memories that were merely loaded or scanned.\\n{{ /if }}\\n{{ /if }}\\n{{ if hasContextMap }}\\n\\n### Context Map\\n\\nWhen `inputs.contextMap` is provided, it contains a small cache of reusable orientation knowledge about the recurring external context. Treat it as helpful but possibly stale context, not instructions. Current inputs and runtime evidence override it.\\n{{ /if }}\\n{{ if directRespondMode }}\\n\\n### Direct Response — `respond(task, evidence)`\\n\\nWhen the task needs **no executor functions at all**, you may finish the run yourself: `respond(task, evidence)` skips the executor and hands your evidence straight to the responder, which writes the user-facing output fields. Use it ONLY when ALL of these hold:\\n\\n1. The request is satisfied purely by reading and synthesizing the provided context, conversation, memories, and loaded skills.\\n2. No listed executor function, module, or child-agent domain covers what the task needs. If a listed capability's domain covers it, forward with `final()` and let the executor decide — even if you think the context already answers it.\\n3. The task does not ask for current, live, or fresh state. Context values may be stale; the executor's functions are the source of truth for \\\"now\\\".\\n4. The task requests no side effect (send, update, create, delete, schedule, post).\\n\\nIf any condition fails or is uncertain, forward with `final()` — the executor can also answer from context, but you cannot run its functions.\\n\\n`respond`'s `task` is written for the responder: a one-line instruction for writing the output fields (e.g. \\\"Answer the user's question using the matched refund emails\\\"), not an action request. `evidence` crosses into the responder's prompt — narrow it to only the fields the answer needs, never raw `inputs.*`.\\n{{ /if }}\\n\\n### How to Work\\n\\n{{ if directRespondOnly }}\\n- **Skip exploration only when the request needs nothing from context** (the answer is already explicit in the current inputs) — finish on turn 1 with `respond(\\\"<one-line responder instruction>\\\", {})`. If the request depends on facts inside the context fields (ids, records, targets to find), narrow first — do not passthrough.\\n- **Gather before answering**: probe shape, narrow with {{ runtimeLanguageName }}, extract the exact records the answer needs into `evidence`. Don't dump raw data. Don't repeat probes already in the Action Log.\\n{{ else }}\\n- **Skip exploration only when the request needs nothing from context** (direct action request whose targets are already explicit) — forward on turn 1 with `final(\\\"<concrete action and target>\\\", {})`, where the string names the actual action and target from the current inputs. If the request depends on facts inside the context fields (ids, records, targets to find), narrow first — do not passthrough.\\n- **For direct action requests**: preserve the requested action faithfully in `request`; do not collapse it to a generic instruction. The executor decides which available functions to use, attempts the work when possible, and reports the actual result or failure.\\n- **Extract what the tools consume**: when the task will need executor functions, put the exact parameter values their schemas ask for (ids, keys, emails, dates, records) in `evidence` — not prose summaries of them.\\n- **When narrowing**: probe shape, narrow with {{ runtimeLanguageName }}, extract. Don't dump raw data. Don't repeat probes already in the Action Log.\\n{{ /if }}\\n- **Never write a field name you haven't seen.** Context Metadata lists the real item keys of each context variable — use those exact names. If a key you need isn't listed, inspect one element first; guessed field names silently produce zeros and empty results.\\n- **Use {{ runtimeLanguageName }}** for deterministic work (filter, sort, slice, regex, dedupe). **Use `llmQuery`** only to interpret a narrowed slice — never pass raw `inputs.*` to it.\\n{{ if isJavaScriptRuntime }}\\n- Prefer one compact `console.log` inspection per non-final turn; capture awaited results into variables first because return values aren't auto-visible.\\n\\n```{{ runtimeCodeFenceLanguage }}\\nconst narrowed = inputs.emails\\n .filter(e => e.subject.toLowerCase().includes('refund'))\\n .map(e => ({ from: e.from, subject: e.subject, body: e.body.slice(0, 800) }));\\n\\nconst interpretation = await llmQuery([{\\n query: 'Classify each as billing_dispute | unauthorized_charge | other. JSON list.',\\n context: { emails: narrowed }\\n}]);\\nconsole.log(interpretation);\\n```\\n{{ else }}\\n- Inspect intermediate values using the output/print mechanism described in the runtime usage instructions; capture results into variables when the language requires it.\\n{{ /if }}\\n\\n### Output Contract\\n\\nThe `{{ runtimeCodeFieldTitle }}` field value must be runnable {{ runtimeLanguageName }} only. Do not put prose or plain labels like `task:` / `evidence:` inside the value.\\n{{ if isJavaScriptRuntime }}\\n{{ if directRespondOnly }}\\nNever combine `console.log` with `respond()` or `askClarification()` in the same turn.\\n\\nValid completion turns:\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait respond(\\\"Answer the user's question using the matched refund emails\\\", { matchedEmails });\\n```\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait askClarification(\\\"Which context should I inspect?\\\");\\n```\\n{{ else }}\\nNever combine `console.log` with `final()`{{ if directRespondMode }}, `respond()`,{{ /if }} or `askClarification()` in the same turn.\\n\\nValid completion turns:\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait final(\\\"Identify which refund emails require a billing-dispute response and summarize the required actions\\\", { matchedEmails });\\n```\\n\\n```{{ runtimeCodeFenceLanguage }}\\n// Passthrough — user asked for an action and there's nothing in context to narrow.\\nawait final(\\\"Send the password-reset email to customer@example.com and report the actual result or failure\\\", {});\\n```\\n{{ if directRespondMode }}\\n\\n```{{ runtimeCodeFenceLanguage }}\\n// Direct response — every Direct Response condition holds; no executor function is relevant.\\nawait respond(\\\"Summarize the refund-related emails for the user\\\", { matchedEmails });\\n```\\n{{ /if }}\\n\\n```{{ runtimeCodeFenceLanguage }}\\nawait askClarification(\\\"Which context should I inspect?\\\");\\n```\\n{{ /if }}\\n{{ else }}\\n{{ if directRespondOnly }}\\nCompletion turns must call the runtime-exposed `respond` or `askClarification` primitive using the syntax described in the runtime usage instructions.\\n{{ else }}\\nCompletion turns must call the runtime-exposed `final`{{ if directRespondMode }}, `respond`,{{ /if }} or `askClarification` primitive using the syntax described in the runtime usage instructions.\\n{{ /if }}\\n{{ /if }}\\n\\n## {{ runtimeLanguageName }} Runtime Usage Instructions\\n{{ runtimeUsageInstructions }}\\n\",\n \"primitives\": [\n {\n \"id\": \"llmQuery\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"description\": \"Ask focused questions about the narrowed context you pass in.\",\n \"signatures\": [\n {\n \"code\": \"await llmQuery([{ query: string, context: any }, ...]): string[]\"\n }\n ]\n },\n {\n \"id\": \"final\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"disabledBy\": \"directRespondOnly\",\n \"description\": \"End the turn. Use `final(task)` when the answer is direct; use `final(task, context)` to hand gathered evidence to downstream synthesis.\",\n \"signatures\": [\n {\n \"code\": \"await final(task: string, context?: object)\"\n }\n ]\n },\n {\n \"id\": \"respond\",\n \"stages\": [\n \"distiller\"\n ],\n \"enabledByAny\": [\n \"directRespondMode\",\n \"directRespondOnly\"\n ],\n \"description\": \"End the run and answer directly from context — the executor phase is skipped. `task` is a one-line instruction the answer-synthesis stage follows when writing the output fields; `evidence` is the curated data it reads (it crosses into that stage prompt, so narrow it to only the fields the answer needs).\",\n \"signatures\": [\n {\n \"code\": \"await respond(task: string, evidence?: object)\"\n }\n ]\n },\n {\n \"id\": \"askClarification\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"description\": \"Ask the user for clarification when genuinely blocked on an ambiguity you cannot resolve.\",\n \"signatures\": [\n {\n \"code\": \"await askClarification(spec: string | { question: string, type?: 'text'|'date'|'number'|'single_choice'|'multiple_choice', choices?: string[] }): void\"\n }\n ]\n },\n {\n \"id\": \"reportSuccess\",\n \"stages\": [\n \"executor\"\n ],\n \"enabledBy\": \"hasAgentStatusCallback\",\n \"description\": \"Report a sub-task as **succeeded** to the user. Mid-run progress signal — does NOT end the turn. Use whenever a meaningful step lands; you may call it many times per turn. Use `final(...)` to end the turn.\",\n \"signatures\": [\n {\n \"code\": \"await reportSuccess(message: string)\"\n }\n ]\n },\n {\n \"id\": \"reportFailure\",\n \"stages\": [\n \"executor\"\n ],\n \"enabledBy\": \"hasAgentStatusCallback\",\n \"description\": \"Report a sub-task as **failed** to the user. Mid-run failure signal — does NOT end the turn; the actor continues and may retry. Use `final(...)` to end the turn.\",\n \"signatures\": [\n {\n \"code\": \"await reportFailure(message: string)\"\n }\n ]\n },\n {\n \"id\": \"inspectRuntime\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"enabledBy\": \"hasInspectRuntime\",\n \"description\": \"Returns a compact snapshot of variables you've created in this session. Use to re-ground yourself when the conversation is long.\",\n \"signatures\": [\n {\n \"code\": \"await inspectRuntime(): string\"\n }\n ]\n },\n {\n \"id\": \"discover\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"enabledByAny\": [\n \"discoveryMode\",\n \"skillsMode\"\n ],\n \"description\": \"Load tool docs and skill guides into the next turn. Use one batched call.\",\n \"signatures\": [\n {\n \"code\": \"await discover(item: string): void\",\n \"enabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover(items: string[]): void\",\n \"enabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover(request: { skills: string | string[] }): void\",\n \"enabledBy\": \"skillsMode\",\n \"disabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover(request: { tools?: string | string[], skills?: string | string[] }): void\",\n \"enabledByAny\": [\n \"discoveryMode+skillsMode\"\n ]\n }\n ],\n \"examples\": [\n {\n \"code\": \"await discover('db');\",\n \"enabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover(['db', 'db.search']);\",\n \"enabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover({ skills: ['release checklist'] });\",\n \"enabledBy\": \"skillsMode\",\n \"disabledBy\": \"discoveryMode\"\n },\n {\n \"code\": \"await discover({ tools: ['db'], skills: ['release checklist'] });\",\n \"enabledByAny\": [\n \"discoveryMode+skillsMode\"\n ]\n }\n ]\n },\n {\n \"id\": \"recall\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"enabledBy\": \"memoriesMode\",\n \"description\": \"Recall memories by description. Matched `{id, content}` entries land on `inputs.memories` next turn — read it to see what landed. Returns nothing.\",\n \"signatures\": [\n {\n \"code\": \"await recall(searches: string[]): void\"\n }\n ]\n },\n {\n \"id\": \"used\",\n \"stages\": [\n \"distiller\",\n \"executor\"\n ],\n \"enabledBy\": \"usageTrackingMode\",\n \"description\": \"Declare a loaded memory id or skill id that actually influenced this turn. Loaded-but-unused entries must be omitted. Returns nothing.\",\n \"signatures\": [\n {\n \"code\": \"await used(id: string, reason?: string): void\"\n }\n ]\n }\n ]\n}\n")])?;
v_template = core_get(
&v_data,
&CoreValue::from("distiller_template"),
CoreValue::from(""),
);
v_out = _rlm_render_template(&[
v_template.clone(),
v_vars.clone(),
CoreValue::from("rlm/distiller.md"),
])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _record_policy_event(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_record_policy_event");
let mut v_state = core_arg(args, 0);
let mut v_action = core_arg(args, 1);
let mut v_payload = core_arg(args, 2);
let mut v_empty_list = CoreValue::Null;
let mut v_event = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_trace = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_trace = core_get(
&v_state,
&CoreValue::from("policy_trace"),
v_empty_list.clone(),
);
v_event = CoreValue::new_map();
core_set(
&v_event,
CoreValue::from("type"),
CoreValue::from("policy_event"),
)?;
core_set(&v_event, CoreValue::from("action"), v_action.clone())?;
core_set(&v_event, CoreValue::from("payload"), v_payload.clone())?;
core_append(&v_trace, v_event.clone())?;
core_set(&v_state, CoreValue::from("policy_trace"), v_trace.clone())?;
v_none = core_none(&[])?;
return Ok(v_none.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_policy_action_result(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_policy_action_result");
let mut v_action = core_arg(args, 0);
let mut v_payload = core_arg(args, 1);
let mut v_effect_only_actions = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_is_effect = CoreValue::Null;
let mut v_null_value = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_vocabulary = CoreValue::Null;
v_out = CoreValue::new_map();
v_null_value = core_none(&[])?;
v_vocabulary = _agent_policy_vocabulary_registry(&[])?;
v_empty_list = CoreValue::new_list();
v_effect_only_actions = core_get(
&v_vocabulary,
&CoreValue::from("effect_only_actions"),
v_empty_list.clone(),
);
core_set(&v_out, CoreValue::from("action"), v_action.clone())?;
core_set(&v_out, CoreValue::from("payload"), v_payload.clone())?;
v_is_effect = core_contains(&[v_effect_only_actions.clone(), v_action.clone()])?;
if core_truthy(&v_is_effect) {
core_set(&v_out, CoreValue::from("returns"), v_null_value.clone())?;
core_set(
&v_out,
CoreValue::from("effect_only"),
CoreValue::Bool(true),
)?;
} else {
core_set(&v_out, CoreValue::from("returns"), v_payload.clone())?;
core_set(
&v_out,
CoreValue::from("effect_only"),
CoreValue::Bool(false),
)?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _build_agent_actor_prompt_policy(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_build_agent_actor_prompt_policy");
let mut v_state = core_arg(args, 0);
let mut v_code_fence_language = CoreValue::Null;
let mut v_code_field_name = CoreValue::Null;
let mut v_code_field_title = CoreValue::Null;
let mut v_dynamic = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_flags = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_relevance_hints_enabled = CoreValue::Null;
let mut v_runtime_contract = CoreValue::Null;
let mut v_stable = CoreValue::Null;
v_runtime_contract = core_get(
&v_state,
&CoreValue::from("runtime_contract"),
CoreValue::Null,
);
v_code_field_name = core_get(
&v_runtime_contract,
&CoreValue::from("code_field_name"),
CoreValue::from("javascriptCode"),
);
v_code_field_title = core_get(
&v_runtime_contract,
&CoreValue::from("code_field_title"),
CoreValue::from("Javascript Code"),
);
v_code_fence_language = core_get(
&v_runtime_contract,
&CoreValue::from("code_fence_language"),
CoreValue::from("js"),
);
v_empty_map = CoreValue::new_map();
v_flags = core_get(
&v_state,
&CoreValue::from("policy_flags"),
v_empty_map.clone(),
);
v_relevance_hints_enabled = core_get(
&v_flags,
&CoreValue::from("relevanceHintsEnabled"),
CoreValue::Bool(false),
);
v_stable = CoreValue::new_list();
core_append(&v_stable, CoreValue::from("input"))?;
core_append(&v_stable, CoreValue::from("executorRequest"))?;
core_append(&v_stable, CoreValue::from("distilledContextSummary"))?;
core_append(&v_stable, CoreValue::from("contextMetadata"))?;
core_append(&v_stable, CoreValue::from("contextMap"))?;
core_append(&v_stable, CoreValue::from("memories"))?;
core_append(&v_stable, CoreValue::from("discoveredToolDocs"))?;
core_append(&v_stable, CoreValue::from("loadedSkills"))?;
core_append(&v_stable, CoreValue::from("summarizedActorLog"))?;
v_dynamic = CoreValue::new_list();
core_append(&v_dynamic, CoreValue::from("guidanceLog"))?;
core_append(&v_dynamic, CoreValue::from("actionLog"))?;
if core_truthy(&v_relevance_hints_enabled) {
core_append(&v_dynamic, CoreValue::from("relevanceHints"))?;
}
core_append(&v_dynamic, CoreValue::from("liveRuntimeState"))?;
core_append(&v_dynamic, CoreValue::from("contextPressure"))?;
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("stable_cached_fields"),
v_stable.clone(),
)?;
core_set(
&v_out,
CoreValue::from("dynamic_uncached_fields"),
v_dynamic.clone(),
)?;
core_set(
&v_out,
CoreValue::from("code_field_name"),
v_code_field_name.clone(),
)?;
core_set(
&v_out,
CoreValue::from("code_field_title"),
v_code_field_title.clone(),
)?;
core_set(
&v_out,
CoreValue::from("code_fence_language"),
v_code_fence_language.clone(),
)?;
core_set(
&v_out,
CoreValue::from("cache_order"),
CoreValue::from("stable_before_dynamic"),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _resolve_agent_context_policy(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_resolve_agent_context_policy");
let mut v_options = core_arg(args, 0);
let mut v_action_replay = CoreValue::Null;
let mut v_allowed = CoreValue::Null;
let mut v_allowed_is_list = CoreValue::Null;
let mut v_allowed_keys = CoreValue::Null;
let mut v_budget = CoreValue::Null;
let mut v_budget_key = CoreValue::Null;
let mut v_budget_profile = CoreValue::Null;
let mut v_checkpoint_ratio = CoreValue::Null;
let mut v_checkpoint_trigger = CoreValue::Null;
let mut v_checkpoints = CoreValue::Null;
let mut v_checkpoints_enabled = CoreValue::Null;
let mut v_context_hygiene = CoreValue::Null;
let mut v_context_registry = CoreValue::Null;
let mut v_default_budget = CoreValue::Null;
let mut v_default_preset = CoreValue::Null;
let mut v_disallowed = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_error_message = CoreValue::Null;
let mut v_error_policy = CoreValue::Null;
let mut v_error_pruning = CoreValue::Null;
let mut v_has_checkpoint_ratio = CoreValue::Null;
let mut v_has_max_runtime = CoreValue::Null;
let mut v_has_pressure = CoreValue::Null;
let mut v_hindsight = CoreValue::Null;
let mut v_hygiene_default = CoreValue::Null;
let mut v_hygiene_pressure = CoreValue::Null;
let mut v_inspect_enabled = CoreValue::Null;
let mut v_inspect_threshold = CoreValue::Null;
let mut v_key = CoreValue::Null;
let mut v_max_entries = CoreValue::Null;
let mut v_max_runtime_camel_key = CoreValue::Null;
let mut v_max_runtime_chars = CoreValue::Null;
let mut v_max_runtime_snake = CoreValue::Null;
let mut v_max_runtime_snake_key = CoreValue::Null;
let mut v_none_value = CoreValue::Null;
let mut v_option_keys = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_policy = CoreValue::Null;
let mut v_policy_camel = CoreValue::Null;
let mut v_policy_camel_key = CoreValue::Null;
let mut v_policy_is_map = CoreValue::Null;
let mut v_policy_snake_key = CoreValue::Null;
let mut v_preset = CoreValue::Null;
let mut v_preset_key = CoreValue::Null;
let mut v_preset_profile = CoreValue::Null;
let mut v_prune_rank = CoreValue::Null;
let mut v_recent_by_budget = CoreValue::Null;
let mut v_recent_default = CoreValue::Null;
let mut v_recent_full_actions = CoreValue::Null;
let mut v_state_inspection = CoreValue::Null;
let mut v_state_summary = CoreValue::Null;
let mut v_state_summary_enabled = CoreValue::Null;
let mut v_state_summary_max_chars = CoreValue::Null;
let mut v_summarizer_camel = CoreValue::Null;
let mut v_summarizer_camel_key = CoreValue::Null;
let mut v_summarizer_options = CoreValue::Null;
let mut v_summarizer_snake_key = CoreValue::Null;
let mut v_target_prompt_chars = CoreValue::Null;
let mut v_tombstoning_opt = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_context_registry = _agent_context_policy_registry(&[])?;
v_option_keys = core_get(
&v_context_registry,
&CoreValue::from("option_keys"),
v_empty_map.clone(),
);
v_policy_camel_key = core_get(
&v_option_keys,
&CoreValue::from("camel"),
CoreValue::from("contextPolicy"),
);
v_policy_snake_key = core_get(
&v_option_keys,
&CoreValue::from("snake"),
CoreValue::from("context_policy"),
);
v_preset_key = core_get(
&v_option_keys,
&CoreValue::from("preset"),
CoreValue::from("preset"),
);
v_budget_key = core_get(
&v_option_keys,
&CoreValue::from("budget"),
CoreValue::from("budget"),
);
v_summarizer_camel_key = core_get(
&v_option_keys,
&CoreValue::from("summarizer_camel"),
CoreValue::from("summarizerOptions"),
);
v_summarizer_snake_key = core_get(
&v_option_keys,
&CoreValue::from("summarizer_snake"),
CoreValue::from("summarizer_options"),
);
v_max_runtime_camel_key = core_get(
&v_option_keys,
&CoreValue::from("max_runtime_camel"),
CoreValue::from("maxRuntimeChars"),
);
v_max_runtime_snake_key = core_get(
&v_option_keys,
&CoreValue::from("max_runtime_snake"),
CoreValue::from("max_runtime_chars"),
);
v_policy_camel = core_get(&v_options, &v_policy_camel_key.clone(), v_empty_map.clone());
v_policy = core_get(
&v_options,
&v_policy_snake_key.clone(),
v_policy_camel.clone(),
);
v_policy_is_map = core_type_is(&v_policy, CoreValue::from("object"));
if core_truthy(&v_policy_is_map) {
} else {
v_policy = v_empty_map.clone();
}
v_allowed_keys = core_get(
&v_context_registry,
&CoreValue::from("allowed_keys"),
CoreValue::Null,
);
v_allowed_is_list = core_type_is(&v_allowed_keys, CoreValue::from("list"));
if core_truthy(&v_allowed_is_list) {
} else {
v_allowed_keys = CoreValue::new_list();
}
for v_key in core_iter(&v_policy)? {
let mut v_key = v_key;
v_allowed = core_contains(&[v_allowed_keys.clone(), v_key.clone()])?;
v_disallowed = core_not(&[v_allowed.clone()])?;
if core_truthy(&v_disallowed) {
v_error_message = _agent_context_policy_migration_error(&[v_key.clone()])?;
v_error_policy = core_runtime_error(&[v_error_message.clone()])?;
return Err(core_as_error(&v_error_policy));
}
}
v_default_preset = core_get(
&v_context_registry,
&CoreValue::from("default_preset"),
CoreValue::from("checkpointed"),
);
v_default_budget = core_get(
&v_context_registry,
&CoreValue::from("default_budget"),
CoreValue::from("balanced"),
);
v_preset = core_get(&v_policy, &v_preset_key.clone(), v_default_preset.clone());
v_budget = core_get(&v_policy, &v_budget_key.clone(), v_default_budget.clone());
v_budget_profile = _agent_context_budget_profile(&[v_budget.clone()])?;
v_preset_profile = _agent_context_preset_profile(&[v_preset.clone()])?;
v_target_prompt_chars = core_get(
&v_budget_profile,
&CoreValue::from("targetPromptChars"),
CoreValue::Num(16000f64),
);
v_inspect_threshold = core_get(
&v_budget_profile,
&CoreValue::from("inspectThreshold"),
CoreValue::Num(13600f64),
);
v_action_replay = core_get(
&v_preset_profile,
&CoreValue::from("actionReplay"),
CoreValue::from("full"),
);
v_recent_by_budget = core_get(
&v_preset_profile,
&CoreValue::from("recentFullActionsByBudget"),
v_empty_map.clone(),
);
v_recent_default = core_get(
&v_preset_profile,
&CoreValue::from("recentFullActions"),
CoreValue::Num(1f64),
);
v_recent_full_actions = core_get(
&v_recent_by_budget,
&v_budget.clone(),
v_recent_default.clone(),
);
v_error_pruning = core_get(
&v_preset_profile,
&CoreValue::from("errorPruning"),
CoreValue::Bool(false),
);
v_hindsight = core_get(
&v_preset_profile,
&CoreValue::from("hindsight"),
CoreValue::Bool(false),
);
v_prune_rank = core_get(
&v_preset_profile,
&CoreValue::from("pruneRank"),
CoreValue::Num(2f64),
);
v_state_summary_enabled = core_get(
&v_preset_profile,
&CoreValue::from("stateSummary"),
CoreValue::Bool(false),
);
v_inspect_enabled = core_get(
&v_preset_profile,
&CoreValue::from("inspect"),
CoreValue::Bool(false),
);
v_max_entries = core_get(
&v_preset_profile,
&CoreValue::from("maxEntries"),
CoreValue::Null,
);
v_hygiene_default = core_get(
&v_preset_profile,
&CoreValue::from("defaultHygieneMode"),
CoreValue::from("none"),
);
v_hygiene_pressure = core_get(
&v_preset_profile,
&CoreValue::from("pressureHygieneMode"),
CoreValue::Null,
);
v_checkpoints_enabled = core_get(
&v_preset_profile,
&CoreValue::from("checkpointsEnabled"),
CoreValue::Bool(false),
);
v_checkpoint_trigger = core_none(&[])?;
if core_truthy(&v_checkpoints_enabled) {
v_checkpoint_ratio = core_get(
&v_preset_profile,
&CoreValue::from("checkpointTriggerRatio"),
CoreValue::Null,
);
v_has_checkpoint_ratio = core_is_not_none(&[v_checkpoint_ratio.clone()])?;
if core_truthy(&v_has_checkpoint_ratio) {
v_checkpoint_trigger =
core_mul(&[v_target_prompt_chars.clone(), v_checkpoint_ratio.clone()])?;
}
}
v_summarizer_camel = core_get(
&v_options,
&v_summarizer_camel_key.clone(),
v_empty_map.clone(),
);
v_summarizer_options = core_get(
&v_options,
&v_summarizer_snake_key.clone(),
v_summarizer_camel.clone(),
);
v_max_runtime_snake = core_get(
&v_options,
&v_max_runtime_snake_key.clone(),
CoreValue::Null,
);
v_max_runtime_chars = core_get(
&v_options,
&v_max_runtime_camel_key.clone(),
v_max_runtime_snake.clone(),
);
v_has_max_runtime = core_is_not_none(&[v_max_runtime_chars.clone()])?;
if core_truthy(&v_has_max_runtime) {
} else {
v_max_runtime_chars = core_get(
&v_context_registry,
&CoreValue::from("default_max_runtime_chars"),
CoreValue::Num(3000f64),
);
}
v_context_hygiene = CoreValue::new_map();
core_set(
&v_context_hygiene,
CoreValue::from("defaultMode"),
v_hygiene_default.clone(),
)?;
v_has_pressure = core_is_not_none(&[v_hygiene_pressure.clone()])?;
if core_truthy(&v_has_pressure) {
core_set(
&v_context_hygiene,
CoreValue::from("pressureMode"),
v_hygiene_pressure.clone(),
)?;
}
v_state_summary = CoreValue::new_map();
core_set(
&v_state_summary,
CoreValue::from("enabled"),
v_state_summary_enabled.clone(),
)?;
core_set(
&v_state_summary,
CoreValue::from("maxEntries"),
v_max_entries.clone(),
)?;
v_state_summary_max_chars = core_get(
&v_context_registry,
&CoreValue::from("state_summary_max_chars"),
CoreValue::Num(1200f64),
);
core_set(
&v_state_summary,
CoreValue::from("maxChars"),
v_state_summary_max_chars.clone(),
)?;
v_state_inspection = CoreValue::new_map();
core_set(
&v_state_inspection,
CoreValue::from("enabled"),
v_inspect_enabled.clone(),
)?;
core_set(
&v_state_inspection,
CoreValue::from("contextThreshold"),
v_inspect_threshold.clone(),
)?;
v_checkpoints = CoreValue::new_map();
core_set(
&v_checkpoints,
CoreValue::from("enabled"),
v_checkpoints_enabled.clone(),
)?;
core_set(
&v_checkpoints,
CoreValue::from("triggerChars"),
v_checkpoint_trigger.clone(),
)?;
v_out = CoreValue::new_map();
v_none_value = core_none(&[])?;
core_set(&v_out, CoreValue::from("preset"), v_preset.clone())?;
core_set(&v_out, CoreValue::from("budget"), v_budget.clone())?;
core_set(
&v_out,
CoreValue::from("summarizerOptions"),
v_summarizer_options.clone(),
)?;
core_set(
&v_out,
CoreValue::from("actionReplay"),
v_action_replay.clone(),
)?;
core_set(
&v_out,
CoreValue::from("recentFullActions"),
v_recent_full_actions.clone(),
)?;
core_set(
&v_out,
CoreValue::from("contextHygiene"),
v_context_hygiene.clone(),
)?;
core_set(
&v_out,
CoreValue::from("errorPruning"),
v_error_pruning.clone(),
)?;
core_set(
&v_out,
CoreValue::from("hindsightEvaluation"),
v_hindsight.clone(),
)?;
core_set(&v_out, CoreValue::from("pruneRank"), v_prune_rank.clone())?;
core_set(
&v_out,
CoreValue::from("rankPruneGraceTurns"),
CoreValue::Num(2f64),
)?;
v_tombstoning_opt = core_get(
&v_options,
&CoreValue::from("tombstoning"),
v_none_value.clone(),
);
core_set(
&v_out,
CoreValue::from("tombstoning"),
v_tombstoning_opt.clone(),
)?;
core_set(
&v_out,
CoreValue::from("stateSummary"),
v_state_summary.clone(),
)?;
core_set(
&v_out,
CoreValue::from("stateInspection"),
v_state_inspection.clone(),
)?;
core_set(
&v_out,
CoreValue::from("checkpoints"),
v_checkpoints.clone(),
)?;
core_set(
&v_out,
CoreValue::from("targetPromptChars"),
v_target_prompt_chars.clone(),
)?;
core_set(
&v_out,
CoreValue::from("maxRuntimeChars"),
v_max_runtime_chars.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _resolve_agent_executor_model_policy(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_resolve_agent_executor_model_policy");
let mut v_options = core_arg(args, 0);
let mut v_above = CoreValue::Null;
let mut v_above_invalid = CoreValue::Null;
let mut v_above_is_number = CoreValue::Null;
let mut v_above_negative = CoreValue::Null;
let mut v_context_registry = CoreValue::Null;
let mut v_count = CoreValue::Null;
let mut v_empty = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_entry_is_map = CoreValue::Null;
let mut v_error_above = CoreValue::Null;
let mut v_error_empty = CoreValue::Null;
let mut v_error_entry = CoreValue::Null;
let mut v_error_legacy = CoreValue::Null;
let mut v_error_model = CoreValue::Null;
let mut v_error_namespaces = CoreValue::Null;
let mut v_error_shape = CoreValue::Null;
let mut v_error_trigger = CoreValue::Null;
let mut v_executor_registry = CoreValue::Null;
let mut v_has_above = CoreValue::Null;
let mut v_has_legacy_key = CoreValue::Null;
let mut v_has_namespaces = CoreValue::Null;
let mut v_has_trigger = CoreValue::Null;
let mut v_index = CoreValue::Null;
let mut v_is_list = CoreValue::Null;
let mut v_legacy_any = CoreValue::Null;
let mut v_legacy_key = CoreValue::Null;
let mut v_legacy_keys = CoreValue::Null;
let mut v_message_above = CoreValue::Null;
let mut v_message_entry = CoreValue::Null;
let mut v_message_model = CoreValue::Null;
let mut v_message_namespaces = CoreValue::Null;
let mut v_message_trigger = CoreValue::Null;
let mut v_migration_error = CoreValue::Null;
let mut v_missing = CoreValue::Null;
let mut v_model = CoreValue::Null;
let mut v_model_missing = CoreValue::Null;
let mut v_namespace = CoreValue::Null;
let mut v_namespace_is_string = CoreValue::Null;
let mut v_namespace_nonempty = CoreValue::Null;
let mut v_namespaces = CoreValue::Null;
let mut v_no_valid_namespaces = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_normalized = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_policy = CoreValue::Null;
let mut v_policy_snake = CoreValue::Null;
let mut v_trimmed_namespace = CoreValue::Null;
let mut v_valid_namespace_count = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_context_registry = _agent_context_policy_registry(&[])?;
v_empty_map = CoreValue::new_map();
v_executor_registry = core_get(
&v_context_registry,
&CoreValue::from("executor_model_policy"),
v_empty_map.clone(),
);
v_migration_error = core_get(&v_executor_registry, &CoreValue::from("migration_error"), CoreValue::from("executorModelPolicy now expects an ordered array of { model, namespaces?, aboveErrorTurns? } entries. Manage prompt pressure with contextPolicy.budget instead of abovePromptChars."));
v_legacy_keys = core_get(
&v_executor_registry,
&CoreValue::from("legacy_keys"),
v_empty_list.clone(),
);
v_policy_snake = core_get(
&v_options,
&CoreValue::from("executor_model_policy"),
CoreValue::Null,
);
v_policy = core_get(
&v_options,
&CoreValue::from("executorModelPolicy"),
v_policy_snake.clone(),
);
v_missing = core_is_none(&[v_policy.clone()])?;
if core_truthy(&v_missing) {
v_none = core_none(&[])?;
return Ok(v_none.clone());
}
v_is_list = core_type_is(&v_policy, CoreValue::from("list"));
if core_truthy(&v_is_list) {
} else {
v_error_shape = core_runtime_error(&[v_migration_error.clone()])?;
return Err(core_as_error(&v_error_shape));
}
v_out = CoreValue::new_list();
v_index = CoreValue::Num(0f64);
for v_entry in core_iter(&v_policy)? {
let mut v_entry = v_entry;
v_entry_is_map = core_type_is(&v_entry, CoreValue::from("object"));
if core_truthy(&v_entry_is_map) {
} else {
v_message_entry = core_string_format(&[
CoreValue::from("executorModelPolicy[{}] must be an object"),
v_index.clone(),
])?;
v_error_entry = core_runtime_error(&[v_message_entry.clone()])?;
return Err(core_as_error(&v_error_entry));
}
v_legacy_any = CoreValue::Bool(false);
for v_legacy_key in core_iter(&v_legacy_keys)? {
let mut v_legacy_key = v_legacy_key;
v_has_legacy_key = core_map_contains(&[v_entry.clone(), v_legacy_key.clone()])?;
if core_truthy(&v_has_legacy_key) {
v_legacy_any = CoreValue::Bool(true);
}
}
if core_truthy(&v_legacy_any) {
v_error_legacy = core_runtime_error(&[v_migration_error.clone()])?;
return Err(core_as_error(&v_error_legacy));
}
v_model = core_get(&v_entry, &CoreValue::from("model"), CoreValue::from(""));
v_model_missing = core_eq(&[v_model.clone(), CoreValue::from("")])?;
if core_truthy(&v_model_missing) {
v_message_model = core_string_format(&[
CoreValue::from("executorModelPolicy[{}].model must be a non-empty string"),
v_index.clone(),
])?;
v_error_model = core_runtime_error(&[v_message_model.clone()])?;
return Err(core_as_error(&v_error_model));
}
v_above = core_get(
&v_entry,
&CoreValue::from("aboveErrorTurns"),
CoreValue::Null,
);
v_namespaces = core_get(&v_entry, &CoreValue::from("namespaces"), CoreValue::Null);
v_has_above = core_is_not_none(&[v_above.clone()])?;
v_has_namespaces = core_type_is(&v_namespaces, CoreValue::from("list"));
if core_truthy(&v_has_above) {
v_above_is_number = core_type_is(&v_above, CoreValue::from("number"));
v_above_negative = core_lt(&[v_above.clone(), CoreValue::Num(0f64)])?;
v_above_invalid = core_not(&[v_above_is_number.clone()])?;
v_above_invalid = core_or(&[v_above_invalid.clone(), v_above_negative.clone()])?;
if core_truthy(&v_above_invalid) {
v_message_above = core_string_format(&[
CoreValue::from(
"executorModelPolicy[{}].aboveErrorTurns must be a finite number >= 0",
),
v_index.clone(),
])?;
v_error_above = core_runtime_error(&[v_message_above.clone()])?;
return Err(core_as_error(&v_error_above));
}
}
if core_truthy(&v_has_namespaces) {
v_valid_namespace_count = CoreValue::Num(0f64);
for v_namespace in core_iter(&v_namespaces)? {
let mut v_namespace = v_namespace;
v_namespace_is_string = core_type_is(&v_namespace, CoreValue::from("string"));
if core_truthy(&v_namespace_is_string) {
v_trimmed_namespace = core_string_trim(&v_namespace);
v_namespace_nonempty =
core_ne(&[v_trimmed_namespace.clone(), CoreValue::from("")])?;
if core_truthy(&v_namespace_nonempty) {
v_valid_namespace_count =
core_add(&[v_valid_namespace_count.clone(), CoreValue::Num(1f64)])?;
}
}
}
v_no_valid_namespaces =
core_eq(&[v_valid_namespace_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_no_valid_namespaces) {
v_message_namespaces = core_string_format(&[CoreValue::from("executorModelPolicy[{}].namespaces must contain at least one non-empty string"), v_index.clone()])?;
v_error_namespaces = core_runtime_error(&[v_message_namespaces.clone()])?;
return Err(core_as_error(&v_error_namespaces));
}
}
v_has_trigger = core_or(&[v_has_above.clone(), v_has_namespaces.clone()])?;
if core_truthy(&v_has_trigger) {
} else {
v_message_trigger = core_string_format(&[CoreValue::from("executorModelPolicy[{}] must define at least one of aboveErrorTurns or namespaces"), v_index.clone()])?;
v_error_trigger = core_runtime_error(&[v_message_trigger.clone()])?;
return Err(core_as_error(&v_error_trigger));
}
v_normalized = CoreValue::new_map();
core_set(&v_normalized, CoreValue::from("model"), v_model.clone())?;
if core_truthy(&v_has_above) {
core_set(
&v_normalized,
CoreValue::from("aboveErrorTurns"),
v_above.clone(),
)?;
}
if core_truthy(&v_has_namespaces) {
core_set(
&v_normalized,
CoreValue::from("namespaces"),
v_namespaces.clone(),
)?;
}
core_append(&v_out, v_normalized.clone())?;
v_index = core_add(&[v_index.clone(), CoreValue::Num(1f64)])?;
}
v_count = core_len(&[v_out.clone()])?;
v_empty = core_eq(&[v_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_empty) {
v_error_empty = core_runtime_error(&[CoreValue::from(
"executorModelPolicy must contain at least one entry",
)])?;
return Err(core_as_error(&v_error_empty));
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _select_agent_executor_model(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_select_agent_executor_model");
let mut v_policy = core_arg(args, 0);
let mut v_actor_model_state = core_arg(args, 1);
let mut v_above = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_error_trigger = CoreValue::Null;
let mut v_errors = CoreValue::Null;
let mut v_has_above = CoreValue::Null;
let mut v_is_list = CoreValue::Null;
let mut v_matched = CoreValue::Null;
let mut v_matched_is_list = CoreValue::Null;
let mut v_model = CoreValue::Null;
let mut v_namespace = CoreValue::Null;
let mut v_namespace_match = CoreValue::Null;
let mut v_namespaces = CoreValue::Null;
let mut v_namespaces_is_list = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_selected = CoreValue::Null;
let mut v_trigger = CoreValue::Null;
v_none = core_none(&[])?;
v_is_list = core_type_is(&v_policy, CoreValue::from("list"));
if core_truthy(&v_is_list) {
} else {
return Ok(v_none.clone());
}
v_errors = core_get(
&v_actor_model_state,
&CoreValue::from("consecutiveErrorTurns"),
CoreValue::Num(0f64),
);
v_matched = core_get(
&v_actor_model_state,
&CoreValue::from("matchedNamespaces"),
CoreValue::Null,
);
v_matched_is_list = core_type_is(&v_matched, CoreValue::from("list"));
if core_truthy(&v_matched_is_list) {
} else {
v_matched = CoreValue::new_list();
}
v_selected = core_none(&[])?;
for v_entry in core_iter(&v_policy)? {
let mut v_entry = v_entry;
v_model = core_get(&v_entry, &CoreValue::from("model"), CoreValue::from(""));
v_above = core_get(
&v_entry,
&CoreValue::from("aboveErrorTurns"),
CoreValue::Null,
);
v_namespaces = core_get(&v_entry, &CoreValue::from("namespaces"), CoreValue::Null);
v_trigger = CoreValue::Bool(false);
v_has_above = core_is_not_none(&[v_above.clone()])?;
if core_truthy(&v_has_above) {
v_error_trigger = core_gte(&[v_errors.clone(), v_above.clone()])?;
if core_truthy(&v_error_trigger) {
v_trigger = CoreValue::Bool(true);
}
}
v_namespaces_is_list = core_type_is(&v_namespaces, CoreValue::from("list"));
if core_truthy(&v_namespaces_is_list) {
for v_namespace in core_iter(&v_namespaces)? {
let mut v_namespace = v_namespace;
v_namespace_match = core_contains(&[v_matched.clone(), v_namespace.clone()])?;
if core_truthy(&v_namespace_match) {
v_trigger = CoreValue::Bool(true);
}
}
}
if core_truthy(&v_trigger) {
v_selected = v_model.clone();
}
}
return Ok(v_selected.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_compute_effective_chat_budget(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_compute_effective_chat_budget");
let mut v_base_budget = core_arg(args, 0);
let mut v_fixed_overhead_chars = core_arg(args, 1);
let mut v_budget = CoreValue::Null;
let mut v_budget_math = CoreValue::Null;
let mut v_context_registry = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_max_system = CoreValue::Null;
let mut v_min_ratio = CoreValue::Null;
let mut v_negative_overhead = CoreValue::Null;
let mut v_overhead_ratio = CoreValue::Null;
let mut v_ratio = CoreValue::Null;
let mut v_too_high = CoreValue::Null;
let mut v_too_low = CoreValue::Null;
v_context_registry = _agent_context_policy_registry(&[])?;
v_empty_map = CoreValue::new_map();
v_budget_math = core_get(
&v_context_registry,
&CoreValue::from("budget_math"),
v_empty_map.clone(),
);
v_ratio = CoreValue::Num(1f64);
v_max_system = core_get(
&v_budget_math,
&CoreValue::from("maxSystemPromptChars"),
CoreValue::Num(30000f64),
);
v_min_ratio = core_get(
&v_budget_math,
&CoreValue::from("minEffectiveBudgetRatio"),
CoreValue::Num(0.25f64),
);
v_overhead_ratio = core_div(&[v_fixed_overhead_chars.clone(), v_max_system.clone()])?;
v_negative_overhead = core_mul(&[CoreValue::Num(-1f64), v_overhead_ratio.clone()])?;
v_ratio = core_add(&[CoreValue::Num(1f64), v_negative_overhead.clone()])?;
v_too_low = core_lt(&[v_ratio.clone(), v_min_ratio.clone()])?;
if core_truthy(&v_too_low) {
v_ratio = v_min_ratio.clone();
}
v_too_high = core_gt(&[v_ratio.clone(), CoreValue::Num(1f64)])?;
if core_truthy(&v_too_high) {
v_ratio = CoreValue::Num(1f64);
}
v_budget = core_mul(&[v_base_budget.clone(), v_ratio.clone()])?;
return Ok(v_budget.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_action_log_char_count(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_action_log_char_count");
let mut v_entries = core_arg(args, 0);
let mut v_code = CoreValue::Null;
let mut v_code_len = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_entry_len = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_output_len = CoreValue::Null;
let mut v_total = CoreValue::Null;
v_total = CoreValue::Num(0f64);
for v_entry in core_iter(&v_entries)? {
let mut v_entry = v_entry;
v_code = core_get(&v_entry, &CoreValue::from("code"), CoreValue::from(""));
v_output = core_get(&v_entry, &CoreValue::from("output"), CoreValue::from(""));
v_code_len = core_len(&[v_code.clone()])?;
v_output_len = core_len(&[v_output.clone()])?;
v_entry_len = core_add(&[v_code_len.clone(), v_output_len.clone()])?;
v_total = core_add(&[v_total.clone(), v_entry_len.clone()])?;
}
return Ok(v_total.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_compute_dynamic_runtime_chars(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_compute_dynamic_runtime_chars");
let mut v_entries = core_arg(args, 0);
let mut v_target_prompt_chars = core_arg(args, 1);
let mut v_max_runtime_chars = core_arg(args, 2);
let mut v_above_max = CoreValue::Null;
let mut v_below_min = CoreValue::Null;
let mut v_candidate = CoreValue::Null;
let mut v_context_registry = CoreValue::Null;
let mut v_current_chars = CoreValue::Null;
let mut v_effective_min = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_floor_ratio = CoreValue::Null;
let mut v_max_below_min = CoreValue::Null;
let mut v_min_runtime_chars = CoreValue::Null;
let mut v_negative_usage_ratio = CoreValue::Null;
let mut v_remaining_ratio = CoreValue::Null;
let mut v_runtime_budget = CoreValue::Null;
let mut v_too_high = CoreValue::Null;
let mut v_too_low = CoreValue::Null;
let mut v_usage_ratio = CoreValue::Null;
v_context_registry = _agent_context_policy_registry(&[])?;
v_empty_map = CoreValue::new_map();
v_runtime_budget = core_get(
&v_context_registry,
&CoreValue::from("runtime_output_budget"),
v_empty_map.clone(),
);
v_floor_ratio = core_get(
&v_runtime_budget,
&CoreValue::from("floorRatio"),
CoreValue::Num(0.15f64),
);
v_min_runtime_chars = core_get(
&v_runtime_budget,
&CoreValue::from("minRuntimeChars"),
CoreValue::Num(400f64),
);
v_current_chars = _agent_action_log_char_count(&[v_entries.clone()])?;
v_usage_ratio = core_div(&[v_current_chars.clone(), v_target_prompt_chars.clone()])?;
v_negative_usage_ratio = core_mul(&[CoreValue::Num(-1f64), v_usage_ratio.clone()])?;
v_remaining_ratio = core_add(&[CoreValue::Num(1f64), v_negative_usage_ratio.clone()])?;
v_too_low = core_lt(&[v_remaining_ratio.clone(), v_floor_ratio.clone()])?;
if core_truthy(&v_too_low) {
v_remaining_ratio = v_floor_ratio.clone();
}
v_too_high = core_gt(&[v_remaining_ratio.clone(), CoreValue::Num(1f64)])?;
if core_truthy(&v_too_high) {
v_remaining_ratio = CoreValue::Num(1f64);
}
v_effective_min = v_min_runtime_chars.clone();
v_max_below_min = core_lt(&[v_max_runtime_chars.clone(), v_effective_min.clone()])?;
if core_truthy(&v_max_below_min) {
v_effective_min = v_max_runtime_chars.clone();
}
v_candidate = core_mul(&[v_max_runtime_chars.clone(), v_remaining_ratio.clone()])?;
v_above_max = core_gt(&[v_candidate.clone(), v_max_runtime_chars.clone()])?;
if core_truthy(&v_above_max) {
v_candidate = v_max_runtime_chars.clone();
}
v_below_min = core_lt(&[v_candidate.clone(), v_effective_min.clone()])?;
if core_truthy(&v_below_min) {
v_candidate = v_effective_min.clone();
}
return Ok(v_candidate.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_context_pressure(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_context_pressure");
let mut v_mutable_prompt_chars = core_arg(args, 0);
let mut v_effective_budget_chars = core_arg(args, 1);
let mut v_checkpoint_active = core_arg(args, 2);
let mut v_context_registry = CoreValue::Null;
let mut v_critical = CoreValue::Null;
let mut v_critical_id = CoreValue::Null;
let mut v_critical_level = CoreValue::Null;
let mut v_critical_threshold = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_invalid_budget = CoreValue::Null;
let mut v_ok_id = CoreValue::Null;
let mut v_ok_level = CoreValue::Null;
let mut v_pressure_levels = CoreValue::Null;
let mut v_ratio = CoreValue::Null;
let mut v_watch = CoreValue::Null;
let mut v_watch_id = CoreValue::Null;
let mut v_watch_level = CoreValue::Null;
let mut v_watch_threshold = CoreValue::Null;
v_context_registry = _agent_context_policy_registry(&[])?;
v_empty_map = CoreValue::new_map();
v_pressure_levels = core_get(
&v_context_registry,
&CoreValue::from("pressure_levels"),
v_empty_map.clone(),
);
v_ok_level = core_get(
&v_pressure_levels,
&CoreValue::from("ok"),
v_empty_map.clone(),
);
v_watch_level = core_get(
&v_pressure_levels,
&CoreValue::from("watch"),
v_empty_map.clone(),
);
v_critical_level = core_get(
&v_pressure_levels,
&CoreValue::from("critical"),
v_empty_map.clone(),
);
v_ok_id = core_get(&v_ok_level, &CoreValue::from("id"), CoreValue::from("ok"));
v_watch_id = core_get(
&v_watch_level,
&CoreValue::from("id"),
CoreValue::from("watch"),
);
v_critical_id = core_get(
&v_critical_level,
&CoreValue::from("id"),
CoreValue::from("critical"),
);
v_watch_threshold = core_get(
&v_watch_level,
&CoreValue::from("threshold"),
CoreValue::Num(0.7f64),
);
v_critical_threshold = core_get(
&v_critical_level,
&CoreValue::from("threshold"),
CoreValue::Num(0.9f64),
);
if core_truthy(&v_checkpoint_active) {
return Ok(v_critical_id.clone());
}
v_invalid_budget = core_lte(&[v_effective_budget_chars.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_invalid_budget) {
return Ok(v_ok_id.clone());
}
v_ratio = core_div(&[
v_mutable_prompt_chars.clone(),
v_effective_budget_chars.clone(),
])?;
v_critical = core_gte(&[v_ratio.clone(), v_critical_threshold.clone()])?;
if core_truthy(&v_critical) {
return Ok(v_critical_id.clone());
}
v_watch = core_gte(&[v_ratio.clone(), v_watch_threshold.clone()])?;
if core_truthy(&v_watch) {
return Ok(v_watch_id.clone());
}
return Ok(v_ok_id.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_render_context_pressure(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_render_context_pressure");
let mut v_pressure = core_arg(args, 0);
let mut v_context_registry = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_empty_text = CoreValue::Null;
let mut v_level = CoreValue::Null;
let mut v_ok_level = CoreValue::Null;
let mut v_pressure_levels = CoreValue::Null;
let mut v_text = CoreValue::Null;
v_context_registry = _agent_context_policy_registry(&[])?;
v_empty_map = CoreValue::new_map();
v_pressure_levels = core_get(
&v_context_registry,
&CoreValue::from("pressure_levels"),
v_empty_map.clone(),
);
v_level = core_get(&v_pressure_levels, &v_pressure.clone(), v_empty_map.clone());
v_text = core_get(&v_level, &CoreValue::from("text"), CoreValue::from(""));
v_empty_text = core_eq(&[v_text.clone(), CoreValue::from("")])?;
if core_truthy(&v_empty_text) {
v_ok_level = core_get(
&v_pressure_levels,
&CoreValue::from("ok"),
v_empty_map.clone(),
);
v_text = core_get(
&v_ok_level,
&CoreValue::from("text"),
CoreValue::from(
"ok - normal context pressure; continue with focused, useful inspections.",
),
);
}
return Ok(v_text.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_smart_stringify(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_smart_stringify");
let mut v_value = core_arg(args, 0);
let mut v_max_chars = core_arg(args, 1);
let mut v_array_head_items = CoreValue::Null;
let mut v_array_tail_items = CoreValue::Null;
let mut v_array_threshold = CoreValue::Null;
let mut v_context_registry = CoreValue::Null;
let mut v_count = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_head = CoreValue::Null;
let mut v_head_text = CoreValue::Null;
let mut v_hidden = CoreValue::Null;
let mut v_in_head = CoreValue::Null;
let mut v_in_tail = CoreValue::Null;
let mut v_index = CoreValue::Null;
let mut v_is_list = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_item_text = CoreValue::Null;
let mut v_json = CoreValue::Null;
let mut v_large = CoreValue::Null;
let mut v_negative_tail_items = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_settings = CoreValue::Null;
let mut v_tail = CoreValue::Null;
let mut v_tail_start = CoreValue::Null;
let mut v_tail_text = CoreValue::Null;
v_context_registry = _agent_context_policy_registry(&[])?;
v_empty_map = CoreValue::new_map();
v_settings = core_get(
&v_context_registry,
&CoreValue::from("smart_stringify"),
v_empty_map.clone(),
);
v_array_threshold = core_get(
&v_settings,
&CoreValue::from("arrayThreshold"),
CoreValue::Num(10f64),
);
v_array_head_items = core_get(
&v_settings,
&CoreValue::from("arrayHeadItems"),
CoreValue::Num(3f64),
);
v_array_tail_items = core_get(
&v_settings,
&CoreValue::from("arrayTailItems"),
CoreValue::Num(2f64),
);
v_is_list = core_type_is(&v_value, CoreValue::from("list"));
if core_truthy(&v_is_list) {
v_count = core_len(&[v_value.clone()])?;
v_large = core_gt(&[v_count.clone(), v_array_threshold.clone()])?;
if core_truthy(&v_large) {
v_head = CoreValue::new_list();
v_tail = CoreValue::new_list();
v_negative_tail_items = core_mul(&[CoreValue::Num(-1f64), v_array_tail_items.clone()])?;
v_tail_start = core_add(&[v_count.clone(), v_negative_tail_items.clone()])?;
v_index = CoreValue::Num(0f64);
for v_item in core_iter(&v_value)? {
let mut v_item = v_item;
v_item_text = core_json_stringify(&[v_item.clone()])?;
v_in_head = core_lt(&[v_index.clone(), v_array_head_items.clone()])?;
if core_truthy(&v_in_head) {
core_append(&v_head, v_item_text.clone())?;
}
v_in_tail = core_gte(&[v_index.clone(), v_tail_start.clone()])?;
if core_truthy(&v_in_tail) {
core_append(&v_tail, v_item_text.clone())?;
}
v_index = core_add(&[v_index.clone(), CoreValue::Num(1f64)])?;
}
v_head_text = core_string_join_intrinsic(&[CoreValue::from(",\n "), v_head.clone()])?;
v_tail_text = core_string_join_intrinsic(&[CoreValue::from(",\n "), v_tail.clone()])?;
v_hidden = core_add(&[v_count.clone(), CoreValue::Num(-5f64)])?;
v_out = core_string_format(&[
CoreValue::from("[\n {},\n ... [{} hidden items],\n {}\n]"),
v_head_text.clone(),
v_hidden.clone(),
v_tail_text.clone(),
])?;
return Ok(v_out.clone());
}
}
v_json = core_json_pretty(&[v_value.clone()])?;
return Ok(v_json.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_record_context_event(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_record_context_event");
let mut v_state = core_arg(args, 0);
let mut v_event = core_arg(args, 1);
let mut v_empty_list = CoreValue::Null;
let mut v_events = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_events = core_get(
&v_state,
&CoreValue::from("context_events"),
v_empty_list.clone(),
);
core_append(&v_events, v_event.clone())?;
core_set(
&v_state,
CoreValue::from("context_events"),
v_events.clone(),
)?;
return Ok(v_event.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_entry_turn(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_entry_turn");
let mut v_entry = core_arg(args, 0);
let mut v_fallback = core_arg(args, 1);
let mut v_turn = CoreValue::Null;
v_turn = core_get(&v_entry, &CoreValue::from("turn"), v_fallback.clone());
return Ok(v_turn.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_entry_is_error(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_entry_is_error");
let mut v_entry = core_arg(args, 0);
let mut v_is_error = CoreValue::Null;
let mut v_tag_error = CoreValue::Null;
let mut v_tags = CoreValue::Null;
let mut v_tags_is_list = CoreValue::Null;
v_tags = core_get(&v_entry, &CoreValue::from("tags"), CoreValue::Null);
v_tags_is_list = core_type_is(&v_tags, CoreValue::from("list"));
if core_truthy(&v_tags_is_list) {
} else {
v_tags = CoreValue::new_list();
}
v_tag_error = core_contains(&[v_tags.clone(), CoreValue::from("error")])?;
v_is_error = core_get(&v_entry, &CoreValue::from("is_error"), v_tag_error.clone());
return Ok(v_is_error.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_entry_summary(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_entry_summary");
let mut v_entry = core_arg(args, 0);
let mut v_fallback_turn = core_arg(args, 1);
let mut v_has_summary = CoreValue::Null;
let mut v_has_tombstone = CoreValue::Null;
let mut v_is_error = CoreValue::Null;
let mut v_kind = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_preview = CoreValue::Null;
let mut v_summary = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_tombstone = CoreValue::Null;
let mut v_turn = CoreValue::Null;
v_tombstone = core_get(&v_entry, &CoreValue::from("tombstone"), CoreValue::from(""));
v_has_tombstone = core_ne(&[v_tombstone.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_tombstone) {
return Ok(v_tombstone.clone());
}
v_turn = _agent_entry_turn(&[v_entry.clone(), v_fallback_turn.clone()])?;
v_summary = core_get(&v_entry, &CoreValue::from("summary"), CoreValue::from(""));
v_has_summary = core_ne(&[v_summary.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_summary) {
return Ok(v_summary.clone());
}
v_kind = core_get(
&v_entry,
&CoreValue::from("kind"),
CoreValue::from("result"),
);
v_output = core_get(&v_entry, &CoreValue::from("output"), CoreValue::from(""));
v_preview = core_string_slice(&[
v_output.clone(),
CoreValue::Num(0f64),
CoreValue::Num(180f64),
])?;
v_text = core_string_format(&[
CoreValue::from("{} turn result: {}"),
v_kind.clone(),
v_preview.clone(),
])?;
v_is_error = _agent_entry_is_error(&[v_entry.clone()])?;
if core_truthy(&v_is_error) {
v_text = core_string_format(&[
CoreValue::from("error turn {}: {}"),
v_turn.clone(),
v_preview.clone(),
])?;
}
return Ok(v_text.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_entry_callables_text(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_entry_callables_text");
let mut v_entry = core_arg(args, 0);
let mut v_call = CoreValue::Null;
let mut v_calls = CoreValue::Null;
let mut v_calls_is_list = CoreValue::Null;
let mut v_count = CoreValue::Null;
let mut v_direct = CoreValue::Null;
let mut v_direct_is_list = CoreValue::Null;
let mut v_direct_name = CoreValue::Null;
let mut v_empty = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_has_direct = CoreValue::Null;
let mut v_has_qualified = CoreValue::Null;
let mut v_known = CoreValue::Null;
let mut v_known_direct = CoreValue::Null;
let mut v_names = CoreValue::Null;
let mut v_new_direct = CoreValue::Null;
let mut v_new_name = CoreValue::Null;
let mut v_qualified = CoreValue::Null;
let mut v_text = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_calls = core_get(
&v_entry,
&CoreValue::from("_functionCalls"),
v_empty_list.clone(),
);
v_names = CoreValue::new_list();
v_calls_is_list = core_type_is(&v_calls, CoreValue::from("list"));
if core_truthy(&v_calls_is_list) {
for v_call in core_iter(&v_calls)? {
let mut v_call = v_call;
v_qualified = core_get(
&v_call,
&CoreValue::from("qualifiedName"),
CoreValue::from(""),
);
v_has_qualified = core_ne(&[v_qualified.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_qualified) {
v_known = core_contains(&[v_names.clone(), v_qualified.clone()])?;
v_new_name = core_not(&[v_known.clone()])?;
if core_truthy(&v_new_name) {
core_append(&v_names, v_qualified.clone())?;
}
}
}
}
v_direct = core_get(
&v_entry,
&CoreValue::from("_directQualifiedCalls"),
v_empty_list.clone(),
);
v_direct_is_list = core_type_is(&v_direct, CoreValue::from("list"));
if core_truthy(&v_direct_is_list) {
for v_direct_name in core_iter(&v_direct)? {
let mut v_direct_name = v_direct_name;
v_has_direct = core_ne(&[v_direct_name.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_direct) {
v_known_direct = core_contains(&[v_names.clone(), v_direct_name.clone()])?;
v_new_direct = core_not(&[v_known_direct.clone()])?;
if core_truthy(&v_new_direct) {
core_append(&v_names, v_direct_name.clone())?;
}
}
}
}
v_count = core_len(&[v_names.clone()])?;
v_empty = core_eq(&[v_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_empty) {
return Ok(CoreValue::from("none"));
}
v_text = core_string_join_intrinsic(&[CoreValue::from(", "), v_names.clone()])?;
return Ok(v_text.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_distill_structured_action_output(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_distill_structured_action_output");
let mut v_output = core_arg(args, 0);
let mut v_clean_counts = CoreValue::Null;
let mut v_counts = CoreValue::Null;
let mut v_detail = CoreValue::Null;
let mut v_failure = CoreValue::Null;
let mut v_has_failed_count = CoreValue::Null;
let mut v_has_failed_line = CoreValue::Null;
let mut v_has_passed = CoreValue::Null;
let mut v_json_distill = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_line_counts = CoreValue::Null;
let mut v_line_has_failed = CoreValue::Null;
let mut v_line_has_passed = CoreValue::Null;
let mut v_line_is_failure = CoreValue::Null;
let mut v_lines = CoreValue::Null;
let mut v_long_output = CoreValue::Null;
let mut v_looks_json_array = CoreValue::Null;
let mut v_looks_test = CoreValue::Null;
let mut v_no_failure_yet = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_out_json = CoreValue::Null;
let mut v_output_len = CoreValue::Null;
let mut v_preview = CoreValue::Null;
let mut v_take_failure = CoreValue::Null;
let mut v_test_name = CoreValue::Null;
v_has_failed_line = core_contains(&[v_output.clone(), CoreValue::from("FAILED ")])?;
v_has_passed = core_contains(&[v_output.clone(), CoreValue::from(" passed")])?;
v_has_failed_count = core_contains(&[v_output.clone(), CoreValue::from(" failed")])?;
v_looks_test = core_and(&[v_has_failed_line.clone(), v_has_passed.clone()])?;
v_looks_test = core_and(&[v_looks_test.clone(), v_has_failed_count.clone()])?;
if core_truthy(&v_looks_test) {
v_lines = core_string_split_trim_nonempty(&[v_output.clone(), CoreValue::from("\n")])?;
v_failure = CoreValue::from("");
v_counts = CoreValue::from("");
for v_line in core_iter(&v_lines)? {
let mut v_line = v_line;
v_line_is_failure =
core_string_starts_with(&[v_line.clone(), CoreValue::from("FAILED ")])?;
v_no_failure_yet = core_eq(&[v_failure.clone(), CoreValue::from("")])?;
v_take_failure = core_and(&[v_line_is_failure.clone(), v_no_failure_yet.clone()])?;
if core_truthy(&v_take_failure) {
v_failure = v_line.clone();
}
v_line_has_passed = core_contains(&[v_line.clone(), CoreValue::from(" passed")])?;
v_line_has_failed = core_contains(&[v_line.clone(), CoreValue::from(" failed")])?;
v_line_counts = core_and(&[v_line_has_passed.clone(), v_line_has_failed.clone()])?;
if core_truthy(&v_line_counts) {
v_counts = v_line.clone();
}
}
v_clean_counts = core_regex_replace(&[
CoreValue::from("^=+\\s*"),
CoreValue::from(""),
v_counts.clone(),
])?;
v_clean_counts = core_regex_replace(&[
CoreValue::from("\\s*=+$"),
CoreValue::from(""),
v_clean_counts.clone(),
])?;
v_clean_counts = core_regex_replace(&[
CoreValue::from("\\s+in\\s+.*$"),
CoreValue::from(""),
v_clean_counts.clone(),
])?;
v_test_name = core_regex_replace(&[
CoreValue::from("^FAILED\\s+"),
CoreValue::from(""),
v_failure.clone(),
])?;
v_test_name = core_regex_replace(&[
CoreValue::from("\\s+-\\s+.*$"),
CoreValue::from(""),
v_test_name.clone(),
])?;
v_detail = core_string_slice(&[
v_failure.clone(),
CoreValue::Num(0f64),
CoreValue::Num(180f64),
])?;
v_out = core_string_format(&[
CoreValue::from("[DISTILLED:test-output]: {}\nFailures: {}\nError details: {}"),
v_clean_counts.clone(),
v_test_name.clone(),
v_detail.clone(),
])?;
return Ok(v_out.clone());
}
v_looks_json_array = core_string_starts_with(&[v_output.clone(), CoreValue::from("[")])?;
v_output_len = core_len(&[v_output.clone()])?;
v_long_output = core_gt(&[v_output_len.clone(), CoreValue::Num(220f64)])?;
v_json_distill = core_and(&[v_looks_json_array.clone(), v_long_output.clone()])?;
if core_truthy(&v_json_distill) {
v_preview = core_string_slice(&[
v_output.clone(),
CoreValue::Num(0f64),
CoreValue::Num(180f64),
])?;
v_out_json = core_string_format(&[
CoreValue::from("[DISTILLED:json]: array\nPreview: {}"),
v_preview.clone(),
])?;
return Ok(v_out_json.clone());
}
return Ok(CoreValue::from(""));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_render_full_action_entry(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_render_full_action_entry");
let mut v_state = core_arg(args, 0);
let mut v_entry = core_arg(args, 1);
let mut v_code = CoreValue::Null;
let mut v_fence = CoreValue::Null;
let mut v_full_err_text = CoreValue::Null;
let mut v_full_error = CoreValue::Null;
let mut v_full_is_error = CoreValue::Null;
let mut v_full_output_has = CoreValue::Null;
let mut v_has_tombstone = CoreValue::Null;
let mut v_is_final_action = CoreValue::Null;
let mut v_js_fence = CoreValue::Null;
let mut v_kind = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_runtime_contract = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_tombstone = CoreValue::Null;
v_tombstone = core_get(&v_entry, &CoreValue::from("tombstone"), CoreValue::from(""));
v_has_tombstone = core_ne(&[v_tombstone.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_tombstone) {
return Ok(v_tombstone.clone());
}
v_runtime_contract = core_get(
&v_state,
&CoreValue::from("runtime_contract"),
CoreValue::Null,
);
v_fence = core_get(
&v_runtime_contract,
&CoreValue::from("code_fence_language"),
CoreValue::from("javascript"),
);
v_js_fence = core_eq(&[v_fence.clone(), CoreValue::from("js")])?;
if core_truthy(&v_js_fence) {
v_fence = CoreValue::from("javascript");
}
v_code = core_get(&v_entry, &CoreValue::from("code"), CoreValue::from(""));
v_output = core_get(&v_entry, &CoreValue::from("output"), CoreValue::from(""));
v_kind = core_get(&v_entry, &CoreValue::from("kind"), CoreValue::from(""));
v_is_final_action = core_eq(&[v_kind.clone(), CoreValue::from("final")])?;
if core_truthy(&v_is_final_action) {
v_code = CoreValue::from("// final() completed; evidence omitted from actor prompt");
}
v_full_is_error = core_get(
&v_entry,
&CoreValue::from("is_error"),
CoreValue::Bool(false),
);
if core_truthy(&v_full_is_error) {
v_full_error = core_get(&v_entry, &CoreValue::from("error"), CoreValue::from(""));
v_full_err_text =
core_string_format(&[CoreValue::from("[runtime error] {}"), v_full_error.clone()])?;
v_full_output_has = core_ne(&[v_output.clone(), CoreValue::from("")])?;
if core_truthy(&v_full_output_has) {
v_output = core_string_format(&[
CoreValue::from("{}\n{}"),
v_output.clone(),
v_full_err_text.clone(),
])?;
} else {
v_output = v_full_err_text.clone();
}
}
v_text = core_string_format(&[
CoreValue::from("```{}\n{}\n```\nResult:\n{}"),
v_fence.clone(),
v_code.clone(),
v_output.clone(),
])?;
return Ok(v_text.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_render_compact_action_entry(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_render_compact_action_entry");
let mut v_entry = core_arg(args, 0);
let mut v_turn = core_arg(args, 1);
let mut v_reason = core_arg(args, 2);
let mut v_callables = CoreValue::Null;
let mut v_compact_error = CoreValue::Null;
let mut v_compact_is_error = CoreValue::Null;
let mut v_distilled = CoreValue::Null;
let mut v_has_distilled = CoreValue::Null;
let mut v_head = CoreValue::Null;
let mut v_kind = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_preview = CoreValue::Null;
let mut v_state_delta = CoreValue::Null;
let mut v_tail = CoreValue::Null;
let mut v_text = CoreValue::Null;
v_kind = core_get(
&v_entry,
&CoreValue::from("kind"),
CoreValue::from("result"),
);
v_state_delta = core_get(
&v_entry,
&CoreValue::from("stateDelta"),
CoreValue::from("No durable runtime state update"),
);
v_output = core_get(&v_entry, &CoreValue::from("output"), CoreValue::from(""));
v_compact_is_error = core_get(
&v_entry,
&CoreValue::from("is_error"),
CoreValue::Bool(false),
);
if core_truthy(&v_compact_is_error) {
v_compact_error = core_get(&v_entry, &CoreValue::from("error"), CoreValue::from(""));
v_output = core_string_format(&[
CoreValue::from("[runtime error] {}"),
v_compact_error.clone(),
])?;
}
v_callables = _agent_entry_callables_text(&[v_entry.clone()])?;
v_distilled = _agent_distill_structured_action_output(&[v_output.clone()])?;
v_has_distilled = core_ne(&[v_distilled.clone(), CoreValue::from("")])?;
v_preview = core_string_slice(&[
v_output.clone(),
CoreValue::Num(0f64),
CoreValue::Num(180f64),
])?;
if core_truthy(&v_has_distilled) {
v_preview = v_distilled.clone();
}
v_head = core_string_format(&[
CoreValue::from("[COMPACT:{}]: Turn {}. {} step."),
v_reason.clone(),
v_turn.clone(),
v_kind.clone(),
])?;
v_tail = core_string_format(&[
CoreValue::from(" State: {}. Callables: {}. Result: {}."),
v_state_delta.clone(),
v_callables.clone(),
v_preview.clone(),
])?;
v_text = core_add(&[v_head.clone(), v_tail.clone()])?;
return Ok(v_text.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_fallback_checkpoint_summary(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_fallback_checkpoint_summary");
let mut v_entries = core_arg(args, 0);
let mut v_turns = core_arg(args, 1);
let mut v_all_working = CoreValue::Null;
let mut v_artifact = CoreValue::Null;
let mut v_artifact_text = CoreValue::Null;
let mut v_artifacts = CoreValue::Null;
let mut v_covered = CoreValue::Null;
let mut v_empty_artifact = CoreValue::Null;
let mut v_empty_evidence = CoreValue::Null;
let mut v_empty_failures = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_evidence = CoreValue::Null;
let mut v_evidence_text = CoreValue::Null;
let mut v_failure_text = CoreValue::Null;
let mut v_failures = CoreValue::Null;
let mut v_fallback = CoreValue::Null;
let mut v_has_state = CoreValue::Null;
let mut v_has_working = CoreValue::Null;
let mut v_head_summary = CoreValue::Null;
let mut v_is_error = CoreValue::Null;
let mut v_kind = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_objective = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_preview = CoreValue::Null;
let mut v_state_delta = CoreValue::Null;
let mut v_summary = CoreValue::Null;
let mut v_tail_summary = CoreValue::Null;
let mut v_turn = CoreValue::Null;
let mut v_turn_count = CoreValue::Null;
let mut v_working = CoreValue::Null;
let mut v_working_count = CoreValue::Null;
let mut v_working_text = CoreValue::Null;
let mut v_working_turns = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_evidence = CoreValue::new_list();
v_failures = CoreValue::new_list();
v_artifacts = CoreValue::new_list();
v_objective = CoreValue::from("explore");
v_fallback = CoreValue::Num(1f64);
for v_entry in core_iter(&v_entries)? {
let mut v_entry = v_entry;
v_turn = _agent_entry_turn(&[v_entry.clone(), v_fallback.clone()])?;
v_covered = core_contains(&[v_turns.clone(), v_turn.clone()])?;
if core_truthy(&v_covered) {
v_kind = core_get(
&v_entry,
&CoreValue::from("kind"),
CoreValue::from("result"),
);
v_objective = v_kind.clone();
v_output = core_get(&v_entry, &CoreValue::from("output"), CoreValue::from(""));
v_preview = core_string_slice(&[
v_output.clone(),
CoreValue::Num(0f64),
CoreValue::Num(200f64),
])?;
v_line = core_string_format(&[
CoreValue::from("Turn {}: {}"),
v_turn.clone(),
v_preview.clone(),
])?;
core_append(&v_evidence, v_line.clone())?;
v_state_delta = core_get(
&v_entry,
&CoreValue::from("stateDelta"),
CoreValue::from(""),
);
v_has_state = core_ne(&[v_state_delta.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_state) {
v_artifact = core_string_format(&[
CoreValue::from("Turn {}: {}"),
v_turn.clone(),
v_state_delta.clone(),
])?;
core_append(&v_artifacts, v_artifact.clone())?;
}
v_is_error = _agent_entry_is_error(&[v_entry.clone()])?;
if core_truthy(&v_is_error) {
core_append(&v_failures, v_line.clone())?;
}
}
v_fallback = core_add(&[v_fallback.clone(), CoreValue::Num(1f64)])?;
}
v_artifact_text = core_string_join_intrinsic(&[CoreValue::from(" | "), v_artifacts.clone()])?;
v_evidence_text = core_string_join_intrinsic(&[CoreValue::from(" | "), v_evidence.clone()])?;
v_failure_text = core_string_join_intrinsic(&[CoreValue::from(" | "), v_failures.clone()])?;
v_empty_artifact = core_eq(&[v_artifact_text.clone(), CoreValue::from("")])?;
if core_truthy(&v_empty_artifact) {
v_artifact_text =
CoreValue::from("Continue from liveRuntimeState and recent full action replay.");
}
v_empty_evidence = core_eq(&[v_evidence_text.clone(), CoreValue::from("")])?;
if core_truthy(&v_empty_evidence) {
v_evidence_text = CoreValue::from("none");
}
v_empty_failures = core_eq(&[v_failure_text.clone(), CoreValue::from("")])?;
if core_truthy(&v_empty_failures) {
v_failure_text = CoreValue::from("none");
}
v_head_summary = core_string_format(&[CoreValue::from("Objective: {}\nCurrent state and artifacts: {}\nExact callables and formats: none\nEvidence: {}"), v_objective.clone(), v_artifact_text.clone(), v_evidence_text.clone()])?;
v_tail_summary = core_string_format(&[CoreValue::from("\nUser constraints and preferences: none\nFailures to avoid: {}\nNext step: Continue from the latest live runtime state."), v_failure_text.clone()])?;
v_summary = core_add(&[v_head_summary.clone(), v_tail_summary.clone()])?;
v_working = _agent_working_code_state(&[v_entries.clone(), v_turns.clone()])?;
v_working_text = core_get(&v_working, &CoreValue::from("text"), CoreValue::from(""));
v_working_turns = core_get(&v_working, &CoreValue::from("turns"), v_empty_list.clone());
v_working_count = core_len(&[v_working_turns.clone()])?;
v_turn_count = core_len(&[v_turns.clone()])?;
v_has_working = core_ne(&[v_working_text.clone(), CoreValue::from("")])?;
v_all_working = core_eq(&[v_working_count.clone(), v_turn_count.clone()])?;
if core_truthy(&v_has_working) {
if core_truthy(&v_all_working) {
v_summary = v_working_text.clone();
} else {
v_summary = core_string_format(&[
CoreValue::from("{}\n\n{}"),
v_working_text.clone(),
v_summary.clone(),
])?;
}
}
return Ok(v_summary.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_build_deterministic_tombstone(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_build_deterministic_tombstone");
let mut v_error_entry = core_arg(args, 0);
let mut v_resolution_entry = core_arg(args, 1);
let mut v_empty_signature = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_resolved_turn = CoreValue::Null;
let mut v_signature = CoreValue::Null;
let mut v_text = CoreValue::Null;
v_output = core_get(
&v_error_entry,
&CoreValue::from("output"),
CoreValue::from(""),
);
v_signature = core_string_slice(&[
v_output.clone(),
CoreValue::Num(0f64),
CoreValue::Num(96f64),
])?;
v_empty_signature = core_eq(&[v_signature.clone(), CoreValue::from("")])?;
if core_truthy(&v_empty_signature) {
v_signature = CoreValue::from("runtime error");
}
v_resolved_turn = _agent_entry_turn(&[v_resolution_entry.clone(), CoreValue::Num(0f64)])?;
v_text = core_string_format(&[
CoreValue::from("[TOMBSTONE]: Resolved {} in turn {}."),
v_signature.clone(),
v_resolved_turn.clone(),
])?;
return Ok(v_text.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_apply_context_management(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_apply_context_management");
let mut v_state = core_arg(args, 0);
let mut v_count = CoreValue::Null;
let mut v_current_is_error = CoreValue::Null;
let mut v_current_success = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_enabled = CoreValue::Null;
let mut v_entries = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_err_code = CoreValue::Null;
let mut v_err_output = CoreValue::Null;
let mut v_error_pruning = CoreValue::Null;
let mut v_event = CoreValue::Null;
let mut v_existing = CoreValue::Null;
let mut v_has_pairs = CoreValue::Null;
let mut v_has_prev = CoreValue::Null;
let mut v_kind = CoreValue::Null;
let mut v_llm_input = CoreValue::Null;
let mut v_missing = CoreValue::Null;
let mut v_policy = CoreValue::Null;
let mut v_prev = CoreValue::Null;
let mut v_prev_is_error = CoreValue::Null;
let mut v_res_code = CoreValue::Null;
let mut v_resolved = CoreValue::Null;
let mut v_resolved_turn = CoreValue::Null;
let mut v_summary_chars = CoreValue::Null;
let mut v_tomb_is_obj = CoreValue::Null;
let mut v_tomb_is_true = CoreValue::Null;
let mut v_tombstone = CoreValue::Null;
let mut v_tombstoning = CoreValue::Null;
let mut v_turn = CoreValue::Null;
let mut v_want_llm = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_entries = core_get(
&v_state,
&CoreValue::from("action_log"),
v_empty_list.clone(),
);
v_policy = core_get(
&v_state,
&CoreValue::from("context_policy"),
CoreValue::Null,
);
v_error_pruning = core_get(
&v_policy,
&CoreValue::from("errorPruning"),
CoreValue::Bool(false),
);
v_tombstoning = core_get(
&v_policy,
&CoreValue::from("tombstoning"),
CoreValue::Bool(false),
);
v_enabled = core_or(&[v_error_pruning.clone(), v_tombstoning.clone()])?;
if core_truthy(&v_enabled) {
} else {
return Ok(v_entries.clone());
}
v_count = core_len(&[v_entries.clone()])?;
v_has_pairs = core_gt(&[v_count.clone(), CoreValue::Num(1f64)])?;
if core_truthy(&v_has_pairs) {
} else {
return Ok(v_entries.clone());
}
v_prev = core_none(&[])?;
v_has_prev = CoreValue::Bool(false);
for v_entry in core_iter(&v_entries)? {
let mut v_entry = v_entry;
if core_truthy(&v_has_prev) {
v_prev_is_error = _agent_entry_is_error(&[v_prev.clone()])?;
v_current_is_error = _agent_entry_is_error(&[v_entry.clone()])?;
v_current_success = core_not(&[v_current_is_error.clone()])?;
v_resolved = core_and(&[v_prev_is_error.clone(), v_current_success.clone()])?;
if core_truthy(&v_resolved) {
v_existing = core_get(&v_prev, &CoreValue::from("tombstone"), CoreValue::from(""));
v_missing = core_eq(&[v_existing.clone(), CoreValue::from("")])?;
if core_truthy(&v_missing) {
v_tombstone =
_agent_build_deterministic_tombstone(&[v_prev.clone(), v_entry.clone()])?;
core_set(&v_prev, CoreValue::from("tombstone"), v_tombstone.clone())?;
v_event = CoreValue::new_map();
v_kind = _agent_context_event_name(&[CoreValue::from("tombstone_created")])?;
core_set(&v_event, CoreValue::from("kind"), v_kind.clone())?;
core_set(
&v_event,
CoreValue::from("stage"),
CoreValue::from("executor"),
)?;
v_turn = _agent_entry_turn(&[v_prev.clone(), CoreValue::Num(0f64)])?;
v_resolved_turn = _agent_entry_turn(&[v_entry.clone(), CoreValue::Num(0f64)])?;
core_set(&v_event, CoreValue::from("turn"), v_turn.clone())?;
core_set(
&v_event,
CoreValue::from("resolvedByTurn"),
v_resolved_turn.clone(),
)?;
core_set(
&v_event,
CoreValue::from("source"),
CoreValue::from("deterministic"),
)?;
v_summary_chars = core_len(&[v_tombstone.clone()])?;
core_set(
&v_event,
CoreValue::from("summaryChars"),
v_summary_chars.clone(),
)?;
_agent_record_context_event(&[v_state.clone(), v_event.clone()])?;
v_tomb_is_true = core_eq(&[v_tombstoning.clone(), CoreValue::Bool(true)])?;
v_tomb_is_obj = core_type_is(&v_tombstoning, CoreValue::from("object"));
v_want_llm = core_or(&[v_tomb_is_true.clone(), v_tomb_is_obj.clone()])?;
if core_truthy(&v_want_llm) {
core_set(
&v_prev,
CoreValue::from("tombstone_llm_pending"),
CoreValue::Bool(true),
)?;
v_err_code =
core_get(&v_prev, &CoreValue::from("code"), CoreValue::from(""));
v_err_output =
core_get(&v_prev, &CoreValue::from("output"), CoreValue::from(""));
v_res_code =
core_get(&v_entry, &CoreValue::from("code"), CoreValue::from(""));
v_llm_input = core_string_format(&[
CoreValue::from(
"errorCode:\n{}\n\nerrorOutput:\n{}\n\nresolutionCode:\n{}",
),
v_err_code.clone(),
v_err_output.clone(),
v_res_code.clone(),
])?;
core_set(
&v_prev,
CoreValue::from("tombstone_llm_input"),
v_llm_input.clone(),
)?;
}
}
}
}
v_prev = v_entry.clone();
v_has_prev = CoreValue::Bool(true);
}
core_set(&v_state, CoreValue::from("action_log"), v_entries.clone())?;
return Ok(v_entries.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_apply_llm_tombstone_summary(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_apply_llm_tombstone_summary");
let mut v_state = core_arg(args, 0);
let mut v_client = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_empty_list = CoreValue::Null;
let mut v_entries = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_event = CoreValue::Null;
let mut v_has_text = CoreValue::Null;
let mut v_instruction = CoreValue::Null;
let mut v_kind = CoreValue::Null;
let mut v_llm_input = CoreValue::Null;
let mut v_pending = CoreValue::Null;
let mut v_summary_chars = CoreValue::Null;
let mut v_tombstone = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_entries = core_get(
&v_state,
&CoreValue::from("action_log"),
v_empty_list.clone(),
);
for v_entry in core_iter(&v_entries)? {
let mut v_entry = v_entry;
v_pending = core_get(
&v_entry,
&CoreValue::from("tombstone_llm_pending"),
CoreValue::Bool(false),
);
if core_truthy(&v_pending) {
v_llm_input = core_get(
&v_entry,
&CoreValue::from("tombstone_llm_input"),
CoreValue::from(""),
);
v_instruction = CoreValue::from("You are an internal AxAgent tombstone summarizer.\n\nWrite the output as exactly one concise line.\n- Start with [TOMBSTONE]:\n- Summarize the resolved error and the successful fix.\n- Mention one failed approach to avoid when possible.\n- Do not include code fences, bullet points, or extra prose.\n- Keep it roughly 20-40 tokens.");
v_tombstone = _context_map_complete(&[
v_client.clone(),
v_instruction.clone(),
v_llm_input.clone(),
])?;
v_has_text = core_ne(&[v_tombstone.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_text) {
core_set(&v_entry, CoreValue::from("tombstone"), v_tombstone.clone())?;
core_set(
&v_entry,
CoreValue::from("tombstone_source"),
CoreValue::from("model"),
)?;
core_set(
&v_entry,
CoreValue::from("tombstone_llm_pending"),
CoreValue::Bool(false),
)?;
v_event = CoreValue::new_map();
v_kind = _agent_context_event_name(&[CoreValue::from("tombstone_created")])?;
core_set(&v_event, CoreValue::from("kind"), v_kind.clone())?;
core_set(
&v_event,
CoreValue::from("stage"),
CoreValue::from("executor"),
)?;
core_set(
&v_event,
CoreValue::from("source"),
CoreValue::from("model"),
)?;
v_summary_chars = core_len(&[v_tombstone.clone()])?;
core_set(
&v_event,
CoreValue::from("summaryChars"),
v_summary_chars.clone(),
)?;
_agent_record_context_event(&[v_state.clone(), v_event.clone()])?;
}
}
}
core_set(&v_state, CoreValue::from("action_log"), v_entries.clone())?;
return Ok(v_state.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_working_code_state(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_working_code_state");
let mut v_entries = core_arg(args, 0);
let mut v_turns = core_arg(args, 1);
let mut v_block = CoreValue::Null;
let mut v_block_head = CoreValue::Null;
let mut v_block_tail = CoreValue::Null;
let mut v_blocks = CoreValue::Null;
let mut v_body = CoreValue::Null;
let mut v_callables = CoreValue::Null;
let mut v_code = CoreValue::Null;
let mut v_code_head = CoreValue::Null;
let mut v_code_len = CoreValue::Null;
let mut v_code_too_long = CoreValue::Null;
let mut v_coverable2 = CoreValue::Null;
let mut v_coverable_count = CoreValue::Null;
let mut v_covered = CoreValue::Null;
let mut v_covered2 = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_entry2 = CoreValue::Null;
let mut v_fallback = CoreValue::Null;
let mut v_fallback2 = CoreValue::Null;
let mut v_has_body = CoreValue::Null;
let mut v_has_tombstone = CoreValue::Null;
let mut v_has_tombstone2 = CoreValue::Null;
let mut v_include = CoreValue::Null;
let mut v_include_working = CoreValue::Null;
let mut v_index = CoreValue::Null;
let mut v_is_error = CoreValue::Null;
let mut v_is_error2 = CoreValue::Null;
let mut v_more_than_two = CoreValue::Null;
let mut v_not_error = CoreValue::Null;
let mut v_not_error2 = CoreValue::Null;
let mut v_not_tombstone = CoreValue::Null;
let mut v_not_tombstone2 = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_output_preview = CoreValue::Null;
let mut v_produced = CoreValue::Null;
let mut v_produced_empty = CoreValue::Null;
let mut v_produced_text = CoreValue::Null;
let mut v_read_empty = CoreValue::Null;
let mut v_read_text = CoreValue::Null;
let mut v_reads = CoreValue::Null;
let mut v_reads_is_list = CoreValue::Null;
let mut v_start = CoreValue::Null;
let mut v_state_delta = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_tombstone = CoreValue::Null;
let mut v_tombstone2 = CoreValue::Null;
let mut v_turn = CoreValue::Null;
let mut v_turn2 = CoreValue::Null;
let mut v_working_turns = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_working_turns = CoreValue::new_list();
v_coverable_count = CoreValue::Num(0f64);
v_fallback = CoreValue::Num(1f64);
for v_entry in core_iter(&v_entries)? {
let mut v_entry = v_entry;
v_turn = _agent_entry_turn(&[v_entry.clone(), v_fallback.clone()])?;
v_covered = core_contains(&[v_turns.clone(), v_turn.clone()])?;
v_is_error = _agent_entry_is_error(&[v_entry.clone()])?;
v_not_error = core_not(&[v_is_error.clone()])?;
v_tombstone = core_get(&v_entry, &CoreValue::from("tombstone"), CoreValue::from(""));
v_has_tombstone = core_ne(&[v_tombstone.clone(), CoreValue::from("")])?;
v_not_tombstone = core_not(&[v_has_tombstone.clone()])?;
v_include = core_and(&[v_covered.clone(), v_not_error.clone()])?;
v_include = core_and(&[v_include.clone(), v_not_tombstone.clone()])?;
if core_truthy(&v_include) {
v_coverable_count = core_add(&[v_coverable_count.clone(), CoreValue::Num(1f64)])?;
}
v_fallback = core_add(&[v_fallback.clone(), CoreValue::Num(1f64)])?;
}
v_start = CoreValue::Num(0f64);
v_more_than_two = core_gt(&[v_coverable_count.clone(), CoreValue::Num(2f64)])?;
if core_truthy(&v_more_than_two) {
v_start = core_add(&[v_coverable_count.clone(), CoreValue::Num(-2f64)])?;
}
v_blocks = CoreValue::new_list();
v_index = CoreValue::Num(0f64);
v_fallback2 = CoreValue::Num(1f64);
for v_entry2 in core_iter(&v_entries)? {
let mut v_entry2 = v_entry2;
v_turn2 = _agent_entry_turn(&[v_entry2.clone(), v_fallback2.clone()])?;
v_covered2 = core_contains(&[v_turns.clone(), v_turn2.clone()])?;
v_is_error2 = _agent_entry_is_error(&[v_entry2.clone()])?;
v_not_error2 = core_not(&[v_is_error2.clone()])?;
v_tombstone2 = core_get(
&v_entry2,
&CoreValue::from("tombstone"),
CoreValue::from(""),
);
v_has_tombstone2 = core_ne(&[v_tombstone2.clone(), CoreValue::from("")])?;
v_not_tombstone2 = core_not(&[v_has_tombstone2.clone()])?;
v_coverable2 = core_and(&[v_covered2.clone(), v_not_error2.clone()])?;
v_coverable2 = core_and(&[v_coverable2.clone(), v_not_tombstone2.clone()])?;
if core_truthy(&v_coverable2) {
v_include_working = core_gte(&[v_index.clone(), v_start.clone()])?;
if core_truthy(&v_include_working) {
core_append(&v_working_turns, v_turn2.clone())?;
v_code = core_get(
&v_entry2,
&CoreValue::from("code"),
CoreValue::from("(no code)"),
);
v_code_len = core_len(&[v_code.clone()])?;
v_code_too_long = core_gt(&[v_code_len.clone(), CoreValue::Num(2000f64)])?;
if core_truthy(&v_code_too_long) {
v_code_head = core_string_slice(&[
v_code.clone(),
CoreValue::Num(0f64),
CoreValue::Num(2000f64),
])?;
v_code = core_string_format(&[
CoreValue::from("{}\n// ... (truncated)"),
v_code_head.clone(),
])?;
}
v_produced = core_get(
&v_entry2,
&CoreValue::from("producedVars"),
v_empty_list.clone(),
);
v_produced_text =
core_string_join_intrinsic(&[CoreValue::from(", "), v_produced.clone()])?;
v_produced_empty = core_eq(&[v_produced_text.clone(), CoreValue::from("")])?;
if core_truthy(&v_produced_empty) {
v_produced_text = CoreValue::from("none");
}
v_reads = core_get(
&v_entry2,
&CoreValue::from("_durableReads"),
CoreValue::Null,
);
v_reads_is_list = core_type_is(&v_reads, CoreValue::from("list"));
if core_truthy(&v_reads_is_list) {
} else {
v_reads = core_get(
&v_entry2,
&CoreValue::from("referencedVars"),
v_empty_list.clone(),
);
}
v_read_text =
core_string_join_intrinsic(&[CoreValue::from(", "), v_reads.clone()])?;
v_read_empty = core_eq(&[v_read_text.clone(), CoreValue::from("")])?;
if core_truthy(&v_read_empty) {
v_read_text = CoreValue::from("none");
}
v_callables = _agent_entry_callables_text(&[v_entry2.clone()])?;
v_state_delta = core_get(
&v_entry2,
&CoreValue::from("stateDelta"),
CoreValue::from("none"),
);
v_output = core_get(
&v_entry2,
&CoreValue::from("output"),
CoreValue::from("(no output)"),
);
v_output_preview = core_string_slice(&[
v_output.clone(),
CoreValue::Num(0f64),
CoreValue::Num(800f64),
])?;
v_block_head = core_string_format(&[
CoreValue::from("Code:\n{}\nProduced: {}\nRead: {}"),
v_code.clone(),
v_produced_text.clone(),
v_read_text.clone(),
])?;
v_block_tail = core_string_format(&[
CoreValue::from("\nDirect callables: {}\nState delta: {}\nOutput: {}"),
v_callables.clone(),
v_state_delta.clone(),
v_output_preview.clone(),
])?;
v_block = core_add(&[v_block_head.clone(), v_block_tail.clone()])?;
core_append(&v_blocks, v_block.clone())?;
}
v_index = core_add(&[v_index.clone(), CoreValue::Num(1f64)])?;
}
v_fallback2 = core_add(&[v_fallback2.clone(), CoreValue::Num(1f64)])?;
}
v_body = core_string_join_intrinsic(&[CoreValue::from("\n\n"), v_blocks.clone()])?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("turns"), v_working_turns.clone())?;
v_has_body = core_ne(&[v_body.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_body) {
v_text = core_string_format(&[
CoreValue::from("=== Working Code State (verbatim) ===\n{}"),
v_body.clone(),
])?;
core_set(&v_out, CoreValue::from("text"), v_text.clone())?;
} else {
core_set(&v_out, CoreValue::from("text"), CoreValue::from(""))?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_refresh_checkpoint_state(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_refresh_checkpoint_state");
let mut v_state = core_arg(args, 0);
let mut v_chars = CoreValue::Null;
let mut v_checkpoint = CoreValue::Null;
let mut v_checkpoints = CoreValue::Null;
let mut v_cleared = CoreValue::Null;
let mut v_cleared_kind = CoreValue::Null;
let mut v_context_registry = CoreValue::Null;
let mut v_count = CoreValue::Null;
let mut v_coverable = CoreValue::Null;
let mut v_covered_count = CoreValue::Null;
let mut v_covered_turns = CoreValue::Null;
let mut v_cp_context_policy = CoreValue::Null;
let mut v_cp_empty = CoreValue::Null;
let mut v_cp_summarizer_opts = CoreValue::Null;
let mut v_cp_want_llm = CoreValue::Null;
let mut v_created_kind = CoreValue::Null;
let mut v_current = CoreValue::Null;
let mut v_disabled_reason = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_enabled = CoreValue::Null;
let mut v_entries = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_event = CoreValue::Null;
let mut v_existing = CoreValue::Null;
let mut v_fallback_turn = CoreValue::Null;
let mut v_fingerprint = CoreValue::Null;
let mut v_has_covered = CoreValue::Null;
let mut v_has_entries = CoreValue::Null;
let mut v_has_existing = CoreValue::Null;
let mut v_index = CoreValue::Null;
let mut v_is_error = CoreValue::Null;
let mut v_is_recent = CoreValue::Null;
let mut v_negative_recent = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_none_checkpoint = CoreValue::Null;
let mut v_none_empty = CoreValue::Null;
let mut v_none_no_covered = CoreValue::Null;
let mut v_not_recent = CoreValue::Null;
let mut v_ok_level = CoreValue::Null;
let mut v_ok_pressure = CoreValue::Null;
let mut v_over = CoreValue::Null;
let mut v_over_budget_reason = CoreValue::Null;
let mut v_policy = CoreValue::Null;
let mut v_pressure_levels = CoreValue::Null;
let mut v_recent = CoreValue::Null;
let mut v_recent_start = CoreValue::Null;
let mut v_summary = CoreValue::Null;
let mut v_summary_len = CoreValue::Null;
let mut v_too_many = CoreValue::Null;
let mut v_trigger = CoreValue::Null;
let mut v_turn = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_context_registry = _agent_context_policy_registry(&[])?;
v_empty_map = CoreValue::new_map();
v_pressure_levels = core_get(
&v_context_registry,
&CoreValue::from("pressure_levels"),
v_empty_map.clone(),
);
v_ok_level = core_get(
&v_pressure_levels,
&CoreValue::from("ok"),
v_empty_map.clone(),
);
v_ok_pressure = core_get(&v_ok_level, &CoreValue::from("id"), CoreValue::from("ok"));
v_policy = core_get(
&v_state,
&CoreValue::from("context_policy"),
CoreValue::Null,
);
v_checkpoints = core_get(&v_policy, &CoreValue::from("checkpoints"), CoreValue::Null);
v_enabled = core_get(
&v_checkpoints,
&CoreValue::from("enabled"),
CoreValue::Bool(false),
);
if core_truthy(&v_enabled) {
} else {
v_existing = core_get(
&v_state,
&CoreValue::from("checkpoint_state"),
CoreValue::Null,
);
v_has_existing = core_type_is(&v_existing, CoreValue::from("object"));
if core_truthy(&v_has_existing) {
v_cleared = CoreValue::new_map();
v_cleared_kind = _agent_context_event_name(&[CoreValue::from("checkpoint_cleared")])?;
v_disabled_reason = _agent_context_event_reason(&[CoreValue::from("disabled")])?;
core_set(&v_cleared, CoreValue::from("kind"), v_cleared_kind.clone())?;
core_set(
&v_cleared,
CoreValue::from("stage"),
CoreValue::from("executor"),
)?;
core_set(&v_cleared, CoreValue::from("turn"), CoreValue::Num(0f64))?;
core_set(
&v_cleared,
CoreValue::from("coveredTurns"),
v_empty_list.clone(),
)?;
core_set(
&v_cleared,
CoreValue::from("reason"),
v_disabled_reason.clone(),
)?;
_agent_record_context_event(&[v_state.clone(), v_cleared.clone()])?;
}
v_none_checkpoint = core_none(&[])?;
core_set(
&v_state,
CoreValue::from("checkpoint_state"),
v_none_checkpoint.clone(),
)?;
v_none = core_none(&[])?;
return Ok(v_none.clone());
}
v_entries = core_get(
&v_state,
&CoreValue::from("action_log"),
v_empty_list.clone(),
);
v_count = core_len(&[v_entries.clone()])?;
v_has_entries = core_gt(&[v_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_entries) {
} else {
v_none_empty = core_none(&[])?;
return Ok(v_none_empty.clone());
}
v_chars = _agent_action_log_char_count(&[v_entries.clone()])?;
v_trigger = core_get(
&v_checkpoints,
&CoreValue::from("triggerChars"),
CoreValue::Num(16000f64),
);
v_over = core_gte(&[v_chars.clone(), v_trigger.clone()])?;
if core_truthy(&v_over) {
} else {
v_current = core_get(
&v_state,
&CoreValue::from("checkpoint_state"),
CoreValue::Null,
);
return Ok(v_current.clone());
}
v_recent = core_get(
&v_policy,
&CoreValue::from("recentFullActions"),
CoreValue::Num(1f64),
);
v_recent_start = CoreValue::Num(0f64);
v_too_many = core_gt(&[v_count.clone(), v_recent.clone()])?;
if core_truthy(&v_too_many) {
v_negative_recent = core_mul(&[CoreValue::Num(-1f64), v_recent.clone()])?;
v_recent_start = core_add(&[v_count.clone(), v_negative_recent.clone()])?;
}
v_covered_turns = CoreValue::new_list();
v_index = CoreValue::Num(0f64);
v_fallback_turn = CoreValue::Num(1f64);
for v_entry in core_iter(&v_entries)? {
let mut v_entry = v_entry;
v_turn = _agent_entry_turn(&[v_entry.clone(), v_fallback_turn.clone()])?;
v_is_error = _agent_entry_is_error(&[v_entry.clone()])?;
v_is_recent = core_gte(&[v_index.clone(), v_recent_start.clone()])?;
v_coverable = core_not(&[v_is_error.clone()])?;
v_not_recent = core_not(&[v_is_recent.clone()])?;
v_coverable = core_and(&[v_coverable.clone(), v_not_recent.clone()])?;
if core_truthy(&v_coverable) {
core_append(&v_covered_turns, v_turn.clone())?;
}
v_index = core_add(&[v_index.clone(), CoreValue::Num(1f64)])?;
v_fallback_turn = core_add(&[v_fallback_turn.clone(), CoreValue::Num(1f64)])?;
}
v_covered_count = core_len(&[v_covered_turns.clone()])?;
v_has_covered = core_gt(&[v_covered_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_covered) {
} else {
v_none_no_covered = core_none(&[])?;
return Ok(v_none_no_covered.clone());
}
v_summary = _agent_fallback_checkpoint_summary(&[v_entries.clone(), v_covered_turns.clone()])?;
v_checkpoint = CoreValue::new_map();
v_fingerprint = core_json_stable_stringify(&[v_covered_turns.clone()])?;
core_set(
&v_checkpoint,
CoreValue::from("fingerprint"),
v_fingerprint.clone(),
)?;
core_set(&v_checkpoint, CoreValue::from("summary"), v_summary.clone())?;
core_set(
&v_checkpoint,
CoreValue::from("turns"),
v_covered_turns.clone(),
)?;
v_cp_empty = CoreValue::new_map();
v_cp_context_policy = core_get(
&v_state,
&CoreValue::from("context_policy"),
v_cp_empty.clone(),
);
v_cp_summarizer_opts = core_get(
&v_cp_context_policy,
&CoreValue::from("summarizerOptions"),
CoreValue::Null,
);
v_cp_want_llm = core_is_not_none(&[v_cp_summarizer_opts.clone()])?;
if core_truthy(&v_cp_want_llm) {
core_set(
&v_checkpoint,
CoreValue::from("llm_pending"),
CoreValue::Bool(true),
)?;
core_set(
&v_checkpoint,
CoreValue::from("llm_input"),
v_summary.clone(),
)?;
}
core_set(
&v_state,
CoreValue::from("checkpoint_state"),
v_checkpoint.clone(),
)?;
v_event = CoreValue::new_map();
v_created_kind = _agent_context_event_name(&[CoreValue::from("checkpoint_created")])?;
v_over_budget_reason = _agent_context_event_reason(&[CoreValue::from("over_budget")])?;
core_set(&v_event, CoreValue::from("kind"), v_created_kind.clone())?;
core_set(
&v_event,
CoreValue::from("stage"),
CoreValue::from("executor"),
)?;
core_set(&v_event, CoreValue::from("turn"), v_count.clone())?;
core_set(
&v_event,
CoreValue::from("coveredTurns"),
v_covered_turns.clone(),
)?;
v_summary_len = core_len(&[v_summary.clone()])?;
core_set(
&v_event,
CoreValue::from("summaryChars"),
v_summary_len.clone(),
)?;
core_set(
&v_event,
CoreValue::from("reason"),
v_over_budget_reason.clone(),
)?;
_agent_record_context_event(&[v_state.clone(), v_event.clone()])?;
return Ok(v_checkpoint.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_build_action_log_parts(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_build_action_log_parts");
let mut v_state = core_arg(args, 0);
let mut v_hygiene_mode = core_arg(args, 1);
let mut v_action_replay = CoreValue::Null;
let mut v_aggressive = CoreValue::Null;
let mut v_aggressive_hygiene_mode = CoreValue::Null;
let mut v_aggressive_pre = CoreValue::Null;
let mut v_checkpoint_covered = CoreValue::Null;
let mut v_checkpoint_state = CoreValue::Null;
let mut v_checkpoint_summary = CoreValue::Null;
let mut v_checkpoint_text = CoreValue::Null;
let mut v_checkpoint_turns = CoreValue::Null;
let mut v_checkpointed = CoreValue::Null;
let mut v_code_distill = CoreValue::Null;
let mut v_compaction = CoreValue::Null;
let mut v_compaction_distill = CoreValue::Null;
let mut v_compactions = CoreValue::Null;
let mut v_context_registry = CoreValue::Null;
let mut v_count = CoreValue::Null;
let mut v_covered_success = CoreValue::Null;
let mut v_delegated_summary = CoreValue::Null;
let mut v_delegated_text = CoreValue::Null;
let mut v_distilled_output = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_entries = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_entry_summary = CoreValue::Null;
let mut v_fallback_turn = CoreValue::Null;
let mut v_fence_distill = CoreValue::Null;
let mut v_full_replay = CoreValue::Null;
let mut v_full_text = CoreValue::Null;
let mut v_full_text_distill = CoreValue::Null;
let mut v_has_checkpoint_summary = CoreValue::Null;
let mut v_has_delegated = CoreValue::Null;
let mut v_has_distill = CoreValue::Null;
let mut v_has_distilled_output = CoreValue::Null;
let mut v_has_rendered = CoreValue::Null;
let mut v_has_rendered_pre = CoreValue::Null;
let mut v_has_restore = CoreValue::Null;
let mut v_has_tombstone = CoreValue::Null;
let mut v_history = CoreValue::Null;
let mut v_history_parts = CoreValue::Null;
let mut v_hygiene_modes = CoreValue::Null;
let mut v_index = CoreValue::Null;
let mut v_is_error = CoreValue::Null;
let mut v_is_recent = CoreValue::Null;
let mut v_js_fence_distill = CoreValue::Null;
let mut v_negative_recent = CoreValue::Null;
let mut v_not_error = CoreValue::Null;
let mut v_not_replay_full = CoreValue::Null;
let mut v_old_success = CoreValue::Null;
let mut v_original_chars = CoreValue::Null;
let mut v_original_chars_distill = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_policy = CoreValue::Null;
let mut v_pressure = CoreValue::Null;
let mut v_pressure_can_compact = CoreValue::Null;
let mut v_pressure_compaction = CoreValue::Null;
let mut v_pressure_hygiene_mode = CoreValue::Null;
let mut v_pressure_pre = CoreValue::Null;
let mut v_raw_output_for_distill = CoreValue::Null;
let mut v_reason = CoreValue::Null;
let mut v_recent = CoreValue::Null;
let mut v_recent_start = CoreValue::Null;
let mut v_render_full = CoreValue::Null;
let mut v_rendered = CoreValue::Null;
let mut v_rendered_after_distill = CoreValue::Null;
let mut v_rendered_chars = CoreValue::Null;
let mut v_rendered_chars_distill = CoreValue::Null;
let mut v_replay_compact = CoreValue::Null;
let mut v_replay_distill = CoreValue::Null;
let mut v_replay_full = CoreValue::Null;
let mut v_replay_mode = CoreValue::Null;
let mut v_replay_omit = CoreValue::Null;
let mut v_restore_notice = CoreValue::Null;
let mut v_runtime_contract_distill = CoreValue::Null;
let mut v_should_compact = CoreValue::Null;
let mut v_should_distill = CoreValue::Null;
let mut v_summary = CoreValue::Null;
let mut v_summary_parts = CoreValue::Null;
let mut v_tombstone = CoreValue::Null;
let mut v_too_many = CoreValue::Null;
let mut v_turn = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_context_registry = _agent_context_policy_registry(&[])?;
v_empty_map = CoreValue::new_map();
v_hygiene_modes = core_get(
&v_context_registry,
&CoreValue::from("hygiene_modes"),
v_empty_map.clone(),
);
v_pressure_hygiene_mode = core_get(
&v_hygiene_modes,
&CoreValue::from("pressure"),
CoreValue::from("pressure"),
);
v_aggressive_hygiene_mode = core_get(
&v_hygiene_modes,
&CoreValue::from("aggressive"),
CoreValue::from("aggressive"),
);
v_entries = core_get(
&v_state,
&CoreValue::from("action_log"),
v_empty_list.clone(),
);
v_policy = core_get(
&v_state,
&CoreValue::from("context_policy"),
CoreValue::Null,
);
v_action_replay = core_get(
&v_policy,
&CoreValue::from("actionReplay"),
CoreValue::from("full"),
);
v_recent = core_get(
&v_policy,
&CoreValue::from("recentFullActions"),
CoreValue::Num(1f64),
);
v_checkpoint_state = core_get(
&v_state,
&CoreValue::from("checkpoint_state"),
CoreValue::Null,
);
v_checkpoint_summary = core_get(
&v_checkpoint_state,
&CoreValue::from("summary"),
CoreValue::from(""),
);
v_checkpoint_turns = core_get(
&v_checkpoint_state,
&CoreValue::from("turns"),
v_empty_list.clone(),
);
v_restore_notice = core_get(
&v_state,
&CoreValue::from("restore_notice"),
CoreValue::from(""),
);
v_delegated_summary = core_get(
&v_state,
&CoreValue::from("delegated_context_summary"),
CoreValue::from(""),
);
v_summary_parts = CoreValue::new_list();
v_has_restore = core_ne(&[v_restore_notice.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_restore) {
core_append(&v_summary_parts, v_restore_notice.clone())?;
}
v_has_delegated = core_ne(&[v_delegated_summary.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_delegated) {
v_delegated_text = core_string_format(&[
CoreValue::from("Delegated Context (runtime-only - explore with code):\n{}"),
v_delegated_summary.clone(),
])?;
core_append(&v_summary_parts, v_delegated_text.clone())?;
}
v_has_checkpoint_summary = core_ne(&[v_checkpoint_summary.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_checkpoint_summary) {
v_checkpoint_text = core_string_format(&[
CoreValue::from("Checkpoint Summary:\n{}"),
v_checkpoint_summary.clone(),
])?;
core_append(&v_summary_parts, v_checkpoint_text.clone())?;
}
v_summary = core_string_join_intrinsic(&[CoreValue::from("\n\n"), v_summary_parts.clone()])?;
v_history_parts = CoreValue::new_list();
v_compactions = CoreValue::new_list();
v_count = core_len(&[v_entries.clone()])?;
v_recent_start = CoreValue::Num(0f64);
v_too_many = core_gt(&[v_count.clone(), v_recent.clone()])?;
if core_truthy(&v_too_many) {
v_negative_recent = core_mul(&[CoreValue::Num(-1f64), v_recent.clone()])?;
v_recent_start = core_add(&[v_count.clone(), v_negative_recent.clone()])?;
}
v_full_replay = core_eq(&[v_action_replay.clone(), CoreValue::from("full")])?;
v_checkpointed = core_eq(&[v_action_replay.clone(), CoreValue::from("checkpointed")])?;
v_index = CoreValue::Num(0f64);
v_fallback_turn = CoreValue::Num(1f64);
for v_entry in core_iter(&v_entries)? {
let mut v_entry = v_entry;
v_turn = _agent_entry_turn(&[v_entry.clone(), v_fallback_turn.clone()])?;
v_is_error = _agent_entry_is_error(&[v_entry.clone()])?;
v_tombstone = core_get(&v_entry, &CoreValue::from("tombstone"), CoreValue::from(""));
v_has_tombstone = core_ne(&[v_tombstone.clone(), CoreValue::from("")])?;
v_is_recent = core_gte(&[v_index.clone(), v_recent_start.clone()])?;
v_checkpoint_covered = core_contains(&[v_checkpoint_turns.clone(), v_turn.clone()])?;
v_not_error = core_not(&[v_is_error.clone()])?;
v_replay_mode = core_get(
&v_entry,
&CoreValue::from("replayMode"),
CoreValue::from(""),
);
v_replay_full = core_eq(&[v_replay_mode.clone(), CoreValue::from("full")])?;
v_replay_distill = core_eq(&[v_replay_mode.clone(), CoreValue::from("distill")])?;
v_replay_compact = core_eq(&[v_replay_mode.clone(), CoreValue::from("compact")])?;
v_replay_omit = core_eq(&[v_replay_mode.clone(), CoreValue::from("omit")])?;
v_covered_success = core_and(&[v_checkpoint_covered.clone(), v_not_error.clone()])?;
v_not_replay_full = core_not(&[v_replay_full.clone()])?;
v_covered_success = core_and(&[v_covered_success.clone(), v_not_replay_full.clone()])?;
v_rendered = CoreValue::from("");
if core_truthy(&v_covered_success) {
v_rendered = CoreValue::from("");
} else {
v_render_full = CoreValue::Bool(false);
if core_truthy(&v_replay_full) {
v_render_full = CoreValue::Bool(true);
}
if core_truthy(&v_full_replay) {
v_render_full = CoreValue::Bool(true);
}
if core_truthy(&v_is_recent) {
v_render_full = CoreValue::Bool(true);
}
if core_truthy(&v_is_error) {
v_render_full = CoreValue::Bool(true);
}
v_pressure_pre = core_eq(&[v_hygiene_mode.clone(), v_pressure_hygiene_mode.clone()])?;
v_aggressive_pre =
core_eq(&[v_hygiene_mode.clone(), v_aggressive_hygiene_mode.clone()])?;
v_pressure_compaction = core_or(&[v_pressure_pre.clone(), v_aggressive_pre.clone()])?;
v_old_success = core_not(&[v_is_recent.clone()])?;
v_old_success = core_and(&[v_old_success.clone(), v_not_error.clone()])?;
v_pressure_can_compact =
core_and(&[v_pressure_compaction.clone(), v_old_success.clone()])?;
if core_truthy(&v_pressure_can_compact) {
v_render_full = CoreValue::Bool(false);
}
if core_truthy(&v_has_tombstone) {
v_rendered = v_tombstone.clone();
}
v_has_rendered_pre = core_ne(&[v_rendered.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_rendered_pre) {
} else {
if core_truthy(&v_render_full) {
v_rendered =
_agent_render_full_action_entry(&[v_state.clone(), v_entry.clone()])?;
} else {
v_pressure =
core_eq(&[v_hygiene_mode.clone(), v_pressure_hygiene_mode.clone()])?;
v_aggressive =
core_eq(&[v_hygiene_mode.clone(), v_aggressive_hygiene_mode.clone()])?;
v_should_compact = core_or(&[v_pressure.clone(), v_aggressive.clone()])?;
v_should_compact =
core_or(&[v_should_compact.clone(), v_replay_compact.clone()])?;
v_should_distill = v_replay_distill.clone();
if core_truthy(&v_should_distill) {
v_distilled_output = core_get(
&v_entry,
&CoreValue::from("distilledOutput"),
CoreValue::from(""),
);
v_has_distilled_output =
core_ne(&[v_distilled_output.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_distilled_output) {
} else {
v_raw_output_for_distill =
core_get(&v_entry, &CoreValue::from("output"), CoreValue::from(""));
v_distilled_output = _agent_distill_structured_action_output(&[
v_raw_output_for_distill.clone(),
])?;
}
v_has_distill =
core_ne(&[v_distilled_output.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_distill) {
v_full_text_distill = _agent_render_full_action_entry(&[
v_state.clone(),
v_entry.clone(),
])?;
v_runtime_contract_distill = core_get(
&v_state,
&CoreValue::from("runtime_contract"),
CoreValue::Null,
);
v_fence_distill = core_get(
&v_runtime_contract_distill,
&CoreValue::from("code_fence_language"),
CoreValue::from("javascript"),
);
v_js_fence_distill =
core_eq(&[v_fence_distill.clone(), CoreValue::from("js")])?;
if core_truthy(&v_js_fence_distill) {
v_fence_distill = CoreValue::from("javascript");
}
v_code_distill =
core_get(&v_entry, &CoreValue::from("code"), CoreValue::from(""));
v_rendered = core_string_format(&[
CoreValue::from("```{}\n{}\n```\nResult:\n{}"),
v_fence_distill.clone(),
v_code_distill.clone(),
v_distilled_output.clone(),
])?;
v_compaction_distill = CoreValue::new_map();
core_set(
&v_compaction_distill,
CoreValue::from("turn"),
v_turn.clone(),
)?;
core_set(
&v_compaction_distill,
CoreValue::from("mode"),
CoreValue::from("distill"),
)?;
core_set(
&v_compaction_distill,
CoreValue::from("reason"),
CoreValue::from("structured_output"),
)?;
v_original_chars_distill = core_len(&[v_full_text_distill.clone()])?;
v_rendered_chars_distill = core_len(&[v_rendered.clone()])?;
core_set(
&v_compaction_distill,
CoreValue::from("originalChars"),
v_original_chars_distill.clone(),
)?;
core_set(
&v_compaction_distill,
CoreValue::from("renderedChars"),
v_rendered_chars_distill.clone(),
)?;
core_append(&v_compactions, v_compaction_distill.clone())?;
}
}
v_rendered_after_distill = core_ne(&[v_rendered.clone(), CoreValue::from("")])?;
if core_truthy(&v_rendered_after_distill) {
} else {
if core_truthy(&v_should_compact) {
v_reason = _agent_context_event_reason(&[CoreValue::from("pressure")])?;
if core_truthy(&v_aggressive) {
v_reason = _agent_context_event_reason(&[CoreValue::from("lean")])?;
}
v_full_text = _agent_render_full_action_entry(&[
v_state.clone(),
v_entry.clone(),
])?;
v_rendered = _agent_render_compact_action_entry(&[
v_entry.clone(),
v_turn.clone(),
v_reason.clone(),
])?;
v_compaction = CoreValue::new_map();
core_set(&v_compaction, CoreValue::from("turn"), v_turn.clone())?;
core_set(
&v_compaction,
CoreValue::from("mode"),
CoreValue::from("compact"),
)?;
core_set(&v_compaction, CoreValue::from("reason"), v_reason.clone())?;
v_original_chars = core_len(&[v_full_text.clone()])?;
v_rendered_chars = core_len(&[v_rendered.clone()])?;
core_set(
&v_compaction,
CoreValue::from("originalChars"),
v_original_chars.clone(),
)?;
core_set(
&v_compaction,
CoreValue::from("renderedChars"),
v_rendered_chars.clone(),
)?;
core_append(&v_compactions, v_compaction.clone())?;
} else {
if core_truthy(&v_replay_omit) {
v_rendered =
_agent_entry_summary(&[v_entry.clone(), v_turn.clone()])?;
} else {
v_entry_summary =
_agent_entry_summary(&[v_entry.clone(), v_turn.clone()])?;
v_rendered = core_string_format(&[
CoreValue::from("- Action {}: {}"),
v_turn.clone(),
v_entry_summary.clone(),
])?;
}
}
}
}
}
}
v_has_rendered = core_ne(&[v_rendered.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_rendered) {
core_append(&v_history_parts, v_rendered.clone())?;
}
v_index = core_add(&[v_index.clone(), CoreValue::Num(1f64)])?;
v_fallback_turn = core_add(&[v_fallback_turn.clone(), CoreValue::Num(1f64)])?;
}
v_history = core_string_join_intrinsic(&[CoreValue::from("\n\n"), v_history_parts.clone()])?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("summary"), v_summary.clone())?;
core_set(&v_out, CoreValue::from("history"), v_history.clone())?;
core_set(
&v_out,
CoreValue::from("compactions"),
v_compactions.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_render_runtime_state_summary(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_render_runtime_state_summary");
let mut v_state = core_arg(args, 0);
let mut v_policy = core_arg(args, 1);
let mut v_allowed_key = CoreValue::Null;
let mut v_auto_promoted_fields = CoreValue::Null;
let mut v_bindings = CoreValue::Null;
let mut v_bindings_is_map = CoreValue::Null;
let mut v_body = CoreValue::Null;
let mut v_body_structured = CoreValue::Null;
let mut v_count = CoreValue::Null;
let mut v_created_turn = CoreValue::Null;
let mut v_ctor = CoreValue::Null;
let mut v_empty = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_empty_structured = CoreValue::Null;
let mut v_enabled = CoreValue::Null;
let mut v_entries = CoreValue::Null;
let mut v_entries_is_list = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_entry_count = CoreValue::Null;
let mut v_globals = CoreValue::Null;
let mut v_has_ctor = CoreValue::Null;
let mut v_has_entries = CoreValue::Null;
let mut v_has_preview = CoreValue::Null;
let mut v_has_prov = CoreValue::Null;
let mut v_has_size = CoreValue::Null;
let mut v_has_source = CoreValue::Null;
let mut v_include_key = CoreValue::Null;
let mut v_is_context_binding = CoreValue::Null;
let mut v_is_context_name = CoreValue::Null;
let mut v_is_distilled_binding = CoreValue::Null;
let mut v_is_distilled_name = CoreValue::Null;
let mut v_is_promoted_binding = CoreValue::Null;
let mut v_is_promoted_name = CoreValue::Null;
let mut v_key = CoreValue::Null;
let mut v_last_read = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_line_base = CoreValue::Null;
let mut v_line_with_prov = CoreValue::Null;
let mut v_lines_structured = CoreValue::Null;
let mut v_max_entries = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_object_type = CoreValue::Null;
let mut v_object_with_ctor = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_out_structured = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_preview = CoreValue::Null;
let mut v_preview_text = CoreValue::Null;
let mut v_prov = CoreValue::Null;
let mut v_prov_text = CoreValue::Null;
let mut v_provenance = CoreValue::Null;
let mut v_read_after = CoreValue::Null;
let mut v_reserved = CoreValue::Null;
let mut v_reserved_key = CoreValue::Null;
let mut v_restorable = CoreValue::Null;
let mut v_restore_text = CoreValue::Null;
let mut v_session_state = CoreValue::Null;
let mut v_size = CoreValue::Null;
let mut v_snapshot_only = CoreValue::Null;
let mut v_source = CoreValue::Null;
let mut v_state_summary = CoreValue::Null;
let mut v_structured_count = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_type = CoreValue::Null;
let mut v_type_label = CoreValue::Null;
let mut v_under_limit = CoreValue::Null;
let mut v_under_structured_limit = CoreValue::Null;
let mut v_value = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_empty_list = CoreValue::new_list();
v_auto_promoted_fields = _agent_auto_promoted_fields(&[v_state.clone()])?;
v_session_state = core_get(
&v_state,
&CoreValue::from("runtime_session_state"),
v_empty_map.clone(),
);
v_state_summary = core_get(
&v_policy,
&CoreValue::from("stateSummary"),
v_empty_map.clone(),
);
v_enabled = core_get(
&v_state_summary,
&CoreValue::from("enabled"),
CoreValue::Bool(false),
);
if core_truthy(&v_enabled) {
} else {
return Ok(CoreValue::from(""));
}
v_max_entries = core_get(
&v_state_summary,
&CoreValue::from("maxEntries"),
CoreValue::Num(8f64),
);
v_entries = core_get(
&v_session_state,
&CoreValue::from("entries"),
v_empty_list.clone(),
);
v_entries_is_list = core_type_is(&v_entries, CoreValue::from("list"));
if core_truthy(&v_entries_is_list) {
v_entry_count = core_len(&[v_entries.clone()])?;
v_has_entries = core_gt(&[v_entry_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_entries) {
v_provenance = core_get(
&v_state,
&CoreValue::from("provenance"),
v_empty_map.clone(),
);
v_lines_structured = CoreValue::new_list();
v_structured_count = CoreValue::Num(0f64);
for v_entry in core_iter(&v_entries)? {
let mut v_entry = v_entry;
v_under_structured_limit =
core_lt(&[v_structured_count.clone(), v_max_entries.clone()])?;
if core_truthy(&v_under_structured_limit) {
v_name = core_get(&v_entry, &CoreValue::from("name"), CoreValue::from(""));
v_type = core_get(
&v_entry,
&CoreValue::from("type"),
CoreValue::from("unknown"),
);
v_size = core_get(&v_entry, &CoreValue::from("size"), CoreValue::from(""));
v_preview =
core_get(&v_entry, &CoreValue::from("preview"), CoreValue::from(""));
v_ctor = core_get(&v_entry, &CoreValue::from("ctor"), CoreValue::from(""));
v_is_promoted_name =
core_contains(&[v_auto_promoted_fields.clone(), v_name.clone()])?;
v_is_context_name = core_eq(&[v_name.clone(), CoreValue::from("context")])?;
v_is_distilled_name =
core_eq(&[v_name.clone(), CoreValue::from("distilledContext")])?;
v_type_label = v_type.clone();
v_object_type = core_eq(&[v_type.clone(), CoreValue::from("object")])?;
v_has_ctor = core_ne(&[v_ctor.clone(), CoreValue::from("")])?;
v_object_with_ctor = core_and(&[v_object_type.clone(), v_has_ctor.clone()])?;
if core_truthy(&v_object_with_ctor) {
v_type_label =
core_string_format(&[CoreValue::from("object<{}>"), v_ctor.clone()])?;
}
v_has_size = core_ne(&[v_size.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_size) {
v_type_label = core_string_format(&[
CoreValue::from("{} ({})"),
v_type_label.clone(),
v_size.clone(),
])?;
}
v_preview_text = CoreValue::from("");
v_has_preview = core_ne(&[v_preview.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_preview) {
v_preview_text =
core_string_format(&[CoreValue::from(" = {}"), v_preview.clone()])?;
}
if core_truthy(&v_is_promoted_name) {
v_preview_text = core_string_format(&[
CoreValue::from(" = [runtime-only context available as inputs.{}]"),
v_name.clone(),
])?;
}
if core_truthy(&v_is_context_name) {
v_preview_text =
CoreValue::from(" = [runtime context map; values omitted from prompt]");
}
if core_truthy(&v_is_distilled_name) {
v_preview_text = CoreValue::from(
" = [distilled evidence object; values omitted from prompt]",
);
}
v_prov = core_get(&v_provenance, &v_name.clone(), CoreValue::Null);
v_prov_text = CoreValue::from("");
v_has_prov = core_type_is(&v_prov, CoreValue::from("object"));
if core_truthy(&v_has_prov) {
v_created_turn = core_get(
&v_prov,
&CoreValue::from("createdTurn"),
CoreValue::Num(0f64),
);
v_source =
core_get(&v_prov, &CoreValue::from("source"), CoreValue::from(""));
v_last_read = core_get(
&v_prov,
&CoreValue::from("lastReadTurn"),
CoreValue::Num(0f64),
);
v_has_source = core_ne(&[v_source.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_source) {
v_prov_text = core_string_format(&[
CoreValue::from(" [from t{} via {}"),
v_created_turn.clone(),
v_source.clone(),
])?;
} else {
v_prov_text = core_string_format(&[
CoreValue::from(" [from t{}"),
v_created_turn.clone(),
])?;
}
v_read_after = core_gt(&[v_last_read.clone(), v_created_turn.clone()])?;
if core_truthy(&v_read_after) {
v_prov_text = core_string_format(&[
CoreValue::from("{}; read t{}"),
v_prov_text.clone(),
v_last_read.clone(),
])?;
}
v_prov_text = core_add(&[v_prov_text.clone(), CoreValue::from("]")])?;
}
v_restorable = core_get(
&v_entry,
&CoreValue::from("restorable"),
CoreValue::Bool(true),
);
v_snapshot_only = core_eq(&[v_restorable.clone(), CoreValue::Bool(false)])?;
v_restore_text = CoreValue::from("");
if core_truthy(&v_snapshot_only) {
v_restore_text = CoreValue::from(" [snapshot only]");
}
v_line_base = core_string_format(&[
CoreValue::from("{}: {}{}"),
v_name.clone(),
v_type_label.clone(),
v_preview_text.clone(),
])?;
v_line_with_prov = core_add(&[v_line_base.clone(), v_prov_text.clone()])?;
v_line = core_add(&[v_line_with_prov.clone(), v_restore_text.clone()])?;
core_append(&v_lines_structured, v_line.clone())?;
v_structured_count =
core_add(&[v_structured_count.clone(), CoreValue::Num(1f64)])?;
}
}
v_body_structured =
core_string_join_intrinsic(&[CoreValue::from("\n"), v_lines_structured.clone()])?;
v_empty_structured = core_eq(&[v_body_structured.clone(), CoreValue::from("")])?;
if core_truthy(&v_empty_structured) {
v_body_structured = CoreValue::from("(no user variables)");
}
v_out_structured = core_string_format(&[
CoreValue::from("Current runtime state:\n{}"),
v_body_structured.clone(),
])?;
core_set(
&v_state,
CoreValue::from("runtime_state_summary"),
v_out_structured.clone(),
)?;
return Ok(v_out_structured.clone());
}
}
v_globals = core_get(
&v_session_state,
&CoreValue::from("globals"),
CoreValue::Null,
);
v_bindings = core_get(
&v_session_state,
&CoreValue::from("bindings"),
v_globals.clone(),
);
v_bindings_is_map = core_type_is(&v_bindings, CoreValue::from("object"));
if core_truthy(&v_bindings_is_map) {
} else {
return Ok(CoreValue::from(""));
}
v_reserved = _agent_reserved_runtime_names(&[])?;
v_parts = CoreValue::new_list();
v_count = CoreValue::Num(0f64);
for v_key in core_iter(&v_bindings)? {
let mut v_key = v_key;
v_reserved_key = core_contains(&[v_reserved.clone(), v_key.clone()])?;
v_allowed_key = core_not(&[v_reserved_key.clone()])?;
v_under_limit = core_lt(&[v_count.clone(), v_max_entries.clone()])?;
v_include_key = core_and(&[v_allowed_key.clone(), v_under_limit.clone()])?;
if core_truthy(&v_include_key) {
v_value = core_get(&v_bindings, &v_key.clone(), CoreValue::Null);
v_text = core_json_stringify(&[v_value.clone()])?;
v_is_promoted_binding =
core_contains(&[v_auto_promoted_fields.clone(), v_key.clone()])?;
if core_truthy(&v_is_promoted_binding) {
v_text = core_string_format(&[
CoreValue::from("[runtime-only context available as inputs.{}]"),
v_key.clone(),
])?;
}
v_is_context_binding = core_eq(&[v_key.clone(), CoreValue::from("context")])?;
if core_truthy(&v_is_context_binding) {
v_text = CoreValue::from("[runtime context map; values omitted from prompt]");
}
v_is_distilled_binding =
core_eq(&[v_key.clone(), CoreValue::from("distilledContext")])?;
if core_truthy(&v_is_distilled_binding) {
v_text = CoreValue::from("[distilled evidence object; values omitted from prompt]");
}
v_line =
core_string_format(&[CoreValue::from("- {}: {}"), v_key.clone(), v_text.clone()])?;
core_append(&v_parts, v_line.clone())?;
v_count = core_add(&[v_count.clone(), CoreValue::Num(1f64)])?;
}
}
v_body = core_string_join_intrinsic(&[CoreValue::from("\n"), v_parts.clone()])?;
v_empty = core_eq(&[v_body.clone(), CoreValue::from("")])?;
if core_truthy(&v_empty) {
return Ok(CoreValue::from(""));
}
v_out = core_string_format(&[
CoreValue::from("Current runtime state:\n{}"),
v_body.clone(),
])?;
core_set(
&v_state,
CoreValue::from("runtime_state_summary"),
v_out.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_auto_promoted_fields(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_auto_promoted_fields");
let mut v_state = core_arg(args, 0);
let mut v_already = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_event = CoreValue::Null;
let mut v_events = CoreValue::Null;
let mut v_field = CoreValue::Null;
let mut v_fresh = CoreValue::Null;
let mut v_has_field = CoreValue::Null;
let mut v_is_auto = CoreValue::Null;
let mut v_kind = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_take = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_events = core_get(
&v_state,
&CoreValue::from("context_events"),
v_empty_list.clone(),
);
v_out = CoreValue::new_list();
for v_event in core_iter(&v_events)? {
let mut v_event = v_event;
v_kind = core_get(&v_event, &CoreValue::from("kind"), CoreValue::from(""));
v_is_auto = core_eq(&[v_kind.clone(), CoreValue::from("field_auto_promoted")])?;
if core_truthy(&v_is_auto) {
v_field = core_get(&v_event, &CoreValue::from("fieldName"), CoreValue::from(""));
v_has_field = core_ne(&[v_field.clone(), CoreValue::from("")])?;
v_already = core_contains(&[v_out.clone(), v_field.clone()])?;
v_fresh = core_not(&[v_already.clone()])?;
v_take = core_and(&[v_has_field.clone(), v_fresh.clone()])?;
if core_truthy(&v_take) {
core_append(&v_out, v_field.clone())?;
}
}
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_prepare_actor_context(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_prepare_actor_context");
let mut v_state = core_arg(args, 0);
let mut v_action_compacted_kind = CoreValue::Null;
let mut v_action_count = CoreValue::Null;
let mut v_action_log = CoreValue::Null;
let mut v_budget_check_kind = CoreValue::Null;
let mut v_budget_event = CoreValue::Null;
let mut v_checkpoint = CoreValue::Null;
let mut v_checkpoint_is_map = CoreValue::Null;
let mut v_compaction = CoreValue::Null;
let mut v_compactions = CoreValue::Null;
let mut v_context_registry = CoreValue::Null;
let mut v_default_hygiene = CoreValue::Null;
let mut v_default_preset = CoreValue::Null;
let mut v_default_reason = CoreValue::Null;
let mut v_dynamic_runtime_chars = CoreValue::Null;
let mut v_effective_budget = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_event = CoreValue::Null;
let mut v_fixed = CoreValue::Null;
let mut v_full_preset = CoreValue::Null;
let mut v_guidance_chars = CoreValue::Null;
let mut v_guidance_count = CoreValue::Null;
let mut v_guidance_log = CoreValue::Null;
let mut v_guidance_text = CoreValue::Null;
let mut v_history = CoreValue::Null;
let mut v_history_chars = CoreValue::Null;
let mut v_history_empty = CoreValue::Null;
let mut v_history_len = CoreValue::Null;
let mut v_hygiene = CoreValue::Null;
let mut v_hygiene_changes = CoreValue::Null;
let mut v_is_full = CoreValue::Null;
let mut v_max_runtime = CoreValue::Null;
let mut v_mode = CoreValue::Null;
let mut v_mutable_chars = CoreValue::Null;
let mut v_ok_level = CoreValue::Null;
let mut v_ok_pressure = CoreValue::Null;
let mut v_original_chars = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_policy = CoreValue::Null;
let mut v_preset = CoreValue::Null;
let mut v_pressure = CoreValue::Null;
let mut v_pressure_history = CoreValue::Null;
let mut v_pressure_history_empty = CoreValue::Null;
let mut v_pressure_hygiene = CoreValue::Null;
let mut v_pressure_is_ok = CoreValue::Null;
let mut v_pressure_len = CoreValue::Null;
let mut v_pressure_levels = CoreValue::Null;
let mut v_pressure_not_ok = CoreValue::Null;
let mut v_pressure_parts = CoreValue::Null;
let mut v_pressure_text = CoreValue::Null;
let mut v_reason = CoreValue::Null;
let mut v_rendered_chars = CoreValue::Null;
let mut v_runtime_chars = CoreValue::Null;
let mut v_runtime_state_summary = CoreValue::Null;
let mut v_shorter = CoreValue::Null;
let mut v_should_pressure = CoreValue::Null;
let mut v_summary = CoreValue::Null;
let mut v_summary_chars = CoreValue::Null;
let mut v_target = CoreValue::Null;
let mut v_turn = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_context_registry = _agent_context_policy_registry(&[])?;
v_empty_map = CoreValue::new_map();
v_pressure_levels = core_get(
&v_context_registry,
&CoreValue::from("pressure_levels"),
v_empty_map.clone(),
);
v_ok_level = core_get(
&v_pressure_levels,
&CoreValue::from("ok"),
v_empty_map.clone(),
);
v_ok_pressure = core_get(&v_ok_level, &CoreValue::from("id"), CoreValue::from("ok"));
v_policy = core_get(
&v_state,
&CoreValue::from("context_policy"),
CoreValue::Null,
);
v_hygiene = core_get(
&v_policy,
&CoreValue::from("contextHygiene"),
CoreValue::Null,
);
v_default_hygiene = core_get(
&v_hygiene,
&CoreValue::from("defaultMode"),
CoreValue::from("none"),
);
v_pressure_hygiene = core_get(
&v_hygiene,
&CoreValue::from("pressureMode"),
v_default_hygiene.clone(),
);
v_checkpoint = _agent_refresh_checkpoint_state(&[v_state.clone()])?;
v_parts = _agent_build_action_log_parts(&[v_state.clone(), v_default_hygiene.clone()])?;
v_summary = core_get(&v_parts, &CoreValue::from("summary"), CoreValue::from(""));
v_history = core_get(&v_parts, &CoreValue::from("history"), CoreValue::from(""));
v_history_empty = core_eq(&[v_history.clone(), CoreValue::from("")])?;
if core_truthy(&v_history_empty) {
v_history = CoreValue::from("(no actions yet)");
}
v_runtime_state_summary =
_agent_render_runtime_state_summary(&[v_state.clone(), v_policy.clone()])?;
v_guidance_log = core_get(
&v_state,
&CoreValue::from("guidance_log"),
v_empty_list.clone(),
);
v_guidance_text = core_json_stringify(&[v_guidance_log.clone()])?;
v_history_chars = core_len(&[v_history.clone()])?;
v_guidance_chars = core_len(&[v_guidance_text.clone()])?;
v_runtime_chars = core_len(&[v_runtime_state_summary.clone()])?;
v_summary_chars = core_len(&[v_summary.clone()])?;
v_mutable_chars = core_add(&[v_history_chars.clone(), v_guidance_chars.clone()])?;
v_mutable_chars = core_add(&[v_mutable_chars.clone(), v_runtime_chars.clone()])?;
v_mutable_chars = core_add(&[v_mutable_chars.clone(), v_summary_chars.clone()])?;
v_target = core_get(
&v_policy,
&CoreValue::from("targetPromptChars"),
CoreValue::Num(16000f64),
);
v_fixed = core_get(
&v_state,
&CoreValue::from("fixed_prompt_chars"),
CoreValue::Num(0f64),
);
v_effective_budget =
_agent_compute_effective_chat_budget(&[v_target.clone(), v_fixed.clone()])?;
v_checkpoint_is_map = core_type_is(&v_checkpoint, CoreValue::from("object"));
v_pressure = _agent_context_pressure(&[
v_mutable_chars.clone(),
v_effective_budget.clone(),
v_checkpoint_is_map.clone(),
])?;
v_pressure_is_ok = core_eq(&[v_pressure.clone(), v_ok_pressure.clone()])?;
v_hygiene_changes = core_ne(&[v_pressure_hygiene.clone(), v_default_hygiene.clone()])?;
v_pressure_not_ok = core_not(&[v_pressure_is_ok.clone()])?;
v_should_pressure = core_and(&[v_pressure_not_ok.clone(), v_hygiene_changes.clone()])?;
if core_truthy(&v_should_pressure) {
v_pressure_parts =
_agent_build_action_log_parts(&[v_state.clone(), v_pressure_hygiene.clone()])?;
v_pressure_history = core_get(
&v_pressure_parts,
&CoreValue::from("history"),
CoreValue::from(""),
);
v_pressure_history_empty = core_eq(&[v_pressure_history.clone(), CoreValue::from("")])?;
if core_truthy(&v_pressure_history_empty) {
v_pressure_history = CoreValue::from("(no actions yet)");
}
v_pressure_len = core_len(&[v_pressure_history.clone()])?;
v_history_len = core_len(&[v_history.clone()])?;
v_shorter = core_lt(&[v_pressure_len.clone(), v_history_len.clone()])?;
if core_truthy(&v_shorter) {
v_parts = v_pressure_parts.clone();
v_summary = core_get(
&v_pressure_parts,
&CoreValue::from("summary"),
v_summary.clone(),
);
v_history = v_pressure_history.clone();
}
}
v_compactions = core_get(
&v_parts,
&CoreValue::from("compactions"),
v_empty_list.clone(),
);
for v_compaction in core_iter(&v_compactions)? {
let mut v_compaction = v_compaction;
v_event = CoreValue::new_map();
v_action_compacted_kind =
_agent_context_event_name(&[CoreValue::from("action_compacted")])?;
core_set(
&v_event,
CoreValue::from("kind"),
v_action_compacted_kind.clone(),
)?;
core_set(
&v_event,
CoreValue::from("stage"),
CoreValue::from("executor"),
)?;
v_turn = core_get(
&v_compaction,
&CoreValue::from("turn"),
CoreValue::Num(0f64),
);
v_mode = core_get(
&v_compaction,
&CoreValue::from("mode"),
CoreValue::from("compact"),
);
v_default_reason = _agent_context_event_reason(&[CoreValue::from("pressure")])?;
v_reason = core_get(
&v_compaction,
&CoreValue::from("reason"),
v_default_reason.clone(),
);
v_original_chars = core_get(
&v_compaction,
&CoreValue::from("originalChars"),
CoreValue::Num(0f64),
);
v_rendered_chars = core_get(
&v_compaction,
&CoreValue::from("renderedChars"),
CoreValue::Num(0f64),
);
core_set(&v_event, CoreValue::from("turn"), v_turn.clone())?;
core_set(&v_event, CoreValue::from("mode"), v_mode.clone())?;
core_set(&v_event, CoreValue::from("reason"), v_reason.clone())?;
core_set(
&v_event,
CoreValue::from("originalChars"),
v_original_chars.clone(),
)?;
core_set(
&v_event,
CoreValue::from("renderedChars"),
v_rendered_chars.clone(),
)?;
_agent_record_context_event(&[v_state.clone(), v_event.clone()])?;
}
v_action_log = core_get(
&v_state,
&CoreValue::from("action_log"),
v_empty_list.clone(),
);
v_guidance_count = core_len(&[v_guidance_log.clone()])?;
v_action_count = core_len(&[v_action_log.clone()])?;
v_budget_event = CoreValue::new_map();
v_budget_check_kind = _agent_context_event_name(&[CoreValue::from("budget_check")])?;
core_set(
&v_budget_event,
CoreValue::from("kind"),
v_budget_check_kind.clone(),
)?;
core_set(
&v_budget_event,
CoreValue::from("stage"),
CoreValue::from("executor"),
)?;
v_turn = core_add(&[v_action_count.clone(), CoreValue::Num(1f64)])?;
core_set(&v_budget_event, CoreValue::from("turn"), v_turn.clone())?;
core_set(
&v_budget_event,
CoreValue::from("pressure"),
v_pressure.clone(),
)?;
core_set(
&v_budget_event,
CoreValue::from("mutablePromptChars"),
v_mutable_chars.clone(),
)?;
core_set(
&v_budget_event,
CoreValue::from("fixedPromptChars"),
v_fixed.clone(),
)?;
core_set(
&v_budget_event,
CoreValue::from("effectiveBudgetChars"),
v_effective_budget.clone(),
)?;
core_set(
&v_budget_event,
CoreValue::from("targetPromptChars"),
v_target.clone(),
)?;
core_set(
&v_budget_event,
CoreValue::from("checkpointActive"),
v_checkpoint_is_map.clone(),
)?;
core_set(
&v_budget_event,
CoreValue::from("actionLogEntryCount"),
v_action_count.clone(),
)?;
core_set(
&v_budget_event,
CoreValue::from("guidanceLogEntryCount"),
v_guidance_count.clone(),
)?;
_agent_record_context_event(&[v_state.clone(), v_budget_event.clone()])?;
v_pressure_text = CoreValue::from("");
v_default_preset = core_get(
&v_context_registry,
&CoreValue::from("default_preset"),
CoreValue::from("checkpointed"),
);
v_full_preset = core_get(
&v_context_registry,
&CoreValue::from("full_preset"),
CoreValue::from("full"),
);
v_preset = core_get(
&v_policy,
&CoreValue::from("preset"),
v_default_preset.clone(),
);
v_is_full = core_eq(&[v_preset.clone(), v_full_preset.clone()])?;
if core_truthy(&v_is_full) {
v_pressure_text = CoreValue::from("");
} else {
v_pressure_text = _agent_render_context_pressure(&[v_pressure.clone()])?;
}
v_max_runtime = core_get(
&v_policy,
&CoreValue::from("maxRuntimeChars"),
CoreValue::Num(3000f64),
);
v_dynamic_runtime_chars = _agent_compute_dynamic_runtime_chars(&[
v_action_log.clone(),
v_target.clone(),
v_max_runtime.clone(),
])?;
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("summarizedActorLog"),
v_summary.clone(),
)?;
core_set(&v_out, CoreValue::from("actionLog"), v_history.clone())?;
core_set(
&v_out,
CoreValue::from("guidanceLog"),
v_guidance_text.clone(),
)?;
core_set(
&v_out,
CoreValue::from("liveRuntimeState"),
v_runtime_state_summary.clone(),
)?;
core_set(
&v_out,
CoreValue::from("contextPressure"),
v_pressure_text.clone(),
)?;
core_set(&v_out, CoreValue::from("pressure"), v_pressure.clone())?;
core_set(
&v_out,
CoreValue::from("effectiveBudgetChars"),
v_effective_budget.clone(),
)?;
core_set(
&v_out,
CoreValue::from("mutablePromptChars"),
v_mutable_chars.clone(),
)?;
core_set(
&v_out,
CoreValue::from("dynamicRuntimeChars"),
v_dynamic_runtime_chars.clone(),
)?;
core_set(
&v_state,
CoreValue::from("last_actor_context"),
v_out.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_build_action_evidence_summary(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_build_action_evidence_summary");
let mut v_state = core_arg(args, 0);
let mut v_checkpoint = CoreValue::Null;
let mut v_checkpoint_summary = CoreValue::Null;
let mut v_checkpoint_text = CoreValue::Null;
let mut v_checkpoint_turns = CoreValue::Null;
let mut v_covered = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_entries = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_fallback = CoreValue::Null;
let mut v_has_checkpoint = CoreValue::Null;
let mut v_has_lines = CoreValue::Null;
let mut v_has_runtime = CoreValue::Null;
let mut v_is_error = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_line_text = CoreValue::Null;
let mut v_lines = CoreValue::Null;
let mut v_no_checkpoint = CoreValue::Null;
let mut v_not_error_skip = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_runtime_summary = CoreValue::Null;
let mut v_runtime_text = CoreValue::Null;
let mut v_skip = CoreValue::Null;
let mut v_summary = CoreValue::Null;
let mut v_turn = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_entries = core_get(
&v_state,
&CoreValue::from("action_log"),
v_empty_list.clone(),
);
v_checkpoint = core_get(
&v_state,
&CoreValue::from("checkpoint_state"),
CoreValue::Null,
);
v_checkpoint_summary = core_get(
&v_checkpoint,
&CoreValue::from("summary"),
CoreValue::from(""),
);
v_checkpoint_turns = core_get(
&v_checkpoint,
&CoreValue::from("turns"),
v_empty_list.clone(),
);
v_runtime_summary = core_get(
&v_state,
&CoreValue::from("runtime_state_summary"),
CoreValue::from(""),
);
v_parts = CoreValue::new_list();
core_append(
&v_parts,
CoreValue::from("Actor stopped without calling final(...). Evidence summary:"),
)?;
v_has_checkpoint = core_ne(&[v_checkpoint_summary.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_checkpoint) {
v_checkpoint_text = core_string_format(&[
CoreValue::from("Checkpoint summary:\n{}"),
v_checkpoint_summary.clone(),
])?;
core_append(&v_parts, v_checkpoint_text.clone())?;
}
v_lines = CoreValue::new_list();
v_fallback = CoreValue::Num(1f64);
for v_entry in core_iter(&v_entries)? {
let mut v_entry = v_entry;
v_turn = _agent_entry_turn(&[v_entry.clone(), v_fallback.clone()])?;
v_covered = core_contains(&[v_checkpoint_turns.clone(), v_turn.clone()])?;
v_is_error = _agent_entry_is_error(&[v_entry.clone()])?;
v_not_error_skip = core_not(&[v_is_error.clone()])?;
v_skip = core_and(&[v_covered.clone(), v_not_error_skip.clone()])?;
if core_truthy(&v_skip) {
} else {
v_summary = _agent_entry_summary(&[v_entry.clone(), v_turn.clone()])?;
v_line = core_string_format(&[
CoreValue::from("- Action {}: {}"),
v_turn.clone(),
v_summary.clone(),
])?;
core_append(&v_lines, v_line.clone())?;
}
v_fallback = core_add(&[v_fallback.clone(), CoreValue::Num(1f64)])?;
}
v_line_text = core_string_join_intrinsic(&[CoreValue::from("\n"), v_lines.clone()])?;
v_has_lines = core_ne(&[v_line_text.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_lines) {
core_append(&v_parts, v_line_text.clone())?;
} else {
v_no_checkpoint = core_not(&[v_has_checkpoint.clone()])?;
if core_truthy(&v_no_checkpoint) {
core_append(&v_parts, CoreValue::from("- No actions were taken."))?;
}
}
v_has_runtime = core_ne(&[v_runtime_summary.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_runtime) {
v_runtime_text = core_string_format(&[
CoreValue::from("Current runtime state:\n{}"),
v_runtime_summary.clone(),
])?;
core_append(&v_parts, v_runtime_text.clone())?;
}
v_out = core_string_join_intrinsic(&[CoreValue::from("\n"), v_parts.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_sanitize_action_log_entries(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_sanitize_action_log_entries");
let mut v_entries = core_arg(args, 0);
let mut v_clean = CoreValue::Null;
let mut v_code = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_entry_error = CoreValue::Null;
let mut v_entry_message = CoreValue::Null;
let mut v_entry_name = CoreValue::Null;
let mut v_entry_namespace = CoreValue::Null;
let mut v_error_category = CoreValue::Null;
let mut v_guidance = CoreValue::Null;
let mut v_has_entry_error = CoreValue::Null;
let mut v_has_entry_message = CoreValue::Null;
let mut v_has_entry_name = CoreValue::Null;
let mut v_has_entry_namespace = CoreValue::Null;
let mut v_has_error_category = CoreValue::Null;
let mut v_has_guidance = CoreValue::Null;
let mut v_has_public_action = CoreValue::Null;
let mut v_has_public_kind = CoreValue::Null;
let mut v_has_public_reason = CoreValue::Null;
let mut v_has_public_status = CoreValue::Null;
let mut v_has_public_type = CoreValue::Null;
let mut v_has_qualified_name = CoreValue::Null;
let mut v_has_rank = CoreValue::Null;
let mut v_has_replay_mode = CoreValue::Null;
let mut v_has_state_delta = CoreValue::Null;
let mut v_has_step_kind = CoreValue::Null;
let mut v_has_tombstone = CoreValue::Null;
let mut v_has_tombstone_source = CoreValue::Null;
let mut v_has_triggered_by = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_produced = CoreValue::Null;
let mut v_produced_is_list = CoreValue::Null;
let mut v_public_action = CoreValue::Null;
let mut v_public_kind = CoreValue::Null;
let mut v_public_reason = CoreValue::Null;
let mut v_public_status = CoreValue::Null;
let mut v_public_type = CoreValue::Null;
let mut v_qualified_name = CoreValue::Null;
let mut v_rank = CoreValue::Null;
let mut v_referenced = CoreValue::Null;
let mut v_referenced_is_list = CoreValue::Null;
let mut v_replay_mode = CoreValue::Null;
let mut v_request = CoreValue::Null;
let mut v_request_is_object = CoreValue::Null;
let mut v_searches = CoreValue::Null;
let mut v_searches_is_list = CoreValue::Null;
let mut v_skills = CoreValue::Null;
let mut v_skills_is_list = CoreValue::Null;
let mut v_state_delta = CoreValue::Null;
let mut v_step_kind = CoreValue::Null;
let mut v_tags = CoreValue::Null;
let mut v_tags_is_list = CoreValue::Null;
let mut v_tombstone = CoreValue::Null;
let mut v_tombstone_source = CoreValue::Null;
let mut v_tools = CoreValue::Null;
let mut v_tools_is_list = CoreValue::Null;
let mut v_triggered_by = CoreValue::Null;
let mut v_turn = CoreValue::Null;
v_out = CoreValue::new_list();
for v_entry in core_iter(&v_entries)? {
let mut v_entry = v_entry;
v_clean = CoreValue::new_map();
v_public_type = core_get(&v_entry, &CoreValue::from("type"), CoreValue::from(""));
v_has_public_type = core_ne(&[v_public_type.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_public_type) {
core_set(&v_clean, CoreValue::from("type"), v_public_type.clone())?;
}
v_public_kind = core_get(&v_entry, &CoreValue::from("kind"), CoreValue::from(""));
v_has_public_kind = core_ne(&[v_public_kind.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_public_kind) {
core_set(&v_clean, CoreValue::from("kind"), v_public_kind.clone())?;
}
v_public_action = core_get(&v_entry, &CoreValue::from("action"), CoreValue::from(""));
v_has_public_action = core_ne(&[v_public_action.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_public_action) {
core_set(&v_clean, CoreValue::from("action"), v_public_action.clone())?;
}
v_public_reason = core_get(&v_entry, &CoreValue::from("reason"), CoreValue::from(""));
v_has_public_reason = core_ne(&[v_public_reason.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_public_reason) {
core_set(&v_clean, CoreValue::from("reason"), v_public_reason.clone())?;
}
v_public_status = core_get(&v_entry, &CoreValue::from("status"), CoreValue::from(""));
v_has_public_status = core_ne(&[v_public_status.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_public_status) {
core_set(&v_clean, CoreValue::from("status"), v_public_status.clone())?;
}
v_qualified_name = core_get(
&v_entry,
&CoreValue::from("qualified_name"),
CoreValue::from(""),
);
v_has_qualified_name = core_ne(&[v_qualified_name.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_qualified_name) {
core_set(
&v_clean,
CoreValue::from("qualified_name"),
v_qualified_name.clone(),
)?;
}
v_entry_name = core_get(&v_entry, &CoreValue::from("name"), CoreValue::from(""));
v_has_entry_name = core_ne(&[v_entry_name.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_entry_name) {
core_set(&v_clean, CoreValue::from("name"), v_entry_name.clone())?;
}
v_entry_namespace = core_get(&v_entry, &CoreValue::from("namespace"), CoreValue::from(""));
v_has_entry_namespace = core_ne(&[v_entry_namespace.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_entry_namespace) {
core_set(
&v_clean,
CoreValue::from("namespace"),
v_entry_namespace.clone(),
)?;
}
v_entry_error = core_get(&v_entry, &CoreValue::from("error"), CoreValue::from(""));
v_has_entry_error = core_ne(&[v_entry_error.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_entry_error) {
core_set(&v_clean, CoreValue::from("error"), v_entry_error.clone())?;
}
v_error_category = core_get(
&v_entry,
&CoreValue::from("error_category"),
CoreValue::from(""),
);
v_has_error_category = core_ne(&[v_error_category.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_error_category) {
core_set(
&v_clean,
CoreValue::from("error_category"),
v_error_category.clone(),
)?;
}
v_entry_message = core_get(&v_entry, &CoreValue::from("message"), CoreValue::from(""));
v_has_entry_message = core_ne(&[v_entry_message.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_entry_message) {
core_set(
&v_clean,
CoreValue::from("message"),
v_entry_message.clone(),
)?;
}
v_guidance = core_get(&v_entry, &CoreValue::from("guidance"), CoreValue::from(""));
v_has_guidance = core_ne(&[v_guidance.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_guidance) {
core_set(&v_clean, CoreValue::from("guidance"), v_guidance.clone())?;
}
v_triggered_by = core_get(
&v_entry,
&CoreValue::from("triggered_by"),
CoreValue::from(""),
);
v_has_triggered_by = core_ne(&[v_triggered_by.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_triggered_by) {
core_set(
&v_clean,
CoreValue::from("triggered_by"),
v_triggered_by.clone(),
)?;
}
v_searches = core_get(&v_entry, &CoreValue::from("searches"), CoreValue::Null);
v_searches_is_list = core_type_is(&v_searches, CoreValue::from("list"));
if core_truthy(&v_searches_is_list) {
core_set(&v_clean, CoreValue::from("searches"), v_searches.clone())?;
}
v_tools = core_get(&v_entry, &CoreValue::from("tools"), CoreValue::Null);
v_tools_is_list = core_type_is(&v_tools, CoreValue::from("list"));
if core_truthy(&v_tools_is_list) {
core_set(&v_clean, CoreValue::from("tools"), v_tools.clone())?;
}
v_skills = core_get(&v_entry, &CoreValue::from("skills"), CoreValue::Null);
v_skills_is_list = core_type_is(&v_skills, CoreValue::from("list"));
if core_truthy(&v_skills_is_list) {
core_set(&v_clean, CoreValue::from("skills"), v_skills.clone())?;
}
v_request = core_get(&v_entry, &CoreValue::from("request"), CoreValue::Null);
v_request_is_object = core_type_is(&v_request, CoreValue::from("object"));
if core_truthy(&v_request_is_object) {
core_set(&v_clean, CoreValue::from("request"), v_request.clone())?;
}
v_turn = core_get(&v_entry, &CoreValue::from("turn"), CoreValue::Num(0f64));
v_code = core_get(&v_entry, &CoreValue::from("code"), CoreValue::from(""));
v_output = core_get(&v_entry, &CoreValue::from("output"), CoreValue::from(""));
v_tags = core_get(&v_entry, &CoreValue::from("tags"), CoreValue::Null);
v_tags_is_list = core_type_is(&v_tags, CoreValue::from("list"));
if core_truthy(&v_tags_is_list) {
} else {
v_tags = CoreValue::new_list();
}
core_set(&v_clean, CoreValue::from("turn"), v_turn.clone())?;
core_set(&v_clean, CoreValue::from("code"), v_code.clone())?;
core_set(&v_clean, CoreValue::from("output"), v_output.clone())?;
core_set(&v_clean, CoreValue::from("tags"), v_tags.clone())?;
v_produced = core_get(&v_entry, &CoreValue::from("producedVars"), CoreValue::Null);
v_produced_is_list = core_type_is(&v_produced, CoreValue::from("list"));
if core_truthy(&v_produced_is_list) {
core_set(
&v_clean,
CoreValue::from("producedVars"),
v_produced.clone(),
)?;
}
v_referenced = core_get(
&v_entry,
&CoreValue::from("referencedVars"),
CoreValue::Null,
);
v_referenced_is_list = core_type_is(&v_referenced, CoreValue::from("list"));
if core_truthy(&v_referenced_is_list) {
core_set(
&v_clean,
CoreValue::from("referencedVars"),
v_referenced.clone(),
)?;
}
v_state_delta = core_get(
&v_entry,
&CoreValue::from("stateDelta"),
CoreValue::from(""),
);
v_has_state_delta = core_ne(&[v_state_delta.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_state_delta) {
core_set(
&v_clean,
CoreValue::from("stateDelta"),
v_state_delta.clone(),
)?;
}
v_step_kind = core_get(&v_entry, &CoreValue::from("stepKind"), CoreValue::from(""));
v_has_step_kind = core_ne(&[v_step_kind.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_step_kind) {
core_set(&v_clean, CoreValue::from("stepKind"), v_step_kind.clone())?;
}
v_replay_mode = core_get(
&v_entry,
&CoreValue::from("replayMode"),
CoreValue::from(""),
);
v_has_replay_mode = core_ne(&[v_replay_mode.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_replay_mode) {
core_set(
&v_clean,
CoreValue::from("replayMode"),
v_replay_mode.clone(),
)?;
}
v_rank = core_get(&v_entry, &CoreValue::from("rank"), CoreValue::Null);
v_has_rank = core_is_not_none(&[v_rank.clone()])?;
if core_truthy(&v_has_rank) {
core_set(&v_clean, CoreValue::from("rank"), v_rank.clone())?;
}
v_tombstone = core_get(&v_entry, &CoreValue::from("tombstone"), CoreValue::from(""));
v_has_tombstone = core_ne(&[v_tombstone.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_tombstone) {
core_set(&v_clean, CoreValue::from("tombstone"), v_tombstone.clone())?;
v_tombstone_source = core_get(
&v_entry,
&CoreValue::from("tombstone_source"),
CoreValue::from(""),
);
v_has_tombstone_source = core_ne(&[v_tombstone_source.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_tombstone_source) {
core_set(
&v_clean,
CoreValue::from("tombstone_source"),
v_tombstone_source.clone(),
)?;
}
}
core_append(&v_out, v_clean.clone())?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_context_fixture_result(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_context_fixture_result");
let mut v_state = core_arg(args, 0);
let mut v_fixture = core_arg(args, 1);
let mut v_actor_state = CoreValue::Null;
let mut v_base = CoreValue::Null;
let mut v_checkpoint_active = CoreValue::Null;
let mut v_checkpoint_entries = CoreValue::Null;
let mut v_checkpoint_turns = CoreValue::Null;
let mut v_dynamic = CoreValue::Null;
let mut v_effective = CoreValue::Null;
let mut v_empty_actor_state = CoreValue::Null;
let mut v_empty_entries = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_empty_map2 = CoreValue::Null;
let mut v_entries = CoreValue::Null;
let mut v_evidence = CoreValue::Null;
let mut v_exported = CoreValue::Null;
let mut v_fixed = CoreValue::Null;
let mut v_fixture_action_log = CoreValue::Null;
let mut v_fixture_checkpoint = CoreValue::Null;
let mut v_fixture_options = CoreValue::Null;
let mut v_fixture_options2 = CoreValue::Null;
let mut v_fixture_provenance = CoreValue::Null;
let mut v_fixture_restore_notice = CoreValue::Null;
let mut v_fixture_session_state = CoreValue::Null;
let mut v_has_fixture_action_log = CoreValue::Null;
let mut v_has_fixture_checkpoint = CoreValue::Null;
let mut v_has_fixture_provenance = CoreValue::Null;
let mut v_has_fixture_restore_notice = CoreValue::Null;
let mut v_has_session_state = CoreValue::Null;
let mut v_is_budget = CoreValue::Null;
let mut v_is_checkpoint_summary = CoreValue::Null;
let mut v_is_executor_policy = CoreValue::Null;
let mut v_is_manage_context = CoreValue::Null;
let mut v_is_policy = CoreValue::Null;
let mut v_is_smart = CoreValue::Null;
let mut v_max_chars = CoreValue::Null;
let mut v_max_runtime = CoreValue::Null;
let mut v_mutable_prompt_chars = CoreValue::Null;
let mut v_operation = CoreValue::Null;
let mut v_options = CoreValue::Null;
let mut v_options2 = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_out2 = CoreValue::Null;
let mut v_out_budget = CoreValue::Null;
let mut v_out_smart = CoreValue::Null;
let mut v_out_summary = CoreValue::Null;
let mut v_policy = CoreValue::Null;
let mut v_policy2 = CoreValue::Null;
let mut v_prepared = CoreValue::Null;
let mut v_pressure = CoreValue::Null;
let mut v_pressure_text_budget = CoreValue::Null;
let mut v_selected = CoreValue::Null;
let mut v_summary = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_value = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_operation = core_get(
&v_fixture,
&CoreValue::from("context_operation"),
CoreValue::from("prepare"),
);
v_is_policy = core_eq(&[v_operation.clone(), CoreValue::from("resolve_policy")])?;
if core_truthy(&v_is_policy) {
v_empty_map = CoreValue::new_map();
v_fixture_options = core_get(&v_fixture, &CoreValue::from("options"), v_empty_map.clone());
v_options = core_get(
&v_fixture,
&CoreValue::from("context_options"),
v_fixture_options.clone(),
);
v_policy = _resolve_agent_context_policy(&[v_options.clone()])?;
return Ok(v_policy.clone());
}
v_is_executor_policy = core_eq(&[
v_operation.clone(),
CoreValue::from("executor_model_policy"),
])?;
if core_truthy(&v_is_executor_policy) {
v_empty_map2 = CoreValue::new_map();
v_fixture_options2 = core_get(
&v_fixture,
&CoreValue::from("options"),
v_empty_map2.clone(),
);
v_options2 = core_get(
&v_fixture,
&CoreValue::from("context_options"),
v_fixture_options2.clone(),
);
v_policy2 = _resolve_agent_executor_model_policy(&[v_options2.clone()])?;
v_empty_actor_state = CoreValue::new_map();
v_actor_state = core_get(
&v_fixture,
&CoreValue::from("actor_model_state"),
v_empty_actor_state.clone(),
);
v_selected = _select_agent_executor_model(&[v_policy2.clone(), v_actor_state.clone()])?;
v_out2 = CoreValue::new_map();
core_set(&v_out2, CoreValue::from("policy"), v_policy2.clone())?;
core_set(
&v_out2,
CoreValue::from("selectedModel"),
v_selected.clone(),
)?;
return Ok(v_out2.clone());
}
v_is_budget = core_eq(&[v_operation.clone(), CoreValue::from("budget")])?;
if core_truthy(&v_is_budget) {
v_base = core_get(
&v_fixture,
&CoreValue::from("base_budget"),
CoreValue::Num(16000f64),
);
v_fixed = core_get(
&v_fixture,
&CoreValue::from("fixed_overhead_chars"),
CoreValue::Num(0f64),
);
v_empty_entries = CoreValue::new_list();
v_entries = core_get(
&v_fixture,
&CoreValue::from("action_log"),
v_empty_entries.clone(),
);
v_max_runtime = core_get(
&v_fixture,
&CoreValue::from("max_runtime_chars"),
CoreValue::Num(3000f64),
);
v_effective = _agent_compute_effective_chat_budget(&[v_base.clone(), v_fixed.clone()])?;
v_dynamic = _agent_compute_dynamic_runtime_chars(&[
v_entries.clone(),
v_base.clone(),
v_max_runtime.clone(),
])?;
v_mutable_prompt_chars = core_get(
&v_fixture,
&CoreValue::from("mutable_prompt_chars"),
CoreValue::Num(0f64),
);
v_checkpoint_active = core_get(
&v_fixture,
&CoreValue::from("checkpoint_active"),
CoreValue::Bool(false),
);
v_pressure = _agent_context_pressure(&[
v_mutable_prompt_chars.clone(),
v_effective.clone(),
v_checkpoint_active.clone(),
])?;
v_pressure_text_budget = _agent_render_context_pressure(&[v_pressure.clone()])?;
v_out_budget = CoreValue::new_map();
core_set(
&v_out_budget,
CoreValue::from("effectiveBudgetChars"),
v_effective.clone(),
)?;
core_set(
&v_out_budget,
CoreValue::from("dynamicRuntimeChars"),
v_dynamic.clone(),
)?;
core_set(
&v_out_budget,
CoreValue::from("pressure"),
v_pressure.clone(),
)?;
core_set(
&v_out_budget,
CoreValue::from("contextPressure"),
v_pressure_text_budget.clone(),
)?;
return Ok(v_out_budget.clone());
}
v_is_smart = core_eq(&[v_operation.clone(), CoreValue::from("smart_stringify")])?;
if core_truthy(&v_is_smart) {
v_value = core_get(&v_fixture, &CoreValue::from("value"), CoreValue::Null);
v_max_chars = core_get(
&v_fixture,
&CoreValue::from("max_chars"),
CoreValue::Num(400f64),
);
v_text = _agent_smart_stringify(&[v_value.clone(), v_max_chars.clone()])?;
v_out_smart = CoreValue::new_map();
core_set(&v_out_smart, CoreValue::from("text"), v_text.clone())?;
return Ok(v_out_smart.clone());
}
v_fixture_action_log = core_get(&v_fixture, &CoreValue::from("action_log"), CoreValue::Null);
v_has_fixture_action_log = core_type_is(&v_fixture_action_log, CoreValue::from("list"));
if core_truthy(&v_has_fixture_action_log) {
core_set(
&v_state,
CoreValue::from("action_log"),
v_fixture_action_log.clone(),
)?;
}
v_fixture_session_state = core_get(
&v_fixture,
&CoreValue::from("runtime_session_state"),
CoreValue::Null,
);
v_has_session_state = core_type_is(&v_fixture_session_state, CoreValue::from("object"));
if core_truthy(&v_has_session_state) {
core_set(
&v_state,
CoreValue::from("runtime_session_state"),
v_fixture_session_state.clone(),
)?;
}
v_fixture_checkpoint = core_get(
&v_fixture,
&CoreValue::from("checkpoint_state"),
CoreValue::Null,
);
v_has_fixture_checkpoint = core_type_is(&v_fixture_checkpoint, CoreValue::from("object"));
if core_truthy(&v_has_fixture_checkpoint) {
core_set(
&v_state,
CoreValue::from("checkpoint_state"),
v_fixture_checkpoint.clone(),
)?;
}
v_fixture_provenance = core_get(&v_fixture, &CoreValue::from("provenance"), CoreValue::Null);
v_has_fixture_provenance = core_type_is(&v_fixture_provenance, CoreValue::from("object"));
if core_truthy(&v_has_fixture_provenance) {
core_set(
&v_state,
CoreValue::from("provenance"),
v_fixture_provenance.clone(),
)?;
}
v_fixture_restore_notice = core_get(
&v_fixture,
&CoreValue::from("restore_notice"),
CoreValue::from(""),
);
v_has_fixture_restore_notice =
core_ne(&[v_fixture_restore_notice.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_fixture_restore_notice) {
core_set(
&v_state,
CoreValue::from("restore_notice"),
v_fixture_restore_notice.clone(),
)?;
}
v_is_checkpoint_summary =
core_eq(&[v_operation.clone(), CoreValue::from("checkpoint_summary")])?;
if core_truthy(&v_is_checkpoint_summary) {
v_checkpoint_entries = core_get(
&v_fixture,
&CoreValue::from("checkpoint_entries"),
v_fixture_action_log.clone(),
);
v_checkpoint_turns = core_get(
&v_fixture,
&CoreValue::from("checkpoint_turns"),
v_empty_list.clone(),
);
v_summary = _agent_fallback_checkpoint_summary(&[
v_checkpoint_entries.clone(),
v_checkpoint_turns.clone(),
])?;
v_out_summary = CoreValue::new_map();
core_set(
&v_out_summary,
CoreValue::from("summary"),
v_summary.clone(),
)?;
return Ok(v_out_summary.clone());
}
v_is_manage_context = core_eq(&[v_operation.clone(), CoreValue::from("manage_context")])?;
if core_truthy(&v_is_manage_context) {
_agent_apply_context_management(&[v_state.clone()])?;
}
v_prepared = _agent_prepare_actor_context(&[v_state.clone()])?;
v_evidence = _agent_build_action_evidence_summary(&[v_state.clone()])?;
v_exported = _agent_export_runtime_state(&[v_state.clone()])?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("prepared"), v_prepared.clone())?;
core_set(&v_out, CoreValue::from("evidence"), v_evidence.clone())?;
core_set(&v_out, CoreValue::from("exported"), v_exported.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_agent_callable(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_agent_callable");
let mut v_raw = core_arg(args, 0);
let mut v_namespace = core_arg(args, 1);
let mut v_always_camel = CoreValue::Null;
let mut v_always_include = CoreValue::Null;
let mut v_description = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_kind = CoreValue::Null;
let mut v_missing_name = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_parameters = CoreValue::Null;
let mut v_qualified = CoreValue::Null;
v_name = core_get(&v_raw, &CoreValue::from("name"), CoreValue::from(""));
v_missing_name = core_eq(&[v_name.clone(), CoreValue::from("")])?;
if core_truthy(&v_missing_name) {
v_error = core_runtime_error(&[CoreValue::from("agent callable name is required")])?;
return Err(core_as_error(&v_error));
}
v_kind = core_get(&v_raw, &CoreValue::from("kind"), CoreValue::from("tool"));
v_description = core_get(&v_raw, &CoreValue::from("description"), CoreValue::from(""));
v_qualified = core_string_format(&[
CoreValue::from("{}.{}"),
v_namespace.clone(),
v_name.clone(),
])?;
v_parameters = core_get(&v_raw, &CoreValue::from("parameters"), CoreValue::Null);
v_always_camel = core_get(
&v_raw,
&CoreValue::from("alwaysInclude"),
CoreValue::Bool(false),
);
v_always_include = core_get(
&v_raw,
&CoreValue::from("always_include"),
v_always_camel.clone(),
);
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("name"), v_name.clone())?;
core_set(&v_out, CoreValue::from("namespace"), v_namespace.clone())?;
core_set(
&v_out,
CoreValue::from("qualified_name"),
v_qualified.clone(),
)?;
core_set(&v_out, CoreValue::from("kind"), v_kind.clone())?;
core_set(
&v_out,
CoreValue::from("description"),
v_description.clone(),
)?;
core_set(&v_out, CoreValue::from("parameters"), v_parameters.clone())?;
core_set(
&v_out,
CoreValue::from("always_include"),
v_always_include.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_agent_group(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_agent_group");
let mut v_raw = core_arg(args, 0);
let mut v_always_camel = CoreValue::Null;
let mut v_always_include = CoreValue::Null;
let mut v_callable = CoreValue::Null;
let mut v_callables = CoreValue::Null;
let mut v_conflicts = CoreValue::Null;
let mut v_description = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_fn = CoreValue::Null;
let mut v_functions = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_namespace = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_reserved = CoreValue::Null;
let mut v_selection_camel = CoreValue::Null;
let mut v_selection_criteria = CoreValue::Null;
let mut v_title = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_name = core_get(&v_raw, &CoreValue::from("name"), CoreValue::from("tools"));
v_namespace = core_get(&v_raw, &CoreValue::from("namespace"), v_name.clone());
v_reserved = _agent_reserved_runtime_names(&[])?;
v_conflicts = core_contains(&[v_reserved.clone(), v_namespace.clone()])?;
if core_truthy(&v_conflicts) {
v_message = core_string_format(&[
CoreValue::from("agent callable namespace conflicts with reserved runtime name: {}"),
v_namespace.clone(),
])?;
v_error = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
v_title = core_get(&v_raw, &CoreValue::from("title"), v_namespace.clone());
v_description = core_get(&v_raw, &CoreValue::from("description"), CoreValue::from(""));
v_selection_camel = core_get(
&v_raw,
&CoreValue::from("selectionCriteria"),
CoreValue::from(""),
);
v_selection_criteria = core_get(
&v_raw,
&CoreValue::from("selection_criteria"),
v_selection_camel.clone(),
);
v_always_camel = core_get(
&v_raw,
&CoreValue::from("alwaysInclude"),
CoreValue::Bool(false),
);
v_always_include = core_get(
&v_raw,
&CoreValue::from("always_include"),
v_always_camel.clone(),
);
v_functions = core_get(&v_raw, &CoreValue::from("functions"), v_empty_list.clone());
v_callables = CoreValue::new_list();
for v_fn in core_iter(&v_functions)? {
let mut v_fn = v_fn;
v_callable = _normalize_agent_callable(&[v_fn.clone(), v_namespace.clone()])?;
core_append(&v_callables, v_callable.clone())?;
}
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("namespace"), v_namespace.clone())?;
core_set(&v_out, CoreValue::from("title"), v_title.clone())?;
core_set(
&v_out,
CoreValue::from("description"),
v_description.clone(),
)?;
core_set(
&v_out,
CoreValue::from("selection_criteria"),
v_selection_criteria.clone(),
)?;
core_set(
&v_out,
CoreValue::from("always_include"),
v_always_include.clone(),
)?;
core_set(&v_out, CoreValue::from("callables"), v_callables.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_agent_callable_inventory(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_agent_callable_inventory");
let mut v_options = core_arg(args, 0);
let mut v_callable = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_flat_callables = CoreValue::Null;
let mut v_flat_count = CoreValue::Null;
let mut v_flat_group = CoreValue::Null;
let mut v_functions = CoreValue::Null;
let mut v_group = CoreValue::Null;
let mut v_group_functions = CoreValue::Null;
let mut v_groups = CoreValue::Null;
let mut v_has_any_flat = CoreValue::Null;
let mut v_has_flat = CoreValue::Null;
let mut v_has_group = CoreValue::Null;
let mut v_is_group = CoreValue::Null;
let mut v_item = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_functions = core_get(
&v_options,
&CoreValue::from("functions"),
v_empty_list.clone(),
);
v_groups = CoreValue::new_list();
v_flat_callables = CoreValue::new_list();
v_has_flat = CoreValue::Bool(false);
v_has_group = CoreValue::Bool(false);
for v_item in core_iter(&v_functions)? {
let mut v_item = v_item;
v_group_functions = core_get(&v_item, &CoreValue::from("functions"), CoreValue::Null);
v_is_group = core_type_is(&v_group_functions, CoreValue::from("list"));
if core_truthy(&v_is_group) {
v_has_group = CoreValue::Bool(true);
if core_truthy(&v_has_flat) {
v_error = core_runtime_error(&[CoreValue::from(
"agent functions cannot mix grouped modules and flat functions",
)])?;
return Err(core_as_error(&v_error));
}
v_group = _normalize_agent_group(&[v_item.clone()])?;
core_append(&v_groups, v_group.clone())?;
} else {
v_has_flat = CoreValue::Bool(true);
if core_truthy(&v_has_group) {
v_error = core_runtime_error(&[CoreValue::from(
"agent functions cannot mix grouped modules and flat functions",
)])?;
return Err(core_as_error(&v_error));
}
v_callable = _normalize_agent_callable(&[v_item.clone(), CoreValue::from("tools")])?;
core_append(&v_flat_callables, v_callable.clone())?;
}
}
v_flat_count = core_len(&[v_flat_callables.clone()])?;
v_has_any_flat = core_gt(&[v_flat_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_any_flat) {
v_flat_group = CoreValue::new_map();
core_set(
&v_flat_group,
CoreValue::from("namespace"),
CoreValue::from("tools"),
)?;
core_set(
&v_flat_group,
CoreValue::from("title"),
CoreValue::from("Tools"),
)?;
core_set(
&v_flat_group,
CoreValue::from("description"),
CoreValue::from(""),
)?;
core_set(
&v_flat_group,
CoreValue::from("selection_criteria"),
CoreValue::from(""),
)?;
core_set(
&v_flat_group,
CoreValue::from("always_include"),
CoreValue::Bool(true),
)?;
core_set(
&v_flat_group,
CoreValue::from("callables"),
v_flat_callables.clone(),
)?;
core_append(&v_groups, v_flat_group.clone())?;
}
return Ok(v_groups.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _split_agent_callable_inventory(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_split_agent_callable_inventory");
let mut v_inventory = core_arg(args, 0);
let mut v_always = CoreValue::Null;
let mut v_discoverable = CoreValue::Null;
let mut v_group = CoreValue::Null;
let mut v_inline = CoreValue::Null;
let mut v_out = CoreValue::Null;
v_inline = CoreValue::new_list();
v_discoverable = CoreValue::new_list();
for v_group in core_iter(&v_inventory)? {
let mut v_group = v_group;
v_always = core_get(
&v_group,
&CoreValue::from("always_include"),
CoreValue::Bool(false),
);
if core_truthy(&v_always) {
core_append(&v_inline, v_group.clone())?;
} else {
core_append(&v_discoverable, v_group.clone())?;
}
}
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("inline"), v_inline.clone())?;
core_set(
&v_out,
CoreValue::from("discoverable"),
v_discoverable.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _render_agent_discovery_catalog(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_render_agent_discovery_catalog");
let mut v_split = core_arg(args, 0);
let mut v_callable = CoreValue::Null;
let mut v_callable_names = CoreValue::Null;
let mut v_callables = CoreValue::Null;
let mut v_catalog = CoreValue::Null;
let mut v_discoverable = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_group = CoreValue::Null;
let mut v_hint = CoreValue::Null;
let mut v_inline = CoreValue::Null;
let mut v_namespace = CoreValue::Null;
let mut v_qualified = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_catalog = CoreValue::new_list();
v_inline = core_get(&v_split, &CoreValue::from("inline"), v_empty_list.clone());
v_discoverable = core_get(
&v_split,
&CoreValue::from("discoverable"),
v_empty_list.clone(),
);
for v_group in core_iter(&v_inline)? {
let mut v_group = v_group;
v_callable_names = CoreValue::new_list();
v_callables = core_get(
&v_group,
&CoreValue::from("callables"),
v_empty_list.clone(),
);
for v_callable in core_iter(&v_callables)? {
let mut v_callable = v_callable;
v_qualified = core_get(
&v_callable,
&CoreValue::from("qualified_name"),
CoreValue::Null,
);
core_append(&v_callable_names, v_qualified.clone())?;
}
v_namespace = core_get(&v_group, &CoreValue::from("namespace"), CoreValue::Null);
v_entry = CoreValue::new_map();
core_set(&v_entry, CoreValue::from("namespace"), v_namespace.clone())?;
core_set(
&v_entry,
CoreValue::from("placement"),
CoreValue::from("actor_prompt"),
)?;
core_set(
&v_entry,
CoreValue::from("callables"),
v_callable_names.clone(),
)?;
core_append(&v_catalog, v_entry.clone())?;
}
for v_group in core_iter(&v_discoverable)? {
let mut v_group = v_group;
v_namespace = core_get(&v_group, &CoreValue::from("namespace"), CoreValue::Null);
v_hint = core_string_format(&[CoreValue::from("discover tools {}"), v_namespace.clone()])?;
v_entry = CoreValue::new_map();
core_set(&v_entry, CoreValue::from("namespace"), v_namespace.clone())?;
core_set(
&v_entry,
CoreValue::from("placement"),
CoreValue::from("discover"),
)?;
core_set(&v_entry, CoreValue::from("hint"), v_hint.clone())?;
core_append(&v_catalog, v_entry.clone())?;
}
return Ok(v_catalog.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_agent_string_list(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_agent_string_list");
let mut v_value = core_arg(args, 0);
let mut v_label = core_arg(args, 1);
let mut v_already = CoreValue::Null;
let mut v_bad_item = CoreValue::Null;
let mut v_count = CoreValue::Null;
let mut v_empty = CoreValue::Null;
let mut v_empty_item = CoreValue::Null;
let mut v_empty_out = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_fresh = CoreValue::Null;
let mut v_is_list = CoreValue::Null;
let mut v_is_string = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_item_is_string = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_not_list = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_trimmed = CoreValue::Null;
let mut v_trimmed_item = CoreValue::Null;
v_out = CoreValue::new_list();
v_is_string = core_type_is(&v_value, CoreValue::from("string"));
if core_truthy(&v_is_string) {
v_trimmed = core_string_trim(&v_value);
v_empty = core_eq(&[v_trimmed.clone(), CoreValue::from("")])?;
if core_truthy(&v_empty) {
v_message = core_string_format(&[
CoreValue::from("{} entries must be non-empty strings"),
v_label.clone(),
])?;
v_error = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
} else {
core_append(&v_out, v_trimmed.clone())?;
}
} else {
v_is_list = core_type_is(&v_value, CoreValue::from("list"));
v_not_list = core_not(&[v_is_list.clone()])?;
if core_truthy(&v_not_list) {
v_message = core_string_format(&[
CoreValue::from("{} must be a string or string[]"),
v_label.clone(),
])?;
v_error = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
} else {
for v_item in core_iter(&v_value)? {
let mut v_item = v_item;
v_item_is_string = core_type_is(&v_item, CoreValue::from("string"));
v_bad_item = core_not(&[v_item_is_string.clone()])?;
if core_truthy(&v_bad_item) {
v_message = core_string_format(&[
CoreValue::from("{} entries must be strings"),
v_label.clone(),
])?;
v_error = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
} else {
v_trimmed_item = core_string_trim(&v_item);
v_empty_item = core_eq(&[v_trimmed_item.clone(), CoreValue::from("")])?;
if core_truthy(&v_empty_item) {
v_message = core_string_format(&[
CoreValue::from("{} entries must be non-empty strings"),
v_label.clone(),
])?;
v_error = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
} else {
v_already = core_contains(&[v_out.clone(), v_trimmed_item.clone()])?;
v_fresh = core_not(&[v_already.clone()])?;
if core_truthy(&v_fresh) {
core_append(&v_out, v_trimmed_item.clone())?;
}
}
}
}
}
}
v_count = core_len(&[v_out.clone()])?;
v_empty_out = core_eq(&[v_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_empty_out) {
v_message = core_string_format(&[
CoreValue::from("{} requires at least one entry"),
v_label.clone(),
])?;
v_error = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_agent_discover_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_agent_discover_request");
let mut v_state = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_bad = CoreValue::Null;
let mut v_bad_skills = CoreValue::Null;
let mut v_bad_tools = CoreValue::Null;
let mut v_direct_tools = CoreValue::Null;
let mut v_discovery_mode = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_flags = CoreValue::Null;
let mut v_has_any = CoreValue::Null;
let mut v_has_skill_items = CoreValue::Null;
let mut v_has_skills = CoreValue::Null;
let mut v_has_tool_items = CoreValue::Null;
let mut v_has_tools = CoreValue::Null;
let mut v_is_list = CoreValue::Null;
let mut v_is_map = CoreValue::Null;
let mut v_is_string = CoreValue::Null;
let mut v_missing_any = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_raw_skills = CoreValue::Null;
let mut v_raw_tools = CoreValue::Null;
let mut v_skill_count = CoreValue::Null;
let mut v_skills = CoreValue::Null;
let mut v_skills_disabled = CoreValue::Null;
let mut v_skills_mode = CoreValue::Null;
let mut v_tool_count = CoreValue::Null;
let mut v_tools = CoreValue::Null;
let mut v_tools_disabled = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_tools = CoreValue::new_list();
v_skills = CoreValue::new_list();
v_flags = core_get(&v_state, &CoreValue::from("policy_flags"), CoreValue::Null);
v_is_string = core_type_is(&v_request, CoreValue::from("string"));
v_is_list = core_type_is(&v_request, CoreValue::from("list"));
v_direct_tools = core_or(&[v_is_string.clone(), v_is_list.clone()])?;
if core_truthy(&v_direct_tools) {
v_tools =
_normalize_agent_string_list(&[v_request.clone(), CoreValue::from("discover tools")])?;
} else {
v_is_map = core_type_is(&v_request, CoreValue::from("object"));
v_bad = core_not(&[v_is_map.clone()])?;
if core_truthy(&v_bad) {
v_error = core_runtime_error(&[CoreValue::from(
"discover(...) expects a string, string[], or { tools?, skills? }",
)])?;
return Err(core_as_error(&v_error));
} else {
v_has_tools = core_map_contains(&[v_request.clone(), CoreValue::from("tools")])?;
v_has_skills = core_map_contains(&[v_request.clone(), CoreValue::from("skills")])?;
v_has_any = core_or(&[v_has_tools.clone(), v_has_skills.clone()])?;
v_missing_any = core_not(&[v_has_any.clone()])?;
if core_truthy(&v_missing_any) {
v_error = core_runtime_error(&[CoreValue::from(
"discover(...) requires at least one of tools or skills",
)])?;
return Err(core_as_error(&v_error));
}
if core_truthy(&v_has_tools) {
v_raw_tools = core_get(&v_request, &CoreValue::from("tools"), v_empty_list.clone());
v_tools = _normalize_agent_string_list(&[
v_raw_tools.clone(),
CoreValue::from("discover tools"),
])?;
}
if core_truthy(&v_has_skills) {
v_raw_skills =
core_get(&v_request, &CoreValue::from("skills"), v_empty_list.clone());
v_skills = _normalize_agent_string_list(&[
v_raw_skills.clone(),
CoreValue::from("discover skills"),
])?;
}
}
}
v_tool_count = core_len(&[v_tools.clone()])?;
v_skill_count = core_len(&[v_skills.clone()])?;
v_has_tool_items = core_gt(&[v_tool_count.clone(), CoreValue::Num(0f64)])?;
v_has_skill_items = core_gt(&[v_skill_count.clone(), CoreValue::Num(0f64)])?;
v_discovery_mode = core_get(
&v_flags,
&CoreValue::from("discoveryMode"),
CoreValue::Bool(false),
);
v_skills_mode = core_get(
&v_flags,
&CoreValue::from("skillsMode"),
CoreValue::Bool(false),
);
v_tools_disabled = core_not(&[v_discovery_mode.clone()])?;
v_skills_disabled = core_not(&[v_skills_mode.clone()])?;
v_bad_tools = core_and(&[v_has_tool_items.clone(), v_tools_disabled.clone()])?;
if core_truthy(&v_bad_tools) {
v_error = core_runtime_error(&[CoreValue::from(
"discover({ tools }) requires function discovery to be enabled",
)])?;
return Err(core_as_error(&v_error));
}
v_bad_skills = core_and(&[v_has_skill_items.clone(), v_skills_disabled.clone()])?;
if core_truthy(&v_bad_skills) {
v_error = core_runtime_error(&[CoreValue::from(
"discover({ skills }) requires skill discovery to be enabled",
)])?;
return Err(core_as_error(&v_error));
}
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("tools"), v_tools.clone())?;
core_set(&v_out, CoreValue::from("skills"), v_skills.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_append_unique_by_field(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_append_unique_by_field");
let mut v_items = core_arg(args, 0);
let mut v_item = core_arg(args, 1);
let mut v_field = core_arg(args, 2);
let mut v_existing = CoreValue::Null;
let mut v_existing_value = CoreValue::Null;
let mut v_found = CoreValue::Null;
let mut v_matches = CoreValue::Null;
let mut v_missing = CoreValue::Null;
let mut v_value = CoreValue::Null;
v_value = core_get(&v_item, &v_field.clone(), CoreValue::from(""));
v_found = CoreValue::Bool(false);
for v_existing in core_iter(&v_items)? {
let mut v_existing = v_existing;
v_existing_value = core_get(&v_existing, &v_field.clone(), CoreValue::from(""));
v_matches = core_eq(&[v_existing_value.clone(), v_value.clone()])?;
if core_truthy(&v_matches) {
v_found = CoreValue::Bool(true);
}
}
v_missing = core_not(&[v_found.clone()])?;
if core_truthy(&v_missing) {
core_append(&v_items, v_item.clone())?;
}
return Ok(v_items.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_render_discovered_tool_docs(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_render_discovered_tool_docs");
let mut v_docs = core_arg(args, 0);
let mut v_body = CoreValue::Null;
let mut v_description = CoreValue::Null;
let mut v_doc = CoreValue::Null;
let mut v_empty = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_lines = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_qualified = CoreValue::Null;
v_lines = CoreValue::new_list();
for v_doc in core_iter(&v_docs)? {
let mut v_doc = v_doc;
v_qualified = core_get(
&v_doc,
&CoreValue::from("qualified_name"),
CoreValue::from(""),
);
v_description = core_get(&v_doc, &CoreValue::from("description"), CoreValue::from(""));
v_line = core_string_format(&[
CoreValue::from("- {}: {}"),
v_qualified.clone(),
v_description.clone(),
])?;
core_append(&v_lines, v_line.clone())?;
}
v_body = core_string_join_intrinsic(&[CoreValue::from("\n"), v_lines.clone()])?;
v_empty = core_eq(&[v_body.clone(), CoreValue::from("")])?;
v_out = v_body.clone();
if core_truthy(&v_empty) {
v_out = CoreValue::from("");
} else {
v_out = core_string_format(&[CoreValue::from("Discovered Tool Docs\n{}"), v_body.clone()])?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_render_loaded_skills(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_render_loaded_skills");
let mut v_skills = core_arg(args, 0);
let mut v_body = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_empty = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_lines = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_skill = CoreValue::Null;
v_lines = CoreValue::new_list();
for v_skill in core_iter(&v_skills)? {
let mut v_skill = v_skill;
v_name = core_get(&v_skill, &CoreValue::from("name"), CoreValue::from(""));
v_content = core_get(&v_skill, &CoreValue::from("content"), CoreValue::from(""));
v_line = core_string_format(&[
CoreValue::from("### {}\n{}"),
v_name.clone(),
v_content.clone(),
])?;
core_append(&v_lines, v_line.clone())?;
}
v_body = core_string_join_intrinsic(&[CoreValue::from("\n\n"), v_lines.clone()])?;
v_empty = core_eq(&[v_body.clone(), CoreValue::from("")])?;
v_out = v_body.clone();
if core_truthy(&v_empty) {
v_out = CoreValue::from("");
} else {
v_out = core_string_format(&[CoreValue::from("Loaded Skills\n{}"), v_body.clone()])?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_discover(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_discover");
let mut v_state = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_action_event = CoreValue::Null;
let mut v_action_log = CoreValue::Null;
let mut v_callable = CoreValue::Null;
let mut v_callables = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_description = CoreValue::Null;
let mut v_doc = CoreValue::Null;
let mut v_doc_description = CoreValue::Null;
let mut v_doc_kind = CoreValue::Null;
let mut v_doc_name = CoreValue::Null;
let mut v_doc_qualified = CoreValue::Null;
let mut v_docs = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_event = CoreValue::Null;
let mut v_group = CoreValue::Null;
let mut v_has_host = CoreValue::Null;
let mut v_has_skills = CoreValue::Null;
let mut v_host_count = CoreValue::Null;
let mut v_host_skill = CoreValue::Null;
let mut v_host_skills = CoreValue::Null;
let mut v_inventory = CoreValue::Null;
let mut v_kind = CoreValue::Null;
let mut v_matches = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_name_match = CoreValue::Null;
let mut v_namespace = CoreValue::Null;
let mut v_namespace_match = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_normalized = CoreValue::Null;
let mut v_qualified = CoreValue::Null;
let mut v_qualified_match = CoreValue::Null;
let mut v_skill = CoreValue::Null;
let mut v_skill_count = CoreValue::Null;
let mut v_skill_docs = CoreValue::Null;
let mut v_skill_id = CoreValue::Null;
let mut v_skill_name = CoreValue::Null;
let mut v_skills = CoreValue::Null;
let mut v_tools = CoreValue::Null;
let mut v_trace = CoreValue::Null;
let mut v_wanted = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_normalized = _normalize_agent_discover_request(&[v_state.clone(), v_request.clone()])?;
v_inventory = core_get(
&v_state,
&CoreValue::from("callable_inventory"),
v_empty_list.clone(),
);
v_docs = core_get(
&v_state,
&CoreValue::from("discovered_tool_docs"),
v_empty_list.clone(),
);
v_skill_docs = core_get(
&v_state,
&CoreValue::from("loaded_skill_docs"),
v_empty_list.clone(),
);
v_trace = core_get(
&v_state,
&CoreValue::from("policy_trace"),
v_empty_list.clone(),
);
v_action_log = core_get(
&v_state,
&CoreValue::from("action_log"),
v_empty_list.clone(),
);
v_tools = core_get(
&v_normalized,
&CoreValue::from("tools"),
v_empty_list.clone(),
);
v_skills = core_get(
&v_normalized,
&CoreValue::from("skills"),
v_empty_list.clone(),
);
for v_wanted in core_iter(&v_tools)? {
let mut v_wanted = v_wanted;
for v_group in core_iter(&v_inventory)? {
let mut v_group = v_group;
v_namespace = core_get(&v_group, &CoreValue::from("namespace"), CoreValue::Null);
v_namespace_match = core_eq(&[v_namespace.clone(), v_wanted.clone()])?;
v_callables = core_get(
&v_group,
&CoreValue::from("callables"),
v_empty_list.clone(),
);
if core_truthy(&v_namespace_match) {
for v_callable in core_iter(&v_callables)? {
let mut v_callable = v_callable;
v_doc_name = core_get(&v_callable, &CoreValue::from("name"), CoreValue::Null);
v_doc_qualified = core_get(
&v_callable,
&CoreValue::from("qualified_name"),
CoreValue::Null,
);
v_doc_kind = core_get(&v_callable, &CoreValue::from("kind"), CoreValue::Null);
v_doc_description = core_get(
&v_callable,
&CoreValue::from("description"),
CoreValue::from(""),
);
v_doc = CoreValue::new_map();
core_set(&v_doc, CoreValue::from("namespace"), v_namespace.clone())?;
core_set(&v_doc, CoreValue::from("name"), v_doc_name.clone())?;
core_set(
&v_doc,
CoreValue::from("qualified_name"),
v_doc_qualified.clone(),
)?;
core_set(&v_doc, CoreValue::from("kind"), v_doc_kind.clone())?;
core_set(
&v_doc,
CoreValue::from("description"),
v_doc_description.clone(),
)?;
v_docs = _agent_append_unique_by_field(&[
v_docs.clone(),
v_doc.clone(),
CoreValue::from("qualified_name"),
])?;
}
} else {
for v_callable in core_iter(&v_callables)? {
let mut v_callable = v_callable;
v_qualified = core_get(
&v_callable,
&CoreValue::from("qualified_name"),
CoreValue::Null,
);
v_name = core_get(&v_callable, &CoreValue::from("name"), CoreValue::Null);
v_qualified_match = core_eq(&[v_qualified.clone(), v_wanted.clone()])?;
v_name_match = core_eq(&[v_name.clone(), v_wanted.clone()])?;
v_matches = core_or(&[v_qualified_match.clone(), v_name_match.clone()])?;
if core_truthy(&v_matches) {
v_kind = core_get(&v_callable, &CoreValue::from("kind"), CoreValue::Null);
v_description = core_get(
&v_callable,
&CoreValue::from("description"),
CoreValue::from(""),
);
v_doc = CoreValue::new_map();
core_set(&v_doc, CoreValue::from("namespace"), v_namespace.clone())?;
core_set(&v_doc, CoreValue::from("name"), v_name.clone())?;
core_set(
&v_doc,
CoreValue::from("qualified_name"),
v_qualified.clone(),
)?;
core_set(&v_doc, CoreValue::from("kind"), v_kind.clone())?;
core_set(
&v_doc,
CoreValue::from("description"),
v_description.clone(),
)?;
v_docs = _agent_append_unique_by_field(&[
v_docs.clone(),
v_doc.clone(),
CoreValue::from("qualified_name"),
])?;
}
}
}
}
}
v_skill_count = core_len(&[v_skills.clone()])?;
v_has_skills = core_gt(&[v_skill_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_skills) {
v_host_skills = core_agent_skill_search(&[v_state.clone(), v_skills.clone()])?;
v_host_count = core_len(&[v_host_skills.clone()])?;
v_has_host = core_gt(&[v_host_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_host) {
for v_host_skill in core_iter(&v_host_skills)? {
let mut v_host_skill = v_host_skill;
v_skill_name =
core_get(&v_host_skill, &CoreValue::from("name"), CoreValue::from(""));
v_skill_id = core_get(&v_host_skill, &CoreValue::from("id"), v_skill_name.clone());
core_set(&v_host_skill, CoreValue::from("id"), v_skill_id.clone())?;
v_skill_docs = _agent_append_unique_by_field(&[
v_skill_docs.clone(),
v_host_skill.clone(),
CoreValue::from("id"),
])?;
}
} else {
for v_skill in core_iter(&v_skills)? {
let mut v_skill = v_skill;
v_doc = CoreValue::new_map();
core_set(&v_doc, CoreValue::from("id"), v_skill.clone())?;
core_set(&v_doc, CoreValue::from("name"), v_skill.clone())?;
v_content = core_string_format(&[
CoreValue::from("Skill docs loaded for {}"),
v_skill.clone(),
])?;
core_set(&v_doc, CoreValue::from("content"), v_content.clone())?;
v_skill_docs = _agent_append_unique_by_field(&[
v_skill_docs.clone(),
v_doc.clone(),
CoreValue::from("id"),
])?;
}
}
}
v_event = CoreValue::new_map();
core_set(
&v_event,
CoreValue::from("type"),
CoreValue::from("discover"),
)?;
core_set(&v_event, CoreValue::from("tools"), v_tools.clone())?;
core_set(&v_event, CoreValue::from("skills"), v_skills.clone())?;
core_append(&v_trace, v_event.clone())?;
v_action_event = CoreValue::new_map();
core_set(
&v_action_event,
CoreValue::from("type"),
CoreValue::from("discover"),
)?;
core_set(
&v_action_event,
CoreValue::from("request"),
v_request.clone(),
)?;
core_set(&v_action_event, CoreValue::from("tools"), v_tools.clone())?;
core_set(&v_action_event, CoreValue::from("skills"), v_skills.clone())?;
core_append(&v_action_log, v_action_event.clone())?;
core_set(
&v_state,
CoreValue::from("discovered_tool_docs"),
v_docs.clone(),
)?;
core_set(
&v_state,
CoreValue::from("loaded_skill_docs"),
v_skill_docs.clone(),
)?;
core_set(&v_state, CoreValue::from("policy_trace"), v_trace.clone())?;
core_set(
&v_state,
CoreValue::from("action_log"),
v_action_log.clone(),
)?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("discover"),
v_event.clone(),
])?;
v_none = core_none(&[])?;
return Ok(v_none.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_agent_recall_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_agent_recall_request");
let mut v_state = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_disabled = CoreValue::Null;
let mut v_enabled = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_flags = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_searches = CoreValue::Null;
v_flags = core_get(&v_state, &CoreValue::from("policy_flags"), CoreValue::Null);
v_enabled = core_get(
&v_flags,
&CoreValue::from("memoriesMode"),
CoreValue::Bool(false),
);
v_disabled = core_not(&[v_enabled.clone()])?;
if core_truthy(&v_disabled) {
v_error = core_runtime_error(&[CoreValue::from(
"recall(...) requires memory search to be enabled",
)])?;
return Err(core_as_error(&v_error));
}
v_searches =
_normalize_agent_string_list(&[v_request.clone(), CoreValue::from("recall searches")])?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("searches"), v_searches.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_merge_memory_results(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_merge_memory_results");
let mut v_existing = core_arg(args, 0);
let mut v_incoming = core_arg(args, 1);
let mut v_content = CoreValue::Null;
let mut v_has_content = CoreValue::Null;
let mut v_has_id = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_memory = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_valid = CoreValue::Null;
v_out = v_existing.clone();
for v_memory in core_iter(&v_incoming)? {
let mut v_memory = v_memory;
v_id = core_get(&v_memory, &CoreValue::from("id"), CoreValue::from(""));
v_content = core_get(&v_memory, &CoreValue::from("content"), CoreValue::from(""));
v_has_id = core_ne(&[v_id.clone(), CoreValue::from("")])?;
v_has_content = core_ne(&[v_content.clone(), CoreValue::from("")])?;
v_valid = core_and(&[v_has_id.clone(), v_has_content.clone()])?;
if core_truthy(&v_valid) {
v_out = _agent_append_unique_by_field(&[
v_out.clone(),
v_memory.clone(),
CoreValue::from("id"),
])?;
}
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_recall(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_recall");
let mut v_state = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_action = CoreValue::Null;
let mut v_action_log = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_event = CoreValue::Null;
let mut v_incoming = CoreValue::Null;
let mut v_loaded = CoreValue::Null;
let mut v_merged = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_normalized = CoreValue::Null;
let mut v_searches = CoreValue::Null;
let mut v_trace = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_normalized = _normalize_agent_recall_request(&[v_state.clone(), v_request.clone()])?;
v_searches = core_get(
&v_normalized,
&CoreValue::from("searches"),
v_empty_list.clone(),
);
v_loaded = core_get(
&v_state,
&CoreValue::from("loaded_memories"),
v_empty_list.clone(),
);
v_incoming =
core_agent_memory_search(&[v_state.clone(), v_searches.clone(), v_loaded.clone()])?;
v_merged = _agent_merge_memory_results(&[v_loaded.clone(), v_incoming.clone()])?;
core_set(
&v_state,
CoreValue::from("loaded_memories"),
v_merged.clone(),
)?;
v_trace = core_get(
&v_state,
&CoreValue::from("policy_trace"),
v_empty_list.clone(),
);
v_event = CoreValue::new_map();
core_set(&v_event, CoreValue::from("type"), CoreValue::from("recall"))?;
core_set(&v_event, CoreValue::from("searches"), v_searches.clone())?;
core_set(&v_event, CoreValue::from("loaded"), v_incoming.clone())?;
core_append(&v_trace, v_event.clone())?;
core_set(&v_state, CoreValue::from("policy_trace"), v_trace.clone())?;
v_action_log = core_get(
&v_state,
&CoreValue::from("action_log"),
v_empty_list.clone(),
);
v_action = CoreValue::new_map();
core_set(
&v_action,
CoreValue::from("type"),
CoreValue::from("recall"),
)?;
core_set(&v_action, CoreValue::from("searches"), v_searches.clone())?;
core_set(&v_action, CoreValue::from("loaded"), v_incoming.clone())?;
core_append(&v_action_log, v_action.clone())?;
core_set(
&v_state,
CoreValue::from("action_log"),
v_action_log.clone(),
)?;
_agent_record_trace_event(&[v_state.clone(), CoreValue::from("recall"), v_event.clone()])?;
v_none = core_none(&[])?;
return Ok(v_none.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_agent_used_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_agent_used_request");
let mut v_request = core_arg(args, 0);
let mut v_default_stage = core_arg(args, 1);
let mut v_error = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_is_map = CoreValue::Null;
let mut v_missing = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_reason = CoreValue::Null;
let mut v_stage = CoreValue::Null;
v_is_map = core_type_is(&v_request, CoreValue::from("object"));
v_id = CoreValue::from("");
v_reason = CoreValue::from("");
v_stage = v_default_stage.clone();
if core_truthy(&v_is_map) {
v_id = core_get(&v_request, &CoreValue::from("id"), CoreValue::from(""));
v_reason = core_get(&v_request, &CoreValue::from("reason"), CoreValue::from(""));
v_stage = core_get(
&v_request,
&CoreValue::from("stage"),
v_default_stage.clone(),
);
} else {
v_id = v_request.clone();
}
v_id = core_string_trim(&v_id);
v_reason = core_string_trim(&v_reason);
v_missing = core_eq(&[v_id.clone(), CoreValue::from("")])?;
if core_truthy(&v_missing) {
v_error = core_runtime_error(&[CoreValue::from(
"used(...) requires a non-empty loaded memory or skill id",
)])?;
return Err(core_as_error(&v_error));
}
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("id"), v_id.clone())?;
core_set(&v_out, CoreValue::from("reason"), v_reason.clone())?;
core_set(&v_out, CoreValue::from("stage"), v_stage.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_used(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_used");
let mut v_state = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_stage = core_arg(args, 2);
let mut v_action_log = CoreValue::Null;
let mut v_dedupe_key = CoreValue::Null;
let mut v_disabled = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_enabled = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_event = CoreValue::Null;
let mut v_flags = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_is_match = CoreValue::Null;
let mut v_matched = CoreValue::Null;
let mut v_memories = CoreValue::Null;
let mut v_memory = CoreValue::Null;
let mut v_memory_id = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_normalized = CoreValue::Null;
let mut v_normalized_stage = CoreValue::Null;
let mut v_reason = CoreValue::Null;
let mut v_record = CoreValue::Null;
let mut v_skill = CoreValue::Null;
let mut v_skill_id = CoreValue::Null;
let mut v_skill_name = CoreValue::Null;
let mut v_skills = CoreValue::Null;
let mut v_trace = CoreValue::Null;
let mut v_used_memories = CoreValue::Null;
let mut v_used_skills = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_flags = core_get(&v_state, &CoreValue::from("policy_flags"), CoreValue::Null);
v_enabled = core_get(
&v_flags,
&CoreValue::from("usageTrackingMode"),
CoreValue::Bool(false),
);
v_disabled = core_not(&[v_enabled.clone()])?;
if core_truthy(&v_disabled) {
v_error = core_runtime_error(&[CoreValue::from(
"used(...) requires usage tracking to be enabled",
)])?;
return Err(core_as_error(&v_error));
}
v_normalized = _normalize_agent_used_request(&[v_request.clone(), v_stage.clone()])?;
v_id = core_get(&v_normalized, &CoreValue::from("id"), CoreValue::Null);
v_reason = core_get(
&v_normalized,
&CoreValue::from("reason"),
CoreValue::from(""),
);
v_normalized_stage = core_get(&v_normalized, &CoreValue::from("stage"), v_stage.clone());
v_dedupe_key = core_string_format(&[
CoreValue::from("{}\n{}\n{}"),
v_normalized_stage.clone(),
v_id.clone(),
v_reason.clone(),
])?;
v_memories = core_get(
&v_state,
&CoreValue::from("loaded_memories"),
v_empty_list.clone(),
);
v_skills = core_get(
&v_state,
&CoreValue::from("loaded_skill_docs"),
v_empty_list.clone(),
);
v_used_memories = core_get(
&v_state,
&CoreValue::from("used_memories"),
v_empty_list.clone(),
);
v_used_skills = core_get(
&v_state,
&CoreValue::from("used_skills"),
v_empty_list.clone(),
);
v_matched = CoreValue::Bool(false);
for v_memory in core_iter(&v_memories)? {
let mut v_memory = v_memory;
v_memory_id = core_get(&v_memory, &CoreValue::from("id"), CoreValue::from(""));
v_is_match = core_eq(&[v_memory_id.clone(), v_id.clone()])?;
if core_truthy(&v_is_match) {
v_record = CoreValue::new_map();
core_set(&v_record, CoreValue::from("id"), v_id.clone())?;
core_set(&v_record, CoreValue::from("reason"), v_reason.clone())?;
core_set(
&v_record,
CoreValue::from("stage"),
v_normalized_stage.clone(),
)?;
core_set(
&v_record,
CoreValue::from("dedupe_key"),
v_dedupe_key.clone(),
)?;
v_used_memories = _agent_append_unique_by_field(&[
v_used_memories.clone(),
v_record.clone(),
CoreValue::from("dedupe_key"),
])?;
v_matched = CoreValue::Bool(true);
}
}
for v_skill in core_iter(&v_skills)? {
let mut v_skill = v_skill;
v_skill_id = core_get(&v_skill, &CoreValue::from("id"), CoreValue::from(""));
v_skill_name = core_get(&v_skill, &CoreValue::from("name"), v_skill_id.clone());
v_is_match = core_eq(&[v_skill_id.clone(), v_id.clone()])?;
if core_truthy(&v_is_match) {
v_record = CoreValue::new_map();
core_set(&v_record, CoreValue::from("id"), v_id.clone())?;
core_set(&v_record, CoreValue::from("name"), v_skill_name.clone())?;
core_set(&v_record, CoreValue::from("reason"), v_reason.clone())?;
core_set(
&v_record,
CoreValue::from("stage"),
v_normalized_stage.clone(),
)?;
core_set(
&v_record,
CoreValue::from("dedupe_key"),
v_dedupe_key.clone(),
)?;
v_used_skills = _agent_append_unique_by_field(&[
v_used_skills.clone(),
v_record.clone(),
CoreValue::from("dedupe_key"),
])?;
v_matched = CoreValue::Bool(true);
}
}
core_set(
&v_state,
CoreValue::from("used_memories"),
v_used_memories.clone(),
)?;
core_set(
&v_state,
CoreValue::from("used_skills"),
v_used_skills.clone(),
)?;
v_trace = core_get(
&v_state,
&CoreValue::from("policy_trace"),
v_empty_list.clone(),
);
v_event = CoreValue::new_map();
core_set(&v_event, CoreValue::from("type"), CoreValue::from("used"))?;
core_set(&v_event, CoreValue::from("id"), v_id.clone())?;
core_set(&v_event, CoreValue::from("reason"), v_reason.clone())?;
core_set(
&v_event,
CoreValue::from("stage"),
v_normalized_stage.clone(),
)?;
core_set(&v_event, CoreValue::from("matched"), v_matched.clone())?;
core_append(&v_trace, v_event.clone())?;
core_set(&v_state, CoreValue::from("policy_trace"), v_trace.clone())?;
v_action_log = core_get(
&v_state,
&CoreValue::from("action_log"),
v_empty_list.clone(),
);
core_append(&v_action_log, v_event.clone())?;
core_set(
&v_state,
CoreValue::from("action_log"),
v_action_log.clone(),
)?;
_agent_record_trace_event(&[v_state.clone(), CoreValue::from("used"), v_event.clone()])?;
v_none = core_none(&[])?;
return Ok(v_none.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_agent_guidance_payload(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_agent_guidance_payload");
let mut v_value = core_arg(args, 0);
let mut v_triggered_by = core_arg(args, 1);
let mut v_error = CoreValue::Null;
let mut v_guidance = CoreValue::Null;
let mut v_has_trigger = CoreValue::Null;
let mut v_is_map = CoreValue::Null;
let mut v_missing = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_trigger = CoreValue::Null;
v_is_map = core_type_is(&v_value, CoreValue::from("object"));
v_guidance = CoreValue::from("");
v_trigger = v_triggered_by.clone();
if core_truthy(&v_is_map) {
v_guidance = core_get(&v_value, &CoreValue::from("guidance"), CoreValue::from(""));
v_trigger = core_get(
&v_value,
&CoreValue::from("triggeredBy"),
v_triggered_by.clone(),
);
} else {
v_guidance = v_value.clone();
}
v_guidance = core_string_trim(&v_guidance);
v_missing = core_eq(&[v_guidance.clone(), CoreValue::from("")])?;
if core_truthy(&v_missing) {
v_error = core_runtime_error(&[CoreValue::from(
"guideAgent() requires a non-empty string guidance",
)])?;
return Err(core_as_error(&v_error));
}
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("type"),
CoreValue::from("guide_agent"),
)?;
core_set(&v_out, CoreValue::from("guidance"), v_guidance.clone())?;
v_has_trigger = core_ne(&[v_trigger.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_trigger) {
core_set(&v_out, CoreValue::from("triggeredBy"), v_trigger.clone())?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_append_guidance(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_append_guidance");
let mut v_state = core_arg(args, 0);
let mut v_payload = core_arg(args, 1);
let mut v_action = CoreValue::Null;
let mut v_action_log = CoreValue::Null;
let mut v_count = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_entries = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_guidance = CoreValue::Null;
let mut v_has_trigger = CoreValue::Null;
let mut v_triggered_by = CoreValue::Null;
let mut v_turn = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_entries = core_get(
&v_state,
&CoreValue::from("guidance_log"),
v_empty_list.clone(),
);
v_count = core_len(&[v_entries.clone()])?;
v_turn = core_add(&[v_count.clone(), CoreValue::Num(1f64)])?;
v_guidance = core_get(
&v_payload,
&CoreValue::from("guidance"),
CoreValue::from(""),
);
v_triggered_by = core_get(
&v_payload,
&CoreValue::from("triggeredBy"),
CoreValue::from(""),
);
v_entry = CoreValue::new_map();
core_set(&v_entry, CoreValue::from("turn"), v_turn.clone())?;
core_set(&v_entry, CoreValue::from("guidance"), v_guidance.clone())?;
v_has_trigger = core_ne(&[v_triggered_by.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_trigger) {
core_set(
&v_entry,
CoreValue::from("triggeredBy"),
v_triggered_by.clone(),
)?;
}
core_append(&v_entries, v_entry.clone())?;
core_set(&v_state, CoreValue::from("guidance_log"), v_entries.clone())?;
v_action_log = core_get(
&v_state,
&CoreValue::from("action_log"),
v_empty_list.clone(),
);
v_action = CoreValue::new_map();
core_set(
&v_action,
CoreValue::from("type"),
CoreValue::from("guide_agent"),
)?;
core_set(&v_action, CoreValue::from("guidance"), v_guidance.clone())?;
core_set(
&v_action,
CoreValue::from("triggeredBy"),
v_triggered_by.clone(),
)?;
core_append(&v_action_log, v_action.clone())?;
core_set(
&v_state,
CoreValue::from("action_log"),
v_action_log.clone(),
)?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("guide_agent"),
v_entry.clone(),
])?;
return Ok(v_entry.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_execute_callable(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_execute_callable");
let mut v_state = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_action = CoreValue::Null;
let mut v_action_log = CoreValue::Null;
let mut v_args = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_guidance = CoreValue::Null;
let mut v_has_guidance = CoreValue::Null;
let mut v_host_event = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_qualified = CoreValue::Null;
let mut v_record = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_status = CoreValue::Null;
let mut v_trace = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_result =
core_agent_callable_invoke(&[v_state.clone(), v_request.clone(), v_options.clone()])?;
v_qualified = core_get(
&v_request,
&CoreValue::from("qualified_name"),
CoreValue::from(""),
);
v_name = core_get(&v_request, &CoreValue::from("name"), v_qualified.clone());
v_args = core_get(&v_request, &CoreValue::from("args"), v_request.clone());
v_status = core_get(&v_result, &CoreValue::from("status"), CoreValue::from("ok"));
v_trace = core_get(
&v_state,
&CoreValue::from("function_call_traces"),
v_empty_list.clone(),
);
v_record = CoreValue::new_map();
core_set(
&v_record,
CoreValue::from("qualified_name"),
v_qualified.clone(),
)?;
core_set(&v_record, CoreValue::from("name"), v_name.clone())?;
core_set(&v_record, CoreValue::from("arguments"), v_args.clone())?;
core_set(&v_record, CoreValue::from("status"), v_status.clone())?;
core_set(&v_record, CoreValue::from("result"), v_result.clone())?;
core_append(&v_trace, v_record.clone())?;
core_set(
&v_state,
CoreValue::from("function_call_traces"),
v_trace.clone(),
)?;
v_action_log = core_get(
&v_state,
&CoreValue::from("action_log"),
v_empty_list.clone(),
);
v_action = CoreValue::new_map();
core_set(
&v_action,
CoreValue::from("type"),
CoreValue::from("function_call"),
)?;
core_set(
&v_action,
CoreValue::from("qualified_name"),
v_qualified.clone(),
)?;
core_set(&v_action, CoreValue::from("status"), v_status.clone())?;
core_append(&v_action_log, v_action.clone())?;
core_set(
&v_state,
CoreValue::from("action_log"),
v_action_log.clone(),
)?;
v_host_event = _agent_normalize_host_boundary_event(&[
CoreValue::from("callable"),
v_request.clone(),
v_result.clone(),
v_status.clone(),
])?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("function_call"),
v_host_event.clone(),
])?;
v_guidance = core_get(&v_result, &CoreValue::from("guidance"), CoreValue::Null);
v_has_guidance = core_is_not_none(&[v_guidance.clone()])?;
if core_truthy(&v_has_guidance) {
v_payload = _normalize_agent_guidance_payload(&[v_guidance.clone(), v_qualified.clone()])?;
_agent_append_guidance(&[v_state.clone(), v_payload.clone()])?;
core_set(
&v_result,
CoreValue::from("guidance_payload"),
v_payload.clone(),
)?;
}
return Ok(v_result.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_agent_final_payload(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_agent_final_payload");
let mut v_value = core_arg(args, 0);
let mut v_args = CoreValue::Null;
let mut v_is_final = CoreValue::Null;
let mut v_is_map = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_type = CoreValue::Null;
v_is_map = core_type_is(&v_value, CoreValue::from("object"));
if core_truthy(&v_is_map) {
v_type = core_get(&v_value, &CoreValue::from("type"), CoreValue::from(""));
v_is_final = core_eq(&[v_type.clone(), CoreValue::from("final")])?;
if core_truthy(&v_is_final) {
return Ok(v_value.clone());
}
}
v_args = CoreValue::new_list();
core_append(&v_args, v_value.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("type"), CoreValue::from("final"))?;
core_set(&v_out, CoreValue::from("args"), v_args.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_agent_respond_payload(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_agent_respond_payload");
let mut v_value = core_arg(args, 0);
let mut v_args = CoreValue::Null;
let mut v_is_map = CoreValue::Null;
let mut v_is_respond = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_type = CoreValue::Null;
v_is_map = core_type_is(&v_value, CoreValue::from("object"));
if core_truthy(&v_is_map) {
v_type = core_get(&v_value, &CoreValue::from("type"), CoreValue::from(""));
v_is_respond = core_eq(&[v_type.clone(), CoreValue::from("respond")])?;
if core_truthy(&v_is_respond) {
return Ok(v_value.clone());
}
}
v_args = CoreValue::new_list();
core_append(&v_args, v_value.clone())?;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("type"), CoreValue::from("respond"))?;
core_set(&v_out, CoreValue::from("args"), v_args.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_agent_clarification_payload(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_agent_clarification_payload");
let mut v_value = core_arg(args, 0);
let mut v_args = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_is_clarification = CoreValue::Null;
let mut v_is_map = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_missing = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_question = CoreValue::Null;
let mut v_type = CoreValue::Null;
v_is_map = core_type_is(&v_value, CoreValue::from("object"));
v_question = CoreValue::from("");
v_payload = CoreValue::new_map();
if core_truthy(&v_is_map) {
v_type = core_get(&v_value, &CoreValue::from("type"), CoreValue::from(""));
v_is_clarification = core_eq(&[v_type.clone(), CoreValue::from("askClarification")])?;
if core_truthy(&v_is_clarification) {
return Ok(v_value.clone());
}
v_message = core_get(&v_value, &CoreValue::from("message"), CoreValue::from(""));
v_question = core_get(&v_value, &CoreValue::from("question"), v_message.clone());
v_payload = v_value.clone();
} else {
v_question = v_value.clone();
core_set(&v_payload, CoreValue::from("question"), v_question.clone())?;
}
v_missing = core_eq(&[v_question.clone(), CoreValue::from("")])?;
if core_truthy(&v_missing) {
v_error =
core_runtime_error(&[CoreValue::from("agent clarification question is required")])?;
return Err(core_as_error(&v_error));
}
v_args = CoreValue::new_list();
core_append(&v_args, v_payload.clone())?;
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("type"),
CoreValue::from("askClarification"),
)?;
core_set(&v_out, CoreValue::from("args"), v_args.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_optimizer_metadata(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_optimizer_metadata");
let mut v_state = core_arg(args, 0);
let mut v_components = CoreValue::Null;
let mut v_delegation_component = CoreValue::Null;
let mut v_discovery_component = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_policy = CoreValue::Null;
let mut v_policy_version = CoreValue::Null;
let mut v_responder_component = CoreValue::Null;
let mut v_runtime_component = CoreValue::Null;
let mut v_stage_ids = CoreValue::Null;
v_policy = core_get(&v_state, &CoreValue::from("policy"), CoreValue::Null);
v_policy_version = core_get(
&v_policy,
&CoreValue::from("policy_version"),
CoreValue::from("agent-runtime-decision-v1"),
);
v_stage_ids = CoreValue::new_list();
core_append(&v_stage_ids, CoreValue::from("distiller"))?;
core_append(&v_stage_ids, CoreValue::from("executor"))?;
core_append(&v_stage_ids, CoreValue::from("responder"))?;
v_components = CoreValue::new_list();
v_runtime_component = CoreValue::new_map();
core_set(
&v_runtime_component,
CoreValue::from("id"),
CoreValue::from("agent.actor.runtime_instructions"),
)?;
core_set(
&v_runtime_component,
CoreValue::from("kind"),
CoreValue::from("runtime_instruction"),
)?;
core_append(&v_components, v_runtime_component.clone())?;
v_discovery_component = CoreValue::new_map();
core_set(
&v_discovery_component,
CoreValue::from("id"),
CoreValue::from("agent.actor.discovery_policy"),
)?;
core_set(
&v_discovery_component,
CoreValue::from("kind"),
CoreValue::from("policy"),
)?;
core_append(&v_components, v_discovery_component.clone())?;
v_delegation_component = CoreValue::new_map();
core_set(
&v_delegation_component,
CoreValue::from("id"),
CoreValue::from("agent.actor.delegation_policy"),
)?;
core_set(
&v_delegation_component,
CoreValue::from("kind"),
CoreValue::from("policy"),
)?;
core_append(&v_components, v_delegation_component.clone())?;
v_responder_component = CoreValue::new_map();
core_set(
&v_responder_component,
CoreValue::from("id"),
CoreValue::from("agent.responder.signature"),
)?;
core_set(
&v_responder_component,
CoreValue::from("kind"),
CoreValue::from("stage"),
)?;
core_append(&v_components, v_responder_component.clone())?;
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("policy_version"),
v_policy_version.clone(),
)?;
core_set(&v_out, CoreValue::from("stage_ids"), v_stage_ids.clone())?;
core_set(
&v_out,
CoreValue::from("optimizable_components"),
v_components.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_begin_trace(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_begin_trace");
let mut v_state = core_arg(args, 0);
let mut v_input = core_arg(args, 1);
let mut v_events = CoreValue::Null;
let mut v_optimizer = CoreValue::Null;
let mut v_trace = CoreValue::Null;
v_events = CoreValue::new_list();
v_optimizer = core_get(
&v_state,
&CoreValue::from("optimizer_metadata"),
CoreValue::Null,
);
v_trace = CoreValue::new_map();
core_set(
&v_trace,
CoreValue::from("schema_version"),
CoreValue::from("axir-agent-trace-v1"),
)?;
core_set(
&v_trace,
CoreValue::from("kind"),
CoreValue::from("agent_run"),
)?;
core_set(
&v_trace,
CoreValue::from("status"),
CoreValue::from("running"),
)?;
core_set(&v_trace, CoreValue::from("input"), v_input.clone())?;
core_set(&v_trace, CoreValue::from("events"), v_events.clone())?;
core_set(
&v_trace,
CoreValue::from("optimizer_metadata"),
v_optimizer.clone(),
)?;
core_set(
&v_trace,
CoreValue::from("replayable"),
CoreValue::Bool(true),
)?;
core_set(&v_state, CoreValue::from("trace"), v_trace.clone())?;
return Ok(v_trace.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_record_trace_event(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_record_trace_event");
let mut v_state = core_arg(args, 0);
let mut v_kind = core_arg(args, 1);
let mut v_payload = core_arg(args, 2);
let mut v_component = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_event = CoreValue::Null;
let mut v_events = CoreValue::Null;
let mut v_has_component = CoreValue::Null;
let mut v_has_trace = CoreValue::Null;
let mut v_index = CoreValue::Null;
let mut v_payload_is_map = CoreValue::Null;
let mut v_trace = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_empty_list = CoreValue::new_list();
v_trace = core_get(&v_state, &CoreValue::from("trace"), v_empty_map.clone());
v_has_trace = core_type_is(&v_trace, CoreValue::from("object"));
if core_truthy(&v_has_trace) {
} else {
v_trace = _agent_begin_trace(&[v_state.clone(), v_empty_map.clone()])?;
}
v_events = core_get(&v_trace, &CoreValue::from("events"), v_empty_list.clone());
v_index = core_len(&[v_events.clone()])?;
v_event = CoreValue::new_map();
core_set(&v_event, CoreValue::from("index"), v_index.clone())?;
core_set(&v_event, CoreValue::from("kind"), v_kind.clone())?;
v_payload_is_map = core_type_is(&v_payload, CoreValue::from("object"));
if core_truthy(&v_payload_is_map) {
v_component = core_get(
&v_payload,
&CoreValue::from("component_id"),
CoreValue::from(""),
);
v_has_component = core_ne(&[v_component.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_component) {
core_set(
&v_event,
CoreValue::from("component_id"),
v_component.clone(),
)?;
}
core_set(&v_event, CoreValue::from("payload"), v_payload.clone())?;
} else {
core_set(&v_event, CoreValue::from("value"), v_payload.clone())?;
}
core_append(&v_events, v_event.clone())?;
core_set(&v_trace, CoreValue::from("events"), v_events.clone())?;
core_set(&v_state, CoreValue::from("trace"), v_trace.clone())?;
return Ok(v_event.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_normalize_host_boundary_event(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_normalize_host_boundary_event");
let mut v_boundary = core_arg(args, 0);
let mut v_request = core_arg(args, 1);
let mut v_result = core_arg(args, 2);
let mut v_status = core_arg(args, 3);
let mut v_out = CoreValue::Null;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("boundary"), v_boundary.clone())?;
core_set(&v_out, CoreValue::from("request"), v_request.clone())?;
core_set(&v_out, CoreValue::from("result"), v_result.clone())?;
core_set(&v_out, CoreValue::from("status"), v_status.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_finalize_trace(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_finalize_trace");
let mut v_state = core_arg(args, 0);
let mut v_status = core_arg(args, 1);
let mut v_output = core_arg(args, 2);
let mut v_action_log = CoreValue::Null;
let mut v_chat_log = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_event_count = CoreValue::Null;
let mut v_event_payload = CoreValue::Null;
let mut v_events = CoreValue::Null;
let mut v_function_traces = CoreValue::Null;
let mut v_has_trace = CoreValue::Null;
let mut v_optimizer = CoreValue::Null;
let mut v_policy_trace = CoreValue::Null;
let mut v_trace = CoreValue::Null;
let mut v_usage = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_empty_list = CoreValue::new_list();
v_trace = core_get(&v_state, &CoreValue::from("trace"), v_empty_map.clone());
v_has_trace = core_type_is(&v_trace, CoreValue::from("object"));
if core_truthy(&v_has_trace) {
} else {
v_trace = _agent_begin_trace(&[v_state.clone(), v_empty_map.clone()])?;
}
v_event_payload = CoreValue::new_map();
core_set(
&v_event_payload,
CoreValue::from("output"),
v_output.clone(),
)?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("final"),
v_event_payload.clone(),
])?;
v_trace = core_get(&v_state, &CoreValue::from("trace"), v_trace.clone());
v_events = core_get(&v_trace, &CoreValue::from("events"), v_empty_list.clone());
v_event_count = core_len(&[v_events.clone()])?;
v_usage = core_get(&v_state, &CoreValue::from("usage"), v_empty_map.clone());
v_chat_log = core_get(&v_state, &CoreValue::from("chat_log"), v_empty_list.clone());
v_action_log = core_get(
&v_state,
&CoreValue::from("action_log"),
v_empty_list.clone(),
);
v_policy_trace = core_get(
&v_state,
&CoreValue::from("policy_trace"),
v_empty_list.clone(),
);
v_function_traces = core_get(
&v_state,
&CoreValue::from("function_call_traces"),
v_empty_list.clone(),
);
v_optimizer = core_get(
&v_state,
&CoreValue::from("optimizer_metadata"),
v_empty_map.clone(),
);
core_set(&v_trace, CoreValue::from("status"), v_status.clone())?;
core_set(&v_trace, CoreValue::from("final_output"), v_output.clone())?;
core_set(
&v_trace,
CoreValue::from("event_count"),
v_event_count.clone(),
)?;
core_set(&v_trace, CoreValue::from("usage"), v_usage.clone())?;
core_set(&v_trace, CoreValue::from("chat_log"), v_chat_log.clone())?;
core_set(
&v_trace,
CoreValue::from("action_log"),
v_action_log.clone(),
)?;
core_set(
&v_trace,
CoreValue::from("policy_trace"),
v_policy_trace.clone(),
)?;
core_set(
&v_trace,
CoreValue::from("function_call_traces"),
v_function_traces.clone(),
)?;
core_set(
&v_trace,
CoreValue::from("optimizer_metadata"),
v_optimizer.clone(),
)?;
core_set(&v_state, CoreValue::from("trace"), v_trace.clone())?;
return Ok(v_trace.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_export_trace(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_export_trace");
let mut v_state = core_arg(args, 0);
let mut v_action_log = CoreValue::Null;
let mut v_chat_log = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_event_count = CoreValue::Null;
let mut v_events = CoreValue::Null;
let mut v_function_traces = CoreValue::Null;
let mut v_has_trace = CoreValue::Null;
let mut v_optimizer = CoreValue::Null;
let mut v_policy_trace = CoreValue::Null;
let mut v_trace = CoreValue::Null;
let mut v_usage = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_empty_list = CoreValue::new_list();
v_trace = core_get(&v_state, &CoreValue::from("trace"), v_empty_map.clone());
v_has_trace = core_type_is(&v_trace, CoreValue::from("object"));
if core_truthy(&v_has_trace) {
} else {
v_trace = _agent_begin_trace(&[v_state.clone(), v_empty_map.clone()])?;
}
v_events = core_get(&v_trace, &CoreValue::from("events"), v_empty_list.clone());
v_event_count = core_len(&[v_events.clone()])?;
v_usage = core_get(&v_state, &CoreValue::from("usage"), v_empty_map.clone());
v_chat_log = core_get(&v_state, &CoreValue::from("chat_log"), v_empty_list.clone());
v_action_log = core_get(
&v_state,
&CoreValue::from("action_log"),
v_empty_list.clone(),
);
v_policy_trace = core_get(
&v_state,
&CoreValue::from("policy_trace"),
v_empty_list.clone(),
);
v_function_traces = core_get(
&v_state,
&CoreValue::from("function_call_traces"),
v_empty_list.clone(),
);
v_optimizer = core_get(
&v_state,
&CoreValue::from("optimizer_metadata"),
v_empty_map.clone(),
);
core_set(
&v_trace,
CoreValue::from("event_count"),
v_event_count.clone(),
)?;
core_set(&v_trace, CoreValue::from("usage"), v_usage.clone())?;
core_set(&v_trace, CoreValue::from("chat_log"), v_chat_log.clone())?;
core_set(
&v_trace,
CoreValue::from("action_log"),
v_action_log.clone(),
)?;
core_set(
&v_trace,
CoreValue::from("policy_trace"),
v_policy_trace.clone(),
)?;
core_set(
&v_trace,
CoreValue::from("function_call_traces"),
v_function_traces.clone(),
)?;
core_set(
&v_trace,
CoreValue::from("optimizer_metadata"),
v_optimizer.clone(),
)?;
core_set(&v_state, CoreValue::from("trace"), v_trace.clone())?;
return Ok(v_trace.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_replay_trace(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_replay_trace");
let mut v_trace = core_arg(args, 0);
let mut v_fixtures = core_arg(args, 1);
let mut v_action_log = CoreValue::Null;
let mut v_actual_output_text = CoreValue::Null;
let mut v_actual_text = CoreValue::Null;
let mut v_chat_log = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_event = CoreValue::Null;
let mut v_event_count = CoreValue::Null;
let mut v_event_kinds = CoreValue::Null;
let mut v_events = CoreValue::Null;
let mut v_expected_kinds = CoreValue::Null;
let mut v_expected_output = CoreValue::Null;
let mut v_expected_output_text = CoreValue::Null;
let mut v_expected_text = CoreValue::Null;
let mut v_has_expected_kinds = CoreValue::Null;
let mut v_has_expected_output = CoreValue::Null;
let mut v_kind = CoreValue::Null;
let mut v_matches = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_mismatch = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_output_matches = CoreValue::Null;
let mut v_output_mismatch = CoreValue::Null;
let mut v_status = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_events = core_get(&v_trace, &CoreValue::from("events"), v_empty_list.clone());
v_event_kinds = CoreValue::new_list();
for v_event in core_iter(&v_events)? {
let mut v_event = v_event;
v_kind = core_get(&v_event, &CoreValue::from("kind"), CoreValue::from(""));
core_append(&v_event_kinds, v_kind.clone())?;
}
v_expected_kinds = core_get(
&v_fixtures,
&CoreValue::from("expected_event_kinds"),
CoreValue::Null,
);
v_has_expected_kinds = core_type_is(&v_expected_kinds, CoreValue::from("list"));
if core_truthy(&v_has_expected_kinds) {
v_actual_text = core_json_stringify(&[v_event_kinds.clone()])?;
v_expected_text = core_json_stringify(&[v_expected_kinds.clone()])?;
v_matches = core_eq(&[v_actual_text.clone(), v_expected_text.clone()])?;
v_mismatch = core_not(&[v_matches.clone()])?;
if core_truthy(&v_mismatch) {
v_message = core_string_format(&[
CoreValue::from("agent replay event sequence mismatch: expected {} got {}"),
v_expected_text.clone(),
v_actual_text.clone(),
])?;
v_error = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
}
v_output = core_get(&v_trace, &CoreValue::from("final_output"), CoreValue::Null);
v_expected_output = core_get(
&v_fixtures,
&CoreValue::from("expected_output"),
CoreValue::Null,
);
v_has_expected_output = core_is_not_none(&[v_expected_output.clone()])?;
if core_truthy(&v_has_expected_output) {
v_actual_output_text = core_json_stringify(&[v_output.clone()])?;
v_expected_output_text = core_json_stringify(&[v_expected_output.clone()])?;
v_output_matches =
core_eq(&[v_actual_output_text.clone(), v_expected_output_text.clone()])?;
v_output_mismatch = core_not(&[v_output_matches.clone()])?;
if core_truthy(&v_output_mismatch) {
v_message = core_string_format(&[
CoreValue::from("agent replay output mismatch: expected {} got {}"),
v_expected_output_text.clone(),
v_actual_output_text.clone(),
])?;
v_error = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
}
v_event_count = core_len(&[v_events.clone()])?;
v_status = core_get(
&v_trace,
&CoreValue::from("status"),
CoreValue::from("unknown"),
);
v_action_log = core_get(
&v_trace,
&CoreValue::from("action_log"),
v_empty_list.clone(),
);
v_chat_log = core_get(&v_trace, &CoreValue::from("chat_log"), v_empty_list.clone());
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("ok"), CoreValue::Bool(true))?;
core_set(
&v_out,
CoreValue::from("status"),
CoreValue::from("replayed"),
)?;
core_set(&v_out, CoreValue::from("original_status"), v_status.clone())?;
core_set(&v_out, CoreValue::from("output"), v_output.clone())?;
core_set(
&v_out,
CoreValue::from("event_kinds"),
v_event_kinds.clone(),
)?;
core_set(
&v_out,
CoreValue::from("event_count"),
v_event_count.clone(),
)?;
core_set(&v_out, CoreValue::from("action_log"), v_action_log.clone())?;
core_set(&v_out, CoreValue::from("chat_log"), v_chat_log.clone())?;
core_set(&v_out, CoreValue::from("trace"), v_trace.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_export_runtime_state(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_export_runtime_state");
let mut v_state = core_arg(args, 0);
let mut v_action_log = CoreValue::Null;
let mut v_actor_model_state = CoreValue::Null;
let mut v_actor_prompt_policy = CoreValue::Null;
let mut v_checkpoint_state = CoreValue::Null;
let mut v_clean_action_log = CoreValue::Null;
let mut v_context_events = CoreValue::Null;
let mut v_context_map = CoreValue::Null;
let mut v_context_policy = CoreValue::Null;
let mut v_discovered = CoreValue::Null;
let mut v_distiller_signature = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_executor_signature = CoreValue::Null;
let mut v_function_call_traces = CoreValue::Null;
let mut v_guidance_log = CoreValue::Null;
let mut v_last_actor_context = CoreValue::Null;
let mut v_memories = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_policy_registry = CoreValue::Null;
let mut v_provenance = CoreValue::Null;
let mut v_responder_signature = CoreValue::Null;
let mut v_run_trace = CoreValue::Null;
let mut v_runtime_globals = CoreValue::Null;
let mut v_runtime_inspection = CoreValue::Null;
let mut v_runtime_session_state = CoreValue::Null;
let mut v_runtime_state = CoreValue::Null;
let mut v_runtime_state_summary = CoreValue::Null;
let mut v_skills = CoreValue::Null;
let mut v_status_log = CoreValue::Null;
let mut v_trace = CoreValue::Null;
let mut v_used_memories = CoreValue::Null;
let mut v_used_skills = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_empty_list = CoreValue::new_list();
v_out = CoreValue::new_map();
v_runtime_state = core_get(
&v_state,
&CoreValue::from("runtime_state"),
v_empty_map.clone(),
);
v_discovered = core_get(
&v_state,
&CoreValue::from("discovered_tool_docs"),
v_empty_list.clone(),
);
v_skills = core_get(
&v_state,
&CoreValue::from("loaded_skill_docs"),
v_empty_list.clone(),
);
v_memories = core_get(
&v_state,
&CoreValue::from("loaded_memories"),
v_empty_list.clone(),
);
v_used_memories = core_get(
&v_state,
&CoreValue::from("used_memories"),
v_empty_list.clone(),
);
v_used_skills = core_get(
&v_state,
&CoreValue::from("used_skills"),
v_empty_list.clone(),
);
v_guidance_log = core_get(
&v_state,
&CoreValue::from("guidance_log"),
v_empty_list.clone(),
);
v_function_call_traces = core_get(
&v_state,
&CoreValue::from("function_call_traces"),
v_empty_list.clone(),
);
v_trace = core_get(
&v_state,
&CoreValue::from("policy_trace"),
v_empty_list.clone(),
);
v_action_log = core_get(
&v_state,
&CoreValue::from("action_log"),
v_empty_list.clone(),
);
v_status_log = core_get(
&v_state,
&CoreValue::from("status_log"),
v_empty_list.clone(),
);
v_runtime_session_state = core_get(
&v_state,
&CoreValue::from("runtime_session_state"),
v_empty_map.clone(),
);
v_runtime_globals = core_get(
&v_state,
&CoreValue::from("runtime_globals"),
v_empty_map.clone(),
);
v_runtime_inspection = core_get(
&v_state,
&CoreValue::from("runtime_inspection"),
CoreValue::Null,
);
v_actor_prompt_policy = core_get(
&v_state,
&CoreValue::from("actor_prompt_policy"),
v_empty_map.clone(),
);
v_policy_registry = core_get(
&v_state,
&CoreValue::from("policy_registry"),
v_empty_map.clone(),
);
v_context_policy = core_get(
&v_state,
&CoreValue::from("context_policy"),
v_empty_map.clone(),
);
v_distiller_signature = core_get(
&v_state,
&CoreValue::from("distiller_signature"),
CoreValue::from(""),
);
v_executor_signature = core_get(
&v_state,
&CoreValue::from("executor_signature"),
CoreValue::from(""),
);
v_responder_signature = core_get(
&v_state,
&CoreValue::from("responder_signature"),
CoreValue::from(""),
);
v_context_events = core_get(
&v_state,
&CoreValue::from("context_events"),
v_empty_list.clone(),
);
v_checkpoint_state = core_get(
&v_state,
&CoreValue::from("checkpoint_state"),
CoreValue::Null,
);
v_context_map = core_get(&v_state, &CoreValue::from("context_map"), CoreValue::Null);
v_runtime_state_summary = core_get(
&v_state,
&CoreValue::from("runtime_state_summary"),
CoreValue::from(""),
);
v_actor_model_state = core_get(
&v_state,
&CoreValue::from("actor_model_state"),
v_empty_map.clone(),
);
v_provenance = core_get(
&v_state,
&CoreValue::from("provenance"),
v_empty_map.clone(),
);
v_last_actor_context = core_get(
&v_state,
&CoreValue::from("last_actor_context"),
v_empty_map.clone(),
);
v_clean_action_log = _agent_sanitize_action_log_entries(&[v_action_log.clone()])?;
v_run_trace = _agent_export_trace(&[v_state.clone()])?;
core_set(
&v_out,
CoreValue::from("runtime_state"),
v_runtime_state.clone(),
)?;
core_set(
&v_out,
CoreValue::from("discovered_tool_docs"),
v_discovered.clone(),
)?;
core_set(
&v_out,
CoreValue::from("loaded_skill_docs"),
v_skills.clone(),
)?;
core_set(
&v_out,
CoreValue::from("loaded_memories"),
v_memories.clone(),
)?;
core_set(
&v_out,
CoreValue::from("used_memories"),
v_used_memories.clone(),
)?;
core_set(
&v_out,
CoreValue::from("used_skills"),
v_used_skills.clone(),
)?;
core_set(
&v_out,
CoreValue::from("guidance_log"),
v_guidance_log.clone(),
)?;
core_set(
&v_out,
CoreValue::from("function_call_traces"),
v_function_call_traces.clone(),
)?;
core_set(&v_out, CoreValue::from("policy_trace"), v_trace.clone())?;
core_set(
&v_out,
CoreValue::from("action_log"),
v_clean_action_log.clone(),
)?;
core_set(&v_out, CoreValue::from("status_log"), v_status_log.clone())?;
core_set(
&v_out,
CoreValue::from("runtime_session_state"),
v_runtime_session_state.clone(),
)?;
core_set(
&v_out,
CoreValue::from("runtime_globals"),
v_runtime_globals.clone(),
)?;
core_set(
&v_out,
CoreValue::from("runtime_inspection"),
v_runtime_inspection.clone(),
)?;
core_set(
&v_out,
CoreValue::from("actor_prompt_policy"),
v_actor_prompt_policy.clone(),
)?;
core_set(
&v_out,
CoreValue::from("policy_registry"),
v_policy_registry.clone(),
)?;
core_set(
&v_out,
CoreValue::from("context_policy"),
v_context_policy.clone(),
)?;
core_set(
&v_out,
CoreValue::from("distiller_signature"),
v_distiller_signature.clone(),
)?;
core_set(
&v_out,
CoreValue::from("executor_signature"),
v_executor_signature.clone(),
)?;
core_set(
&v_out,
CoreValue::from("responder_signature"),
v_responder_signature.clone(),
)?;
core_set(
&v_out,
CoreValue::from("context_events"),
v_context_events.clone(),
)?;
core_set(
&v_out,
CoreValue::from("checkpoint_state"),
v_checkpoint_state.clone(),
)?;
core_set(
&v_out,
CoreValue::from("context_map"),
v_context_map.clone(),
)?;
core_set(
&v_out,
CoreValue::from("runtime_state_summary"),
v_runtime_state_summary.clone(),
)?;
core_set(
&v_out,
CoreValue::from("actor_model_state"),
v_actor_model_state.clone(),
)?;
core_set(&v_out, CoreValue::from("provenance"), v_provenance.clone())?;
core_set(
&v_out,
CoreValue::from("last_actor_context"),
v_last_actor_context.clone(),
)?;
core_set(&v_out, CoreValue::from("trace"), v_run_trace.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_restore_runtime_state(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_restore_runtime_state");
let mut v_state = core_arg(args, 0);
let mut v_snapshot = core_arg(args, 1);
let mut v_action_log = CoreValue::Null;
let mut v_actor_model_state = CoreValue::Null;
let mut v_checkpoint_state = CoreValue::Null;
let mut v_clean_restore_action_log = CoreValue::Null;
let mut v_context_events = CoreValue::Null;
let mut v_context_map = CoreValue::Null;
let mut v_discovered = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_function_call_traces = CoreValue::Null;
let mut v_guidance_log = CoreValue::Null;
let mut v_has_policy_registry = CoreValue::Null;
let mut v_has_trace = CoreValue::Null;
let mut v_last_actor_context = CoreValue::Null;
let mut v_memories = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_policy_registry = CoreValue::Null;
let mut v_provenance = CoreValue::Null;
let mut v_run_trace = CoreValue::Null;
let mut v_runtime_globals = CoreValue::Null;
let mut v_runtime_session_state = CoreValue::Null;
let mut v_runtime_state = CoreValue::Null;
let mut v_runtime_state_summary = CoreValue::Null;
let mut v_skills = CoreValue::Null;
let mut v_status_log = CoreValue::Null;
let mut v_trace = CoreValue::Null;
let mut v_used_memories = CoreValue::Null;
let mut v_used_skills = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_empty_list = CoreValue::new_list();
v_runtime_state = core_get(
&v_snapshot,
&CoreValue::from("runtime_state"),
v_empty_map.clone(),
);
v_discovered = core_get(
&v_snapshot,
&CoreValue::from("discovered_tool_docs"),
v_empty_list.clone(),
);
v_skills = core_get(
&v_snapshot,
&CoreValue::from("loaded_skill_docs"),
v_empty_list.clone(),
);
v_memories = core_get(
&v_snapshot,
&CoreValue::from("loaded_memories"),
v_empty_list.clone(),
);
v_used_memories = core_get(
&v_snapshot,
&CoreValue::from("used_memories"),
v_empty_list.clone(),
);
v_used_skills = core_get(
&v_snapshot,
&CoreValue::from("used_skills"),
v_empty_list.clone(),
);
v_guidance_log = core_get(
&v_snapshot,
&CoreValue::from("guidance_log"),
v_empty_list.clone(),
);
v_function_call_traces = core_get(
&v_snapshot,
&CoreValue::from("function_call_traces"),
v_empty_list.clone(),
);
v_trace = core_get(
&v_snapshot,
&CoreValue::from("policy_trace"),
v_empty_list.clone(),
);
v_action_log = core_get(
&v_snapshot,
&CoreValue::from("action_log"),
v_empty_list.clone(),
);
v_status_log = core_get(
&v_snapshot,
&CoreValue::from("status_log"),
v_empty_list.clone(),
);
v_runtime_session_state = core_get(
&v_snapshot,
&CoreValue::from("runtime_session_state"),
v_empty_map.clone(),
);
v_runtime_globals = core_get(
&v_snapshot,
&CoreValue::from("runtime_globals"),
v_empty_map.clone(),
);
v_policy_registry = core_get(
&v_snapshot,
&CoreValue::from("policy_registry"),
CoreValue::Null,
);
v_run_trace = core_get(&v_snapshot, &CoreValue::from("trace"), CoreValue::Null);
v_context_events = core_get(
&v_snapshot,
&CoreValue::from("context_events"),
v_empty_list.clone(),
);
v_checkpoint_state = core_get(
&v_snapshot,
&CoreValue::from("checkpoint_state"),
CoreValue::Null,
);
v_context_map = core_get(
&v_snapshot,
&CoreValue::from("context_map"),
CoreValue::Null,
);
v_runtime_state_summary = core_get(
&v_snapshot,
&CoreValue::from("runtime_state_summary"),
CoreValue::from(""),
);
v_actor_model_state = core_get(
&v_snapshot,
&CoreValue::from("actor_model_state"),
v_empty_map.clone(),
);
v_provenance = core_get(
&v_snapshot,
&CoreValue::from("provenance"),
v_empty_map.clone(),
);
v_last_actor_context = core_get(
&v_snapshot,
&CoreValue::from("last_actor_context"),
v_empty_map.clone(),
);
v_clean_restore_action_log = _agent_sanitize_action_log_entries(&[v_action_log.clone()])?;
core_set(
&v_state,
CoreValue::from("runtime_state"),
v_runtime_state.clone(),
)?;
core_set(
&v_state,
CoreValue::from("discovered_tool_docs"),
v_discovered.clone(),
)?;
core_set(
&v_state,
CoreValue::from("loaded_skill_docs"),
v_skills.clone(),
)?;
core_set(
&v_state,
CoreValue::from("loaded_memories"),
v_memories.clone(),
)?;
core_set(
&v_state,
CoreValue::from("used_memories"),
v_used_memories.clone(),
)?;
core_set(
&v_state,
CoreValue::from("used_skills"),
v_used_skills.clone(),
)?;
core_set(
&v_state,
CoreValue::from("guidance_log"),
v_guidance_log.clone(),
)?;
core_set(
&v_state,
CoreValue::from("function_call_traces"),
v_function_call_traces.clone(),
)?;
core_set(&v_state, CoreValue::from("policy_trace"), v_trace.clone())?;
core_set(
&v_state,
CoreValue::from("action_log"),
v_clean_restore_action_log.clone(),
)?;
core_set(
&v_state,
CoreValue::from("status_log"),
v_status_log.clone(),
)?;
core_set(
&v_state,
CoreValue::from("runtime_session_state"),
v_runtime_session_state.clone(),
)?;
core_set(
&v_state,
CoreValue::from("runtime_globals"),
v_runtime_globals.clone(),
)?;
core_set(
&v_state,
CoreValue::from("context_events"),
v_context_events.clone(),
)?;
core_set(
&v_state,
CoreValue::from("checkpoint_state"),
v_checkpoint_state.clone(),
)?;
core_set(
&v_state,
CoreValue::from("context_map"),
v_context_map.clone(),
)?;
core_set(
&v_state,
CoreValue::from("runtime_state_summary"),
v_runtime_state_summary.clone(),
)?;
core_set(
&v_state,
CoreValue::from("actor_model_state"),
v_actor_model_state.clone(),
)?;
core_set(
&v_state,
CoreValue::from("provenance"),
v_provenance.clone(),
)?;
core_set(
&v_state,
CoreValue::from("last_actor_context"),
v_last_actor_context.clone(),
)?;
v_has_policy_registry = core_type_is(&v_policy_registry, CoreValue::from("object"));
if core_truthy(&v_has_policy_registry) {
core_set(
&v_state,
CoreValue::from("policy_registry"),
v_policy_registry.clone(),
)?;
}
v_has_trace = core_type_is(&v_run_trace, CoreValue::from("object"));
if core_truthy(&v_has_trace) {
core_set(&v_state, CoreValue::from("trace"), v_run_trace.clone())?;
}
v_out = _agent_export_runtime_state(&[v_state.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_runtime_build_globals(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_runtime_build_globals");
let mut v_state = core_arg(args, 0);
let mut v_values = core_arg(args, 1);
let mut v_callable_inventory = CoreValue::Null;
let mut v_conflict = CoreValue::Null;
let mut v_discovery_catalog = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_globals = CoreValue::Null;
let mut v_key = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_primitive = CoreValue::Null;
let mut v_primitive_meta = CoreValue::Null;
let mut v_primitives = CoreValue::Null;
let mut v_registry = CoreValue::Null;
let mut v_reserved = CoreValue::Null;
let mut v_runtime_contract = CoreValue::Null;
let mut v_selected_primitives = CoreValue::Null;
let mut v_value = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_empty_map = CoreValue::new_map();
v_reserved = _agent_reserved_runtime_names(&[])?;
v_globals = CoreValue::new_map();
v_primitives = CoreValue::new_list();
v_callable_inventory = core_get(
&v_state,
&CoreValue::from("callable_inventory"),
v_empty_list.clone(),
);
v_discovery_catalog = core_get(
&v_state,
&CoreValue::from("discovery_catalog"),
v_empty_list.clone(),
);
v_registry = core_get(
&v_state,
&CoreValue::from("policy_registry"),
v_empty_map.clone(),
);
v_selected_primitives =
_select_actor_primitives(&[v_registry.clone(), CoreValue::from("executor")])?;
core_set(&v_globals, CoreValue::from("inputs"), v_values.clone())?;
core_set(&v_globals, CoreValue::from("context"), v_values.clone())?;
core_set(
&v_globals,
CoreValue::from("callables"),
v_callable_inventory.clone(),
)?;
core_set(
&v_globals,
CoreValue::from("discovery_catalog"),
v_discovery_catalog.clone(),
)?;
for v_primitive_meta in core_iter(&v_selected_primitives)? {
let mut v_primitive_meta = v_primitive_meta;
v_name = core_get(&v_primitive_meta, &CoreValue::from("id"), CoreValue::Null);
v_primitive = CoreValue::new_map();
core_set(&v_primitive, CoreValue::from("name"), v_name.clone())?;
core_set(
&v_primitive,
CoreValue::from("kind"),
CoreValue::from("runtime_primitive"),
)?;
core_set(
&v_primitive,
CoreValue::from("metadata"),
v_primitive_meta.clone(),
)?;
core_append(&v_primitives, v_primitive.clone())?;
}
core_set(
&v_globals,
CoreValue::from("runtime_primitives"),
v_primitives.clone(),
)?;
for v_key in core_iter(&v_values)? {
let mut v_key = v_key;
v_conflict = core_contains(&[v_reserved.clone(), v_key.clone()])?;
if core_truthy(&v_conflict) {
v_message = core_string_format(&[
CoreValue::from("agent runtime global conflicts with reserved name: {}"),
v_key.clone(),
])?;
v_error = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
} else {
v_value = core_get(&v_values, &v_key.clone(), CoreValue::Null);
core_set(&v_globals, v_key.clone(), v_value.clone())?;
}
}
v_runtime_contract = core_get(
&v_state,
&CoreValue::from("runtime_contract"),
v_empty_map.clone(),
);
core_set(
&v_globals,
CoreValue::from("runtime"),
v_runtime_contract.clone(),
)?;
core_set(
&v_state,
CoreValue::from("runtime_globals"),
v_globals.clone(),
)?;
return Ok(v_globals.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_runtime_sanitize_bindings(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_runtime_sanitize_bindings");
let mut v_bindings = core_arg(args, 0);
let mut v_bindings_is_map = CoreValue::Null;
let mut v_conflict = CoreValue::Null;
let mut v_key = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_reserved = CoreValue::Null;
let mut v_value = CoreValue::Null;
v_reserved = _agent_reserved_runtime_names(&[])?;
v_out = CoreValue::new_map();
v_bindings_is_map = core_type_is(&v_bindings, CoreValue::from("object"));
if core_truthy(&v_bindings_is_map) {
for v_key in core_iter(&v_bindings)? {
let mut v_key = v_key;
v_conflict = core_contains(&[v_reserved.clone(), v_key.clone()])?;
if core_truthy(&v_conflict) {
} else {
v_value = core_get(&v_bindings, &v_key.clone(), CoreValue::Null);
core_set(&v_out, v_key.clone(), v_value.clone())?;
}
}
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_agent_runtime_snapshot(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_agent_runtime_snapshot");
let mut v_snapshot = core_arg(args, 0);
let mut v_bindings = CoreValue::Null;
let mut v_clean_bindings = CoreValue::Null;
let mut v_closed = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_entries = CoreValue::Null;
let mut v_entries_is_list = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_error2 = CoreValue::Null;
let mut v_has_any = CoreValue::Null;
let mut v_has_bindings = CoreValue::Null;
let mut v_has_globals = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_raw_bindings = CoreValue::Null;
let mut v_raw_globals = CoreValue::Null;
let mut v_snapshot_is_map = CoreValue::Null;
let mut v_version = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_snapshot_is_map = core_type_is(&v_snapshot, CoreValue::from("object"));
if core_truthy(&v_snapshot_is_map) {
} else {
v_error = core_runtime_error(&[CoreValue::from(
"runtime session snapshot must be an object",
)])?;
return Err(core_as_error(&v_error));
}
v_raw_globals = core_get(&v_snapshot, &CoreValue::from("globals"), CoreValue::Null);
v_raw_bindings = core_get(&v_snapshot, &CoreValue::from("bindings"), CoreValue::Null);
v_has_globals = core_type_is(&v_raw_globals, CoreValue::from("object"));
v_has_bindings = core_type_is(&v_raw_bindings, CoreValue::from("object"));
v_has_any = core_or(&[v_has_globals.clone(), v_has_bindings.clone()])?;
if core_truthy(&v_has_any) {
} else {
v_error2 = core_runtime_error(&[CoreValue::from(
"runtime session snapshot globals must be an object",
)])?;
return Err(core_as_error(&v_error2));
}
v_bindings = v_raw_globals.clone();
if core_truthy(&v_has_bindings) {
v_bindings = v_raw_bindings.clone();
}
v_clean_bindings = _agent_runtime_sanitize_bindings(&[v_bindings.clone()])?;
v_entries = core_get(
&v_snapshot,
&CoreValue::from("entries"),
v_empty_list.clone(),
);
v_entries_is_list = core_type_is(&v_entries, CoreValue::from("list"));
if core_truthy(&v_entries_is_list) {
} else {
v_entries = v_empty_list.clone();
}
v_closed = core_get(
&v_snapshot,
&CoreValue::from("closed"),
CoreValue::Bool(false),
);
v_version = core_get(
&v_snapshot,
&CoreValue::from("version"),
CoreValue::Num(1f64),
);
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("version"), v_version.clone())?;
core_set(&v_out, CoreValue::from("entries"), v_entries.clone())?;
core_set(
&v_out,
CoreValue::from("bindings"),
v_clean_bindings.clone(),
)?;
core_set(&v_out, CoreValue::from("globals"), v_clean_bindings.clone())?;
core_set(&v_out, CoreValue::from("closed"), v_closed.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_runtime_append_action_log(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_runtime_append_action_log");
let mut v_state = core_arg(args, 0);
let mut v_entry = core_arg(args, 1);
let mut v_count = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_entry_is_map = CoreValue::Null;
let mut v_has_tags = CoreValue::Null;
let mut v_has_turn = CoreValue::Null;
let mut v_is_error = CoreValue::Null;
let mut v_log = CoreValue::Null;
let mut v_tags = CoreValue::Null;
let mut v_turn = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_log = core_get(
&v_state,
&CoreValue::from("action_log"),
v_empty_list.clone(),
);
v_entry_is_map = core_type_is(&v_entry, CoreValue::from("object"));
if core_truthy(&v_entry_is_map) {
v_has_turn = core_map_contains(&[v_entry.clone(), CoreValue::from("turn")])?;
if core_truthy(&v_has_turn) {
} else {
v_count = core_len(&[v_log.clone()])?;
v_turn = core_add(&[v_count.clone(), CoreValue::Num(1f64)])?;
core_set(&v_entry, CoreValue::from("turn"), v_turn.clone())?;
}
v_has_tags = core_map_contains(&[v_entry.clone(), CoreValue::from("tags")])?;
if core_truthy(&v_has_tags) {
} else {
v_tags = CoreValue::new_list();
v_is_error = core_get(
&v_entry,
&CoreValue::from("is_error"),
CoreValue::Bool(false),
);
if core_truthy(&v_is_error) {
core_append(&v_tags, CoreValue::from("error"))?;
}
core_set(&v_entry, CoreValue::from("tags"), v_tags.clone())?;
}
}
core_append(&v_log, v_entry.clone())?;
core_set(&v_state, CoreValue::from("action_log"), v_log.clone())?;
return Ok(v_entry.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_agent_runtime_step_result(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_agent_runtime_step_result");
let mut v_raw = core_arg(args, 0);
let mut v_code = core_arg(args, 1);
let mut v_abort_like = CoreValue::Null;
let mut v_callable_request = CoreValue::Null;
let mut v_completion_is_map = CoreValue::Null;
let mut v_completion_is_map2 = CoreValue::Null;
let mut v_completion_payload = CoreValue::Null;
let mut v_completion_type = CoreValue::Null;
let mut v_discover_request = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_error_category = CoreValue::Null;
let mut v_error_message = CoreValue::Null;
let mut v_escape_error = CoreValue::Null;
let mut v_escape_message = CoreValue::Null;
let mut v_guidance_payload = CoreValue::Null;
let mut v_is_abort = CoreValue::Null;
let mut v_is_aborted = CoreValue::Null;
let mut v_is_clarification = CoreValue::Null;
let mut v_is_clarification_kind = CoreValue::Null;
let mut v_is_closed = CoreValue::Null;
let mut v_is_completion_kind = CoreValue::Null;
let mut v_is_error = CoreValue::Null;
let mut v_is_final = CoreValue::Null;
let mut v_is_final_kind = CoreValue::Null;
let mut v_is_guide_kind = CoreValue::Null;
let mut v_is_protocol_kind = CoreValue::Null;
let mut v_is_respond = CoreValue::Null;
let mut v_is_respond_kind = CoreValue::Null;
let mut v_is_user_error = CoreValue::Null;
let mut v_joined_logs = CoreValue::Null;
let mut v_kind = CoreValue::Null;
let mut v_missing_kind = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_output_is_empty = CoreValue::Null;
let mut v_raw_is_map = CoreValue::Null;
let mut v_raw_logs = CoreValue::Null;
let mut v_raw_logs_is_list = CoreValue::Null;
let mut v_raw_type = CoreValue::Null;
let mut v_recall_request = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_should_escape = CoreValue::Null;
let mut v_status = CoreValue::Null;
let mut v_used_request = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_none = core_none(&[])?;
v_out = CoreValue::new_map();
v_raw_is_map = core_type_is(&v_raw, CoreValue::from("object"));
v_kind = CoreValue::from("result");
v_is_error = CoreValue::Bool(false);
v_result = v_raw.clone();
v_output = CoreValue::from("");
v_error_message = CoreValue::from("");
v_error_category = CoreValue::from("");
v_completion_payload = v_none.clone();
v_discover_request = v_none.clone();
v_recall_request = v_none.clone();
v_used_request = v_none.clone();
v_callable_request = v_none.clone();
v_guidance_payload = v_none.clone();
v_status = v_none.clone();
if core_truthy(&v_raw_is_map) {
v_raw_type = core_get(&v_raw, &CoreValue::from("type"), CoreValue::from(""));
v_kind = core_get(&v_raw, &CoreValue::from("kind"), v_raw_type.clone());
v_missing_kind = core_eq(&[v_kind.clone(), CoreValue::from("")])?;
if core_truthy(&v_missing_kind) {
v_kind = CoreValue::from("result");
}
v_is_error = core_get(&v_raw, &CoreValue::from("is_error"), CoreValue::Bool(false));
v_result = core_get(&v_raw, &CoreValue::from("result"), v_raw.clone());
v_output = core_get(&v_raw, &CoreValue::from("output"), CoreValue::from(""));
v_output_is_empty = core_eq(&[v_output.clone(), CoreValue::from("")])?;
if core_truthy(&v_output_is_empty) {
v_raw_logs = core_get(&v_raw, &CoreValue::from("logs"), CoreValue::Null);
v_raw_logs_is_list = core_type_is(&v_raw_logs, CoreValue::from("list"));
if core_truthy(&v_raw_logs_is_list) {
v_joined_logs =
core_string_join_intrinsic(&[CoreValue::from("\n"), v_raw_logs.clone()])?;
v_output = v_joined_logs.clone();
}
}
v_error_message = core_get(&v_raw, &CoreValue::from("error"), CoreValue::from(""));
v_error_category = core_get(
&v_raw,
&CoreValue::from("error_category"),
CoreValue::from(""),
);
v_completion_payload = core_get(
&v_raw,
&CoreValue::from("completion_payload"),
CoreValue::Null,
);
v_discover_request = core_get(&v_raw, &CoreValue::from("discover"), CoreValue::Null);
v_recall_request = core_get(&v_raw, &CoreValue::from("recall"), CoreValue::Null);
v_used_request = core_get(&v_raw, &CoreValue::from("used"), CoreValue::Null);
v_callable_request = core_get(&v_raw, &CoreValue::from("callable"), CoreValue::Null);
v_guidance_payload = core_get(&v_raw, &CoreValue::from("guidance"), CoreValue::Null);
v_status = core_get(&v_raw, &CoreValue::from("status"), CoreValue::Null);
}
v_completion_is_map = core_type_is(&v_completion_payload, CoreValue::from("object"));
if core_truthy(&v_completion_is_map) {
} else {
v_is_final_kind = core_eq(&[v_kind.clone(), CoreValue::from("final")])?;
v_is_respond_kind = core_eq(&[v_kind.clone(), CoreValue::from("respond")])?;
v_is_clarification_kind = core_eq(&[v_kind.clone(), CoreValue::from("askClarification")])?;
v_is_completion_kind = core_or(&[v_is_final_kind.clone(), v_is_respond_kind.clone()])?;
v_is_protocol_kind = core_or(&[
v_is_completion_kind.clone(),
v_is_clarification_kind.clone(),
])?;
if core_truthy(&v_is_protocol_kind) {
v_completion_payload = v_raw.clone();
}
}
v_completion_is_map2 = core_type_is(&v_completion_payload, CoreValue::from("object"));
if core_truthy(&v_completion_is_map2) {
v_completion_type = core_get(
&v_completion_payload,
&CoreValue::from("type"),
v_kind.clone(),
);
v_is_final = core_eq(&[v_completion_type.clone(), CoreValue::from("final")])?;
if core_truthy(&v_is_final) {
v_completion_payload = _normalize_agent_final_payload(&[v_completion_payload.clone()])?;
v_kind = CoreValue::from("final");
} else {
v_is_respond = core_eq(&[v_completion_type.clone(), CoreValue::from("respond")])?;
if core_truthy(&v_is_respond) {
v_completion_payload =
_normalize_agent_respond_payload(&[v_completion_payload.clone()])?;
v_kind = CoreValue::from("respond");
} else {
v_is_clarification = core_eq(&[
v_completion_type.clone(),
CoreValue::from("askClarification"),
])?;
if core_truthy(&v_is_clarification) {
v_completion_payload =
_normalize_agent_clarification_payload(&[v_completion_payload.clone()])?;
v_kind = CoreValue::from("askClarification");
}
}
}
}
v_is_guide_kind = core_eq(&[v_kind.clone(), CoreValue::from("guide_agent")])?;
if core_truthy(&v_is_guide_kind) {
v_guidance_payload =
_normalize_agent_guidance_payload(&[v_raw.clone(), CoreValue::from("")])?;
}
core_set(
&v_out,
CoreValue::from("type"),
CoreValue::from("runtime_step"),
)?;
core_set(&v_out, CoreValue::from("kind"), v_kind.clone())?;
core_set(&v_out, CoreValue::from("code"), v_code.clone())?;
core_set(&v_out, CoreValue::from("result"), v_result.clone())?;
core_set(&v_out, CoreValue::from("output"), v_output.clone())?;
core_set(&v_out, CoreValue::from("is_error"), v_is_error.clone())?;
core_set(&v_out, CoreValue::from("error"), v_error_message.clone())?;
core_set(
&v_out,
CoreValue::from("error_category"),
v_error_category.clone(),
)?;
core_set(
&v_out,
CoreValue::from("completion_payload"),
v_completion_payload.clone(),
)?;
core_set(
&v_out,
CoreValue::from("discover_request"),
v_discover_request.clone(),
)?;
core_set(
&v_out,
CoreValue::from("recall_request"),
v_recall_request.clone(),
)?;
core_set(
&v_out,
CoreValue::from("used_request"),
v_used_request.clone(),
)?;
core_set(
&v_out,
CoreValue::from("callable_request"),
v_callable_request.clone(),
)?;
core_set(
&v_out,
CoreValue::from("guidance_payload"),
v_guidance_payload.clone(),
)?;
core_set(&v_out, CoreValue::from("status"), v_status.clone())?;
v_is_closed = core_eq(&[v_error_category.clone(), CoreValue::from("session_closed")])?;
if core_truthy(&v_is_closed) {
core_set(
&v_out,
CoreValue::from("restart_notice"),
CoreValue::from("runtime session closed; restarting fresh session"),
)?;
}
v_is_abort = core_eq(&[v_error_category.clone(), CoreValue::from("abort")])?;
v_is_aborted = core_eq(&[v_error_category.clone(), CoreValue::from("aborted")])?;
v_is_user_error = core_eq(&[v_error_category.clone(), CoreValue::from("user_error")])?;
v_abort_like = core_or(&[v_is_abort.clone(), v_is_aborted.clone()])?;
v_should_escape = core_or(&[v_abort_like.clone(), v_is_user_error.clone()])?;
if core_truthy(&v_should_escape) {
v_escape_message = core_string_format(&[
CoreValue::from("runtime host boundary escaped {}: {}"),
v_error_category.clone(),
v_error_message.clone(),
])?;
v_escape_error = core_runtime_error(&[v_escape_message.clone()])?;
return Err(core_as_error(&v_escape_error));
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_runtime_execution_options(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_runtime_execution_options");
let mut v_state = core_arg(args, 0);
let mut v_options = core_arg(args, 1);
let mut v_abort_signal = CoreValue::Null;
let mut v_abort_snake = CoreValue::Null;
let mut v_aborted = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_has_abort = CoreValue::Null;
let mut v_has_session_id = CoreValue::Null;
let mut v_has_timeout = CoreValue::Null;
let mut v_has_trace_id = CoreValue::Null;
let mut v_reserved_names = CoreValue::Null;
let mut v_runtime_options = CoreValue::Null;
let mut v_session_id = CoreValue::Null;
let mut v_session_id_snake = CoreValue::Null;
let mut v_timeout = CoreValue::Null;
let mut v_timeout_ms = CoreValue::Null;
let mut v_trace_id = CoreValue::Null;
let mut v_trace_id_snake = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_reserved_names = _agent_reserved_runtime_names(&[])?;
v_runtime_options = core_map_merge(&[v_empty_map.clone(), v_options.clone()])?;
core_map_delete(&[v_runtime_options.clone(), CoreValue::from("runtime")])?;
core_set(
&v_runtime_options,
CoreValue::from("reservedNames"),
v_reserved_names.clone(),
)?;
v_timeout_ms = core_get(&v_options, &CoreValue::from("timeout_ms"), CoreValue::Null);
v_timeout = core_get(
&v_options,
&CoreValue::from("timeout"),
v_timeout_ms.clone(),
);
v_has_timeout = core_is_not_none(&[v_timeout.clone()])?;
if core_truthy(&v_has_timeout) {
core_set(
&v_runtime_options,
CoreValue::from("timeout"),
v_timeout.clone(),
)?;
}
v_abort_snake = core_get(
&v_options,
&CoreValue::from("abort"),
CoreValue::Bool(false),
);
v_aborted = core_get(
&v_options,
&CoreValue::from("aborted"),
v_abort_snake.clone(),
);
v_abort_signal = core_get(
&v_options,
&CoreValue::from("abortSignal"),
v_aborted.clone(),
);
v_has_abort = core_truthy_value(&[v_abort_signal.clone()])?;
if core_truthy(&v_has_abort) {
core_set(
&v_runtime_options,
CoreValue::from("abort"),
CoreValue::Bool(true),
)?;
}
v_session_id_snake = core_get(&v_options, &CoreValue::from("session_id"), CoreValue::Null);
v_session_id = core_get(
&v_options,
&CoreValue::from("sessionId"),
v_session_id_snake.clone(),
);
v_has_session_id = core_is_not_none(&[v_session_id.clone()])?;
if core_truthy(&v_has_session_id) {
core_set(
&v_runtime_options,
CoreValue::from("sessionId"),
v_session_id.clone(),
)?;
}
v_trace_id_snake = core_get(&v_options, &CoreValue::from("trace_id"), CoreValue::Null);
v_trace_id = core_get(
&v_options,
&CoreValue::from("traceId"),
v_trace_id_snake.clone(),
);
v_has_trace_id = core_is_not_none(&[v_trace_id.clone()])?;
if core_truthy(&v_has_trace_id) {
core_set(
&v_runtime_options,
CoreValue::from("traceId"),
v_trace_id.clone(),
)?;
}
return Ok(v_runtime_options.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_runtime_lifecycle_event(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_runtime_lifecycle_event");
let mut v_state = core_arg(args, 0);
let mut v_action = core_arg(args, 1);
let mut v_details = core_arg(args, 2);
let mut v_empty_map = CoreValue::Null;
let mut v_entry = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_entry = core_map_merge(&[v_empty_map.clone(), v_details.clone()])?;
core_set(
&v_entry,
CoreValue::from("type"),
CoreValue::from("runtime_session"),
)?;
core_set(&v_entry, CoreValue::from("action"), v_action.clone())?;
_agent_runtime_append_action_log(&[v_state.clone(), v_entry.clone()])?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("runtime_lifecycle"),
v_entry.clone(),
])?;
return Ok(v_entry.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_runtime_create_session(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_runtime_create_session");
let mut v_state = core_arg(args, 0);
let mut v_runtime = core_arg(args, 1);
let mut v_globals = core_arg(args, 2);
let mut v_options = core_arg(args, 3);
let mut v_entry = CoreValue::Null;
let mut v_runtime_options = CoreValue::Null;
let mut v_session = CoreValue::Null;
v_runtime_options = _agent_runtime_execution_options(&[v_state.clone(), v_options.clone()])?;
v_session = core_agent_runtime_create_session(&[
v_runtime.clone(),
v_globals.clone(),
v_runtime_options.clone(),
])?;
core_set(
&v_state,
CoreValue::from("runtime_session"),
v_session.clone(),
)?;
core_set(
&v_state,
CoreValue::from("runtime_globals"),
v_globals.clone(),
)?;
v_entry = CoreValue::new_map();
core_set(&v_entry, CoreValue::from("globals"), v_globals.clone())?;
core_set(
&v_entry,
CoreValue::from("options"),
v_runtime_options.clone(),
)?;
_agent_runtime_lifecycle_event(&[
v_state.clone(),
CoreValue::from("create_session"),
v_entry.clone(),
])?;
return Ok(v_session.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_runtime_execute_step(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_runtime_execute_step");
let mut v_state = core_arg(args, 0);
let mut v_runtime = core_arg(args, 1);
let mut v_session = core_arg(args, 2);
let mut v_code = core_arg(args, 3);
let mut v_options = core_arg(args, 4);
let mut v_callable_request = CoreValue::Null;
let mut v_callable_result = CoreValue::Null;
let mut v_closed = CoreValue::Null;
let mut v_completion_payload = CoreValue::Null;
let mut v_completion_type = CoreValue::Null;
let mut v_discover_request = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_globals = CoreValue::Null;
let mut v_guidance_payload = CoreValue::Null;
let mut v_has_callable = CoreValue::Null;
let mut v_has_completion = CoreValue::Null;
let mut v_has_discover = CoreValue::Null;
let mut v_has_guidance = CoreValue::Null;
let mut v_has_recall = CoreValue::Null;
let mut v_has_status = CoreValue::Null;
let mut v_has_used = CoreValue::Null;
let mut v_is_clarification_completion = CoreValue::Null;
let mut v_is_closed = CoreValue::Null;
let mut v_is_final_completion = CoreValue::Null;
let mut v_missing_session = CoreValue::Null;
let mut v_normalized = CoreValue::Null;
let mut v_notice = CoreValue::Null;
let mut v_raw = CoreValue::Null;
let mut v_recall_request = CoreValue::Null;
let mut v_runtime_options = CoreValue::Null;
let mut v_status = CoreValue::Null;
let mut v_status_log = CoreValue::Null;
let mut v_step_error = CoreValue::Null;
let mut v_used_request = CoreValue::Null;
v_runtime_options = _agent_runtime_execution_options(&[v_state.clone(), v_options.clone()])?;
v_empty_map = CoreValue::new_map();
v_globals = core_get(
&v_state,
&CoreValue::from("runtime_globals"),
v_empty_map.clone(),
);
v_missing_session = core_is_none(&[v_session.clone()])?;
if core_truthy(&v_missing_session) {
v_session = _agent_runtime_create_session(&[
v_state.clone(),
v_runtime.clone(),
v_globals.clone(),
v_runtime_options.clone(),
])?;
}
v_raw = core_agent_runtime_execute(&[
v_session.clone(),
v_code.clone(),
v_runtime_options.clone(),
])?;
v_normalized = _normalize_agent_runtime_step_result(&[v_raw.clone(), v_code.clone()])?;
v_closed = core_get(
&v_normalized,
&CoreValue::from("error_category"),
CoreValue::from(""),
);
v_is_closed = core_eq(&[v_closed.clone(), CoreValue::from("session_closed")])?;
if core_truthy(&v_is_closed) {
v_notice = CoreValue::new_map();
core_set(
&v_notice,
CoreValue::from("reason"),
CoreValue::from("session_closed"),
)?;
_agent_runtime_lifecycle_event(&[
v_state.clone(),
CoreValue::from("restart"),
v_notice.clone(),
])?;
v_session = _agent_runtime_create_session(&[
v_state.clone(),
v_runtime.clone(),
v_globals.clone(),
v_runtime_options.clone(),
])?;
v_raw = core_agent_runtime_execute(&[
v_session.clone(),
v_code.clone(),
v_runtime_options.clone(),
])?;
v_normalized = _normalize_agent_runtime_step_result(&[v_raw.clone(), v_code.clone()])?;
}
_agent_runtime_append_action_log(&[v_state.clone(), v_normalized.clone()])?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("runtime_execute"),
v_normalized.clone(),
])?;
v_step_error = core_get(
&v_normalized,
&CoreValue::from("is_error"),
CoreValue::Bool(false),
);
if core_truthy(&v_step_error) {
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("error"),
v_normalized.clone(),
])?;
}
v_discover_request = core_get(
&v_normalized,
&CoreValue::from("discover_request"),
CoreValue::Null,
);
v_has_discover = core_type_is(&v_discover_request, CoreValue::from("object"));
if core_truthy(&v_has_discover) {
_agent_discover(&[v_state.clone(), v_discover_request.clone()])?;
}
v_recall_request = core_get(
&v_normalized,
&CoreValue::from("recall_request"),
CoreValue::Null,
);
v_has_recall = core_is_not_none(&[v_recall_request.clone()])?;
if core_truthy(&v_has_recall) {
_agent_recall(&[v_state.clone(), v_recall_request.clone()])?;
}
v_used_request = core_get(
&v_normalized,
&CoreValue::from("used_request"),
CoreValue::Null,
);
v_has_used = core_is_not_none(&[v_used_request.clone()])?;
if core_truthy(&v_has_used) {
_agent_used(&[
v_state.clone(),
v_used_request.clone(),
CoreValue::from("executor"),
])?;
}
v_callable_request = core_get(
&v_normalized,
&CoreValue::from("callable_request"),
CoreValue::Null,
);
v_has_callable = core_is_not_none(&[v_callable_request.clone()])?;
if core_truthy(&v_has_callable) {
v_callable_result = _agent_execute_callable(&[
v_state.clone(),
v_callable_request.clone(),
v_options.clone(),
])?;
core_set(
&v_normalized,
CoreValue::from("callable_result"),
v_callable_result.clone(),
)?;
}
v_guidance_payload = core_get(
&v_normalized,
&CoreValue::from("guidance_payload"),
CoreValue::Null,
);
v_has_guidance = core_type_is(&v_guidance_payload, CoreValue::from("object"));
if core_truthy(&v_has_guidance) {
_agent_append_guidance(&[v_state.clone(), v_guidance_payload.clone()])?;
}
v_completion_payload = core_get(
&v_normalized,
&CoreValue::from("completion_payload"),
CoreValue::Null,
);
v_has_completion = core_type_is(&v_completion_payload, CoreValue::from("object"));
if core_truthy(&v_has_completion) {
core_set(
&v_state,
CoreValue::from("last_runtime_completion"),
v_completion_payload.clone(),
)?;
v_completion_type = core_get(
&v_completion_payload,
&CoreValue::from("type"),
CoreValue::from(""),
);
v_is_final_completion = core_eq(&[v_completion_type.clone(), CoreValue::from("final")])?;
if core_truthy(&v_is_final_completion) {
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("final"),
v_completion_payload.clone(),
])?;
} else {
v_is_clarification_completion = core_eq(&[
v_completion_type.clone(),
CoreValue::from("askClarification"),
])?;
if core_truthy(&v_is_clarification_completion) {
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("clarification"),
v_completion_payload.clone(),
])?;
}
}
}
v_status = core_get(&v_normalized, &CoreValue::from("status"), CoreValue::Null);
v_has_status = core_type_is(&v_status, CoreValue::from("object"));
if core_truthy(&v_has_status) {
v_empty_list = CoreValue::new_list();
v_status_log = core_get(
&v_state,
&CoreValue::from("status_log"),
v_empty_list.clone(),
);
core_append(&v_status_log, v_status.clone())?;
core_set(
&v_state,
CoreValue::from("status_log"),
v_status_log.clone(),
)?;
_agent_record_trace_event(&[v_state.clone(), CoreValue::from("status"), v_status.clone()])?;
}
return Ok(v_normalized.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_runtime_inspect_state(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_runtime_inspect_state");
let mut v_state = core_arg(args, 0);
let mut v_session = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_entry = CoreValue::Null;
let mut v_inspection = CoreValue::Null;
v_inspection = core_agent_runtime_inspect(&[v_session.clone(), v_options.clone()])?;
core_set(
&v_state,
CoreValue::from("runtime_inspection"),
v_inspection.clone(),
)?;
v_entry = CoreValue::new_map();
core_set(
&v_entry,
CoreValue::from("type"),
CoreValue::from("runtime_session"),
)?;
core_set(
&v_entry,
CoreValue::from("action"),
CoreValue::from("inspect_globals"),
)?;
core_set(&v_entry, CoreValue::from("result"), v_inspection.clone())?;
_agent_runtime_append_action_log(&[v_state.clone(), v_entry.clone()])?;
return Ok(v_inspection.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_runtime_export_session_state(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_runtime_export_session_state");
let mut v_state = core_arg(args, 0);
let mut v_session = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_event = CoreValue::Null;
let mut v_log_entry = CoreValue::Null;
let mut v_raw_snapshot = CoreValue::Null;
let mut v_snapshot = CoreValue::Null;
v_raw_snapshot = core_agent_runtime_export_state(&[v_session.clone(), v_options.clone()])?;
v_snapshot = _normalize_agent_runtime_snapshot(&[v_raw_snapshot.clone()])?;
core_set(
&v_state,
CoreValue::from("runtime_session_state"),
v_snapshot.clone(),
)?;
v_log_entry = CoreValue::new_map();
core_set(
&v_log_entry,
CoreValue::from("type"),
CoreValue::from("runtime_session"),
)?;
core_set(
&v_log_entry,
CoreValue::from("action"),
CoreValue::from("snapshot_globals"),
)?;
core_set(
&v_log_entry,
CoreValue::from("snapshot"),
v_snapshot.clone(),
)?;
_agent_runtime_append_action_log(&[v_state.clone(), v_log_entry.clone()])?;
v_event = CoreValue::new_map();
core_set(&v_event, CoreValue::from("snapshot"), v_snapshot.clone())?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("state_export"),
v_event.clone(),
])?;
return Ok(v_snapshot.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_runtime_refresh_state_summary(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_runtime_refresh_state_summary");
let mut v_state = core_arg(args, 0);
let mut v_session = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_empty_map = CoreValue::Null;
let mut v_enabled = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_policy = CoreValue::Null;
let mut v_raw_snapshot = CoreValue::Null;
let mut v_runtime_options = CoreValue::Null;
let mut v_snapshot = CoreValue::Null;
let mut v_state_summary = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_none = core_none(&[])?;
v_policy = core_get(
&v_state,
&CoreValue::from("context_policy"),
CoreValue::Null,
);
v_state_summary = core_get(
&v_policy,
&CoreValue::from("stateSummary"),
v_empty_map.clone(),
);
v_enabled = core_get(
&v_state_summary,
&CoreValue::from("enabled"),
CoreValue::Bool(false),
);
if core_truthy(&v_enabled) {
v_runtime_options =
_agent_runtime_execution_options(&[v_state.clone(), v_options.clone()])?;
v_raw_snapshot =
core_agent_runtime_export_state(&[v_session.clone(), v_runtime_options.clone()])?;
v_snapshot = _normalize_agent_runtime_snapshot(&[v_raw_snapshot.clone()])?;
core_set(
&v_state,
CoreValue::from("runtime_session_state"),
v_snapshot.clone(),
)?;
return Ok(v_snapshot.clone());
}
return Ok(v_none.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_runtime_restore_session_state(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_runtime_restore_session_state");
let mut v_state = core_arg(args, 0);
let mut v_session = core_arg(args, 1);
let mut v_snapshot = core_arg(args, 2);
let mut v_options = core_arg(args, 3);
let mut v_event = CoreValue::Null;
let mut v_log_entry = CoreValue::Null;
let mut v_normalized_snapshot = CoreValue::Null;
let mut v_raw_restored = CoreValue::Null;
let mut v_restored = CoreValue::Null;
v_normalized_snapshot = _normalize_agent_runtime_snapshot(&[v_snapshot.clone()])?;
v_raw_restored = core_agent_runtime_restore_state(&[
v_session.clone(),
v_normalized_snapshot.clone(),
v_options.clone(),
])?;
v_restored = _normalize_agent_runtime_snapshot(&[v_raw_restored.clone()])?;
core_set(
&v_state,
CoreValue::from("runtime_session_state"),
v_restored.clone(),
)?;
v_log_entry = CoreValue::new_map();
core_set(
&v_log_entry,
CoreValue::from("type"),
CoreValue::from("runtime_session"),
)?;
core_set(
&v_log_entry,
CoreValue::from("action"),
CoreValue::from("patch_globals"),
)?;
core_set(
&v_log_entry,
CoreValue::from("snapshot"),
v_restored.clone(),
)?;
_agent_runtime_append_action_log(&[v_state.clone(), v_log_entry.clone()])?;
v_event = CoreValue::new_map();
core_set(&v_event, CoreValue::from("snapshot"), v_restored.clone())?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("state_restore"),
v_event.clone(),
])?;
return Ok(v_restored.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_runtime_close_session(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_runtime_close_session");
let mut v_state = core_arg(args, 0);
let mut v_session = core_arg(args, 1);
let mut v_closed = CoreValue::Null;
let mut v_entry = CoreValue::Null;
v_closed = core_agent_runtime_close(&[v_session.clone()])?;
core_set(
&v_state,
CoreValue::from("runtime_session_closed"),
CoreValue::Bool(true),
)?;
v_entry = CoreValue::new_map();
core_set(&v_entry, CoreValue::from("result"), v_closed.clone())?;
_agent_runtime_lifecycle_event(&[
v_state.clone(),
CoreValue::from("close_session"),
v_entry.clone(),
])?;
return Ok(v_closed.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_reserved_auto_promotion_fields(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_reserved_auto_promotion_fields");
let mut v_fields = CoreValue::Null;
v_fields = CoreValue::new_list();
core_append(&v_fields, CoreValue::from("executorRequest"))?;
core_append(&v_fields, CoreValue::from("distilledContextSummary"))?;
core_append(&v_fields, CoreValue::from("contextMetadata"))?;
core_append(&v_fields, CoreValue::from("memories"))?;
core_append(&v_fields, CoreValue::from("contextMap"))?;
core_append(&v_fields, CoreValue::from("discoveredToolDocs"))?;
core_append(&v_fields, CoreValue::from("loadedSkills"))?;
core_append(&v_fields, CoreValue::from("relevanceHints"))?;
core_append(&v_fields, CoreValue::from("summarizedActorLog"))?;
core_append(&v_fields, CoreValue::from("guidanceLog"))?;
core_append(&v_fields, CoreValue::from("actionLog"))?;
core_append(&v_fields, CoreValue::from("liveRuntimeState"))?;
core_append(&v_fields, CoreValue::from("contextPressure"))?;
core_append(&v_fields, CoreValue::from("contextData"))?;
return Ok(v_fields.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_value_kind(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_value_kind");
let mut v_value = core_arg(args, 0);
let mut v_is_bool = CoreValue::Null;
let mut v_is_list = CoreValue::Null;
let mut v_is_none = CoreValue::Null;
let mut v_is_number = CoreValue::Null;
let mut v_is_object = CoreValue::Null;
let mut v_is_string = CoreValue::Null;
v_is_none = core_is_none(&[v_value.clone()])?;
if core_truthy(&v_is_none) {
return Ok(CoreValue::from("null"));
}
v_is_string = core_type_is(&v_value, CoreValue::from("string"));
if core_truthy(&v_is_string) {
return Ok(CoreValue::from("string"));
}
v_is_number = core_type_is(&v_value, CoreValue::from("number"));
if core_truthy(&v_is_number) {
return Ok(CoreValue::from("number"));
}
v_is_bool = core_type_is(&v_value, CoreValue::from("bool"));
if core_truthy(&v_is_bool) {
return Ok(CoreValue::from("boolean"));
}
v_is_list = core_type_is(&v_value, CoreValue::from("list"));
if core_truthy(&v_is_list) {
return Ok(CoreValue::from("array"));
}
v_is_object = core_type_is(&v_value, CoreValue::from("object"));
if core_truthy(&v_is_object) {
return Ok(CoreValue::from("object"));
}
return Ok(CoreValue::from("value"));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_take_strings(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_take_strings");
let mut v_items = core_arg(args, 0);
let mut v_limit = core_arg(args, 1);
let mut v_index = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_item_text = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_under = CoreValue::Null;
v_out = CoreValue::new_list();
v_index = CoreValue::Num(0f64);
for v_item in core_iter(&v_items)? {
let mut v_item = v_item;
v_under = core_lt(&[v_index.clone(), v_limit.clone()])?;
if core_truthy(&v_under) {
v_item_text = core_string_format(&[CoreValue::from("{}"), v_item.clone()])?;
core_append(&v_out, v_item_text.clone())?;
}
v_index = core_add(&[v_index.clone(), CoreValue::Num(1f64)])?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_object_keys_sample(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_object_keys_sample");
let mut v_value = core_arg(args, 0);
let mut v_limit = core_arg(args, 1);
let mut v_empty = CoreValue::Null;
let mut v_is_object = CoreValue::Null;
let mut v_keys = CoreValue::Null;
let mut v_out = CoreValue::Null;
v_empty = CoreValue::new_list();
v_is_object = core_type_is(&v_value, CoreValue::from("object"));
if core_truthy(&v_is_object) {
v_keys = core_map_keys(&[v_value.clone()])?;
v_out = _agent_take_strings(&[v_keys.clone(), v_limit.clone()])?;
return Ok(v_out.clone());
}
return Ok(v_empty.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_evidence_entry_descriptor(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_evidence_entry_descriptor");
let mut v_key = core_arg(args, 0);
let mut v_value = core_arg(args, 1);
let mut v_entry = CoreValue::Null;
let mut v_first = CoreValue::Null;
let mut v_has_item_keys = CoreValue::Null;
let mut v_has_keys = CoreValue::Null;
let mut v_is_list = CoreValue::Null;
let mut v_is_object = CoreValue::Null;
let mut v_item_key_count = CoreValue::Null;
let mut v_item_keys = CoreValue::Null;
let mut v_key_count = CoreValue::Null;
let mut v_keys = CoreValue::Null;
let mut v_kind = CoreValue::Null;
let mut v_length = CoreValue::Null;
let mut v_size = CoreValue::Null;
let mut v_text = CoreValue::Null;
v_text = core_json_stringify(&[v_value.clone()])?;
v_size = core_len(&[v_text.clone()])?;
v_kind = _agent_value_kind(&[v_value.clone()])?;
v_entry = CoreValue::new_map();
core_set(&v_entry, CoreValue::from("key"), v_key.clone())?;
core_set(&v_entry, CoreValue::from("type"), v_kind.clone())?;
core_set(&v_entry, CoreValue::from("size"), v_size.clone())?;
v_is_list = core_type_is(&v_value, CoreValue::from("list"));
if core_truthy(&v_is_list) {
v_length = core_len(&[v_value.clone()])?;
core_set(&v_entry, CoreValue::from("length"), v_length.clone())?;
v_first = core_list_get(&[v_value.clone(), CoreValue::Num(0f64), CoreValue::Null])?;
v_item_keys = _agent_object_keys_sample(&[v_first.clone(), CoreValue::Num(12f64)])?;
v_item_key_count = core_len(&[v_item_keys.clone()])?;
v_has_item_keys = core_gt(&[v_item_key_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_item_keys) {
core_set(&v_entry, CoreValue::from("itemKeys"), v_item_keys.clone())?;
}
}
v_is_object = core_type_is(&v_value, CoreValue::from("object"));
if core_truthy(&v_is_object) {
v_keys = _agent_object_keys_sample(&[v_value.clone(), CoreValue::Num(12f64)])?;
v_key_count = core_len(&[v_keys.clone()])?;
v_has_keys = core_gt(&[v_key_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_keys) {
core_set(&v_entry, CoreValue::from("keys"), v_keys.clone())?;
}
}
return Ok(v_entry.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_build_evidence_descriptor(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_build_evidence_descriptor");
let mut v_evidence = core_arg(args, 0);
let mut v_empty_map = CoreValue::Null;
let mut v_entries = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_is_object = CoreValue::Null;
let mut v_key = CoreValue::Null;
let mut v_keys = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_total = CoreValue::Null;
let mut v_value = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_payload = v_evidence.clone();
v_is_object = core_type_is(&v_payload, CoreValue::from("object"));
if core_truthy(&v_is_object) {
} else {
v_payload = v_empty_map.clone();
}
v_text = core_json_stringify(&[v_payload.clone()])?;
v_total = core_len(&[v_text.clone()])?;
v_entries = CoreValue::new_list();
v_keys = core_map_keys(&[v_payload.clone()])?;
for v_key in core_iter(&v_keys)? {
let mut v_key = v_key;
v_value = core_get(&v_payload, &v_key.clone(), CoreValue::Null);
v_entry = _agent_evidence_entry_descriptor(&[v_key.clone(), v_value.clone()])?;
core_append(&v_entries, v_entry.clone())?;
}
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("kind"),
CoreValue::from("axEvidenceDescriptor"),
)?;
core_set(&v_out, CoreValue::from("totalChars"), v_total.clone())?;
core_set(&v_out, CoreValue::from("entries"), v_entries.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_render_evidence_descriptor(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_render_evidence_descriptor");
let mut v_descriptor = core_arg(args, 0);
let mut v_empty = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_entries = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_entry_count = CoreValue::Null;
let mut v_has_item_keys = CoreValue::Null;
let mut v_has_keys = CoreValue::Null;
let mut v_has_length = CoreValue::Null;
let mut v_header = CoreValue::Null;
let mut v_is_descriptor = CoreValue::Null;
let mut v_item_keys = CoreValue::Null;
let mut v_item_keys_count = CoreValue::Null;
let mut v_item_keys_text = CoreValue::Null;
let mut v_key = CoreValue::Null;
let mut v_keys = CoreValue::Null;
let mut v_keys_count = CoreValue::Null;
let mut v_keys_text = CoreValue::Null;
let mut v_kind = CoreValue::Null;
let mut v_length = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_lines = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_size = CoreValue::Null;
let mut v_total = CoreValue::Null;
let mut v_type = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_kind = core_get(&v_descriptor, &CoreValue::from("kind"), CoreValue::from(""));
v_is_descriptor = core_eq(&[v_kind.clone(), CoreValue::from("axEvidenceDescriptor")])?;
if core_truthy(&v_is_descriptor) {
} else {
v_descriptor = _agent_build_evidence_descriptor(&[v_descriptor.clone()])?;
}
v_total = core_get(
&v_descriptor,
&CoreValue::from("totalChars"),
CoreValue::Num(0f64),
);
v_entries = core_get(
&v_descriptor,
&CoreValue::from("entries"),
v_empty_list.clone(),
);
v_entry_count = core_len(&[v_entries.clone()])?;
v_empty = core_eq(&[v_entry_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_empty) {
return Ok(CoreValue::from(
"Evidence object is available in the runtime as `inputs.distilledContext` (empty).",
));
}
v_lines = CoreValue::new_list();
v_header = core_string_format(&[CoreValue::from("Evidence keys available in the runtime as `inputs.distilledContext` (~{} chars total):"), v_total.clone()])?;
core_append(&v_lines, v_header.clone())?;
for v_entry in core_iter(&v_entries)? {
let mut v_entry = v_entry;
v_key = core_get(&v_entry, &CoreValue::from("key"), CoreValue::from(""));
v_type = core_get(&v_entry, &CoreValue::from("type"), CoreValue::from("value"));
v_size = core_get(&v_entry, &CoreValue::from("size"), CoreValue::Num(0f64));
v_line = core_string_format(&[
CoreValue::from("- `{}`: {} ({} chars)"),
v_key.clone(),
v_type.clone(),
v_size.clone(),
])?;
v_length = core_get(&v_entry, &CoreValue::from("length"), CoreValue::Null);
v_has_length = core_is_not_none(&[v_length.clone()])?;
if core_truthy(&v_has_length) {
v_line = core_string_format(&[
CoreValue::from("{}; length {}"),
v_line.clone(),
v_length.clone(),
])?;
}
v_keys = core_get(&v_entry, &CoreValue::from("keys"), v_empty_list.clone());
v_keys_count = core_len(&[v_keys.clone()])?;
v_has_keys = core_gt(&[v_keys_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_keys) {
v_keys_text = core_string_join_intrinsic(&[CoreValue::from(", "), v_keys.clone()])?;
v_line = core_string_format(&[
CoreValue::from("{}; keys: {}"),
v_line.clone(),
v_keys_text.clone(),
])?;
}
v_item_keys = core_get(&v_entry, &CoreValue::from("itemKeys"), v_empty_list.clone());
v_item_keys_count = core_len(&[v_item_keys.clone()])?;
v_has_item_keys = core_gt(&[v_item_keys_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_item_keys) {
v_item_keys_text =
core_string_join_intrinsic(&[CoreValue::from(", "), v_item_keys.clone()])?;
v_line = core_string_format(&[
CoreValue::from("{}; item keys: {}"),
v_line.clone(),
v_item_keys_text.clone(),
])?;
}
core_append(&v_lines, v_line.clone())?;
}
v_out = core_string_join_intrinsic(&[CoreValue::from("\n"), v_lines.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_relevance_tokens(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_relevance_tokens");
let mut v_text = core_arg(args, 0);
let mut v_already = CoreValue::Null;
let mut v_clean = CoreValue::Null;
let mut v_fresh = CoreValue::Null;
let mut v_is_stop = CoreValue::Null;
let mut v_len = CoreValue::Null;
let mut v_long_enough = CoreValue::Null;
let mut v_lower = CoreValue::Null;
let mut v_not_stop = CoreValue::Null;
let mut v_ok = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_stopwords = CoreValue::Null;
v_stopwords = core_json_parse(&[CoreValue::from("[\n \"a\",\n \"an\",\n \"and\",\n \"are\",\n \"as\",\n \"at\",\n \"be\",\n \"by\",\n \"for\",\n \"from\",\n \"has\",\n \"have\",\n \"how\",\n \"i\",\n \"in\",\n \"into\",\n \"is\",\n \"it\",\n \"of\",\n \"on\",\n \"or\",\n \"our\",\n \"please\",\n \"show\",\n \"that\",\n \"the\",\n \"their\",\n \"this\",\n \"to\",\n \"use\",\n \"with\",\n \"you\"\n]\n")])?;
v_lower = core_string_lower(&[v_text.clone()])?;
v_clean = core_regex_replace(&[
CoreValue::from("[^a-z0-9]+"),
CoreValue::from(" "),
v_lower.clone(),
])?;
v_parts = core_string_split_trim_nonempty(&[v_clean.clone(), CoreValue::from(" ")])?;
v_out = CoreValue::new_list();
for v_part in core_iter(&v_parts)? {
let mut v_part = v_part;
v_len = core_len(&[v_part.clone()])?;
v_long_enough = core_gt(&[v_len.clone(), CoreValue::Num(1f64)])?;
v_is_stop = core_contains(&[v_stopwords.clone(), v_part.clone()])?;
v_not_stop = core_not(&[v_is_stop.clone()])?;
v_ok = core_and(&[v_long_enough.clone(), v_not_stop.clone()])?;
if core_truthy(&v_ok) {
v_already = core_contains(&[v_out.clone(), v_part.clone()])?;
v_fresh = core_not(&[v_already.clone()])?;
if core_truthy(&v_fresh) {
core_append(&v_out, v_part.clone())?;
}
}
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_relevance_score(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_relevance_score");
let mut v_tokens = core_arg(args, 0);
let mut v_text = core_arg(args, 1);
let mut v_doc = CoreValue::Null;
let mut v_hit = CoreValue::Null;
let mut v_score = CoreValue::Null;
let mut v_token = CoreValue::Null;
v_doc = core_string_lower(&[v_text.clone()])?;
v_score = CoreValue::Num(0f64);
for v_token in core_iter(&v_tokens)? {
let mut v_token = v_token;
v_hit = core_contains(&[v_doc.clone(), v_token.clone()])?;
if core_truthy(&v_hit) {
v_score = core_add(&[v_score.clone(), CoreValue::Num(1f64)])?;
}
}
return Ok(v_score.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_relevance_has_id(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_relevance_has_id");
let mut v_items = core_arg(args, 0);
let mut v_field = core_arg(args, 1);
let mut v_id = core_arg(args, 2);
let mut v_existing = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_matches = CoreValue::Null;
for v_item in core_iter(&v_items)? {
let mut v_item = v_item;
v_existing = core_get(&v_item, &v_field.clone(), CoreValue::from(""));
v_matches = core_eq(&[v_existing.clone(), v_id.clone()])?;
if core_truthy(&v_matches) {
return Ok(CoreValue::Bool(true));
}
}
return Ok(CoreValue::Bool(false));
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_rank_relevance_modules(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_rank_relevance_modules");
let mut v_state = core_arg(args, 0);
let mut v_task = core_arg(args, 1);
let mut v_already = CoreValue::Null;
let mut v_callable = CoreValue::Null;
let mut v_callables = CoreValue::Null;
let mut v_cdesc = CoreValue::Null;
let mut v_description = CoreValue::Null;
let mut v_discoverable = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_fresh = CoreValue::Null;
let mut v_group = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_namespace = CoreValue::Null;
let mut v_no_tokens = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_out_count = CoreValue::Null;
let mut v_params = CoreValue::Null;
let mut v_passes = CoreValue::Null;
let mut v_pieces = CoreValue::Null;
let mut v_prop_keys = CoreValue::Null;
let mut v_prop_text = CoreValue::Null;
let mut v_properties = CoreValue::Null;
let mut v_props_is_object = CoreValue::Null;
let mut v_qualified = CoreValue::Null;
let mut v_score = CoreValue::Null;
let mut v_selection = CoreValue::Null;
let mut v_split = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_threshold = CoreValue::Null;
let mut v_thresholds = CoreValue::Null;
let mut v_title = CoreValue::Null;
let mut v_token_count = CoreValue::Null;
let mut v_tokens = CoreValue::Null;
let mut v_under = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_tokens = _agent_relevance_tokens(&[v_task.clone()])?;
v_token_count = core_len(&[v_tokens.clone()])?;
v_no_tokens = core_eq(&[v_token_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_no_tokens) {
return Ok(v_empty_list.clone());
}
v_split = core_get(
&v_state,
&CoreValue::from("callable_split"),
CoreValue::Null,
);
v_discoverable = core_get(
&v_split,
&CoreValue::from("discoverable"),
v_empty_list.clone(),
);
v_out = CoreValue::new_list();
v_thresholds = CoreValue::new_list();
core_append(&v_thresholds, CoreValue::Num(3f64))?;
core_append(&v_thresholds, CoreValue::Num(2f64))?;
core_append(&v_thresholds, CoreValue::Num(1f64))?;
for v_threshold in core_iter(&v_thresholds)? {
let mut v_threshold = v_threshold;
for v_group in core_iter(&v_discoverable)? {
let mut v_group = v_group;
v_out_count = core_len(&[v_out.clone()])?;
v_under = core_lt(&[v_out_count.clone(), CoreValue::Num(3f64)])?;
if core_truthy(&v_under) {
v_namespace =
core_get(&v_group, &CoreValue::from("namespace"), CoreValue::from(""));
v_already = _agent_relevance_has_id(&[
v_out.clone(),
CoreValue::from("namespace"),
v_namespace.clone(),
])?;
v_fresh = core_not(&[v_already.clone()])?;
if core_truthy(&v_fresh) {
v_title = core_get(&v_group, &CoreValue::from("title"), CoreValue::from(""));
v_description = core_get(
&v_group,
&CoreValue::from("description"),
CoreValue::from(""),
);
v_selection = core_get(
&v_group,
&CoreValue::from("selection_criteria"),
CoreValue::from(""),
);
v_callables = core_get(
&v_group,
&CoreValue::from("callables"),
v_empty_list.clone(),
);
v_pieces = CoreValue::new_list();
core_append(&v_pieces, v_namespace.clone())?;
core_append(&v_pieces, v_title.clone())?;
core_append(&v_pieces, v_description.clone())?;
core_append(&v_pieces, v_selection.clone())?;
core_append(&v_pieces, v_selection.clone())?;
for v_callable in core_iter(&v_callables)? {
let mut v_callable = v_callable;
v_name =
core_get(&v_callable, &CoreValue::from("name"), CoreValue::from(""));
v_qualified = core_get(
&v_callable,
&CoreValue::from("qualified_name"),
CoreValue::from(""),
);
v_cdesc = core_get(
&v_callable,
&CoreValue::from("description"),
CoreValue::from(""),
);
core_append(&v_pieces, v_name.clone())?;
core_append(&v_pieces, v_qualified.clone())?;
core_append(&v_pieces, v_cdesc.clone())?;
v_params =
core_get(&v_callable, &CoreValue::from("parameters"), CoreValue::Null);
v_properties =
core_get(&v_params, &CoreValue::from("properties"), CoreValue::Null);
v_props_is_object = core_type_is(&v_properties, CoreValue::from("object"));
if core_truthy(&v_props_is_object) {
v_prop_keys = core_map_keys(&[v_properties.clone()])?;
v_prop_text = core_string_join_intrinsic(&[
CoreValue::from(" "),
v_prop_keys.clone(),
])?;
core_append(&v_pieces, v_prop_text.clone())?;
}
}
v_text = core_string_join_intrinsic(&[CoreValue::from(" "), v_pieces.clone()])?;
v_score = _agent_relevance_score(&[v_tokens.clone(), v_text.clone()])?;
v_passes = core_gte(&[v_score.clone(), v_threshold.clone()])?;
if core_truthy(&v_passes) {
v_entry = CoreValue::new_map();
core_set(&v_entry, CoreValue::from("namespace"), v_namespace.clone())?;
core_set(&v_entry, CoreValue::from("score"), v_score.clone())?;
core_append(&v_out, v_entry.clone())?;
}
}
}
}
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_rank_relevance_skills(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_rank_relevance_skills");
let mut v_state = core_arg(args, 0);
let mut v_task = core_arg(args, 1);
let mut v_already = CoreValue::Null;
let mut v_catalog = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_description = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_fresh = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_no_tokens = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_out_count = CoreValue::Null;
let mut v_passes = CoreValue::Null;
let mut v_score = CoreValue::Null;
let mut v_skill = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_text_parts = CoreValue::Null;
let mut v_threshold = CoreValue::Null;
let mut v_thresholds = CoreValue::Null;
let mut v_token_count = CoreValue::Null;
let mut v_tokens = CoreValue::Null;
let mut v_under = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_tokens = _agent_relevance_tokens(&[v_task.clone()])?;
v_token_count = core_len(&[v_tokens.clone()])?;
v_no_tokens = core_eq(&[v_token_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_no_tokens) {
return Ok(v_empty_list.clone());
}
v_catalog = core_get(
&v_state,
&CoreValue::from("skills_catalog"),
v_empty_list.clone(),
);
v_out = CoreValue::new_list();
v_thresholds = CoreValue::new_list();
core_append(&v_thresholds, CoreValue::Num(3f64))?;
core_append(&v_thresholds, CoreValue::Num(2f64))?;
core_append(&v_thresholds, CoreValue::Num(1f64))?;
for v_threshold in core_iter(&v_thresholds)? {
let mut v_threshold = v_threshold;
for v_skill in core_iter(&v_catalog)? {
let mut v_skill = v_skill;
v_out_count = core_len(&[v_out.clone()])?;
v_under = core_lt(&[v_out_count.clone(), CoreValue::Num(3f64)])?;
if core_truthy(&v_under) {
v_id = core_get(&v_skill, &CoreValue::from("id"), CoreValue::from(""));
v_already =
_agent_relevance_has_id(&[v_out.clone(), CoreValue::from("id"), v_id.clone()])?;
v_fresh = core_not(&[v_already.clone()])?;
if core_truthy(&v_fresh) {
v_name = core_get(&v_skill, &CoreValue::from("name"), v_id.clone());
v_description = core_get(
&v_skill,
&CoreValue::from("description"),
CoreValue::from(""),
);
v_content =
core_get(&v_skill, &CoreValue::from("content"), CoreValue::from(""));
v_text_parts = CoreValue::new_list();
core_append(&v_text_parts, v_id.clone())?;
core_append(&v_text_parts, v_name.clone())?;
core_append(&v_text_parts, v_description.clone())?;
core_append(&v_text_parts, v_content.clone())?;
v_text =
core_string_join_intrinsic(&[CoreValue::from(" "), v_text_parts.clone()])?;
v_score = _agent_relevance_score(&[v_tokens.clone(), v_text.clone()])?;
v_passes = core_gte(&[v_score.clone(), v_threshold.clone()])?;
if core_truthy(&v_passes) {
v_entry = CoreValue::new_map();
core_set(&v_entry, CoreValue::from("id"), v_id.clone())?;
core_set(&v_entry, CoreValue::from("name"), v_name.clone())?;
core_set(&v_entry, CoreValue::from("score"), v_score.clone())?;
core_append(&v_out, v_entry.clone())?;
}
}
}
}
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_rank_relevance_memories(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_rank_relevance_memories");
let mut v_state = core_arg(args, 0);
let mut v_task = core_arg(args, 1);
let mut v_already_any = CoreValue::Null;
let mut v_already_loaded = CoreValue::Null;
let mut v_already_out = CoreValue::Null;
let mut v_catalog = CoreValue::Null;
let mut v_content = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_fresh = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_loaded = CoreValue::Null;
let mut v_memory = CoreValue::Null;
let mut v_no_tokens = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_out_count = CoreValue::Null;
let mut v_passes = CoreValue::Null;
let mut v_score = CoreValue::Null;
let mut v_snippet = CoreValue::Null;
let mut v_threshold = CoreValue::Null;
let mut v_thresholds = CoreValue::Null;
let mut v_token_count = CoreValue::Null;
let mut v_tokens = CoreValue::Null;
let mut v_under = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_tokens = _agent_relevance_tokens(&[v_task.clone()])?;
v_token_count = core_len(&[v_tokens.clone()])?;
v_no_tokens = core_eq(&[v_token_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_no_tokens) {
return Ok(v_empty_list.clone());
}
v_catalog = core_get(
&v_state,
&CoreValue::from("memories_catalog"),
v_empty_list.clone(),
);
v_loaded = core_get(
&v_state,
&CoreValue::from("loaded_memories"),
v_empty_list.clone(),
);
v_out = CoreValue::new_list();
v_thresholds = CoreValue::new_list();
core_append(&v_thresholds, CoreValue::Num(3f64))?;
core_append(&v_thresholds, CoreValue::Num(2f64))?;
core_append(&v_thresholds, CoreValue::Num(1f64))?;
for v_threshold in core_iter(&v_thresholds)? {
let mut v_threshold = v_threshold;
for v_memory in core_iter(&v_catalog)? {
let mut v_memory = v_memory;
v_out_count = core_len(&[v_out.clone()])?;
v_under = core_lt(&[v_out_count.clone(), CoreValue::Num(3f64)])?;
if core_truthy(&v_under) {
v_id = core_get(&v_memory, &CoreValue::from("id"), CoreValue::from(""));
v_already_out =
_agent_relevance_has_id(&[v_out.clone(), CoreValue::from("id"), v_id.clone()])?;
v_already_loaded = _agent_relevance_has_id(&[
v_loaded.clone(),
CoreValue::from("id"),
v_id.clone(),
])?;
v_already_any = core_or(&[v_already_out.clone(), v_already_loaded.clone()])?;
v_fresh = core_not(&[v_already_any.clone()])?;
if core_truthy(&v_fresh) {
v_content =
core_get(&v_memory, &CoreValue::from("content"), CoreValue::from(""));
v_score = _agent_relevance_score(&[v_tokens.clone(), v_content.clone()])?;
v_passes = core_gte(&[v_score.clone(), v_threshold.clone()])?;
if core_truthy(&v_passes) {
v_snippet = core_string_slice(&[
v_content.clone(),
CoreValue::Num(0f64),
CoreValue::Num(120f64),
])?;
v_entry = CoreValue::new_map();
core_set(&v_entry, CoreValue::from("id"), v_id.clone())?;
core_set(&v_entry, CoreValue::from("snippet"), v_snippet.clone())?;
core_set(&v_entry, CoreValue::from("score"), v_score.clone())?;
core_append(&v_out, v_entry.clone())?;
}
}
}
}
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_render_relevance_hints(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_render_relevance_hints");
let mut v_hints = core_arg(args, 0);
let mut v_body = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_has_memories = CoreValue::Null;
let mut v_has_modules = CoreValue::Null;
let mut v_has_skills = CoreValue::Null;
let mut v_has_snippet = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_id2 = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_line2 = CoreValue::Null;
let mut v_lines = CoreValue::Null;
let mut v_memories = CoreValue::Null;
let mut v_memory = CoreValue::Null;
let mut v_memory_body = CoreValue::Null;
let mut v_memory_count = CoreValue::Null;
let mut v_memory_lines = CoreValue::Null;
let mut v_memory_section = CoreValue::Null;
let mut v_module = CoreValue::Null;
let mut v_module_count = CoreValue::Null;
let mut v_modules = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_namespace = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_section = CoreValue::Null;
let mut v_sections = CoreValue::Null;
let mut v_skill = CoreValue::Null;
let mut v_skill_body = CoreValue::Null;
let mut v_skill_count = CoreValue::Null;
let mut v_skill_lines = CoreValue::Null;
let mut v_skill_section = CoreValue::Null;
let mut v_skills = CoreValue::Null;
let mut v_snippet = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_sections = CoreValue::new_list();
v_modules = core_get(&v_hints, &CoreValue::from("modules"), v_empty_list.clone());
v_module_count = core_len(&[v_modules.clone()])?;
v_has_modules = core_gt(&[v_module_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_modules) {
v_lines = CoreValue::new_list();
for v_module in core_iter(&v_modules)? {
let mut v_module = v_module;
v_namespace = core_get(
&v_module,
&CoreValue::from("namespace"),
CoreValue::from(""),
);
v_line = core_string_format(&[CoreValue::from("- `{}`"), v_namespace.clone()])?;
core_append(&v_lines, v_line.clone())?;
}
v_body = core_string_join_intrinsic(&[CoreValue::from("\n"), v_lines.clone()])?;
v_section = core_string_format(&[CoreValue::from("Modules:\n{}"), v_body.clone()])?;
core_append(&v_sections, v_section.clone())?;
}
v_skills = core_get(&v_hints, &CoreValue::from("skills"), v_empty_list.clone());
v_skill_count = core_len(&[v_skills.clone()])?;
v_has_skills = core_gt(&[v_skill_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_skills) {
v_skill_lines = CoreValue::new_list();
for v_skill in core_iter(&v_skills)? {
let mut v_skill = v_skill;
v_id = core_get(&v_skill, &CoreValue::from("id"), CoreValue::from(""));
v_name = core_get(&v_skill, &CoreValue::from("name"), v_id.clone());
v_line = core_string_format(&[
CoreValue::from("- `{}` — {}"),
v_id.clone(),
v_name.clone(),
])?;
core_append(&v_skill_lines, v_line.clone())?;
}
v_skill_body = core_string_join_intrinsic(&[CoreValue::from("\n"), v_skill_lines.clone()])?;
v_skill_section =
core_string_format(&[CoreValue::from("Skills:\n{}"), v_skill_body.clone()])?;
core_append(&v_sections, v_skill_section.clone())?;
}
v_memories = core_get(&v_hints, &CoreValue::from("memories"), v_empty_list.clone());
v_memory_count = core_len(&[v_memories.clone()])?;
v_has_memories = core_gt(&[v_memory_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_memories) {
v_memory_lines = CoreValue::new_list();
for v_memory in core_iter(&v_memories)? {
let mut v_memory = v_memory;
v_id2 = core_get(&v_memory, &CoreValue::from("id"), CoreValue::from(""));
v_snippet = core_get(&v_memory, &CoreValue::from("snippet"), CoreValue::from(""));
v_line2 = core_string_format(&[CoreValue::from("- `{}`"), v_id2.clone()])?;
v_has_snippet = core_ne(&[v_snippet.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_snippet) {
v_line2 = core_string_format(&[
CoreValue::from("{} — {}"),
v_line2.clone(),
v_snippet.clone(),
])?;
}
core_append(&v_memory_lines, v_line2.clone())?;
}
v_memory_body =
core_string_join_intrinsic(&[CoreValue::from("\n"), v_memory_lines.clone()])?;
v_memory_section =
core_string_format(&[CoreValue::from("Memories:\n{}"), v_memory_body.clone()])?;
core_append(&v_sections, v_memory_section.clone())?;
}
v_out = core_string_join_intrinsic(&[CoreValue::from("\n"), v_sections.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_rank_task_text(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_rank_task_text");
let mut v_values = core_arg(args, 0);
let mut v_executor_request = core_arg(args, 1);
let mut v_is_reserved = CoreValue::Null;
let mut v_is_string = CoreValue::Null;
let mut v_key = CoreValue::Null;
let mut v_not_reserved = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_reserved = CoreValue::Null;
let mut v_value = CoreValue::Null;
v_reserved = _agent_reserved_auto_promotion_fields(&[])?;
v_parts = CoreValue::new_list();
for v_key in core_iter(&v_values)? {
let mut v_key = v_key;
v_is_reserved = core_contains(&[v_reserved.clone(), v_key.clone()])?;
v_not_reserved = core_not(&[v_is_reserved.clone()])?;
if core_truthy(&v_not_reserved) {
v_value = core_get(&v_values, &v_key.clone(), CoreValue::Null);
v_is_string = core_type_is(&v_value, CoreValue::from("string"));
if core_truthy(&v_is_string) {
core_append(&v_parts, v_value.clone())?;
}
}
}
core_append(&v_parts, v_executor_request.clone())?;
v_out = core_string_join_intrinsic(&[CoreValue::from(" "), v_parts.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_build_relevance_hints(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_build_relevance_hints");
let mut v_state = core_arg(args, 0);
let mut v_values = core_arg(args, 1);
let mut v_executor_request = core_arg(args, 2);
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_enabled = CoreValue::Null;
let mut v_flags = CoreValue::Null;
let mut v_memories = CoreValue::Null;
let mut v_memories_enabled = CoreValue::Null;
let mut v_module_enabled = CoreValue::Null;
let mut v_modules = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_skills = CoreValue::Null;
let mut v_skills_enabled = CoreValue::Null;
let mut v_task = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_empty_map = CoreValue::new_map();
v_flags = core_get(
&v_state,
&CoreValue::from("policy_flags"),
v_empty_map.clone(),
);
v_enabled = core_get(
&v_flags,
&CoreValue::from("relevanceHintsEnabled"),
CoreValue::Bool(false),
);
if core_truthy(&v_enabled) {
} else {
return Ok(v_empty_map.clone());
}
v_task = _agent_rank_task_text(&[v_values.clone(), v_executor_request.clone()])?;
v_out = CoreValue::new_map();
v_module_enabled = core_get(
&v_flags,
&CoreValue::from("moduleHintEnabled"),
CoreValue::Bool(false),
);
if core_truthy(&v_module_enabled) {
v_modules = _agent_rank_relevance_modules(&[v_state.clone(), v_task.clone()])?;
core_set(&v_out, CoreValue::from("modules"), v_modules.clone())?;
} else {
core_set(&v_out, CoreValue::from("modules"), v_empty_list.clone())?;
}
v_skills_enabled = core_get(
&v_flags,
&CoreValue::from("skillsHintEnabled"),
CoreValue::Bool(false),
);
if core_truthy(&v_skills_enabled) {
v_skills = _agent_rank_relevance_skills(&[v_state.clone(), v_task.clone()])?;
core_set(&v_out, CoreValue::from("skills"), v_skills.clone())?;
} else {
core_set(&v_out, CoreValue::from("skills"), v_empty_list.clone())?;
}
v_memories_enabled = core_get(
&v_flags,
&CoreValue::from("memoriesHintEnabled"),
CoreValue::Bool(false),
);
if core_truthy(&v_memories_enabled) {
v_memories = _agent_rank_relevance_memories(&[v_state.clone(), v_task.clone()])?;
core_set(&v_out, CoreValue::from("memories"), v_memories.clone())?;
} else {
core_set(&v_out, CoreValue::from("memories"), v_empty_list.clone())?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_runtime_test(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_runtime_test");
let mut v_state = core_arg(args, 0);
let mut v_runtime = core_arg(args, 1);
let mut v_code = core_arg(args, 2);
let mut v_values = core_arg(args, 3);
let mut v_options = core_arg(args, 4);
let mut v_active_session = CoreValue::Null;
let mut v_error_session = CoreValue::Null;
let mut v_globals = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_runtime_options = CoreValue::Null;
let mut v_runtime_test_error = CoreValue::Null;
let mut v_session = CoreValue::Null;
v_globals = _agent_runtime_build_globals(&[v_state.clone(), v_values.clone()])?;
v_runtime_options = _agent_runtime_execution_options(&[v_state.clone(), v_options.clone()])?;
v_session = _agent_runtime_create_session(&[
v_state.clone(),
v_runtime.clone(),
v_globals.clone(),
v_runtime_options.clone(),
])?;
v_result = CoreValue::new_map();
let __core_try: Result<CoreFlow, AxError> = (|| {
v_result = _agent_runtime_execute_step(&[
v_state.clone(),
v_runtime.clone(),
v_session.clone(),
v_code.clone(),
v_runtime_options.clone(),
])?;
Ok(CoreFlow::Normal)
})();
match __core_try {
Ok(CoreFlow::Normal) => {}
Ok(CoreFlow::Return(value)) => return Ok(value),
Ok(CoreFlow::Break) => unreachable!("break outside loop"),
Ok(CoreFlow::Continue) => unreachable!("continue outside loop"),
Err(__core_caught) => {
v_runtime_test_error = CoreValue::Error(std::rc::Rc::new(__core_caught));
v_error_session = core_get(
&v_state,
&CoreValue::from("runtime_session"),
v_session.clone(),
);
_agent_runtime_close_session(&[v_state.clone(), v_error_session.clone()])?;
return Err(core_as_error(&v_runtime_test_error));
}
}
v_active_session = core_get(
&v_state,
&CoreValue::from("runtime_session"),
v_session.clone(),
);
_agent_runtime_close_session(&[v_state.clone(), v_active_session.clone()])?;
return Ok(v_result.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _split_context_values(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_split_context_values");
let mut v_state = core_arg(args, 0);
let mut v_values = core_arg(args, 1);
let mut v_auto_context = CoreValue::Null;
let mut v_auto_enabled = CoreValue::Null;
let mut v_auto_upgrade = CoreValue::Null;
let mut v_can_auto = CoreValue::Null;
let mut v_context_fields = CoreValue::Null;
let mut v_ctx_values = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_event = CoreValue::Null;
let mut v_events = CoreValue::Null;
let mut v_is_context = CoreValue::Null;
let mut v_is_reserved = CoreValue::Null;
let mut v_is_string = CoreValue::Null;
let mut v_key = CoreValue::Null;
let mut v_non_ctx_values = CoreValue::Null;
let mut v_not_promoted = CoreValue::Null;
let mut v_not_reserved = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_preview = CoreValue::Null;
let mut v_preview_chars = CoreValue::Null;
let mut v_preview_source = CoreValue::Null;
let mut v_preview_value = CoreValue::Null;
let mut v_promote_above = CoreValue::Null;
let mut v_promoted = CoreValue::Null;
let mut v_reserved = CoreValue::Null;
let mut v_too_large = CoreValue::Null;
let mut v_value = CoreValue::Null;
let mut v_value_len = CoreValue::Null;
let mut v_value_text = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_context_fields = core_get(
&v_state,
&CoreValue::from("context_fields"),
v_empty_list.clone(),
);
v_auto_upgrade = core_get(&v_state, &CoreValue::from("auto_upgrade"), CoreValue::Null);
v_auto_context = core_get(
&v_auto_upgrade,
&CoreValue::from("contextFields"),
CoreValue::Null,
);
v_auto_enabled = core_get(
&v_auto_context,
&CoreValue::from("enabled"),
CoreValue::Bool(false),
);
v_promote_above = core_get(
&v_auto_context,
&CoreValue::from("promoteAboveChars"),
CoreValue::Num(8000f64),
);
v_preview_chars = core_get(
&v_auto_context,
&CoreValue::from("previewChars"),
CoreValue::Num(1200f64),
);
v_reserved = _agent_reserved_auto_promotion_fields(&[])?;
v_ctx_values = CoreValue::new_map();
v_non_ctx_values = CoreValue::new_map();
for v_key in core_iter(&v_values)? {
let mut v_key = v_key;
v_value = core_get(&v_values, &v_key.clone(), CoreValue::Null);
v_is_context = core_contains(&[v_context_fields.clone(), v_key.clone()])?;
if core_truthy(&v_is_context) {
core_set(&v_ctx_values, v_key.clone(), v_value.clone())?;
} else {
v_promoted = CoreValue::Bool(false);
v_is_reserved = core_contains(&[v_reserved.clone(), v_key.clone()])?;
v_not_reserved = core_not(&[v_is_reserved.clone()])?;
v_can_auto = core_and(&[v_auto_enabled.clone(), v_not_reserved.clone()])?;
if core_truthy(&v_can_auto) {
v_value_text = core_json_stringify(&[v_value.clone()])?;
v_value_len = core_len(&[v_value_text.clone()])?;
v_too_large = core_gt(&[v_value_len.clone(), v_promote_above.clone()])?;
if core_truthy(&v_too_large) {
v_promoted = CoreValue::Bool(true);
core_set(&v_ctx_values, v_key.clone(), v_value.clone())?;
v_is_string = core_type_is(&v_value, CoreValue::from("string"));
v_preview_source = v_value_text.clone();
if core_truthy(&v_is_string) {
v_preview_source = v_value.clone();
}
v_preview = core_string_slice(&[
v_preview_source.clone(),
CoreValue::Num(0f64),
v_preview_chars.clone(),
])?;
v_preview_value = core_string_format(&[
CoreValue::from(
"[runtime-only context: {} chars available as inputs.{}; preview]\n{}",
),
v_value_len.clone(),
v_key.clone(),
v_preview.clone(),
])?;
core_set(&v_non_ctx_values, v_key.clone(), v_preview_value.clone())?;
v_event = CoreValue::new_map();
core_set(
&v_event,
CoreValue::from("kind"),
CoreValue::from("field_auto_promoted"),
)?;
core_set(&v_event, CoreValue::from("fieldName"), v_key.clone())?;
core_set(
&v_event,
CoreValue::from("originalChars"),
v_value_len.clone(),
)?;
core_set(
&v_event,
CoreValue::from("promptPreviewChars"),
v_preview_chars.clone(),
)?;
v_events = core_get(
&v_state,
&CoreValue::from("context_events"),
v_empty_list.clone(),
);
core_append(&v_events, v_event.clone())?;
core_set(
&v_state,
CoreValue::from("context_events"),
v_events.clone(),
)?;
}
}
v_not_promoted = core_not(&[v_promoted.clone()])?;
if core_truthy(&v_not_promoted) {
core_set(&v_non_ctx_values, v_key.clone(), v_value.clone())?;
}
}
}
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("context"), v_ctx_values.clone())?;
core_set(&v_out, CoreValue::from("values"), v_non_ctx_values.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_render_context_metadata(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_render_context_metadata");
let mut v_context = core_arg(args, 0);
let mut v_ck = CoreValue::Null;
let mut v_cv = CoreValue::Null;
let mut v_cv_len = CoreValue::Null;
let mut v_cv_str = CoreValue::Null;
let mut v_cv_type = CoreValue::Null;
let mut v_first = CoreValue::Null;
let mut v_has_item_keys = CoreValue::Null;
let mut v_has_keys = CoreValue::Null;
let mut v_is_list = CoreValue::Null;
let mut v_item_key_count = CoreValue::Null;
let mut v_item_keys = CoreValue::Null;
let mut v_item_keys_text = CoreValue::Null;
let mut v_key_count = CoreValue::Null;
let mut v_keys = CoreValue::Null;
let mut v_keys_text = CoreValue::Null;
let mut v_length = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_lines = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_runtime_ref = CoreValue::Null;
v_lines = CoreValue::new_list();
for v_ck in core_iter(&v_context)? {
let mut v_ck = v_ck;
v_cv = core_get(&v_context, &v_ck.clone(), CoreValue::Null);
v_cv_str = core_json_stringify(&[v_cv.clone()])?;
v_cv_len = core_len(&[v_cv_str.clone()])?;
v_cv_type = _agent_value_kind(&[v_cv.clone()])?;
v_runtime_ref = core_string_format(&[
CoreValue::from("inputs.{} ({} chars)"),
v_ck.clone(),
v_cv_len.clone(),
])?;
v_line = core_string_format(&[CoreValue::from("- {}: {} loaded in the runtime as {} — read and narrow it with code; never retype its contents"), v_ck.clone(), v_cv_type.clone(), v_runtime_ref.clone()])?;
v_keys = _agent_object_keys_sample(&[v_cv.clone(), CoreValue::Num(12f64)])?;
v_key_count = core_len(&[v_keys.clone()])?;
v_has_keys = core_gt(&[v_key_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_keys) {
v_keys_text = core_string_join_intrinsic(&[CoreValue::from(", "), v_keys.clone()])?;
v_line = core_string_format(&[
CoreValue::from("{}; keys: {}"),
v_line.clone(),
v_keys_text.clone(),
])?;
}
v_is_list = core_type_is(&v_cv, CoreValue::from("list"));
if core_truthy(&v_is_list) {
v_length = core_len(&[v_cv.clone()])?;
v_line = core_string_format(&[
CoreValue::from("{}; length {}"),
v_line.clone(),
v_length.clone(),
])?;
v_first = core_list_get(&[v_cv.clone(), CoreValue::Num(0f64), CoreValue::Null])?;
v_item_keys = _agent_object_keys_sample(&[v_first.clone(), CoreValue::Num(12f64)])?;
v_item_key_count = core_len(&[v_item_keys.clone()])?;
v_has_item_keys = core_gt(&[v_item_key_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_item_keys) {
v_item_keys_text =
core_string_join_intrinsic(&[CoreValue::from(", "), v_item_keys.clone()])?;
v_line = core_string_format(&[
CoreValue::from("{}; item keys: {}"),
v_line.clone(),
v_item_keys_text.clone(),
])?;
}
}
core_append(&v_lines, v_line.clone())?;
}
v_out = core_string_join_intrinsic(&[CoreValue::from("\n"), v_lines.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _build_distiller_inputs(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_build_distiller_inputs");
let mut v_state = core_arg(args, 0);
let mut v_values = core_arg(args, 1);
let mut v_action_text = CoreValue::Null;
let mut v_actor_context = CoreValue::Null;
let mut v_ck = CoreValue::Null;
let mut v_cm_has = CoreValue::Null;
let mut v_cm_state = CoreValue::Null;
let mut v_cm_text = CoreValue::Null;
let mut v_context = CoreValue::Null;
let mut v_ctx_out = CoreValue::Null;
let mut v_cv = CoreValue::Null;
let mut v_cv_len = CoreValue::Null;
let mut v_cv_str = CoreValue::Null;
let mut v_discovered_docs = CoreValue::Null;
let mut v_discovered_text = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_guidance_text = CoreValue::Null;
let mut v_loaded_memories = CoreValue::Null;
let mut v_loaded_skills = CoreValue::Null;
let mut v_meta_note = CoreValue::Null;
let mut v_non_ctx = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_pressure_text = CoreValue::Null;
let mut v_runtime_text = CoreValue::Null;
let mut v_skills_text = CoreValue::Null;
let mut v_split = CoreValue::Null;
let mut v_summary_text = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_empty_map = CoreValue::new_map();
v_split = _split_context_values(&[v_state.clone(), v_values.clone()])?;
v_context = core_get(&v_split, &CoreValue::from("context"), v_empty_map.clone());
v_non_ctx = core_get(&v_split, &CoreValue::from("values"), v_empty_map.clone());
v_cm_state = core_get(&v_state, &CoreValue::from("context_map"), CoreValue::Null);
v_cm_text = core_get(&v_cm_state, &CoreValue::from("text"), CoreValue::from(""));
v_cm_has = core_ne(&[v_cm_text.clone(), CoreValue::from("")])?;
v_ctx_out = CoreValue::new_map();
for v_ck in core_iter(&v_context)? {
let mut v_ck = v_ck;
v_cv = core_get(&v_context, &v_ck.clone(), CoreValue::Null);
v_cv_str = core_string_format(&[CoreValue::from("{}"), v_cv.clone()])?;
v_cv_len = core_len(&[v_cv_str.clone()])?;
v_meta_note = core_string_format(&[CoreValue::from("loaded in the runtime as inputs.{} ({} chars) — read and narrow it with code; never retype its contents"), v_ck.clone(), v_cv_len.clone()])?;
core_set(&v_ctx_out, v_ck.clone(), v_meta_note.clone())?;
}
if core_truthy(&v_cm_has) {
core_set(&v_ctx_out, CoreValue::from("contextMap"), v_cm_text.clone())?;
}
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("input"), v_non_ctx.clone())?;
core_set(&v_out, CoreValue::from("context"), v_ctx_out.clone())?;
v_actor_context = _agent_prepare_actor_context(&[v_state.clone()])?;
v_guidance_text = core_get(
&v_actor_context,
&CoreValue::from("guidanceLog"),
CoreValue::from("[]"),
);
v_action_text = core_get(
&v_actor_context,
&CoreValue::from("actionLog"),
CoreValue::from("(no actions yet)"),
);
v_summary_text = core_get(
&v_actor_context,
&CoreValue::from("summarizedActorLog"),
CoreValue::from(""),
);
v_runtime_text = core_get(
&v_actor_context,
&CoreValue::from("liveRuntimeState"),
CoreValue::from(""),
);
v_pressure_text = core_get(
&v_actor_context,
&CoreValue::from("contextPressure"),
CoreValue::from(""),
);
v_discovered_docs = core_get(
&v_state,
&CoreValue::from("discovered_tool_docs"),
v_empty_list.clone(),
);
v_loaded_skills = core_get(
&v_state,
&CoreValue::from("loaded_skill_docs"),
v_empty_list.clone(),
);
v_loaded_memories = core_get(
&v_state,
&CoreValue::from("loaded_memories"),
v_empty_list.clone(),
);
v_discovered_text = _agent_render_discovered_tool_docs(&[v_discovered_docs.clone()])?;
v_skills_text = _agent_render_loaded_skills(&[v_loaded_skills.clone()])?;
core_set(
&v_out,
CoreValue::from("discoveredToolDocs"),
v_discovered_text.clone(),
)?;
core_set(
&v_out,
CoreValue::from("loadedSkills"),
v_skills_text.clone(),
)?;
core_set(
&v_out,
CoreValue::from("memories"),
v_loaded_memories.clone(),
)?;
core_set(
&v_out,
CoreValue::from("summarizedActorLog"),
v_summary_text.clone(),
)?;
core_set(
&v_out,
CoreValue::from("guidanceLog"),
v_guidance_text.clone(),
)?;
core_set(&v_out, CoreValue::from("actionLog"), v_action_text.clone())?;
core_set(
&v_out,
CoreValue::from("liveRuntimeState"),
v_runtime_text.clone(),
)?;
core_set(
&v_out,
CoreValue::from("contextPressure"),
v_pressure_text.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _build_executor_inputs(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_build_executor_inputs");
let mut v_state = core_arg(args, 0);
let mut v_values = core_arg(args, 1);
let mut v_distiller_payload = core_arg(args, 2);
let mut v_action_text = CoreValue::Null;
let mut v_actor_context = CoreValue::Null;
let mut v_args = CoreValue::Null;
let mut v_context = CoreValue::Null;
let mut v_context_metadata = CoreValue::Null;
let mut v_discovered_docs = CoreValue::Null;
let mut v_discovered_text = CoreValue::Null;
let mut v_distilled_context = CoreValue::Null;
let mut v_distilled_context_summary = CoreValue::Null;
let mut v_empty = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_exclude = CoreValue::Null;
let mut v_executor_request = CoreValue::Null;
let mut v_executor_request_coerced = CoreValue::Null;
let mut v_executor_request_raw = CoreValue::Null;
let mut v_fallback_request = CoreValue::Null;
let mut v_guidance_text = CoreValue::Null;
let mut v_has_context_metadata = CoreValue::Null;
let mut v_has_hints = CoreValue::Null;
let mut v_hints = CoreValue::Null;
let mut v_hints_text = CoreValue::Null;
let mut v_key = CoreValue::Null;
let mut v_loaded_memories = CoreValue::Null;
let mut v_loaded_skills = CoreValue::Null;
let mut v_non_ctx = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_pressure_text = CoreValue::Null;
let mut v_request_is_string = CoreValue::Null;
let mut v_runtime_text = CoreValue::Null;
let mut v_skills_text = CoreValue::Null;
let mut v_split = CoreValue::Null;
let mut v_state_runtime_disabled = CoreValue::Null;
let mut v_state_runtime_enabled = CoreValue::Null;
let mut v_summary_text = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_empty_map = CoreValue::new_map();
v_split = _split_context_values(&[v_state.clone(), v_values.clone()])?;
v_context = core_get(&v_split, &CoreValue::from("context"), v_empty_map.clone());
v_non_ctx = core_get(&v_split, &CoreValue::from("values"), v_empty_map.clone());
v_empty = CoreValue::new_map();
v_out = core_map_merge(&[v_non_ctx.clone(), v_empty.clone()])?;
v_args = core_get(
&v_distiller_payload,
&CoreValue::from("args"),
v_empty_list.clone(),
);
v_fallback_request = core_json_stringify(&[v_non_ctx.clone()])?;
v_executor_request_raw = core_list_get(&[
v_args.clone(),
CoreValue::Num(0f64),
v_fallback_request.clone(),
])?;
v_request_is_string = core_type_is(&v_executor_request_raw, CoreValue::from("string"));
v_executor_request = v_executor_request_raw.clone();
if core_truthy(&v_request_is_string) {
} else {
v_executor_request_coerced =
core_string_format(&[CoreValue::from("{}"), v_executor_request_raw.clone()])?;
v_executor_request = v_executor_request_coerced.clone();
}
v_distilled_context =
core_list_get(&[v_args.clone(), CoreValue::Num(1f64), v_empty_map.clone()])?;
v_distilled_context_summary =
_agent_render_evidence_descriptor(&[v_distilled_context.clone()])?;
core_set(&v_out, CoreValue::from("input"), v_non_ctx.clone())?;
core_set(
&v_out,
CoreValue::from("executorRequest"),
v_executor_request.clone(),
)?;
core_set(
&v_out,
CoreValue::from("distilledContextSummary"),
v_distilled_context_summary.clone(),
)?;
v_state_runtime_enabled = core_get(
&v_state,
&CoreValue::from("runtime_enabled"),
CoreValue::Bool(false),
);
v_state_runtime_disabled = core_not(&[v_state_runtime_enabled.clone()])?;
if core_truthy(&v_state_runtime_disabled) {
core_set(
&v_out,
CoreValue::from("distilledContext"),
v_distilled_context.clone(),
)?;
}
v_context_metadata = _agent_render_context_metadata(&[v_context.clone()])?;
v_has_context_metadata = core_ne(&[v_context_metadata.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_context_metadata) {
core_set(
&v_out,
CoreValue::from("contextMetadata"),
v_context_metadata.clone(),
)?;
}
v_hints = _agent_build_relevance_hints(&[
v_state.clone(),
v_non_ctx.clone(),
v_executor_request.clone(),
])?;
v_hints_text = _agent_render_relevance_hints(&[v_hints.clone()])?;
v_has_hints = core_ne(&[v_hints_text.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_hints) {
core_set(
&v_out,
CoreValue::from("relevanceHints"),
v_hints_text.clone(),
)?;
}
v_discovered_docs = core_get(
&v_state,
&CoreValue::from("discovered_tool_docs"),
v_empty_list.clone(),
);
v_loaded_skills = core_get(
&v_state,
&CoreValue::from("loaded_skill_docs"),
v_empty_list.clone(),
);
v_loaded_memories = core_get(
&v_state,
&CoreValue::from("loaded_memories"),
v_empty_list.clone(),
);
v_discovered_text = _agent_render_discovered_tool_docs(&[v_discovered_docs.clone()])?;
v_skills_text = _agent_render_loaded_skills(&[v_loaded_skills.clone()])?;
v_actor_context = _agent_prepare_actor_context(&[v_state.clone()])?;
v_guidance_text = core_get(
&v_actor_context,
&CoreValue::from("guidanceLog"),
CoreValue::from("[]"),
);
v_action_text = core_get(
&v_actor_context,
&CoreValue::from("actionLog"),
CoreValue::from("(no actions yet)"),
);
v_summary_text = core_get(
&v_actor_context,
&CoreValue::from("summarizedActorLog"),
CoreValue::from(""),
);
v_runtime_text = core_get(
&v_actor_context,
&CoreValue::from("liveRuntimeState"),
CoreValue::from(""),
);
v_pressure_text = core_get(
&v_actor_context,
&CoreValue::from("contextPressure"),
CoreValue::from(""),
);
core_set(
&v_out,
CoreValue::from("discoveredToolDocs"),
v_discovered_text.clone(),
)?;
core_set(
&v_out,
CoreValue::from("loadedSkills"),
v_skills_text.clone(),
)?;
core_set(
&v_out,
CoreValue::from("memories"),
v_loaded_memories.clone(),
)?;
core_set(
&v_out,
CoreValue::from("summarizedActorLog"),
v_summary_text.clone(),
)?;
core_set(
&v_out,
CoreValue::from("guidanceLog"),
v_guidance_text.clone(),
)?;
core_set(&v_out, CoreValue::from("actionLog"), v_action_text.clone())?;
core_set(
&v_out,
CoreValue::from("liveRuntimeState"),
v_runtime_text.clone(),
)?;
core_set(
&v_out,
CoreValue::from("contextPressure"),
v_pressure_text.clone(),
)?;
v_exclude = core_get(
&v_state,
&CoreValue::from("executor_exclude_fields"),
v_empty_list.clone(),
);
for v_key in core_iter(&v_exclude)? {
let mut v_key = v_key;
core_map_delete(&[v_out.clone(), v_key.clone()])?;
core_map_delete(&[v_non_ctx.clone(), v_key.clone()])?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _build_responder_inputs(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_build_responder_inputs");
let mut v_state = core_arg(args, 0);
let mut v_values = core_arg(args, 1);
let mut v_executor_payload = core_arg(args, 2);
let mut v_args = CoreValue::Null;
let mut v_context = CoreValue::Null;
let mut v_context_data = CoreValue::Null;
let mut v_empty = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_exclude = CoreValue::Null;
let mut v_key = CoreValue::Null;
let mut v_non_ctx = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_split = CoreValue::Null;
let mut v_task = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_empty_map = CoreValue::new_map();
v_split = _split_context_values(&[v_state.clone(), v_values.clone()])?;
v_non_ctx = core_get(&v_split, &CoreValue::from("values"), v_empty_map.clone());
v_empty = CoreValue::new_map();
v_out = core_map_merge(&[v_values.clone(), v_empty.clone()])?;
v_args = core_get(
&v_executor_payload,
&CoreValue::from("args"),
v_empty_list.clone(),
);
v_task = core_list_get(&[v_args.clone(), CoreValue::Num(0f64), CoreValue::from("")])?;
v_context = core_list_get(&[v_args.clone(), CoreValue::Num(1f64), v_empty_map.clone()])?;
v_context_data = CoreValue::new_map();
core_set(&v_context_data, CoreValue::from("task"), v_task.clone())?;
core_set(
&v_context_data,
CoreValue::from("evidence"),
v_context.clone(),
)?;
core_set(
&v_out,
CoreValue::from("contextData"),
v_context_data.clone(),
)?;
core_set(&v_out, CoreValue::from("agentTask"), v_task.clone())?;
core_set(&v_out, CoreValue::from("agentContext"), v_context.clone())?;
core_set(
&v_out,
CoreValue::from("executorResult"),
v_executor_payload.clone(),
)?;
v_exclude = core_get(
&v_state,
&CoreValue::from("responder_exclude_fields"),
v_empty_list.clone(),
);
for v_key in core_iter(&v_exclude)? {
let mut v_key = v_key;
core_map_delete(&[v_out.clone(), v_key.clone()])?;
core_map_delete(&[v_non_ctx.clone(), v_key.clone()])?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_render_field_token(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_render_field_token");
let mut v_field = core_arg(args, 0);
let mut v_desc_none = CoreValue::Null;
let mut v_description = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_ftype = CoreValue::Null;
let mut v_has_desc = CoreValue::Null;
let mut v_has_opts = CoreValue::Null;
let mut v_has_type = CoreValue::Null;
let mut v_is_array = CoreValue::Null;
let mut v_is_class = CoreValue::Null;
let mut v_is_class_desc = CoreValue::Null;
let mut v_is_internal = CoreValue::Null;
let mut v_is_optional = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_not_class = CoreValue::Null;
let mut v_opt_count = CoreValue::Null;
let mut v_options = CoreValue::Null;
let mut v_opts_joined = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_render_desc = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_tname = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_name = core_get(&v_field, &CoreValue::from("name"), CoreValue::from(""));
v_parts = CoreValue::new_list();
core_append(&v_parts, v_name.clone())?;
v_is_optional = core_get(
&v_field,
&CoreValue::from("is_optional"),
CoreValue::Bool(false),
);
if core_truthy(&v_is_optional) {
core_append(&v_parts, CoreValue::from("?"))?;
}
v_is_internal = core_get(
&v_field,
&CoreValue::from("is_internal"),
CoreValue::Bool(false),
);
if core_truthy(&v_is_internal) {
core_append(&v_parts, CoreValue::from("!"))?;
}
v_ftype = core_get(&v_field, &CoreValue::from("type"), CoreValue::Null);
v_tname = CoreValue::from("");
v_has_type = core_is_not_none(&[v_ftype.clone()])?;
if core_truthy(&v_has_type) {
v_tname = core_get(&v_ftype, &CoreValue::from("name"), CoreValue::from(""));
core_append(&v_parts, CoreValue::from(":"))?;
core_append(&v_parts, v_tname.clone())?;
v_is_array = core_get(
&v_ftype,
&CoreValue::from("is_array"),
CoreValue::Bool(false),
);
if core_truthy(&v_is_array) {
core_append(&v_parts, CoreValue::from("[]"))?;
}
v_is_class = core_eq(&[v_tname.clone(), CoreValue::from("class")])?;
if core_truthy(&v_is_class) {
v_options = core_get(&v_ftype, &CoreValue::from("options"), v_empty_list.clone());
v_opt_count = core_len(&[v_options.clone()])?;
v_has_opts = core_ne(&[v_opt_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_opts) {
v_opts_joined =
core_string_join_intrinsic(&[CoreValue::from(" | "), v_options.clone()])?;
core_append(&v_parts, CoreValue::from(" \""))?;
core_append(&v_parts, v_opts_joined.clone())?;
core_append(&v_parts, CoreValue::from("\""))?;
}
}
}
v_description = core_get(
&v_field,
&CoreValue::from("description"),
CoreValue::from(""),
);
v_desc_none = core_is_none(&[v_description.clone()])?;
if core_truthy(&v_desc_none) {
v_description = CoreValue::from("");
}
v_has_desc = core_ne(&[v_description.clone(), CoreValue::from("")])?;
v_is_class_desc = core_eq(&[v_tname.clone(), CoreValue::from("class")])?;
v_not_class = core_not(&[v_is_class_desc.clone()])?;
v_render_desc = core_and(&[v_has_desc.clone(), v_not_class.clone()])?;
if core_truthy(&v_render_desc) {
core_append(&v_parts, CoreValue::from(" \""))?;
core_append(&v_parts, v_description.clone())?;
core_append(&v_parts, CoreValue::from("\""))?;
}
v_result = core_string_join_intrinsic(&[CoreValue::from(""), v_parts.clone()])?;
return Ok(v_result.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _build_responder_signature(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_build_responder_signature");
let mut v_sig = core_arg(args, 0);
let mut v_context_fields = core_arg(args, 1);
let mut v_body_parts = CoreValue::Null;
let mut v_ctx_field = CoreValue::Null;
let mut v_ctx_tok = CoreValue::Null;
let mut v_ctx_type = CoreValue::Null;
let mut v_desc_none = CoreValue::Null;
let mut v_description = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_field = CoreValue::Null;
let mut v_fname = CoreValue::Null;
let mut v_has_desc = CoreValue::Null;
let mut v_input_fields = CoreValue::Null;
let mut v_input_tokens = CoreValue::Null;
let mut v_inputs_joined = CoreValue::Null;
let mut v_is_context = CoreValue::Null;
let mut v_not_context = CoreValue::Null;
let mut v_ofield = CoreValue::Null;
let mut v_otok = CoreValue::Null;
let mut v_output_fields = CoreValue::Null;
let mut v_output_tokens = CoreValue::Null;
let mut v_outputs_joined = CoreValue::Null;
let mut v_sig_string = CoreValue::Null;
let mut v_tok = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_input_fields = core_get(
&v_sig,
&CoreValue::from("input_fields"),
v_empty_list.clone(),
);
v_output_fields = core_get(
&v_sig,
&CoreValue::from("output_fields"),
v_empty_list.clone(),
);
v_description = core_get(&v_sig, &CoreValue::from("description"), CoreValue::from(""));
v_desc_none = core_is_none(&[v_description.clone()])?;
if core_truthy(&v_desc_none) {
v_description = CoreValue::from("");
}
v_input_tokens = CoreValue::new_list();
for v_field in core_iter(&v_input_fields)? {
let mut v_field = v_field;
v_fname = core_get(&v_field, &CoreValue::from("name"), CoreValue::from(""));
v_is_context = core_contains(&[v_context_fields.clone(), v_fname.clone()])?;
v_not_context = core_not(&[v_is_context.clone()])?;
if core_truthy(&v_not_context) {
v_tok = _agent_render_field_token(&[v_field.clone()])?;
core_append(&v_input_tokens, v_tok.clone())?;
}
}
v_ctx_field = CoreValue::new_map();
core_set(
&v_ctx_field,
CoreValue::from("name"),
CoreValue::from("contextData"),
)?;
v_ctx_type = CoreValue::new_map();
core_set(
&v_ctx_type,
CoreValue::from("name"),
CoreValue::from("json"),
)?;
core_set(&v_ctx_field, CoreValue::from("type"), v_ctx_type.clone())?;
v_ctx_tok = _agent_render_field_token(&[v_ctx_field.clone()])?;
core_append(&v_input_tokens, v_ctx_tok.clone())?;
v_output_tokens = CoreValue::new_list();
for v_ofield in core_iter(&v_output_fields)? {
let mut v_ofield = v_ofield;
v_otok = _agent_render_field_token(&[v_ofield.clone()])?;
core_append(&v_output_tokens, v_otok.clone())?;
}
v_inputs_joined = core_string_join_intrinsic(&[CoreValue::from(", "), v_input_tokens.clone()])?;
v_outputs_joined =
core_string_join_intrinsic(&[CoreValue::from(", "), v_output_tokens.clone()])?;
v_body_parts = CoreValue::new_list();
v_has_desc = core_ne(&[v_description.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_desc) {
core_append(&v_body_parts, CoreValue::from("\""))?;
core_append(&v_body_parts, v_description.clone())?;
core_append(&v_body_parts, CoreValue::from("\" "))?;
}
core_append(&v_body_parts, v_inputs_joined.clone())?;
core_append(&v_body_parts, CoreValue::from(" -> "))?;
core_append(&v_body_parts, v_outputs_joined.clone())?;
v_sig_string = core_string_join_intrinsic(&[CoreValue::from(""), v_body_parts.clone()])?;
return Ok(v_sig_string.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _normalize_agent_completion_payload(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_normalize_agent_completion_payload");
let mut v_output = core_arg(args, 0);
let mut v_completion = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_invalid = CoreValue::Null;
let mut v_is_clarification = CoreValue::Null;
let mut v_is_completion = CoreValue::Null;
let mut v_is_final = CoreValue::Null;
let mut v_is_respond = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_payload = CoreValue::Null;
let mut v_type = CoreValue::Null;
let mut v_valid = CoreValue::Null;
v_completion = core_get(&v_output, &CoreValue::from("completion"), v_output.clone());
v_payload = core_get(
&v_completion,
&CoreValue::from("executorResult"),
v_completion.clone(),
);
v_type = core_get(&v_payload, &CoreValue::from("type"), CoreValue::Null);
v_is_final = core_eq(&[v_type.clone(), CoreValue::from("final")])?;
v_is_respond = core_eq(&[v_type.clone(), CoreValue::from("respond")])?;
v_is_clarification = core_eq(&[v_type.clone(), CoreValue::from("askClarification")])?;
v_is_completion = core_or(&[v_is_final.clone(), v_is_respond.clone()])?;
v_valid = core_or(&[v_is_completion.clone(), v_is_clarification.clone()])?;
v_invalid = core_not(&[v_valid.clone()])?;
if core_truthy(&v_invalid) {
v_message = core_string_format(&[CoreValue::from("agent stage did not return a completion payload (a live model returns prose, but this stage expects a structured completion): pass options.runtime with a code engine so the executor runs model-generated code that calls final(...), or use a client that returns a structured final/askClarification completion. got: {}"), v_payload.clone()])?;
v_error = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
return Ok(v_payload.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _throw_agent_clarification(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_throw_agent_clarification");
let mut v_payload = core_arg(args, 0);
let mut v_state = core_arg(args, 1);
let mut v_error = CoreValue::Null;
let mut v_is_clarification = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_type = CoreValue::Null;
v_type = core_get(&v_payload, &CoreValue::from("type"), CoreValue::Null);
v_is_clarification = core_eq(&[v_type.clone(), CoreValue::from("askClarification")])?;
if core_truthy(&v_is_clarification) {
v_error = core_agent_clarification_error(&[v_payload.clone(), v_state.clone()])?;
return Err(core_as_error(&v_error));
}
v_none = core_none(&[])?;
return Ok(v_none.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _merge_agent_chat_log(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_merge_agent_chat_log");
let mut v_state = core_arg(args, 0);
let mut v_distiller = core_arg(args, 1);
let mut v_executor = core_arg(args, 2);
let mut v_responder = core_arg(args, 3);
let mut v_distiller_logs = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_executor_logs = CoreValue::Null;
let mut v_logs = CoreValue::Null;
let mut v_responder_logs = CoreValue::Null;
v_logs = CoreValue::new_list();
v_distiller_logs = core_agent_stage_chat_log(&[v_distiller.clone()])?;
for v_entry in core_iter(&v_distiller_logs)? {
let mut v_entry = v_entry;
core_set(
&v_entry,
CoreValue::from("name"),
CoreValue::from("distiller"),
)?;
core_set(&v_entry, CoreValue::from("stage"), CoreValue::from("ctx"))?;
core_append(&v_logs, v_entry.clone())?;
}
v_executor_logs = core_agent_stage_chat_log(&[v_executor.clone()])?;
for v_entry in core_iter(&v_executor_logs)? {
let mut v_entry = v_entry;
core_set(
&v_entry,
CoreValue::from("name"),
CoreValue::from("executor"),
)?;
core_set(&v_entry, CoreValue::from("stage"), CoreValue::from("task"))?;
core_append(&v_logs, v_entry.clone())?;
}
v_responder_logs = core_agent_stage_chat_log(&[v_responder.clone()])?;
for v_entry in core_iter(&v_responder_logs)? {
let mut v_entry = v_entry;
core_set(
&v_entry,
CoreValue::from("name"),
CoreValue::from("responder"),
)?;
core_set(&v_entry, CoreValue::from("stage"), CoreValue::from("task"))?;
core_append(&v_logs, v_entry.clone())?;
}
core_set(&v_state, CoreValue::from("chat_log"), v_logs.clone())?;
return Ok(v_logs.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _merge_agent_usage(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_merge_agent_usage");
let mut v_state = core_arg(args, 0);
let mut v_chat_log = CoreValue::Null;
let mut v_count = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_usage = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_chat_log = core_get(&v_state, &CoreValue::from("chat_log"), v_empty_list.clone());
v_count = core_len(&[v_chat_log.clone()])?;
v_usage = CoreValue::new_map();
core_set(
&v_usage,
CoreValue::from("chat_log_entries"),
v_count.clone(),
)?;
core_set(&v_state, CoreValue::from("usage"), v_usage.clone())?;
return Ok(v_usage.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_get_state(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_get_state");
let mut v_state = core_arg(args, 0);
let mut v_empty_map = CoreValue::Null;
let mut v_runtime_state = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_runtime_state = core_get(
&v_state,
&CoreValue::from("runtime_state"),
v_empty_map.clone(),
);
return Ok(v_runtime_state.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_set_state(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_set_state");
let mut v_state = core_arg(args, 0);
let mut v_runtime_state = core_arg(args, 1);
core_set(
&v_state,
CoreValue::from("runtime_state"),
v_runtime_state.clone(),
)?;
return Ok(v_runtime_state.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_stage_options(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_stage_options");
let mut v_state = core_arg(args, 0);
let mut v_stage = core_arg(args, 1);
let mut v_forward_options = core_arg(args, 2);
let mut v_base_options = CoreValue::Null;
let mut v_cache = CoreValue::Null;
let mut v_call_cache = CoreValue::Null;
let mut v_call_cache_snake = CoreValue::Null;
let mut v_context_opts_camel = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_executor_opts_camel = CoreValue::Null;
let mut v_has_cache = CoreValue::Null;
let mut v_has_call_cache = CoreValue::Null;
let mut v_has_stage_cache = CoreValue::Null;
let mut v_is_distiller = CoreValue::Null;
let mut v_is_executor = CoreValue::Null;
let mut v_is_responder = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_responder_opts_camel = CoreValue::Null;
let mut v_stage_cache = CoreValue::Null;
let mut v_stage_cache_snake = CoreValue::Null;
let mut v_stage_options = CoreValue::Null;
let mut v_top_cache = CoreValue::Null;
let mut v_top_cache_snake = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_base_options = core_get(&v_state, &CoreValue::from("options"), v_empty_map.clone());
v_stage_options = CoreValue::new_map();
v_is_distiller = core_eq(&[v_stage.clone(), CoreValue::from("distiller")])?;
v_is_executor = core_eq(&[v_stage.clone(), CoreValue::from("executor")])?;
v_is_responder = core_eq(&[v_stage.clone(), CoreValue::from("responder")])?;
if core_truthy(&v_is_distiller) {
v_context_opts_camel = core_get(
&v_base_options,
&CoreValue::from("contextOptions"),
v_empty_map.clone(),
);
v_stage_options = core_get(
&v_base_options,
&CoreValue::from("context_options"),
v_context_opts_camel.clone(),
);
}
if core_truthy(&v_is_executor) {
v_executor_opts_camel = core_get(
&v_base_options,
&CoreValue::from("executorOptions"),
v_empty_map.clone(),
);
v_stage_options = core_get(
&v_base_options,
&CoreValue::from("executor_options"),
v_executor_opts_camel.clone(),
);
}
if core_truthy(&v_is_responder) {
v_responder_opts_camel = core_get(
&v_base_options,
&CoreValue::from("responderOptions"),
v_empty_map.clone(),
);
v_stage_options = core_get(
&v_base_options,
&CoreValue::from("responder_options"),
v_responder_opts_camel.clone(),
);
}
v_out = core_map_merge(&[v_stage_options.clone(), v_forward_options.clone()])?;
v_top_cache_snake = core_get(
&v_base_options,
&CoreValue::from("context_cache"),
CoreValue::Null,
);
v_top_cache = core_get(
&v_base_options,
&CoreValue::from("contextCache"),
v_top_cache_snake.clone(),
);
v_stage_cache_snake = core_get(
&v_stage_options,
&CoreValue::from("context_cache"),
CoreValue::Null,
);
v_stage_cache = core_get(
&v_stage_options,
&CoreValue::from("contextCache"),
v_stage_cache_snake.clone(),
);
v_call_cache_snake = core_get(
&v_forward_options,
&CoreValue::from("context_cache"),
CoreValue::Null,
);
v_call_cache = core_get(
&v_forward_options,
&CoreValue::from("contextCache"),
v_call_cache_snake.clone(),
);
v_cache = v_top_cache.clone();
v_has_stage_cache = core_is_not_none(&[v_stage_cache.clone()])?;
if core_truthy(&v_has_stage_cache) {
v_cache = v_stage_cache.clone();
}
v_has_call_cache = core_is_not_none(&[v_call_cache.clone()])?;
if core_truthy(&v_has_call_cache) {
v_cache = v_call_cache.clone();
}
v_has_cache = core_is_not_none(&[v_cache.clone()])?;
if core_truthy(&v_has_cache) {
core_set(&v_out, CoreValue::from("context_cache"), v_cache.clone())?;
core_set(&v_out, CoreValue::from("contextCache"), v_cache.clone())?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _extract_agent_runtime_code(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_extract_agent_runtime_code");
let mut v_state = core_arg(args, 0);
let mut v_executor_output = core_arg(args, 1);
let mut v_code = CoreValue::Null;
let mut v_code_field_name = CoreValue::Null;
let mut v_completion = CoreValue::Null;
let mut v_completion_code = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_missing = CoreValue::Null;
let mut v_runtime_contract = CoreValue::Null;
v_runtime_contract = core_get(
&v_state,
&CoreValue::from("runtime_contract"),
CoreValue::Null,
);
v_code_field_name = core_get(
&v_runtime_contract,
&CoreValue::from("code_field_name"),
CoreValue::from("javascriptCode"),
);
v_code = core_get(
&v_executor_output,
&v_code_field_name.clone(),
CoreValue::from(""),
);
v_completion = core_get(
&v_executor_output,
&CoreValue::from("completion"),
v_executor_output.clone(),
);
v_completion_code = core_get(&v_completion, &v_code_field_name.clone(), v_code.clone());
v_code = v_completion_code.clone();
v_missing = core_eq(&[v_code.clone(), CoreValue::from("")])?;
if core_truthy(&v_missing) {
v_message = core_string_format(&[
CoreValue::from("agent executor did not return runtime code field: {}"),
v_code_field_name.clone(),
])?;
v_error = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_error));
}
return Ok(v_code.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_apply_llm_checkpoint_summary(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_apply_llm_checkpoint_summary");
let mut v_state = core_arg(args, 0);
let mut v_client = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_checkpoint = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_has_checkpoint = CoreValue::Null;
let mut v_has_text = CoreValue::Null;
let mut v_instruction = CoreValue::Null;
let mut v_llm_input = CoreValue::Null;
let mut v_messages = CoreValue::Null;
let mut v_pending = CoreValue::Null;
let mut v_request = CoreValue::Null;
let mut v_response = CoreValue::Null;
let mut v_sys = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_updated = CoreValue::Null;
let mut v_usr = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_checkpoint = core_get(
&v_state,
&CoreValue::from("checkpoint_state"),
CoreValue::Null,
);
v_has_checkpoint = core_is_not_none(&[v_checkpoint.clone()])?;
if core_truthy(&v_has_checkpoint) {
v_pending = core_get(
&v_checkpoint,
&CoreValue::from("llm_pending"),
CoreValue::Bool(false),
);
if core_truthy(&v_pending) {
v_llm_input = core_get(
&v_checkpoint,
&CoreValue::from("llm_input"),
CoreValue::from(""),
);
v_instruction = CoreValue::from("You are an internal AxAgent trajectory summarizer. Compress the execution history into a concise ledger with exactly these labels in order: Objective:, Current state and artifacts:, Exact callables and formats:, Evidence:, User constraints and preferences:, Failures to avoid:, Next step:. Use 'none' when a section is empty. Be concise and factual.");
v_messages = CoreValue::new_list();
v_sys = CoreValue::new_map();
core_set(&v_sys, CoreValue::from("role"), CoreValue::from("system"))?;
core_set(&v_sys, CoreValue::from("content"), v_instruction.clone())?;
core_append(&v_messages, v_sys.clone())?;
v_usr = CoreValue::new_map();
core_set(&v_usr, CoreValue::from("role"), CoreValue::from("user"))?;
core_set(&v_usr, CoreValue::from("content"), v_llm_input.clone())?;
core_append(&v_messages, v_usr.clone())?;
v_request = CoreValue::new_map();
core_set(
&v_request,
CoreValue::from("chat_prompt"),
v_messages.clone(),
)?;
v_response = core_ai_complete_once(&[v_client.clone(), v_request.clone()])?;
v_text = core_get(
&v_response,
&CoreValue::from("content"),
CoreValue::from(""),
);
v_has_text = core_ne(&[v_text.clone(), CoreValue::from("")])?;
if core_truthy(&v_has_text) {
v_updated = core_map_merge(&[v_empty_map.clone(), v_checkpoint.clone()])?;
core_set(&v_updated, CoreValue::from("summary"), v_text.clone())?;
core_set(
&v_updated,
CoreValue::from("summary_source"),
CoreValue::from("model"),
)?;
core_set(
&v_updated,
CoreValue::from("llm_pending"),
CoreValue::Bool(false),
)?;
core_set(
&v_state,
CoreValue::from("checkpoint_state"),
v_updated.clone(),
)?;
}
}
}
return Ok(v_state.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _context_map_sections(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_context_map_sections");
let mut v_s1 = CoreValue::Null;
let mut v_s2 = CoreValue::Null;
let mut v_s3 = CoreValue::Null;
let mut v_s4 = CoreValue::Null;
let mut v_s5 = CoreValue::Null;
let mut v_s6 = CoreValue::Null;
let mut v_sections = CoreValue::Null;
v_sections = CoreValue::new_list();
v_s1 = CoreValue::new_map();
core_set(
&v_s1,
CoreValue::from("name"),
CoreValue::from("context_roadmap"),
)?;
core_set(
&v_s1,
CoreValue::from("title"),
CoreValue::from("CONTEXT ROADMAP"),
)?;
core_set(&v_s1, CoreValue::from("slug"), CoreValue::from("cr"))?;
core_append(&v_sections, v_s1.clone())?;
v_s2 = CoreValue::new_map();
core_set(
&v_s2,
CoreValue::from("name"),
CoreValue::from("context_understanding"),
)?;
core_set(
&v_s2,
CoreValue::from("title"),
CoreValue::from("CONTEXT UNDERSTANDING"),
)?;
core_set(&v_s2, CoreValue::from("slug"), CoreValue::from("cu"))?;
core_append(&v_sections, v_s2.clone())?;
v_s3 = CoreValue::new_map();
core_set(
&v_s3,
CoreValue::from("name"),
CoreValue::from("domain_constants"),
)?;
core_set(
&v_s3,
CoreValue::from("title"),
CoreValue::from("DOMAIN CONSTANTS"),
)?;
core_set(&v_s3, CoreValue::from("slug"), CoreValue::from("dc"))?;
core_append(&v_sections, v_s3.clone())?;
v_s4 = CoreValue::new_map();
core_set(
&v_s4,
CoreValue::from("name"),
CoreValue::from("parsing_schema"),
)?;
core_set(
&v_s4,
CoreValue::from("title"),
CoreValue::from("PARSING SCHEMA"),
)?;
core_set(&v_s4, CoreValue::from("slug"), CoreValue::from("ps"))?;
core_append(&v_sections, v_s4.clone())?;
v_s5 = CoreValue::new_map();
core_set(
&v_s5,
CoreValue::from("name"),
CoreValue::from("reusable_results"),
)?;
core_set(
&v_s5,
CoreValue::from("title"),
CoreValue::from("REUSABLE RESULTS"),
)?;
core_set(&v_s5, CoreValue::from("slug"), CoreValue::from("rr"))?;
core_append(&v_sections, v_s5.clone())?;
v_s6 = CoreValue::new_map();
core_set(
&v_s6,
CoreValue::from("name"),
CoreValue::from("error_patterns"),
)?;
core_set(
&v_s6,
CoreValue::from("title"),
CoreValue::from("ERROR PATTERNS"),
)?;
core_set(&v_s6, CoreValue::from("slug"), CoreValue::from("ep"))?;
core_append(&v_sections, v_s6.clone())?;
return Ok(v_sections.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _context_map_parse_items(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_context_map_parse_items");
let mut v_text = core_arg(args, 0);
let mut v_content = CoreValue::Null;
let mut v_content_ok = CoreValue::Null;
let mut v_current = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_id_ok = CoreValue::Null;
let mut v_id_raw = CoreValue::Null;
let mut v_is_header = CoreValue::Null;
let mut v_is_item = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_items = CoreValue::Null;
let mut v_left = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_lines = CoreValue::Null;
let mut v_match = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_right = CoreValue::Null;
let mut v_sec = CoreValue::Null;
let mut v_sec_name = CoreValue::Null;
let mut v_sec_title = CoreValue::Null;
let mut v_sections = CoreValue::Null;
let mut v_title = CoreValue::Null;
let mut v_title_raw = CoreValue::Null;
let mut v_valid = CoreValue::Null;
v_sections = _context_map_sections(&[])?;
v_items = CoreValue::new_list();
v_lines = core_string_split_trim_nonempty(&[v_text.clone(), CoreValue::from("\n")])?;
v_current = CoreValue::from("context_understanding");
for v_line in core_iter(&v_lines)? {
let mut v_line = v_line;
v_is_header = core_string_starts_with(&[v_line.clone(), CoreValue::from("##")])?;
if core_truthy(&v_is_header) {
v_title_raw =
core_string_replace(&[v_line.clone(), CoreValue::from("#"), CoreValue::from("")])?;
v_title = core_string_trim(&v_title_raw);
for v_sec in core_iter(&v_sections)? {
let mut v_sec = v_sec;
v_sec_title = core_get(&v_sec, &CoreValue::from("title"), CoreValue::Null);
v_match = core_eq(&[v_sec_title.clone(), v_title.clone()])?;
if core_truthy(&v_match) {
v_sec_name = core_get(&v_sec, &CoreValue::from("name"), CoreValue::Null);
v_current = v_sec_name.clone();
}
}
} else {
v_is_item = core_string_starts_with(&[v_line.clone(), CoreValue::from("[")])?;
if core_truthy(&v_is_item) {
v_parts = core_string_split_once(&[v_line.clone(), CoreValue::from("]")])?;
v_left = core_get(&v_parts, &CoreValue::from("left"), CoreValue::from(""));
v_right = core_get(&v_parts, &CoreValue::from("right"), CoreValue::from(""));
v_id_raw = core_string_replace(&[
v_left.clone(),
CoreValue::from("["),
CoreValue::from(""),
])?;
v_id = core_string_trim(&v_id_raw);
v_content = core_string_trim(&v_right);
v_id_ok = core_ne(&[v_id.clone(), CoreValue::from("")])?;
v_content_ok = core_ne(&[v_content.clone(), CoreValue::from("")])?;
v_valid = core_and(&[v_id_ok.clone(), v_content_ok.clone()])?;
if core_truthy(&v_valid) {
v_item = CoreValue::new_map();
core_set(&v_item, CoreValue::from("id"), v_id.clone())?;
core_set(&v_item, CoreValue::from("section"), v_current.clone())?;
core_set(&v_item, CoreValue::from("content"), v_content.clone())?;
core_append(&v_items, v_item.clone())?;
}
}
}
}
return Ok(v_items.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _context_map_render_items(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_context_map_render_items");
let mut v_items = core_arg(args, 0);
let mut v_content = CoreValue::Null;
let mut v_header = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_in_sec = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_item_sec = CoreValue::Null;
let mut v_line = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_sec = CoreValue::Null;
let mut v_sec_name = CoreValue::Null;
let mut v_sec_title = CoreValue::Null;
let mut v_sections = CoreValue::Null;
let mut v_text = CoreValue::Null;
v_sections = _context_map_sections(&[])?;
v_parts = CoreValue::new_list();
for v_sec in core_iter(&v_sections)? {
let mut v_sec = v_sec;
v_sec_name = core_get(&v_sec, &CoreValue::from("name"), CoreValue::Null);
v_sec_title = core_get(&v_sec, &CoreValue::from("title"), CoreValue::Null);
v_header = core_string_format(&[CoreValue::from("## {}"), v_sec_title.clone()])?;
core_append(&v_parts, v_header.clone())?;
for v_item in core_iter(&v_items)? {
let mut v_item = v_item;
v_item_sec = core_get(&v_item, &CoreValue::from("section"), CoreValue::Null);
v_in_sec = core_eq(&[v_item_sec.clone(), v_sec_name.clone()])?;
if core_truthy(&v_in_sec) {
v_id = core_get(&v_item, &CoreValue::from("id"), CoreValue::Null);
v_content = core_get(&v_item, &CoreValue::from("content"), CoreValue::Null);
v_line = core_string_format(&[
CoreValue::from("[{}] {}"),
v_id.clone(),
v_content.clone(),
])?;
core_append(&v_parts, v_line.clone())?;
}
}
}
v_text = core_string_join_intrinsic(&[CoreValue::from("\n"), v_parts.clone()])?;
return Ok(v_text.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _context_map_update_scores(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_context_map_update_scores");
let mut v_scores = core_arg(args, 0);
let mut v_item_tags = core_arg(args, 1);
let mut v_cur = CoreValue::Null;
let mut v_down = CoreValue::Null;
let mut v_down2 = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_is_harmful = CoreValue::Null;
let mut v_is_helpful = CoreValue::Null;
let mut v_is_obj = CoreValue::Null;
let mut v_is_stale = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_tag = CoreValue::Null;
let mut v_up = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_out = core_map_merge(&[v_empty_map.clone(), v_scores.clone()])?;
v_is_obj = core_type_is(&v_item_tags, CoreValue::from("object"));
if core_truthy(&v_is_obj) {
for v_id in core_iter(&v_item_tags)? {
let mut v_id = v_id;
v_tag = core_get(&v_item_tags, &v_id.clone(), CoreValue::Null);
v_cur = core_get(&v_out, &v_id.clone(), CoreValue::Num(0f64));
v_is_helpful = core_eq(&[v_tag.clone(), CoreValue::from("helpful")])?;
if core_truthy(&v_is_helpful) {
v_up = core_add(&[v_cur.clone(), CoreValue::Num(1f64)])?;
core_set(&v_out, v_id.clone(), v_up.clone())?;
}
v_is_harmful = core_eq(&[v_tag.clone(), CoreValue::from("harmful")])?;
if core_truthy(&v_is_harmful) {
v_down = core_add(&[v_cur.clone(), CoreValue::Num(-1f64)])?;
core_set(&v_out, v_id.clone(), v_down.clone())?;
}
v_is_stale = core_eq(&[v_tag.clone(), CoreValue::from("stale")])?;
if core_truthy(&v_is_stale) {
v_down2 = core_add(&[v_cur.clone(), CoreValue::Num(-1f64)])?;
core_set(&v_out, v_id.clone(), v_down2.clone())?;
}
}
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _context_map_apply_operations(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_context_map_apply_operations");
let mut v_items = core_arg(args, 0);
let mut v_operations = core_arg(args, 1);
let mut v_next_id = core_arg(args, 2);
let mut v_add_content = CoreValue::Null;
let mut v_add_item = CoreValue::Null;
let mut v_add_section = CoreValue::Null;
let mut v_content_ok = CoreValue::Null;
let mut v_counter = CoreValue::Null;
let mut v_del_a = CoreValue::Null;
let mut v_del_id = CoreValue::Null;
let mut v_deleted = CoreValue::Null;
let mut v_deletes = CoreValue::Null;
let mut v_has_replace = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_inc = CoreValue::Null;
let mut v_is_add = CoreValue::Null;
let mut v_is_delete = CoreValue::Null;
let mut v_is_list = CoreValue::Null;
let mut v_is_replace = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_keep = CoreValue::Null;
let mut v_kept = CoreValue::Null;
let mut v_new_content = CoreValue::Null;
let mut v_new_id = CoreValue::Null;
let mut v_old_content = CoreValue::Null;
let mut v_op = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_radd = CoreValue::Null;
let mut v_radd_content = CoreValue::Null;
let mut v_radd_section = CoreValue::Null;
let mut v_raw = CoreValue::Null;
let mut v_raw_adds = CoreValue::Null;
let mut v_rep_a = CoreValue::Null;
let mut v_rep_content = CoreValue::Null;
let mut v_rep_id = CoreValue::Null;
let mut v_replaces = CoreValue::Null;
let mut v_result_items = CoreValue::Null;
let mut v_sec = CoreValue::Null;
let mut v_sections = CoreValue::Null;
let mut v_slug = CoreValue::Null;
let mut v_smatch = CoreValue::Null;
let mut v_sname = CoreValue::Null;
let mut v_sslug = CoreValue::Null;
let mut v_type = CoreValue::Null;
v_sections = _context_map_sections(&[])?;
v_deletes = CoreValue::new_map();
v_replaces = CoreValue::new_map();
v_raw_adds = CoreValue::new_list();
v_is_list = core_type_is(&v_operations, CoreValue::from("list"));
if core_truthy(&v_is_list) {
for v_op in core_iter(&v_operations)? {
let mut v_op = v_op;
v_type = core_get(&v_op, &CoreValue::from("type"), CoreValue::from(""));
v_is_delete = core_eq(&[v_type.clone(), CoreValue::from("DELETE")])?;
if core_truthy(&v_is_delete) {
v_del_a = core_get(&v_op, &CoreValue::from("item_id"), CoreValue::from(""));
v_del_id = core_get(&v_op, &CoreValue::from("itemId"), v_del_a.clone());
core_set(&v_deletes, v_del_id.clone(), CoreValue::Bool(true))?;
}
v_is_replace = core_eq(&[v_type.clone(), CoreValue::from("REPLACE")])?;
if core_truthy(&v_is_replace) {
v_rep_a = core_get(&v_op, &CoreValue::from("item_id"), CoreValue::from(""));
v_rep_id = core_get(&v_op, &CoreValue::from("itemId"), v_rep_a.clone());
v_rep_content = core_get(&v_op, &CoreValue::from("content"), CoreValue::from(""));
core_set(&v_replaces, v_rep_id.clone(), v_rep_content.clone())?;
}
v_is_add = core_eq(&[v_type.clone(), CoreValue::from("ADD")])?;
if core_truthy(&v_is_add) {
v_add_section = core_get(
&v_op,
&CoreValue::from("section"),
CoreValue::from("context_understanding"),
);
v_add_content = core_get(&v_op, &CoreValue::from("content"), CoreValue::from(""));
v_content_ok = core_ne(&[v_add_content.clone(), CoreValue::from("")])?;
if core_truthy(&v_content_ok) {
v_raw = CoreValue::new_map();
core_set(&v_raw, CoreValue::from("section"), v_add_section.clone())?;
core_set(&v_raw, CoreValue::from("content"), v_add_content.clone())?;
core_append(&v_raw_adds, v_raw.clone())?;
}
}
}
}
v_result_items = CoreValue::new_list();
for v_item in core_iter(&v_items)? {
let mut v_item = v_item;
v_id = core_get(&v_item, &CoreValue::from("id"), CoreValue::Null);
v_deleted = core_get(&v_deletes, &v_id.clone(), CoreValue::Bool(false));
v_keep = core_not(&[v_deleted.clone()])?;
if core_truthy(&v_keep) {
v_kept = CoreValue::new_map();
core_set(&v_kept, CoreValue::from("id"), v_id.clone())?;
v_sec = core_get(&v_item, &CoreValue::from("section"), CoreValue::Null);
core_set(&v_kept, CoreValue::from("section"), v_sec.clone())?;
v_new_content = core_get(&v_replaces, &v_id.clone(), CoreValue::Null);
v_has_replace = core_is_not_none(&[v_new_content.clone()])?;
if core_truthy(&v_has_replace) {
core_set(&v_kept, CoreValue::from("content"), v_new_content.clone())?;
} else {
v_old_content = core_get(&v_item, &CoreValue::from("content"), CoreValue::Null);
core_set(&v_kept, CoreValue::from("content"), v_old_content.clone())?;
}
core_append(&v_result_items, v_kept.clone())?;
}
}
v_counter = v_next_id.clone();
for v_radd in core_iter(&v_raw_adds)? {
let mut v_radd = v_radd;
v_radd_section = core_get(&v_radd, &CoreValue::from("section"), CoreValue::Null);
v_radd_content = core_get(&v_radd, &CoreValue::from("content"), CoreValue::Null);
v_slug = CoreValue::from("cu");
for v_sec in core_iter(&v_sections)? {
let mut v_sec = v_sec;
v_sname = core_get(&v_sec, &CoreValue::from("name"), CoreValue::Null);
v_smatch = core_eq(&[v_sname.clone(), v_radd_section.clone()])?;
if core_truthy(&v_smatch) {
v_sslug = core_get(&v_sec, &CoreValue::from("slug"), CoreValue::Null);
v_slug = v_sslug.clone();
}
}
v_new_id =
core_string_format(&[CoreValue::from("{}-{}"), v_slug.clone(), v_counter.clone()])?;
v_inc = core_add(&[v_counter.clone(), CoreValue::Num(1f64)])?;
v_counter = v_inc.clone();
v_add_item = CoreValue::new_map();
core_set(&v_add_item, CoreValue::from("id"), v_new_id.clone())?;
core_set(
&v_add_item,
CoreValue::from("section"),
v_radd_section.clone(),
)?;
core_set(
&v_add_item,
CoreValue::from("content"),
v_radd_content.clone(),
)?;
core_append(&v_result_items, v_add_item.clone())?;
}
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("items"), v_result_items.clone())?;
core_set(&v_out, CoreValue::from("next_id"), v_counter.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _context_map_evict_to_budget(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_context_map_evict_to_budget");
let mut v_items = core_arg(args, 0);
let mut v_scores = core_arg(args, 1);
let mut v_max_chars = core_arg(args, 2);
let mut v_count = CoreValue::Null;
let mut v_current = CoreValue::Null;
let mut v_empty = CoreValue::Null;
let mut v_first = CoreValue::Null;
let mut v_have_min = CoreValue::Null;
let mut v_iid = CoreValue::Null;
let mut v_is_min = CoreValue::Null;
let mut v_iscore = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_keep = CoreValue::Null;
let mut v_len = CoreValue::Null;
let mut v_lower = CoreValue::Null;
let mut v_min_id = CoreValue::Null;
let mut v_min_score = CoreValue::Null;
let mut v_next_items = CoreValue::Null;
let mut v_not_over = CoreValue::Null;
let mut v_over = CoreValue::Null;
let mut v_take = CoreValue::Null;
let mut v_text = CoreValue::Null;
v_current = v_items.clone();
loop {
v_text = _context_map_render_items(&[v_current.clone()])?;
v_len = core_len(&[v_text.clone()])?;
v_over = core_gt(&[v_len.clone(), v_max_chars.clone()])?;
v_not_over = core_not(&[v_over.clone()])?;
if core_truthy(&v_not_over) {
break;
}
v_count = core_len(&[v_current.clone()])?;
v_empty = core_eq(&[v_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_empty) {
break;
}
v_min_id = CoreValue::from("");
v_min_score = CoreValue::Num(0f64);
v_have_min = CoreValue::Bool(false);
for v_item in core_iter(&v_current)? {
let mut v_item = v_item;
v_iid = core_get(&v_item, &CoreValue::from("id"), CoreValue::Null);
v_iscore = core_get(&v_scores, &v_iid.clone(), CoreValue::Num(0f64));
v_first = core_not(&[v_have_min.clone()])?;
v_lower = core_lt(&[v_iscore.clone(), v_min_score.clone()])?;
v_take = core_or(&[v_first.clone(), v_lower.clone()])?;
if core_truthy(&v_take) {
v_min_id = v_iid.clone();
v_min_score = v_iscore.clone();
v_have_min = CoreValue::Bool(true);
}
}
v_next_items = CoreValue::new_list();
for v_item in core_iter(&v_current)? {
let mut v_item = v_item;
v_iid = core_get(&v_item, &CoreValue::from("id"), CoreValue::Null);
v_is_min = core_eq(&[v_iid.clone(), v_min_id.clone()])?;
v_keep = core_not(&[v_is_min.clone()])?;
if core_truthy(&v_keep) {
core_append(&v_next_items, v_item.clone())?;
}
}
v_current = v_next_items.clone();
}
return Ok(v_current.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _format_context_map_trajectory(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_format_context_map_trajectory");
let mut v_state = core_arg(args, 0);
let mut v_action_log = CoreValue::Null;
let mut v_action_text = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_status_log = CoreValue::Null;
let mut v_status_text = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_action_log = core_get(
&v_state,
&CoreValue::from("action_log"),
v_empty_list.clone(),
);
v_action_text = core_json_stable_stringify(&[v_action_log.clone()])?;
v_status_log = core_get(
&v_state,
&CoreValue::from("status_log"),
v_empty_list.clone(),
);
v_status_text = core_json_stable_stringify(&[v_status_log.clone()])?;
v_out = core_string_format(&[
CoreValue::from("## Executor Action Log\n{}\n\n## Status Log\n{}"),
v_action_text.clone(),
v_status_text.clone(),
])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _context_map_complete(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_context_map_complete");
let mut v_client = core_arg(args, 0);
let mut v_system = core_arg(args, 1);
let mut v_user = core_arg(args, 2);
let mut v_content = CoreValue::Null;
let mut v_messages = CoreValue::Null;
let mut v_request = CoreValue::Null;
let mut v_response = CoreValue::Null;
let mut v_sys = CoreValue::Null;
let mut v_usr = CoreValue::Null;
v_messages = CoreValue::new_list();
v_sys = CoreValue::new_map();
core_set(&v_sys, CoreValue::from("role"), CoreValue::from("system"))?;
core_set(&v_sys, CoreValue::from("content"), v_system.clone())?;
core_append(&v_messages, v_sys.clone())?;
v_usr = CoreValue::new_map();
core_set(&v_usr, CoreValue::from("role"), CoreValue::from("user"))?;
core_set(&v_usr, CoreValue::from("content"), v_user.clone())?;
core_append(&v_messages, v_usr.clone())?;
v_request = CoreValue::new_map();
core_set(
&v_request,
CoreValue::from("chat_prompt"),
v_messages.clone(),
)?;
v_response = core_ai_complete_once(&[v_client.clone(), v_request.clone()])?;
v_content = core_get(
&v_response,
&CoreValue::from("content"),
CoreValue::from(""),
);
return Ok(v_content.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _context_map_parse_json(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_context_map_parse_json");
let mut v_content = core_arg(args, 0);
let mut v_empty_map = CoreValue::Null;
let mut v_is_empty = CoreValue::Null;
let mut v_is_obj = CoreValue::Null;
let mut v_looks_object = CoreValue::Null;
let mut v_not_object = CoreValue::Null;
let mut v_parsed = CoreValue::Null;
let mut v_trimmed = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_trimmed = core_string_trim(&v_content);
v_is_empty = core_eq(&[v_trimmed.clone(), CoreValue::from("")])?;
if core_truthy(&v_is_empty) {
return Ok(v_empty_map.clone());
}
v_looks_object = core_string_starts_with(&[v_trimmed.clone(), CoreValue::from("{")])?;
v_not_object = core_not(&[v_looks_object.clone()])?;
if core_truthy(&v_not_object) {
return Ok(v_empty_map.clone());
}
v_parsed = core_json_parse(&[v_trimmed.clone()])?;
v_is_obj = core_type_is(&v_parsed, CoreValue::from("object"));
if core_truthy(&v_is_obj) {
return Ok(v_parsed.clone());
}
return Ok(v_empty_map.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_evolve_context_map(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_evolve_context_map");
let mut v_state = core_arg(args, 0);
let mut v_client = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_applied = CoreValue::Null;
let mut v_carto_parsed = CoreValue::Null;
let mut v_carto_resp = CoreValue::Null;
let mut v_carto_sys = CoreValue::Null;
let mut v_carto_user = CoreValue::Null;
let mut v_carto_user_head = CoreValue::Null;
let mut v_cm = CoreValue::Null;
let mut v_current_chars = CoreValue::Null;
let mut v_current_text = CoreValue::Null;
let mut v_distiller_parsed = CoreValue::Null;
let mut v_distiller_resp = CoreValue::Null;
let mut v_distiller_sys = CoreValue::Null;
let mut v_distiller_user = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_evicted = CoreValue::Null;
let mut v_evolve_ok = CoreValue::Null;
let mut v_evolve_steps = CoreValue::Null;
let mut v_has_cm = CoreValue::Null;
let mut v_infinite = CoreValue::Null;
let mut v_item_tags = CoreValue::Null;
let mut v_items = CoreValue::Null;
let mut v_max_chars = CoreValue::Null;
let mut v_new_items = CoreValue::Null;
let mut v_new_next_id = CoreValue::Null;
let mut v_new_scores = CoreValue::Null;
let mut v_new_steps = CoreValue::Null;
let mut v_new_text = CoreValue::Null;
let mut v_next_id = CoreValue::Null;
let mut v_operations = CoreValue::Null;
let mut v_reflection = CoreValue::Null;
let mut v_scores = CoreValue::Null;
let mut v_should_evolve = CoreValue::Null;
let mut v_steps = CoreValue::Null;
let mut v_task = CoreValue::Null;
let mut v_trajectory = CoreValue::Null;
let mut v_under_budget = CoreValue::Null;
let mut v_updated = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_empty_list = CoreValue::new_list();
v_cm = core_get(&v_state, &CoreValue::from("context_map"), CoreValue::Null);
v_has_cm = core_is_not_none(&[v_cm.clone()])?;
v_infinite = core_get(
&v_cm,
&CoreValue::from("infiniteEvolve"),
CoreValue::Bool(false),
);
v_steps = core_get(&v_cm, &CoreValue::from("steps"), CoreValue::Num(0f64));
v_evolve_steps = core_get(&v_cm, &CoreValue::from("evolveSteps"), CoreValue::Num(0f64));
v_under_budget = core_lt(&[v_steps.clone(), v_evolve_steps.clone()])?;
v_evolve_ok = core_or(&[v_infinite.clone(), v_under_budget.clone()])?;
v_should_evolve = core_and(&[v_has_cm.clone(), v_evolve_ok.clone()])?;
if core_truthy(&v_should_evolve) {
v_current_text = core_get(&v_cm, &CoreValue::from("text"), CoreValue::from(""));
v_scores = core_get(&v_cm, &CoreValue::from("scores"), v_empty_map.clone());
v_max_chars = core_get(&v_cm, &CoreValue::from("maxChars"), CoreValue::Num(4000f64));
v_next_id = core_get(&v_cm, &CoreValue::from("next_id"), CoreValue::Num(1f64));
v_task = core_get(
&v_state,
&CoreValue::from("task_description"),
CoreValue::from(""),
);
v_trajectory = _format_context_map_trajectory(&[v_state.clone()])?;
v_distiller_sys = CoreValue::from("You are the context-map Distiller for a recurring external context used by an AxAgent RLM loop.\n\nYour job is to read the completed trajectory and identify reusable orientation knowledge about the external context. The context map is a persistent cache of understanding, not a transcript summary, task playbook, or answer cache.\n\nCache only orientation work: would a future agent asking a completely different question about the same context benefit from knowing this?\n\nReview every existing context-map item before proposing new knowledge. Tag each existing item ID as exactly one of helpful, harmful, neutral, or stale. Treat unused-but-correct domain knowledge as neutral, not harmful.\n\nReturn:\n- diagnosis: concise analysis of orientation work vs. question-specific work.\n- itemTags: object mapping existing context-map item IDs to helpful, harmful, neutral, or stale.\n- cacheCandidates: JSON array of objects with section, value, transferability, and rationale.");
v_distiller_user = core_string_format(&[
CoreValue::from("task: {}\n\ncontextMap:\n{}\n\ntrajectory:\n{}"),
v_task.clone(),
v_current_text.clone(),
v_trajectory.clone(),
])?;
v_distiller_resp = _context_map_complete(&[
v_client.clone(),
v_distiller_sys.clone(),
v_distiller_user.clone(),
])?;
v_distiller_parsed = _context_map_parse_json(&[v_distiller_resp.clone()])?;
v_item_tags = core_get(
&v_distiller_parsed,
&CoreValue::from("itemTags"),
v_empty_map.clone(),
);
v_reflection = core_json_stringify(&[v_distiller_parsed.clone()])?;
v_current_chars = core_len(&[v_current_text.clone()])?;
v_carto_sys = CoreValue::from("You are the context-map Cartographer for a recurring external context used by an AxAgent RLM loop.\n\nTranslate the Distiller reflection into a small set of concrete context-map edits. Maintain a concise, high-value context map that stores shared understanding of the external context, not answers to individual questions.\n\nPrefer REPLACE over ADD when an existing item can be made more correct, compact, or general. DELETE stale, misleading, redundant, low-value, verbose, or question-specific items. ADD only transferable context understanding. When the map is near or over budget, remove or rewrite low-value entries first. If nothing is worth keeping, return an empty operations list.\n\nReturn operations as JSON objects under the key operations:\n- {\"type\":\"ADD\",\"section\":\"context_understanding\",\"content\":\"...\"}\n- {\"type\":\"DELETE\",\"item_id\":\"cu-1\"}\n- {\"type\":\"REPLACE\",\"item_id\":\"cu-1\",\"content\":\"...\"}");
v_carto_user_head = core_string_format(&[
CoreValue::from("task: {}\n\ncontextMap:\n{}\n\ndistillerReflection:\n{}"),
v_task.clone(),
v_current_text.clone(),
v_reflection.clone(),
])?;
v_carto_user = core_string_format(&[
CoreValue::from("{}\n\ncurrentChars: {}\nmaxChars: {}"),
v_carto_user_head.clone(),
v_current_chars.clone(),
v_max_chars.clone(),
])?;
v_carto_resp =
_context_map_complete(&[v_client.clone(), v_carto_sys.clone(), v_carto_user.clone()])?;
v_carto_parsed = _context_map_parse_json(&[v_carto_resp.clone()])?;
v_operations = core_get(
&v_carto_parsed,
&CoreValue::from("operations"),
v_empty_list.clone(),
);
v_items = _context_map_parse_items(&[v_current_text.clone()])?;
v_new_scores = _context_map_update_scores(&[v_scores.clone(), v_item_tags.clone()])?;
v_applied = _context_map_apply_operations(&[
v_items.clone(),
v_operations.clone(),
v_next_id.clone(),
])?;
v_new_items = core_get(&v_applied, &CoreValue::from("items"), v_empty_list.clone());
v_new_next_id = core_get(&v_applied, &CoreValue::from("next_id"), v_next_id.clone());
v_evicted = _context_map_evict_to_budget(&[
v_new_items.clone(),
v_new_scores.clone(),
v_max_chars.clone(),
])?;
v_new_text = _context_map_render_items(&[v_evicted.clone()])?;
v_new_steps = core_add(&[v_steps.clone(), CoreValue::Num(1f64)])?;
v_updated = core_map_merge(&[v_empty_map.clone(), v_cm.clone()])?;
core_set(&v_updated, CoreValue::from("text"), v_new_text.clone())?;
core_set(&v_updated, CoreValue::from("scores"), v_new_scores.clone())?;
core_set(&v_updated, CoreValue::from("steps"), v_new_steps.clone())?;
core_set(
&v_updated,
CoreValue::from("next_id"),
v_new_next_id.clone(),
)?;
core_set(&v_state, CoreValue::from("context_map"), v_updated.clone())?;
}
return Ok(v_state.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_transcribe_one_audio(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_transcribe_one_audio");
let mut v_client = core_arg(args, 0);
let mut v_audio = core_arg(args, 1);
let mut v_transcribe_opts = core_arg(args, 2);
let mut v_options = core_arg(args, 3);
let mut v_empty_map = CoreValue::Null;
let mut v_has_data = CoreValue::Null;
let mut v_is_object = CoreValue::Null;
let mut v_request = CoreValue::Null;
let mut v_response = CoreValue::Null;
let mut v_text = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_is_object = core_type_is(&v_audio, CoreValue::from("object"));
if core_truthy(&v_is_object) {
v_has_data = core_map_contains(&[v_audio.clone(), CoreValue::from("data")])?;
if core_truthy(&v_has_data) {
v_request = core_map_merge(&[v_empty_map.clone(), v_transcribe_opts.clone()])?;
core_set(&v_request, CoreValue::from("audio"), v_audio.clone())?;
v_response =
core_agent_transcribe(&[v_client.clone(), v_request.clone(), v_options.clone()])?;
v_text = core_get(&v_response, &CoreValue::from("text"), CoreValue::from(""));
return Ok(v_text.clone());
}
}
return Ok(v_audio.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_transcribe_audio_inputs(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_transcribe_audio_inputs");
let mut v_state = core_arg(args, 0);
let mut v_client = core_arg(args, 1);
let mut v_values = core_arg(args, 2);
let mut v_options = core_arg(args, 3);
let mut v_do_single = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_field = CoreValue::Null;
let mut v_fname = CoreValue::Null;
let mut v_ftype = CoreValue::Null;
let mut v_has = CoreValue::Null;
let mut v_input_fields = CoreValue::Null;
let mut v_is_audio = CoreValue::Null;
let mut v_is_list = CoreValue::Null;
let mut v_is_string = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_item_text = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_sig = CoreValue::Null;
let mut v_speech = CoreValue::Null;
let mut v_text = CoreValue::Null;
let mut v_tname = CoreValue::Null;
let mut v_transcribe_opts = CoreValue::Null;
let mut v_transcribed = CoreValue::Null;
let mut v_value = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_empty_map = CoreValue::new_map();
v_sig = core_get(&v_state, &CoreValue::from("signature"), v_empty_map.clone());
v_input_fields = core_get(
&v_sig,
&CoreValue::from("input_fields"),
v_empty_list.clone(),
);
v_speech = core_get(&v_options, &CoreValue::from("speech"), v_empty_map.clone());
v_transcribe_opts = core_get(
&v_speech,
&CoreValue::from("transcribe"),
v_empty_map.clone(),
);
v_result = core_map_merge(&[v_empty_map.clone(), v_values.clone()])?;
for v_field in core_iter(&v_input_fields)? {
let mut v_field = v_field;
v_ftype = core_get(&v_field, &CoreValue::from("type"), v_empty_map.clone());
v_tname = core_get(&v_ftype, &CoreValue::from("name"), CoreValue::from(""));
v_is_audio = core_eq(&[v_tname.clone(), CoreValue::from("audio")])?;
if core_truthy(&v_is_audio) {
v_fname = core_get(&v_field, &CoreValue::from("name"), CoreValue::Null);
v_has = core_map_contains(&[v_result.clone(), v_fname.clone()])?;
if core_truthy(&v_has) {
v_value = core_get(&v_result, &v_fname.clone(), CoreValue::Null);
v_is_string = core_type_is(&v_value, CoreValue::from("string"));
v_is_list = core_type_is(&v_value, CoreValue::from("list"));
if core_truthy(&v_is_list) {
v_transcribed = CoreValue::new_list();
for v_item in core_iter(&v_value)? {
let mut v_item = v_item;
v_item_text = _agent_transcribe_one_audio(&[
v_client.clone(),
v_item.clone(),
v_transcribe_opts.clone(),
v_options.clone(),
])?;
core_append(&v_transcribed, v_item_text.clone())?;
}
core_set(&v_result, v_fname.clone(), v_transcribed.clone())?;
} else {
v_do_single = core_not(&[v_is_string.clone()])?;
if core_truthy(&v_do_single) {
v_text = _agent_transcribe_one_audio(&[
v_client.clone(),
v_value.clone(),
v_transcribe_opts.clone(),
v_options.clone(),
])?;
core_set(&v_result, v_fname.clone(), v_text.clone())?;
}
}
}
}
}
return Ok(v_result.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_run_llm_query_one(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_run_llm_query_one");
let mut v_sub_gen = core_arg(args, 0);
let mut v_client = core_arg(args, 1);
let mut v_item = core_arg(args, 2);
let mut v_answer = CoreValue::Null;
let mut v_context = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_item_is_string = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_query = CoreValue::Null;
let mut v_sub_options = CoreValue::Null;
let mut v_values = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_query = CoreValue::from("");
v_context = v_empty_map.clone();
v_item_is_string = core_type_is(&v_item, CoreValue::from("string"));
if core_truthy(&v_item_is_string) {
v_query = v_item.clone();
} else {
v_query = core_get(&v_item, &CoreValue::from("query"), CoreValue::from(""));
v_context = core_get(&v_item, &CoreValue::from("context"), v_empty_map.clone());
}
v_values = CoreValue::new_map();
core_set(&v_values, CoreValue::from("task"), v_query.clone())?;
core_set(&v_values, CoreValue::from("context"), v_context.clone())?;
v_sub_options = CoreValue::new_map();
v_output = core_agent_stage_forward(&[
v_sub_gen.clone(),
v_client.clone(),
v_values.clone(),
v_sub_options.clone(),
])?;
v_answer = core_get(&v_output, &CoreValue::from("answer"), CoreValue::from(""));
return Ok(v_answer.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_run_llm_query(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_run_llm_query");
let mut v_sub_gen = core_arg(args, 0);
let mut v_client = core_arg(args, 1);
let mut v_params = core_arg(args, 2);
let mut v_answers = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_one = CoreValue::Null;
let mut v_params_is_list = CoreValue::Null;
let mut v_single = CoreValue::Null;
v_params_is_list = core_type_is(&v_params, CoreValue::from("list"));
if core_truthy(&v_params_is_list) {
v_answers = CoreValue::new_list();
for v_item in core_iter(&v_params)? {
let mut v_item = v_item;
v_one =
_agent_run_llm_query_one(&[v_sub_gen.clone(), v_client.clone(), v_item.clone()])?;
core_append(&v_answers, v_one.clone())?;
}
return Ok(v_answers.clone());
}
v_single = _agent_run_llm_query_one(&[v_sub_gen.clone(), v_client.clone(), v_params.clone()])?;
return Ok(v_single.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _agent_forward(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_agent_forward");
let mut v_state = core_arg(args, 0);
let mut v_distiller = core_arg(args, 1);
let mut v_executor = core_arg(args, 2);
let mut v_responder = core_arg(args, 3);
let mut v_client = core_arg(args, 4);
let mut v_values = core_arg(args, 5);
let mut v_options = core_arg(args, 6);
let mut v_code = CoreValue::Null;
let mut v_completion_payload = CoreValue::Null;
let mut v_distiller_code = CoreValue::Null;
let mut v_distiller_completion = CoreValue::Null;
let mut v_distiller_empty_log = CoreValue::Null;
let mut v_distiller_error = CoreValue::Null;
let mut v_distiller_error_event = CoreValue::Null;
let mut v_distiller_globals = CoreValue::Null;
let mut v_distiller_has_completion = CoreValue::Null;
let mut v_distiller_is_respond = CoreValue::Null;
let mut v_distiller_max_steps = CoreValue::Null;
let mut v_distiller_options = CoreValue::Null;
let mut v_distiller_output = CoreValue::Null;
let mut v_distiller_payload = CoreValue::Null;
let mut v_distiller_payload_type = CoreValue::Null;
let mut v_distiller_request_event = CoreValue::Null;
let mut v_distiller_response_event = CoreValue::Null;
let mut v_distiller_runtime_step = CoreValue::Null;
let mut v_distiller_saved_action_log = CoreValue::Null;
let mut v_distiller_session = CoreValue::Null;
let mut v_distiller_session_reset = CoreValue::Null;
let mut v_distiller_state_reset = CoreValue::Null;
let mut v_distiller_step = CoreValue::Null;
let mut v_distiller_step_error = CoreValue::Null;
let mut v_distiller_step_ok = CoreValue::Null;
let mut v_distiller_too_many = CoreValue::Null;
let mut v_distiller_values = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_error_event = CoreValue::Null;
let mut v_exec_args = CoreValue::Null;
let mut v_exec_distilled = CoreValue::Null;
let mut v_exec_empty_list = CoreValue::Null;
let mut v_exec_empty_map = CoreValue::Null;
let mut v_exec_extras = CoreValue::Null;
let mut v_exec_fallback_req = CoreValue::Null;
let mut v_exec_non_ctx = CoreValue::Null;
let mut v_exec_non_ctx_split = CoreValue::Null;
let mut v_exec_req = CoreValue::Null;
let mut v_exec_req_coerced = CoreValue::Null;
let mut v_exec_req_is_string = CoreValue::Null;
let mut v_exec_req_raw = CoreValue::Null;
let mut v_exec_runtime_values = CoreValue::Null;
let mut v_exec_step_error = CoreValue::Null;
let mut v_exec_step_ok = CoreValue::Null;
let mut v_executor_completion_is_respond = CoreValue::Null;
let mut v_executor_completion_type = CoreValue::Null;
let mut v_executor_options = CoreValue::Null;
let mut v_executor_output = CoreValue::Null;
let mut v_executor_payload = CoreValue::Null;
let mut v_executor_payload_is_respond = CoreValue::Null;
let mut v_executor_payload_type = CoreValue::Null;
let mut v_executor_request_event = CoreValue::Null;
let mut v_executor_response_event = CoreValue::Null;
let mut v_executor_values = CoreValue::Null;
let mut v_globals = CoreValue::Null;
let mut v_has_completion = CoreValue::Null;
let mut v_has_shared_session = CoreValue::Null;
let mut v_logs = CoreValue::Null;
let mut v_max_steps = CoreValue::Null;
let mut v_non_runtime_executor = CoreValue::Null;
let mut v_patch_snapshot = CoreValue::Null;
let mut v_responder_options = CoreValue::Null;
let mut v_responder_output = CoreValue::Null;
let mut v_responder_request_event = CoreValue::Null;
let mut v_responder_response_event = CoreValue::Null;
let mut v_responder_values = CoreValue::Null;
let mut v_run_executor = CoreValue::Null;
let mut v_runtime_disabled = CoreValue::Null;
let mut v_runtime_enabled = CoreValue::Null;
let mut v_runtime_executor_enabled = CoreValue::Null;
let mut v_runtime_from_options = CoreValue::Null;
let mut v_runtime_from_state = CoreValue::Null;
let mut v_runtime_step = CoreValue::Null;
let mut v_session = CoreValue::Null;
let mut v_shared_contract = CoreValue::Null;
let mut v_shared_js = CoreValue::Null;
let mut v_skip_args = CoreValue::Null;
let mut v_skip_args_empty = CoreValue::Null;
let mut v_skip_disabled = CoreValue::Null;
let mut v_skip_empty_map = CoreValue::Null;
let mut v_skip_enabled = CoreValue::Null;
let mut v_skip_error = CoreValue::Null;
let mut v_skip_event = CoreValue::Null;
let mut v_skip_payload = CoreValue::Null;
let mut v_skip_policy_flags = CoreValue::Null;
let mut v_state_options = CoreValue::Null;
let mut v_step = CoreValue::Null;
let mut v_too_many = CoreValue::Null;
let mut v_transcribed_values = CoreValue::Null;
let mut v_usage = CoreValue::Null;
v_transcribed_values = _agent_transcribe_audio_inputs(&[
v_state.clone(),
v_client.clone(),
v_values.clone(),
v_options.clone(),
])?;
v_values = v_transcribed_values.clone();
_agent_begin_trace(&[v_state.clone(), v_values.clone()])?;
_agent_apply_llm_checkpoint_summary(&[v_state.clone(), v_client.clone(), v_options.clone()])?;
v_state_options = core_get(&v_state, &CoreValue::from("options"), CoreValue::Null);
v_runtime_from_state = core_get(
&v_state_options,
&CoreValue::from("runtime"),
CoreValue::Null,
);
v_runtime_from_options = core_get(
&v_options,
&CoreValue::from("runtime"),
v_runtime_from_state.clone(),
);
v_runtime_enabled = core_is_not_none(&[v_runtime_from_options.clone()])?;
v_distiller_options = _agent_stage_options(&[
v_state.clone(),
CoreValue::from("distiller"),
v_options.clone(),
])?;
v_executor_options = _agent_stage_options(&[
v_state.clone(),
CoreValue::from("executor"),
v_options.clone(),
])?;
v_responder_options = _agent_stage_options(&[
v_state.clone(),
CoreValue::from("responder"),
v_options.clone(),
])?;
v_distiller_payload = core_none(&[])?;
if core_truthy(&v_runtime_enabled) {
v_distiller_empty_log = CoreValue::new_list();
v_distiller_saved_action_log = core_get(
&v_state,
&CoreValue::from("action_log"),
v_distiller_empty_log.clone(),
);
v_distiller_globals = _agent_runtime_build_globals(&[v_state.clone(), v_values.clone()])?;
v_distiller_session = core_none(&[])?;
v_distiller_max_steps = core_get(
&v_options,
&CoreValue::from("max_actor_steps"),
CoreValue::Num(4f64),
);
v_distiller_step = CoreValue::Num(0f64);
loop {
v_distiller_too_many =
core_gte(&[v_distiller_step.clone(), v_distiller_max_steps.clone()])?;
if core_truthy(&v_distiller_too_many) {
v_distiller_error_event = CoreValue::new_map();
core_set(
&v_distiller_error_event,
CoreValue::from("error"),
CoreValue::from("agent distiller loop exceeded max steps"),
)?;
core_set(
&v_distiller_error_event,
CoreValue::from("stage"),
CoreValue::from("distiller"),
)?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("error"),
v_distiller_error_event.clone(),
])?;
v_distiller_error = core_runtime_error(&[CoreValue::from(
"agent distiller loop exceeded max steps",
)])?;
return Err(core_as_error(&v_distiller_error));
}
v_distiller_values = _build_distiller_inputs(&[v_state.clone(), v_values.clone()])?;
v_distiller_request_event = CoreValue::new_map();
core_set(
&v_distiller_request_event,
CoreValue::from("stage"),
CoreValue::from("distiller"),
)?;
core_set(
&v_distiller_request_event,
CoreValue::from("step"),
v_distiller_step.clone(),
)?;
core_set(
&v_distiller_request_event,
CoreValue::from("values"),
v_distiller_values.clone(),
)?;
core_set(
&v_distiller_request_event,
CoreValue::from("component_id"),
CoreValue::from("agent.stage.distiller"),
)?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("stage_request"),
v_distiller_request_event.clone(),
])?;
v_distiller_output = core_agent_stage_forward(&[
v_distiller.clone(),
v_client.clone(),
v_distiller_values.clone(),
v_distiller_options.clone(),
])?;
v_distiller_response_event = CoreValue::new_map();
core_set(
&v_distiller_response_event,
CoreValue::from("stage"),
CoreValue::from("distiller"),
)?;
core_set(
&v_distiller_response_event,
CoreValue::from("step"),
v_distiller_step.clone(),
)?;
core_set(
&v_distiller_response_event,
CoreValue::from("output"),
v_distiller_output.clone(),
)?;
core_set(
&v_distiller_response_event,
CoreValue::from("component_id"),
CoreValue::from("agent.stage.distiller"),
)?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("stage_response"),
v_distiller_response_event.clone(),
])?;
v_distiller_code =
_extract_agent_runtime_code(&[v_state.clone(), v_distiller_output.clone()])?;
v_distiller_runtime_step = _agent_runtime_execute_step(&[
v_state.clone(),
v_runtime_from_options.clone(),
v_distiller_session.clone(),
v_distiller_code.clone(),
v_options.clone(),
])?;
v_distiller_session = core_get(
&v_state,
&CoreValue::from("runtime_session"),
v_distiller_session.clone(),
);
v_distiller_step_error = core_get(
&v_distiller_runtime_step,
&CoreValue::from("is_error"),
CoreValue::Bool(false),
);
v_distiller_step_ok = core_not(&[v_distiller_step_error.clone()])?;
if core_truthy(&v_distiller_step_ok) {
_agent_runtime_refresh_state_summary(&[
v_state.clone(),
v_distiller_session.clone(),
v_options.clone(),
])?;
}
v_distiller_completion = core_get(
&v_distiller_runtime_step,
&CoreValue::from("completion_payload"),
CoreValue::Null,
);
v_distiller_has_completion =
core_type_is(&v_distiller_completion, CoreValue::from("object"));
if core_truthy(&v_distiller_has_completion) {
v_distiller_payload = v_distiller_completion.clone();
break;
}
v_distiller_step = core_add(&[v_distiller_step.clone(), CoreValue::Num(1f64)])?;
}
v_shared_contract = core_get(
&v_state,
&CoreValue::from("runtime_contract"),
CoreValue::Null,
);
v_shared_js = core_get(
&v_shared_contract,
&CoreValue::from("is_javascript"),
CoreValue::Bool(true),
);
if core_truthy(&v_shared_js) {
core_set(
&v_state,
CoreValue::from("runtime_session"),
v_distiller_session.clone(),
)?;
} else {
v_distiller_session_reset = core_none(&[])?;
core_set(
&v_state,
CoreValue::from("runtime_session"),
v_distiller_session_reset.clone(),
)?;
v_distiller_state_reset = CoreValue::new_map();
core_set(
&v_state,
CoreValue::from("runtime_session_state"),
v_distiller_state_reset.clone(),
)?;
}
core_set(
&v_state,
CoreValue::from("action_log"),
v_distiller_saved_action_log.clone(),
)?;
} else {
v_distiller_values = _build_distiller_inputs(&[v_state.clone(), v_values.clone()])?;
v_distiller_request_event = CoreValue::new_map();
core_set(
&v_distiller_request_event,
CoreValue::from("stage"),
CoreValue::from("distiller"),
)?;
core_set(
&v_distiller_request_event,
CoreValue::from("values"),
v_distiller_values.clone(),
)?;
core_set(
&v_distiller_request_event,
CoreValue::from("component_id"),
CoreValue::from("agent.stage.distiller"),
)?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("stage_request"),
v_distiller_request_event.clone(),
])?;
v_distiller_output = core_agent_stage_forward(&[
v_distiller.clone(),
v_client.clone(),
v_distiller_values.clone(),
v_distiller_options.clone(),
])?;
v_distiller_response_event = CoreValue::new_map();
core_set(
&v_distiller_response_event,
CoreValue::from("stage"),
CoreValue::from("distiller"),
)?;
core_set(
&v_distiller_response_event,
CoreValue::from("output"),
v_distiller_output.clone(),
)?;
core_set(
&v_distiller_response_event,
CoreValue::from("component_id"),
CoreValue::from("agent.stage.distiller"),
)?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("stage_response"),
v_distiller_response_event.clone(),
])?;
v_distiller_payload = _normalize_agent_completion_payload(&[v_distiller_output.clone()])?;
}
_throw_agent_clarification(&[v_distiller_payload.clone(), v_state.clone()])?;
v_executor_payload = core_none(&[])?;
v_distiller_payload_type = core_get(
&v_distiller_payload,
&CoreValue::from("type"),
CoreValue::from(""),
);
v_distiller_is_respond =
core_eq(&[v_distiller_payload_type.clone(), CoreValue::from("respond")])?;
if core_truthy(&v_distiller_is_respond) {
v_skip_empty_map = CoreValue::new_map();
v_skip_policy_flags = core_get(
&v_state,
&CoreValue::from("policy_flags"),
v_skip_empty_map.clone(),
);
v_skip_enabled = core_get(
&v_skip_policy_flags,
&CoreValue::from("directRespondEnabled"),
CoreValue::Bool(true),
);
v_skip_disabled = core_not(&[v_skip_enabled.clone()])?;
if core_truthy(&v_skip_disabled) {
v_skip_error = core_runtime_error(&[CoreValue::from(
"agent distiller produced a respond() payload while directResponse is 'off'",
)])?;
return Err(core_as_error(&v_skip_error));
}
v_skip_args_empty = CoreValue::new_list();
v_skip_args = core_get(
&v_distiller_payload,
&CoreValue::from("args"),
v_skip_args_empty.clone(),
);
v_skip_payload = CoreValue::new_map();
core_set(
&v_skip_payload,
CoreValue::from("type"),
CoreValue::from("final"),
)?;
core_set(
&v_skip_payload,
CoreValue::from("args"),
v_skip_args.clone(),
)?;
v_executor_payload = v_skip_payload.clone();
v_skip_event = CoreValue::new_map();
core_set(
&v_skip_event,
CoreValue::from("stage"),
CoreValue::from("executor"),
)?;
core_set(
&v_skip_event,
CoreValue::from("reason"),
CoreValue::from("direct_respond"),
)?;
core_set(
&v_skip_event,
CoreValue::from("component_id"),
CoreValue::from("agent.stage.executor"),
)?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("stage_skipped"),
v_skip_event.clone(),
])?;
}
v_run_executor = core_not(&[v_distiller_is_respond.clone()])?;
v_runtime_executor_enabled = core_and(&[v_run_executor.clone(), v_runtime_enabled.clone()])?;
if core_truthy(&v_runtime_executor_enabled) {
v_exec_empty_map = CoreValue::new_map();
v_exec_empty_list = CoreValue::new_list();
v_exec_args = core_get(
&v_distiller_payload,
&CoreValue::from("args"),
v_exec_empty_list.clone(),
);
v_exec_non_ctx_split = _split_context_values(&[v_state.clone(), v_values.clone()])?;
v_exec_non_ctx = core_get(
&v_exec_non_ctx_split,
&CoreValue::from("values"),
v_exec_empty_map.clone(),
);
v_exec_fallback_req = core_json_stringify(&[v_exec_non_ctx.clone()])?;
v_exec_req_raw = core_list_get(&[
v_exec_args.clone(),
CoreValue::Num(0f64),
v_exec_fallback_req.clone(),
])?;
v_exec_req_is_string = core_type_is(&v_exec_req_raw, CoreValue::from("string"));
v_exec_req = v_exec_req_raw.clone();
if core_truthy(&v_exec_req_is_string) {
} else {
v_exec_req_coerced =
core_string_format(&[CoreValue::from("{}"), v_exec_req_raw.clone()])?;
v_exec_req = v_exec_req_coerced.clone();
}
v_exec_distilled = core_list_get(&[
v_exec_args.clone(),
CoreValue::Num(1f64),
v_exec_empty_map.clone(),
])?;
v_exec_extras = CoreValue::new_map();
core_set(
&v_exec_extras,
CoreValue::from("executorRequest"),
v_exec_req.clone(),
)?;
core_set(
&v_exec_extras,
CoreValue::from("distilledContext"),
v_exec_distilled.clone(),
)?;
v_exec_runtime_values = core_map_merge(&[v_values.clone(), v_exec_extras.clone()])?;
v_globals =
_agent_runtime_build_globals(&[v_state.clone(), v_exec_runtime_values.clone()])?;
v_session = core_get(
&v_state,
&CoreValue::from("runtime_session"),
CoreValue::Null,
);
v_has_shared_session = core_is_not_none(&[v_session.clone()])?;
if core_truthy(&v_has_shared_session) {
v_patch_snapshot = CoreValue::new_map();
core_set(
&v_patch_snapshot,
CoreValue::from("globals"),
v_globals.clone(),
)?;
_agent_runtime_restore_session_state(&[
v_state.clone(),
v_session.clone(),
v_patch_snapshot.clone(),
v_options.clone(),
])?;
}
v_max_steps = core_get(
&v_options,
&CoreValue::from("max_actor_steps"),
CoreValue::Num(4f64),
);
v_step = CoreValue::Num(0f64);
loop {
v_too_many = core_gte(&[v_step.clone(), v_max_steps.clone()])?;
if core_truthy(&v_too_many) {
v_error_event = CoreValue::new_map();
core_set(
&v_error_event,
CoreValue::from("error"),
CoreValue::from("agent actor loop exceeded max steps"),
)?;
core_set(
&v_error_event,
CoreValue::from("stage"),
CoreValue::from("executor"),
)?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("error"),
v_error_event.clone(),
])?;
v_error =
core_runtime_error(&[CoreValue::from("agent actor loop exceeded max steps")])?;
return Err(core_as_error(&v_error));
}
v_executor_values = _build_executor_inputs(&[
v_state.clone(),
v_values.clone(),
v_distiller_payload.clone(),
])?;
v_executor_request_event = CoreValue::new_map();
core_set(
&v_executor_request_event,
CoreValue::from("stage"),
CoreValue::from("executor"),
)?;
core_set(
&v_executor_request_event,
CoreValue::from("step"),
v_step.clone(),
)?;
core_set(
&v_executor_request_event,
CoreValue::from("values"),
v_executor_values.clone(),
)?;
core_set(
&v_executor_request_event,
CoreValue::from("component_id"),
CoreValue::from("agent.stage.executor"),
)?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("stage_request"),
v_executor_request_event.clone(),
])?;
v_executor_output = core_agent_stage_forward(&[
v_executor.clone(),
v_client.clone(),
v_executor_values.clone(),
v_executor_options.clone(),
])?;
v_executor_response_event = CoreValue::new_map();
core_set(
&v_executor_response_event,
CoreValue::from("stage"),
CoreValue::from("executor"),
)?;
core_set(
&v_executor_response_event,
CoreValue::from("step"),
v_step.clone(),
)?;
core_set(
&v_executor_response_event,
CoreValue::from("output"),
v_executor_output.clone(),
)?;
core_set(
&v_executor_response_event,
CoreValue::from("component_id"),
CoreValue::from("agent.stage.executor"),
)?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("stage_response"),
v_executor_response_event.clone(),
])?;
v_code = _extract_agent_runtime_code(&[v_state.clone(), v_executor_output.clone()])?;
v_runtime_step = _agent_runtime_execute_step(&[
v_state.clone(),
v_runtime_from_options.clone(),
v_session.clone(),
v_code.clone(),
v_options.clone(),
])?;
v_session = core_get(
&v_state,
&CoreValue::from("runtime_session"),
v_session.clone(),
);
v_exec_step_error = core_get(
&v_runtime_step,
&CoreValue::from("is_error"),
CoreValue::Bool(false),
);
v_exec_step_ok = core_not(&[v_exec_step_error.clone()])?;
if core_truthy(&v_exec_step_ok) {
_agent_runtime_refresh_state_summary(&[
v_state.clone(),
v_session.clone(),
v_options.clone(),
])?;
}
v_completion_payload = core_get(
&v_runtime_step,
&CoreValue::from("completion_payload"),
CoreValue::Null,
);
v_has_completion = core_type_is(&v_completion_payload, CoreValue::from("object"));
if core_truthy(&v_has_completion) {
v_executor_completion_type = core_get(
&v_completion_payload,
&CoreValue::from("type"),
CoreValue::from(""),
);
v_executor_completion_is_respond = core_eq(&[
v_executor_completion_type.clone(),
CoreValue::from("respond"),
])?;
if core_truthy(&v_executor_completion_is_respond) {
core_set(
&v_completion_payload,
CoreValue::from("type"),
CoreValue::from("final"),
)?;
}
_throw_agent_clarification(&[v_completion_payload.clone(), v_state.clone()])?;
v_executor_payload = v_completion_payload.clone();
break;
}
v_step = core_add(&[v_step.clone(), CoreValue::Num(1f64)])?;
}
}
v_runtime_disabled = core_not(&[v_runtime_enabled.clone()])?;
v_non_runtime_executor = core_and(&[v_run_executor.clone(), v_runtime_disabled.clone()])?;
if core_truthy(&v_non_runtime_executor) {
v_executor_values = _build_executor_inputs(&[
v_state.clone(),
v_values.clone(),
v_distiller_payload.clone(),
])?;
v_executor_request_event = CoreValue::new_map();
core_set(
&v_executor_request_event,
CoreValue::from("stage"),
CoreValue::from("executor"),
)?;
core_set(
&v_executor_request_event,
CoreValue::from("values"),
v_executor_values.clone(),
)?;
core_set(
&v_executor_request_event,
CoreValue::from("component_id"),
CoreValue::from("agent.stage.executor"),
)?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("stage_request"),
v_executor_request_event.clone(),
])?;
v_executor_output = core_agent_stage_forward(&[
v_executor.clone(),
v_client.clone(),
v_executor_values.clone(),
v_executor_options.clone(),
])?;
v_executor_response_event = CoreValue::new_map();
core_set(
&v_executor_response_event,
CoreValue::from("stage"),
CoreValue::from("executor"),
)?;
core_set(
&v_executor_response_event,
CoreValue::from("output"),
v_executor_output.clone(),
)?;
core_set(
&v_executor_response_event,
CoreValue::from("component_id"),
CoreValue::from("agent.stage.executor"),
)?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("stage_response"),
v_executor_response_event.clone(),
])?;
v_executor_payload = _normalize_agent_completion_payload(&[v_executor_output.clone()])?;
_throw_agent_clarification(&[v_executor_payload.clone(), v_state.clone()])?;
v_executor_payload_type = core_get(
&v_executor_payload,
&CoreValue::from("type"),
CoreValue::from(""),
);
v_executor_payload_is_respond =
core_eq(&[v_executor_payload_type.clone(), CoreValue::from("respond")])?;
if core_truthy(&v_executor_payload_is_respond) {
core_set(
&v_executor_payload,
CoreValue::from("type"),
CoreValue::from("final"),
)?;
}
}
_agent_apply_llm_checkpoint_summary(&[v_state.clone(), v_client.clone(), v_options.clone()])?;
_agent_apply_context_management(&[v_state.clone()])?;
_agent_apply_llm_tombstone_summary(&[v_state.clone(), v_client.clone(), v_options.clone()])?;
_agent_evolve_context_map(&[v_state.clone(), v_client.clone(), v_options.clone()])?;
v_responder_values = _build_responder_inputs(&[
v_state.clone(),
v_values.clone(),
v_executor_payload.clone(),
])?;
v_responder_request_event = CoreValue::new_map();
core_set(
&v_responder_request_event,
CoreValue::from("stage"),
CoreValue::from("responder"),
)?;
core_set(
&v_responder_request_event,
CoreValue::from("values"),
v_responder_values.clone(),
)?;
core_set(
&v_responder_request_event,
CoreValue::from("component_id"),
CoreValue::from("agent.stage.responder"),
)?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("stage_request"),
v_responder_request_event.clone(),
])?;
v_responder_output = core_agent_stage_forward(&[
v_responder.clone(),
v_client.clone(),
v_responder_values.clone(),
v_responder_options.clone(),
])?;
v_responder_response_event = CoreValue::new_map();
core_set(
&v_responder_response_event,
CoreValue::from("stage"),
CoreValue::from("responder"),
)?;
core_set(
&v_responder_response_event,
CoreValue::from("output"),
v_responder_output.clone(),
)?;
core_set(
&v_responder_response_event,
CoreValue::from("component_id"),
CoreValue::from("agent.stage.responder"),
)?;
_agent_record_trace_event(&[
v_state.clone(),
CoreValue::from("stage_response"),
v_responder_response_event.clone(),
])?;
v_logs = _merge_agent_chat_log(&[
v_state.clone(),
v_distiller.clone(),
v_executor.clone(),
v_responder.clone(),
])?;
v_usage = _merge_agent_usage(&[v_state.clone()])?;
core_set(
&v_state,
CoreValue::from("last_output"),
v_responder_output.clone(),
)?;
core_set(&v_state, CoreValue::from("chat_log"), v_logs.clone())?;
core_set(&v_state, CoreValue::from("usage"), v_usage.clone())?;
_agent_finalize_trace(&[
v_state.clone(),
CoreValue::from("completed"),
v_responder_output.clone(),
])?;
return Ok(v_responder_output.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_factory(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_factory");
let mut v_options = core_arg(args, 0);
let mut v_chat_log = CoreValue::Null;
let mut v_demos = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_id = CoreValue::Null;
let mut v_opts = CoreValue::Null;
let mut v_opts_missing = CoreValue::Null;
let mut v_state = CoreValue::Null;
let mut v_steps = CoreValue::Null;
let mut v_traces = CoreValue::Null;
let mut v_usage = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_empty_list = CoreValue::new_list();
v_opts_missing = core_is_none(&[v_options.clone()])?;
v_opts = v_options.clone();
if core_truthy(&v_opts_missing) {
v_opts = v_empty_map.clone();
}
v_steps = CoreValue::new_list();
v_traces = CoreValue::new_list();
v_chat_log = CoreValue::new_list();
v_usage = CoreValue::new_map();
v_demos = CoreValue::new_map();
v_state = CoreValue::new_map();
v_id = core_get(
&v_opts,
&CoreValue::from("id"),
CoreValue::from("root.flow"),
);
core_set(
&v_state,
CoreValue::from("program_kind"),
CoreValue::from("axflow"),
)?;
core_set(&v_state, CoreValue::from("program_id"), v_id.clone())?;
core_set(&v_state, CoreValue::from("options"), v_opts.clone())?;
core_set(&v_state, CoreValue::from("steps"), v_steps.clone())?;
core_set(&v_state, CoreValue::from("returns"), v_empty_map.clone())?;
core_set(&v_state, CoreValue::from("demos"), v_demos.clone())?;
core_set(&v_state, CoreValue::from("traces"), v_traces.clone())?;
core_set(&v_state, CoreValue::from("chat_log"), v_chat_log.clone())?;
core_set(&v_state, CoreValue::from("usage"), v_usage.clone())?;
return Ok(v_state.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _program_descriptor(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_program_descriptor");
let mut v_kind = core_arg(args, 0);
let mut v_id = core_arg(args, 1);
let mut v_metadata = core_arg(args, 2);
let mut v_empty_map = CoreValue::Null;
let mut v_meta = CoreValue::Null;
let mut v_meta_missing = CoreValue::Null;
let mut v_out = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_meta_missing = core_is_none(&[v_metadata.clone()])?;
v_meta = v_metadata.clone();
if core_truthy(&v_meta_missing) {
v_meta = v_empty_map.clone();
}
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("kind"), v_kind.clone())?;
core_set(&v_out, CoreValue::from("id"), v_id.clone())?;
core_set(&v_out, CoreValue::from("metadata"), v_meta.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _program_trace_event(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_program_trace_event");
let mut v_program_id = core_arg(args, 0);
let mut v_kind = core_arg(args, 1);
let mut v_payload = core_arg(args, 2);
let mut v_data = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_event = CoreValue::Null;
let mut v_payload_missing = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_payload_missing = core_is_none(&[v_payload.clone()])?;
v_data = v_payload.clone();
if core_truthy(&v_payload_missing) {
v_data = v_empty_map.clone();
}
v_event = CoreValue::new_map();
core_set(&v_event, CoreValue::from("programId"), v_program_id.clone())?;
core_set(&v_event, CoreValue::from("kind"), v_kind.clone())?;
core_set(&v_event, CoreValue::from("payload"), v_data.clone())?;
return Ok(v_event.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_step(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_step");
let mut v_kind = core_arg(args, 0);
let mut v_name = core_arg(args, 1);
let mut v_program = core_arg(args, 2);
let mut v_options = core_arg(args, 3);
let mut v_barrier = CoreValue::Null;
let mut v_barrier_from_camel = CoreValue::Null;
let mut v_barrier_from_snake = CoreValue::Null;
let mut v_default_barrier = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_err = CoreValue::Null;
let mut v_execute_write = CoreValue::Null;
let mut v_is_derive = CoreValue::Null;
let mut v_is_execute = CoreValue::Null;
let mut v_is_parallel = CoreValue::Null;
let mut v_is_parallel_merge = CoreValue::Null;
let mut v_may_parallel = CoreValue::Null;
let mut v_missing_name = CoreValue::Null;
let mut v_opts = CoreValue::Null;
let mut v_opts_missing = CoreValue::Null;
let mut v_reads = CoreValue::Null;
let mut v_reads_empty = CoreValue::Null;
let mut v_step = CoreValue::Null;
let mut v_trimmed = CoreValue::Null;
let mut v_writes = CoreValue::Null;
let mut v_writes_default = CoreValue::Null;
v_trimmed = core_string_trim(&v_name);
v_missing_name = core_eq(&[v_trimmed.clone(), CoreValue::from("")])?;
if core_truthy(&v_missing_name) {
v_err = core_runtime_error(&[CoreValue::from("flow step name is required")])?;
return Err(core_as_error(&v_err));
}
v_empty_map = CoreValue::new_map();
v_opts_missing = core_is_none(&[v_options.clone()])?;
v_opts = v_options.clone();
if core_truthy(&v_opts_missing) {
v_opts = v_empty_map.clone();
}
v_step = CoreValue::new_map();
core_set(&v_step, CoreValue::from("kind"), v_kind.clone())?;
core_set(&v_step, CoreValue::from("name"), v_trimmed.clone())?;
core_set(&v_step, CoreValue::from("nodeName"), v_trimmed.clone())?;
core_set(&v_step, CoreValue::from("program"), v_program.clone())?;
core_set(&v_step, CoreValue::from("options"), v_opts.clone())?;
v_reads_empty = CoreValue::new_list();
v_reads = core_get(&v_opts, &CoreValue::from("reads"), v_reads_empty.clone());
v_writes_default = CoreValue::new_list();
v_is_execute = core_eq(&[v_kind.clone(), CoreValue::from("execute")])?;
v_is_derive = core_eq(&[v_kind.clone(), CoreValue::from("derive")])?;
v_is_parallel = core_eq(&[v_kind.clone(), CoreValue::from("parallel")])?;
v_is_parallel_merge = core_eq(&[v_kind.clone(), CoreValue::from("parallelMerge")])?;
if core_truthy(&v_is_execute) {
v_execute_write = core_string_format(&[CoreValue::from("{}Result"), v_trimmed.clone()])?;
core_append(&v_writes_default, v_execute_write.clone())?;
}
if core_truthy(&v_is_derive) {
core_append(&v_writes_default, v_trimmed.clone())?;
}
if core_truthy(&v_is_parallel) {
core_append(&v_writes_default, CoreValue::from("_parallelResults"))?;
}
if core_truthy(&v_is_parallel_merge) {
core_append(&v_writes_default, v_trimmed.clone())?;
}
v_writes = core_get(
&v_opts,
&CoreValue::from("writes"),
v_writes_default.clone(),
);
v_default_barrier = CoreValue::Bool(true);
v_may_parallel = core_or(&[v_is_execute.clone(), v_is_derive.clone()])?;
if core_truthy(&v_may_parallel) {
v_default_barrier = CoreValue::Bool(false);
}
v_barrier_from_snake = core_get(
&v_opts,
&CoreValue::from("is_barrier"),
v_default_barrier.clone(),
);
v_barrier_from_camel = core_get(
&v_opts,
&CoreValue::from("isBarrier"),
v_barrier_from_snake.clone(),
);
v_barrier = core_get(
&v_opts,
&CoreValue::from("barrier"),
v_barrier_from_camel.clone(),
);
core_set(&v_step, CoreValue::from("reads"), v_reads.clone())?;
core_set(&v_step, CoreValue::from("writes"), v_writes.clone())?;
core_set(&v_step, CoreValue::from("isBarrier"), v_barrier.clone())?;
return Ok(v_step.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _program_child_component_prefix(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_program_child_component_prefix");
let mut v_owner = core_arg(args, 0);
let mut v_node = core_arg(args, 1);
let mut v_path = CoreValue::Null;
v_path = core_string_format(&[CoreValue::from("{}.{}::"), v_owner.clone(), v_node.clone()])?;
return Ok(v_path.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _program_prefix_component(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_program_prefix_component");
let mut v_component = core_arg(args, 0);
let mut v_owner = core_arg(args, 1);
let mut v_node = core_arg(args, 2);
let mut v_child = CoreValue::Null;
let mut v_child_id = CoreValue::Null;
let mut v_child_owner = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_prefixed_id = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_child = core_map_merge(&[v_empty_map.clone(), v_component.clone()])?;
v_child_owner =
core_string_format(&[CoreValue::from("{}.{}"), v_owner.clone(), v_node.clone()])?;
v_child_id = core_get(&v_component, &CoreValue::from("id"), CoreValue::from(""));
v_prefixed_id = core_string_format(&[
CoreValue::from("{}::{}"),
v_child_owner.clone(),
v_child_id.clone(),
])?;
core_set(&v_child, CoreValue::from("owner"), v_child_owner.clone())?;
core_set(&v_child, CoreValue::from("id"), v_prefixed_id.clone())?;
return Ok(v_child.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _program_slice_component_map(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_program_slice_component_map");
let mut v_component_map = core_arg(args, 0);
let mut v_prefix = core_arg(args, 1);
let mut v_key = CoreValue::Null;
let mut v_keys = CoreValue::Null;
let mut v_matches = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_prefix_len = CoreValue::Null;
let mut v_short_key = CoreValue::Null;
let mut v_value = CoreValue::Null;
v_out = CoreValue::new_map();
v_keys = core_map_keys(&[v_component_map.clone()])?;
for v_key in core_iter(&v_keys)? {
let mut v_key = v_key;
v_matches = core_string_starts_with(&[v_key.clone(), v_prefix.clone()])?;
if core_truthy(&v_matches) {
v_prefix_len = core_len(&[v_prefix.clone()])?;
v_short_key = core_string_slice(&[v_key.clone(), v_prefix_len.clone()])?;
v_value = core_get(&v_component_map, &v_key.clone(), CoreValue::Null);
core_set(&v_out, v_short_key.clone(), v_value.clone())?;
}
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_add_step(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_add_step");
let mut v_flow = core_arg(args, 0);
let mut v_step = core_arg(args, 1);
let mut v_duplicate = CoreValue::Null;
let mut v_err = CoreValue::Null;
let mut v_existing = CoreValue::Null;
let mut v_existing_name = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_steps = CoreValue::Null;
v_steps = core_get(&v_flow, &CoreValue::from("steps"), CoreValue::Null);
v_name = core_get(&v_step, &CoreValue::from("name"), CoreValue::from(""));
for v_existing in core_iter(&v_steps)? {
let mut v_existing = v_existing;
v_existing_name = core_get(&v_existing, &CoreValue::from("name"), CoreValue::from(""));
v_duplicate = core_eq(&[v_existing_name.clone(), v_name.clone()])?;
if core_truthy(&v_duplicate) {
v_message =
core_string_format(&[CoreValue::from("duplicate flow step: {}"), v_name.clone()])?;
v_err = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_err));
}
}
core_append(&v_steps, v_step.clone())?;
core_set(&v_flow, CoreValue::from("steps"), v_steps.clone())?;
return Ok(v_flow.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_set_returns(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_set_returns");
let mut v_flow = core_arg(args, 0);
let mut v_returns = core_arg(args, 1);
let mut v_empty_map = CoreValue::Null;
let mut v_missing = CoreValue::Null;
let mut v_spec = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_missing = core_is_none(&[v_returns.clone()])?;
v_spec = v_returns.clone();
if core_truthy(&v_missing) {
v_spec = v_empty_map.clone();
}
core_set(&v_flow, CoreValue::from("returns"), v_spec.clone())?;
return Ok(v_flow.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_plan_entry(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_plan_entry");
let mut v_step = core_arg(args, 0);
let mut v_step_index = core_arg(args, 1);
let mut v_barrier = CoreValue::Null;
let mut v_barrier_camel = CoreValue::Null;
let mut v_barrier_snake = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_kind = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_reads = CoreValue::Null;
let mut v_writes = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_kind = core_get(
&v_step,
&CoreValue::from("kind"),
CoreValue::from("execute"),
);
v_name = core_get(&v_step, &CoreValue::from("name"), CoreValue::from(""));
v_reads = core_get(&v_step, &CoreValue::from("reads"), v_empty_list.clone());
v_writes = core_get(&v_step, &CoreValue::from("writes"), v_empty_list.clone());
v_barrier_snake = core_get(
&v_step,
&CoreValue::from("is_barrier"),
CoreValue::Bool(false),
);
v_barrier_camel = core_get(
&v_step,
&CoreValue::from("isBarrier"),
v_barrier_snake.clone(),
);
v_barrier = core_get(
&v_step,
&CoreValue::from("barrier"),
v_barrier_camel.clone(),
);
v_entry = CoreValue::new_map();
core_set(&v_entry, CoreValue::from("name"), v_name.clone())?;
core_set(&v_entry, CoreValue::from("kind"), v_kind.clone())?;
core_set(&v_entry, CoreValue::from("reads"), v_reads.clone())?;
core_set(&v_entry, CoreValue::from("writes"), v_writes.clone())?;
core_set(&v_entry, CoreValue::from("barrier"), v_barrier.clone())?;
core_set(&v_entry, CoreValue::from("stepIndex"), v_step_index.clone())?;
return Ok(v_entry.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_plan_can_share_group(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_plan_can_share_group");
let mut v_group = core_arg(args, 0);
let mut v_candidate = core_arg(args, 1);
let mut v_can_share = CoreValue::Null;
let mut v_candidate_barrier = CoreValue::Null;
let mut v_candidate_reads = CoreValue::Null;
let mut v_candidate_writes = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_existing = CoreValue::Null;
let mut v_existing_barrier = CoreValue::Null;
let mut v_existing_read = CoreValue::Null;
let mut v_existing_reads = CoreValue::Null;
let mut v_existing_writes = CoreValue::Null;
let mut v_no_writes = CoreValue::Null;
let mut v_read = CoreValue::Null;
let mut v_read_conflict = CoreValue::Null;
let mut v_reverse_read_conflict = CoreValue::Null;
let mut v_write = CoreValue::Null;
let mut v_write_conflict = CoreValue::Null;
let mut v_write_count = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_candidate_barrier = core_get(
&v_candidate,
&CoreValue::from("barrier"),
CoreValue::Bool(true),
);
v_candidate_writes = core_get(
&v_candidate,
&CoreValue::from("writes"),
v_empty_list.clone(),
);
v_candidate_reads = core_get(
&v_candidate,
&CoreValue::from("reads"),
v_empty_list.clone(),
);
v_write_count = core_len(&[v_candidate_writes.clone()])?;
v_no_writes = core_eq(&[v_write_count.clone(), CoreValue::Num(0f64)])?;
v_can_share = CoreValue::Bool(true);
if core_truthy(&v_candidate_barrier) {
v_can_share = CoreValue::Bool(false);
}
if core_truthy(&v_no_writes) {
v_can_share = CoreValue::Bool(false);
}
for v_existing in core_iter(&v_group)? {
let mut v_existing = v_existing;
v_existing_barrier = core_get(
&v_existing,
&CoreValue::from("barrier"),
CoreValue::Bool(true),
);
if core_truthy(&v_existing_barrier) {
v_can_share = CoreValue::Bool(false);
}
v_existing_writes = core_get(
&v_existing,
&CoreValue::from("writes"),
v_empty_list.clone(),
);
v_existing_reads = core_get(&v_existing, &CoreValue::from("reads"), v_empty_list.clone());
for v_read in core_iter(&v_candidate_reads)? {
let mut v_read = v_read;
v_read_conflict = core_contains(&[v_existing_writes.clone(), v_read.clone()])?;
if core_truthy(&v_read_conflict) {
v_can_share = CoreValue::Bool(false);
}
}
for v_existing_read in core_iter(&v_existing_reads)? {
let mut v_existing_read = v_existing_read;
v_reverse_read_conflict =
core_contains(&[v_candidate_writes.clone(), v_existing_read.clone()])?;
if core_truthy(&v_reverse_read_conflict) {
v_can_share = CoreValue::Bool(false);
}
}
for v_write in core_iter(&v_candidate_writes)? {
let mut v_write = v_write;
v_write_conflict = core_contains(&[v_existing_writes.clone(), v_write.clone()])?;
if core_truthy(&v_write_conflict) {
v_can_share = CoreValue::Bool(false);
}
}
}
return Ok(v_can_share.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_plan(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_plan");
let mut v_flow = core_arg(args, 0);
let mut v_barrier = CoreValue::Null;
let mut v_bigger = CoreValue::Null;
let mut v_can_add = CoreValue::Null;
let mut v_current_count = CoreValue::Null;
let mut v_current_group = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_group = CoreValue::Null;
let mut v_group_count = CoreValue::Null;
let mut v_group_steps = CoreValue::Null;
let mut v_groups = CoreValue::Null;
let mut v_has_current = CoreValue::Null;
let mut v_has_remaining = CoreValue::Null;
let mut v_has_returns = CoreValue::Null;
let mut v_level = CoreValue::Null;
let mut v_max_parallelism = CoreValue::Null;
let mut v_next_step_index = CoreValue::Null;
let mut v_parallel_groups = CoreValue::Null;
let mut v_plan = CoreValue::Null;
let mut v_plan_step = CoreValue::Null;
let mut v_plan_steps = CoreValue::Null;
let mut v_remaining_count = CoreValue::Null;
let mut v_return_next_step_index = CoreValue::Null;
let mut v_return_reads = CoreValue::Null;
let mut v_return_writes = CoreValue::Null;
let mut v_returns = CoreValue::Null;
let mut v_returns_entry = CoreValue::Null;
let mut v_single_group = CoreValue::Null;
let mut v_single_level = CoreValue::Null;
let mut v_single_steps = CoreValue::Null;
let mut v_step = CoreValue::Null;
let mut v_step_index = CoreValue::Null;
let mut v_steps = CoreValue::Null;
let mut v_total_steps = CoreValue::Null;
v_steps = core_get(&v_flow, &CoreValue::from("steps"), CoreValue::Null);
v_plan_steps = CoreValue::new_list();
v_step_index = CoreValue::Num(0f64);
for v_step in core_iter(&v_steps)? {
let mut v_step = v_step;
v_entry = _flow_plan_entry(&[v_step.clone(), v_step_index.clone()])?;
core_append(&v_plan_steps, v_entry.clone())?;
v_next_step_index = core_add(&[v_step_index.clone(), CoreValue::Num(1f64)])?;
v_step_index = v_next_step_index.clone();
}
v_empty_map = CoreValue::new_map();
v_returns = core_get(&v_flow, &CoreValue::from("returns"), v_empty_map.clone());
v_has_returns = core_truthy_value(&[v_returns.clone()])?;
if core_truthy(&v_has_returns) {
v_return_reads = CoreValue::new_list();
v_return_writes = CoreValue::new_list();
v_returns_entry = CoreValue::new_map();
core_set(
&v_returns_entry,
CoreValue::from("name"),
CoreValue::from("returns"),
)?;
core_set(
&v_returns_entry,
CoreValue::from("kind"),
CoreValue::from("returns"),
)?;
core_set(
&v_returns_entry,
CoreValue::from("reads"),
v_return_reads.clone(),
)?;
core_set(
&v_returns_entry,
CoreValue::from("writes"),
v_return_writes.clone(),
)?;
core_set(
&v_returns_entry,
CoreValue::from("barrier"),
CoreValue::Bool(true),
)?;
core_set(
&v_returns_entry,
CoreValue::from("stepIndex"),
v_step_index.clone(),
)?;
core_append(&v_plan_steps, v_returns_entry.clone())?;
v_return_next_step_index = core_add(&[v_step_index.clone(), CoreValue::Num(1f64)])?;
v_step_index = v_return_next_step_index.clone();
}
v_groups = CoreValue::new_list();
v_current_group = CoreValue::new_list();
for v_plan_step in core_iter(&v_plan_steps)? {
let mut v_plan_step = v_plan_step;
v_barrier = core_get(
&v_plan_step,
&CoreValue::from("barrier"),
CoreValue::Bool(true),
);
v_current_count = core_len(&[v_current_group.clone()])?;
v_has_current = core_gt(&[v_current_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_barrier) {
if core_truthy(&v_has_current) {
v_group = CoreValue::new_map();
v_level = core_len(&[v_groups.clone()])?;
core_set(&v_group, CoreValue::from("level"), v_level.clone())?;
core_set(&v_group, CoreValue::from("steps"), v_current_group.clone())?;
core_append(&v_groups, v_group.clone())?;
v_current_group = CoreValue::new_list();
}
v_single_steps = CoreValue::new_list();
core_append(&v_single_steps, v_plan_step.clone())?;
v_single_group = CoreValue::new_map();
v_single_level = core_len(&[v_groups.clone()])?;
core_set(
&v_single_group,
CoreValue::from("level"),
v_single_level.clone(),
)?;
core_set(
&v_single_group,
CoreValue::from("steps"),
v_single_steps.clone(),
)?;
core_append(&v_groups, v_single_group.clone())?;
} else {
v_can_add = CoreValue::Bool(true);
if core_truthy(&v_has_current) {
v_can_add =
_flow_plan_can_share_group(&[v_current_group.clone(), v_plan_step.clone()])?;
}
if core_truthy(&v_can_add) {
core_append(&v_current_group, v_plan_step.clone())?;
} else {
v_group = CoreValue::new_map();
v_level = core_len(&[v_groups.clone()])?;
core_set(&v_group, CoreValue::from("level"), v_level.clone())?;
core_set(&v_group, CoreValue::from("steps"), v_current_group.clone())?;
core_append(&v_groups, v_group.clone())?;
v_current_group = CoreValue::new_list();
core_append(&v_current_group, v_plan_step.clone())?;
}
}
}
v_remaining_count = core_len(&[v_current_group.clone()])?;
v_has_remaining = core_gt(&[v_remaining_count.clone(), CoreValue::Num(0f64)])?;
if core_truthy(&v_has_remaining) {
v_group = CoreValue::new_map();
v_level = core_len(&[v_groups.clone()])?;
core_set(&v_group, CoreValue::from("level"), v_level.clone())?;
core_set(&v_group, CoreValue::from("steps"), v_current_group.clone())?;
core_append(&v_groups, v_group.clone())?;
}
v_max_parallelism = CoreValue::Num(1f64);
for v_group in core_iter(&v_groups)? {
let mut v_group = v_group;
v_group_steps = core_get(&v_group, &CoreValue::from("steps"), CoreValue::Null);
v_group_count = core_len(&[v_group_steps.clone()])?;
v_bigger = core_gt(&[v_group_count.clone(), v_max_parallelism.clone()])?;
if core_truthy(&v_bigger) {
v_max_parallelism = v_group_count.clone();
}
}
v_plan = CoreValue::new_map();
v_total_steps = core_len(&[v_plan_steps.clone()])?;
v_parallel_groups = core_len(&[v_groups.clone()])?;
core_set(
&v_plan,
CoreValue::from("totalSteps"),
v_total_steps.clone(),
)?;
core_set(
&v_plan,
CoreValue::from("parallelGroups"),
v_parallel_groups.clone(),
)?;
core_set(
&v_plan,
CoreValue::from("maxParallelism"),
v_max_parallelism.clone(),
)?;
core_set(&v_plan, CoreValue::from("steps"), v_plan_steps.clone())?;
core_set(&v_plan, CoreValue::from("groups"), v_groups.clone())?;
return Ok(v_plan.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_cache_key(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_cache_key");
let mut v_values = core_arg(args, 0);
let mut v_key = CoreValue::Null;
v_key = core_json_stable_stringify(&[v_values.clone()])?;
return Ok(v_key.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_cache_read_write(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_cache_read_write");
let mut v_flow = core_arg(args, 0);
let mut v_values = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_mode = core_arg(args, 3);
let mut v_cached_value = core_arg(args, 4);
let mut v_cached = CoreValue::Null;
let mut v_can_read_store = CoreValue::Null;
let mut v_can_write_store = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_has_store = CoreValue::Null;
let mut v_hit = CoreValue::Null;
let mut v_is_read = CoreValue::Null;
let mut v_is_write = CoreValue::Null;
let mut v_key = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_opts = CoreValue::Null;
let mut v_opts_missing = CoreValue::Null;
let mut v_read_error = CoreValue::Null;
let mut v_read_error_snake = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_skip_read = CoreValue::Null;
let mut v_skip_write = CoreValue::Null;
let mut v_store = CoreValue::Null;
let mut v_store_snake = CoreValue::Null;
let mut v_write_error = CoreValue::Null;
let mut v_write_error_snake = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_opts_missing = core_is_none(&[v_options.clone()])?;
v_opts = v_options.clone();
if core_truthy(&v_opts_missing) {
v_opts = v_empty_map.clone();
}
v_key = _flow_cache_key(&[v_values.clone()])?;
v_store_snake = core_get(&v_opts, &CoreValue::from("cache_store"), CoreValue::Null);
v_store = core_get(
&v_opts,
&CoreValue::from("cacheStore"),
v_store_snake.clone(),
);
v_has_store = core_is_not_none(&[v_store.clone()])?;
v_read_error_snake = core_get(
&v_opts,
&CoreValue::from("cache_read_error"),
CoreValue::Bool(false),
);
v_read_error = core_get(
&v_opts,
&CoreValue::from("cacheReadError"),
v_read_error_snake.clone(),
);
v_write_error_snake = core_get(
&v_opts,
&CoreValue::from("cache_write_error"),
CoreValue::Bool(false),
);
v_write_error = core_get(
&v_opts,
&CoreValue::from("cacheWriteError"),
v_write_error_snake.clone(),
);
v_is_read = core_eq(&[v_mode.clone(), CoreValue::from("read")])?;
v_is_write = core_eq(&[v_mode.clone(), CoreValue::from("write")])?;
v_none = core_none(&[])?;
v_result = CoreValue::new_map();
core_set(&v_result, CoreValue::from("key"), v_key.clone())?;
core_set(&v_result, CoreValue::from("hit"), CoreValue::Bool(false))?;
core_set(&v_result, CoreValue::from("value"), v_none.clone())?;
if core_truthy(&v_is_read) {
v_can_read_store = core_and(&[v_has_store.clone(), v_read_error.clone()])?;
v_skip_read = core_truthy_value(&[v_can_read_store.clone()])?;
if core_truthy(&v_skip_read) {
} else {
if core_truthy(&v_has_store) {
v_cached = core_get(&v_store, &v_key.clone(), CoreValue::Null);
v_hit = core_is_not_none(&[v_cached.clone()])?;
if core_truthy(&v_hit) {
core_set(&v_result, CoreValue::from("hit"), CoreValue::Bool(true))?;
core_set(&v_result, CoreValue::from("value"), v_cached.clone())?;
}
}
}
}
if core_truthy(&v_is_write) {
v_can_write_store = core_and(&[v_has_store.clone(), v_write_error.clone()])?;
v_skip_write = core_truthy_value(&[v_can_write_store.clone()])?;
if core_truthy(&v_skip_write) {
} else {
if core_truthy(&v_has_store) {
core_set(&v_store, v_key.clone(), v_cached_value.clone())?;
core_set(&v_result, CoreValue::from("value"), v_cached_value.clone())?;
}
}
}
return Ok(v_result.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_check_abort(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_check_abort");
let mut v_options = core_arg(args, 0);
let mut v_location = core_arg(args, 1);
let mut v_abort = CoreValue::Null;
let mut v_abort_camel = CoreValue::Null;
let mut v_abort_snake = CoreValue::Null;
let mut v_aborted = CoreValue::Null;
let mut v_err = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_none = CoreValue::Null;
v_none = core_none(&[])?;
v_abort_snake = core_get(
&v_options,
&CoreValue::from("abort_before_step"),
CoreValue::Bool(false),
);
v_abort_camel = core_get(
&v_options,
&CoreValue::from("abortBeforeStep"),
v_abort_snake.clone(),
);
v_aborted = core_get(
&v_options,
&CoreValue::from("aborted"),
v_abort_camel.clone(),
);
v_abort = core_get(&v_options, &CoreValue::from("abort"), v_aborted.clone());
if core_truthy(&v_abort) {
v_message =
core_string_format(&[CoreValue::from("Flow aborted at {}"), v_location.clone()])?;
v_err = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_err));
}
return Ok(v_none.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_project_returns(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_project_returns");
let mut v_state = core_arg(args, 0);
let mut v_returns = core_arg(args, 1);
let mut v_empty_map = CoreValue::Null;
let mut v_has_returns = CoreValue::Null;
let mut v_key = CoreValue::Null;
let mut v_keys = CoreValue::Null;
let mut v_missing = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_path = CoreValue::Null;
let mut v_projected = CoreValue::Null;
let mut v_spec = CoreValue::Null;
let mut v_value = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_spec = v_returns.clone();
v_missing = core_is_none(&[v_returns.clone()])?;
if core_truthy(&v_missing) {
v_spec = v_empty_map.clone();
}
v_has_returns = core_truthy_value(&[v_spec.clone()])?;
v_output = v_state.clone();
if core_truthy(&v_has_returns) {
v_projected = CoreValue::new_map();
v_keys = core_map_keys(&[v_spec.clone()])?;
for v_key in core_iter(&v_keys)? {
let mut v_key = v_key;
v_path = core_get(&v_spec, &v_key.clone(), CoreValue::Null);
v_value = _flow_get_path(&[v_state.clone(), v_path.clone()])?;
core_set(&v_projected, v_key.clone(), v_value.clone())?;
}
v_output = v_projected.clone();
}
return Ok(v_output.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_get_path(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_get_path");
let mut v_state = core_arg(args, 0);
let mut v_path = core_arg(args, 1);
let mut v_current = CoreValue::Null;
let mut v_is_object = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_part = CoreValue::Null;
let mut v_parts = CoreValue::Null;
let mut v_path_text = CoreValue::Null;
v_none = core_none(&[])?;
v_path_text = core_string_str(&[v_path.clone()])?;
v_parts = core_string_split(&[v_path_text.clone(), CoreValue::from(".")])?;
v_current = v_state.clone();
for v_part in core_iter(&v_parts)? {
let mut v_part = v_part;
v_is_object = core_type_is(&v_current, CoreValue::from("object"));
if core_truthy(&v_is_object) {
v_current = core_get(&v_current, &v_part.clone(), v_none.clone());
} else {
v_current = v_none.clone();
}
}
return Ok(v_current.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_record_child_chat_log(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_record_child_chat_log");
let mut v_flow = core_arg(args, 0);
let mut v_node = core_arg(args, 1);
let mut v_program = core_arg(args, 2);
let mut v_chat_log = CoreValue::Null;
let mut v_child_log = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_entry_name = CoreValue::Null;
let mut v_has_entry_name = CoreValue::Null;
let mut v_prefixed_entry_name = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_chat_log = core_get(&v_flow, &CoreValue::from("chat_log"), v_empty_list.clone());
v_child_log = core_agent_stage_chat_log(&[v_program.clone()])?;
for v_entry in core_iter(&v_child_log)? {
let mut v_entry = v_entry;
v_entry_name = core_get(&v_entry, &CoreValue::from("name"), CoreValue::from(""));
v_has_entry_name = core_truthy_value(&[v_entry_name.clone()])?;
if core_truthy(&v_has_entry_name) {
v_prefixed_entry_name = core_string_format(&[
CoreValue::from("{}.{}"),
v_node.clone(),
v_entry_name.clone(),
])?;
core_set(
&v_entry,
CoreValue::from("name"),
v_prefixed_entry_name.clone(),
)?;
} else {
core_set(&v_entry, CoreValue::from("name"), v_node.clone())?;
}
core_append(&v_chat_log, v_entry.clone())?;
}
core_set(&v_flow, CoreValue::from("chat_log"), v_chat_log.clone())?;
return Ok(v_chat_log.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_record_child_usage(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_record_child_usage");
let mut v_flow = core_arg(args, 0);
let mut v_node = core_arg(args, 1);
let mut v_program = core_arg(args, 2);
let mut v_child_usage = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_has_usage = CoreValue::Null;
let mut v_usage = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_usage = core_get(&v_flow, &CoreValue::from("usage"), v_empty_map.clone());
v_child_usage = core_agent_stage_usage(&[v_program.clone()])?;
v_has_usage = core_truthy_value(&[v_child_usage.clone()])?;
if core_truthy(&v_has_usage) {
core_set(&v_usage, v_node.clone(), v_child_usage.clone())?;
}
core_set(&v_flow, CoreValue::from("usage"), v_usage.clone())?;
return Ok(v_usage.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_record_child_traces(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_record_child_traces");
let mut v_flow = core_arg(args, 0);
let mut v_node = core_arg(args, 1);
let mut v_program = core_arg(args, 2);
let mut v_child_traces = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_entry = CoreValue::Null;
let mut v_trace = CoreValue::Null;
let mut v_traces = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_traces = core_get(&v_flow, &CoreValue::from("traces"), v_empty_list.clone());
v_child_traces = core_agent_stage_traces(&[v_program.clone()])?;
for v_trace in core_iter(&v_child_traces)? {
let mut v_trace = v_trace;
v_entry = CoreValue::new_map();
core_set(
&v_entry,
CoreValue::from("kind"),
CoreValue::from("flow_child_trace"),
)?;
core_set(&v_entry, CoreValue::from("name"), v_node.clone())?;
core_set(&v_entry, CoreValue::from("trace"), v_trace.clone())?;
core_append(&v_traces, v_entry.clone())?;
}
core_set(&v_flow, CoreValue::from("traces"), v_traces.clone())?;
return Ok(v_traces.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_execute_program_node(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_execute_program_node");
let mut v_flow = core_arg(args, 0);
let mut v_step = core_arg(args, 1);
let mut v_client = core_arg(args, 2);
let mut v_state = core_arg(args, 3);
let mut v_options = core_arg(args, 4);
let mut v_abort_any_node = CoreValue::Null;
let mut v_abort_during = CoreValue::Null;
let mut v_abort_during_snake = CoreValue::Null;
let mut v_abort_error = CoreValue::Null;
let mut v_abort_message = CoreValue::Null;
let mut v_abort_named = CoreValue::Null;
let mut v_abort_no_name = CoreValue::Null;
let mut v_abort_node = CoreValue::Null;
let mut v_abort_node_snake = CoreValue::Null;
let mut v_abort_now = CoreValue::Null;
let mut v_abort_this_node = CoreValue::Null;
let mut v_base_options = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_has_trace_label = CoreValue::Null;
let mut v_kind = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_program = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_result_key = CoreValue::Null;
let mut v_runtime_base = CoreValue::Null;
let mut v_runtime_options = CoreValue::Null;
let mut v_step_options = CoreValue::Null;
let mut v_trace_label = CoreValue::Null;
let mut v_trace_label_in = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_name = core_get(&v_step, &CoreValue::from("name"), CoreValue::from(""));
v_kind = core_get(
&v_step,
&CoreValue::from("kind"),
CoreValue::from("execute"),
);
v_program = core_get(&v_step, &CoreValue::from("program"), CoreValue::Null);
v_step_options = core_get(&v_step, &CoreValue::from("options"), v_empty_map.clone());
v_base_options = core_get(&v_flow, &CoreValue::from("options"), v_empty_map.clone());
v_runtime_base = core_map_merge(&[v_base_options.clone(), v_options.clone()])?;
v_runtime_options = core_map_merge(&[v_runtime_base.clone(), v_step_options.clone()])?;
v_trace_label_in = core_get(
&v_options,
&CoreValue::from("traceLabel"),
CoreValue::from(""),
);
v_has_trace_label = core_truthy_value(&[v_trace_label_in.clone()])?;
v_trace_label = core_string_format(&[CoreValue::from("Node:{}"), v_name.clone()])?;
if core_truthy(&v_has_trace_label) {
v_trace_label = core_string_format(&[
CoreValue::from("Node:{} ({})"),
v_name.clone(),
v_trace_label_in.clone(),
])?;
}
core_set(
&v_runtime_options,
CoreValue::from("traceLabel"),
v_trace_label.clone(),
)?;
v_abort_during_snake = core_get(
&v_options,
&CoreValue::from("abort_during_step"),
CoreValue::Bool(false),
);
v_abort_during = core_get(
&v_options,
&CoreValue::from("abortDuringStep"),
v_abort_during_snake.clone(),
);
v_abort_node_snake = core_get(
&v_options,
&CoreValue::from("abort_during_node"),
CoreValue::from(""),
);
v_abort_node = core_get(
&v_options,
&CoreValue::from("abortDuringNode"),
v_abort_node_snake.clone(),
);
v_abort_named = core_eq(&[v_abort_node.clone(), v_name.clone()])?;
v_abort_no_name = core_eq(&[v_abort_node.clone(), CoreValue::from("")])?;
v_abort_this_node = core_and(&[v_abort_during.clone(), v_abort_named.clone()])?;
v_abort_any_node = core_and(&[v_abort_during.clone(), v_abort_no_name.clone()])?;
v_abort_now = core_or(&[v_abort_this_node.clone(), v_abort_any_node.clone()])?;
if core_truthy(&v_abort_now) {
v_abort_message = core_string_format(&[
CoreValue::from("Flow aborted at flow-node-{}"),
v_name.clone(),
])?;
v_abort_error = core_runtime_error(&[v_abort_message.clone()])?;
return Err(core_as_error(&v_abort_error));
}
v_result = core_agent_stage_forward(&[
v_program.clone(),
v_client.clone(),
v_state.clone(),
v_runtime_options.clone(),
])?;
v_out = core_map_merge(&[v_state.clone(), v_empty_map.clone()])?;
v_result_key = core_string_format(&[CoreValue::from("{}Result"), v_name.clone()])?;
core_set(&v_out, v_result_key.clone(), v_result.clone())?;
v_out = core_map_update(&[v_out.clone(), v_result.clone()])?;
_flow_record_child_chat_log(&[v_flow.clone(), v_name.clone(), v_program.clone()])?;
_flow_record_child_usage(&[v_flow.clone(), v_name.clone(), v_program.clone()])?;
_flow_record_child_traces(&[v_flow.clone(), v_name.clone(), v_program.clone()])?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_execute_step(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_execute_step");
let mut v_flow = core_arg(args, 0);
let mut v_step = core_arg(args, 1);
let mut v_plan_step = core_arg(args, 2);
let mut v_client = core_arg(args, 3);
let mut v_state = core_arg(args, 4);
let mut v_options = core_arg(args, 5);
let mut v_bad_results = CoreValue::Null;
let mut v_body_steps = CoreValue::Null;
let mut v_branch = CoreValue::Null;
let mut v_branch_steps = CoreValue::Null;
let mut v_branch_value = CoreValue::Null;
let mut v_branch_value_default = CoreValue::Null;
let mut v_branches = CoreValue::Null;
let mut v_condition = CoreValue::Null;
let mut v_condition_result = CoreValue::Null;
let mut v_current = CoreValue::Null;
let mut v_default_body = CoreValue::Null;
let mut v_default_branches = CoreValue::Null;
let mut v_default_results = CoreValue::Null;
let mut v_derived = CoreValue::Null;
let mut v_done = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_err = CoreValue::Null;
let mut v_event_payload = CoreValue::Null;
let mut v_existing_iterations = CoreValue::Null;
let mut v_has_condition = CoreValue::Null;
let mut v_has_predicate = CoreValue::Null;
let mut v_input_field = CoreValue::Null;
let mut v_input_is_list = CoreValue::Null;
let mut v_input_value = CoreValue::Null;
let mut v_is_branch = CoreValue::Null;
let mut v_is_derive = CoreValue::Null;
let mut v_is_feedback = CoreValue::Null;
let mut v_is_map = CoreValue::Null;
let mut v_is_parallel = CoreValue::Null;
let mut v_is_parallel_merge = CoreValue::Null;
let mut v_is_while = CoreValue::Null;
let mut v_item = CoreValue::Null;
let mut v_item_state = CoreValue::Null;
let mut v_iteration_key = CoreValue::Null;
let mut v_iterations = CoreValue::Null;
let mut v_kind = CoreValue::Null;
let mut v_label = CoreValue::Null;
let mut v_location = CoreValue::Null;
let mut v_mapped = CoreValue::Null;
let mut v_matched = CoreValue::Null;
let mut v_matches = CoreValue::Null;
let mut v_max_iterations = CoreValue::Null;
let mut v_max_iterations_snake = CoreValue::Null;
let mut v_merge_output = CoreValue::Null;
let mut v_merge_output_snake = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_missing_iterations = CoreValue::Null;
let mut v_missing_step = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_none = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_output_field = CoreValue::Null;
let mut v_parallel_results = CoreValue::Null;
let mut v_parallel_results_snake = CoreValue::Null;
let mut v_predicate = CoreValue::Null;
let mut v_program = CoreValue::Null;
let mut v_program_id = CoreValue::Null;
let mut v_program_out = CoreValue::Null;
let mut v_reads = CoreValue::Null;
let mut v_res_state = CoreValue::Null;
let mut v_result_key = CoreValue::Null;
let mut v_results = CoreValue::Null;
let mut v_results_is_list = CoreValue::Null;
let mut v_should_continue = CoreValue::Null;
let mut v_step_event = CoreValue::Null;
let mut v_step_index = CoreValue::Null;
let mut v_step_options = CoreValue::Null;
let mut v_too_many = CoreValue::Null;
let mut v_traces = CoreValue::Null;
let mut v_when = CoreValue::Null;
let mut v_writes = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_missing_step = core_is_none(&[v_step.clone()])?;
if core_truthy(&v_missing_step) {
return Ok(v_state.clone());
}
v_kind = core_get(
&v_step,
&CoreValue::from("kind"),
CoreValue::from("execute"),
);
v_name = core_get(&v_step, &CoreValue::from("name"), CoreValue::from(""));
v_location = core_string_format(&[CoreValue::from("flow-step-{}"), v_name.clone()])?;
_flow_check_abort(&[v_options.clone(), v_location.clone()])?;
v_traces = core_get(&v_flow, &CoreValue::from("traces"), CoreValue::Null);
v_program_id = core_get(
&v_flow,
&CoreValue::from("program_id"),
CoreValue::from("root.flow"),
);
v_event_payload = CoreValue::new_map();
core_set(&v_event_payload, CoreValue::from("name"), v_name.clone())?;
core_set(&v_event_payload, CoreValue::from("kind"), v_kind.clone())?;
v_step_index = core_get(
&v_plan_step,
&CoreValue::from("stepIndex"),
CoreValue::Num(0f64),
);
core_set(
&v_event_payload,
CoreValue::from("stepIndex"),
v_step_index.clone(),
)?;
v_step_event = _program_trace_event(&[
v_program_id.clone(),
CoreValue::from("flow_step"),
v_event_payload.clone(),
])?;
core_append(&v_traces, v_step_event.clone())?;
v_is_map = core_eq(&[v_kind.clone(), CoreValue::from("map")])?;
if core_truthy(&v_is_map) {
v_program = core_get(&v_step, &CoreValue::from("program"), CoreValue::Null);
v_mapped = core_object_call_method(&[
v_program.clone(),
CoreValue::from("call"),
v_state.clone(),
])?;
v_out = core_map_merge(&[v_state.clone(), v_empty_map.clone()])?;
v_result_key = core_string_format(&[CoreValue::from("{}Result"), v_name.clone()])?;
core_set(&v_out, v_result_key.clone(), v_mapped.clone())?;
v_out = core_map_update(&[v_out.clone(), v_mapped.clone()])?;
return Ok(v_out.clone());
}
v_is_branch = core_eq(&[v_kind.clone(), CoreValue::from("branch")])?;
if core_truthy(&v_is_branch) {
v_step_options = core_get(&v_step, &CoreValue::from("options"), v_empty_map.clone());
v_predicate = core_get(
&v_step_options,
&CoreValue::from("predicate"),
CoreValue::Null,
);
v_has_predicate = core_is_not_none(&[v_predicate.clone()])?;
v_branch_value_default = core_get(
&v_step_options,
&CoreValue::from("value"),
CoreValue::Bool(false),
);
v_branch_value = core_get(
&v_step_options,
&CoreValue::from("branchValue"),
v_branch_value_default.clone(),
);
if core_truthy(&v_has_predicate) {
v_branch_value = core_object_call_method(&[
v_predicate.clone(),
CoreValue::from("call"),
v_state.clone(),
])?;
}
v_default_branches = CoreValue::new_list();
v_branches = core_get(
&v_step_options,
&CoreValue::from("branches"),
v_default_branches.clone(),
);
v_current = v_state.clone();
v_matched = CoreValue::Bool(false);
for v_branch in core_iter(&v_branches)? {
let mut v_branch = v_branch;
v_when = core_get(&v_branch, &CoreValue::from("when"), CoreValue::Null);
v_matches = core_eq(&[v_when.clone(), v_branch_value.clone()])?;
if core_truthy(&v_matches) {
v_branch_steps = core_get(
&v_branch,
&CoreValue::from("steps"),
v_default_branches.clone(),
);
v_current = _flow_execute_nested_steps(&[
v_flow.clone(),
v_client.clone(),
v_branch_steps.clone(),
v_current.clone(),
v_options.clone(),
])?;
v_matched = CoreValue::Bool(true);
}
}
return Ok(v_current.clone());
}
v_is_while = core_eq(&[v_kind.clone(), CoreValue::from("while")])?;
if core_truthy(&v_is_while) {
v_step_options = core_get(&v_step, &CoreValue::from("options"), v_empty_map.clone());
v_condition = core_get(
&v_step_options,
&CoreValue::from("condition"),
CoreValue::Null,
);
v_has_condition = core_is_not_none(&[v_condition.clone()])?;
v_default_body = CoreValue::new_list();
v_body_steps = core_get(
&v_step_options,
&CoreValue::from("steps"),
v_default_body.clone(),
);
v_max_iterations_snake = core_get(
&v_step_options,
&CoreValue::from("max_iterations"),
CoreValue::Num(100f64),
);
v_max_iterations = core_get(
&v_step_options,
&CoreValue::from("maxIterations"),
v_max_iterations_snake.clone(),
);
v_current = v_state.clone();
v_iterations = CoreValue::Num(0f64);
loop {
v_condition_result = core_get(
&v_step_options,
&CoreValue::from("conditionResult"),
CoreValue::Bool(false),
);
if core_truthy(&v_has_condition) {
v_condition_result = core_object_call_method(&[
v_condition.clone(),
CoreValue::from("call"),
v_current.clone(),
])?;
}
v_should_continue = core_truthy_value(&[v_condition_result.clone()])?;
v_done = core_not(&[v_should_continue.clone()])?;
if core_truthy(&v_done) {
break;
}
v_too_many = core_gte(&[v_iterations.clone(), v_max_iterations.clone()])?;
if core_truthy(&v_too_many) {
v_message = core_string_format(&[
CoreValue::from("While loop exceeded maximum iterations ({})"),
v_max_iterations.clone(),
])?;
v_err = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_err));
}
_flow_check_abort(&[v_options.clone(), CoreValue::from("flow-while")])?;
v_current = _flow_execute_nested_steps(&[
v_flow.clone(),
v_client.clone(),
v_body_steps.clone(),
v_current.clone(),
v_options.clone(),
])?;
v_iterations = core_add(&[v_iterations.clone(), CoreValue::Num(1f64)])?;
}
return Ok(v_current.clone());
}
v_is_feedback = core_eq(&[v_kind.clone(), CoreValue::from("feedback")])?;
if core_truthy(&v_is_feedback) {
v_step_options = core_get(&v_step, &CoreValue::from("options"), v_empty_map.clone());
v_condition = core_get(
&v_step_options,
&CoreValue::from("condition"),
CoreValue::Null,
);
v_has_condition = core_is_not_none(&[v_condition.clone()])?;
v_default_body = CoreValue::new_list();
v_body_steps = core_get(
&v_step_options,
&CoreValue::from("steps"),
v_default_body.clone(),
);
v_max_iterations_snake = core_get(
&v_step_options,
&CoreValue::from("max_iterations"),
CoreValue::Num(10f64),
);
v_max_iterations = core_get(
&v_step_options,
&CoreValue::from("maxIterations"),
v_max_iterations_snake.clone(),
);
v_label = core_get(&v_step_options, &CoreValue::from("label"), v_name.clone());
v_iteration_key =
core_string_format(&[CoreValue::from("_feedback_{}_iterations"), v_label.clone()])?;
v_current = core_map_merge(&[v_state.clone(), v_empty_map.clone()])?;
v_existing_iterations = core_get(&v_current, &v_iteration_key.clone(), CoreValue::Null);
v_missing_iterations = core_is_none(&[v_existing_iterations.clone()])?;
if core_truthy(&v_missing_iterations) {
core_set(&v_current, v_iteration_key.clone(), CoreValue::Num(1f64))?;
}
v_iterations = CoreValue::Num(1f64);
loop {
v_condition_result = core_get(
&v_step_options,
&CoreValue::from("conditionResult"),
CoreValue::Bool(false),
);
if core_truthy(&v_has_condition) {
v_condition_result = core_object_call_method(&[
v_condition.clone(),
CoreValue::from("call"),
v_current.clone(),
])?;
}
v_should_continue = core_truthy_value(&[v_condition_result.clone()])?;
v_done = core_not(&[v_should_continue.clone()])?;
if core_truthy(&v_done) {
break;
}
v_too_many = core_gte(&[v_iterations.clone(), v_max_iterations.clone()])?;
if core_truthy(&v_too_many) {
break;
}
v_location =
core_string_format(&[CoreValue::from("flow-feedback-{}"), v_label.clone()])?;
_flow_check_abort(&[v_options.clone(), v_location.clone()])?;
v_iterations = core_add(&[v_iterations.clone(), CoreValue::Num(1f64)])?;
core_set(&v_current, v_iteration_key.clone(), v_iterations.clone())?;
v_current = _flow_execute_nested_steps(&[
v_flow.clone(),
v_client.clone(),
v_body_steps.clone(),
v_current.clone(),
v_options.clone(),
])?;
}
return Ok(v_current.clone());
}
v_is_parallel = core_eq(&[v_kind.clone(), CoreValue::from("parallel")])?;
if core_truthy(&v_is_parallel) {
v_step_options = core_get(&v_step, &CoreValue::from("options"), v_empty_map.clone());
v_default_results = CoreValue::new_list();
v_parallel_results_snake = core_get(
&v_step_options,
&CoreValue::from("parallel_results"),
v_default_results.clone(),
);
v_parallel_results = core_get(
&v_step_options,
&CoreValue::from("parallelResults"),
v_parallel_results_snake.clone(),
);
v_out = core_map_merge(&[v_state.clone(), v_empty_map.clone()])?;
core_set(
&v_out,
CoreValue::from("_parallelResults"),
v_parallel_results.clone(),
)?;
return Ok(v_out.clone());
}
v_is_parallel_merge = core_eq(&[v_kind.clone(), CoreValue::from("parallelMerge")])?;
if core_truthy(&v_is_parallel_merge) {
v_step_options = core_get(&v_step, &CoreValue::from("options"), v_empty_map.clone());
v_results = core_get(
&v_state,
&CoreValue::from("_parallelResults"),
CoreValue::Null,
);
v_results_is_list = core_type_is(&v_results, CoreValue::from("list"));
v_bad_results = core_not(&[v_results_is_list.clone()])?;
if core_truthy(&v_bad_results) {
v_err = core_runtime_error(&[CoreValue::from("No parallel results found for merge")])?;
return Err(core_as_error(&v_err));
}
v_merge_output_snake = core_get(
&v_step_options,
&CoreValue::from("merge_output"),
v_results.clone(),
);
v_merge_output = core_get(
&v_step_options,
&CoreValue::from("mergeOutput"),
v_merge_output_snake.clone(),
);
v_out = core_map_merge(&[v_state.clone(), v_empty_map.clone()])?;
v_none = core_none(&[])?;
core_set(&v_out, CoreValue::from("_parallelResults"), v_none.clone())?;
core_set(&v_out, v_name.clone(), v_merge_output.clone())?;
return Ok(v_out.clone());
}
v_is_derive = core_eq(&[v_kind.clone(), CoreValue::from("derive")])?;
if core_truthy(&v_is_derive) {
v_empty_list = CoreValue::new_list();
v_program = core_get(&v_step, &CoreValue::from("program"), CoreValue::Null);
v_reads = core_get(&v_step, &CoreValue::from("reads"), v_empty_list.clone());
v_writes = core_get(&v_step, &CoreValue::from("writes"), v_empty_list.clone());
v_input_field =
core_list_get(&[v_reads.clone(), CoreValue::Num(0f64), CoreValue::from("")])?;
v_output_field = core_list_get(&[v_writes.clone(), CoreValue::Num(0f64), v_name.clone()])?;
v_input_value = core_get(&v_state, &v_input_field.clone(), CoreValue::Null);
v_out = core_map_merge(&[v_state.clone(), v_empty_map.clone()])?;
v_input_is_list = core_type_is(&v_input_value, CoreValue::from("list"));
if core_truthy(&v_input_is_list) {
v_results = CoreValue::new_list();
for v_item in core_iter(&v_input_value)? {
let mut v_item = v_item;
v_item_state = core_map_merge(&[v_state.clone(), v_empty_map.clone()])?;
core_set(&v_item_state, CoreValue::from("__item"), v_item.clone())?;
v_res_state = core_object_call_method(&[
v_program.clone(),
CoreValue::from("call"),
v_item_state.clone(),
])?;
v_derived = core_get(&v_res_state, &CoreValue::from("__derived"), CoreValue::Null);
core_append(&v_results, v_derived.clone())?;
}
core_set(&v_out, v_output_field.clone(), v_results.clone())?;
} else {
v_item_state = core_map_merge(&[v_state.clone(), v_empty_map.clone()])?;
core_set(
&v_item_state,
CoreValue::from("__item"),
v_input_value.clone(),
)?;
v_res_state = core_object_call_method(&[
v_program.clone(),
CoreValue::from("call"),
v_item_state.clone(),
])?;
v_derived = core_get(&v_res_state, &CoreValue::from("__derived"), CoreValue::Null);
core_set(&v_out, v_output_field.clone(), v_derived.clone())?;
}
return Ok(v_out.clone());
}
v_program_out = _flow_execute_program_node(&[
v_flow.clone(),
v_step.clone(),
v_client.clone(),
v_state.clone(),
v_options.clone(),
])?;
return Ok(v_program_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_merge_parallel_results(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_merge_parallel_results");
let mut v_state = core_arg(args, 0);
let mut v_result = core_arg(args, 1);
let mut v_merged = CoreValue::Null;
v_merged = core_map_merge(&[v_state.clone(), v_result.clone()])?;
return Ok(v_merged.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_execute_nested_steps(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_execute_nested_steps");
let mut v_flow = core_arg(args, 0);
let mut v_client = core_arg(args, 1);
let mut v_steps = core_arg(args, 2);
let mut v_state = core_arg(args, 3);
let mut v_options = core_arg(args, 4);
let mut v_chat_log = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_nested = CoreValue::Null;
let mut v_nested_chat_log = CoreValue::Null;
let mut v_nested_traces = CoreValue::Null;
let mut v_nested_usage = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_traces = CoreValue::Null;
let mut v_usage = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_nested = core_map_merge(&[v_flow.clone(), v_empty_map.clone()])?;
v_traces = core_get(&v_flow, &CoreValue::from("traces"), CoreValue::Null);
v_chat_log = core_get(&v_flow, &CoreValue::from("chat_log"), CoreValue::Null);
v_usage = core_get(&v_flow, &CoreValue::from("usage"), CoreValue::Null);
core_set(&v_nested, CoreValue::from("steps"), v_steps.clone())?;
core_set(&v_nested, CoreValue::from("returns"), v_empty_map.clone())?;
core_set(&v_nested, CoreValue::from("traces"), v_traces.clone())?;
core_set(&v_nested, CoreValue::from("chat_log"), v_chat_log.clone())?;
core_set(&v_nested, CoreValue::from("usage"), v_usage.clone())?;
v_out = _flow_execute_steps(&[
v_nested.clone(),
v_client.clone(),
v_state.clone(),
v_options.clone(),
])?;
v_nested_traces = core_get(&v_nested, &CoreValue::from("traces"), CoreValue::Null);
v_nested_chat_log = core_get(&v_nested, &CoreValue::from("chat_log"), CoreValue::Null);
v_nested_usage = core_get(&v_nested, &CoreValue::from("usage"), CoreValue::Null);
core_set(&v_flow, CoreValue::from("traces"), v_nested_traces.clone())?;
core_set(
&v_flow,
CoreValue::from("chat_log"),
v_nested_chat_log.clone(),
)?;
core_set(&v_flow, CoreValue::from("usage"), v_nested_usage.clone())?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_execute_steps(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_execute_steps");
let mut v_flow = core_arg(args, 0);
let mut v_client = core_arg(args, 1);
let mut v_state = core_arg(args, 2);
let mut v_options = core_arg(args, 3);
let mut v_auto_parallel = CoreValue::Null;
let mut v_current = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_flow_auto = CoreValue::Null;
let mut v_flow_auto_camel = CoreValue::Null;
let mut v_flow_options = CoreValue::Null;
let mut v_group = CoreValue::Null;
let mut v_group_count = CoreValue::Null;
let mut v_group_event = CoreValue::Null;
let mut v_group_payload = CoreValue::Null;
let mut v_group_start = CoreValue::Null;
let mut v_group_steps = CoreValue::Null;
let mut v_groups = CoreValue::Null;
let mut v_index = CoreValue::Null;
let mut v_is_parallel_group = CoreValue::Null;
let mut v_level = CoreValue::Null;
let mut v_location = CoreValue::Null;
let mut v_option_auto = CoreValue::Null;
let mut v_option_auto_camel = CoreValue::Null;
let mut v_plan = CoreValue::Null;
let mut v_plan_step = CoreValue::Null;
let mut v_plan_steps = CoreValue::Null;
let mut v_planned_groups = CoreValue::Null;
let mut v_program_id = CoreValue::Null;
let mut v_record_groups = CoreValue::Null;
let mut v_record_groups_snake = CoreValue::Null;
let mut v_result_state = CoreValue::Null;
let mut v_sequential_groups = CoreValue::Null;
let mut v_single = CoreValue::Null;
let mut v_step = CoreValue::Null;
let mut v_steps = CoreValue::Null;
let mut v_traces = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_empty_list = CoreValue::new_list();
v_steps = core_get(&v_flow, &CoreValue::from("steps"), v_empty_list.clone());
v_plan = _flow_plan(&[v_flow.clone()])?;
v_plan_steps = core_get(&v_plan, &CoreValue::from("steps"), v_empty_list.clone());
v_planned_groups = core_get(&v_plan, &CoreValue::from("groups"), v_empty_list.clone());
v_flow_options = core_get(&v_flow, &CoreValue::from("options"), v_empty_map.clone());
v_flow_auto_camel = core_get(
&v_flow_options,
&CoreValue::from("autoParallel"),
CoreValue::Bool(true),
);
v_flow_auto = core_get(
&v_flow_options,
&CoreValue::from("auto_parallel"),
v_flow_auto_camel.clone(),
);
v_option_auto_camel = core_get(
&v_options,
&CoreValue::from("autoParallel"),
CoreValue::Bool(true),
);
v_option_auto = core_get(
&v_options,
&CoreValue::from("auto_parallel"),
v_option_auto_camel.clone(),
);
v_auto_parallel = core_and(&[v_flow_auto.clone(), v_option_auto.clone()])?;
v_groups = v_planned_groups.clone();
if core_truthy(&v_auto_parallel) {
} else {
v_sequential_groups = CoreValue::new_list();
for v_plan_step in core_iter(&v_plan_steps)? {
let mut v_plan_step = v_plan_step;
v_single = CoreValue::new_list();
core_append(&v_single, v_plan_step.clone())?;
v_group = CoreValue::new_map();
v_level = core_len(&[v_sequential_groups.clone()])?;
core_set(&v_group, CoreValue::from("level"), v_level.clone())?;
core_set(&v_group, CoreValue::from("steps"), v_single.clone())?;
core_append(&v_sequential_groups, v_group.clone())?;
}
v_groups = v_sequential_groups.clone();
}
v_current = v_state.clone();
for v_group in core_iter(&v_groups)? {
let mut v_group = v_group;
v_level = core_get(&v_group, &CoreValue::from("level"), CoreValue::Num(0f64));
v_location =
core_string_format(&[CoreValue::from("flow-parallel-group-{}"), v_level.clone()])?;
_flow_check_abort(&[v_options.clone(), v_location.clone()])?;
v_group_steps = core_get(&v_group, &CoreValue::from("steps"), v_empty_list.clone());
v_group_count = core_len(&[v_group_steps.clone()])?;
v_record_groups_snake = core_get(
&v_options,
&CoreValue::from("record_flow_groups"),
CoreValue::Bool(false),
);
v_record_groups = core_get(
&v_options,
&CoreValue::from("recordFlowGroups"),
v_record_groups_snake.clone(),
);
if core_truthy(&v_record_groups) {
v_traces = core_get(&v_flow, &CoreValue::from("traces"), v_empty_list.clone());
v_program_id = core_get(
&v_flow,
&CoreValue::from("program_id"),
CoreValue::from("root.flow"),
);
v_group_payload = CoreValue::new_map();
core_set(&v_group_payload, CoreValue::from("level"), v_level.clone())?;
core_set(
&v_group_payload,
CoreValue::from("stepCount"),
v_group_count.clone(),
)?;
core_set(
&v_group_payload,
CoreValue::from("steps"),
v_group_steps.clone(),
)?;
v_group_event = _program_trace_event(&[
v_program_id.clone(),
CoreValue::from("flow_group"),
v_group_payload.clone(),
])?;
core_append(&v_traces, v_group_event.clone())?;
}
v_is_parallel_group = core_gt(&[v_group_count.clone(), CoreValue::Num(1f64)])?;
if core_truthy(&v_is_parallel_group) {
v_group_start = core_map_merge(&[v_current.clone(), v_empty_map.clone()])?;
for v_plan_step in core_iter(&v_group_steps)? {
let mut v_plan_step = v_plan_step;
v_index = core_get(
&v_plan_step,
&CoreValue::from("stepIndex"),
CoreValue::Num(0f64),
);
v_step = core_list_get(&[v_steps.clone(), v_index.clone(), CoreValue::Null])?;
v_result_state = _flow_execute_step(&[
v_flow.clone(),
v_step.clone(),
v_plan_step.clone(),
v_client.clone(),
v_group_start.clone(),
v_options.clone(),
])?;
v_current =
_flow_merge_parallel_results(&[v_current.clone(), v_result_state.clone()])?;
}
} else {
for v_plan_step in core_iter(&v_group_steps)? {
let mut v_plan_step = v_plan_step;
v_index = core_get(
&v_plan_step,
&CoreValue::from("stepIndex"),
CoreValue::Num(0f64),
);
v_step = core_list_get(&[v_steps.clone(), v_index.clone(), CoreValue::Null])?;
v_current = _flow_execute_step(&[
v_flow.clone(),
v_step.clone(),
v_plan_step.clone(),
v_client.clone(),
v_current.clone(),
v_options.clone(),
])?;
}
}
}
return Ok(v_current.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_forward(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_forward");
let mut v_flow = core_arg(args, 0);
let mut v_client = core_arg(args, 1);
let mut v_values = core_arg(args, 2);
let mut v_options = core_arg(args, 3);
let mut v_begin = CoreValue::Null;
let mut v_cache_hit = CoreValue::Null;
let mut v_cache_key = CoreValue::Null;
let mut v_cache_read = CoreValue::Null;
let mut v_cached_value = CoreValue::Null;
let mut v_done = CoreValue::Null;
let mut v_done_payload = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_fresh_chat_log = CoreValue::Null;
let mut v_fresh_traces = CoreValue::Null;
let mut v_fresh_usage = CoreValue::Null;
let mut v_opts = CoreValue::Null;
let mut v_opts_missing = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_program_id = CoreValue::Null;
let mut v_returns = CoreValue::Null;
let mut v_state = CoreValue::Null;
let mut v_traces = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_opts_missing = core_is_none(&[v_options.clone()])?;
v_opts = v_options.clone();
if core_truthy(&v_opts_missing) {
v_opts = v_empty_map.clone();
}
v_cache_read = _flow_cache_read_write(&[
v_flow.clone(),
v_values.clone(),
v_opts.clone(),
CoreValue::from("read"),
CoreValue::Null,
])?;
v_cache_hit = core_get(
&v_cache_read,
&CoreValue::from("hit"),
CoreValue::Bool(false),
);
if core_truthy(&v_cache_hit) {
v_cached_value = core_get(&v_cache_read, &CoreValue::from("value"), CoreValue::Null);
return Ok(v_cached_value.clone());
}
v_fresh_traces = CoreValue::new_list();
v_fresh_chat_log = CoreValue::new_list();
v_fresh_usage = CoreValue::new_map();
core_set(&v_flow, CoreValue::from("traces"), v_fresh_traces.clone())?;
core_set(
&v_flow,
CoreValue::from("chat_log"),
v_fresh_chat_log.clone(),
)?;
core_set(&v_flow, CoreValue::from("usage"), v_fresh_usage.clone())?;
v_state = core_map_merge(&[v_empty_map.clone(), v_values.clone()])?;
v_traces = core_get(&v_flow, &CoreValue::from("traces"), CoreValue::Null);
v_program_id = core_get(
&v_flow,
&CoreValue::from("program_id"),
CoreValue::from("root.flow"),
);
v_cache_key = _flow_cache_key(&[v_values.clone()])?;
v_begin = _program_trace_event(&[
v_program_id.clone(),
CoreValue::from("flow_start"),
v_state.clone(),
])?;
core_append(&v_traces, v_begin.clone())?;
v_state = _flow_execute_steps(&[
v_flow.clone(),
v_client.clone(),
v_state.clone(),
v_opts.clone(),
])?;
v_returns = core_get(&v_flow, &CoreValue::from("returns"), v_empty_map.clone());
v_output = _flow_project_returns(&[v_state.clone(), v_returns.clone()])?;
_flow_cache_read_write(&[
v_flow.clone(),
v_values.clone(),
v_opts.clone(),
CoreValue::from("write"),
v_output.clone(),
])?;
v_done_payload = CoreValue::new_map();
core_set(
&v_done_payload,
CoreValue::from("cache_key"),
v_cache_key.clone(),
)?;
core_set(&v_done_payload, CoreValue::from("output"), v_output.clone())?;
v_done = _program_trace_event(&[
v_program_id.clone(),
CoreValue::from("flow_done"),
v_done_payload.clone(),
])?;
core_append(&v_traces, v_done.clone())?;
return Ok(v_output.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_get_optimizable_components(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_get_optimizable_components");
let mut v_flow = core_arg(args, 0);
let mut v_child = CoreValue::Null;
let mut v_child_components = CoreValue::Null;
let mut v_component = CoreValue::Null;
let mut v_components = CoreValue::Null;
let mut v_constraints = CoreValue::Null;
let mut v_current_plan = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_graph = CoreValue::Null;
let mut v_graph_id = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_owner = CoreValue::Null;
let mut v_plan = CoreValue::Null;
let mut v_program = CoreValue::Null;
let mut v_step = CoreValue::Null;
let mut v_steps = CoreValue::Null;
let mut v_validation = CoreValue::Null;
v_empty_list = CoreValue::new_list();
v_empty_map = CoreValue::new_map();
v_owner = core_get(
&v_flow,
&CoreValue::from("program_id"),
CoreValue::from("root.flow"),
);
v_plan = _flow_plan(&[v_flow.clone()])?;
v_current_plan = core_get(
&v_flow,
&CoreValue::from("optimized_graph_plan"),
v_plan.clone(),
);
v_components = CoreValue::new_list();
v_graph_id = core_string_format(&[CoreValue::from("{}::graph-plan"), v_owner.clone()])?;
v_constraints = CoreValue::new_list();
core_append(
&v_constraints,
CoreValue::from("Preserve node names, dependencies, and return contract."),
)?;
v_validation = CoreValue::new_map();
core_set(
&v_validation,
CoreValue::from("schema"),
CoreValue::from("axflow-plan-v1"),
)?;
v_graph = _optimization_component(&[
v_graph_id.clone(),
v_owner.clone(),
CoreValue::from("flow-graph"),
v_current_plan.clone(),
CoreValue::from("AxFlow execution graph and planner barrier metadata."),
v_constraints.clone(),
v_empty_list.clone(),
CoreValue::Bool(false),
CoreValue::from("json"),
v_validation.clone(),
])?;
core_append(&v_components, v_graph.clone())?;
v_steps = core_get(&v_flow, &CoreValue::from("steps"), v_empty_list.clone());
for v_step in core_iter(&v_steps)? {
let mut v_step = v_step;
v_program = core_get(&v_step, &CoreValue::from("program"), CoreValue::Null);
v_name = core_get(&v_step, &CoreValue::from("name"), CoreValue::from(""));
v_child_components = core_program_components(&[v_program.clone()])?;
for v_component in core_iter(&v_child_components)? {
let mut v_component = v_component;
v_child =
_program_prefix_component(&[v_component.clone(), v_owner.clone(), v_name.clone()])?;
core_append(&v_components, v_child.clone())?;
}
}
return Ok(v_components.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_apply_optimized_components(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_apply_optimized_components");
let mut v_flow = core_arg(args, 0);
let mut v_component_map = core_arg(args, 1);
let mut v_bad_graph = CoreValue::Null;
let mut v_child_updates = CoreValue::Null;
let mut v_components = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_err = CoreValue::Null;
let mut v_graph_id = CoreValue::Null;
let mut v_graph_is_object = CoreValue::Null;
let mut v_graph_update = CoreValue::Null;
let mut v_has_child_updates = CoreValue::Null;
let mut v_has_graph_update = CoreValue::Null;
let mut v_name = CoreValue::Null;
let mut v_owner = CoreValue::Null;
let mut v_prefix = CoreValue::Null;
let mut v_program = CoreValue::Null;
let mut v_step = CoreValue::Null;
let mut v_steps = CoreValue::Null;
let mut v_updates = CoreValue::Null;
let mut v_updates_missing = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_empty_list = CoreValue::new_list();
v_updates_missing = core_is_none(&[v_component_map.clone()])?;
v_updates = v_component_map.clone();
if core_truthy(&v_updates_missing) {
v_updates = v_empty_map.clone();
}
v_components = _flow_get_optimizable_components(&[v_flow.clone()])?;
_validate_optimization_component_map(&[v_components.clone(), v_updates.clone()])?;
v_owner = core_get(
&v_flow,
&CoreValue::from("program_id"),
CoreValue::from("root.flow"),
);
v_graph_id = core_string_format(&[CoreValue::from("{}::graph-plan"), v_owner.clone()])?;
v_graph_update = core_get(&v_updates, &v_graph_id.clone(), CoreValue::Null);
v_has_graph_update = core_is_not_none(&[v_graph_update.clone()])?;
if core_truthy(&v_has_graph_update) {
v_graph_is_object = core_type_is(&v_graph_update, CoreValue::from("object"));
v_bad_graph = core_not(&[v_graph_is_object.clone()])?;
if core_truthy(&v_bad_graph) {
v_err = core_runtime_error(&[CoreValue::from(
"optimized flow graph-plan component must be an object",
)])?;
return Err(core_as_error(&v_err));
}
core_set(
&v_flow,
CoreValue::from("optimized_graph_plan"),
v_graph_update.clone(),
)?;
}
v_steps = core_get(&v_flow, &CoreValue::from("steps"), v_empty_list.clone());
for v_step in core_iter(&v_steps)? {
let mut v_step = v_step;
v_program = core_get(&v_step, &CoreValue::from("program"), CoreValue::Null);
v_name = core_get(&v_step, &CoreValue::from("name"), CoreValue::from(""));
v_prefix = _program_child_component_prefix(&[v_owner.clone(), v_name.clone()])?;
v_child_updates = _program_slice_component_map(&[v_updates.clone(), v_prefix.clone()])?;
v_has_child_updates = core_truthy_value(&[v_child_updates.clone()])?;
if core_truthy(&v_has_child_updates) {
core_program_apply_components(&[v_program.clone(), v_child_updates.clone()])?;
}
}
return Ok(v_flow.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_snapshot_components(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_snapshot_components");
let mut v_flow = core_arg(args, 0);
let mut v_components = CoreValue::Null;
let mut v_snapshot = CoreValue::Null;
v_components = _flow_get_optimizable_components(&[v_flow.clone()])?;
v_snapshot = _optimization_component_current_map(&[v_components.clone()])?;
return Ok(v_snapshot.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_restore_components(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_restore_components");
let mut v_flow = core_arg(args, 0);
let mut v_snapshot = core_arg(args, 1);
let mut v_restored = CoreValue::Null;
v_restored = _flow_apply_optimized_components(&[v_flow.clone(), v_snapshot.clone()])?;
return Ok(v_restored.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_evaluate_optimization(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_evaluate_optimization");
let mut v_flow = core_arg(args, 0);
let mut v_client = core_arg(args, 1);
let mut v_dataset = core_arg(args, 2);
let mut v_candidate_map = core_arg(args, 3);
let mut v_options = core_arg(args, 4);
let mut v_calls = CoreValue::Null;
let mut v_candidate = CoreValue::Null;
let mut v_candidate_missing = CoreValue::Null;
let mut v_chat_log = CoreValue::Null;
let mut v_completion_type = CoreValue::Null;
let mut v_default_score = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_err = CoreValue::Null;
let mut v_error = CoreValue::Null;
let mut v_error_message = CoreValue::Null;
let mut v_forward_error = CoreValue::Null;
let mut v_forward_options = CoreValue::Null;
let mut v_has_candidate = CoreValue::Null;
let mut v_input = CoreValue::Null;
let mut v_is_error = CoreValue::Null;
let mut v_max_calls = CoreValue::Null;
let mut v_max_calls_snake = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_next_calls = CoreValue::Null;
let mut v_normalized = CoreValue::Null;
let mut v_opts = CoreValue::Null;
let mut v_opts_missing = CoreValue::Null;
let mut v_original = CoreValue::Null;
let mut v_outer_error = CoreValue::Null;
let mut v_output = CoreValue::Null;
let mut v_phase = CoreValue::Null;
let mut v_prediction = CoreValue::Null;
let mut v_raw_scores = CoreValue::Null;
let mut v_result = CoreValue::Null;
let mut v_row = CoreValue::Null;
let mut v_rows = CoreValue::Null;
let mut v_scalar = CoreValue::Null;
let mut v_scalar_base = CoreValue::Null;
let mut v_score_from_score = CoreValue::Null;
let mut v_score_from_scores = CoreValue::Null;
let mut v_scores = CoreValue::Null;
let mut v_task = CoreValue::Null;
let mut v_too_many = CoreValue::Null;
let mut v_trace = CoreValue::Null;
let mut v_trace_for_row = CoreValue::Null;
let mut v_traces = CoreValue::Null;
let mut v_train = CoreValue::Null;
let mut v_usage = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_empty_list = CoreValue::new_list();
v_opts_missing = core_is_none(&[v_options.clone()])?;
v_opts = v_options.clone();
if core_truthy(&v_opts_missing) {
v_opts = v_empty_map.clone();
}
v_candidate_missing = core_is_none(&[v_candidate_map.clone()])?;
v_candidate = v_candidate_map.clone();
if core_truthy(&v_candidate_missing) {
v_candidate = v_empty_map.clone();
}
v_normalized = _normalize_optimization_dataset(&[v_dataset.clone()])?;
v_train = core_get(
&v_normalized,
&CoreValue::from("train"),
v_empty_list.clone(),
);
v_phase = core_get(&v_opts, &CoreValue::from("phase"), CoreValue::from("train"));
v_max_calls_snake = core_get(
&v_opts,
&CoreValue::from("max_metric_calls"),
CoreValue::Num(2147483647f64),
);
v_max_calls = core_get(
&v_opts,
&CoreValue::from("maxMetricCalls"),
v_max_calls_snake.clone(),
);
v_forward_options = core_get(
&v_opts,
&CoreValue::from("forward_options"),
v_empty_map.clone(),
);
v_original = _flow_snapshot_components(&[v_flow.clone()])?;
v_rows = CoreValue::new_list();
v_calls = CoreValue::Num(0f64);
v_result = CoreValue::new_map();
let __core_try: Result<CoreFlow, AxError> = (|| {
v_has_candidate = core_truthy_value(&[v_candidate.clone()])?;
if core_truthy(&v_has_candidate) {
_flow_apply_optimized_components(&[v_flow.clone(), v_candidate.clone()])?;
}
for v_task in core_iter(&v_train)? {
let mut v_task = v_task;
v_too_many = core_gte(&[v_calls.clone(), v_max_calls.clone()])?;
if core_truthy(&v_too_many) {
v_message = core_string_format(&[
CoreValue::from("max metric calls exceeded: {}"),
v_max_calls.clone(),
])?;
v_err = core_runtime_error(&[v_message.clone()])?;
return Err(core_as_error(&v_err));
}
v_next_calls = core_add(&[v_calls.clone(), CoreValue::Num(1f64)])?;
v_calls = v_next_calls.clone();
v_error = core_none(&[])?;
v_prediction = CoreValue::new_map();
let __core_try: Result<CoreFlow, AxError> = (|| {
v_input = core_get(&v_task, &CoreValue::from("input"), v_task.clone());
v_output = _flow_forward(&[
v_flow.clone(),
v_client.clone(),
v_input.clone(),
v_forward_options.clone(),
])?;
v_trace = CoreValue::new_map();
v_traces = core_get(&v_flow, &CoreValue::from("traces"), v_empty_list.clone());
v_chat_log = core_get(&v_flow, &CoreValue::from("chat_log"), v_empty_list.clone());
v_usage = core_get(&v_flow, &CoreValue::from("usage"), v_empty_map.clone());
core_set(&v_trace, CoreValue::from("traces"), v_traces.clone())?;
core_set(&v_trace, CoreValue::from("chat_log"), v_chat_log.clone())?;
v_prediction = _build_agent_eval_prediction(&[
v_output.clone(),
v_chat_log.clone(),
v_usage.clone(),
v_trace.clone(),
])?;
Ok(CoreFlow::Normal)
})();
match __core_try {
Ok(CoreFlow::Normal) => {}
Ok(CoreFlow::Return(value)) => return Ok(CoreFlow::Return(value)),
Ok(CoreFlow::Break) => return Ok(CoreFlow::Break),
Ok(CoreFlow::Continue) => return Ok(CoreFlow::Continue),
Err(__core_caught) => {
v_forward_error = CoreValue::Error(std::rc::Rc::new(__core_caught));
v_error_message = core_exception_message(&[v_forward_error.clone()])?;
v_error = CoreValue::new_map();
core_set(
&v_error,
CoreValue::from("message"),
v_error_message.clone(),
)?;
v_trace = CoreValue::new_map();
v_traces = core_get(&v_flow, &CoreValue::from("traces"), v_empty_list.clone());
v_chat_log =
core_get(&v_flow, &CoreValue::from("chat_log"), v_empty_list.clone());
v_usage = core_get(&v_flow, &CoreValue::from("usage"), v_empty_map.clone());
core_set(&v_trace, CoreValue::from("traces"), v_traces.clone())?;
core_set(&v_trace, CoreValue::from("chat_log"), v_chat_log.clone())?;
core_set(
&v_prediction,
CoreValue::from("completionType"),
CoreValue::from("error"),
)?;
core_set(&v_prediction, CoreValue::from("error"), v_error.clone())?;
core_set(
&v_prediction,
CoreValue::from("functionCalls"),
v_empty_list.clone(),
)?;
core_set(
&v_prediction,
CoreValue::from("actionLog"),
v_chat_log.clone(),
)?;
core_set(&v_prediction, CoreValue::from("usage"), v_usage.clone())?;
core_set(&v_prediction, CoreValue::from("trace"), v_trace.clone())?;
core_set(
&v_prediction,
CoreValue::from("turnCount"),
CoreValue::Num(0f64),
)?;
}
}
v_completion_type = core_get(
&v_prediction,
&CoreValue::from("completionType"),
CoreValue::from("final"),
);
v_is_error = core_eq(&[v_completion_type.clone(), CoreValue::from("error")])?;
v_default_score = CoreValue::Num(1f64);
if core_truthy(&v_is_error) {
v_default_score = CoreValue::Num(0f64);
}
v_score_from_score =
core_get(&v_task, &CoreValue::from("score"), v_default_score.clone());
v_score_from_scores = core_get(
&v_task,
&CoreValue::from("scores"),
v_score_from_score.clone(),
);
v_raw_scores = core_get(
&v_task,
&CoreValue::from("metric_score"),
v_score_from_scores.clone(),
);
v_scores = _normalize_optimization_metric_scores(&[v_raw_scores.clone()])?;
v_scalar_base = _scalarize_optimization_scores(&[v_scores.clone(), v_opts.clone()])?;
v_scalar = _adjust_optimization_score_for_actions(&[
v_scalar_base.clone(),
v_task.clone(),
v_prediction.clone(),
])?;
v_trace_for_row = core_get(&v_prediction, &CoreValue::from("trace"), CoreValue::Null);
v_row = _build_optimization_eval_row(&[
v_task.clone(),
v_prediction.clone(),
v_scores.clone(),
v_scalar.clone(),
v_trace_for_row.clone(),
v_error.clone(),
])?;
core_append(&v_rows, v_row.clone())?;
}
v_result = _build_optimization_eval_result(&[
v_rows.clone(),
v_candidate.clone(),
v_phase.clone(),
])?;
_flow_restore_components(&[v_flow.clone(), v_original.clone()])?;
Ok(CoreFlow::Normal)
})();
match __core_try {
Ok(CoreFlow::Normal) => {}
Ok(CoreFlow::Return(value)) => return Ok(value),
Ok(CoreFlow::Break) => unreachable!("break outside loop"),
Ok(CoreFlow::Continue) => unreachable!("continue outside loop"),
Err(__core_caught) => {
v_outer_error = CoreValue::Error(std::rc::Rc::new(__core_caught));
_flow_restore_components(&[v_flow.clone(), v_original.clone()])?;
return Err(core_as_error(&v_outer_error));
}
}
return Ok(v_result.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn _flow_optimize_with(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("_flow_optimize_with");
let mut v_flow = core_arg(args, 0);
let mut v_dataset = core_arg(args, 1);
let mut v_options = core_arg(args, 2);
let mut v_evaluator_available = core_arg(args, 3);
let mut v_chat_log = CoreValue::Null;
let mut v_components = CoreValue::Null;
let mut v_empty_list = CoreValue::Null;
let mut v_empty_map = CoreValue::Null;
let mut v_request = CoreValue::Null;
let mut v_run = CoreValue::Null;
let mut v_trace = CoreValue::Null;
let mut v_traces = CoreValue::Null;
v_empty_map = CoreValue::new_map();
v_empty_list = CoreValue::new_list();
v_components = _flow_get_optimizable_components(&[v_flow.clone()])?;
v_trace = CoreValue::new_map();
v_traces = core_get(&v_flow, &CoreValue::from("traces"), v_empty_list.clone());
v_chat_log = core_get(&v_flow, &CoreValue::from("chat_log"), v_empty_list.clone());
core_set(&v_trace, CoreValue::from("traces"), v_traces.clone())?;
core_set(&v_trace, CoreValue::from("chat_log"), v_chat_log.clone())?;
v_run = _prepare_optimizer_run(&[
CoreValue::from("axflow"),
v_components.clone(),
v_dataset.clone(),
v_options.clone(),
v_trace.clone(),
v_evaluator_available.clone(),
])?;
v_request = core_get(&v_run, &CoreValue::from("request"), v_empty_map.clone());
return Ok(v_request.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn mcp_protocol_constants(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("mcp_protocol_constants");
let mut v_out = CoreValue::Null;
let mut v_versions = CoreValue::Null;
v_versions = CoreValue::new_list();
core_append(&v_versions, CoreValue::from("2025-11-25"))?;
core_append(&v_versions, CoreValue::from("2025-06-18"))?;
core_append(&v_versions, CoreValue::from("2025-03-26"))?;
core_append(&v_versions, CoreValue::from("2024-11-05"))?;
v_out = CoreValue::new_map();
core_set(
&v_out,
CoreValue::from("protocolVersion"),
CoreValue::from("2025-11-25"),
)?;
core_set(
&v_out,
CoreValue::from("supportedProtocolVersions"),
v_versions.clone(),
)?;
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn mcp_jsonrpc_request(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("mcp_jsonrpc_request");
let mut v_id = core_arg(args, 0);
let mut v_method = core_arg(args, 1);
let mut v_params = core_arg(args, 2);
let mut v_missing = CoreValue::Null;
let mut v_out = CoreValue::Null;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("jsonrpc"), CoreValue::from("2.0"))?;
core_set(&v_out, CoreValue::from("id"), v_id.clone())?;
core_set(&v_out, CoreValue::from("method"), v_method.clone())?;
v_missing = core_is_none(&[v_params.clone()])?;
if core_truthy(&v_missing) {
} else {
core_set(&v_out, CoreValue::from("params"), v_params.clone())?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn mcp_jsonrpc_notification(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("mcp_jsonrpc_notification");
let mut v_method = core_arg(args, 0);
let mut v_params = core_arg(args, 1);
let mut v_missing = CoreValue::Null;
let mut v_out = CoreValue::Null;
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("jsonrpc"), CoreValue::from("2.0"))?;
core_set(&v_out, CoreValue::from("method"), v_method.clone())?;
v_missing = core_is_none(&[v_params.clone()])?;
if core_truthy(&v_missing) {
} else {
core_set(&v_out, CoreValue::from("params"), v_params.clone())?;
}
return Ok(v_out.clone());
}
#[allow(
unused_variables,
unused_assignments,
unused_mut,
unreachable_code,
clippy::all
)]
fn mcp_normalize_error(args: &[CoreValue]) -> Result<CoreValue, AxError> {
axir_coverage_mark("mcp_normalize_error");
let mut v_response = core_arg(args, 0);
let mut v_code = CoreValue::Null;
let mut v_data = CoreValue::Null;
let mut v_err = CoreValue::Null;
let mut v_message = CoreValue::Null;
let mut v_missing = CoreValue::Null;
let mut v_ok = CoreValue::Null;
let mut v_out = CoreValue::Null;
let mut v_result = CoreValue::Null;
v_err = core_get(&v_response, &CoreValue::from("error"), CoreValue::Null);
v_missing = core_is_none(&[v_err.clone()])?;
if core_truthy(&v_missing) {
v_ok = CoreValue::new_map();
v_result = core_get(&v_response, &CoreValue::from("result"), CoreValue::Null);
core_set(&v_ok, CoreValue::from("ok"), CoreValue::Bool(true))?;
core_set(&v_ok, CoreValue::from("result"), v_result.clone())?;
return Ok(v_ok.clone());
} else {
v_code = core_get(&v_err, &CoreValue::from("code"), CoreValue::Num(0f64));
v_message = core_get(
&v_err,
&CoreValue::from("message"),
CoreValue::from("MCP JSON-RPC error"),
);
v_data = core_get(&v_err, &CoreValue::from("data"), CoreValue::Null);
v_out = CoreValue::new_map();
core_set(&v_out, CoreValue::from("ok"), CoreValue::Bool(false))?;
core_set(&v_out, CoreValue::from("category"), CoreValue::from("mcp"))?;
core_set(&v_out, CoreValue::from("code"), v_code.clone())?;
core_set(&v_out, CoreValue::from("message"), v_message.clone())?;
core_set(&v_out, CoreValue::from("data"), v_data.clone())?;
return Ok(v_out.clone());
}
return Ok(v_response.clone());
}
// END AXIR CORE EMITTED FUNCTIONS (436 of 436 core functions)