# -*- coding: utf-8 -*- """app.py Automatically generated by Colab. Original file is located at https://colab.research.google.com/drive/1zVrT1lKxARrm_wPS9sX-L8z5K4cxaAXm """ import gradio as gr import yaml, json, requests import os # Call Mistral-7B via OpenRouter def call_mistral_openrouter(prompt): headers = { "Authorization": f"Bearer {os.getenv('OpenRouter_Secret_Key')}", "Content-Type": "application/json" } data = { "model": "mistralai/mistral-7b-instruct:free", "messages": [ {"role": "system", "content": "You are a helpful technical writer."}, {"role": "user", "content": prompt} ] } res = requests.post("https://openrouter.ai/api/v1/chat/completions", headers=headers, json=data) try: return res.json()["choices"][0]["message"]["content"].strip() except Exception as e: return f"⚠️ LLM Error: {e}\nFull response: {res.text}" # Prompt builder def format_prompt(spec: dict, format_type: str, style: str) -> str: prompt_lines = [style.strip() + "\n\n"] if format_type.lower() == "openapi": seen = set() paths = spec.get("paths", {}) for path, methods in paths.items(): for method, meta in methods.items(): key = (path, method) if key in seen: continue seen.add(key) line = f"Endpoint `{path}` supports `{method.upper()}` requests.\n" summary = meta.get("summary", "") if summary: line += f"Purpose: {summary}\n" for p in meta.get("parameters", []): pname = p.get("name", "unknown") ploc = p.get("in", "unknown") ptype = p.get("schema", {}).get("type", "unknown") line += f"- Parameter `{pname}` in `{ploc}` of type `{ptype}`\n" for code, resp in meta.get("responses", {}).items(): desc = resp.get("description", "") line += f"- Returns `{code}`: {desc}\n" prompt_lines.append(line + "\n") elif format_type.lower() == "terraform": resources = spec.get("resource", {}) for rtype, rblocks in resources.items(): for name, config in rblocks.items(): line = f"Terraform resource `{rtype}.{name}` has configuration:\n" for k, v in config.items(): line += f"- {k}: {v}\n" prompt_lines.append(line + "\n") elif format_type.lower() == "kubernetes": kind = spec.get("kind", "Unknown") metadata = spec.get("metadata", {}) name = metadata.get("name", "Unnamed") spec_section = spec.get("spec", {}) line = f"Kubernetes `{kind}` named `{name}` includes:\n" for k, v in spec_section.items(): v_fmt = json.dumps(v) if isinstance(v, (list, dict)) else str(v) line += f"- {k}: {v_fmt}\n" prompt_lines.append(line + "\n") elif format_type.lower() in {"cicd", "ci/cd", "github-actions", "github"}: jobs = spec.get("jobs", {}) for job_name, job_config in jobs.items(): line = f"CI/CD Job `{job_name}` consists of:\n" steps = job_config.get("steps", []) for step in steps: if "name" in step: line += f"- Step: {step['name']}\n" if "uses" in step: line += f" Uses: {step['uses']}\n" if "run" in step: line += f" Run: {step['run']}\n" prompt_lines.append(line + "\n") return "".join(prompt_lines) # End-to-end summarization def summarize_spec(format_type, raw_text, url, file, eli5): style = ( "You are a technical writer. Explain like I'm 5. " if eli5 else "You are a technical writer. " ) style += f"Summarize the following {format_type.upper()} spec in clear, developer-friendly language. Use full sentences. Combine related endpoints where appropriate." try: if file: content = file.read() spec = yaml.safe_load(content) elif url: response = requests.get(url) spec = response.json() if url.endswith(".json") else yaml.safe_load(response.text) elif raw_text: spec = yaml.safe_load(raw_text) else: return "⚠️ No input provided." except Exception as e: return f"⚠️ Parsing error: {e}" try: prompt = format_prompt(spec, format_type, style) result = call_mistral_openrouter(prompt) return result except Exception as e: return f"⚠️ Inference error: {e}" # Gradio UI with gr.Blocks() as demo: gr.Markdown("## 📄 YAML/JSON Explainer — Mistral-7B via OpenRouter") format_dropdown = gr.Dropdown(choices=["openapi", "terraform", "kubernetes", "cicd"], value="openapi", label="Select Spec Format") raw_input = gr.Textbox(lines=10, placeholder="Paste YAML/JSON here...", label="Raw Spec") eli5_toggle = gr.Checkbox(label="Explain like I'm 5", value=False) file_input = gr.File(file_types=[".yaml", ".yml", ".json"], label="Upload File") url_input = gr.Textbox(placeholder="https://example.com/spec.yaml", label="OR enter a URL") submit_btn = gr.Button("Generate Summary") output = gr.TextArea(label="Natural Language Explanation", lines=12) submit_btn.click( summarize_spec, inputs=[format_dropdown, raw_input, url_input, file_input, eli5_toggle], outputs=output ) demo.launch(share=True)