diff --git a/crates/schema/public/enums/src/common/platform_type.rs b/crates/schema/public/enums/src/common/platform_type.rs index d1778f2c57..472e703062 100644 --- a/crates/schema/public/enums/src/common/platform_type.rs +++ b/crates/schema/public/enums/src/common/platform_type.rs @@ -26,6 +26,9 @@ pub enum PlatformType { /// Desktop app users DesktopApp, + /// Requests authenticated via an `Authorization` header API key (the Omni API surface). + ApiKey, + // ========== Other clients ========== Curl, @@ -42,6 +45,7 @@ impl PlatformType { match self { Self::Web => "web", Self::DesktopApp => "desktop_app", + Self::ApiKey => "api_key", Self::Curl => "curl", Self::PythonRequests => "python_requests", Self::Postman => "postman", @@ -52,6 +56,7 @@ impl PlatformType { match value { "web" => Ok(Self::Web), "desktop_app" => Ok(Self::DesktopApp), + "api_key" => Ok(Self::ApiKey), "curl" => Ok(Self::Curl), "python_requests" => Ok(Self::PythonRequests), "postman" => Ok(Self::Postman), @@ -64,6 +69,7 @@ impl PlatformType { BTreeSet::from([ Self::Web, Self::DesktopApp, + Self::ApiKey, Self::Curl, Self::PythonRequests, Self::Postman, @@ -84,6 +90,7 @@ mod tests { fn test_serialization() { assert_serialization(PlatformType::Web, "web"); assert_serialization(PlatformType::DesktopApp, "desktop_app"); + assert_serialization(PlatformType::ApiKey, "api_key"); assert_serialization(PlatformType::Curl, "curl"); assert_serialization(PlatformType::PythonRequests, "python_requests"); assert_serialization(PlatformType::Postman, "postman"); @@ -93,6 +100,7 @@ mod tests { fn to_str() { assert_eq!(PlatformType::Web.to_str(), "web"); assert_eq!(PlatformType::DesktopApp.to_str(), "desktop_app"); + assert_eq!(PlatformType::ApiKey.to_str(), "api_key"); assert_eq!(PlatformType::Curl.to_str(), "curl"); assert_eq!(PlatformType::PythonRequests.to_str(), "python_requests"); assert_eq!(PlatformType::Postman.to_str(), "postman"); @@ -102,6 +110,7 @@ mod tests { fn from_str() { assert_eq!(PlatformType::from_str("web").unwrap(), PlatformType::Web); assert_eq!(PlatformType::from_str("desktop_app").unwrap(), PlatformType::DesktopApp); + assert_eq!(PlatformType::from_str("api_key").unwrap(), PlatformType::ApiKey); assert_eq!(PlatformType::from_str("curl").unwrap(), PlatformType::Curl); assert_eq!(PlatformType::from_str("python_requests").unwrap(), PlatformType::PythonRequests); assert_eq!(PlatformType::from_str("postman").unwrap(), PlatformType::Postman); @@ -121,9 +130,10 @@ mod tests { #[test] fn all_variants() { let mut variants = PlatformType::all_variants(); - assert_eq!(variants.len(), 5); + assert_eq!(variants.len(), 6); assert_eq!(variants.pop_first(), Some(PlatformType::Web)); assert_eq!(variants.pop_first(), Some(PlatformType::DesktopApp)); + assert_eq!(variants.pop_first(), Some(PlatformType::ApiKey)); assert_eq!(variants.pop_first(), Some(PlatformType::Curl)); assert_eq!(variants.pop_first(), Some(PlatformType::PythonRequests)); assert_eq!(variants.pop_first(), Some(PlatformType::Postman)); diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/image/omni_api_image_generate_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/image/omni_api_image_generate_handler.rs index 1468e5aa9d..77811495f8 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/image/omni_api_image_generate_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/image/omni_api_image_generate_handler.rs @@ -14,6 +14,7 @@ use enums::by_table::prompts::prompt_type::PromptType; use enums::common::generation::common_generation_mode::CommonGenerationMode; use enums::common::generation::common_model_type::CommonModelType; use enums::common::generation_provider::GenerationProvider; +use enums::common::platform_type::PlatformType; use http_server_common::request::get_request_ip::get_request_ip; use mysql_queries::queries::debug_logs::insert_debug_log::{insert_debug_log, InsertDebugLogArgs}; use mysql_queries::queries::generic_inference::api_providers::seedance2pro::insert_generic_inference_job_for_seedance2pro_queue_with_apriori_job_token::KinoviVersion; @@ -35,7 +36,6 @@ use crate::http_server::endpoints::omni_api::generate::image::pipeline_v2::run_p use crate::http_server::session::lookup::user_session_feature_flags::UserSessionFeatureFlags; use crate::http_server::user_lookup::api_keys::require_api_key_user::require_api_key_user; use crate::http_server::validations::validate_idempotency_token_format::validate_idempotency_token_format; -use crate::http_server::web_utils::get_request_platform_type::get_request_platform_type; use crate::state::server_state::ServerState; use crate::util::lookup::lookup_media_files_as_cdn_url_list_and_map::lookup_media_files_as_cdn_url_list_and_map; @@ -78,10 +78,6 @@ pub async fn omni_api_image_generate_handler( let user_token = &api_session.user_token; - let maybe_avt_token = server_state - .avt_cookie_manager - .get_avt_token_from_request(&http_request); - // ==================== MODEL ACCESS CHECK ==================== // // API-key users have no per-user feature flags today. @@ -167,7 +163,8 @@ pub async fn omni_api_image_generate_handler( // ==================== WRITE RESULT ==================== // let ip_address = get_request_ip(&http_request); - let maybe_platform_type = get_request_platform_type(&http_request); + // Omni API requests are always API-key authenticated; hardcode the platform type. + let maybe_platform_type = Some(PlatformType::ApiKey); let mut transaction = mysql_connection .begin() @@ -262,7 +259,7 @@ pub async fn omni_api_image_generate_handler( apriori_job_token: &pipeline_result.apriori_job_token, idempotency_token: &idempotency_token, user_token, - maybe_avt_token: maybe_avt_token.as_ref(), + maybe_avt_token: None, // AVT tokens are web-session only; API-key callers have none. maybe_model_type: request.model.map(|v| v.to_common_model_type()), maybe_prompt_token: prompt_token.as_ref(), maybe_debug_log_event_token: Some(&debug_log_event_token), @@ -282,7 +279,7 @@ pub async fn omni_api_image_generate_handler( apriori_job_token: &pipeline_result.apriori_job_token, idempotency_token: &idempotency_token, user_token, - maybe_avt_token: maybe_avt_token.as_ref(), + maybe_avt_token: None, // AVT tokens are web-session only; API-key callers have none. maybe_model_type: request.model.map(|v| v.to_common_model_type()), maybe_prompt_token: prompt_token.as_ref(), maybe_debug_log_event_token: Some(&debug_log_event_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/omni_api_video_generate_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/omni_api_video_generate_handler.rs index 62c26f18b2..1594305c47 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/omni_api_video_generate_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/omni_api_video_generate_handler.rs @@ -16,6 +16,7 @@ use enums::common::generation::common_generation_mode::CommonGenerationMode; use enums::common::generation::common_model_type::CommonModelType; use enums::common::generation::common_video_model::CommonVideoModel; use enums::common::generation_provider::GenerationProvider; +use enums::common::platform_type::PlatformType; use http_server_common::request::get_request_ip::get_request_ip; use mysql_queries::queries::debug_logs::insert_debug_log::{insert_debug_log, InsertDebugLogArgs}; use mysql_queries::queries::generic_inference::api_providers::seedance2pro::insert_generic_inference_job_for_seedance2pro_queue_with_apriori_job_token::KinoviVersion; @@ -44,7 +45,6 @@ use crate::http_server::endpoints::omni_api::shared_utils::video::validate_video use crate::http_server::session::lookup::user_session_feature_flags::UserSessionFeatureFlags; use crate::http_server::user_lookup::api_keys::require_api_key_user::require_api_key_user; use crate::http_server::validations::validate_idempotency_token_format::validate_idempotency_token_format; -use crate::http_server::web_utils::get_request_platform_type::get_request_platform_type; use crate::state::server_state::ServerState; use crate::util::lookup::lookup_media_files_as_cdn_url_list_and_map::lookup_media_files_as_cdn_url_list_and_map; @@ -91,10 +91,6 @@ pub async fn omni_api_video_generate_handler( let user_token = &api_session.user_token; - let maybe_avt_token = server_state - .avt_cookie_manager - .get_avt_token_from_request(&http_request); - // ==================== MODEL ACCESS CHECK ==================== // // API-key users have no per-user feature flags today. @@ -243,7 +239,8 @@ pub async fn omni_api_video_generate_handler( // ==================== WRITE RESULT ==================== // let ip_address = get_request_ip(&http_request); - let maybe_platform_type = get_request_platform_type(&http_request); + // Omni API requests are always API-key authenticated; hardcode the platform type. + let maybe_platform_type = Some(PlatformType::ApiKey); let mut transaction = mysql_connection.begin().await.map_err(|err| { error!("Error starting MySQL transaction: {:?}", err); @@ -344,7 +341,7 @@ pub async fn omni_api_video_generate_handler( apriori_job_token: &pipeline_result.billing.apriori_job_token, idempotency_token: &idempotency_token, user_token, - maybe_avt_token: maybe_avt_token.as_ref(), + maybe_avt_token: None, // AVT tokens are web-session only; API-key callers have none. maybe_model_type: request.model.map(|v| v.to_common_model_type()), maybe_prompt_token: prompt_token.as_ref(), maybe_debug_log_event_token: Some(&debug_log_event_token), @@ -368,7 +365,7 @@ pub async fn omni_api_video_generate_handler( apriori_job_token: &pipeline_result.billing.apriori_job_token, idempotency_token: &idempotency_token, user_token, - maybe_avt_token: maybe_avt_token.as_ref(), + maybe_avt_token: None, // AVT tokens are web-session only; API-key callers have none. maybe_model_type: request.model.map(|v| v.to_common_model_type()), maybe_prompt_token: prompt_token.as_ref(), maybe_debug_log_event_token: Some(&debug_log_event_token), @@ -398,7 +395,7 @@ pub async fn omni_api_video_generate_handler( apriori_job_token: &pipeline_result.billing.apriori_job_token, idempotency_token: &idempotency_token, user_token, - maybe_avt_token: maybe_avt_token.as_ref(), + maybe_avt_token: None, // AVT tokens are web-session only; API-key callers have none. maybe_model_type: request.model.map(|v| v.to_common_model_type()), maybe_prompt_token: prompt_token.as_ref(), maybe_debug_log_event_token: Some(&debug_log_event_token), @@ -422,7 +419,7 @@ pub async fn omni_api_video_generate_handler( apriori_job_token: &pipeline_result.billing.apriori_job_token, idempotency_token: &idempotency_token, user_token, - maybe_avt_token: maybe_avt_token.as_ref(), + maybe_avt_token: None, // AVT tokens are web-session only; API-key callers have none. maybe_model_type: request.model.map(|v| v.to_common_model_type()), maybe_prompt_token: prompt_token.as_ref(), maybe_debug_log_event_token: Some(&debug_log_event_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_audio_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_audio_media_file_handler.rs index b1e444adae..d2055f62b7 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_audio_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_audio_media_file_handler.rs @@ -127,10 +127,6 @@ pub async fn omni_upload_audio_media_file_handler( let maybe_user_token = Some(&api_session.user_token); - let maybe_avt_token = server_state - .avt_cookie_manager - .get_avt_token_from_request(&http_request); - // ==================== RATE LIMIT ==================== // let rate_limiter = &server_state.redis_rate_limiters.file_upload_logged_in; @@ -283,7 +279,8 @@ pub async fn omni_upload_audio_media_file_handler( maybe_media_class: Some(MediaFileClass::Audio), media_file_type: MediaFileType::Audio, maybe_creator_user_token: maybe_user_token, - maybe_creator_anonymous_visitor_token: maybe_avt_token.as_ref(), + // NB: AVT (anonymous visitor) tokens are a web-session concept; API-key callers have none. + maybe_creator_anonymous_visitor_token: None, creator_ip_address: &ip_address, creator_set_visibility, upload_type, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_image_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_image_media_file_handler.rs index e36f5b63a6..a7efced045 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_image_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_image_media_file_handler.rs @@ -138,10 +138,6 @@ pub async fn omni_upload_image_media_file_handler( let maybe_user_token = Some(&api_session.user_token); - let maybe_avt_token = server_state - .avt_cookie_manager - .get_avt_token_from_request(&http_request); - // ==================== HANDLE IDEMPOTENCY ==================== // let uuid_idempotency_token = form.uuid_idempotency_token.as_ref(); @@ -275,7 +271,8 @@ pub async fn omni_upload_image_media_file_handler( maybe_media_class: Some(MediaFileClass::Image), media_file_type, maybe_creator_user_token: maybe_user_token, - maybe_creator_anonymous_visitor_token: maybe_avt_token.as_ref(), + // NB: AVT (anonymous visitor) tokens are a web-session concept; API-key callers have none. + maybe_creator_anonymous_visitor_token: None, creator_ip_address: &ip_address, creator_set_visibility, upload_type, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_video_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_video_media_file_handler.rs index 66b23f6b95..340a7f9010 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_video_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_video_media_file_handler.rs @@ -165,10 +165,6 @@ pub async fn omni_upload_video_media_file_handler( let maybe_user_token = Some(&api_session.user_token); - let maybe_avt_token = server_state - .avt_cookie_manager - .get_avt_token_from_request(&http_request); - // ==================== RATE LIMIT ==================== // let rate_limiter = &server_state.redis_rate_limiters.file_upload_logged_in; @@ -464,7 +460,8 @@ pub async fn omni_upload_video_media_file_handler( maybe_media_class: Some(MediaFileClass::Video), media_file_type: MediaFileType::Video, maybe_creator_user_token: maybe_user_token, - maybe_creator_anonymous_visitor_token: maybe_avt_token.as_ref(), + // NB: AVT (anonymous visitor) tokens are a web-session concept; API-key callers have none. + maybe_creator_anonymous_visitor_token: None, creator_ip_address: &ip_address, creator_set_visibility, upload_type,