File size: 6,105 Bytes
3a28ef1
9b5b26a
c19d193
6aae614
9baa491
a735fbb
9baa491
 
 
3a28ef1
d56e9c7
9b5b26a
185414c
 
9b5b26a
185414c
a45fcc8
185414c
9b5b26a
990e0f9
d56e9c7
 
09ce424
990e0f9
 
 
 
d56e9c7
990e0f9
a735fbb
 
 
 
 
 
 
 
 
 
 
 
 
d56e9c7
990e0f9
 
d56e9c7
09ce424
990e0f9
185414c
990e0f9
 
 
 
 
d56e9c7
09ce424
 
 
 
 
 
 
 
 
 
185414c
 
 
 
 
 
 
 
 
9baa491
185414c
67ad81a
 
 
 
 
 
 
09ce424
67ad81a
185414c
67ad81a
185414c
67ad81a
09ce424
67ad81a
d56e9c7
185414c
d56e9c7
 
185414c
d56e9c7
 
9b5b26a
6aae614
ae7a494
 
 
 
e121372
3a28ef1
 
 
 
13d500a
8c01ffb
861422e
 
9b5b26a
8c01ffb
8fe992b
3a28ef1
8c01ffb
 
 
 
 
 
861422e
8fe992b
 
9baa491
a45fcc8
 
185414c
a45fcc8
185414c
a45fcc8
 
185414c
67ad81a
a45fcc8
185414c
a6da7a0
 
185414c
a45fcc8
 
 
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
from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel, load_tool, tool
import requests
import yaml
from tools.final_answer import FinalAnswerTool
import gradio as gr
from difflib import get_close_matches

# Import tool from Hub
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)

##############
@tool
def get_game_of_thrones_character_info(character_name: str) -> str:
    """Una herramienta que obtiene información detallada sobre un personaje de Juego de Tronos.
    Args:
        character_name: El nombre del personaje (por ejemplo, 'Jon Snow').
    Returns:
        Un string con la información detallada del personaje.
    """
    base_url = "https://anapioficeandfire.com/api/characters"
    
    try:
        # Hacer la solicitud a la API para buscar el personaje
        params = {"name": character_name}
        response = requests.get(base_url, params=params)
        response.raise_for_status()  # Lanza una excepción si hay un error HTTP
        characters = response.json()
        
        if not characters:
            # Si no se encuentra el personaje, buscar nombres similares
            all_characters_response = requests.get(base_url, params={"pageSize": 1000})
            all_characters_response.raise_for_status()
            all_characters = all_characters_response.json()
            all_names = [char.get("name", "") for char in all_characters if char.get("name")]
            
            # Buscar nombres similares
            close_matches = get_close_matches(character_name, all_names, n=2, cutoff=0.5)
            if close_matches:
                suggestions = "\n- " + "\n- ".join(close_matches)
                return f"No se encontró información para el personaje: {character_name}.\n\n¿Quizás quisiste decir alguno de estos?\n{suggestions}"
            else:
                return f"No se encontró información para el personaje: {character_name}."
        
        # Tomar el primer resultado (puede haber varios con el mismo nombre)
        character = characters[0]
        
        # Extraer información relevante del personaje
        name = character.get("name", "Desconocido")
        gender = "Masculino" if character.get("gender", "").lower() == "male" else "Femenino"
        culture = character.get("culture", "Desconocido")
        born = character.get("born", "Desconocido")
        died = character.get("died", "Aún vivo")
        titles = ", ".join(character.get("titles", [])) if character.get("titles") else "Ninguno"
        aliases = ", ".join(character.get("aliases", [])) if character.get("aliases") else "Ninguno"
        
        # Obtener información de la casa (si está disponible)
        houses = []
        if "allegiances" in character:
            for house_url in character["allegiances"]:
                house_response = requests.get(house_url)
                house_response.raise_for_status()
                house_data = house_response.json()
                house_name = house_data.get("name", "Desconocido")
                houses.append(house_name)
        
        # Obtener información de los libros en los que aparece
        books = []
        if "books" in character:
            for book_url in character["books"]:
                book_response = requests.get(book_url)
                book_response.raise_for_status()
                book_data = book_response.json()
                book_name = book_data.get("name", "Desconocido")
                books.append(book_name)
        
        # Formatear la respuesta en español
        result = f"Información sobre {name}\n\n"
        result += f"- Género: {gender}\n"
        result += f"- Cultura: {culture}\n"
        result += f"- Nacimiento: {born}\n"
        result += f"- Muerte: {died}\n"
        result += f"- Títulos: {titles}\n"
        result += f"- Alias: {aliases}\n"
        if houses:
            result += f"- Casa(s): {', '.join(houses)}\n"
        else:
            result += "- Casa(s): Ninguna o desconocida\n"
        if books:
            result += f"- Libros en los que aparece: {', '.join(books)}\n"
        else:
            result += "- Libros en los que aparece: Ninguno o desconocido\n"
        
        return result
    
    except Exception as e:
        return f"Error al obtener información del personaje: {str(e)}"

###############

final_answer = FinalAnswerTool()

# If the agent does not answer, the model is overloaded, please use another model or the following Hugging Face Endpoint that also contains qwen2.5 coder:
# model_id='https://pflgm2locj2t89co.us-east-1.aws.endpoints.huggingface.cloud' 

model = HfApiModel(
    max_tokens=2096,
    temperature=0.5,
    model_id='Qwen/Qwen2.5-Coder-32B-Instruct',  # it is possible that this model may be overloaded
    custom_role_conversions=None,
)

with open("prompts.yaml", 'r') as stream:
    prompt_templates = yaml.safe_load(stream)
    
agent = CodeAgent(
    model=model,
    tools=[final_answer, get_game_of_thrones_character_info],  # add your tools here (don't remove final answer)
    max_steps=6,
    verbosity_level=1,
    grammar=None,
    planning_interval=None,
    name=None,
    description=None,
    prompt_templates=prompt_templates
)

##############
def display_character_info(character_name):
    result = get_game_of_thrones_character_info(character_name)
    return result

# Crear una interfaz de Gradio
interface = gr.Interface(
    fn=display_character_info,
    inputs=gr.Textbox(label="Nombre del personaje", placeholder="Ejemplo: Jon Snow"),
    outputs=gr.Textbox(label="Información del personaje"),  # Sin el parámetro markdown
    title="Información de Personajes de Juego de Tronos",
    description="Ingresa el nombre de un personaje de Juego de Tronos para obtener información detallada.",
    examples=["Jon Snow", "Daenerys Targaryen", "Tyrion Lannister", "Viserys Targaryen", "Arya Stark", "Sansa Stark", "Sandor Clegane", "Rhaenyra Targaryen", 
              "Daemon Targaryen", "Aemond Targaryen", "Cersei Lannister", "Bran Stark"],
    theme="soft"
)

interface.launch()