feat(api): 收敛对话与记忆流程边界,引入 LLM 网关与专用服务

- MemoryService 异步路径委托 MemoryIngestService / MemoryRetrievalService;富化派发经 MemoryEnrichmentScheduler
- WebSocket pipeline 经 ChatTurnService 与显式 DTO 编排单轮对话;回忆录片段入队由 MemoirIngestScheduler 封装
- 新增 LlmGateway(LlmUseCase),各 agent、任务与适配器对齐 ports
- 补充 memory 提示适配、runtime 类型、memory-retrieval 文档、ai-touchpoints 说明与扫描脚本及配套测试

Made-with: Cursor
This commit is contained in:
Kevin
2026-04-30 09:17:01 +08:00
parent eddb2c3078
commit ac436b87a2
37 changed files with 1400 additions and 199 deletions

View File

@@ -18,7 +18,7 @@ from sqlalchemy.orm import Session
from app.agents.memoir.narrative_agent import NarrativeAgent
from app.core.config import settings
from app.core.db import get_sync_db
from app.core.dependencies import get_llm_provider
from app.core.llm_gateway import LlmGateway, LlmUseCase
from app.core.logging import get_logger
from app.core.memoir_pipeline_progress import merge_pipeline_run
from app.features.memoir.models import Chapter
@@ -30,7 +30,7 @@ logger = get_logger(__name__)
def _get_llm():
try:
return getattr(get_llm_provider(), "langchain_llm", None)
return LlmGateway().langchain_llm_for(LlmUseCase("memoir_quality_pass"))
except Exception:
return None

View File

@@ -27,7 +27,7 @@ from app.core.chapter_pipeline_lock import (
)
from app.core.config import settings
from app.core.db import get_sync_db
from app.core.dependencies import get_llm_provider, get_llm_provider_fast
from app.core.llm_gateway import LlmGateway, LlmUseCase
from app.core.logging import get_logger
from app.core.memoir_pipeline_progress import (
init_pipeline_run_from_phase1,
@@ -129,7 +129,7 @@ def _run_post_pipeline_commit(
def _get_llm():
"""Celery 任务内获取 LangChain LLM通过 port"""
try:
return getattr(get_llm_provider(), "langchain_llm", None)
return LlmGateway().langchain_llm_for(LlmUseCase("memoir_tasks"))
except Exception:
return None
@@ -137,7 +137,9 @@ def _get_llm():
def _get_llm_fast():
"""分类 / 抽取等快档位任务(与叙事、路由默认模型可分离)。"""
try:
return getattr(get_llm_provider_fast(), "langchain_llm", None)
return LlmGateway().langchain_llm_for(
LlmUseCase("memoir_tasks.fast", fast=True)
)
except Exception:
return None

View File

@@ -5,7 +5,7 @@ import time
from celery import shared_task
from app.core.db import get_sync_db
from app.core.dependencies import get_llm_provider
from app.core.llm_gateway import LlmGateway, LlmUseCase
from app.core.logging import get_logger
logger = get_logger(__name__)
@@ -62,7 +62,7 @@ def generate_story_title_after_create(
)
return {"status": "skip_user_modified"}
llm = getattr(get_llm_provider(), "langchain_llm", None)
llm = LlmGateway().langchain_llm_for(LlmUseCase("story_title"))
if not llm:
ms = (time.perf_counter() - t0) * 1000
logger.info(