Spaces:
Sleeping
Sleeping
deterministic query/file handling
Browse files- app/main.py +48 -10
app/main.py
CHANGED
@@ -212,15 +212,46 @@ def generate_node(state: GraphState) -> GraphState:
|
|
212 |
})
|
213 |
return {"result": f"Error: {str(e)}", "metadata": metadata}
|
214 |
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
224 |
|
225 |
def process_query_core(
|
226 |
query: str,
|
@@ -253,7 +284,14 @@ def process_query_core(
|
|
253 |
}
|
254 |
}
|
255 |
|
256 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
257 |
total_duration = (datetime.now() - start_time).total_seconds()
|
258 |
|
259 |
final_metadata = final_state.get("metadata", {})
|
|
|
212 |
})
|
213 |
return {"result": f"Error: {str(e)}", "metadata": metadata}
|
214 |
|
215 |
+
def file_only_node(state: GraphState) -> GraphState:
|
216 |
+
"""Return ingestor result directly without calling generator"""
|
217 |
+
logger.info("File-only processing: returning ingestor result directly")
|
218 |
+
|
219 |
+
ingestor_context = state.get("ingestor_context", "")
|
220 |
+
metadata = state.get("metadata", {})
|
221 |
+
metadata.update({
|
222 |
+
"processing_type": "file_only",
|
223 |
+
"result_source": "ingestor"
|
224 |
+
})
|
225 |
+
|
226 |
+
return {
|
227 |
+
"result": ingestor_context,
|
228 |
+
"metadata": metadata
|
229 |
+
}
|
230 |
+
|
231 |
+
# Create separate workflows for different processing types
|
232 |
+
def create_file_workflow():
|
233 |
+
"""Workflow for file uploads: ingest -> file_only (skip retrieve and generate)"""
|
234 |
+
workflow = StateGraph(GraphState)
|
235 |
+
workflow.add_node("ingest", ingest_node)
|
236 |
+
workflow.add_node("file_only", file_only_node)
|
237 |
+
workflow.add_edge(START, "ingest")
|
238 |
+
workflow.add_edge("ingest", "file_only")
|
239 |
+
workflow.add_edge("file_only", END)
|
240 |
+
return workflow.compile()
|
241 |
+
|
242 |
+
def create_query_workflow():
|
243 |
+
"""Workflow for queries: retrieve -> generate (skip ingest)"""
|
244 |
+
workflow = StateGraph(GraphState)
|
245 |
+
workflow.add_node("retrieve", retrieve_node)
|
246 |
+
workflow.add_node("generate", generate_node)
|
247 |
+
workflow.add_edge(START, "retrieve")
|
248 |
+
workflow.add_edge("retrieve", "generate")
|
249 |
+
workflow.add_edge("generate", END)
|
250 |
+
return workflow.compile()
|
251 |
+
|
252 |
+
# Compile workflows
|
253 |
+
file_workflow = create_file_workflow()
|
254 |
+
query_workflow = create_query_workflow()
|
255 |
|
256 |
def process_query_core(
|
257 |
query: str,
|
|
|
284 |
}
|
285 |
}
|
286 |
|
287 |
+
# Choose workflow based on whether file is provided
|
288 |
+
if file_content and filename:
|
289 |
+
logger.info("File provided - using file workflow (ingest -> file_only)")
|
290 |
+
final_state = file_workflow.invoke(initial_state)
|
291 |
+
else:
|
292 |
+
logger.info("No file provided - using query workflow (retrieve -> generate)")
|
293 |
+
final_state = query_workflow.invoke(initial_state)
|
294 |
+
|
295 |
total_duration = (datetime.now() - start_time).total_seconds()
|
296 |
|
297 |
final_metadata = final_state.get("metadata", {})
|