"""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", 180.0), ) PROJECT_CREATION_STEP_INITIAL_MAX_TOKENS = max( 256, _env_int("AI_STEWARD_PROJECT_CREATION_STEP_INITIAL_MAX_TOKENS", 2_200), ) PROJECT_CREATION_STEP_MAX_TOKENS = max( PROJECT_CREATION_STEP_INITIAL_MAX_TOKENS, _env_int("AI_STEWARD_PROJECT_CREATION_STEP_MAX_TOKENS", 100_000), ) 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_SERIAL_DRAFT_STEPS = _env_int("AI_STEWARD_PROJECT_CREATION_SERIAL_DRAFT_STEPS", 1) == 1