You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

48 lines
1.4 KiB
Python

# backend/app/services/classification.py
import uuid
from sqlmodel import Session, select
from ..llm.provider import Classification, LLMProvider
from ..models import InboxClassification, Project
def _context(s: Session) -> dict:
projects = s.exec(select(Project)).all()
return {"projects": [{"id": p.id, "name": p.name, "folder_id": p.folder_id} for p in projects]}
def classify(
s: Session, raw: str, provider: LLMProvider, force_type: str | None = None
) -> Classification:
# provider 는 라우터에서 Depends(get_provider) 로 주입받아 전달한다(auto: ollama→heuristic).
c = provider.classify_capture(raw, _context(s))
if force_type and force_type in ("task", "event", "idea"):
c.type = force_type # 사용자 강제 타입
c.reason = f"사용자가 '{force_type}'(으)로 지정했어요. " + c.reason
return c
def persist_classification(
s: Session, inbox_item_id: str, c: Classification
) -> InboxClassification:
row = InboxClassification(
id="cls-" + uuid.uuid4().hex[:8], # TEXT PK
inbox_item_id=inbox_item_id,
type=c.type,
sphere=c.sphere,
project_id=c.project_id,
proj_label=c.proj_label,
tone=c.tone,
due_text=c.due_text,
when_text=c.when_text,
extra=c.extra,
reason=c.reason,
confidence=c.confidence,
model=c.model,
)
s.add(row)
s.commit()
s.refresh(row)
return row