1111from pydantic import BaseModel , Field , HttpUrl
1212from sqlalchemy .exc import NoResultFound , MultipleResultsFound , SQLAlchemyError
1313
14- from app .api .deps import CurrentUser , SessionDep
14+ from app .api .deps import CurrentUser , SessionDep , CurrentUserOrgproject
1515from app .core .cloud import AmazonCloudStorage
1616from app .core .config import settings
1717from app .core .util import now , raise_from_unknown , post_callback
@@ -169,65 +169,59 @@ def _backout(crud: OpenAIAssistantCrud, assistant_id: str):
169169
170170def do_create_collection (
171171 session : SessionDep ,
172- current_user : CurrentUser ,
172+ current_user : CurrentUserOrgproject ,
173173 request : CreationRequest ,
174174 payload : ResponsePayload ,
175175):
176176 client = OpenAI (api_key = settings .OPENAI_API_KEY )
177- if request .callback_url is None :
178- callback = SilentCallback (payload )
179- else :
180- callback = WebHookCallback (request .callback_url , payload )
181-
182- #
183- # Create the assistant and vector store
184- #
177+ callback = (
178+ SilentCallback (payload )
179+ if request .callback_url is None
180+ else WebHookCallback (request .callback_url , payload )
181+ )
185182
186183 vector_store_crud = OpenAIVectorStoreCrud (client )
187- try :
188- vector_store = vector_store_crud .create ()
189- except OpenAIError as err :
190- callback .fail (str (err ))
191- return
192-
184+ assistant_crud = OpenAIAssistantCrud (client )
193185 storage = AmazonCloudStorage (current_user )
194186 document_crud = DocumentCrud (session , current_user .id )
195- assistant_crud = OpenAIAssistantCrud ( client )
187+ collection_crud = CollectionCrud ( session , current_user . id )
196188
197- docs = request (document_crud )
198- kwargs = dict (request .extract_super_type (AssistantOptions ))
199189 try :
190+ vector_store = vector_store_crud .create ()
191+
192+ docs = request (document_crud )
200193 updates = vector_store_crud .update (vector_store .id , storage , docs )
201194 documents = list (updates )
195+
196+ kwargs = dict (request .extract_super_type (AssistantOptions ))
202197 assistant = assistant_crud .create (vector_store .id , ** kwargs )
203- except Exception as err : # blanket to handle SQL and OpenAI errors
204- logging .error (f"File Search setup error: { err } ({ type (err ).__name__ } )" )
205- vector_store_crud .delete (vector_store .id )
206- callback .fail (str (err ))
207- return
208198
209- #
210- # Store the results
211- #
199+ # 3. Read and update collection with assistant info
200+ collection = collection_crud .read_one (UUID (payload .key ))
201+ collection .llm_service_id = assistant .id
202+ collection .llm_service_name = request .model
203+ collection .status = "successfull"
204+ collection .updated_at = now ()
212205
213- collection_crud = CollectionCrud (session , current_user .id )
214- collection = Collection (
215- id = UUID (payload .key ),
216- llm_service_id = assistant .id ,
217- llm_service_name = request .model ,
218- )
219- try :
220- collection_crud .create (collection , documents )
221- except SQLAlchemyError as err :
222- _backout (assistant_crud , assistant .id )
223- callback .fail (str (err ))
224- return
206+ dc_crud = DocumentCollectionCrud (session )
207+ dc_crud .create (collection , documents )
225208
226- #
227- # Send back successful response
228- #
209+ collection_crud ._update (collection )
229210
230- callback .success (collection .model_dump (mode = "json" ))
211+ callback .success ({"id" : payload .key })
212+ except Exception as err :
213+ logging .error (f"[CollectionTask] Failed: { err } ({ type (err ).__name__ } )" )
214+
215+ # 4. On failure, update collection status only
216+ try :
217+ collection = collection_crud .read_one (UUID (payload .key ))
218+ collection .status = "failed"
219+ collection .updated_at = now ()
220+ collection_crud ._update (collection )
221+ except Exception as suberr :
222+ logging .error (f"Failed to update collection status: { suberr } " )
223+
224+ callback .fail (str (err ))
231225
232226
233227@router .post (
@@ -236,14 +230,27 @@ def do_create_collection(
236230)
237231def create_collection (
238232 session : SessionDep ,
239- current_user : CurrentUser ,
233+ current_user : CurrentUserOrgproject ,
240234 request : CreationRequest ,
241235 background_tasks : BackgroundTasks ,
242236):
243237 this = inspect .currentframe ()
244238 route = router .url_path_for (this .f_code .co_name )
245239 payload = ResponsePayload ("processing" , route )
246240
241+ # 1. Create initial collection record
242+ collection = Collection (
243+ id = UUID (payload .key ),
244+ owner_id = current_user .id ,
245+ organization_id = current_user .organization_id ,
246+ project_id = current_user .project_id ,
247+ status = "processing" ,
248+ )
249+
250+ collection_crud = CollectionCrud (session , current_user .id )
251+ collection_crud .create (collection , documents = [])
252+
253+ # 2. Launch background task
247254 background_tasks .add_task (
248255 do_create_collection ,
249256 session ,
0 commit comments