diff --git a/src/gradient_labs/__init__.py b/src/gradient_labs/__init__.py index 2ccbf89..a3bf2e6 100644 --- a/src/gradient_labs/__init__.py +++ b/src/gradient_labs/__init__.py @@ -6,3 +6,4 @@ from .webhook import * from .note import * from .traffic_group import * +from .voice_call_context import * diff --git a/src/gradient_labs/_voice_call_context_read.py b/src/gradient_labs/_voice_call_context_read.py new file mode 100644 index 0000000..3e0cbc3 --- /dev/null +++ b/src/gradient_labs/_voice_call_context_read.py @@ -0,0 +1,34 @@ +from typing import Optional +from dataclasses import dataclass +from dataclasses_json import dataclass_json + +from ._http_client import HttpClient +from .voice_call_context import VoiceCallContext + + +@dataclass_json +@dataclass(frozen=True) +class VoiceCallContextReadParams: + lookback_seconds: Optional[int] = None + include_large_fields: Optional[bool] = None + + +def read_voice_call_context( + *, + client: HttpClient, + phone_number: str, + params: Optional[VoiceCallContextReadParams] = None, +) -> VoiceCallContext: + path = f"voice/latest-call-context/{phone_number}" + query_parts = [] + if params is not None: + if params.lookback_seconds is not None: + query_parts.append(f"lookback_seconds={params.lookback_seconds}") + if params.include_large_fields is not None: + query_parts.append( + f"include_large_fields={str(params.include_large_fields).lower()}" + ) + if query_parts: + path = f"{path}?{'&'.join(query_parts)}" + rsp = client.get(path=path, body={}) + return VoiceCallContext.from_dict(rsp) diff --git a/src/gradient_labs/client.py b/src/gradient_labs/client.py index fb9ac7c..e4d2141 100644 --- a/src/gradient_labs/client.py +++ b/src/gradient_labs/client.py @@ -102,6 +102,12 @@ ) from ._traffic_group_target_delete import delete_traffic_group_target +from ._voice_call_context_read import ( + read_voice_call_context, + VoiceCallContextReadParams, +) +from .voice_call_context import VoiceCallContext + from ._http_client import HttpClient, API_BASE_URL from .tool import * from .note import Note @@ -786,3 +792,19 @@ def delete_traffic_group_target( traffic_group_id=traffic_group_id, target_id=target_id, ) + + # ==================== Voice Call Context ==================== + + def read_voice_call_context( + self, + *, + phone_number: str, + params: Optional[VoiceCallContextReadParams] = None, + ) -> VoiceCallContext: + """read_voice_call_context returns the most recent voice call context for a + given phone number, for use in data-dip integrations with contact-centre platforms.""" + return read_voice_call_context( + client=self.http_client, + phone_number=phone_number, + params=params, + ) diff --git a/src/gradient_labs/voice_call_context.py b/src/gradient_labs/voice_call_context.py new file mode 100644 index 0000000..80401db --- /dev/null +++ b/src/gradient_labs/voice_call_context.py @@ -0,0 +1,23 @@ +from typing import Optional +from datetime import datetime +from dataclasses import dataclass, field +from dataclasses_json import dataclass_json, config +from marshmallow import fields + + +@dataclass_json +@dataclass(frozen=True) +class VoiceCallContext: + started_at: datetime = field( + metadata=config( + encoder=datetime.isoformat, + decoder=datetime.fromisoformat, + mm_field=fields.DateTime(format="iso"), + ) + ) + summary: Optional[str] = None + transcript: Optional[str] = None + handoff_reason: Optional[str] = None + last_executed_procedure: Optional[str] = None + last_executed_procedure_url: Optional[str] = None + gradient_labs_url: Optional[str] = None