test
commit
20dc456
import json
import os
from datetime import datetime
from pathlib import Path
import gradio as gr
# Define available terms
AVAILABLE_TERMS = ["བྱང་ཆུབ་སེམས་", "ཆོས་", "དགེ་བ་", "སངས་རྒྱས་", "སྡིག་པ་", "སྡིག་པ་"]
def load_context(term: str) -> str:
"""Load context from JSON file for the given term"""
try:
context_path = Path(__file__) / "terms_context" / f"{term}.json"
return json.load(context_path.open("r"))
except Exception as e:
return f"Error loading context: {str(e)}"
def process_term(tibetan_term: str, api_key: str) -> dict:
"""Process a Buddhist term and return analysis results"""
if not api_key:
return {"error": "Please provide an Anthropic API key"}
# Set the API key for the session
os.environ["ANTHROPIC_API_KEY"] = api_key
context = load_context(tibetan_term)
try:
from term_standarization import TermStandardizationAgent
agent = TermStandardizationAgent()
results = agent.select_best_terms(tibetan_term, context)
# Save results
date_time = datetime.now().strftime("%Y%m%d%H%M%S")
results_path = Path("results")
results_path.mkdir(exist_ok=True, parents=True)
result_fn = results_path / f"{tibetan_term}_{date_time}.json"
json.dump(results, result_fn.open("w", encoding='utf-8'), indent=2, ensure_ascii=False)
return results
except Exception as e:
return {"error": str(e)}
finally:
# Clear the API key from environment after use
os.environ.pop("ANTHROPIC_API_KEY", None)
def format_semantic_analysis(results: dict) -> str:
"""Format just the semantic analysis section"""
output = []
# Source Data section
output.append("## Data Sources Used in Analysis")
output.append("\nThis analysis is based on:")
output.append("\n- Sanskrit parallel text")
output.append("\n- Traditional Tibetan commentaries")
output.append("\n- Existing English translations")
# Sanskrit analysis
output.append("## Sanskrit Analysis")
sanskrit = results["analysis"]["sanskrit_analysis"]
output.append(f"\n**Term:**")
output.append(f"{sanskrit['term']}")
output.append(f"\n**Morphology:**")
output.append(f"{sanskrit['morphology']}")
output.append(f"\n**Literal Meaning:**")
output.append(f"{sanskrit['literal_meaning']}")
output.append(f"\n**Technical Usage:**")
output.append(f"{sanskrit['technical_usage']}")
# Tibetan mapping
output.append("\n## Tibetan Mapping")
tibetan = results["analysis"]["tibetan_mapping"]
output.append(f"\n**Term:**")
output.append(f"{tibetan['term']}")
output.append(f"\n**Morphology:**")
output.append(f"{tibetan['morphology']}")
output.append(f"\n**Translation Strategy:**")
output.append(f"{tibetan['translation_strategy']}")
output.append(f"\n**Semantic Extension:**")
output.append(f"{tibetan['semantic_extension']}")
# Commentary insights
output.append("\n## Commentary Insights")
for commentary in results["analysis"]["commentary_insights"]:
output.append(f"\n**Source:**")
output.append(commentary['source'])
output.append("\n**Explanation:**")
output.append(commentary['explanation'])
output.append("\n**Technical Points:**")
for point in commentary['technical_points']:
output.append(f"- {point}")
return "\n".join(output)
def format_results(results: dict) -> tuple:
"""Format the results for display, returning separate sections"""
if "error" in results:
return f"Error: {results['error']}", ""
recommendations = []
evaluations = []
# Add recommendations
recommendations.append("# Recommended Translations")
for audience, details in results["recommendations"].items():
recommendations.append(f"\n## {audience}")
recommendations.append("**Term:**")
recommendations.append(details['term'])
recommendations.append("\n**Reasoning:**")
recommendations.append(details['reasoning'])
# Evaluation scores
evaluations.append("# Evaluation Scores")
# Create table header with more spacing
evaluations.append("\n| Term      | Technical Score      | Cultural Score      | Audience Score      | Reasoning      |")
evaluations.append("|------------|------------------|-----------------|-----------------|-------------|")
# Add table rows with spacing
for term, scores in results["evaluations"].items():
term_padded = f"{term}     "
tech_padded = f"{scores['technical_score']}     "
cultural_padded = f"{scores['cultural_score']}     "
audience_padded = f"{scores['audience_score']}     "
reasoning_padded = f"{scores['reasoning']}     "
evaluations.append(f"| {term_padded} | {tech_padded} | {cultural_padded} | {audience_padded} | {reasoning_padded} |")
return (
"\n".join(recommendations),
format_semantic_analysis(results),
"\n".join(evaluations)
)
# Create the Gradio interface
with gr.Blocks(title="Buddhist Term Analyzer") as demo:
gr.Markdown("# Buddhist Term Analyzer Agent")
gr.Markdown("Select a Tibetan Buddhist term to analyze its standardized translations and get detailed analysis.")
gr.Markdown("""
## Data Sources Used in Analysis
This analysis is based on:
- Sanskrit parallel text
- Traditional Tibetan commentaries
- Existing English translations
""")
with gr.Row():
with gr.Column():
api_key = gr.Textbox(
label="Anthropic API Key",
placeholder="Enter your Anthropic API key",
type="password"
)
tibetan_input = gr.Dropdown(
choices=AVAILABLE_TERMS,
label="Select Tibetan Term",
value=AVAILABLE_TERMS[0] if AVAILABLE_TERMS else None
)
analyze_button = gr.Button("Analyze Term")
with gr.Column():
recommendations_output = gr.Markdown(label="Recommendations", visible=False)
semantic_analysis_box = gr.Accordion("Semantic Analysis", open=False, visible=False)
with semantic_analysis_box:
semantic_analysis_output = gr.Markdown(label="Semantic Analysis")
evaluations_output = gr.Markdown(label="Evaluations", visible=False)
# Add loading configuration
with gr.Row():
with gr.Column(scale=1):
status_text = gr.Markdown(
"Ready",
elem_classes="status-text"
)
# Add custom CSS for status text
gr.Markdown("""
<style>
.status-text {
min-height: 50px;
font-size: 1.2em;
margin: 15px 0;
padding: 10px;
background-color: #f6f6f6;
border-radius: 8px;
text-align: center;
}
</style>
""")
def process_with_status(term, key):
try:
status_text.value = "**Analysis in progress...**"
results = process_term(term, key)
recommendations, semantic_analysis, evaluations = format_results(results)
status_text.value = "**Analysis complete!**"
return [
gr.update(value=recommendations, visible=True),
gr.update(value=semantic_analysis),
gr.update(value=evaluations, visible=True),
"**Analysis complete!**",
gr.update(visible=True) # For semantic_analysis_box
]
except Exception as e:
error_msg = "**Error occurred during analysis**"
return "", "", f"Error: {str(e)}", error_msg
# Analyze when button is clicked
analyze_button.click(
fn=process_with_status,
inputs=[tibetan_input, api_key],
outputs=[
recommendations_output,
semantic_analysis_output,
evaluations_output,
status_text,
semantic_analysis_box
]
)
if __name__ == "__main__":
demo.launch()