Spaces:
Running
Running
import gradio as gr | |
import json | |
from llama_cpp import Llama | |
import os | |
from huggingface_hub import hf_hub_download | |
from config import get_model_config, get_generation_config, get_recommended_model | |
# Global variable to store the model | |
llm = None | |
def load_model(): | |
"""Load the llama.cpp model""" | |
global llm | |
try: | |
print("Loading Osmosis Structure model...") | |
# Get model info and config | |
model_info = get_recommended_model() | |
model_config = get_model_config() | |
# Create models directory | |
os.makedirs("./models", exist_ok=True) | |
# Download the Osmosis model | |
print(f"Downloading {model_info['name']} ({model_info['size']})...") | |
model_path = hf_hub_download( | |
repo_id=model_info['repo_id'], | |
filename=model_info['filename'], | |
cache_dir="./models", | |
resume_download=True | |
) | |
print(f"Model downloaded to: {model_path}") | |
print("Initializing llama.cpp...") | |
# Initialize llama.cpp with the downloaded model | |
llm = Llama( | |
model_path=model_path, | |
**model_config | |
) | |
print("β Osmosis Structure model loaded successfully!") | |
return f"β Model loaded: {model_info['name']}\nPath: {model_path}\nDescription: {model_info['description']}" | |
except Exception as e: | |
error_msg = f"β Error loading model: {e}" | |
print(error_msg) | |
return error_msg | |
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 "β Model not loaded. Please load the model first." | |
try: | |
# Create a structured prompt optimized for the Osmosis model | |
prompt = f"""<|system|> | |
You are a helpful assistant that converts unstructured text into well-formatted JSON. Extract key information and organize it into a logical structure. | |
<|user|> | |
Convert this text to JSON format: | |
{input_text} | |
<|assistant|> | |
```json""" | |
# Get generation config and override with user settings | |
gen_config = get_generation_config() | |
gen_config.update({ | |
"max_tokens": max_tokens, | |
"temperature": temperature | |
}) | |
# Generate response using llama.cpp | |
response = llm( | |
prompt, | |
**gen_config, | |
echo=False | |
) | |
generated_text = response['choices'][0]['text'].strip() | |
# Clean up the response - remove markdown formatting if present | |
if generated_text.startswith('```json'): | |
generated_text = generated_text[7:] | |
if generated_text.endswith('```'): | |
generated_text = generated_text[:-3] | |
generated_text = generated_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, try to clean it up or return as is | |
return f"Generated (may need cleanup):\n{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 and Osmosis Structure model") | |
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 download and initialize the Osmosis Structure model | |
2. Use "Demo (No Model)" for basic functionality without loading the AI model | |
3. The Osmosis model is optimized for structured data extraction and JSON generation | |
### Notes: | |
- Uses llama.cpp for efficient CPU inference | |
- Osmosis Structure 0.6B model (~1.2GB) will be downloaded automatically | |
- Model is specialized for converting unstructured text to structured formats | |
- Adjust max_tokens and temperature for different output styles | |
""") | |
# 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() |