File size: 5,808 Bytes
22d9697
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
import os
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import json  
import openai
from langsmith.wrappers import wrap_openai
from langsmith import traceable
from langchain import hub
import re

load_dotenv()

# --------------------------------------------------
# Utility Functions
# --------------------------------------------------

client = wrap_openai(openai.OpenAI())

chatModel_json = ChatOpenAI(
    model="gpt-4o",
    model_kwargs={"response_format": {"type": "json_object"}},
)

chatModel_no_json = ChatOpenAI(
    model="gpt-4o"
)

async def parse_json_with_retries(json_string, max_attempts=3):
    for attempt in range(max_attempts):
        try:
            return json.loads(json_string)
        except json.JSONDecodeError as error:
            if attempt == max_attempts - 1:
                raise error

@traceable
async def invoke_agent(runnable, params):
    content = runnable.invoke(params)
    if hasattr(content, 'content'):
        content = content.content
    return content

# --------------------------------------------------
# Translation Function
# --------------------------------------------------

@traceable
async def translate_text(text, target_language):
    
    try:
        first_prompt = hub.pull("getgloby/agent-1-get-info")
        print("First prompt pulled successfully.")
    except Exception as e:
        print(f"Error al obtener el primer agente: {e}")
        return

    first_runnable = first_prompt | chatModel_no_json

    try:
        first_agent_output = await invoke_agent(first_runnable, {
            "originalText": text,
            "targetLanguage": target_language,
        })
        print(f"First agent output: {first_agent_output}")
    except Exception as e:
        print(f"Error invoking first agent: {e}")
        print(f"Error details: {e}")
        return

    translations = []

    for i in range(3):
        try:
            second_prompt = hub.pull("getgloby/agent-2-translate")
            print(f"Second prompt pulled successfully for iteration {i + 1}.")
        except Exception as e:
            print(f"Error al obtener el segundo agente en la iteración {i + 1}: {e}")
            continue

        second_runnable = second_prompt | chatModel_json

        try:
            second_agent_output = await invoke_agent(second_runnable, {
                "originalText": text,
                "firstAgentOutput": first_agent_output,
                "targetLanguage": target_language,
            })
            print(f"Second agent output (iteration {i + 1}): {second_agent_output}")
        except Exception as e:
            print(f"Error invoking second agent in iteration {i + 1}: {e}")
            print(f"Error details: {e}")
            continue

        try:
            parsed_second_agent_output = await parse_json_with_retries(second_agent_output)
            translation = parsed_second_agent_output["translation"]
            print(f"Parsed second agent output (iteration {i + 1}): {translation}")
        except Exception as e:
            print(f"Error parsing second agent output in iteration {i + 1}: {e}")
            print(f"Error details: {e}")
            continue

        try:
            third_prompt = hub.pull("getgloby/agent-3-improve-translation")
            print(f"Third prompt pulled successfully for iteration {i + 1}.")
        except Exception as e:
            print(f"Error al obtener el tercer agente en la iteración {i + 1}: {e}")
            continue

        third_runnable = third_prompt | chatModel_json

        try:
            third_agent_output = await invoke_agent(third_runnable, {
                "originalText": text,
                "firstAgentOutput": first_agent_output,
                "secondAgentOutput": translation,
            })
            print(f"Third agent output (iteration {i + 1}): {third_agent_output}")
        except Exception as e:
            print(f"Error invoking third agent in iteration {i + 1}: {e}")
            print(f"Error details: {e}")
            continue

        try:
            third_agent_output_json = await parse_json_with_retries(third_agent_output)
            optimized_translation = third_agent_output_json["optimizedTranslation"]
            print(f"Optimized translation (iteration {i + 1}): {optimized_translation}")
        except Exception as e:
            print(f"Error parsing third agent output in iteration {i + 1}: {e}")
            print(f"Error details: {e}")
            continue

        translations.append(optimized_translation)

    try:
        final_prompt = hub.pull("getgloby/agent-4-final-translation")
        print("Final prompt pulled successfully.")
    except Exception as e:
        print(f"Error al obtener el agente final: {e}")
        return

    final_runnable = final_prompt | chatModel_json

    try:
        final_agent_output = await invoke_agent(final_runnable, {
            "originalText": text,
            "firstAgentOutput": first_agent_output,  # Cambiado de contextInfo a firstAgentOutput
            "translation1": translations[0],
            "translation2": translations[1],
            "translation3": translations[2],
            "targetLanguage": target_language,
        })
        print(f"Final agent output: {final_agent_output}")
    except Exception as e:
        print(f"Error invoking final agent: {e}")
        print(f"Error details: {e}")
        return

    try:
        final_agent_output_json = await parse_json_with_retries(final_agent_output)
        final_translation = final_agent_output_json["finalTranslation"]
        print(f"Final translation: {final_translation}")
    except Exception as e:
        print(f"Error parsing final agent output: {e}")
        print(f"Error details: {e}")
        return

    return final_translation