| 320 | text_signature = "(*, provider: str, request_id: str, usage: dict | None = None, request_facts: object | None = None, agent_id: str, template_version: str, toolset_hash: str, model_family: str, tenant_scope: str, timestamp: str | None = None) -> dict | None" |
| 321 | )] |
| 322 | fn build_cache_telemetry_event( |
| 323 | py: Python<'_>, |
| 324 | provider: &str, |
| 325 | request_id: &str, |
| 326 | usage: Option<&Bound<'_, PyAny>>, |
| 327 | request_facts: Option<&Bound<'_, PyAny>>, |
| 328 | agent_id: &str, |
| 329 | template_version: &str, |
| 330 | toolset_hash: &str, |
| 331 | model_family: &str, |
| 332 | tenant_scope: &str, |
| 333 | timestamp: Option<&str>, |
| 334 | ) -> PyResult<Py<PyAny>> { |
| 335 | let provider = parse_cache_telemetry_provider(provider)?; |
| 336 | let request_id = parse_cache_telemetry_request_id(request_id)?; |
| 337 | let timestamp = parse_cache_telemetry_timestamp(timestamp)?; |
| 338 | let Some(usage_json) = opt_py_to_json(usage)? else { |
| 339 | return Ok(py.None()); |
| 340 | }; |
| 341 | let request_facts = parse_cache_request_facts(request_facts)?; |
| 342 | let usage: Usage = serde_json::from_value(usage_json) |
| 343 | .map_err(|e| pyo3::exceptions::PyValueError::new_err(format!("invalid usage: {e}")))?; |
| 344 | let agent_identity = AgentIdentity { |
| 345 | agent_id: agent_id.to_string(), |
| 346 | template_version: template_version.to_string(), |
| 347 | toolset_hash: toolset_hash.to_string(), |
| 348 | model_family: model_family.to_string(), |
| 349 | tenant_scope: tenant_scope.to_string(), |
| 350 | }; |
| 351 | |
| 352 | match CacheTelemetryEvent::from_usage( |
| 353 | request_id, |
| 354 | agent_identity, |
| 355 | provider, |
| 356 | &usage, |
| 357 | timestamp, |
| 358 | request_facts.as_ref(), |
| 359 | ) { |
| 360 | Some(event) => { |
| 361 | let event = serde_json::to_value(&event) |
| 362 | .map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string()))?; |
| 363 | json_to_py(py, &event) |
| 364 | } |
| 365 | None => Ok(py.None()), |
| 366 | } |
| 367 | } |
| 368 | |
| 369 | #[pyfunction] |
| 370 | #[pyo3(signature = (config: "object") -> "object", text_signature = "(config: object) -> object")] |