From de47c8efe3e6bac40a51ff22c67e3a19c3e0fa19 Mon Sep 17 00:00:00 2001 From: pangkaicheng <924366729@qq.com> Date: Thu, 16 Oct 2025 14:28:08 +0800 Subject: [PATCH] Clear print --- .gitignore | 3 +- app/api/chat_router.py | 103 ------------------ app/core/__pycache__/__init__.cpython-310.pyc | Bin 148 -> 0 bytes app/core/__pycache__/config.cpython-310.pyc | Bin 1864 -> 0 bytes .../data_structure.cpython-310.pyc | Bin 859 -> 0 bytes .../__pycache__/llm_interface.cpython-310.pyc | Bin 2298 -> 0 bytes .../__pycache__/redis_manager.cpython-310.pyc | Bin 3097 -> 0 bytes .../__pycache__/stylist_agent.cpython-310.pyc | Bin 11632 -> 0 bytes .../__pycache__/system_prompt.cpython-310.pyc | Bin 573 -> 0 bytes app/core/__pycache__/utils.cpython-310.pyc | Bin 3400 -> 0 bytes .../vector_database.cpython-310.pyc | Bin 2459 -> 0 bytes app/core/stylist_agent.py | 2 +- 12 files changed, 3 insertions(+), 105 deletions(-) delete mode 100644 app/api/chat_router.py delete mode 100644 app/core/__pycache__/__init__.cpython-310.pyc delete mode 100644 app/core/__pycache__/config.cpython-310.pyc delete mode 100644 app/core/__pycache__/data_structure.cpython-310.pyc delete mode 100644 app/core/__pycache__/llm_interface.cpython-310.pyc delete mode 100644 app/core/__pycache__/redis_manager.cpython-310.pyc delete mode 100644 app/core/__pycache__/stylist_agent.cpython-310.pyc delete mode 100644 app/core/__pycache__/system_prompt.cpython-310.pyc delete mode 100644 app/core/__pycache__/utils.cpython-310.pyc delete mode 100644 app/core/__pycache__/vector_database.cpython-310.pyc diff --git a/.gitignore b/.gitignore index 74c6dfe..a670435 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .env -.vscode/ \ No newline at end of file +.vscode/ +app/core/__pycache__/ \ No newline at end of file diff --git a/app/api/chat_router.py b/app/api/chat_router.py deleted file mode 100644 index e482c5c..0000000 --- a/app/api/chat_router.py +++ /dev/null @@ -1,103 +0,0 @@ -from fastapi import APIRouter, HTTPException -from pydantic import BaseModel, Field -from typing import List, Dict - -# 导入 ChatbotAgent 类和配置 -# 假设 ChatbotAgent 是单例或在应用启动时创建 -from app.core.chatbot_agent import ChatbotAgent -from app.core.config import settings - -# --- Pydantic Data Models --- -# 用于接收用户消息的请求体 -class ChatRequest(BaseModel): - user_id: str = Field(..., description="Unique identifier for the user.") - user_message: str = Field(..., description="The user's text message.") - -# 用于启动搭配推荐的请求体 -class OutfitStartRequest(BaseModel): - user_id: str = Field(..., description="Unique identifier for the user.") - stylist_name: str = Field("crystal", description="The name of the stylist guide to use (e.g., 'crystal').") - # 用于从已选单品继续搭配,可选 - start_outfit: List[Dict[str, str]] = Field(default_factory=list, description="Optional list of items already selected.") - -# 用于返回 LLM/Agent 的文本回复 -class ChatResponse(BaseModel): - response_text: str = Field(..., description="The chatbot's text response.") - -# 搭配推荐的响应体 (StylistAgent的输出是JSON,这里简化为字符串,实际项目中会返回结构化的JSON) -class OutfitResponse(BaseModel): - summary: str = Field(..., description="The conversation summary used for styling.") - next_item_json: Dict = Field(..., description="The next recommended item in JSON format.") - -# --- Router Setup --- - -router = APIRouter( - prefix="/chat", - tags=["Chatbot & Styling"] -) - -# 在应用启动时实例化 ChatbotAgent,以便在路由中使用同一个实例 -# 注意:在真实的 FastAPI 应用中,我们通常使用依赖注入 (Depends) 来管理实例 -try: - # 假设 ChatbotAgent 的 __init__ 已经包含了所有依赖的初始化 - global_agent = ChatbotAgent() -except Exception as e: - # 如果依赖(如 Redis 或 VectorDB)初始化失败,抛出错误 - print(f"FATAL: ChatbotAgent failed to initialize. Error: {e}") - global_agent = None # 保持 None 状态,路由会抛出 500 - -@router.post("/", response_model=ChatResponse, summary="Process user message and get chatbot response") -def handle_chat_message(request: ChatRequest): - """ - 处理用户的聊天消息,将消息添加到历史记录,并调用 LLM 生成回复。 - """ - if not global_agent: - raise HTTPException(status_code=500, detail="Chatbot agent not initialized.") - - try: - response = global_agent.process_query(request.user_id, request.user_message) - return ChatResponse(response_text=response) - except Exception as e: - print(f"Error processing chat query: {e}") - # 返回一个通用错误信息,而不是内部错误 - raise HTTPException(status_code=500, detail="Internal server error while processing message.") - -@router.post("/outfit/start", summary="Start outfit recommendation based on conversation history") -def start_outfit_recommendation(request: OutfitStartRequest): - """ - 基于用户的对话历史,生成搭配总结,并启动 Stylist Agent 推荐第一个单品。 - - 返回:对话总结和 Stylist Agent 推荐的第一个单品的 JSON。 - """ - if not global_agent: - raise HTTPException(status_code=500, detail="Chatbot agent not initialized.") - - try: - # 1. 获取对话总结 - request_summary = global_agent.get_conversation_summary(request.user_id) - - # 2. 调用 Stylist Agent 运行搭配流程 - # run_styling_process 应该返回 Stylist Agent 的第一个 JSON 输出 (recommend_item) - # 假设 StylistAgent.run_styling_process 返回一个 JSON 字典 - next_item_json = global_agent.stylist_agent.run_styling_process( - request_summary, - request.stylist_name, - request.start_outfit - ) - - return OutfitResponse( - summary=request_summary, - next_item_json=next_item_json - ) - - except Exception as e: - print(f"Error starting outfit recommendation: {e}") - raise HTTPException(status_code=500, detail=f"Failed to start styling process: {e}") - -# (可选) 搭配继续接口:用于处理用户的反馈和继续推荐 -@router.post("/outfit/continue", summary="Continue outfit recommendation with user feedback") -def continue_outfit_recommendation(): - """ - 这是一个占位符,用于处理用户对已推荐单品(如图片)的反馈,并让 Stylist Agent 推荐下一个单品。 - """ - raise HTTPException(status_code=501, detail="Endpoint for outfit continuation is not yet implemented.") diff --git a/app/core/__pycache__/__init__.cpython-310.pyc b/app/core/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 0033aaf3ccb14dba4b02b7767268d678fe40aa7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmd1j<>g`kf|;D}GeGoX5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!Hyenx(7s(wLs zvVM7fQFd`bVsff}PI7#4No7uEaY=k)L8g9UL4kg9eo?A^e0*kJW=VX!UP0w84x8Nk Rl+v73JCK3JOhAH#0Ra4`A^89R diff --git a/app/core/__pycache__/config.cpython-310.pyc b/app/core/__pycache__/config.cpython-310.pyc deleted file mode 100644 index 5973a146ca4282f8f5d5593cd3d54251c92c87b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1864 zcmZvd>2DiF6u@_V$8`>;PMaQpdjNI8F)AuTRfU?wuCZ|9$Z-($m(g}-VlQ2L%^rnV zNJR8VTk0gVX`xLEEmcK0niM3i9PR(HUz@dK@qzD1NW2-_RVvukzTNrldvD&n_jXok zZ})O=d?Njo|JcoOPv~It;ef$0xU@GwU=H&#SKzaJ!Iri0bZnFD1xMDwb8!yavEwX< z9fUt)&pL_o43~9b=O`C))xnkv*-YPnppj9c>ryeNncc0YL8Uk@<)V_Phj`O@Tp}_S zsm12Q34>#BY5RGOBV3lpT-G)Q@nr49fo*hd?5xmvUD$=)*i*4(-NZxMaNAK1m=|wh z%uBWa^D)+rI~emZ*2!2G_A}PbY`YoTiUYU@{Bxm+5sfwu7;qco$<`jO}LZ zIs80he#Ty4EQt3o*3H;n#`fX;jBRD?MaEvjFEbWk>;PjSe2}po#$I9URUBq)8)JP( zIUIqkzh-(`2{zt`%z1-wSj%&@xrO?07c`HOiX|436Y|xU}y)^Nj}n5!EBQiQIPYBrW*kW zI!&;oRc}?SOLwgs3)ZcN*6m4XBsV7Gf+6eX7EClzl}fs#6ishB7EO$zw^O4T>Caw{ z`yUUrAC|0{do9h8R63(VKW)~$_OM!6w3e^dRgsq_i-PV594Nym;S-s>|Cf^l3? zaxw|VNkJ+~!Tym%&{{fQzj7b4Xgxkxzq_)r_z0>5!w|3fz`*Q?$A%Ka2?V;-Te&O8 zY{Q584u{8OLCYIEL2Z5QF_aj>2qu$5!Ro?Y>#NVK*-Gu(hh_&5G?a?Ql4!VpC{}j$ zMX;a?Mkkn6*}|)L{;16_T5H$LwrGE*AEi^NOxfR1i%10_M-a2<1`BKcQSIVX!>(nN z80wG5P&AP)2bx9-bb+KJxRngu*aLR8xv#4iW+A}p>;ve;hMSE?SFNe#rW=21EOR`O zL2w%x%RJ*w(N?CI%FltKXZh-dU|)p0X-mKxbBO{n+v{nmLh#A`)dq&qJ3YQaDL4?N?*hf9>n@ z=dIZb&0Kd5rjki;lt>LXlD%6gk)j|)L|H0@PfL3EBy5J^lAw$E*AE%nz};XnF=G94 z**bUsnW_b1Lj$pBG%+0CRJ-BOcGH7UQ790EOfNzO1sgJb_966vA;`@)ZiKKRBBa`3 z0@DXtL`EXpa8EAHC;735fX|;MHlGDq=88XdnFZhl{SdlMTMUVT77jZ74#cb zX)0B^0ChVRv?%Hh5Z`g?UiwVM--jc4r9dL3Q)1*pMLngJ1d&7_wXK2*B`G45N)ZwE z3J~;<&{vvJ>AvrROFIC<%Q<+P-Nw_?^-sVZ;Mr*hNiTZBy_aWJ!y$LpUuy1dNNfIe tR2%qdB*W8s*+>MP$@Dzcdm4FT4g1*Jqm3-TMfVKN1EP!b@m&sY@Lz6}f*Sw; diff --git a/app/core/__pycache__/data_structure.cpython-310.pyc b/app/core/__pycache__/data_structure.cpython-310.pyc deleted file mode 100644 index 9999a55784a94d27d8434c64dc7b1837a3a42947..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 859 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 diff --git a/app/core/__pycache__/stylist_agent.cpython-310.pyc b/app/core/__pycache__/stylist_agent.cpython-310.pyc deleted file mode 100644 index 94bc308f66ed6443b12779de1e7259b16d749a29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11632 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 a!qt0ZVCYtgYBY=*8>nY_P(SK)t^F@Qug1;* diff --git a/app/core/stylist_agent.py b/app/core/stylist_agent.py index 67818f8..d61ced3 100644 --- a/app/core/stylist_agent.py +++ b/app/core/stylist_agent.py @@ -121,7 +121,7 @@ class AsyncStylistAgent: # 2. 添加文本内容 content_parts.append(user_input) - print(f"\n--- Calling Gemini with {len(self.outfit_items) if self.outfit_items else 0} images and query:\n{user_input}") + # print(f"\n--- Calling Gemini with {len(self.outfit_items) if self.outfit_items else 0} images and query:\n{user_input}") try: # 3. 实际 API 调用