Repository navigation
Tibetan Translator Comparison
TenzinGayche edited this page Dec 17, 2025
·
1 revision
This page documents the key differences between tibetan_translator (v1) and tibetan_translator_v2.
| Aspect | tibetan_translator (v1) | tibetan_translator_v2 |
|---|---|---|
| Input Processing | 3 Commentary Translators | UCCA + Word-by-Word + Summary |
| Input Source | Raw Tibetan commentaries | Pre-processed semantic data |
| Philosophy | Commentary-driven translation | Semantic-analysis-driven translation |
| Dependencies | Standalone | Depends on ucca_generator, word_by_word_generator
|
| Extra Files | Has llm_provider.py
|
Missing llm_provider.py
|
| Best Use Case | Traditional scholarly texts with commentaries | Detailed linguistic analysis needed |
βββββββββββββββββββββββββββββββ
β START β
βββββββββββββββ¬ββββββββββββββββ
β
βββββββββββββββββββββΌββββββββββββββββββββ
β β β
βΌ βΌ βΌ
βββββββββββββββββββββββ βββββββββββββββββββββββ βββββββββββββββββββββββ
β commentary_ β β commentary_ β β commentary_ β
β translator_1 β β translator_2 β β translator_3 β
β β β β β β
β Translates β β Translates β β Translates β
β Commentary 1 β β Commentary 2 β β Commentary 3 β
βββββββββββ¬ββββββββββββ βββββββββββ¬ββββββββββββ βββββββββββ¬ββββββββββββ
β β β
βββββββββββββββββββββββββΌββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββ
β aggregator β
β β
β Combines translated β
β commentaries using LLM β
βββββββββββββββ¬ββββββββββββββββ
β
βΌ
(continues to translation)
βββββββββββββββββββββββββββββββ
β START β
βββββββββββββββ¬ββββββββββββββββ
β
βββββββββββββββββββββΌββββββββββββββββββββ
β β β
βΌ βΌ βΌ
βββββββββββββββββββββββ βββββββββββββββββββββββ βββββββββββββββββββββββ
β process_ucca β β process_word_by_ β β process_multilevel_ β
β β β word β β summary β
β Loads UCCA graph β β β β β
β analysis from state β β Loads word-by-word β β Loads multi-level β
β β β translation β β summary β
βββββββββββ¬ββββββββββββ βββββββββββ¬ββββββββββββ βββββββββββ¬ββββββββββββ
β β β
βββββββββββββββββββββββββΌββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββ
β aggregator β
β β
β Combines UCCA + word-by- β
β word + summary using LLM β
βββββββββββββββ¬ββββββββββββββββ
β
βΌ
(continues to translation)
# From tibetan_translator/processors/commentary.py
def commentary_translator_1(state: State):
"""Translate first commentary with expertise focus."""
if not state['commentary1']:
return {"commentary1": None, "commentary1_translation": None}
prompt = get_commentary_translation_prompt(
state['sanskrit'],
state['source'],
state['commentary1'],
language=state.get('language', 'English')
)
return {"commentary1": state['commentary1'],
"commentary1_translation": state['commentary1']}
def commentary_translator_2(state: State):
"""Translate second commentary with philosophical focus."""
# Similar structure...
def commentary_translator_3(state: State):
"""Translate third commentary with traditional focus."""
# Similar structure...# From tibetan_translator_v2/processors/commentary.py
def process_ucca(state: State):
"""Loads the UCCA data into the state for the aggregator."""
return {"ucca": state.get("ucca", "")}
def process_word_by_word(state: State):
"""Loads the word-by-word translation into the state for the aggregator."""
return {"word_by_word": state.get("word_by_word", "")}
def process_multilevel_summary(state: State):
"""Loads the multi-level summary into the state for the aggregator."""
return {"multilevel_summary": state.get("multilevel_summary", "")}def aggregator(state: State):
"""Combine commentaries based on availability."""
# Check which commentaries exist
has_commentary1 = state.get('commentary1_translation') not in [None, "", "None"]
has_commentary2 = state.get('commentary2_translation') not in [None, "", "None"]
has_commentary3 = state.get('commentary3_translation') not in [None, "", "None"]
commentary_count = sum([has_commentary1, has_commentary2, has_commentary3])
# If no commentaries, create source analysis
if commentary_count == 0:
source_analysis = create_source_analysis(state['source'], ...)
return {"combined_commentary": source_analysis, "commentary_source": "source_analysis"}
# If one commentary, use it directly
if commentary_count == 1:
if has_commentary1:
return {"combined_commentary": state['commentary1_translation']}
# ...
# If multiple, combine them
combined = ""
if has_commentary1:
combined += f"Commentary 1:\n{state['commentary1_translation']}\n\n"
if has_commentary2:
combined += f"Commentary 2:\n{state['commentary2_translation']}\n\n"
if has_commentary3:
combined += f"Commentary 3:\n{state['commentary3_translation']}\n\n"
# Use LLM to create unified commentary
prompt_messages = get_combined_commentary_prompt(...)
response = llm_thinking.invoke(prompt_messages)
return {"combined_commentary": commentary_content}def aggregator(state: State):
"""Combine UCCA, word-by-word, and summary into a new commentary."""
# Combine the new inputs into a single string
combined_inputs = (
f"UCCA Analysis:\n{state.get('ucca', 'Not available.')}\n\n"
f"Word-by-Word Translation:\n{state.get('word_by_word', 'Not available.')}\n\n"
f"Multi-Level Summary:\n{state.get('multilevel_summary', 'Not available.')}\n\n"
)
# Use LLM to create combined commentary from semantic analysis
prompt_messages = get_combined_commentary_prompt(
source_text=state['source'],
commentaries=combined_inputs,
has_commentaries=True,
language=state.get('language', 'English')
)
response = llm_thinking.invoke(prompt_messages)
return {"combined_commentary": commentary_content}class State(TypedDict):
translation: List[str]
commentary1_translation: str # β
Used in workflow
commentary2_translation: str # β
Used in workflow
commentary3_translation: str # β
Used in workflow
source: str
sanskrit: str
language: str
feedback_history: List[str]
format_feedback_history: List[str]
commentary1: str # β
Input commentary
commentary2: str # β
Input commentary
commentary3: str # β
Input commentary
combined_commentary: str
commentary_source: str # "traditional" or "source_analysis"
key_points: List[KeyPoint]
plaintext_translation: str
itteration: int
format_iteration: int
formated: bool
glossary: List[GlossaryEntry]class State(TypedDict):
translation: List[str]
commentary1_translation: str # Present but not used in workflow
commentary2_translation: str # Present but not used in workflow
commentary3_translation: str # Present but not used in workflow
source: str
sanskrit: str
language: str
feedback_history: List[str]
format_feedback_history: List[str]
commentary1: str # Present but not used in workflow
commentary2: str # Present but not used in workflow
commentary3: str # Present but not used in workflow
combined_commentary: str
key_points: List[KeyPoint]
plaintext_translation: str
itteration: int
format_iteration: int
formated: bool
glossary: List[GlossaryEntry]
# V2 Additional Fields:
ucca: str # β
NEW: UCCA graph analysis
word_by_word: str # β
NEW: Word-by-word translation
multilevel_summary: str # β
NEW: Multi-level summary# tibetan_translator/workflow.py
optimizer_builder.add_node("commentary_translator_1", commentary_translator_1)
optimizer_builder.add_node("commentary_translator_2", commentary_translator_2)
optimizer_builder.add_node("commentary_translator_3", commentary_translator_3)
optimizer_builder.add_node("aggregator", aggregator)
optimizer_builder.add_node("translation_generator", translation_generator)
optimizer_builder.add_node("llm_call_evaluator", llm_call_evaluator)
optimizer_builder.add_node("generate_glossary", generate_glossary)
# Edges
optimizer_builder.add_edge(START, "commentary_translator_1")
optimizer_builder.add_edge(START, "commentary_translator_2")
optimizer_builder.add_edge(START, "commentary_translator_3")
optimizer_builder.add_edge("commentary_translator_1", "aggregator")
optimizer_builder.add_edge("commentary_translator_2", "aggregator")
optimizer_builder.add_edge("commentary_translator_3", "aggregator")# tibetan_translator_v2/workflow.py
optimizer_builder.add_node("process_ucca", process_ucca)
optimizer_builder.add_node("process_word_by_word", process_word_by_word)
optimizer_builder.add_node("process_multilevel_summary", process_multilevel_summary)
optimizer_builder.add_node("aggregator", aggregator)
optimizer_builder.add_node("translation_generator", translation_generator)
optimizer_builder.add_node("llm_call_evaluator", llm_call_evaluator)
optimizer_builder.add_node("generate_glossary", generate_glossary)
# Edges
optimizer_builder.add_edge(START, "process_ucca")
optimizer_builder.add_edge(START, "process_word_by_word")
optimizer_builder.add_edge(START, "process_multilevel_summary")
optimizer_builder.add_edge("process_ucca", "aggregator")
optimizer_builder.add_edge("process_word_by_word", "aggregator")
optimizer_builder.add_edge("process_multilevel_summary", "aggregator")- β You have traditional scholarly commentaries
- β Working with texts that have established commentary traditions
- β Need a standalone translation pipeline
- β Commentary interpretation is critical to translation accuracy
- β Quick setup without pre-processing requirements
- β You have pre-generated UCCA semantic graphs
- β Word-by-word translations are available
- β Multi-level summaries have been prepared
- β Need fine-grained semantic analysis
- β Working with texts that lack traditional commentaries
- β Building a full semantic pipeline with ucca_generator
Raw Tibetan Text + 3 Commentaries
β
βΌ
[Translate each commentary]
β
βΌ
[Combine into unified commentary]
β
βΌ
[Generate translation using commentary]
β
βΌ
[Evaluate and refine]
β
βΌ
Final Translation + Glossary
Raw Tibetan Text + UCCA + Word-by-Word + Summary
β
βΌ
[Load pre-processed semantic data]
β
βΌ
[Combine into unified analysis]
β
βΌ
[Generate translation using semantic analysis]
β
βΌ
[Evaluate and refine]
β
βΌ
Final Translation + Glossary
- Tibetan-Translator-V1 - V1 detailed documentation
- Tibetan-Translator-V2 - V2 detailed documentation
- UCCA-Generator-Overview - UCCA graph generation (used by V2)
- Translator-Prompts - Prompt templates