Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "behavioralsignals"
version = "0.1.1"
version = "0.2.0"
description = "Python SDK for Behavioral Signals API"
readme = "README.md"
authors = []
Expand Down
5 changes: 4 additions & 1 deletion src/behavioralsignals/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,20 +40,23 @@ def _send_request(
path: str,
method: str = "GET",
data: Optional[dict] = None,
json: Optional[dict] = None,
headers: Optional[dict] = None,
files: Optional[dict] = None,
):
url = self.config.api_url + "/" + path
if headers is None:
headers = self._get_default_headers()
else:
headers = {**self._get_default_headers(), **headers}

if method == "GET":
response = self.session.get(
url, headers=headers, params=data, timeout=self.config.timeout
)
elif method == "POST":
response = self.session.post(
url, headers=headers, data=data, files=files, timeout=self.config.timeout
url, headers=headers, data=data, files=files, json=json, timeout=self.config.timeout
)
else:
raise ValueError(f"Unsupported method: {method}")
Expand Down
44 changes: 44 additions & 0 deletions src/behavioralsignals/behavioral.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
ResultResponse,
StreamingOptions,
AudioUploadParams,
S3UrlUploadParams,
ProcessListParams,
ProcessListResponse,
StreamingResultResponse,
Expand Down Expand Up @@ -57,6 +58,49 @@ def upload_audio(

return ProcessItem(**data)

def upload_s3_presigned_url(
self,
url: str,
name: Optional[str] = None,
embeddings: bool = False,
meta: Optional[str] = None,
) -> ProcessItem:
"""Uploads an S3 presigned url pointing to an audio file and returns the process item.

Args:
url (str): The S3 presigned url.
name (str, optional): Optional name for the job request. Defaults to filename.
embeddings (bool): Whether to include speaker and behavioral embeddings. Defaults to False.
meta (str, optional): Metadata json containing any extra user-defined metadata.
Returns:
ProcessItem: The process item containing details about the submitted process.
"""
# Create and validate parameters
params = S3UrlUploadParams(url=url, name=name, embeddings=embeddings, meta=meta)

# Use provided name or default to filename
job_name = params.name

payload = {
"url": params.url,
"name": job_name,
"embeddings": params.embeddings
}

if params.meta:
payload["meta"] = params.meta

headers = {"content-type": "application/json"}

response = self._send_request(
path=f"clients/{self.config.cid}/processes/s3-presigned-url",
method="POST",
json=payload,
headers=headers
)

return ProcessItem(**response)

def list_processes(
self,
page: int = 0,
Expand Down
44 changes: 44 additions & 0 deletions src/behavioralsignals/deepfakes.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
ResultResponse,
StreamingOptions,
AudioUploadParams,
S3UrlUploadParams,
ProcessListParams,
ProcessListResponse,
StreamingResultResponse,
Expand Down Expand Up @@ -57,6 +58,49 @@ def upload_audio(

return ProcessItem(**data)

def upload_s3_presigned_url(
self,
url: str,
name: Optional[str] = None,
embeddings: bool = False,
meta: Optional[str] = None,
) -> ProcessItem:
"""Uploads an S3 presigned url pointing to an audio file and returns the process item.

Args:
url (str): The S3 presigned url.
name (str, optional): Optional name for the job request. Defaults to filename.
embeddings (bool): Whether to include speaker and behavioral embeddings. Defaults to False.
meta (str, optional): Metadata json containing any extra user-defined metadata.
Returns:
ProcessItem: The process item containing details about the submitted process.
"""
# Create and validate parameters
params = S3UrlUploadParams(url=url, name=name, embeddings=embeddings, meta=meta)

# Use provided name or default to filename
job_name = params.name

payload = {
"url": params.url,
"name": job_name,
"embeddings": params.embeddings
}

if params.meta:
payload["meta"] = params.meta

headers = {"content-type": "application/json"}

response = self._send_request(
path=f"detection/clients/{self.config.cid}/processes/s3-presigned-url",
method="POST",
json=payload,
headers=headers
)

return ProcessItem(**response)

def list_processes(
self,
page: int = 0,
Expand Down
21 changes: 21 additions & 0 deletions src/behavioralsignals/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,27 @@ def validate_meta_json(cls, v):
return v


class S3UrlUploadParams(BaseModel):
url: str = Field(..., description="The S3 presigned url containing the audio")
name: Optional[str] = Field(None, description="Optional name for the job request")
embeddings: bool = Field(
False, description="Whether to include speaker and behavioral embeddings in the result"
)
meta: Optional[str] = Field(
None, description="Metadata json containing any extra user-defined metadata"
)

@field_validator("meta")
@classmethod
def validate_meta_json(cls, v):
if v is not None:
try:
json.loads(v)
except json.JSONDecodeError:
raise ValueError("meta must be valid JSON string")
return v


class ProcessItem(BaseModel):
"""Individual process in the list"""

Expand Down