| 574 | timestamp: "datetime.datetime | None"=None |
| 575 | ) -> "LlmHandle", text_signature = "(name: str, request: LlmRequest, *, handle: ScopeHandle | None = None, attributes: LlmAttributes | None = None, data: object | None = None, metadata: object | None = None, model_name: str | None = None, timestamp: datetime.datetime | None = None) -> LlmHandle")] |
| 576 | fn llm_call( |
| 577 | name: &str, |
| 578 | request: PyLLMRequest, |
| 579 | handle: Option<PyScopeHandle>, |
| 580 | attributes: Option<PyLLMAttributes>, |
| 581 | data: Option<&Bound<'_, PyAny>>, |
| 582 | metadata: Option<&Bound<'_, PyAny>>, |
| 583 | model_name: Option<String>, |
| 584 | timestamp: Option<&Bound<'_, PyAny>>, |
| 585 | ) -> PyResult<PyLLMHandle> { |
| 586 | let attrs = attributes |
| 587 | .map(|a| a.inner) |
| 588 | .unwrap_or(LlmAttributes::empty()); |
| 589 | let data = opt_py_to_json(data)?; |
| 590 | let metadata = opt_py_to_json(metadata)?; |
| 591 | let timestamp = opt_py_to_timestamp(timestamp)?; |
| 592 | let params = core_llm_api::LlmCallParams::builder() |
| 593 | .name(name) |
| 594 | .request(&request.inner) |
| 595 | .parent_opt(handle.as_ref().map(|h| &h.inner)) |
| 596 | .attributes(attrs) |
| 597 | .data_opt(data) |
| 598 | .metadata_opt(metadata) |
| 599 | .model_name_opt(model_name) |
| 600 | .timestamp_opt(timestamp) |
| 601 | .build(); |
| 602 | core_llm_api::llm_call(params) |
| 603 | .map(PyLLMHandle::from) |
| 604 | .map_err(to_py_err) |
| 605 | } |
| 606 | |
| 607 | /// End an LLM call — records the response and emits an ``End`` event. |
| 608 | /// |