refactor(backend): update service layers

- services/ontology.py: update ontology service logic
- services/user_agent.py: update user agent service logic
This commit is contained in:
caoxiaozhu
2026-05-12 15:12:57 +00:00
parent 6137bb5cdc
commit 4d9b071e37
2 changed files with 67 additions and 28 deletions

View File

@@ -325,7 +325,11 @@ class SemanticOntologyService:
entities = self._extract_entities(query, compact_query, reference)
rule_scenario, scenario_score = self._detect_scenario(compact_query)
time_range, _time_score = self._extract_time_range(query, compact_query)
time_range, _time_score = self._extract_time_range(
query,
compact_query,
context_json=context_json,
)
context_scenario = self._resolve_context_scenario(context_json)
if rule_scenario == "unknown" and context_scenario is not None:
rule_scenario = context_scenario
@@ -1175,16 +1179,22 @@ class SemanticOntologyService:
self,
query: str,
compact_query: str,
*,
context_json: dict[str, Any],
) -> tuple[OntologyTimeRange, float]:
today = datetime.now(UTC).date()
today = self._resolve_reference_today(context_json)
direct_mappings = {
"": self._single_day_range(today, "", "day"),
"昨日": self._single_day_range(today - timedelta(days=1), "昨日", "day"),
"": self._single_day_range(today - timedelta(days=1), "", "day"),
"": self._single_day_range(today + timedelta(days=1), "", "day"),
}
for keyword, value in direct_mappings.items():
direct_mappings = [
("大前", self._single_day_range(today - timedelta(days=3), "大前", "day")),
("前天", self._single_day_range(today - timedelta(days=2), "前天", "day")),
("", self._single_day_range(today - timedelta(days=1), "", "day")),
("", self._single_day_range(today - timedelta(days=1), "", "day")),
("今天", self._single_day_range(today, "今天", "day")),
("明天", self._single_day_range(today + timedelta(days=1), "明天", "day")),
("后天", self._single_day_range(today + timedelta(days=2), "后天", "day")),
("大后天", self._single_day_range(today + timedelta(days=3), "大后天", "day")),
]
for keyword, value in direct_mappings:
if keyword in query:
return value, 0.10
@@ -1263,6 +1273,29 @@ class SemanticOntologyService:
return OntologyTimeRange(), 0.0
@staticmethod
def _resolve_reference_today(context_json: dict[str, Any]) -> date:
client_now_iso = str(context_json.get("client_now_iso") or "").strip()
if not client_now_iso:
return datetime.now(UTC).date()
normalized = client_now_iso.replace("Z", "+00:00")
try:
client_now = datetime.fromisoformat(normalized)
except ValueError:
return datetime.now(UTC).date()
if client_now.tzinfo is None:
client_now = client_now.replace(tzinfo=UTC)
try:
offset_minutes = int(context_json.get("client_timezone_offset_minutes") or 0)
except (TypeError, ValueError):
offset_minutes = 0
local_now = client_now - timedelta(minutes=offset_minutes)
return local_now.date()
@staticmethod
def _single_day_range(target: date, raw: str, granularity: str) -> OntologyTimeRange:
return OntologyTimeRange(