3737# CSV ticket service
3838from csv_data import Ticket , get_csv_ticket_service
3939
40+ # FastMCP client for direct ticket MCP calls (no AI)
41+ from fastmcp import Client as MCPClient
42+
4043# KBA Drafter
4144from kba_exceptions import (
4245 DraftNotFoundError ,
4346 DuplicateKBADraftError ,
4447 InvalidLLMOutputError ,
4548 InvalidStatusError ,
49+ LLMAuthenticationError ,
50+ LLMRateLimitError ,
51+ LLMTimeoutError ,
52+ LLMUnavailableError ,
4653 PublishFailedError ,
4754 TicketNotFoundError ,
4855)
5360 KBADraftUpdate ,
5461 KBAPublishRequest ,
5562)
56- from kba_exceptions import (
57- LLMTimeoutError ,
58- LLMUnavailableError ,
59- LLMRateLimitError ,
60- LLMAuthenticationError ,
61- )
62-
63- # FastMCP client for direct ticket MCP calls (no AI)
64- from fastmcp import Client as MCPClient
6563from mcp_handler import handle_mcp_request
6664from operations import (
6765 CSV_TICKET_FIELDS ,
111109@app .before_serving
112110async def startup ():
113111 """Initialize scheduler on application startup"""
114- from scheduler import start_scheduler
115112 import logging
113+
114+ from scheduler import start_scheduler
116115
117116 logger = logging .getLogger (__name__ )
118117 logger .info ("Starting auto-generation scheduler..." )
@@ -127,8 +126,9 @@ async def startup():
127126@app .after_serving
128127async def shutdown ():
129128 """Cleanup scheduler on application shutdown"""
130- from scheduler import stop_scheduler
131129 import logging
130+
131+ from scheduler import stop_scheduler
132132
133133 logger = logging .getLogger (__name__ )
134134 logger .info ("Stopping auto-generation scheduler..." )
@@ -585,6 +585,12 @@ async def get_qa_tickets():
585585if _csv_data_path .exists ():
586586 _csv_loaded = _csv_ticket_service .load_csv (_csv_data_path )
587587 print (f"📊 Loaded { _csv_loaded } tickets from CSV" )
588+ else :
589+ print (
590+ f"⚠️ CSV data file not found: { _csv_data_path .resolve ()} \n "
591+ f" Ticket features will be unavailable.\n "
592+ f" To fix: place your BMC Remedy/ITSM CSV export at csv/data.csv"
593+ )
588594
589595
590596@app .route ("/api/csv-tickets/fields" , methods = ["GET" ])
@@ -974,6 +980,7 @@ async def rest_kba_publish_draft(draft_id: str):
974980async def rest_kba_list_drafts ():
975981 """REST wrapper: list KBA drafts with filtering."""
976982 from operations import op_kba_list_drafts
983+
977984 # Parse query parameters
978985 filters = KBADraftFilter (
979986 status = request .args .get ("status" ),
@@ -1039,8 +1046,8 @@ async def rest_kba_get_auto_gen_settings():
10391046@app .route ("/api/kba/auto-gen/settings" , methods = ["PATCH" ])
10401047async def rest_kba_update_auto_gen_settings ():
10411048 """REST wrapper: update auto-generation settings."""
1042- from operations import op_kba_update_auto_gen_settings
10431049 from auto_gen_models import AutoGenSettingsUpdate
1050+ from operations import op_kba_update_auto_gen_settings
10441051
10451052 data = await request .get_json ()
10461053 updates = AutoGenSettingsUpdate (** data )
0 commit comments