From 86abc18c6ffca31736778d2fea17612229db2a00 Mon Sep 17 00:00:00 2001 From: zhangqing Date: Wed, 1 Jul 2026 12:01:48 +0800 Subject: [PATCH] update --- backend/api/chat_router.py | 6 +--- backend/core/config.py | 7 +++++ backend/core/llm_catalog.py | 2 -- backend/services/rag_intent_service.py | 3 +- backend/services/summary_service.py | 11 +++++--- backend/tools/tools.py | 38 ++++++++++++++++---------- 6 files changed, 41 insertions(+), 26 deletions(-) diff --git a/backend/api/chat_router.py b/backend/api/chat_router.py index 9800a95..6e8dbcb 100644 --- a/backend/api/chat_router.py +++ b/backend/api/chat_router.py @@ -119,8 +119,6 @@ async def chat_completion( f"knowledge_graph_id: {request.knowledge_graph_id}, " f"llm_provider: {request.llm_provider}, llm_model: {request.llm_model}, ip={client_ip}" ) - request.llm_model = "qwen3.7-plus" - request.llm_provider = "tongyi" # ============ 内容审核前置处理 ============ # 在 AI 处理前对用户消息进行内容审核 try: @@ -156,7 +154,6 @@ async def chat_completion( f"labels: {[label.label for label in moderation_result.labels]}" ) # 使用统一的错误响应格式(与图片审核一致) - from fastapi.responses import JSONResponse return JSONResponse( status_code=status.HTTP_400_BAD_REQUEST, content={ @@ -185,7 +182,6 @@ async def chat_completion( f"request_id: {moderation_request_id}" ) # 使用统一的错误响应格式(与图片审核一致) - from fastapi.responses import JSONResponse return JSONResponse( status_code=status.HTTP_400_BAD_REQUEST, content={ @@ -260,7 +256,7 @@ async def chat_completion( enable_thinking=user_is_reasoner, logical_llm_id=llm_model_key, ) - logger.debug( + logger.info( "chat_completion 模型: provider={} req_llm_model={} api_model={} user_is_reasoner={}", llm_provider, llm_model_key, diff --git a/backend/core/config.py b/backend/core/config.py index a00dc97..2a315df 100644 --- a/backend/core/config.py +++ b/backend/core/config.py @@ -162,6 +162,13 @@ class Settings(BaseSettings): embedding_model: str = "text-embedding-v4" # 通义千问 Embedding 模型 embedding_dimension: int = 1536 # Embedding 维度 + # 辅助任务模型(意图判断、摘要生成等),默认与主聊天模型一致 + # 可在 .env 中通过 UTILITY_LLM_MODEL 覆盖(如 qwen-plus-latest、qwen3-max) + utility_llm_model: str = Field( + default="qwen3-max", + validation_alias=AliasChoices("UTILITY_LLM_MODEL", "utility_llm_model"), + ) + # Neo4j 图数据库配置 neo4j_uri: str = "bolt://127.0.0.1:7687" neo4j_user: str = "neo4j" diff --git a/backend/core/llm_catalog.py b/backend/core/llm_catalog.py index fd1d853..26cab6f 100644 --- a/backend/core/llm_catalog.py +++ b/backend/core/llm_catalog.py @@ -248,7 +248,6 @@ def build_chat_model( p = normalize_provider(provider) if p == "tongyi": api_key = (os.getenv("DASHSCOPE_API_KEY") or "").strip() - print("-----------------------------------api_key: ", api_key) if not api_key: raise ValueError("缺少 DASHSCOPE_API_KEY") base_url = llm_env.tongyi_openai_compatible_base_url().strip().rstrip("/") @@ -284,7 +283,6 @@ def build_chat_model( else: raise ValueError(f"未知提供方: {provider}") - print("-----------------------------------走到这里了-----------------------------------",extra_kwargs) return ChatOpenAI( model=api_model, api_key=api_key, diff --git a/backend/services/rag_intent_service.py b/backend/services/rag_intent_service.py index 6e0e60f..8cc06fb 100644 --- a/backend/services/rag_intent_service.py +++ b/backend/services/rag_intent_service.py @@ -7,6 +7,7 @@ from typing import List, Dict, Optional from pydantic import BaseModel, Field from langchain_core.prompts import PromptTemplate +from core.config import get_settings from core.llm_catalog import build_chat_model from logger.logging import get_logger @@ -121,7 +122,7 @@ class RagIntentService: def __init__(self): self.model = build_chat_model( provider="tongyi", - api_model="qwen-plus-latest", + api_model=get_settings().utility_llm_model, streaming=False, temperature=0.1, # 降低温度,让判断更稳定 ) diff --git a/backend/services/summary_service.py b/backend/services/summary_service.py index d5eb314..7c84f7f 100644 --- a/backend/services/summary_service.py +++ b/backend/services/summary_service.py @@ -80,11 +80,12 @@ class SummaryService: async with cls._lock: if cls._llm_cache is None: + from core.llm_catalog import _DEFAULT_MODEL_BY_PROVIDER cls._llm_cache = build_chat_model( provider="tongyi", - api_model="qwen-plus-latest", + api_model=_DEFAULT_MODEL_BY_PROVIDER["tongyi"], streaming=False, - temperature=0.3, # 适度提高灵活性,更好地总结全文 + temperature=0.3, ) return cls._llm_cache @@ -194,9 +195,10 @@ sheet_summary: 对所有sheet表的描述进行总结,不超过20字; async with cls._lock: if cls._llm_cache is None: + from core.llm_catalog import _DEFAULT_MODEL_BY_PROVIDER cls._llm_cache = build_chat_model( provider="tongyi", - api_model="qwen-plus-latest", + api_model=_DEFAULT_MODEL_BY_PROVIDER["tongyi"], streaming=False, temperature=0.7, model_kwargs={"response_format": {"type": "json_object"}}, @@ -283,9 +285,10 @@ csv_description: 对csv表格的内容进行描述,不超过20字; async with cls._lock: if cls._llm_cache is None: + from core.llm_catalog import _DEFAULT_MODEL_BY_PROVIDER cls._llm_cache = build_chat_model( provider="tongyi", - api_model="qwen-plus-latest", + api_model=_DEFAULT_MODEL_BY_PROVIDER["tongyi"], streaming=False, temperature=0.7, model_kwargs={"response_format": {"type": "json_object"}}, diff --git a/backend/tools/tools.py b/backend/tools/tools.py index e60039c..6d97237 100644 --- a/backend/tools/tools.py +++ b/backend/tools/tools.py @@ -189,13 +189,18 @@ def text_to_image( f"开始生成图片(OpenAI 兼容 images/generations),model={model_image}, n={n_req}, size={size_norm}" ) - response = client.images.generate( - model=model_image, - prompt=prompt, - size=size_norm, - n=n_req, - extra_body=extra_body, - ) + try: + response = client.images.generate( + model=model_image, + prompt=prompt, + size=size_norm, + n=n_req, + extra_body=extra_body, + ) + except Exception as api_err: + err_str = str(api_err) + logger.error(f"文生图 API 调用失败: {err_str}") + return f"图片生成失败:{err_str}" image_urls: list[str] = [] for item in response.data or []: @@ -475,13 +480,18 @@ def text_to_poster( "negative_prompt": negative, } - response = client.images.generate( - model=model_image, - prompt=prompt, - size=size_norm, - n=1, - extra_body=extra_body, - ) + try: + response = client.images.generate( + model=model_image, + prompt=prompt, + size=size_norm, + n=1, + extra_body=extra_body, + ) + except Exception as api_err: + err_str = str(api_err) + logger.error(f"海报生成 API 调用失败: {err_str}") + return f"海报生成失败:{err_str}" image_urls: list[str] = [] for item in response.data or []: