feat(ml/serving): inject profile features + sort tasks in tip prompt (#79)
- prompts.py: sort tasks overdue-first → priority desc → age desc before rendering into the LLM prompt (same ordering as ml/features/context.py) - prompts.py: render User profile summary line (completion_rate, dismiss_rate, preferred_hour) when profile_features are present - main.py: add profile_features field to PromptContext; plumb from GenerateRequest into the prompt builder via model_copy - logging_config.py: drop add_logger_name processor (incompatible with PrintLoggerFactory — caused test ordering failures) - test_generate.py: 6 new tests covering sort order, profile rendering, partial fields, empty profile, and end-to-end plumbing through /generate Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -322,6 +322,7 @@ class PromptContext(BaseModel):
|
||||
hour_of_day: int = 12
|
||||
day_of_week: int = 0
|
||||
extra: dict = {}
|
||||
profile_features: Optional[dict] = None
|
||||
|
||||
|
||||
class GenerateRequest(BaseModel):
|
||||
@@ -392,7 +393,8 @@ async def generate(req: GenerateRequest) -> GenerateResponse:
|
||||
prompt_template = get_prompt(req.prompt_version)
|
||||
except KeyError as e:
|
||||
raise HTTPException(status_code=422, detail=f"Unknown prompt_version: {e.args[0]}")
|
||||
user_msg = prompt_template.build_user(req.context, req.n)
|
||||
ctx = req.context.model_copy(update={"profile_features": req.profile_features})
|
||||
user_msg = prompt_template.build_user(ctx, req.n)
|
||||
messages: list[dict] = [
|
||||
{"role": "system", "content": prompt_template.system},
|
||||
{"role": "user", "content": user_msg},
|
||||
|
||||
Reference in New Issue
Block a user