pub const WIRE_TRANSPORT_KEY: &str = "ai.bytesandbrains.wire_transport";
pub const WIRE_TRANSPORT_DATA: &str = "data";
pub const WIRE_TRANSPORT_TRIGGER_ONLY: &str = "trigger_only";
pub const DEST_SUFFIX_ATTR_PREFIX: &str = "ai.bytesandbrains.dest_suffix.";
pub const DEST_SITE_NAME_PREFIX: &str = "ai.bytesandbrains.dest_site_name.";
pub const CONCRETE_TYPE_KEY: &str = "ai.bytesandbrains.concrete_type";
pub const INSTANCE_KEY: &str = "ai.bytesandbrains.instance";
pub const REQUIRED_TRAIT_KEY: &str = "ai.bytesandbrains.required_trait";
pub const SLOT_ID_KEY: &str = "ai.bytesandbrains.slot_id";
pub const RECV_SLOT_ID_KEY: &str = "ai.bytesandbrains.recv_slot_id";
pub const DEFAULT_CLASS: &str = "ai.bytesandbrains.default_class";
pub const MODULE_PHASE_KEY: &str = "ai.bytesandbrains.module_phase";
pub const MODULE_PHASE_BODY: &str = "body";
pub const MODULE_PHASE_BOOTSTRAP: &str = "bootstrap";
pub const BACKEND_SUBGRAPH_OP: &str = "BackendSubgraph";
pub const BACKEND_SUBGRAPH_BODY_ATTR: &str = "body";
pub const DEDUP_SLOT: &str = "ai.bytesandbrains.dedup_slot";
pub const WIRE_ID_KEY: &str = "ai.bytesandbrains.wire.wire_id";
pub const BATCH_GROUP_KEY: &str = "ai.bytesandbrains.batch_group_id";
pub const TRIGGER_DENOTATION: &str = "bb.trigger";
pub const CHAIN_DEPTH_KEY: &str = "ai.bytesandbrains.wire.chain_depth";
pub const CHAIN_TARGETS_KEY: &str = "ai.bytesandbrains.wire.chain_targets";
pub use crate::syscall_ids::ATTR_PEER;
pub use crate::version::FRAMEWORK_IR_VERSION_KEY;
pub const DEP_SLOT_KEY_PREFIX: &str = "ai.bytesandbrains.dep.";
pub fn dep_slot_key(role: &str) -> String {
format!("{DEP_SLOT_KEY_PREFIX}{role}")
}
pub fn role_from_dep_slot_key(key: &str) -> Option<&str> {
key.strip_prefix(DEP_SLOT_KEY_PREFIX)
}
use crate::proto::onnx::{attribute_proto, AttributeProto};
pub fn dest_suffix_attribute(input_name: &str, address_bytes: Vec<u8>) -> AttributeProto {
AttributeProto {
name: format!("{DEST_SUFFIX_ATTR_PREFIX}{input_name}"),
r#type: attribute_proto::AttributeType::String as i32,
s: address_bytes,
..Default::default()
}
}
use crate::component::DependencyDecl;
use crate::proto::onnx::{NodeProto, StringStringEntryProto};
pub fn stamp_dependency_metadata(node: &mut NodeProto, deps: &[DependencyDecl]) {
for dep in deps {
let key = dep_slot_key(dep.role);
let already = node
.metadata_props
.iter()
.any(|e| e.key == key && e.value == dep.slot);
if already {
continue;
}
node.metadata_props.push(StringStringEntryProto {
key,
value: dep.slot.to_string(),
});
}
}
pub fn read_dependency_metadata(node: &NodeProto) -> impl Iterator<Item = (&str, &str)> + '_ {
node.metadata_props.iter().filter_map(|entry| {
let role = role_from_dep_slot_key(&entry.key)?;
Some((role, entry.value.as_str()))
})
}
use crate::proto::onnx::ModelProto;
pub const COMPILED_KEY: &str = "ai.bytesandbrains.compiled";
pub const COMPILED_CURRENT_VERSION: &str = "v1";
pub const BINDING_KEY_PREFIX: &str = "ai.bytesandbrains.binding.";
pub fn binding_key(target: &str, slot: &str) -> String {
format!("{BINDING_KEY_PREFIX}{target}.{slot}")
}
pub fn parse_binding_key(key: &str) -> Option<(&str, &str)> {
let rest = key.strip_prefix(BINDING_KEY_PREFIX)?;
let (target, slot) = rest.split_once('.')?;
Some((target, slot))
}
pub fn encode_binding_value(role: &str, type_name: &str, slot_id_or_neg1: i64) -> String {
format!("{role}|{type_name}|{slot_id_or_neg1}")
}
pub fn parse_binding_value(value: &str) -> Option<(&str, &str, i64)> {
let mut parts = value.splitn(3, '|');
let role = parts.next()?;
let type_name = parts.next()?;
let slot_id: i64 = parts.next()?.parse().ok()?;
Some((role, type_name, slot_id))
}
pub fn stamp_model_metadata(model: &mut ModelProto, key: &str, value: &str) {
if let Some(existing) = model.metadata_props.iter_mut().find(|e| e.key == key) {
existing.value = value.to_string();
return;
}
model.metadata_props.push(StringStringEntryProto {
key: key.to_string(),
value: value.to_string(),
});
}
pub fn read_model_metadata<'a>(model: &'a ModelProto, key: &str) -> Option<&'a str> {
model
.metadata_props
.iter()
.find(|e| e.key == key)
.map(|e| e.value.as_str())
}
use crate::proto::onnx::FunctionProto;
pub fn read_function_module_phase(function: &FunctionProto) -> Option<&str> {
function
.metadata_props
.iter()
.find(|e| e.key == MODULE_PHASE_KEY)
.map(|e| e.value.as_str())
}
pub fn stamp_function_module_phase(function: &mut FunctionProto, phase: &str) {
if let Some(existing) = function
.metadata_props
.iter_mut()
.find(|e| e.key == MODULE_PHASE_KEY)
{
existing.value = phase.to_string();
return;
}
function.metadata_props.push(StringStringEntryProto {
key: MODULE_PHASE_KEY.to_string(),
value: phase.to_string(),
});
}