from moxn import MoxnClient
from moxn.types.content import Provider
from anthropic import Anthropic
from pydantic import ValidationError
async def analyze_with_logging(query: str):
async with MoxnClient() as client:
session = await client.create_prompt_session(
prompt_id="analysis-prompt",
session_data=AnalysisInput(query=query)
)
# Set all known metadata at span creation
async with client.span(
session,
name="structured_analysis",
metadata={
"query_length": len(query),
"query_category": classify_query(query)
}
) as span:
# Make the LLM call
anthropic = Anthropic()
response = anthropic.messages.create(
**session.to_anthropic_invocation()
)
# Parse response (uses stored provider from completion_config)
parsed = session.parse_response(response)
# Validate structured output
validation_errors = []
try:
result = AnalysisOutput.model_validate_json(
parsed.candidates[0].content[0].text
)
except ValidationError as e:
validation_errors = [str(err) for err in e.errors()]
result = None
# Log the complete event with validation status
event = session.create_llm_event_from_parsed_response(
parsed_response=parsed,
validation_errors=validation_errors or None,
attributes={
"output_valid": result is not None,
"result_confidence": result.confidence if result else None
}
)
await client.log_telemetry_event(event)
return result