File size: 6,129 Bytes
cb4d130
749c207
a6fdb22
e274157
a6fdb22
bbcfa4f
 
749c207
 
a47c93c
c3cb308
cb4d130
2128058
 
 
9bb28d5
2128058
9bb28d5
 
2128058
 
9bb28d5
2128058
 
9bb28d5
2128058
 
 
 
9bb28d5
 
2128058
 
 
9bb28d5
 
ecf8f43
9bb28d5
 
 
 
 
 
 
2128058
 
 
ecf8f43
749c207
 
9bb28d5
749c207
 
 
 
 
 
9bb28d5
749c207
 
 
bbcfa4f
749c207
 
 
 
 
 
 
 
bbcfa4f
 
 
5271f8c
97dfa77
 
9bb28d5
 
 
 
 
 
749c207
 
9bb28d5
749c207
 
9bb28d5
749c207
9bb28d5
cabc6e8
 
 
9bb28d5
cabc6e8
9bb28d5
 
 
61c03a5
9bb28d5
 
 
61c03a5
9bb28d5
 
 
 
 
f5ca184
 
 
 
 
f036dba
9bb28d5
 
f036dba
2977ec4
9bb28d5
 
 
61c03a5
f036dba
 
9bb28d5
017e4bb
f5ca184
9bb28d5
 
 
61c03a5
017e4bb
cabc6e8
749c207
23a0289
810312c
6039386
 
 
23a0289
b3bfa5a
 
8a85d4d
 
 
b6726de
8a85d4d
 
810312c
749c207
cabc6e8
9bb28d5
f5ca184
749c207
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
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()