Spaces:
Sleeping
Sleeping
import os | |
import tempfile | |
from pathlib import Path | |
""" | |
**Streamlit Space – minimal version (no explicit caching)** | |
Fixes the `StreamlitSetPageConfigMustBeFirstCommandError` **and** the | |
previous permission issues by: | |
1. Setting `HOME`, `HF_HOME`, and `HF_CACHE_DIR` **before** we import | |
Streamlit – that way Streamlit creates `~/.streamlit` in a writable | |
place instead of `/.streamlit`. | |
2. Moving the call to `st.set_page_config()` to be the **very first | |
Streamlit command**. | |
You can re‑add `@st.cache_resource` once everything boots. | |
""" | |
# ---------------------------------------------------------------------------- | |
# Writable environment — must be set *before* importing streamlit | |
# ---------------------------------------------------------------------------- | |
HF_TMP = tempfile.mkdtemp(prefix="hf_") # guaranteed‑writable temp dir | |
os.environ["HOME"] = HF_TMP # for ~/.streamlit | |
os.environ["HF_HOME"] = HF_TMP | |
os.environ["HF_CACHE_DIR"] = HF_TMP | |
# ---------------------------------------------------------------------------- | |
import streamlit as st | |
from llama_cpp import Llama | |
# ----- Streamlit page config (must be first Streamlit command) ------------- | |
st.set_page_config(page_title="Sanskrit Transliteration", page_icon="📜") | |
# ---------------------------------------------------------------------------- | |
# Model loader (no Streamlit cache for now) | |
# ---------------------------------------------------------------------------- | |
llm = None # global singleton | |
def get_model(): | |
global llm | |
if llm is None: | |
with st.spinner("Downloading & loading model – first run takes a bit…"): | |
llm = Llama.from_pretrained( | |
repo_id="13Aluminium/Sanskrit_transliteration_Qwen3", | |
filename="unsloth.Q4_K_M.gguf", | |
cache_dir=os.environ["HF_CACHE_DIR"], | |
) | |
return llm | |
# ---------------------------------------------------------------------------- | |
# Inference helper | |
# ---------------------------------------------------------------------------- | |
def transliterate(text: str, *, temperature: float = 0.1, max_tokens: int = 200) -> str: | |
prompt = f"""Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request. | |
### Instruction: | |
Transliterate Sanskrit Shlok to Latin | |
### Input: | |
{text} | |
### Response: | |
""" | |
model = get_model() | |
out = model(prompt, max_tokens=max_tokens, temperature=temperature, echo=False) | |
return out["choices"][0]["text"].strip() | |
# ---------------------------------------------------------------------------- | |
# UI | |
# ---------------------------------------------------------------------------- | |
st.title("📜 Sanskrit → Latin Transliteration (Qwen3)") | |
sample = ( | |
"भूरीणि भूरिकर्माणि श्रोतव्यानि विभागशः ।\n" | |
"अतः साधोऽत्र यत्सारं समुद्धृत्य मनीषया ।\n" | |
"ब्रूहि नः श्रद्दधानानां येनात्मा संप्रसीदति ॥ ११ ॥" | |
) | |
sanskrit_text = st.text_area("Sanskrit text:", value=sample, height=180) | |
temp = st.slider("Temperature", 0.0, 1.0, 0.1, 0.01) | |
max_tokens = st.number_input("Max tokens", 50, 512, 200, 1) | |
if st.button("🔤 Transliterate"): | |
if not sanskrit_text.strip(): | |
st.warning("Please enter some Sanskrit text first.") | |
else: | |
with st.spinner("Transliterating…"): | |
result = transliterate(sanskrit_text, temperature=temp, max_tokens=max_tokens) | |
st.text(result) | |
# ---------------------------------------------------------------------------- | |
# requirements.txt – keep the same: | |
# streamlit>=1.36 | |
# llama-cpp-python>=0.2.11 | |
# huggingface_hub>=0.24 | |
# ---------------------------------------------------------------------------- | |