blank image issue on multiple req
Browse files- controller.py +126 -126
controller.py
CHANGED
|
@@ -309,81 +309,81 @@ def handle_out_of_range_float(value):
|
|
| 309 |
|
| 310 |
# CHART CODING STARTS FROM HERE
|
| 311 |
|
| 312 |
-
|
| 313 |
|
| 314 |
-
|
| 315 |
-
|
| 316 |
-
|
| 317 |
-
|
| 318 |
|
| 319 |
-
|
| 320 |
|
| 321 |
-
#
|
| 322 |
-
|
| 323 |
-
|
| 324 |
|
| 325 |
# current_langchain_chart_key_index = 0
|
| 326 |
# current_langchain_chart_lock = threading.Lock()
|
| 327 |
|
| 328 |
-
|
| 329 |
-
|
| 330 |
-
|
| 331 |
-
|
| 332 |
-
|
| 333 |
-
|
| 334 |
-
|
| 335 |
|
| 336 |
-
|
| 337 |
-
|
| 338 |
|
| 339 |
-
|
| 340 |
-
|
| 341 |
-
#
|
| 342 |
-
|
| 343 |
-
|
| 344 |
-
|
| 345 |
-
|
| 346 |
-
|
| 347 |
-
|
| 348 |
|
| 349 |
-
|
| 350 |
-
|
| 351 |
-
|
| 352 |
|
| 353 |
-
|
| 354 |
|
| 355 |
-
#
|
| 356 |
-
|
| 357 |
-
|
| 358 |
|
| 359 |
-
#
|
| 360 |
-
|
| 361 |
-
|
| 362 |
-
|
| 363 |
-
|
| 364 |
-
|
| 365 |
-
|
| 366 |
-
|
| 367 |
-
|
| 368 |
-
|
| 369 |
-
|
| 370 |
|
| 371 |
-
|
| 372 |
|
| 373 |
-
|
| 374 |
-
|
| 375 |
-
|
| 376 |
|
| 377 |
-
|
| 378 |
-
|
| 379 |
-
|
| 380 |
-
|
| 381 |
-
|
| 382 |
-
|
| 383 |
-
|
| 384 |
-
|
| 385 |
|
| 386 |
-
|
| 387 |
|
| 388 |
|
| 389 |
|
|
@@ -572,8 +572,8 @@ def handle_out_of_range_float(value):
|
|
| 572 |
|
| 573 |
|
| 574 |
# Global locks for key rotation (chart endpoints)
|
| 575 |
-
current_groq_chart_key_index = 0
|
| 576 |
-
current_groq_chart_lock = threading.Lock()
|
| 577 |
current_langchain_chart_key_index = 0
|
| 578 |
current_langchain_chart_lock = threading.Lock()
|
| 579 |
|
|
@@ -584,83 +584,83 @@ print("Available CPUs:", max_cpus)
|
|
| 584 |
process_executor = ProcessPoolExecutor(max_workers=4)
|
| 585 |
|
| 586 |
# --- GROQ-BASED CHART GENERATION ---
|
| 587 |
-
def groq_chart(csv_url: str, question: str):
|
| 588 |
-
|
| 589 |
-
|
| 590 |
-
|
| 591 |
-
|
| 592 |
-
|
| 593 |
-
|
| 594 |
-
|
| 595 |
-
|
| 596 |
|
| 597 |
-
|
| 598 |
-
|
| 599 |
-
|
| 600 |
-
|
| 601 |
-
|
| 602 |
-
|
| 603 |
-
|
| 604 |
-
|
| 605 |
-
|
| 606 |
-
|
| 607 |
|
| 608 |
-
|
| 609 |
-
|
| 610 |
-
|
| 611 |
|
| 612 |
-
|
| 613 |
-
|
| 614 |
-
|
| 615 |
|
| 616 |
-
|
| 617 |
|
| 618 |
-
|
| 619 |
-
|
| 620 |
-
|
| 621 |
|
| 622 |
-
|
| 623 |
-
|
| 624 |
-
|
| 625 |
-
|
| 626 |
-
|
| 627 |
-
|
| 628 |
-
|
| 629 |
-
|
| 630 |
-
|
| 631 |
-
|
| 632 |
-
|
| 633 |
-
|
| 634 |
-
|
| 635 |
|
| 636 |
-
|
| 637 |
-
|
| 638 |
-
|
| 639 |
-
|
| 640 |
-
|
| 641 |
-
|
| 642 |
-
|
| 643 |
-
|
| 644 |
|
| 645 |
-
|
| 646 |
-
|
| 647 |
|
| 648 |
-
|
| 649 |
-
|
| 650 |
-
|
| 651 |
-
|
| 652 |
-
|
| 653 |
|
| 654 |
-
|
| 655 |
-
|
| 656 |
-
|
| 657 |
-
|
| 658 |
-
|
| 659 |
-
|
| 660 |
-
|
| 661 |
-
|
| 662 |
|
| 663 |
-
|
| 664 |
|
| 665 |
|
| 666 |
# --- LANGCHAIN-BASED CHART GENERATION ---
|
|
|
|
| 309 |
|
| 310 |
# CHART CODING STARTS FROM HERE
|
| 311 |
|
| 312 |
+
instructions = """
|
| 313 |
|
| 314 |
+
- Please ensure that each value is clearly visible, You may need to adjust the font size, rotate the labels, or use truncation to improve readability (if needed).
|
| 315 |
+
- For multiple charts, arrange them in a grid format (2x2, 3x3, etc.)
|
| 316 |
+
- Use colorblind-friendly palette
|
| 317 |
+
- Read above instructions and follow them.
|
| 318 |
|
| 319 |
+
"""
|
| 320 |
|
| 321 |
+
# Thread-safe configuration for chart endpoints
|
| 322 |
+
current_groq_chart_key_index = 0
|
| 323 |
+
current_groq_chart_lock = threading.Lock()
|
| 324 |
|
| 325 |
# current_langchain_chart_key_index = 0
|
| 326 |
# current_langchain_chart_lock = threading.Lock()
|
| 327 |
|
| 328 |
+
def model():
|
| 329 |
+
global current_groq_chart_key_index, current_groq_chart_lock
|
| 330 |
+
with current_groq_chart_lock:
|
| 331 |
+
if current_groq_chart_key_index >= len(groq_api_keys):
|
| 332 |
+
raise Exception("All API keys exhausted for chart generation")
|
| 333 |
+
api_key = groq_api_keys[current_groq_chart_key_index]
|
| 334 |
+
return ChatGroq(model=model_name, api_key=api_key)
|
| 335 |
|
| 336 |
+
def groq_chart(csv_url: str, question: str):
|
| 337 |
+
global current_groq_chart_key_index, current_groq_chart_lock
|
| 338 |
|
| 339 |
+
for attempt in range(len(groq_api_keys)):
|
| 340 |
+
try:
|
| 341 |
+
# Clean cache before processing
|
| 342 |
+
cache_db_path = "/workspace/cache/cache_db_0.11.db"
|
| 343 |
+
if os.path.exists(cache_db_path):
|
| 344 |
+
try:
|
| 345 |
+
os.remove(cache_db_path)
|
| 346 |
+
except Exception as e:
|
| 347 |
+
print(f"Cache cleanup error: {e}")
|
| 348 |
|
| 349 |
+
data = clean_data(csv_url)
|
| 350 |
+
with current_groq_chart_lock:
|
| 351 |
+
current_api_key = groq_api_keys[current_groq_chart_key_index]
|
| 352 |
|
| 353 |
+
llm = ChatGroq(model=model_name, api_key=current_api_key)
|
| 354 |
|
| 355 |
+
# Generate unique filename using UUID
|
| 356 |
+
chart_filename = f"chart_{uuid.uuid4()}.png"
|
| 357 |
+
chart_path = os.path.join("generated_charts", chart_filename)
|
| 358 |
|
| 359 |
+
# Configure SmartDataframe with chart settings
|
| 360 |
+
df = SmartDataframe(
|
| 361 |
+
data,
|
| 362 |
+
config={
|
| 363 |
+
'llm': llm,
|
| 364 |
+
'save_charts': True, # Enable chart saving
|
| 365 |
+
'open_charts': False,
|
| 366 |
+
'save_charts_path': os.path.dirname(chart_path), # Directory to save
|
| 367 |
+
'custom_chart_filename': chart_filename # Unique filename
|
| 368 |
+
}
|
| 369 |
+
)
|
| 370 |
|
| 371 |
+
answer = df.chat(question + instructions)
|
| 372 |
|
| 373 |
+
if process_answer(answer):
|
| 374 |
+
return "Chart not generated"
|
| 375 |
+
return answer
|
| 376 |
|
| 377 |
+
except Exception as e:
|
| 378 |
+
error = str(e)
|
| 379 |
+
if "429" in error:
|
| 380 |
+
with current_groq_chart_lock:
|
| 381 |
+
current_groq_chart_key_index = (current_groq_chart_key_index + 1) % len(groq_api_keys)
|
| 382 |
+
else:
|
| 383 |
+
print(f"Chart generation error: {error}")
|
| 384 |
+
return {"error": error}
|
| 385 |
|
| 386 |
+
return {"error": "All API keys exhausted for chart generation"}
|
| 387 |
|
| 388 |
|
| 389 |
|
|
|
|
| 572 |
|
| 573 |
|
| 574 |
# Global locks for key rotation (chart endpoints)
|
| 575 |
+
# current_groq_chart_key_index = 0
|
| 576 |
+
# current_groq_chart_lock = threading.Lock()
|
| 577 |
current_langchain_chart_key_index = 0
|
| 578 |
current_langchain_chart_lock = threading.Lock()
|
| 579 |
|
|
|
|
| 584 |
process_executor = ProcessPoolExecutor(max_workers=4)
|
| 585 |
|
| 586 |
# --- GROQ-BASED CHART GENERATION ---
|
| 587 |
+
# def groq_chart(csv_url: str, question: str):
|
| 588 |
+
# """
|
| 589 |
+
# Generate a chart using the groq-based method.
|
| 590 |
+
# Modifications:
|
| 591 |
+
# • No deletion of a shared cache file (avoid interference).
|
| 592 |
+
# • After chart generation, close all matplotlib figures.
|
| 593 |
+
# • Return the full path of the saved chart.
|
| 594 |
+
# """
|
| 595 |
+
# global current_groq_chart_key_index, current_groq_chart_lock
|
| 596 |
|
| 597 |
+
# for attempt in range(len(groq_api_keys)):
|
| 598 |
+
# try:
|
| 599 |
+
# # Instead of deleting a global cache file, you might later configure a per-request cache.
|
| 600 |
+
# cache_db_path = "/app/cache/cache_db_0.11.db"
|
| 601 |
+
# if os.path.exists(cache_db_path):
|
| 602 |
+
# try:
|
| 603 |
+
# os.remove(cache_db_path)
|
| 604 |
+
# print(f"Deleted cache DB file: {cache_db_path}")
|
| 605 |
+
# except Exception as e:
|
| 606 |
+
# print(f"Error deleting cache DB file: {e}")
|
| 607 |
|
| 608 |
+
# chart_dir = "generated_charts"
|
| 609 |
+
# if not os.path.exists(chart_dir):
|
| 610 |
+
# os.makedirs(chart_dir)
|
| 611 |
|
| 612 |
+
# data = clean_data(csv_url)
|
| 613 |
+
# with current_groq_chart_lock:
|
| 614 |
+
# current_api_key = groq_api_keys[current_groq_chart_key_index]
|
| 615 |
|
| 616 |
+
# llm = ChatGroq(model=model_name, api_key=current_api_key)
|
| 617 |
|
| 618 |
+
# # Generate a unique filename and full path for the chart
|
| 619 |
+
# chart_filename = f"chart_{uuid.uuid4().hex}.png"
|
| 620 |
+
# chart_path = os.path.join("generated_charts", chart_filename)
|
| 621 |
|
| 622 |
+
# # Configure your dataframe tool (e.g. using SmartDataframe) to save charts.
|
| 623 |
+
# # (Assuming your SmartDataframe uses these settings to save charts.)
|
| 624 |
+
# from pandasai import SmartDataframe # Import here if not already imported
|
| 625 |
+
# df = SmartDataframe(
|
| 626 |
+
# data,
|
| 627 |
+
# config={
|
| 628 |
+
# 'llm': llm,
|
| 629 |
+
# 'save_charts': True,
|
| 630 |
+
# 'open_charts': False,
|
| 631 |
+
# 'save_charts_path': os.path.dirname(chart_path),
|
| 632 |
+
# 'custom_chart_filename': chart_filename
|
| 633 |
+
# }
|
| 634 |
+
# )
|
| 635 |
|
| 636 |
+
# # Append any extra instructions if needed
|
| 637 |
+
# instructions = """
|
| 638 |
+
# - Ensure each value is clearly visible.
|
| 639 |
+
# - Adjust font sizes, rotate labels if necessary.
|
| 640 |
+
# - Use a colorblind-friendly palette.
|
| 641 |
+
# - Arrange multiple charts in a grid if needed.
|
| 642 |
+
# """
|
| 643 |
+
# answer = df.chat(question + instructions)
|
| 644 |
|
| 645 |
+
# # Make sure to close figures so they don't conflict between processes
|
| 646 |
+
# plt.close('all')
|
| 647 |
|
| 648 |
+
# # If process_answer indicates a problem, return a failure message.
|
| 649 |
+
# if process_answer(answer):
|
| 650 |
+
# return "Chart not generated"
|
| 651 |
+
# # Return the chart path that was used for saving
|
| 652 |
+
# return chart_path
|
| 653 |
|
| 654 |
+
# except Exception as e:
|
| 655 |
+
# error = str(e)
|
| 656 |
+
# if "429" in error:
|
| 657 |
+
# with current_groq_chart_lock:
|
| 658 |
+
# current_groq_chart_key_index = (current_groq_chart_key_index + 1) % len(groq_api_keys)
|
| 659 |
+
# else:
|
| 660 |
+
# print(f"Groq chart generation error: {error}")
|
| 661 |
+
# return {"error": error}
|
| 662 |
|
| 663 |
+
# return {"error": "All API keys exhausted for chart generation"}
|
| 664 |
|
| 665 |
|
| 666 |
# --- LANGCHAIN-BASED CHART GENERATION ---
|