44 CreateProjectRequest , ProjectInfo ,
55)
66from .models import ChatHistory , StoredChatMessage
7+ from .models import Project , ChatHistoryDB
78from .integrations .behavior_manager import BehaviorManager
89from .services .chat_service import ChatService
910from .core .project_memory import ProjectMemory
11+ from .core .db import get_session
12+ from sqlmodel import Session , select
13+ import json
1014from app .logger import enrich_context
1115from opentelemetry import metrics
1216from opentelemetry .trace import get_current_span
1721 tags = ["chat" ]
1822)
1923
24+ # In-memory fallback (not used when database is configured)
2025memory = ProjectMemory ()
2126meter = metrics .get_meter (__name__ )
2227chat_counter = meter .create_counter ("chat_requests_total" )
@@ -55,25 +60,33 @@ async def chat_endpoint(
5560 raise HTTPException (status_code = 500 , detail = "AI сервис недоступен" )
5661
5762@api_router .post ("/projects" , response_model = ProjectInfo )
58- def create_project (req : CreateProjectRequest ):
59- project = memory .create_project (req .name )
63+ def create_project (
64+ req : CreateProjectRequest ,
65+ session : Session = Depends (get_session ),
66+ ):
67+ project = Project (name = req .name )
68+ session .add (project )
69+ session .commit ()
70+ session .refresh (project )
6071 enrich_context (
6172 event = "project_created" ,
6273 project_id = project .id ,
6374 project_name = project .name
6475 ).info ("New project created" )
65- return project
76+ return ProjectInfo ( id = project . id , name = project . name )
6677
6778@api_router .get ("/projects" , response_model = list [ProjectInfo ])
68- def list_projects ():
79+ def list_projects (session : Session = Depends ( get_session ) ):
6980 enrich_context (event = "project_list_requested" ).info ("Project list requested" )
70- return memory .list_projects ()
81+ projects = session .exec (select (Project )).all ()
82+ return [ProjectInfo (id = p .id , name = p .name ) for p in projects ]
7183
7284@api_router .post ("/projects/{project_id}/chat" , response_model = ChatResponse )
7385async def chat_in_project (
7486 project_id : str ,
7587 req : ChatRequest ,
76- chat_service : ChatService = Depends (get_chat_service )
88+ chat_service : ChatService = Depends (get_chat_service ),
89+ session : Session = Depends (get_session )
7790):
7891 log = enrich_context (
7992 event = "project_chat_called" ,
@@ -94,11 +107,23 @@ async def chat_in_project(
94107 span_id = format (ctx .span_id , "016x" )
95108
96109 try :
110+ # Ensure project exists
111+ project = session .get (Project , project_id )
112+ if not project :
113+ raise ValueError (f"Проект { project_id } не найден" )
114+
97115 chat_messages = [
98116 StoredChatMessage (role = m .role , content = m .content )
99117 for m in req .messages
100118 ]
101- memory .add_chat (project_id , chat_messages , trace_id = trace_id , span_id = span_id )
119+ history_db = ChatHistoryDB (
120+ project_id = project_id ,
121+ messages = json .dumps ([m .model_dump () for m in chat_messages ]),
122+ trace_id = trace_id ,
123+ span_id = span_id ,
124+ )
125+ session .add (history_db )
126+ session .commit ()
102127
103128 reply = await chat_service .get_ai_reply (
104129 req .messages , req .user_api_key , project_id = project_id , trace_id = trace_id
@@ -115,7 +140,10 @@ async def chat_in_project(
115140 raise HTTPException (status_code = 500 , detail = "Ошибка при обращении к AI" )
116141
117142@api_router .get ("/projects/{project_id}/history" , response_model = list [ChatHistory ])
118- def get_project_history (project_id : str ):
143+ def get_project_history (
144+ project_id : str ,
145+ session : Session = Depends (get_session )
146+ ):
119147 log = enrich_context (
120148 event = "project_history_requested" ,
121149 project_id = project_id
@@ -124,7 +152,26 @@ def get_project_history(project_id: str):
124152 log .info ("Project history requested" )
125153
126154 try :
127- return memory .get_project_history (project_id )
155+ project = session .get (Project , project_id )
156+ if not project :
157+ raise ValueError (f"Проект { project_id } не найден" )
158+ histories = session .exec (
159+ select (ChatHistoryDB ).where (ChatHistoryDB .project_id == project_id )
160+ ).all ()
161+ result = []
162+ for h in histories :
163+ messages = [StoredChatMessage (** m ) for m in json .loads (h .messages )]
164+ result .append (
165+ ChatHistory (
166+ id = h .id ,
167+ project_id = h .project_id ,
168+ messages = messages ,
169+ trace_id = h .trace_id ,
170+ span_id = h .span_id ,
171+ timestamp = h .timestamp ,
172+ )
173+ )
174+ return result
128175 except ValueError as e :
129176 log .bind (event = "project_history_not_found" ).warning ("Project not found when fetching history" )
130177 raise HTTPException (status_code = 404 , detail = str (e ))
0 commit comments