"""AI Steward Service - 主动式 AI 管家核心服务。""" from __future__ import annotations import asyncio import ast import json import os import re import time from typing import Any, Dict, List from sqlalchemy.ext.asyncio import AsyncSession from ...core.logging import get_logger from ...core.database import get_db from ...models import CognitiveConflict, Project, ProjectSignalLink, Signal, TruthNode from ...utils.project_members import ensure_project_default_members from ...utils.sequence import ensure_project_id_sequence from ...utils.title import compact_title from ..adaptive_rag_service import AdaptiveRAGService from ..llm_service import LLMService from ..signal.signal_source_orchestration import SignalSourceOrchestrationService from ..task_persistence_core import ( build_task_create_draft, normalize_skill_names, persist_task, resolve_skill_tag_ids_by_names, ) logger = get_logger(__name__) def _env_float(name: str, default: float) -> float: raw = os.getenv(name) if raw is None: return float(default) try: return float(str(raw).strip()) except Exception: return float(default) def _env_int(name: str, default: int) -> int: raw = os.getenv(name) if raw is None: return int(default) try: return int(str(raw).strip()) except Exception: return int(default) PROJECT_CREATION_DRAFT_TIMEOUT_SECONDS = max( 8.0, _env_float("AI_STEWARD_PROJECT_CREATION_STEP_TIMEOUT_SECONDS", 30.0), ) PROJECT_CREATION_STEP_RETRY_COUNT = max( 0, _env_int("AI_STEWARD_PROJECT_CREATION_STEP_RETRY_COUNT", 1), ) PROJECT_CREATION_JSON_PARSE_RETRY_COUNT = max( 0, _env_int("AI_STEWARD_PROJECT_CREATION_JSON_PARSE_RETRY_COUNT", 1), ) PROJECT_CREATION_TASK_CHAIN_TIMEOUT_SECONDS = max( PROJECT_CREATION_DRAFT_TIMEOUT_SECONDS, _env_float("AI_STEWARD_PROJECT_CREATION_TASK_CHAIN_TIMEOUT_SECONDS", 60.0), ) PROJECT_CREATION_STUB_MARKERS = ( "我暂时无法生成可靠回答", "模型服务异常", "请稍后重试", ) PROJECT_CREATION_LOW_TO_HIGH_FUNCTION_MAP = { "project_draft_analysis_glm47_fallback": "project_from_text_analysis", "project_draft_signal_glm47_fallback": "project_from_text_signal", "project_draft_charter_glm47_fallback": "project_from_text_charter", "project_draft_task_chain_glm47_fallback": "project_from_text_task_chain", "project_requirement_extraction_glm47_fallback": "project_requirement_extraction", } PROJECT_CREATION_SERIAL_DRAFT_STEPS = _env_int("AI_STEWARD_PROJECT_CREATION_SERIAL_DRAFT_STEPS", 1) == 1