use crate::{
Cap, CapRegistry, CapUrn, CapUrnBuilder, MEDIA_DISBOUND_PAGES, MEDIA_DOCUMENT_OUTLINE, MEDIA_FILE_METADATA, MediaUrn, RegistryError
};
use crate::media_urn::{
MEDIA_STRING, MEDIA_INTEGER, MEDIA_BOOLEAN, MEDIA_OBJECT, MEDIA_BINARY,
MEDIA_PNG,
MEDIA_PDF, MEDIA_EPUB,
MEDIA_MD, MEDIA_TXT, MEDIA_RST, MEDIA_LOG,
MEDIA_FRONTMATTER_TEXT, MEDIA_MODEL_SPEC,
MEDIA_MODEL_REPO, MEDIA_JSON_SCHEMA,
MEDIA_IMAGE_THUMBNAIL,
MEDIA_MODEL_DIM, MEDIA_DOWNLOAD_OUTPUT,
MEDIA_LIST_OUTPUT, MEDIA_STATUS_OUTPUT, MEDIA_CONTENTS_OUTPUT,
MEDIA_EMBEDDING_VECTOR, MEDIA_JSON, MEDIA_LLM_INFERENCE_OUTPUT,
MEDIA_DECISION, MEDIA_DECISION_ARRAY,
};
use std::sync::Arc;
pub fn input_media_urn_for_ext(ext: Option<&str>) -> &'static str {
match ext {
Some("pdf") => MEDIA_PDF,
Some("epub") => MEDIA_EPUB,
Some("md") => MEDIA_MD,
Some("txt") => MEDIA_TXT,
Some("rst") => MEDIA_RST,
Some("log") => MEDIA_LOG,
Some("text") => MEDIA_STRING,
None => MEDIA_BINARY,
Some(_) => MEDIA_BINARY,
}
}
pub fn llm_conversation_urn(lang_code: &str) -> CapUrn {
CapUrnBuilder::new()
.tag("op", "conversation")
.solo_tag("constrained")
.tag("language", lang_code)
.in_spec(MEDIA_STRING)
.out_spec(MEDIA_LLM_INFERENCE_OUTPUT)
.build()
.expect("Failed to build conversation cap URN")
}
pub fn llm_multiplechoice_urn(lang_code: &str) -> CapUrn {
CapUrnBuilder::new()
.tag("op", "multiplechoice")
.solo_tag("constrained")
.tag("language", lang_code)
.in_spec(MEDIA_STRING)
.out_spec(MEDIA_LLM_INFERENCE_OUTPUT)
.build()
.expect("Failed to build multiplechoice cap URN")
}
pub fn llm_codegeneration_urn(lang_code: &str) -> CapUrn {
CapUrnBuilder::new()
.tag("op", "codegeneration")
.solo_tag("constrained")
.tag("language", lang_code)
.in_spec(MEDIA_STRING)
.out_spec(MEDIA_LLM_INFERENCE_OUTPUT)
.build()
.expect("Failed to build codegeneration cap URN")
}
pub fn llm_creative_urn(lang_code: &str) -> CapUrn {
CapUrnBuilder::new()
.tag("op", "creative")
.solo_tag("constrained")
.tag("language", lang_code)
.in_spec(MEDIA_STRING)
.out_spec(MEDIA_LLM_INFERENCE_OUTPUT)
.build()
.expect("Failed to build creative cap URN")
}
pub fn llm_summarization_urn(lang_code: &str) -> CapUrn {
CapUrnBuilder::new()
.tag("op", "summarization")
.solo_tag("constrained")
.tag("language", lang_code)
.in_spec(MEDIA_STRING)
.out_spec(MEDIA_LLM_INFERENCE_OUTPUT)
.build()
.expect("Failed to build summarization cap URN")
}
pub fn embeddings_dimensions_urn() -> CapUrn {
CapUrnBuilder::new()
.tag("op", "embeddings_dimensions")
.in_spec(MEDIA_MODEL_SPEC)
.out_spec(MEDIA_MODEL_DIM)
.build()
.expect("Failed to build embeddings-dimensions cap URN")
}
pub fn embeddings_generation_urn() -> CapUrn {
CapUrnBuilder::new()
.tag("op", "generate_embeddings")
.in_spec(MEDIA_STRING)
.out_spec(MEDIA_EMBEDDING_VECTOR)
.build()
.expect("Failed to build embeddings-generation cap URN")
}
pub fn image_embeddings_generation_urn() -> CapUrn {
CapUrnBuilder::new()
.tag("op", "generate_image_embeddings")
.solo_tag("ml-model")
.solo_tag("candle")
.in_spec(MEDIA_PNG)
.out_spec(MEDIA_EMBEDDING_VECTOR)
.build()
.expect("Failed to build image-embeddings-generation cap URN")
}
pub fn model_download_urn() -> CapUrn {
CapUrnBuilder::new()
.tag("op", "download-model")
.in_spec(MEDIA_MODEL_SPEC)
.out_spec(MEDIA_DOWNLOAD_OUTPUT)
.build()
.expect("Failed to build model-download cap URN")
}
pub fn model_list_urn() -> CapUrn {
CapUrnBuilder::new()
.tag("op", "list-models")
.in_spec(MEDIA_MODEL_REPO)
.out_spec(MEDIA_LIST_OUTPUT)
.build()
.expect("Failed to build model-list cap URN")
}
pub fn model_status_urn() -> CapUrn {
CapUrnBuilder::new()
.tag("op", "model-status")
.in_spec(MEDIA_MODEL_SPEC)
.out_spec(MEDIA_STATUS_OUTPUT)
.build()
.expect("Failed to build model-status cap URN")
}
pub fn model_contents_urn() -> CapUrn {
CapUrnBuilder::new()
.tag("op", "model-contents")
.in_spec(MEDIA_MODEL_SPEC)
.out_spec(MEDIA_CONTENTS_OUTPUT)
.build()
.expect("Failed to build model-contents cap URN")
}
pub fn generate_thumbnail_urn(ext: Option<&str>) -> CapUrn {
let input_spec = input_media_urn_for_ext(ext);
CapUrnBuilder::new()
.tag("op", "generate_thumbnail")
.in_spec(input_spec)
.out_spec(MEDIA_IMAGE_THUMBNAIL)
.build()
.expect("Failed to build generate-thumbnail cap URN")
}
pub fn disbind_urn(ext: Option<&str>) -> CapUrn {
CapUrnBuilder::new()
.tag("op", "disbind")
.in_spec(input_media_urn_for_ext(ext))
.out_spec(MEDIA_DISBOUND_PAGES)
.build()
.expect("Failed to build disbind cap URN")
}
pub fn extract_metadata_urn(ext: Option<&str>) -> CapUrn {
CapUrnBuilder::new()
.tag("op", "extract_metadata")
.in_spec(input_media_urn_for_ext(ext))
.out_spec(MEDIA_FILE_METADATA)
.build()
.expect("Failed to build extract-metadata cap URN")
}
pub fn extract_outline_urn(ext: Option<&str>) -> CapUrn {
CapUrnBuilder::new()
.tag("op", "extract_outline")
.in_spec(input_media_urn_for_ext(ext))
.out_spec(MEDIA_DOCUMENT_OUTLINE)
.build()
.expect("Failed to build extract-outline cap URN")
}
pub fn frontmatter_summarization_urn(lang_code: &str) -> CapUrn {
CapUrnBuilder::new()
.tag("op", "generate_frontmatter_summary")
.tag("language", lang_code)
.solo_tag("constrained")
.in_spec(MEDIA_FRONTMATTER_TEXT)
.out_spec(MEDIA_STRING)
.build()
.expect("Failed to build frontmatter-summarization cap URN")
}
pub fn structured_query_urn(lang_code: &str) -> CapUrn {
CapUrnBuilder::new()
.tag("op", "query_structured")
.tag("language", lang_code)
.solo_tag("constrained")
.in_spec(MEDIA_JSON_SCHEMA)
.out_spec(MEDIA_JSON)
.build()
.expect("Failed to build structured-query cap URN")
}
pub fn bit_choice_urn(lang_code: &str) -> CapUrn {
CapUrnBuilder::new()
.tag("op", "choose_bit")
.tag("language", lang_code)
.solo_tag("constrained")
.in_spec(MEDIA_STRING)
.out_spec(MEDIA_DECISION)
.build()
.expect("Failed to build bit-choice cap URN")
}
pub fn bit_choices_urn(lang_code: &str) -> CapUrn {
CapUrnBuilder::new()
.tag("op", "choose_bits")
.tag("language", lang_code)
.solo_tag("constrained")
.in_spec(MEDIA_STRING)
.out_spec(MEDIA_DECISION_ARRAY)
.build()
.expect("Failed to build bit-choices cap URN")
}
pub fn recategorization_task_urn(lang_code: &str) -> CapUrn {
CapUrnBuilder::new()
.tag("op", "recategorize_listing")
.tag("language", lang_code)
.in_spec(MEDIA_BINARY) .out_spec(MEDIA_OBJECT) .build()
.expect("Failed to build recategorization-task cap URN")
}
pub fn listing_analysis_task_urn(lang_code: &str) -> CapUrn {
CapUrnBuilder::new()
.tag("op", "request_listing_analysis")
.tag("language", lang_code)
.in_spec(MEDIA_BINARY) .out_spec(MEDIA_OBJECT) .build()
.expect("Failed to build listing-analysis-task cap URN")
}
pub fn coerce_to_string_urn(source_type: &str) -> CapUrn {
coercion_urn(source_type, "string")
}
pub fn coerce_to_integer_urn(source_type: &str) -> CapUrn {
coercion_urn(source_type, "integer")
}
pub fn coerce_to_number_urn(source_type: &str) -> CapUrn {
coercion_urn(source_type, "number")
}
pub fn coerce_to_object_urn(source_type: &str) -> CapUrn {
coercion_urn(source_type, "object")
}
fn media_urn_for_type(type_name: &str) -> &'static str {
match type_name {
"string" => MEDIA_STRING,
"integer" => MEDIA_INTEGER,
"number" => crate::media_urn::MEDIA_NUMBER,
"boolean" => MEDIA_BOOLEAN,
"object" => MEDIA_OBJECT,
"string-array" => crate::media_urn::MEDIA_STRING_ARRAY,
"integer-array" => crate::media_urn::MEDIA_INTEGER_ARRAY,
"number-array" => crate::media_urn::MEDIA_NUMBER_ARRAY,
"boolean-array" => crate::media_urn::MEDIA_BOOLEAN_ARRAY,
"object-array" => crate::media_urn::MEDIA_OBJECT_ARRAY,
other => panic!("Unknown media type: {}. Valid types are: string, integer, number, boolean, object, string-array, integer-array, number-array, boolean-array, object-array", other),
}
}
pub fn coercion_urn(source_type: &str, target_type: &str) -> CapUrn {
let in_spec = media_urn_for_type(source_type);
let out_spec = media_urn_for_type(target_type);
CapUrnBuilder::new()
.tag("op", "coerce")
.tag("target", target_type)
.in_spec(in_spec)
.out_spec(out_spec)
.build()
.expect("Failed to build coercion cap URN")
}
pub fn all_coercion_paths() -> Vec<(&'static str, &'static str)> {
vec![
("integer", "string"),
("number", "string"),
("boolean", "string"),
("object", "string"),
("string-array", "string"),
("integer-array", "string"),
("number-array", "string"),
("boolean-array", "string"),
("object-array", "string"),
("string", "integer"),
("number", "integer"),
("boolean", "integer"),
("string", "number"),
("integer", "number"),
("boolean", "number"),
("string", "object"),
("integer", "object"),
("number", "object"),
("boolean", "object"),
]
}
pub async fn llm_conversation(registry: Arc<CapRegistry>, lang_code: &str) -> Result<Cap, RegistryError> {
let urn = llm_conversation_urn(lang_code);
registry.get_cap(&urn.to_string()).await
}
pub async fn llm_multiplechoice(registry: Arc<CapRegistry>, lang_code: &str) -> Result<Cap, RegistryError> {
let urn = llm_multiplechoice_urn(lang_code);
registry.get_cap(&urn.to_string()).await
}
pub async fn llm_codegeneration(registry: Arc<CapRegistry>, lang_code: &str) -> Result<Cap, RegistryError> {
let urn = llm_codegeneration_urn(lang_code);
registry.get_cap(&urn.to_string()).await
}
pub async fn llm_creative(registry: Arc<CapRegistry>, lang_code: &str) -> Result<Cap, RegistryError> {
let urn = llm_creative_urn(lang_code);
registry.get_cap(&urn.to_string()).await
}
pub async fn llm_summarization(registry: Arc<CapRegistry>, lang_code: &str) -> Result<Cap, RegistryError> {
let urn = llm_summarization_urn(lang_code);
registry.get_cap(&urn.to_string()).await
}
pub async fn embeddings_dimensions_cap(registry: Arc<CapRegistry>) -> Result<Cap, RegistryError> {
let urn = embeddings_dimensions_urn();
registry.get_cap(&urn.to_string()).await
}
pub async fn embeddings_generation_cap(registry: Arc<CapRegistry>) -> Result<Cap, RegistryError> {
let urn = embeddings_generation_urn();
registry.get_cap(&urn.to_string()).await
}
pub async fn image_embeddings_generation_cap(registry: Arc<CapRegistry>) -> Result<Cap, RegistryError> {
let urn = image_embeddings_generation_urn();
registry.get_cap(&urn.to_string()).await
}
pub async fn model_download_cap(registry: Arc<CapRegistry>) -> Result<Cap, RegistryError> {
let urn = model_download_urn();
registry.get_cap(&urn.to_string()).await
}
pub async fn model_list_cap(registry: Arc<CapRegistry>) -> Result<Cap, RegistryError> {
let urn = model_list_urn();
registry.get_cap(&urn.to_string()).await
}
pub async fn model_status_cap(registry: Arc<CapRegistry>) -> Result<Cap, RegistryError> {
let urn = model_status_urn();
registry.get_cap(&urn.to_string()).await
}
pub async fn model_contents_cap(registry: Arc<CapRegistry>) -> Result<Cap, RegistryError> {
let urn = model_contents_urn();
registry.get_cap(&urn.to_string()).await
}
pub async fn extract_metadata_cap(registry: Arc<CapRegistry>, ext: Option<&str>) -> Result<Cap, RegistryError> {
let urn = extract_metadata_urn(ext);
registry.get_cap(&urn.to_string()).await
}
pub async fn generate_thumbnail_cap(registry: Arc<CapRegistry>, ext: Option<&str>) -> Result<Cap, RegistryError> {
let urn = generate_thumbnail_urn(ext);
registry.get_cap(&urn.to_string()).await
}
pub async fn extract_outline_cap(registry: Arc<CapRegistry>, ext: Option<&str>) -> Result<Cap, RegistryError> {
let urn = extract_outline_urn(ext);
registry.get_cap(&urn.to_string()).await
}
pub async fn disbind_cap(registry: Arc<CapRegistry>, ext: Option<&str>) -> Result<Cap, RegistryError> {
let urn = disbind_urn(ext);
registry.get_cap(&urn.to_string()).await
}
pub async fn frontmatter_summarization_cap(registry: Arc<CapRegistry>, lang_code: &str) -> Result<Cap, RegistryError> {
let urn = frontmatter_summarization_urn(lang_code);
registry.get_cap(&urn.to_string()).await
}
pub async fn structured_query_cap(registry: Arc<CapRegistry>, lang_code: &str) -> Result<Cap, RegistryError> {
let urn = structured_query_urn(lang_code);
registry.get_cap(&urn.to_string()).await
}
pub async fn bit_choice_cap(registry: Arc<CapRegistry>, lang_code: &str) -> Result<Cap, RegistryError> {
let urn = bit_choice_urn(lang_code);
registry.get_cap(&urn.to_string()).await
}
pub async fn bit_choices_cap(registry: Arc<CapRegistry>, lang_code: &str) -> Result<Cap, RegistryError> {
let urn = bit_choices_urn(lang_code);
registry.get_cap(&urn.to_string()).await
}
pub async fn coercion_cap(registry: Arc<CapRegistry>, source_type: &str, target_type: &str) -> Result<Cap, RegistryError> {
let urn = coercion_urn(source_type, target_type);
registry.get_cap(&urn.to_string()).await
}
pub async fn all_coercion_caps(registry: Arc<CapRegistry>) -> Result<Vec<(&'static str, &'static str, Cap)>, RegistryError> {
let mut caps = Vec::new();
for (source_type, target_type) in all_coercion_paths() {
let cap = coercion_cap(registry.clone(), source_type, target_type).await?;
caps.push((source_type, target_type, cap));
}
Ok(caps)
}