Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import requests | |
| import os | |
| import re | |
| from run_model import run | |
| # WARNING: It is not recommended to hardcode sensitive data like API tokens in code. | |
| # Consider using environment variables or other secure methods for production applications. | |
| API_URL = os.environ["DATASAUR_API_URL"] | |
| API_TOKEN = os.environ["DATASAUR_API_KEY"] | |
| import re | |
| import json | |
| def extract_json_from_text(text): | |
| """ | |
| Extracts JSON content from text that starts with { and ends with }. | |
| Returns the parsed JSON object with category_fix and suggestion keys. | |
| Parameters: | |
| text (str): Input text that may contain JSON content. | |
| Returns: | |
| dict: Dictionary with 'category_fix' and 'suggestion' keys, or None if not found. | |
| """ | |
| # First, try to directly parse as JSON | |
| try: | |
| parsed = json.loads(text) | |
| if "category_fix" in parsed and "suggestion" in parsed: | |
| return parsed | |
| except json.JSONDecodeError: | |
| pass # Fall back to regex if not valid JSON | |
| # Fallback: use regex to extract JSON content between { and } | |
| match = re.search(r'\{[^{}]*\}', text) | |
| if match: | |
| try: | |
| json_str = match.group(0) | |
| parsed = json.loads(json_str) | |
| if "category_fix" in parsed and "suggestion" in parsed: | |
| return parsed | |
| except json.JSONDecodeError: | |
| pass | |
| return None | |
| def magic_function(input_text): | |
| """ | |
| Sends text to the Datasaur deployment API and returns the processed JSON with category_fix and suggestion. | |
| """ | |
| headers = { | |
| "Content-Type": "application/json", | |
| "Authorization": f"Bearer {API_TOKEN}", | |
| } | |
| data = { | |
| "messages": [{"role": "user", "content": f"Time Entry Input: `{input_text}`"}] | |
| } | |
| try: | |
| """ | |
| response = requests.post(API_URL, headers=headers, json=data) | |
| response.raise_for_status() # Raise an exception for bad status codes (4xx or 5xx) | |
| response_json = response.json() | |
| # Extract content from a standard chat completion response structure. | |
| # This may need adjustment if the API has a different format. | |
| content = response_json.get("choices", [{}])[0].get("message", {}).get("content", "Error: Could not parse response.") | |
| """ | |
| content = run(input_text) | |
| print(content) | |
| result = extract_json_from_text(content) | |
| if result: | |
| return result | |
| else: | |
| return {"category_fix": "ERROR", "suggestion": "Could not parse response"} | |
| except requests.exceptions.RequestException as e: | |
| return {"category_fix": "ERROR", "suggestion": f"API Request Error: {e}"} | |
| except (ValueError, KeyError, IndexError): | |
| # Handle cases where response is not valid JSON or structure is unexpected | |
| return {"category_fix": "ERROR", "suggestion": f"Error processing API response: {response.text}"} | |
| def handle_magic_click(current_text, current_button_text): | |
| """ | |
| When the magic button is clicked, this function gets the improved text, | |
| and returns the new and previous text to update the UI. | |
| If category_fix == "COMPLIANT", make text area light green, hide previous text, lock text area, and change button to Reset. | |
| """ | |
| if current_button_text == "Reset": | |
| # Reset to initial state | |
| return ( | |
| gr.update(label="Your Text", value="", elem_classes="", interactive=True), # text_area - reset and unlock | |
| "", # previous_text_area - clear | |
| gr.update(visible=False), # previous_text_area visibility - hide | |
| gr.update(value="", visible=False), # category_label - hide | |
| gr.update(value="Magic Button") # button text - reset | |
| ) | |
| result = magic_function(current_text) | |
| category_fix = result.get("category_fix", "") | |
| suggestion = result.get("suggestion", "") | |
| print(current_text) | |
| print(category_fix) | |
| print(suggestion) | |
| print() | |
| if category_fix == "COMPLIANT": | |
| # COMPLIANT case - no changes to input, green background, lock, add checklist, change button to Reset | |
| return ( | |
| gr.update(label="Your Text ✓", value=current_text, elem_classes="success-text", interactive=False), # text_area - keep original, green, lock | |
| current_text, # previous_text_area - store current | |
| gr.update(visible=False), # previous_text_area visibility - hide | |
| gr.update(value=f"**{category_fix}**", visible=True), # category_label - show category in bold | |
| gr.update(value="Reset") # button text - change to Reset | |
| ) | |
| else: | |
| # Non-compliant case - show suggestion, show previous text, show category | |
| return ( | |
| gr.update(label="Your Text", value=suggestion, elem_classes="", interactive=True), # text_area - show suggestion, normal style, unlocked | |
| current_text, # previous_text_area - store current | |
| gr.update(visible=True), # previous_text_area visibility - show | |
| gr.update(value=f"**{category_fix}**", visible=True), # category_label - show category in bold | |
| gr.update(value="Magic Button") # button text - keep as Magic Button | |
| ) | |
| with gr.Blocks( | |
| theme=gr.themes.Default(primary_hue="blue", secondary_hue="sky"), | |
| css=""" | |
| .success-text { background-color: #d4edda !important; } | |
| """ | |
| ) as demo: | |
| gr.Markdown("# Time Entry Improvement") | |
| with gr.Row(): | |
| with gr.Column(scale=4): | |
| text_area = gr.Textbox(label="Your Text", lines=5) | |
| previous_text_area = gr.Textbox(label="Previous Text", lines=5, visible=False) | |
| category_label = gr.Markdown("", visible=False) | |
| with gr.Column(scale=1): | |
| magic_button = gr.Button("Magic Button") | |
| magic_button.click( | |
| fn=handle_magic_click, | |
| inputs=[text_area, magic_button], | |
| outputs=[text_area, previous_text_area, previous_text_area, category_label, magic_button] | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() | |