PMFlow/backend/app/services/ai_steward_service/shared.py

84 lines
2.4 KiB
Python

"""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_STUB_MARKERS = (
"我暂时无法生成可靠回答",
"模型服务异常",
"请稍后重试",
)
PROJECT_CREATION_SERIAL_DRAFT_STEPS = _env_int("AI_STEWARD_PROJECT_CREATION_SERIAL_DRAFT_STEPS", 1) == 1