CoolFace
Apppublic

markrodrigo/Llama-3.2-3B-Instruct-Spatial-SQL-1.1

sourceHugging Facellama3.2updated 2mo agoView on Hugging Face
0likes
app.py195 linesDownload Raw Back to root
1from transformers import pipeline2import gradio as gr3import spaces4import os5import time6from collections import defaultdict7 8# Hidden state for the counter9# counter_state = gr.State(0)10hf_token = os.getenv("HF_TOKEN")11pipe = pipeline("text-generation", model="markrodrigo/Llama-3.2-3B-Instruct-Spatial-SQL-1.1", device_map="auto", token=hf_token)12 13usage_tracker = defaultdict(list)14MAX_REQUESTS_PER_DAY = 315TRUSTED_USERS = {"markrodrigo"}   # ← Add your username here16 17# The Alpaca instruction prompt format18ALPACA_TEMPLATE = """<|begin_of_text|><|start_header_id|>system<|end_header_id|> You are a helpful assistant. You are an expert at PostGIS and Postgresql and SQL and psql. <|eot_id|><|start_header_id|>user<|end_header_id|>19 20### Instruction: Write a PostGIS SQL statement for the following.21{instruction}22 23### Input:24{input}25 26### Response:27<|eot_id|><|start_header_id|>assistant<|end_header_id|>28"""29 30# Define your list of pre-set example prompts31PRESET_EXAMPLES = [32    "What is the area for the polygon? : 'Polygon ((-3.7515154 40.3855551, -3.7514972 40.3856581, -3.7507005 40.3855767, -3.7507167 40.3854722, -3.7515154 40.3855551))'",33    "What is the centroid for the polygon? : 'Polygon ((-3.6934636 40.4808785, -3.6933352 40.4811486, -3.6930125 40.4810598, -3.693141 40.4807897, -3.6934636 40.4808785))'",34    "What is the thousand meter buffer for the following point? : 'Point(-8.7522658 41.3862664)'",35    "How long is the line? : 'LINESTRING (-3.6976693 40.4263178, -3.6986082 40.4258729)'",36    "How far apart is the point and line? : 'Point(-109.87549823 38.60574249)' 'LineString(-109.24324628 38.76349931, -109.4821773 38.6875815)'"37]38 39# Custom CSS targeting the button by its ID40custom_css = """41#special-button {42    background-color: #0052FF !important;   /* Your desired color */43    color: white !important;44    border: none !important;45    font-weight: 600 !important;46    padding: 12px 24px !important;47}48 49#special-button:hover {50    background-color: #CAD3DE !important;51    transform: scale(1.03);52    transition: all 0.2s ease;53}54 55#clear-chat-btn {56    width: 200px !important;57    min-width: 200px !important;58    max-width: 200px !important;59    height: 42px !important;60    background-color: #FF5733 !important;   /* Main hex color */61    color: #FFFFFF !important;              /* White text */62    border: none !important;63    font-size: 14px !important;64    font-weight: 600 !important;65    padding: 8px 16px !important;66    border-radius: 8px !important;          /* Optional rounded look */67}68 69#clear-chat-btn:hover {70    background-color: #C70039 !important;   /* Hover hex color (darker) */71    transform: translateY(-1px);72    box-shadow: 0 4px 12px rgba(199, 0, 57, 0.3) !important;73}74"""75global_counter = 076 77# def get_latest_counter():78    # global global_counter79    # return global_counter  # Dynamically fetches the current server value80 81def increment_counter():82    global global_counter83    global_counter += 184    return global_counter 85 86@spaces.GPU87def respond(user_message, chat_history, profile: gr.OAuthProfile | None):  # , counter):88        # === BLOCK ANONYMOUS USERS ===89    if profile is None:90        raise gr.Error("You must be logged in with a Hugging Face account to use this demo.")91    92    username = profile.username93    print("Debug username:", username)   # You can keep this temporarily94    95    now = time.time()96    usage_tracker[username] = [ts for ts in usage_tracker[username] if now - ts < 86400]97    98    # Trusted users (you) get unlimited99    if username in TRUSTED_USERS:100        pass101    else:102        if len(usage_tracker[username]) >= MAX_REQUESTS_PER_DAY:103            raise gr.Error(f"Daily limit reached ({MAX_REQUESTS_PER_DAY} requests/day).")104    105    usage_tracker[username].append(now)106 107    # global global_counter108    # global_counter += 1109 110 111    # 1. Increment counter112    # counter += 1113 114    chat_history = chat_history or []115 116    if not user_message or not user_message.strip():117        return chat_history, ""118 119    # Modern format for Gradio 5/6120    chat_history.append({"role": "user", "content": user_message})121    chat_history.append({"role": "assistant", "content": None})122 123    prompt = ALPACA_TEMPLATE.format(instruction=user_message, input="")124 125    sequences = pipe(126        prompt,127        max_new_tokens=256,128        return_full_text=False,129        temperature=0.4,130        top_k=100,131        do_sample=True,132    )133 134    bot_response = sequences[0]["generated_text"].strip()135    chat_history[-1]["content"] = bot_response136 137    return chat_history, "", global_counter  # , counter138 139 140 141with gr.Blocks(title="Text to PostGIS Postgresql via Llama 3.2") as demo:142    gr.LoginButton()143    gr.Markdown("# Natural Language to Spatial SQL.\n###  Convert natural language and spatial primitives to PostGIS with Llama 3.2")144    chatbot = gr.Chatbot(145        label="Chat",146        height=400,147        # type="messages",148        # show_copy_button=True,149    )150 151    with gr.Row():152        with gr.Column(scale=5):153            msg = gr.Textbox(154                placeholder="Natural Language : WKT format",155                lines=2,156                container=False157            )158        with gr.Column(scale=1, min_width=100):159            submit_btn = gr.Button("Submit", variant="primary", elem_id="special-button" )  # gr.themes.Ocean()160 161    gr.Markdown("### Quick Examples")162    gr.Examples(163        examples=PRESET_EXAMPLES,164        inputs=msg,165        label="Click an example → then click Submit"166    )167    # counter_display = gr.Textbox(label="Request Counter:", value=0, interactive=False)168    # submit_btn.click(fn=respond, inputs=[msg, chatbot, counter_state], outputs=[chatbot, msg, counter_state, counter_display])169    # msg.submit(fn=respond, inputs=[msg, chatbot, counter_state], outputs=[chatbot, msg, counter_state, counter_display])170 171 172    clear_btn = gr.Button("Clear Chat", elem_id="clear-chat-btn")173    clear_btn.click(lambda: ([], ""), outputs=[chatbot, msg])174    gr.Markdown("## 🚀 Space Request Tracker")175    # gr.Textbox(value=str(global_counter), interactive=False)176    counter_display = gr.Number(value=global_counter, label="Global Counter")177 178    submit_btn.click(fn=respond, inputs=[msg, chatbot], outputs=[chatbot, msg, counter_display]).then(179        fn=increment_counter, 180        inputs=[], 181        outputs=counter_display182    )183    msg.submit(fn=respond, inputs=[msg, chatbot], outputs=[chatbot, msg, counter_display])184    # Display counter (optional)185 186    # CRITICAL: This triggers every time the page loads or refreshes!187    # demo.load(fn=get_latest_counter, inputs=[], outputs=counter_display)188    demo.load(fn=lambda: global_counter, inputs=[], outputs=counter_display)189    190 191if __name__ == "__main__":192    print("Gradio version:", gr.__version__)193    demo.launch(css=custom_css)194 195