Normalize endpoint API root handling

This commit is contained in:
fawney19
2026-05-29 02:29:33 +08:00
parent ef2953038e
commit b59c724455
46 changed files with 1179 additions and 205 deletions
+26 -24
View File
@@ -15,6 +15,14 @@ use crate::{
DEFAULT_VIDEO_TASK_POLL_INTERVAL_SECONDS,
};
fn openai_video_resource_url(api_root: &str, suffix: &str) -> String {
format!(
"{}/videos/{}",
api_root.trim_end_matches('/'),
suffix.trim_start_matches('/')
)
}
pub fn map_openai_stored_task_to_read_response(
task: StoredVideoTask,
) -> LocalVideoTaskReadResponse {
@@ -187,10 +195,9 @@ impl OpenAiVideoTaskSeed {
headers.remove("content-type");
headers.remove("content-length");
(
format!(
"{}/v1/videos/{}/content",
self.transport.upstream_base_url.trim_end_matches('/'),
self.upstream_task_id
openai_video_resource_url(
&self.transport.upstream_base_url,
format!("{}/content", self.upstream_task_id).as_str(),
),
headers,
)
@@ -200,10 +207,9 @@ impl OpenAiVideoTaskSeed {
headers.remove("content-type");
headers.remove("content-length");
(
format!(
"{}/v1/videos/{}/content?variant={variant}",
self.transport.upstream_base_url.trim_end_matches('/'),
self.upstream_task_id
openai_video_resource_url(
&self.transport.upstream_base_url,
format!("{}/content?variant={variant}", self.upstream_task_id).as_str(),
),
headers,
)
@@ -322,10 +328,9 @@ impl OpenAiVideoTaskSeed {
endpoint_id: self.transport.endpoint_id.clone(),
key_id: self.transport.key_id.clone(),
method: "DELETE".to_string(),
url: format!(
"{}/v1/videos/{}",
self.transport.upstream_base_url.trim_end_matches('/'),
self.upstream_task_id
url: openai_video_resource_url(
&self.transport.upstream_base_url,
&self.upstream_task_id,
),
headers,
content_type: None,
@@ -384,10 +389,9 @@ impl OpenAiVideoTaskSeed {
endpoint_id: self.transport.endpoint_id.clone(),
key_id: self.transport.key_id.clone(),
method: "GET".to_string(),
url: format!(
"{}/v1/videos/{}",
self.transport.upstream_base_url.trim_end_matches('/'),
self.upstream_task_id
url: openai_video_resource_url(
&self.transport.upstream_base_url,
&self.upstream_task_id,
),
headers,
content_type: None,
@@ -448,10 +452,9 @@ impl OpenAiVideoTaskSeed {
endpoint_id: self.transport.endpoint_id.clone(),
key_id: self.transport.key_id.clone(),
method: "DELETE".to_string(),
url: format!(
"{}/v1/videos/{}",
self.transport.upstream_base_url.trim_end_matches('/'),
self.upstream_task_id
url: openai_video_resource_url(
&self.transport.upstream_base_url,
&self.upstream_task_id,
),
headers,
content_type: None,
@@ -547,10 +550,9 @@ impl OpenAiVideoTaskSeed {
endpoint_id: self.transport.endpoint_id.clone(),
key_id: self.transport.key_id.clone(),
method: "POST".to_string(),
url: format!(
"{}/v1/videos/{}/remix",
self.transport.upstream_base_url.trim_end_matches('/'),
self.upstream_task_id
url: openai_video_resource_url(
&self.transport.upstream_base_url,
format!("{}/remix", self.upstream_task_id).as_str(),
),
headers,
content_type: Some(content_type),
@@ -13,7 +13,7 @@ use crate::{
impl LocalVideoTaskTransport {
pub fn from_plan(plan: &ExecutionPlan) -> Option<Self> {
let upstream_base_url = match plan.provider_api_format.as_str() {
"openai:video" => plan.url.split("/v1/videos").next()?.to_string(),
"openai:video" => trim_openai_video_resource_root(&plan.url)?,
"gemini:video" => plan.url.split("/v1beta/").next()?.to_string(),
_ => return None,
};
@@ -55,6 +55,15 @@ impl LocalVideoTaskTransport {
}
}
fn trim_openai_video_resource_root(url: &str) -> Option<String> {
let base = url.split_once('?').map(|(base, _)| base).unwrap_or(url);
let (root, suffix) = base.rsplit_once("/videos")?;
if !suffix.is_empty() && !suffix.starts_with('/') {
return None;
}
Some(root.to_string())
}
impl LocalVideoTaskPersistence {
pub fn from_report_context(report_context: &Map<String, Value>, plan: &ExecutionPlan) -> Self {
Self {