11from __future__ import annotations as _annotations
22
3+ import os
4+ from contextlib import asynccontextmanager
35from dataclasses import dataclass
46from datetime import datetime
7+ from typing import AsyncIterator
58
9+ from cloudkv import AsyncCloudKV
610from pydantic_ai import Agent , RunContext
11+ from pydantic_ai .models import Model
712
813from .models import TimeRangeInputs , TimeRangeResponse
14+ from .self_improving_agent import SelfImprovingAgentModel
15+ from .self_improving_agent_storage import CloudKVStorage
916
1017
1118@dataclass
@@ -23,13 +30,24 @@ class TimeRangeDeps:
2330)
2431
2532
33+ @asynccontextmanager
34+ async def self_improving_model () -> AsyncIterator [SelfImprovingAgentModel ]:
35+ cloudkv_read_token , cloudkv_write_token = os .environ ['CLOUDKV_TOKEN' ].split ('.' )
36+ logfire_read_token = os .environ ['LOGFIRE_READ_TOKEN' ]
37+ async with AsyncCloudKV (cloudkv_read_token , cloudkv_write_token ) as cloudkv :
38+ storage = CloudKVStorage (cloudkv )
39+ m = SelfImprovingAgentModel ('anthropic:claude-sonnet-4-0' , storage , logfire_read_token , 'time_range_agent' )
40+ yield m
41+ await m .wait_for_coach ()
42+
43+
2644@time_range_agent .instructions
2745def inject_current_time (ctx : RunContext [TimeRangeDeps ]) -> str :
2846 """Add the user's current time and timezone in the format 'Friday, November 22, 2024 11:15:14 PST' to context."""
2947 return f"The user's current time is { ctx .deps .now :%A, %B %d, %Y %H:%M:%S %Z} ."
3048
3149
32- async def infer_time_range (inputs : TimeRangeInputs ) -> TimeRangeResponse :
50+ async def infer_time_range (inputs : TimeRangeInputs , * , model : Model | None = None ) -> TimeRangeResponse :
3351 """Infer a time range from a user prompt."""
34- result = await time_range_agent .run (inputs .prompt , deps = TimeRangeDeps (now = inputs .now ))
52+ result = await time_range_agent .run (inputs .prompt , deps = TimeRangeDeps (now = inputs .now ), model = model )
3553 return result .output
0 commit comments