feat(api+app): 对话阶段化、回忆录流水线与客户端会话体验
- DB: segments 用户输入文本(Alembic 0002) - Chat: 阶段检测/阶段提示/回复限制,编排与访谈/画像 prompts 调整 - Memoir: 忠实度检查 agent,叙事与分类等链路更新 - Core: agent 日志、Alembic 启动、LangChain/日志/配置等 - Story: time_hints;Memory 检索与相关测试 - Expo: 助手头像、会话页与消息拆分、实时会话与文案/i18n - Docs/scripts/tests: 迁移脚本、LLM JSON/记忆检索文档、新增单测
This commit is contained in:
@@ -9,7 +9,7 @@ Docker / 服务端由镜像与 compose 注入进程环境;此处仅固定读
|
||||
|
||||
import secrets
|
||||
|
||||
from pydantic import Field
|
||||
from pydantic import Field, field_validator
|
||||
from pydantic_settings import BaseSettings, SettingsConfigDict
|
||||
|
||||
|
||||
@@ -23,6 +23,12 @@ class Settings(BaseSettings):
|
||||
|
||||
# ── Database ──────────────────────────────────────────────
|
||||
database_url: str = "postgresql://postgres:postgres@localhost:5432/life_echo"
|
||||
# 启动时是否执行 Alembic(main.py lifespan);测试或仅读场景可关
|
||||
alembic_run_on_startup: bool = True
|
||||
# True:迁移失败则进程退出(生产推荐)。False:仅打错误日志并继续(本地无 DB 时)
|
||||
alembic_startup_fail_fast: bool = False
|
||||
alembic_startup_max_retries: int = Field(default=3, ge=1, le=10)
|
||||
alembic_startup_retry_base_seconds: float = Field(default=1.0, ge=0.1, le=60.0)
|
||||
|
||||
# ── Redis ─────────────────────────────────────────────────
|
||||
redis_url: str = "redis://localhost:6379/0"
|
||||
@@ -43,6 +49,21 @@ class Settings(BaseSettings):
|
||||
llm_model: str = ""
|
||||
llm_temperature: float = 0.7
|
||||
|
||||
# ── Chat 访谈(短回复:token 上限 + 代码截断,见 reply_limits)──
|
||||
chat_interview_max_tokens: int = 320
|
||||
chat_interview_max_segments: int = 2
|
||||
chat_interview_max_chars_per_segment: int = 220
|
||||
chat_opening_max_tokens: int = 256
|
||||
chat_profile_followup_max_tokens: int = 280
|
||||
chat_era_context_enabled: bool = True
|
||||
# 访谈:每轮用 LLM 判定用户主人生阶段并更新 MemoirState.current_stage;False 时仅用关键词
|
||||
chat_stage_detection_enabled: bool = True
|
||||
chat_stage_detection_max_tokens: int = 128
|
||||
|
||||
# ── Memoir 叙事忠实度检查(FidelityCheckAgent)────────────────
|
||||
memoir_fidelity_check_enabled: bool = True
|
||||
memoir_fidelity_check_max_tokens: int = 512
|
||||
|
||||
# ── ASR ───────────────────────────────────────────────────
|
||||
asr_provider: str = "whisper"
|
||||
asr_model_size: str = "small"
|
||||
@@ -92,6 +113,22 @@ class Settings(BaseSettings):
|
||||
# ── Logging ──────────────────────────────────────────────
|
||||
# 环境变量 LOG_LEVEL;控制 loguru sink 最低级别(TRACE/DEBUG/INFO/…)
|
||||
log_level: str = "INFO"
|
||||
# LOG_AGENT_VERBOSE:为 True 时额外输出 Agent 单行 INFO 摘要(耗时、规模),无需全局 DEBUG
|
||||
log_agent_verbose: bool = False
|
||||
# AGENT_LOG_MAX_CHARS:DEBUG 下记录 prompt/响应预览时的最大字符数
|
||||
agent_log_max_chars: int = Field(default=4096, ge=256, le=100_000)
|
||||
# 第三方 stdlib logging(空=自动:LOG_LEVEL 为 DEBUG/TRACE 时 Celery→INFO、httpx/httpcore→WARNING)
|
||||
celery_log_level: str = ""
|
||||
httpx_log_level: str = ""
|
||||
|
||||
@field_validator("log_agent_verbose", mode="before")
|
||||
@classmethod
|
||||
def _coerce_log_agent_verbose(cls, v: object) -> bool:
|
||||
if isinstance(v, bool):
|
||||
return v
|
||||
if v is None:
|
||||
return False
|
||||
return str(v).strip().lower() in ("1", "true", "yes", "on")
|
||||
|
||||
# ── Misc ─────────────────────────────────────────────────
|
||||
enable_test_subscription: int = 0
|
||||
|
||||
Reference in New Issue
Block a user