# LD imports
from ldai_optimization import (
OptimizationClient,
OptimizationFromConfigOptions,
OptimizationResponse,
LLMCallConfig,
LLMCallContext,
)
from ldai import LDAIClient
from ldai.tracker import TokenUsage
# anthropic imports
from claude_agent_sdk import query, ClaudeAgentOptions
from claude_agent_sdk.types import ResultMessage
default_fallback_model = "claude-opus-4-5-20251101"
async def run_optimization(ld_ai_client: LDAIClient):
async def handle_agent_call(
key: str,
config: LLMCallConfig,
context: LLMCallContext,
is_evaluation: bool = False,
) -> OptimizationResponse:
model = config.model.name if config.model else default_fallback_model
final_message = None
async for message in query(
prompt=context.user_input or "",
options=ClaudeAgentOptions(
system_prompt=config.instructions or "",
model=model,
),
):
final_message = message
if not isinstance(final_message, ResultMessage):
raise ValueError(f"Unexpected final message type: {type(final_message)}")
u = final_message.usage or {}
input_tokens = u.get("input_tokens", 0)
output_tokens = u.get("output_tokens", 0)
return OptimizationResponse(
output=final_message.result or "",
usage=TokenUsage(
total=input_tokens + output_tokens,
input=input_tokens,
output=output_tokens,
),
)
options = OptimizationFromConfigOptions(
project_key="default",
handle_agent_call=handle_agent_call,
handle_judge_call=handle_agent_call,
)
client = OptimizationClient(ld_ai_client)
result = await client.optimize_from_config("my-optimization-key", options)