forked from BasedHardware/omi
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbackend_capture.py
More file actions
84 lines (71 loc) · 3.21 KB
/
Copy pathbackend_capture.py
File metadata and controls
84 lines (71 loc) · 3.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
"""Backend conversation adapter for the shared capture policy."""
from dataclasses import dataclass
from typing import Any, Optional
from pydantic import BaseModel, ConfigDict, Field
from models.action_item import EvidenceRef, TaskChangePayload, TaskCreatePayload, TaskOwner, TaskStatus
from models.candidate import CandidateCreate, CandidateSubjectKind, CandidateAction
from utils.task_intelligence.capture_policy import CapturePolicyResult, run_capture_policy
class BackendCaptureSignals(BaseModel):
model_config = ConfigDict(extra='forbid')
explicit_command: bool = False
clear_commitment: bool = False
concrete_deliverable: bool = False
direct_request: bool = False
inferred_next_step: bool = False
owner: TaskOwner = TaskOwner.unknown
public_broadcast: bool = False
direct_mention: bool = False
already_done: bool = False
duplicate_of: Optional[str] = None
refines_task: Optional[str] = None
capture_confidence: float = Field(default=0.5, ge=0, le=1)
ownership_confidence: float = Field(default=0.5, ge=0, le=1)
def policy_signals(self) -> dict[str, Any]:
return self.model_dump(mode='json')
@dataclass(frozen=True)
class BackendCaptureDecision:
policy: CapturePolicyResult
candidate: Optional[CandidateCreate]
def adapt_backend_capture(
task: TaskCreatePayload,
*,
evidence_ref: EvidenceRef,
source_surface: str,
signals: BackendCaptureSignals,
goal_id: Optional[str] = None,
workstream_id: Optional[str] = None,
) -> BackendCaptureDecision:
policy = run_capture_policy(signals.policy_signals())
if policy.outcome == 'ignore':
return BackendCaptureDecision(policy=policy, candidate=None)
proposed_action = CandidateAction.create
task_id = None
task_change: TaskCreatePayload | TaskChangePayload = task
if policy.outcome in {'propose_enrichment', 'propose_update'}:
proposed_action = CandidateAction.update
task_id = signals.duplicate_of or signals.refines_task
if task_id is None:
return BackendCaptureDecision(policy=policy, candidate=None)
task_change = TaskChangePayload(description=task.description, due_at=task.due_at)
elif policy.outcome == 'propose_completion':
proposed_action = CandidateAction.complete
task_id = signals.duplicate_of or signals.refines_task
if task_id is None:
return BackendCaptureDecision(policy=policy, candidate=None)
task_change = TaskChangePayload(status=TaskStatus.completed)
proposal_data: dict[str, Any] = {
'subject_kind': CandidateSubjectKind.task,
'proposed_action': proposed_action,
'task_change': task_change,
'capture_confidence': signals.capture_confidence,
'ownership_confidence': signals.ownership_confidence,
'goal_id': goal_id,
'workstream_id': workstream_id,
'evidence_refs': [evidence_ref],
'source_surface': source_surface,
}
if task_id is not None:
proposal_data['task_id'] = task_id
proposal = CandidateCreate.model_validate(proposal_data)
return BackendCaptureDecision(policy=policy, candidate=proposal)
__all__ = ['BackendCaptureDecision', 'BackendCaptureSignals', 'adapt_backend_capture']