import gradio as gr import time def calculate_price(payment_mode, tokens, plan, custom_price, file): if payment_mode == "Pay as you go": price = round(tokens * 0.01, 2) # Example: $0.01 per token return f"{tokens:,} tokens\nPrice: ${price:.2f}", price elif payment_mode == "Plan": if plan == "Free": return "0 tokens\nPrice: $0", 0 elif plan == "Starter": return "100,000 tokens\nPrice: $15", 15 elif plan == "Pro": return "500,000 tokens\nPrice: $30", 30 elif plan == "Custom": return f"Custom plan\nPrice: ${custom_price}", float(custom_price or 0) elif file is not None: # Simulate token count from file size tokens = 1000 # Replace it with real calculation price = round(tokens * 0.01, 2) return f"{tokens:,} tokens\nPrice: ${price:.2f}", price return "", 0 def generate_dataset(*args, **kwargs): for i in range(5): yield f"Generating... ({(i+1)*20}%)", None, (i+1)/5 time.sleep(0.3) yield "Ready! Please pay to download.", "dataset.jsonl", 1.0 with gr.Blocks( title="Nexa Data Studio", css=""" body, .gradio-container { min-height: 100vh; background: #111 !important; color: #fff !important; } .gradio-container { max-width: 900px !important; margin: 40px auto !important; box-shadow: 0 2px 16px #0008; border-radius: 16px; padding: 32px 32px 24px 32px !important; background: #111 !important; color: #fff !important; display: flex; flex-direction: column; align-items: center; } .footer {margin-top: 2em; color: #bbb; font-size: 0.9em; text-align: center;} #header {text-align: center;} """ ) as demo: gr.Markdown( """
Generate or label scientific datasets for ML research.
""", elem_id="header" ) payment_mode = gr.Radio( ["Pay as you go", "Plan"], label="Payment Mode", value="Pay as you go" ) with gr.Row() as payg_row: tokens = gr.Slider(100, 100000, value=1000, step=100, label="Tokens Requested") with gr.Row(visible=False) as plan_row: plan = gr.Dropdown( ["Free", "Starter", "Pro", "Custom"], label="Plan", value="Free" ) custom_price = gr.Number(label="Custom Price ($)", visible=False) job_type = gr.Radio( ["Generate Dataset", "Label Uploaded Data"], label="Job Type", value="Generate Dataset" ) with gr.Column(visible=False) as label_col: file = gr.File(label="Upload Dataset (.txt or .jsonl)") price_info = gr.Textbox(label="Summary", interactive=False) download = gr.File(label="Download") progress = gr.Slider(0, 1, value=0, step=0.01, label="Progress", interactive=False) status = gr.Text(label="Status", interactive=False) def update_payment_ui(payment_mode_val, plan_val): return ( gr.update(visible=payment_mode_val == "Pay as you go"), gr.update(visible=payment_mode_val == "Plan"), gr.update(visible=payment_mode_val == "Plan" and plan_val == "Custom") ) payment_mode.change( update_payment_ui, inputs=[payment_mode, plan], outputs=[payg_row, plan_row, custom_price] ) plan.change( lambda p: gr.update(visible=p == "Custom"), inputs=plan, outputs=custom_price ) def update_label_ui(job_type_val): return gr.update(visible=job_type_val == "Label Uploaded Data") job_type.change(update_label_ui, inputs=job_type, outputs=label_col) def update_summary(payment_mode, tokens, plan, custom_price, file, job_type): if job_type == "Label Uploaded Data" and file is not None: return calculate_price("Label", tokens, plan, custom_price, file)[0] return calculate_price(payment_mode, tokens, plan, custom_price, file)[0] inputs = [payment_mode, tokens, plan, custom_price, file, job_type] gr.Button("Generate", elem_id="generate-btn", variant="primary").click( generate_dataset, inputs=inputs, outputs=[status, download, progress] ) gr.Button("Update Summary").click( update_summary, inputs=inputs, outputs=price_info ) gr.Markdown( f""" """ ) if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860, show_error=True) print("Nexa Data Studio is running at http://localhost:7860")