json-structured / app.py
Dev8709's picture
Add application file
81e6a94
raw
history blame
5.58 kB
import gradio as gr
import json
from llama_cpp import Llama
import os
from huggingface_hub import hf_hub_download
# Global variable to store the model
llm = None
def load_model():
"""Load the llama.cpp model"""
global llm
try:
# You can replace this with any GGUF model from Hugging Face
# For example, using a small model for demonstration
model_name = "microsoft/DialoGPT-medium"
# For now, we'll use a local model path or download one
# This is a placeholder - you'll need to specify the actual model
print("Loading llama.cpp model...")
# Initialize with basic settings
# Note: You'll need to provide an actual GGUF model file
# llm = Llama(
# model_path="path/to/your/model.gguf",
# n_ctx=2048,
# n_threads=2,
# verbose=False
# )
print("Model loaded successfully!")
return "Model loaded successfully!"
except Exception as e:
print(f"Error loading model: {e}")
return f"Error loading model: {e}"
def text_to_json(input_text, max_tokens=512, temperature=0.7):
"""Convert plain text to structured JSON using llama.cpp"""
global llm
if llm is None:
return {"error": "Model not loaded. Please load the model first."}
try:
# Create a prompt for JSON generation
prompt = f"""Convert the following text into a structured JSON format. Extract key information and organize it logically:
Text: {input_text}
JSON:"""
# Generate response using llama.cpp
response = llm(
prompt,
max_tokens=max_tokens,
temperature=temperature,
stop=["```", "\n\n\n"],
echo=False
)
generated_text = response['choices'][0]['text'].strip()
# Try to parse as JSON to validate
try:
parsed_json = json.loads(generated_text)
return json.dumps(parsed_json, indent=2)
except json.JSONDecodeError:
# If not valid JSON, return as a structured attempt
return generated_text
except Exception as e:
return f"Error generating JSON: {str(e)}"
def demo_without_model(input_text):
"""Demo function that works without loading a model"""
try:
# Simple rule-based JSON conversion for demonstration
words = input_text.strip().split()
# Create a basic JSON structure
result = {
"input_text": input_text,
"word_count": len(words),
"words": words,
"character_count": len(input_text),
"sentences": input_text.split('.'),
"metadata": {
"processed_by": "llama.cpp demo",
"timestamp": "demo_mode"
}
}
return json.dumps(result, indent=2)
except Exception as e:
return f"Error processing text: {str(e)}"
# Create Gradio interface
with gr.Blocks(title="Plain Text to JSON with llama.cpp") as demo:
gr.Markdown("# Plain Text to JSON Converter")
gr.Markdown("Convert plain text into structured JSON format using llama.cpp")
with gr.Tab("Text to JSON"):
with gr.Row():
with gr.Column():
input_text = gr.Textbox(
label="Input Text",
placeholder="Enter your text here...",
lines=5
)
with gr.Row():
max_tokens = gr.Slider(
minimum=50,
maximum=1000,
value=512,
label="Max Tokens"
)
temperature = gr.Slider(
minimum=0.1,
maximum=1.0,
value=0.7,
label="Temperature"
)
convert_btn = gr.Button("Convert to JSON", variant="primary")
demo_btn = gr.Button("Demo (No Model)", variant="secondary")
with gr.Column():
output_json = gr.Textbox(
label="Generated JSON",
lines=10,
interactive=False
)
with gr.Tab("Model Management"):
load_btn = gr.Button("Load Model", variant="primary")
model_status = gr.Textbox(
label="Model Status",
value="Model not loaded",
interactive=False
)
gr.Markdown("""
### Instructions:
1. Click "Load Model" to initialize llama.cpp (requires a GGUF model file)
2. Use "Demo (No Model)" for basic functionality without loading a model
3. For full functionality, you need to provide a GGUF model file
### Notes:
- This space uses llama.cpp for efficient CPU inference
- Models should be in GGUF format
- Adjust max_tokens and temperature for different outputs
""")
# Event handlers
convert_btn.click(
fn=text_to_json,
inputs=[input_text, max_tokens, temperature],
outputs=output_json
)
demo_btn.click(
fn=demo_without_model,
inputs=input_text,
outputs=output_json
)
load_btn.click(
fn=load_model,
outputs=model_status
)
if __name__ == "__main__":
demo.launch()