"""DaRi — EN↔KO Technical Translation API | 다리(bridge) between languages""" import gradio as gr import requests API_URL = "http://168.107.54.158:8000" API_KEY = "kt_b22b7beb939da8b0e963679413b5b663" HEADERS = {"X-API-Key": API_KEY, "Content-Type": "application/json"} def translate(text, direction): src = "en" if direction == "EN → KO" else "ko" tgt = "ko" if direction == "EN → KO" else "en" try: r = requests.post(f"{API_URL}/v1/translate", json={ "text": text, "source_lang": src, "target_lang": tgt, "use_tm": True }, headers=HEADERS, timeout=15) data = r.json() translation = data.get("translation") or "" suggestions = data.get("tm_suggestions", []) tm_text = "" for s in suggestions[:3]: sim = s.get("similarity", 0) tm_text += f"**[{sim:.0%}]** {s['source']}\n→ {s['target']}\n\n" if not translation and tm_text: translation = suggestions[0]["target"] if suggestions else "매칭 없음" return translation or "매칭 없음 (MT 모델 준비 중)", tm_text or "매칭 없음" except Exception as e: return f"오류: {e}", "" def glossary(term): try: r = requests.get(f"{API_URL}/v1/glossary", params={"term": term}, headers=HEADERS, timeout=10) results = r.json().get("results", []) if not results: return "결과 없음" return "\n".join(f"**{g['source']}** → {g['target']} `{g.get('domain','')}`" for g in results[:10]) except Exception as e: return f"오류: {e}" def quality(source, translation): try: r = requests.post(f"{API_URL}/v1/quality", json={ "source": source, "translation": translation }, headers=HEADERS, timeout=5) m = r.json().get("metrics", {}) score = m.get("quality_score", "N/A") emoji = "🟢" if score == 1 else "🟡" if score >= 0.7 else "🔴" return f"""{emoji} **품질 점수**: {score} 📏 **길이 비율**: {m.get('length_ratio', 'N/A')} 🔍 **빈 번역**: {'예 ⚠️' if m.get('empty') else '아니오 ✅'} 📋 **소스 복사**: {'감지 ⚠️' if m.get('copy_detected') else '정상 ✅'}""" except Exception as e: return f"오류: {e}" def get_api_key(email, name): try: r = requests.post(f"{API_URL}/v1/auth/token", json={"email": email, "name": name}, timeout=5) data = r.json() key = data.get("api_key", "") return f"""✅ **API Key**: `{key}` **사용법**: ```bash curl -X POST {API_URL}/v1/translate \\ -H "X-API-Key: {key}" \\ -H "Content-Type: application/json" \\ -d '{{"text":"patent application","source_lang":"en","target_lang":"ko"}}' ``` 무료 플랜: 월 50,000자 | [API 문서]({API_URL}/docs)""" except Exception as e: return f"오류: {e}" CSS = """ .gradio-container {max-width: 960px !important} h1 {background: linear-gradient(90deg, #00d2ff, #3a7bd5); -webkit-background-clip: text; -webkit-text-fill-color: transparent} """ with gr.Blocks(title="DaRi — EN↔KO Translation API", theme=gr.themes.Soft(), css=CSS) as demo: gr.Markdown(""" # DaRi — 다리 ### EN↔KO Technical Translation API **62.9M** parallel pairs · **844K** glossary terms · Patent · Medical · IT · Legal · ESG """) with gr.Tab("🔤 번역"): direction = gr.Radio(["EN → KO", "KO → EN"], value="EN → KO", label="방향") input_text = gr.Textbox(label="입력", lines=3, placeholder="The device shall comply with FDA regulations.") translate_btn = gr.Button("번역", variant="primary") output_text = gr.Textbox(label="결과", lines=3) tm_output = gr.Markdown(label="Translation Memory 매칭") translate_btn.click(translate, [input_text, direction], [output_text, tm_output]) with gr.Tab("📖 용어집"): term_input = gr.Textbox(label="검색어", placeholder="patent, surgery, device...") term_btn = gr.Button("검색", variant="primary") term_output = gr.Markdown() term_btn.click(glossary, term_input, term_output) with gr.Tab("✅ 품질 평가"): with gr.Row(): qa_source = gr.Textbox(label="원문", lines=2, placeholder="medical device") qa_trans = gr.Textbox(label="번역", lines=2, placeholder="의료기기") qa_btn = gr.Button("평가", variant="primary") qa_output = gr.Markdown() qa_btn.click(quality, [qa_source, qa_trans], qa_output) with gr.Tab("🔑 API Key"): gr.Markdown("무료 API 키를 발급받으세요. 월 50,000자까지 무료입니다.") with gr.Row(): key_email = gr.Textbox(label="이메일") key_name = gr.Textbox(label="이름") key_btn = gr.Button("발급", variant="primary") key_output = gr.Markdown() key_btn.click(get_api_key, [key_email, key_name], key_output) gr.Markdown(f""" --- **DaRi** © 2026 | [API Docs]({API_URL}/docs) | [Contact](mailto:dogdoh1338@icloud.com) *DaRi(다리) = Bridge between EN↔KO. Powered by 63M parallel corpus.* """) demo.launch()