use crate::client::OpenAI;
#[cfg(not(target_arch = "wasm32"))]
use crate::error::OpenAIError;
#[cfg(not(target_arch = "wasm32"))]
use crate::types::content_provenance::{ContentProvenanceCheck, ContentProvenanceCheckParams};
pub struct ContentProvenanceChecks<'a> {
client: &'a OpenAI,
}
impl<'a> ContentProvenanceChecks<'a> {
pub(crate) fn new(client: &'a OpenAI) -> Self {
Self { client }
}
#[cfg(not(target_arch = "wasm32"))]
pub async fn create(
&self,
params: ContentProvenanceCheckParams,
) -> Result<ContentProvenanceCheck, OpenAIError> {
let form = reqwest::multipart::Form::new().part(
"file",
reqwest::multipart::Part::bytes(params.file).file_name(params.filename),
);
self.client
.post_multipart("/content_provenance_checks", form)
.await
}
#[cfg(not(target_arch = "wasm32"))]
pub async fn from_path(
&self,
path: impl AsRef<std::path::Path>,
) -> Result<ContentProvenanceCheck, OpenAIError> {
let path = path.as_ref();
let filename = path
.file_name()
.and_then(|n| n.to_str())
.unwrap_or("upload")
.to_string();
let data = tokio::fs::read(path).await.map_err(|e| {
OpenAIError::InvalidArgument(format!("failed to read {}: {e}", path.display()))
})?;
self.create(ContentProvenanceCheckParams::new(data, filename))
.await
}
}
#[cfg(all(test, not(target_arch = "wasm32")))]
mod tests {
use crate::OpenAI;
use crate::config::ClientConfig;
use crate::types::content_provenance::{ContentProvenanceCheckParams, ContentProvenanceResult};
#[tokio::test]
async fn test_content_provenance_check_create() {
let mut server = mockito::Server::new_async().await;
let mock = server
.mock("POST", "/content_provenance_checks")
.match_header("authorization", "Bearer sk-test")
.with_status(200)
.with_header("content-type", "application/json")
.with_body(
r#"{
"created_at": 1700000000,
"object": "content_provenance_check",
"results": [
{
"type": "c2pa",
"outcome": "detected",
"validation_state": "trusted",
"issuer": "OpenAI",
"model": "gpt-image-1",
"generated_at": "2026-08-19T00:00:00Z"
},
{
"type": "synthid",
"outcome": "not_detected"
}
]
}"#,
)
.create_async()
.await;
let client = OpenAI::with_config(ClientConfig::new("sk-test").base_url(server.url()));
let params = ContentProvenanceCheckParams::new(vec![0xFF, 0xD8, 0xFF], "photo.jpg");
let check = client
.content_provenance_checks()
.create(params)
.await
.unwrap();
assert_eq!(check.object, "content_provenance_check");
assert_eq!(check.results.len(), 2);
match &check.results[0] {
ContentProvenanceResult::C2pa(c2pa) => {
assert_eq!(c2pa.issuer.as_deref(), Some("OpenAI"));
}
other => panic!("expected C2PA result, got {other:?}"),
}
assert!(matches!(
&check.results[1],
ContentProvenanceResult::SynthId(_)
));
mock.assert_async().await;
}
}