datasaur-dev's picture
Update app.py
97dfa77 verified
raw
history blame
6.13 kB
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()