1- import logging
21from api .Users .user_service import validate_and_extract_user_email
32from api .db .pg_database import SessionLocal
43from api .Assistant .assistant_repository import get_all_assistants , get_assistant_by_id_repository , delete_assistant_repository , update_assistant_repository
87from api .Assistant .assistant_model import Assistant , Context
98from uuid import UUID
109from datetime import datetime , timezone
11- from fastapi import HTTPException , status
10+ from fastapi import HTTPException , status , UploadFile
1211from api .error_constant import ErrorConstants
13- from api .upload .S3_utils import generate_presigned_access_url , delete_file
14- from api .config import get
1512from api .cache .cache_enums import CacheType
1613from api .Assistant .assistant_cache_service import (
1714 get_assistant_detail_cache ,
1815 set_assistant_detail_cache ,
1916 delete_assistant_detail_cache ,
2017)
18+ from api .langgraph .context_processor import validate_file , extract_content_from_file
2119
2220
2321def _build_context_responses (contexts ) -> List [ContextResponse ]:
2422 return [
2523 ContextResponse (
2624 id = context .id ,
2725 content = context .content ,
28- file_url = (
29- generate_presigned_access_url (
30- bucket_name = get ("AWS_BUCKET_NAME" ),
31- s3_key = context .file_url
32- ) if context .file_url else None
33- ),
3426 pecha_title = context .pecha_title ,
3527 pecha_text_id = context .pecha_text_id
3628 ) for context in contexts
@@ -79,21 +71,37 @@ def get_assistants(skip: 0, limit: 20) -> AssistantResponse:
7971 return assistant_response
8072
8173
82- def create_assistant_service (token : str , assistant_request : AssistantRequest ):
83- current_user_email = validate_and_extract_user_email (token = token )
74+ async def create_assistant_service (token : str , assistant_request : AssistantRequest , files : List [UploadFile ] = None ):
75+ current_user_email = validate_and_extract_user_email (token = token )
76+
77+ contexts_list = []
78+
79+ for ctx in assistant_request .contexts :
80+ contexts_list .append (
81+ Context (content = ctx .content , pecha_title = ctx .pecha_title , pecha_text_id = ctx .pecha_text_id )
82+ )
83+
84+ if files :
85+ for file in files :
86+ if file .filename :
87+ file_bytes = await file .read ()
88+ try :
89+ validate_file (file .filename , len (file_bytes ))
90+ extracted_content = extract_content_from_file (file_bytes , file .filename )
91+ contexts_list .append (Context (content = extracted_content ))
92+ except ValueError as e :
93+ raise HTTPException (status_code = status .HTTP_400_BAD_REQUEST , detail = str (e ))
94+
8495 with SessionLocal () as db_session :
8596 assistant = Assistant (
86- name = assistant_request .name ,
87- source_type = assistant_request .source_type ,
88- description = assistant_request .description ,
89- system_prompt = assistant_request .system_prompt ,
90- system_assistance = assistant_request .system_assistance ,
91- created_by = current_user_email ,
92- contexts = [
93- Context (content = ctx .content , file_url = ctx .file_url , pecha_title = ctx .pecha_title , pecha_text_id = ctx .pecha_text_id )
94- for ctx in assistant_request .contexts
95- ]
96- )
97+ name = assistant_request .name ,
98+ source_type = assistant_request .source_type ,
99+ description = assistant_request .description ,
100+ system_prompt = assistant_request .system_prompt ,
101+ system_assistance = assistant_request .system_assistance ,
102+ created_by = current_user_email ,
103+ contexts = contexts_list
104+ )
97105 create_assistant_repository (db = db_session , assistant = assistant )
98106
99107async def get_assistant_by_id_service (assistant_id : UUID ) -> AssistantInfoResponse :
@@ -118,21 +126,14 @@ async def get_assistant_by_id_service(assistant_id: UUID) -> AssistantInfoRespon
118126 return assistant_info
119127
120128async def delete_assistant_service (assistant_id : UUID , token : str ):
121- current_user_email = validate_and_extract_user_email (token = token )
129+ current_user_email = validate_and_extract_user_email (token = token )
122130 with SessionLocal () as db_session :
123131 assistant = get_assistant_by_id_repository (db = db_session , assistant_id = assistant_id )
124132 if current_user_email != assistant .created_by :
125133 raise HTTPException (status_code = status .HTTP_403_FORBIDDEN , detail = ErrorConstants .UNAUTHORIZED_ERROR_MESSAGE )
126134 if assistant .system_assistance :
127135 raise HTTPException (status_code = status .HTTP_403_FORBIDDEN , detail = ErrorConstants .FORBIDDEN_ERROR_MESSAGE )
128136
129- for context in assistant .contexts :
130- if context .file_url :
131- try :
132- delete_file (context .file_url )
133- except Exception as e :
134- logging .error (f"Failed to delete S3 file { context .file_url } : { str (e )} " )
135-
136137 delete_assistant_repository (db = db_session , assistant_id = assistant_id )
137138
138139 await delete_assistant_detail_cache (
@@ -161,7 +162,7 @@ async def update_assistant_service(assistant_id: UUID, update_request: UpdateAss
161162 for context in assistant .contexts :
162163 db_session .delete (context )
163164 assistant .contexts = [
164- Context (content = ctx .content , file_url = ctx . file_url , pecha_title = ctx .pecha_title , pecha_text_id = ctx .pecha_text_id )
165+ Context (content = ctx .content , pecha_title = ctx .pecha_title , pecha_text_id = ctx .pecha_text_id )
165166 for ctx in update_request .contexts
166167 ]
167168
0 commit comments