"""Logica Mind — Memory Playground (Hugging Face Space). Paste any message and watch the memory engine "think": detect the language, extract atomic facts, and tag each with an open category + a life/work dimension. Works offline (heuristic); paste an OpenAI key to see full LLM fact extraction. """ import gradio as gr from logica_mind.extract.lang import detect_language from logica_mind.extract import LLMExtractor from logica_mind.extract.heuristic import HeuristicExtractor from logica_mind.extract.taxonomy import DIMENSIONS _DIM_LABEL = {d["id"]: d["label"] for d in DIMENSIONS} _DIM_GROUP = {d["id"]: d.get("group", "personal") for d in DIMENSIONS} _GROUP_EMOJI = {"personal": "🧑", "project": "🧩", "organization": "🏢", "business": "💰"} EXAMPLES = [ ["I'm a Scorpio who loves flat whites; we just hit $45k MRR and the launch is blocked on a payments bug."], ["Acabei de fechar um contrato gigante com a prefeitura de Fortaleza e vou comemorar tomando um açaí na praia."], ["Ich arbeite in einem Berliner Fintech-Startup und treffe mich freitags mit Priya, unserer Designerin."], ["私は東京に住んでいて、長寿研究のためにUFCと提携しました。"], ] def _fact_rows(facts): rows = [] for f in facts: dim = f.dimension or "" label = _DIM_LABEL.get(dim, dim or "—") emoji = _GROUP_EMOJI.get(_DIM_GROUP.get(dim, ""), "•") rows.append([f.content, f.category or "—", f"{emoji} {label}"]) return rows def run(text, openai_key): text = (text or "").strip() if not text: return "Paste a message above.", [] lang = detect_language(text) lang_line = f"**Detected language:** {lang}" if lang else "**Detected language:** _model will infer it_" mode = "🔬 Heuristic (offline, no key)" facts = [] if openai_key and openai_key.strip(): try: from logica_mind.llm import OpenAILLM ext = LLMExtractor(llm=OpenAILLM(api_key=openai_key.strip())) facts = ext.extract(text, []) mode = "🤖 LLM extraction (gpt-4o-mini)" except Exception as e: return f"{lang_line}\n\n⚠️ OpenAI error: {e}", [] else: facts = HeuristicExtractor().extract(text, []) header = f"{lang_line} · **Mode:** {mode} · **{len(facts)} fact(s)**" return header, _fact_rows(facts) with gr.Blocks(title="Logica Mind — Memory Playground", theme=gr.themes.Soft()) as demo: gr.Markdown( "# 🧠 Logica Mind — Memory Playground\n" "Paste any message and watch the open-source memory engine **think**: it detects the " "language, extracts atomic facts, and tags each with a category and a life/work " "**dimension** (34-dimension taxonomy). Works in **any language**.\n\n" "Offline by default (heuristic). Paste your own OpenAI key to see full LLM extraction — " "the key is used only for this call and never stored.\n\n" "⭐ [GitHub](https://github.com/Rovemark/logica-mind) · " "🖥️ [Live dashboard](https://huggingface.co/spaces/rovemark/logica-mind-demo) · " "`pip install logica-mind`" ) inp = gr.Textbox(label="Your message", lines=3, placeholder="Type in any language…") key = gr.Textbox(label="OpenAI API key (optional — for full LLM extraction)", type="password", placeholder="sk-…") btn = gr.Button("🧠 Extract memory", variant="primary") out_md = gr.Markdown() out_tbl = gr.Dataframe(headers=["Fact", "Category", "Dimension"], label="Extracted facts", wrap=True) btn.click(run, [inp, key], [out_md, out_tbl]) inp.submit(run, [inp, key], [out_md, out_tbl]) gr.Examples(EXAMPLES, inputs=inp) if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860)