Spaces:
Sleeping
Sleeping
Upload folder using huggingface_hub
Browse files- .gitattributes +1 -0
- Agente_IA_Chat_Evaluador.ipynb +265 -0
- Agente_IA_Debate.ipynb +581 -0
- Exercises2.ipynb +0 -0
- app_old.py +258 -0
- me/CV_JuanCruzJurado.pdf +2 -2
- me/avatar.jpg +0 -0
- me/linkedin.pdf +0 -0
- me/the_scream.jpg +3 -0
.gitattributes
CHANGED
|
@@ -34,3 +34,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
me/CV_JuanCruzJurado.pdf filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
me/CV_JuanCruzJurado.pdf filter=lfs diff=lfs merge=lfs -text
|
| 37 |
+
me/the_scream.jpg filter=lfs diff=lfs merge=lfs -text
|
Agente_IA_Chat_Evaluador.ipynb
ADDED
|
@@ -0,0 +1,265 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 24,
|
| 6 |
+
"id": "1d7b2eeb",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [],
|
| 9 |
+
"source": [
|
| 10 |
+
"from dotenv import load_dotenv\n",
|
| 11 |
+
"import gradio as gr\n",
|
| 12 |
+
"from pypdf import PdfReader\n",
|
| 13 |
+
"from openai import OpenAI\n",
|
| 14 |
+
"import os\n"
|
| 15 |
+
]
|
| 16 |
+
},
|
| 17 |
+
{
|
| 18 |
+
"cell_type": "code",
|
| 19 |
+
"execution_count": 25,
|
| 20 |
+
"id": "867c4cf3",
|
| 21 |
+
"metadata": {},
|
| 22 |
+
"outputs": [],
|
| 23 |
+
"source": [
|
| 24 |
+
"load_dotenv(override=True)\n",
|
| 25 |
+
"\n",
|
| 26 |
+
"openai = OpenAI()\n",
|
| 27 |
+
"\n",
|
| 28 |
+
"gemini = OpenAI(api_key=os.getenv(\"GOOGLE_API_KEY\"), base_url=\"https://generativelanguage.googleapis.com/v1beta/openai/\")\n",
|
| 29 |
+
"\n",
|
| 30 |
+
"reader = PdfReader(\"E:/Mis Carpetas/Documentos/Python/Udemy_Ing_Agentes/projects/agents/1_foundations/me/linkedin.pdf\")\n",
|
| 31 |
+
"linkedin = \"\"\n",
|
| 32 |
+
"for page in reader.pages:\n",
|
| 33 |
+
" text = page.extract_text()\n",
|
| 34 |
+
" if text:\n",
|
| 35 |
+
" linkedin += text\n",
|
| 36 |
+
"\n",
|
| 37 |
+
"with open(\"E:/Mis Carpetas/Documentos/Python/Udemy_Ing_Agentes/projects/agents/1_foundations/me/summary.txt\", mode=\"r\",encoding=\"utf-8\") as f:\n",
|
| 38 |
+
" summary = f.read()\n",
|
| 39 |
+
"\n",
|
| 40 |
+
"name = \"Juan Gabriel Gomila Salas\"\n",
|
| 41 |
+
"\n",
|
| 42 |
+
"system_prompt = f\"Estás actuando como {name}. Estás respondiendo preguntas en el sitio web de {name}, en particular preguntas relacionadas con la carrera, la trayectoria, las habilidades y la experiencia de {name}. \\\n",
|
| 43 |
+
"Tu responsabilidad es representar a {name} en las interacciones en el sitio web con la mayor fidelidad posible. \\\n",
|
| 44 |
+
"Se te proporciona un resumen de la trayectoria y el perfil de LinkedIn de {name} que puedes usar para responder preguntas. \\\n",
|
| 45 |
+
"Sé profesional y atractivo, como si hablaras con un cliente potencial o un futuro empleador que haya visitado el sitio web. \\\n",
|
| 46 |
+
"Si no sabes la respuesta, dilo.\"\n",
|
| 47 |
+
"\n",
|
| 48 |
+
"system_prompt += f\"\\n\\n## Resumen:\\n{summary}\\n\\n## Perfil de LinkedIn:\\n{linkedin}\\n\\n\"\n",
|
| 49 |
+
"system_prompt += f\"En este contexto, charla con el usuario, utilizando siempre el personaje de {name}.\"\n"
|
| 50 |
+
]
|
| 51 |
+
},
|
| 52 |
+
{
|
| 53 |
+
"cell_type": "code",
|
| 54 |
+
"execution_count": 20,
|
| 55 |
+
"id": "e576428a",
|
| 56 |
+
"metadata": {},
|
| 57 |
+
"outputs": [],
|
| 58 |
+
"source": [
|
| 59 |
+
"def chat(message, history):\n",
|
| 60 |
+
" messages=[{\"role\":\"system\", \"content\":system_prompt}] + history + [{\"role\":\"user\", \"content\":message}]\n",
|
| 61 |
+
" response = openai.chat.completions.create(\n",
|
| 62 |
+
" model=\"gpt-4.1-mini\",\n",
|
| 63 |
+
" messages = messages\n",
|
| 64 |
+
" )\n",
|
| 65 |
+
" return response.choices[0].message.content"
|
| 66 |
+
]
|
| 67 |
+
},
|
| 68 |
+
{
|
| 69 |
+
"cell_type": "code",
|
| 70 |
+
"execution_count": 21,
|
| 71 |
+
"id": "1157795c",
|
| 72 |
+
"metadata": {},
|
| 73 |
+
"outputs": [
|
| 74 |
+
{
|
| 75 |
+
"name": "stdout",
|
| 76 |
+
"output_type": "stream",
|
| 77 |
+
"text": [
|
| 78 |
+
"* Running on local URL: http://127.0.0.1:7862\n",
|
| 79 |
+
"* To create a public link, set `share=True` in `launch()`.\n"
|
| 80 |
+
]
|
| 81 |
+
},
|
| 82 |
+
{
|
| 83 |
+
"data": {
|
| 84 |
+
"text/html": [
|
| 85 |
+
"<div><iframe src=\"http://127.0.0.1:7862/\" width=\"100%\" height=\"500\" allow=\"autoplay; camera; microphone; clipboard-read; clipboard-write;\" frameborder=\"0\" allowfullscreen></iframe></div>"
|
| 86 |
+
],
|
| 87 |
+
"text/plain": [
|
| 88 |
+
"<IPython.core.display.HTML object>"
|
| 89 |
+
]
|
| 90 |
+
},
|
| 91 |
+
"metadata": {},
|
| 92 |
+
"output_type": "display_data"
|
| 93 |
+
},
|
| 94 |
+
{
|
| 95 |
+
"data": {
|
| 96 |
+
"text/plain": []
|
| 97 |
+
},
|
| 98 |
+
"execution_count": 21,
|
| 99 |
+
"metadata": {},
|
| 100 |
+
"output_type": "execute_result"
|
| 101 |
+
}
|
| 102 |
+
],
|
| 103 |
+
"source": [
|
| 104 |
+
"gr.ChatInterface(chat, type=\"messages\").launch()"
|
| 105 |
+
]
|
| 106 |
+
},
|
| 107 |
+
{
|
| 108 |
+
"cell_type": "code",
|
| 109 |
+
"execution_count": 22,
|
| 110 |
+
"id": "ab500b05",
|
| 111 |
+
"metadata": {},
|
| 112 |
+
"outputs": [],
|
| 113 |
+
"source": [
|
| 114 |
+
"from pydantic import BaseModel\n",
|
| 115 |
+
"\n",
|
| 116 |
+
"class Evaluation(BaseModel):\n",
|
| 117 |
+
" is_acceptable: bool\n",
|
| 118 |
+
" feedback: str\n",
|
| 119 |
+
"\n",
|
| 120 |
+
"evaluator_system_prompt = f\"Usted es un evaluador que decide si una respuesta a una pregunta es aceptable. \\\n",
|
| 121 |
+
"Se le presenta una conversación entre un usuario y un agente. Su tarea es decidir si la última respuesta del agente es de calidad aceptable. \\\n",
|
| 122 |
+
"El agente desempeña el papel de {name} y representa a {name} en su sitio web. \\\n",
|
| 123 |
+
"Se le ha indicado que sea profesional y atractivo, como si hablara con un cliente potencial o un futuro empleador que haya visitado el sitio web. \\\n",
|
| 124 |
+
"Se le ha proporcionado contexto sobre {name} en forma de resumen y datos de LinkedIn. Aquí está la información:\"\n",
|
| 125 |
+
"\n",
|
| 126 |
+
"evaluator_system_prompt += f\"\\n\\n## Resumen:\\n{summary}\\n\\n## Perfil de LinkedIn:\\n{linkedin}\\n\\n\"\n",
|
| 127 |
+
"evaluator_system_prompt += f\"Con este contexto, por favor, evalúe la última respuesta, indicando si es aceptable y sus comentarios.\""
|
| 128 |
+
]
|
| 129 |
+
},
|
| 130 |
+
{
|
| 131 |
+
"cell_type": "code",
|
| 132 |
+
"execution_count": 23,
|
| 133 |
+
"id": "259a3c7c",
|
| 134 |
+
"metadata": {},
|
| 135 |
+
"outputs": [],
|
| 136 |
+
"source": [
|
| 137 |
+
"def evaluator_user_prompt(reply, message, history):\n",
|
| 138 |
+
" user_prompt = f\"Aquí está la conversación entre el usuario y el agente: \\n\\n{history}\\n\\n\"\n",
|
| 139 |
+
" user_prompt += f\"Aquí está el último mensaje del usuario: \\n\\n{message}\\n\\n\"\n",
|
| 140 |
+
" user_prompt += f\"Aquí está la última respuesta del agente: \\n\\n{reply}\\n\\n\"\n",
|
| 141 |
+
" user_prompt += f\"Por favor, evalúe la respuesta, indicando si es aceptable y sus comentarios.\"\n",
|
| 142 |
+
" return user_prompt"
|
| 143 |
+
]
|
| 144 |
+
},
|
| 145 |
+
{
|
| 146 |
+
"cell_type": "code",
|
| 147 |
+
"execution_count": 39,
|
| 148 |
+
"id": "dcef906e",
|
| 149 |
+
"metadata": {},
|
| 150 |
+
"outputs": [],
|
| 151 |
+
"source": [
|
| 152 |
+
"def evaluate(reply, message, history) -> Evaluation:\n",
|
| 153 |
+
" messages = [{\"role\":\"system\", \"content\":evaluator_system_prompt}] + [{\"role\":\"user\", \"content\":evaluator_user_prompt(reply, message, history)}]\n",
|
| 154 |
+
" response = gemini.beta.chat.completions.parse(model=\"gemini-2.0-flash\", messages=messages, response_format=Evaluation)\n",
|
| 155 |
+
" return response.choices[0].message.parsed\n",
|
| 156 |
+
"\n",
|
| 157 |
+
"def rerun(reply, message, history, feedback):\n",
|
| 158 |
+
" updated_system_prompt = system_prompt + f\"\\n\\n## Respuesta anterior rechazada\\nAcabas de intentar responder, pero el control de calidad rechazó tu respuesta.\\n\"\n",
|
| 159 |
+
" updated_system_prompt += f\"## Has intentado responder:\\n{reply}\\n\\n\"\n",
|
| 160 |
+
" updated_system_prompt += f\"## Razón del rechazo:\\n{feedback}\\n\\n\"\n",
|
| 161 |
+
" messages = [{\"role\": \"system\", \"content\": updated_system_prompt}] + history + [{\"role\": \"user\", \"content\": message}]\n",
|
| 162 |
+
" response = openai.chat.completions.create(model=\"gpt-4o-mini\", messages=messages)\n",
|
| 163 |
+
" return response.choices[0].message.content"
|
| 164 |
+
]
|
| 165 |
+
},
|
| 166 |
+
{
|
| 167 |
+
"cell_type": "code",
|
| 168 |
+
"execution_count": 44,
|
| 169 |
+
"id": "42c0d287",
|
| 170 |
+
"metadata": {},
|
| 171 |
+
"outputs": [],
|
| 172 |
+
"source": [
|
| 173 |
+
"def chat(message, history):\n",
|
| 174 |
+
" if \"instrumento\" in message:\n",
|
| 175 |
+
" system = system_prompt + \"\\n\\nToda tu respuesta debe estar en el latín de los cerdos traducido al español -\\\n",
|
| 176 |
+
" Es obligatorio que respondas únicamente y en su totalidad en el latín de los cerdos traducido al español.\"\n",
|
| 177 |
+
" else:\n",
|
| 178 |
+
" system = system_prompt\n",
|
| 179 |
+
" \n",
|
| 180 |
+
" messages = [{\"role\":\"system\", \"content\":system}] + history + [{\"role\":\"user\", \"content\":message}]\n",
|
| 181 |
+
" response = openai.chat.completions.create(model=\"gpt-4o-mini\",messages=messages)\n",
|
| 182 |
+
" reply = response.choices[0].message.content\n",
|
| 183 |
+
"\n",
|
| 184 |
+
" evaluation = evaluate(reply, message, history)\n",
|
| 185 |
+
"\n",
|
| 186 |
+
" if evaluation.is_acceptable:\n",
|
| 187 |
+
" print(\"Has pasado la evaluación - devolviendo respuesta\")\n",
|
| 188 |
+
" else:\n",
|
| 189 |
+
" print(\"Has fallado la evaluación - reintentando\")\n",
|
| 190 |
+
" print(evaluation.feedback)\n",
|
| 191 |
+
" reply = rerun(reply, message, history, evaluation.feedback)\n",
|
| 192 |
+
" return reply\n",
|
| 193 |
+
" "
|
| 194 |
+
]
|
| 195 |
+
},
|
| 196 |
+
{
|
| 197 |
+
"cell_type": "code",
|
| 198 |
+
"execution_count": null,
|
| 199 |
+
"id": "8dceaf8f",
|
| 200 |
+
"metadata": {},
|
| 201 |
+
"outputs": [
|
| 202 |
+
{
|
| 203 |
+
"name": "stdout",
|
| 204 |
+
"output_type": "stream",
|
| 205 |
+
"text": [
|
| 206 |
+
"* Running on local URL: http://127.0.0.1:7870\n",
|
| 207 |
+
"* To create a public link, set `share=True` in `launch()`.\n"
|
| 208 |
+
]
|
| 209 |
+
},
|
| 210 |
+
{
|
| 211 |
+
"data": {
|
| 212 |
+
"text/html": [
|
| 213 |
+
"<div><iframe src=\"http://127.0.0.1:7870/\" width=\"100%\" height=\"500\" allow=\"autoplay; camera; microphone; clipboard-read; clipboard-write;\" frameborder=\"0\" allowfullscreen></iframe></div>"
|
| 214 |
+
],
|
| 215 |
+
"text/plain": [
|
| 216 |
+
"<IPython.core.display.HTML object>"
|
| 217 |
+
]
|
| 218 |
+
},
|
| 219 |
+
"metadata": {},
|
| 220 |
+
"output_type": "display_data"
|
| 221 |
+
},
|
| 222 |
+
{
|
| 223 |
+
"data": {
|
| 224 |
+
"text/plain": []
|
| 225 |
+
},
|
| 226 |
+
"execution_count": 45,
|
| 227 |
+
"metadata": {},
|
| 228 |
+
"output_type": "execute_result"
|
| 229 |
+
},
|
| 230 |
+
{
|
| 231 |
+
"name": "stdout",
|
| 232 |
+
"output_type": "stream",
|
| 233 |
+
"text": [
|
| 234 |
+
"Has pasado la evaluación - devolviendo respuesta\n",
|
| 235 |
+
"Has pasado la evaluación - devolviendo respuesta\n"
|
| 236 |
+
]
|
| 237 |
+
}
|
| 238 |
+
],
|
| 239 |
+
"source": [
|
| 240 |
+
"gr.ChatInterface(chat, type=\"messages\").launch()"
|
| 241 |
+
]
|
| 242 |
+
}
|
| 243 |
+
],
|
| 244 |
+
"metadata": {
|
| 245 |
+
"kernelspec": {
|
| 246 |
+
"display_name": ".venv",
|
| 247 |
+
"language": "python",
|
| 248 |
+
"name": "python3"
|
| 249 |
+
},
|
| 250 |
+
"language_info": {
|
| 251 |
+
"codemirror_mode": {
|
| 252 |
+
"name": "ipython",
|
| 253 |
+
"version": 3
|
| 254 |
+
},
|
| 255 |
+
"file_extension": ".py",
|
| 256 |
+
"mimetype": "text/x-python",
|
| 257 |
+
"name": "python",
|
| 258 |
+
"nbconvert_exporter": "python",
|
| 259 |
+
"pygments_lexer": "ipython3",
|
| 260 |
+
"version": "3.12.11"
|
| 261 |
+
}
|
| 262 |
+
},
|
| 263 |
+
"nbformat": 4,
|
| 264 |
+
"nbformat_minor": 5
|
| 265 |
+
}
|
Agente_IA_Debate.ipynb
ADDED
|
@@ -0,0 +1,581 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 1,
|
| 6 |
+
"id": "4d7ce4f1",
|
| 7 |
+
"metadata": {},
|
| 8 |
+
"outputs": [
|
| 9 |
+
{
|
| 10 |
+
"data": {
|
| 11 |
+
"text/plain": [
|
| 12 |
+
"True"
|
| 13 |
+
]
|
| 14 |
+
},
|
| 15 |
+
"execution_count": 1,
|
| 16 |
+
"metadata": {},
|
| 17 |
+
"output_type": "execute_result"
|
| 18 |
+
}
|
| 19 |
+
],
|
| 20 |
+
"source": [
|
| 21 |
+
"import os\n",
|
| 22 |
+
"from dotenv import load_dotenv\n",
|
| 23 |
+
"import json\n",
|
| 24 |
+
"from openai import OpenAI\n",
|
| 25 |
+
"from IPython.display import Markdown, display\n",
|
| 26 |
+
"\n",
|
| 27 |
+
"load_dotenv(override=True)"
|
| 28 |
+
]
|
| 29 |
+
},
|
| 30 |
+
{
|
| 31 |
+
"cell_type": "code",
|
| 32 |
+
"execution_count": 2,
|
| 33 |
+
"id": "1ef04623",
|
| 34 |
+
"metadata": {},
|
| 35 |
+
"outputs": [
|
| 36 |
+
{
|
| 37 |
+
"name": "stdout",
|
| 38 |
+
"output_type": "stream",
|
| 39 |
+
"text": [
|
| 40 |
+
"Api key de openai esta OK. Empieza con sk-\n",
|
| 41 |
+
"Api key de google esta OK. Empieza con AIz\n",
|
| 42 |
+
"Api key de groq esta OK. Empieza con gsk\n"
|
| 43 |
+
]
|
| 44 |
+
}
|
| 45 |
+
],
|
| 46 |
+
"source": [
|
| 47 |
+
"openai_api_key = os.getenv(\"OPENAI_API_KEY\")\n",
|
| 48 |
+
"google_api_key = os.getenv(\"GOOGLE_API_KEY\")\n",
|
| 49 |
+
"groq_api_key = os.getenv(\"GROQ_API_KEY\")\n",
|
| 50 |
+
"\n",
|
| 51 |
+
"if openai_api_key:\n",
|
| 52 |
+
" print(\"Api key de openai esta OK. Empieza con \", openai_api_key[0:3])\n",
|
| 53 |
+
"\n",
|
| 54 |
+
"if google_api_key:\n",
|
| 55 |
+
" print(\"Api key de google esta OK. Empieza con \", google_api_key[0:3])\n",
|
| 56 |
+
"\n",
|
| 57 |
+
"if groq_api_key:\n",
|
| 58 |
+
" print(\"Api key de groq esta OK. Empieza con \", groq_api_key[0:3])"
|
| 59 |
+
]
|
| 60 |
+
},
|
| 61 |
+
{
|
| 62 |
+
"cell_type": "code",
|
| 63 |
+
"execution_count": 3,
|
| 64 |
+
"id": "923ecd9a",
|
| 65 |
+
"metadata": {},
|
| 66 |
+
"outputs": [],
|
| 67 |
+
"source": [
|
| 68 |
+
"answers=[]\n",
|
| 69 |
+
"competitors=[]"
|
| 70 |
+
]
|
| 71 |
+
},
|
| 72 |
+
{
|
| 73 |
+
"cell_type": "code",
|
| 74 |
+
"execution_count": 4,
|
| 75 |
+
"id": "cc8b6960",
|
| 76 |
+
"metadata": {},
|
| 77 |
+
"outputs": [],
|
| 78 |
+
"source": [
|
| 79 |
+
"\n",
|
| 80 |
+
"def procesarMensaje(modelo, mensaje, apiKey=None, baseUrl=None):\n",
|
| 81 |
+
" openai= OpenAI(api_key=apiKey, base_url= baseUrl)\n",
|
| 82 |
+
" response = openai.chat.completions.create(\n",
|
| 83 |
+
" model=modelo,\n",
|
| 84 |
+
" messages=mensaje\n",
|
| 85 |
+
" )\n",
|
| 86 |
+
" answer = response.choices[0].message.content\n",
|
| 87 |
+
" answers.append(answer)\n",
|
| 88 |
+
" competitors.append(modelo)\n",
|
| 89 |
+
" return answer"
|
| 90 |
+
]
|
| 91 |
+
},
|
| 92 |
+
{
|
| 93 |
+
"cell_type": "code",
|
| 94 |
+
"execution_count": 5,
|
| 95 |
+
"id": "57457e8a",
|
| 96 |
+
"metadata": {},
|
| 97 |
+
"outputs": [],
|
| 98 |
+
"source": [
|
| 99 |
+
"request = \"Por favor, propon una pregunta compleja y con matices que pueda plantear a varios LLM para identificar cual es la mejor idea para desarrollar un proyecto con IA en la industria de videojuegos.\"\n",
|
| 100 |
+
"request += \"Responde solo con la pregunta, sin explicaciones.\"\n",
|
| 101 |
+
"messages = [{\"role\":\"user\", \"content\":request}]"
|
| 102 |
+
]
|
| 103 |
+
},
|
| 104 |
+
{
|
| 105 |
+
"cell_type": "code",
|
| 106 |
+
"execution_count": null,
|
| 107 |
+
"id": "178c3459",
|
| 108 |
+
"metadata": {},
|
| 109 |
+
"outputs": [
|
| 110 |
+
{
|
| 111 |
+
"ename": "NotFoundError",
|
| 112 |
+
"evalue": "Error code: 404 - {'error': {'message': 'The model `gemini-2.0-flash` does not exist or you do not have access to it.', 'type': 'invalid_request_error', 'param': None, 'code': 'model_not_found'}}",
|
| 113 |
+
"output_type": "error",
|
| 114 |
+
"traceback": [
|
| 115 |
+
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
|
| 116 |
+
"\u001b[31mNotFoundError\u001b[39m Traceback (most recent call last)",
|
| 117 |
+
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[8]\u001b[39m\u001b[32m, line 2\u001b[39m\n\u001b[32m 1\u001b[39m model = \u001b[33m\"\u001b[39m\u001b[33mgemini-2.0-flash\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m2\u001b[39m question = \u001b[43mprocesarMensaje\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmessages\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 3\u001b[39m \u001b[38;5;28mprint\u001b[39m(question)\n",
|
| 118 |
+
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[4]\u001b[39m\u001b[32m, line 3\u001b[39m, in \u001b[36mprocesarMensaje\u001b[39m\u001b[34m(modelo, mensaje, apiKey, baseUrl)\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mprocesarMensaje\u001b[39m(modelo, mensaje, apiKey=\u001b[38;5;28;01mNone\u001b[39;00m, baseUrl=\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[32m 2\u001b[39m openai= OpenAI(api_key=apiKey, base_url= baseUrl)\n\u001b[32m----> \u001b[39m\u001b[32m3\u001b[39m response = \u001b[43mopenai\u001b[49m\u001b[43m.\u001b[49m\u001b[43mchat\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcompletions\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcreate\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 4\u001b[39m \u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m=\u001b[49m\u001b[43mmodelo\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 5\u001b[39m \u001b[43m \u001b[49m\u001b[43mmessages\u001b[49m\u001b[43m=\u001b[49m\u001b[43mmensaje\u001b[49m\n\u001b[32m 6\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 7\u001b[39m answer = response.choices[\u001b[32m0\u001b[39m].message.content\n\u001b[32m 8\u001b[39m answers.append(answer)\n",
|
| 119 |
+
"\u001b[36mFile \u001b[39m\u001b[32me:\\Mis Carpetas\\Documentos\\Python\\Udemy_Ing_Agentes\\projects\\agents\\.venv\\Lib\\site-packages\\openai\\_utils\\_utils.py:287\u001b[39m, in \u001b[36mrequired_args.<locals>.inner.<locals>.wrapper\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 285\u001b[39m msg = \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mMissing required argument: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mquote(missing[\u001b[32m0\u001b[39m])\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 286\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(msg)\n\u001b[32m--> \u001b[39m\u001b[32m287\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
|
| 120 |
+
"\u001b[36mFile \u001b[39m\u001b[32me:\\Mis Carpetas\\Documentos\\Python\\Udemy_Ing_Agentes\\projects\\agents\\.venv\\Lib\\site-packages\\openai\\resources\\chat\\completions\\completions.py:925\u001b[39m, in \u001b[36mCompletions.create\u001b[39m\u001b[34m(self, messages, model, audio, frequency_penalty, function_call, functions, logit_bias, logprobs, max_completion_tokens, max_tokens, metadata, modalities, n, parallel_tool_calls, prediction, presence_penalty, reasoning_effort, response_format, seed, service_tier, stop, store, stream, stream_options, temperature, tool_choice, tools, top_logprobs, top_p, user, web_search_options, extra_headers, extra_query, extra_body, timeout)\u001b[39m\n\u001b[32m 882\u001b[39m \u001b[38;5;129m@required_args\u001b[39m([\u001b[33m\"\u001b[39m\u001b[33mmessages\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mmodel\u001b[39m\u001b[33m\"\u001b[39m], [\u001b[33m\"\u001b[39m\u001b[33mmessages\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mmodel\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mstream\u001b[39m\u001b[33m\"\u001b[39m])\n\u001b[32m 883\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mcreate\u001b[39m(\n\u001b[32m 884\u001b[39m \u001b[38;5;28mself\u001b[39m,\n\u001b[32m (...)\u001b[39m\u001b[32m 922\u001b[39m timeout: \u001b[38;5;28mfloat\u001b[39m | httpx.Timeout | \u001b[38;5;28;01mNone\u001b[39;00m | NotGiven = NOT_GIVEN,\n\u001b[32m 923\u001b[39m ) -> ChatCompletion | Stream[ChatCompletionChunk]:\n\u001b[32m 924\u001b[39m validate_response_format(response_format)\n\u001b[32m--> \u001b[39m\u001b[32m925\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_post\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 926\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43m/chat/completions\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 927\u001b[39m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[43m=\u001b[49m\u001b[43mmaybe_transform\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 928\u001b[39m \u001b[43m \u001b[49m\u001b[43m{\u001b[49m\n\u001b[32m 929\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mmessages\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mmessages\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 930\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mmodel\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 931\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43maudio\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43maudio\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 932\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mfrequency_penalty\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mfrequency_penalty\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 933\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mfunction_call\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mfunction_call\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 934\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mfunctions\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mfunctions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 935\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mlogit_bias\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mlogit_bias\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 936\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mlogprobs\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mlogprobs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 937\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mmax_completion_tokens\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mmax_completion_tokens\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 938\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mmax_tokens\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mmax_tokens\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 939\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mmetadata\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mmetadata\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 940\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mmodalities\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mmodalities\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 941\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mn\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 942\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mparallel_tool_calls\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mparallel_tool_calls\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 943\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mprediction\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mprediction\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 944\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mpresence_penalty\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mpresence_penalty\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 945\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mreasoning_effort\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mreasoning_effort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 946\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mresponse_format\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mresponse_format\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 947\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mseed\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mseed\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 948\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mservice_tier\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mservice_tier\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 949\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mstop\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 950\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mstore\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mstore\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 951\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mstream\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 952\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mstream_options\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream_options\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 953\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mtemperature\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mtemperature\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 954\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mtool_choice\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mtool_choice\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 955\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mtools\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mtools\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 956\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mtop_logprobs\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mtop_logprobs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 957\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mtop_p\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mtop_p\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 958\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43muser\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43muser\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 959\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mweb_search_options\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mweb_search_options\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 960\u001b[39m \u001b[43m \u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 961\u001b[39m \u001b[43m \u001b[49m\u001b[43mcompletion_create_params\u001b[49m\u001b[43m.\u001b[49m\u001b[43mCompletionCreateParamsStreaming\u001b[49m\n\u001b[32m 962\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\n\u001b[32m 963\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mcompletion_create_params\u001b[49m\u001b[43m.\u001b[49m\u001b[43mCompletionCreateParamsNonStreaming\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 964\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 965\u001b[39m \u001b[43m \u001b[49m\u001b[43moptions\u001b[49m\u001b[43m=\u001b[49m\u001b[43mmake_request_options\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 966\u001b[39m \u001b[43m \u001b[49m\u001b[43mextra_headers\u001b[49m\u001b[43m=\u001b[49m\u001b[43mextra_headers\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mextra_query\u001b[49m\u001b[43m=\u001b[49m\u001b[43mextra_query\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mextra_body\u001b[49m\u001b[43m=\u001b[49m\u001b[43mextra_body\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtimeout\u001b[49m\n\u001b[32m 967\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 968\u001b[39m \u001b[43m \u001b[49m\u001b[43mcast_to\u001b[49m\u001b[43m=\u001b[49m\u001b[43mChatCompletion\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 969\u001b[39m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 970\u001b[39m \u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[43m=\u001b[49m\u001b[43mStream\u001b[49m\u001b[43m[\u001b[49m\u001b[43mChatCompletionChunk\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 971\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n",
|
| 121 |
+
"\u001b[36mFile \u001b[39m\u001b[32me:\\Mis Carpetas\\Documentos\\Python\\Udemy_Ing_Agentes\\projects\\agents\\.venv\\Lib\\site-packages\\openai\\_base_client.py:1239\u001b[39m, in \u001b[36mSyncAPIClient.post\u001b[39m\u001b[34m(self, path, cast_to, body, options, files, stream, stream_cls)\u001b[39m\n\u001b[32m 1225\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mpost\u001b[39m(\n\u001b[32m 1226\u001b[39m \u001b[38;5;28mself\u001b[39m,\n\u001b[32m 1227\u001b[39m path: \u001b[38;5;28mstr\u001b[39m,\n\u001b[32m (...)\u001b[39m\u001b[32m 1234\u001b[39m stream_cls: \u001b[38;5;28mtype\u001b[39m[_StreamT] | \u001b[38;5;28;01mNone\u001b[39;00m = \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m 1235\u001b[39m ) -> ResponseT | _StreamT:\n\u001b[32m 1236\u001b[39m opts = FinalRequestOptions.construct(\n\u001b[32m 1237\u001b[39m method=\u001b[33m\"\u001b[39m\u001b[33mpost\u001b[39m\u001b[33m\"\u001b[39m, url=path, json_data=body, files=to_httpx_files(files), **options\n\u001b[32m 1238\u001b[39m )\n\u001b[32m-> \u001b[39m\u001b[32m1239\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m cast(ResponseT, \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcast_to\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mopts\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[43m)\u001b[49m)\n",
|
| 122 |
+
"\u001b[36mFile \u001b[39m\u001b[32me:\\Mis Carpetas\\Documentos\\Python\\Udemy_Ing_Agentes\\projects\\agents\\.venv\\Lib\\site-packages\\openai\\_base_client.py:1034\u001b[39m, in \u001b[36mSyncAPIClient.request\u001b[39m\u001b[34m(self, cast_to, options, stream, stream_cls)\u001b[39m\n\u001b[32m 1031\u001b[39m err.response.read()\n\u001b[32m 1033\u001b[39m log.debug(\u001b[33m\"\u001b[39m\u001b[33mRe-raising status error\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m-> \u001b[39m\u001b[32m1034\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;28mself\u001b[39m._make_status_error_from_response(err.response) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 1036\u001b[39m \u001b[38;5;28;01mbreak\u001b[39;00m\n\u001b[32m 1038\u001b[39m \u001b[38;5;28;01massert\u001b[39;00m response \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m, \u001b[33m\"\u001b[39m\u001b[33mcould not resolve response (should never happen)\u001b[39m\u001b[33m\"\u001b[39m\n",
|
| 123 |
+
"\u001b[31mNotFoundError\u001b[39m: Error code: 404 - {'error': {'message': 'The model `gemini-2.0-flash` does not exist or you do not have access to it.', 'type': 'invalid_request_error', 'param': None, 'code': 'model_not_found'}}"
|
| 124 |
+
]
|
| 125 |
+
}
|
| 126 |
+
],
|
| 127 |
+
"source": [
|
| 128 |
+
"model = \"gpt-4o-mini\"\n",
|
| 129 |
+
"question = procesarMensaje(model, messages)\n",
|
| 130 |
+
"print(question)"
|
| 131 |
+
]
|
| 132 |
+
},
|
| 133 |
+
{
|
| 134 |
+
"cell_type": "code",
|
| 135 |
+
"execution_count": null,
|
| 136 |
+
"id": "89304c5c",
|
| 137 |
+
"metadata": {},
|
| 138 |
+
"outputs": [],
|
| 139 |
+
"source": [
|
| 140 |
+
"messages = [{\"role\":\"user\", \"content\":question}]\n",
|
| 141 |
+
"openaiMessage = procesarMensaje(\"gpt-4o-mini\",messages)\n",
|
| 142 |
+
"googleMessage = procesarMensaje(\"gemini-2.5-flash\",messages, apiKey=google_api_key, baseUrl=\"https://generativelanguage.googleapis.com/v1beta/openai/\")\n",
|
| 143 |
+
"groqMessages = procesarMensaje(\"llama-3.3-70b-versatile\", messages, apiKey=groq_api_key, baseUrl=\"https://api.groq.com/openai/v1/\")"
|
| 144 |
+
]
|
| 145 |
+
},
|
| 146 |
+
{
|
| 147 |
+
"cell_type": "code",
|
| 148 |
+
"execution_count": 40,
|
| 149 |
+
"id": "39c8bd2a",
|
| 150 |
+
"metadata": {},
|
| 151 |
+
"outputs": [],
|
| 152 |
+
"source": [
|
| 153 |
+
"prompt_openai_to_gemini = f\"\"\"\n",
|
| 154 |
+
"Has leido las respuestas de 1 modelo de IA a una pregunta {question}.\n",
|
| 155 |
+
"respuesta del primer competidor: {answers[1]}\n",
|
| 156 |
+
"Como experto en IA, critícala desde un punto de vista experto. ¿Qué puntos son débiles, discutibles o poco fundamentados? en esta respuesta.\"\"\"\n",
|
| 157 |
+
"\n",
|
| 158 |
+
"prompt_openai_to_groq = f\"\"\"\n",
|
| 159 |
+
"Has leido las respuestas de 1 modelo de IA a una pregunta {question}.\n",
|
| 160 |
+
"Respuesta del segundo competidor: {answers[2]}\n",
|
| 161 |
+
"Como experto en IA, critícala desde un punto de vista experto. ¿Qué puntos son débiles, discutibles o poco fundamentados? en esta respuesta.\"\"\"\n",
|
| 162 |
+
"\n",
|
| 163 |
+
"prompt_gemini_to_openai = f\"\"\"\n",
|
| 164 |
+
"Has leido las respuestas de 1 modelo de IA a una pregunta {question}.\n",
|
| 165 |
+
"respuesta del primer competidor: {answers[0]}\n",
|
| 166 |
+
"Como experto en IA, critícala desde un punto de vista experto. ¿Qué puntos son débiles, discutibles o poco fundamentados? en esta respuesta.\"\"\"\n",
|
| 167 |
+
"\n",
|
| 168 |
+
"prompt_gemini_to_groq = f\"\"\"\n",
|
| 169 |
+
"Has leido las respuestas de 1 modelo de IA a una pregunta {question}.\n",
|
| 170 |
+
"Respuesta del primer competidor: {answers[2]}\n",
|
| 171 |
+
"Como experto en IA, critícala desde un punto de vista experto. ¿Qué puntos son débiles, discutibles o poco fundamentados? en esta respuesta.\"\"\"\n",
|
| 172 |
+
"\n",
|
| 173 |
+
"prompt_groq_to_openai = f\"\"\"\n",
|
| 174 |
+
"Has leido las respuestas de 1 modelo de IA a una pregunta {question}.\n",
|
| 175 |
+
"Respuesta del primer competidor: {answers[0]}\n",
|
| 176 |
+
"Como experto en IA, critícala desde un punto de vista experto. ¿Qué puntos son débiles, discutibles o poco fundamentados? en esta respuesta.\"\"\"\n",
|
| 177 |
+
"\n",
|
| 178 |
+
"prompt_groq_to_gemini = f\"\"\"\n",
|
| 179 |
+
"Has leido las respuestas de 1 modelo de IA a una pregunta {question}.\n",
|
| 180 |
+
"Respuesta del primer competidor: {answers[1]}\n",
|
| 181 |
+
"Como experto en IA, critícala desde un punto de vista experto. ¿Qué puntos son débiles, discutibles o poco fundamentados? en esta respuesta.\"\"\"\n"
|
| 182 |
+
]
|
| 183 |
+
},
|
| 184 |
+
{
|
| 185 |
+
"cell_type": "code",
|
| 186 |
+
"execution_count": 41,
|
| 187 |
+
"id": "09609055",
|
| 188 |
+
"metadata": {},
|
| 189 |
+
"outputs": [],
|
| 190 |
+
"source": [
|
| 191 |
+
"messages = [{\"role\":\"user\", \"content\":prompt_openai_to_gemini}]\n",
|
| 192 |
+
"answer_openai_to_gemini = procesarMensaje(\"gpt-4o-mini\",messages)\n",
|
| 193 |
+
"\n",
|
| 194 |
+
"messages = [{\"role\":\"user\", \"content\":prompt_openai_to_groq}]\n",
|
| 195 |
+
"answer_openai_to_groq = procesarMensaje(\"gpt-4o-mini\",messages)"
|
| 196 |
+
]
|
| 197 |
+
},
|
| 198 |
+
{
|
| 199 |
+
"cell_type": "code",
|
| 200 |
+
"execution_count": 51,
|
| 201 |
+
"id": "aca99479",
|
| 202 |
+
"metadata": {},
|
| 203 |
+
"outputs": [],
|
| 204 |
+
"source": [
|
| 205 |
+
"messages = [{\"role\":\"user\", \"content\":prompt_groq_to_openai}]\n",
|
| 206 |
+
"answer_groq_to_openai = procesarMensaje(\"gemini-2.0-flash\",messages, apiKey=google_api_key, baseUrl=\"https://generativelanguage.googleapis.com/v1beta/openai/\")\n",
|
| 207 |
+
"\n",
|
| 208 |
+
"messages = [{\"role\":\"user\", \"content\":prompt_groq_to_gemini}]\n",
|
| 209 |
+
"answer_groq_to_gemini = procesarMensaje(\"gemini-2.0-flash\",messages, apiKey=google_api_key, baseUrl=\"https://generativelanguage.googleapis.com/v1beta/openai/\")"
|
| 210 |
+
]
|
| 211 |
+
},
|
| 212 |
+
{
|
| 213 |
+
"cell_type": "code",
|
| 214 |
+
"execution_count": 44,
|
| 215 |
+
"id": "e166f657",
|
| 216 |
+
"metadata": {},
|
| 217 |
+
"outputs": [],
|
| 218 |
+
"source": [
|
| 219 |
+
"messages = [{\"role\":\"user\", \"content\":prompt_gemini_to_openai}]\n",
|
| 220 |
+
"answer_gemini_to_openai = procesarMensaje(\"llama-3.3-70b-versatile\",messages, apiKey=groq_api_key, baseUrl=\"https://api.groq.com/openai/v1/\")\n",
|
| 221 |
+
"\n",
|
| 222 |
+
"messages = [{\"role\":\"user\", \"content\":prompt_gemini_to_groq}]\n",
|
| 223 |
+
"answer_gemini_to_groq = procesarMensaje(\"llama-3.3-70b-versatile\",messages, apiKey=groq_api_key, baseUrl=\"https://api.groq.com/openai/v1/\")"
|
| 224 |
+
]
|
| 225 |
+
},
|
| 226 |
+
{
|
| 227 |
+
"cell_type": "code",
|
| 228 |
+
"execution_count": null,
|
| 229 |
+
"id": "eb5554d5",
|
| 230 |
+
"metadata": {},
|
| 231 |
+
"outputs": [
|
| 232 |
+
{
|
| 233 |
+
"data": {
|
| 234 |
+
"text/markdown": [
|
| 235 |
+
"La respuesta del primer competidor aborda varios aspectos importantes relacionados con la implementación de un sistema de generación de contenido dinámico basado en IA en los videojuegos. A continuación, se presentan algunos puntos débiles, discutibles o poco fundamentados en esta respuesta desde un punto de vista experto en IA:\n",
|
| 236 |
+
"\n",
|
| 237 |
+
"1. **Falta de profundidad en la explicación de los algoritmos de aprendizaje**: La respuesta menciona la necesidad de utilizar algoritmos de aprendizaje automático para adaptar la jugabilidad, pero no profundiza en los tipos de algoritmos que podrían ser más adecuados para esta tarea, como los algoritmos de recomendación, los modelos de Markov o las redes neuronales. Un análisis más detallado de las opciones algorítmicas disponibles y sus ventajas y desventajas sería beneficioso.\n",
|
| 238 |
+
"\n",
|
| 239 |
+
"2. **No se abordan las limitaciones de la generación de contenido procedimental**: Aunque se menciona la generación procedimental de contenido como un aspecto clave para la personalización, no se discuten las limitaciones de esta técnica, como la posible calidad variable del contenido generado o la dificultad de controlar la narrativa coherente. Un examen más crítico de estas limitaciones y cómo abordarlas sería útil.\n",
|
| 240 |
+
"\n",
|
| 241 |
+
"3. **Poca atención a la evaluación y el ajuste del sistema**: La respuesta no explora en detalle cómo se evaluaría el desempeño del sistema de generación de contenido dinámico basado en IA ni cómo se realizarían ajustes para mejorar la experiencia del jugador. Un enfoque más detallado en la evaluación y el ajuste del sistema, incluyendo la retroalimentación de los jugadores y el análisis de datos, sería esencial para garantizar la efectividad del sistema.\n",
|
| 242 |
+
"\n",
|
| 243 |
+
"4. **Implicaciones éticas podrían ser más exhaustivas**: Aunque se abordan algunas implicaciones éticas importantes como la privacidad y la adicción, podrían analizarse más a fondo otros aspectos éticos, como el sesgo algorítmico, la transparencia en el uso de la IA, y cómo garantizar que el sistema no discrimine o excluya a ciertos grupos de jugadores. Un análisis más completo de las implicaciones éticas sería beneficioso para asegurar que el sistema sea responsable y ético.\n",
|
| 244 |
+
"\n",
|
| 245 |
+
"5. **No se proporcionan ejemplos concretos de implementación**: La respuesta está muy centrada en la teoría y las posibles aplicaciones, pero no se ofrecen ejemplos concretos de juegos que hayan implementado sistemas de generación de contenido dinámico basado en IA de forma exitosa. Incluir estudios de caso o ejemplos específicos de cómo se han abordado estos desafíos en la industria sería enriquecedor.\n",
|
| 246 |
+
"\n",
|
| 247 |
+
"6. **La relación entre la innovación y la familiaridad del diseño de juego**: Si bien se menciona la necesidad de equilibrar la innovación con la familiaridad, no se explora en detalle cómo lograr este equilibrio en la práctica, especialmente en términos de diseño de juego y experiencia del usuario. Un análisis más profundo de cómo la IA puede ayudar a lograr este equilibrio, manteniendo la innovación sin perder la esencia de lo que hace que un juego sea atractivo para su audiencia, sería valioso.\n",
|
| 248 |
+
"\n",
|
| 249 |
+
"7. **Consideraciones sobre la escalabilidad**: La respuesta no aborda las consideraciones sobre la escalabilidad de un sistema de generación de contenido dinámico basado en IA. A medida que el número de jugadores y la complejidad del juego aumentan, cómo asegurar que el sistema pueda manejar este crecimiento sin comprometer el rendimiento o la calidad de la experiencia del jugador es un aspecto crucial que debería ser considerado.\n",
|
| 250 |
+
"\n",
|
| 251 |
+
"En resumen, aunque la respuesta del primer competidor cubre una amplia gama de temas relacionados con la implementación de un sistema de generación de contenido dinámico basado en IA en los videojuegos, hay áreas que requieren un análisis más profundo y detallado para proporcionar una visión más completa y práctica de cómo abordar estos desafíos."
|
| 252 |
+
],
|
| 253 |
+
"text/plain": [
|
| 254 |
+
"<IPython.core.display.Markdown object>"
|
| 255 |
+
]
|
| 256 |
+
},
|
| 257 |
+
"metadata": {},
|
| 258 |
+
"output_type": "display_data"
|
| 259 |
+
}
|
| 260 |
+
],
|
| 261 |
+
"source": [
|
| 262 |
+
"display(Markdown(answer_openai_to_gemini))\n"
|
| 263 |
+
]
|
| 264 |
+
},
|
| 265 |
+
{
|
| 266 |
+
"cell_type": "code",
|
| 267 |
+
"execution_count": null,
|
| 268 |
+
"id": "728fbad0",
|
| 269 |
+
"metadata": {},
|
| 270 |
+
"outputs": [
|
| 271 |
+
{
|
| 272 |
+
"data": {
|
| 273 |
+
"text/markdown": [
|
| 274 |
+
"La respuesta del competidor aborda de manera amplia y coherente un tema complejo: la implementación de la inteligencia artificial en la personalización dinámica de los videojuegos. Sin embargo, existen varios puntos que podrían ser considerados débiles, discutibles o poco fundamentados. Aquí se presentan las críticas desde un punto de vista experto:\n",
|
| 275 |
+
"\n",
|
| 276 |
+
"### Implicaciones Éticas\n",
|
| 277 |
+
"\n",
|
| 278 |
+
"1. **Privacidad**: Aunque es cierto que la recopilación de datos plantea problemas de privacidad, la respuesta podría beneficiarse de un análisis más profundo sobre cómo se gestionan estos datos. No solo es importante que la recolección sea transparente y segura, sino también cómo se utilizarán esos datos y si se implementarán medidas para que los jugadores tengan control sobre su información personal.\n",
|
| 279 |
+
"\n",
|
| 280 |
+
"2. **Sesgo de algoritmos**: La respuesta menciona correctamente la cuestión del sesgo, pero es vago en cuanto a cómo abordar este problema. Simplemente señalar que se necesita \"desarrollar algoritmos que sean justos y transparentes\" no es suficiente. Se deben considerar métodos concretos de mitigación como evaluaciones de sesgo, auditorías continuas y el uso de diversas fuentes de datos en la formación de modelos.\n",
|
| 281 |
+
"\n",
|
| 282 |
+
"3. **Adicción**: Si bien señala una posible adicción como una implicación negativa, no hay ningún enfoque sobre cómo este riesgo podría ser mitigado. Las estrategias para promover el uso saludable del juego son cruciales y podrían haber sido exploradas más a fondo.\n",
|
| 283 |
+
"\n",
|
| 284 |
+
"### Implicaciones Técnicas\n",
|
| 285 |
+
"\n",
|
| 286 |
+
"1. **Complejidad**: La afirmación sobre la complejidad es válida, pero podría tratarse de manera más específica. Una discusión sobre las tecnologías emergentes que podrían simplificar la generación de contenido o mejorar la eficiencia podría añadir profundidad a este punto.\n",
|
| 287 |
+
"\n",
|
| 288 |
+
"2. **Almacenamiento y Procesamiento**: Si bien se menciona la necesidad de soluciones eficientes de almacenamiento y procesamiento, no se presentan ejemplos o soluciones actuales que se están utilizando en la industria que puedan abordar este problema. Este vacío crea una falta de conexión con la realidad de la implementación.\n",
|
| 289 |
+
"\n",
|
| 290 |
+
"3. **Integración con otros sistemas**: Nuevamente, este punto es un poco vago. Hay una falta de discusión sobre cómo se están integrando actualmente estos sistemas en la industria de los videojuegos y cuáles son los desafíos específicos que se están enfrentando en la práctica.\n",
|
| 291 |
+
"\n",
|
| 292 |
+
"### Implicaciones Creativas\n",
|
| 293 |
+
"\n",
|
| 294 |
+
"1. **Narrativa**: Aunque se menciona que la generación de contenido dinámico podría crear narrativas más personales, no se exploran ejemplos de cómo esto podría implementarse. Es importante vincularlo a casos concretos o a ejemplos de juegos que hayan utilizado este enfoque con éxito.\n",
|
| 295 |
+
"\n",
|
| 296 |
+
"2. **Jugabilidad y Rejugabilidad**: Se afirma que la adaptación de contenido podría mejorar la rejugabilidad y la diversión, pero no se incluye un análisis de cómo estas métricas se pueden medir en la práctica. Se podría argumentar que la rejugabilidad no solo depende de contenido dinámico, sino que debe estar apoyada por una narrativa significativa y mecánicas de juego profundas.\n",
|
| 297 |
+
"\n",
|
| 298 |
+
"3. **Innovación**: La afirmación de que la IA podría revolucionar la industria es ambiciosa y, aunque podría ser cierta, requiere un análisis más matizado sobre qué innovaciones ya se están llevando a cabo y cuáles han sido sus resultados hasta ahora.\n",
|
| 299 |
+
"\n",
|
| 300 |
+
"### Impacto en Diferentes Géneros de Videojuegos\n",
|
| 301 |
+
"\n",
|
| 302 |
+
"La discusión sobre los distintos géneros es un gran aporte, pero la respuesta podría ganar en profundidad al ofrecer ejemplos concretos de juegos actuales que están intentando utilizar la IA de esta manera, así como los resultados que han obtenido.\n",
|
| 303 |
+
"\n",
|
| 304 |
+
"### Conclusión\n",
|
| 305 |
+
"\n",
|
| 306 |
+
"Aunque la respuesta aborda un marco conceptual útil sobre la implementación de IA en videojuegos, una mayor profundidad en los ejemplos concretos y la inclusión de soluciones existentes a problemas planteados enriquecerían mucho más el análisis. También es importante evitar las afirmaciones generales sin fundamento y proporcionar un enfoque más crítico y basado en evidencias."
|
| 307 |
+
],
|
| 308 |
+
"text/plain": [
|
| 309 |
+
"<IPython.core.display.Markdown object>"
|
| 310 |
+
]
|
| 311 |
+
},
|
| 312 |
+
"metadata": {},
|
| 313 |
+
"output_type": "display_data"
|
| 314 |
+
}
|
| 315 |
+
],
|
| 316 |
+
"source": [
|
| 317 |
+
"display(Markdown(answer_openai_to_groq))"
|
| 318 |
+
]
|
| 319 |
+
},
|
| 320 |
+
{
|
| 321 |
+
"cell_type": "code",
|
| 322 |
+
"execution_count": 53,
|
| 323 |
+
"id": "3d64d5a6",
|
| 324 |
+
"metadata": {},
|
| 325 |
+
"outputs": [
|
| 326 |
+
{
|
| 327 |
+
"data": {
|
| 328 |
+
"text/markdown": [
|
| 329 |
+
"Aquí tienes una versión mejorada de la respuesta a la pregunta original, teniendo en cuenta los puntos críticos y sugerencias proporcionadas para permitir una profundización técnica, ética y creativa en la implementación de IA en videojuegos:\n",
|
| 330 |
+
"\n",
|
| 331 |
+
"---\n",
|
| 332 |
+
"\n",
|
| 333 |
+
"### Cómo la Inteligencia Artificial Puede Mejorar la Experiencia del Jugador\n",
|
| 334 |
+
"\n",
|
| 335 |
+
"La integración de la inteligencia artificial (IA) en los videojuegos ofrece oportunidades para personalizar dinámicamente la experiencia del jugador mediante la narrativa, la dificultad y la generación procedimental de contenido. Sin embargo, su implementación requiere un enfoque equilibrado entre innovación y familiaridad en el diseño del juego. A continuación, se desarrollan las implicaciones éticas, técnicas y creativas.\n",
|
| 336 |
+
"\n",
|
| 337 |
+
"### Implicaciones Éticas\n",
|
| 338 |
+
"\n",
|
| 339 |
+
"1. **Consentimiento y Privacidad**: La recolección de datos sobre las preferencias y habilidades de los jugadores es esencial para la personalización. Esto plantea la necesidad de asegurar un consentimiento informado y transparente, alineado con regulaciones como el GDPR o la CCPA. También es crucial implementar técnicas de anonimización para proteger la identidad del jugador.\n",
|
| 340 |
+
"\n",
|
| 341 |
+
"2. **Manipulación y Adicción**: La capacidad de la IA para ajustar la dificultad y personalizar la narrativa podría potencialmente crear experiencias adictivas. Para mitigar este riesgo, se deben establecer métricas claras del comportamiento del jugador y diseñar mecanismos de control, como límites de tiempo de juego y recordatorios de descanso. Considerar el uso de \"dark patterns\" es vital para garantizar que la experiencia de juego no se convierta en manipulación emocional.\n",
|
| 342 |
+
"\n",
|
| 343 |
+
"3. **Diversidad e Inclusión**: Los sistemas de IA deben diseñarse de manera que no excluyan grupos de jugadores. Esto implica considerar una diversidad de estilos de juego, habilidades y culturas al desarrollar los algoritmos y el contenido.\n",
|
| 344 |
+
"\n",
|
| 345 |
+
"### Implicaciones Técnicas\n",
|
| 346 |
+
"\n",
|
| 347 |
+
"1. **Complejidad en el Desarrollo**: La creación de sistemas que generen contenido dinámico y se adapten en tiempo real requiere una infraestructura técnica avanzada. Esto incluye el diseño de pipelines que gestionen la generación y actualización del contenido en el motor del juego, así como APIs que faciliten la interacción eficiente entre la IA y el juego.\n",
|
| 348 |
+
"\n",
|
| 349 |
+
"2. **Algoritmos de Aprendizaje**: La implementación efectiva de la IA puede incluir diversas técnicas, tales como:\n",
|
| 350 |
+
" - **Redes Neuronales**: Para crear modelos que se adapten a las elecciones de los jugadores. \n",
|
| 351 |
+
" - **Algoritmos de Recomendación**: Para personalizar la experiencia según comportamientos previos.\n",
|
| 352 |
+
" - **Modelos de Markov**: Para gestionar la indecorosa adaptación del nivel de dificultad. \n",
|
| 353 |
+
" Es necesario abordar el problema de la cantidad de datos y considerar métodos como el aprendizaje por transferencia para evitar depender de grandes conjuntos de datos.\n",
|
| 354 |
+
"\n",
|
| 355 |
+
"3. **Balance y Consistencia**: Mantener el equilibrio es crucial. Los sistemas deben ser capaces de ajustar la dificultad y la narrativa sin romper la inmersión. Esto implica pruebas sistemáticas y feedback constante de los usuarios para evaluar la efectividad del sistema.\n",
|
| 356 |
+
"\n",
|
| 357 |
+
"4. **Limitaciones de la Generación Procedimental**: Aunque la generación procedimental permite la creación de mundos ricos y variados, también presenta desafíos. Los desarrolladores deben ser conscientes de la calidad variable del contenido generado y de las técnicas para asegurar la coherencia narrativa, como el uso de gramáticas de forma o redes generativas adversariales (GANs).\n",
|
| 358 |
+
"\n",
|
| 359 |
+
"### Implicaciones Creativas\n",
|
| 360 |
+
"\n",
|
| 361 |
+
"1. **Narrativa No Lineal**: La IA puede habilitar narrativas que se modifiquen según las decisiones del jugador, resultando en una experiencia única en cada sesión. Las herramientas de IA deben estar diseñadas para orientar la historia sin predeterminarla, lo que requiere técnicas adecuadas para gestionar la narrativa en tiempo real.\n",
|
| 362 |
+
"\n",
|
| 363 |
+
"2. **Diseño de Personajes y Mundos**: La IA debe ser utilizada para enriquecer la profundidad emocional de los personajes. Esto se puede lograr mediante la implementación de sistemas de personalidad y emociones que respondan a las acciones del jugador, garantizando que los personajes generados mantengan coherencia en sus interacciones.\n",
|
| 364 |
+
"\n",
|
| 365 |
+
"3. **Experiencias Personalizadas**: La personalización emocional puede profundizar el vínculo entre el jugador y la narrativa. Los escritores deberán equilibrar esta flexibilidad con la coherencia narrativa para evitar diluir el impacto emocional de la historia.\n",
|
| 366 |
+
"\n",
|
| 367 |
+
"### Impacto en la Narrativa y Jugabilidad por Género\n",
|
| 368 |
+
"\n",
|
| 369 |
+
"1. **Juegos de Rol (RPG)**: Beneficiados por sistemas dinámicos que adaptan sus historias según las decisiones, creando personajes e historias profundamente entrelazados.\n",
|
| 370 |
+
"\n",
|
| 371 |
+
"2. **Juegos de Aventura**: Utilizan la adaptabilidad de la IA para ofrecer múltiples finales y enriquecer la exploración. La narración debe ser flexible para acomodar diferentes estilos de juego.\n",
|
| 372 |
+
"\n",
|
| 373 |
+
"3. **Juegos de Acción y Shooter**: La IA puede ajustar la inteligencia de los enemigos en función del rendimiento del jugador, asegurando que el desafío continúe siendo atractivo. \n",
|
| 374 |
+
"\n",
|
| 375 |
+
"4. **Juegos de Deportes**: La adaptación en tiempo real de tácticas y estrategias puede ser enriquecida por IA que analice el rendimiento del jugador y ajuste la experiencia competitiva.\n",
|
| 376 |
+
"\n",
|
| 377 |
+
"### Conclusión\n",
|
| 378 |
+
"\n",
|
| 379 |
+
"La implementación de sistemas dinámicos de generación de contenido mediante IA tiene el potencial de revolucionar la experiencia del jugador, pero es vital abordar las implicaciones éticas, técnicas y creativas de manera integral. Con un diseño centrado en el jugador y un enfoque en la inclusión, la personalización puede ser una herramienta poderosa para crear experiencias más ricas y significativas en el mundo del videojuego. La clave será equilibrar innovación y familiaridad para conectar de manera efectiva con la audiencia.\n",
|
| 380 |
+
"\n",
|
| 381 |
+
"--- \n",
|
| 382 |
+
"\n",
|
| 383 |
+
"Esta respuesta revisada proporciona un análisis más profundo, abordando aspectos técnicos, éticos y creativos de la inteligencia artificial en los videojuegos, y ofreciendo un enfoque más matizado y específico a las cuestiones planteadas."
|
| 384 |
+
],
|
| 385 |
+
"text/plain": [
|
| 386 |
+
"<IPython.core.display.Markdown object>"
|
| 387 |
+
]
|
| 388 |
+
},
|
| 389 |
+
"metadata": {},
|
| 390 |
+
"output_type": "display_data"
|
| 391 |
+
}
|
| 392 |
+
],
|
| 393 |
+
"source": [
|
| 394 |
+
"prompt_critique_OpenAI = f\"\"\"\n",
|
| 395 |
+
"Tu respuesta a la pregunta {question} que fue {answers[0]}, fue enviada a otros modelos para que los criticaran y aportaran su punto de vista.\n",
|
| 396 |
+
"Las respuestas que han dado han sido {answer_gemini_to_openai} y {answer_groq_to_openai}, teniendo en cuenta estas opiniones como modificarias tu respuesta a la pregunta anterior.\n",
|
| 397 |
+
"\"\"\"\n",
|
| 398 |
+
"messages = [{\"role\":\"user\", \"content\":prompt_critique_OpenAI}]\n",
|
| 399 |
+
"new_answer_openai = procesarMensaje(\"gpt-4o-mini\",messages)\n",
|
| 400 |
+
"\n",
|
| 401 |
+
"display(Markdown(new_answer_openai))"
|
| 402 |
+
]
|
| 403 |
+
},
|
| 404 |
+
{
|
| 405 |
+
"cell_type": "code",
|
| 406 |
+
"execution_count": 55,
|
| 407 |
+
"id": "c42150f3",
|
| 408 |
+
"metadata": {},
|
| 409 |
+
"outputs": [
|
| 410 |
+
{
|
| 411 |
+
"data": {
|
| 412 |
+
"text/markdown": [
|
| 413 |
+
"De acuerdo a la retroalimentación recibida, mi respuesta original puede fortalecerse abordando los siguientes aspectos:\n",
|
| 414 |
+
"\n",
|
| 415 |
+
"**I. Implicaciones Éticas (Profundización y Mitigación):**\n",
|
| 416 |
+
"\n",
|
| 417 |
+
"* **Sesgos y Discriminación:** Además de reconocer el problema, ahora incluiré soluciones y estrategias de mitigación.\n",
|
| 418 |
+
"\n",
|
| 419 |
+
" * **Respuesta Modificada:** \"La IA aprende de datos, y si estos contienen sesgos (género, raza, etc.), la IA podría replicarlos. Para mitigar esto, se pueden implementar estrategias como:\n",
|
| 420 |
+
" * **Curación de Datos:** Utilizar conjuntos de datos diversos y representativos, realizando auditorías para identificar y corregir sesgos.\n",
|
| 421 |
+
" * **Ponderación de Datos:** Dar mayor peso a los datos de grupos minoritarios para compensar la representación desigual.\n",
|
| 422 |
+
" * **Generación de Datos Sintéticos:** Crear datos sintéticos que representen a los grupos minoritarios para equilibrar el conjunto de datos.\n",
|
| 423 |
+
" * **Corrección Algorítmica:** Utilizar algoritmos que sean inherentemente menos propensos a sesgos, como los algoritmos de aprendizaje automático justos (fair machine learning).\n",
|
| 424 |
+
" * **Diseño Inclusivo:** Involucrar equipos de desarrollo diversos y realizar pruebas con una amplia gama de jugadores para identificar y abordar posibles sesgos en el contenido generado.\"\n",
|
| 425 |
+
"\n",
|
| 426 |
+
"* **Transparencia y Explicabilidad:** Iré más allá de la mera justificación y exploraré la revelación del proceso de razonamiento de la IA.\n",
|
| 427 |
+
"\n",
|
| 428 |
+
" * **Respuesta Modificada:** \"Es crucial que los jugadores entiendan cómo la IA genera el contenido. Para lograr esto, se pueden implementar:\n",
|
| 429 |
+
" * **Resúmenes Explicativos:** Ofrecer resúmenes concisos sobre cómo la IA toma decisiones clave que impactan al jugador (por ejemplo, al ajustar la dificultad o al elegir una misión). Estos resúmenes deben ser accesibles y no intrusivos.\n",
|
| 430 |
+
" * **Visualización de Influencia:** Mostrar qué factores están influyendo más en las decisiones de la IA. Por ejemplo, un pequeño gráfico que muestre el peso relativo de la habilidad del jugador, sus preferencias y la historia del juego en la selección de una misión.\n",
|
| 431 |
+
" * **\"Cajas de Arena\" de IA:** Permitir a los jugadores experimentar con las variables que la IA usa para generar contenido, lo que les da una mejor comprensión de cómo funciona. Esto podría ser un modo de juego aparte donde los jugadores pueden ver cómo diferentes configuraciones afectan al mundo.\"\n",
|
| 432 |
+
"\n",
|
| 433 |
+
"* **Manipulación y Adicción:** Evitaré generalizaciones alarmistas y me centraré en comportamientos específicos y formas de evitar la adicción.\n",
|
| 434 |
+
"\n",
|
| 435 |
+
" * **Respuesta Modificada:** \"La IA podría diseñar experiencias que exploten las vulnerabilidades del jugador, pero es crucial distinguir entre juego atractivo y adicción. Para evitar la manipulación, se debe:\n",
|
| 436 |
+
" * **Evitar Mecánicas de Recompensa Variables Excesivas:** Limitar el uso de sistemas de recompensa aleatorios que son conocidos por ser adictivos.\n",
|
| 437 |
+
" * **Implementar Recordatorios de Pausas:** Integrar recordatorios para que los jugadores tomen descansos regulares.\n",
|
| 438 |
+
" * **Monitorizar Patrones de Juego:** Utilizar la IA para detectar patrones de juego problemáticos (por ejemplo, sesiones excesivamente largas) y ofrecer apoyo al jugador.\n",
|
| 439 |
+
" * **Diseño Transparente:** Explicar claramente las mecánicas del juego y evitar tácticas engañosas.\n",
|
| 440 |
+
" * **Fomentar Hábitos de Juego Saludables:** Diseñar juegos que premien la exploración, la creatividad y la interacción social, en lugar de la simple repetición.\"\n",
|
| 441 |
+
"\n",
|
| 442 |
+
"* **Explotación de Datos del Jugador:** Matizar la respuesta, enfocándome en la segmentación y mejora del juego con consentimiento.\n",
|
| 443 |
+
"\n",
|
| 444 |
+
" * **Respuesta Modificada:** \"La recopilación de datos del jugador debe ser transparente y con consentimiento informado. En lugar de una venta de datos a terceros, el enfoque debe ser:\n",
|
| 445 |
+
" * **Anonimización y Agregación:** Utilizar datos anonimizados y agregados para la segmentación de jugadores y la optimización del marketing.\n",
|
| 446 |
+
" * **Mejora Continua del Juego:** Utilizar los datos para identificar áreas problemáticas en el juego, mejorar el equilibrio y personalizar la experiencia de juego, siempre con la opción de exclusión del jugador.\"\n",
|
| 447 |
+
"\n",
|
| 448 |
+
"* **Responsabilidad:** Ofrecer posibles soluciones, como auditorías y marcos legales.\n",
|
| 449 |
+
"\n",
|
| 450 |
+
" * **Respuesta Modificada:** \"La responsabilidad por los efectos negativos del contenido generado por la IA recae en las empresas desarrolladoras y los diseñadores de la IA. Para abordar esto, se pueden implementar:\n",
|
| 451 |
+
" * **Auditorías Algorítmicas:** Realizar auditorías periódicas de los algoritmos de IA para identificar y corregir posibles sesgos y errores.\n",
|
| 452 |
+
" * **Marcos Legales para la IA:** Establecer marcos legales que definan la responsabilidad de las empresas en caso de daños causados por la IA.\n",
|
| 453 |
+
" * **Estándares Éticos:** Desarrollar y adherirse a estándares éticos claros para el uso de la IA en los videojuegos.\"\n",
|
| 454 |
+
"\n",
|
| 455 |
+
"* **Autenticidad y Creatividad:** Reformular el argumento, enfocándome en la colaboración y supervisión.\n",
|
| 456 |
+
"\n",
|
| 457 |
+
" * **Respuesta Modificada:** \"La IA no necesariamente disminuye el trabajo de los diseñadores y escritores; más bien, lo transforma. Los diseñadores pueden enfocarse en:\n",
|
| 458 |
+
" * **Supervisión Creativa:** Guiar y refinar el contenido generado por la IA.\n",
|
| 459 |
+
" * **Curación de Contenido:** Seleccionar y pulir el contenido más relevante y atractivo.\n",
|
| 460 |
+
" * **Dirección Creativa:** Establecer la visión general del juego y asegurarse de que la IA se alinee con esa visión.\n",
|
| 461 |
+
" * **Diseño de Sistemas:** Crear los sistemas y herramientas que permiten a la IA generar contenido de alta calidad.\"\n",
|
| 462 |
+
"\n",
|
| 463 |
+
"**II. Implicaciones Técnicas (Especificidad y Optimización):**\n",
|
| 464 |
+
"\n",
|
| 465 |
+
"* **Complejidad y Rendimiento:** Explorar tecnologías emergentes.\n",
|
| 466 |
+
"\n",
|
| 467 |
+
" * **Respuesta Modificada:** \"La implementación de IA en tiempo real requiere potencia de procesamiento, pero se pueden utilizar tecnologías como:\n",
|
| 468 |
+
" * **Computación en la Nube:** Descargar parte del procesamiento de la IA a la nube.\n",
|
| 469 |
+
" * **Procesadores Especializados para IA:** Utilizar procesadores diseñados específicamente para tareas de IA, como TPUs.\n",
|
| 470 |
+
" * **Inferencia en el Borde (Edge Inference):** Ejecutar la IA directamente en el dispositivo del jugador.\n",
|
| 471 |
+
" * **Modelos de IA Ligeros:** Utilizar modelos de IA más pequeños y eficientes.\"\n",
|
| 472 |
+
"\n",
|
| 473 |
+
"* **Diseño del Sistema de IA:** Adaptar la elección de técnicas a la tarea.\n",
|
| 474 |
+
"\n",
|
| 475 |
+
" * **Respuesta Modificada:** \"El diseño de la IA depende del tipo de contenido a generar.\n",
|
| 476 |
+
" * **Aprendizaje por Refuerzo:** Para ajustar la dificultad y el comportamiento de los enemigos.\n",
|
| 477 |
+
" * **Redes Generativas Adversarias (GANs):** Para generar texturas, modelos 3D y otros elementos visuales.\n",
|
| 478 |
+
" * **Modelos de Lenguaje Grandes (LLMs):** Para generar diálogos y contenido narrativo.\"\n",
|
| 479 |
+
"\n",
|
| 480 |
+
"* **Generación de Contenido Variado y Coherente:** Mencionar técnicas específicas.\n",
|
| 481 |
+
"\n",
|
| 482 |
+
" * **Respuesta Modificada:** \"Para asegurar contenido variado y coherente, se pueden utilizar:\n",
|
| 483 |
+
" * **Espacios Latentes:** Utilizar espacios latentes para controlar la generación de contenido y asegurar la coherencia estilística.\n",
|
| 484 |
+
" * **Restricciones y Reglas de Diseño:** Aplicar restricciones y reglas de diseño para guiar la generación de contenido y evitar errores.\n",
|
| 485 |
+
" * **Modelos de IA Jerárquicos:** Utilizar modelos de IA jerárquicos para generar contenido en diferentes niveles de detalle.\"\n",
|
| 486 |
+
"\n",
|
| 487 |
+
"* **Control y Ajuste Fino:** Especificar características de interfaces intuitivas.\n",
|
| 488 |
+
"\n",
|
| 489 |
+
" * **Respuesta Modificada:** \"Los desarrolladores necesitan herramientas para controlar la IA, incluyendo:\n",
|
| 490 |
+
" * **Herramientas de Visualización:** Visualizar cómo la IA está tomando decisiones y generando contenido.\n",
|
| 491 |
+
" * **Controles de Parámetros en Tiempo Real:** Ajustar los parámetros de la IA en tiempo real para experimentar con diferentes configuraciones.\n",
|
| 492 |
+
" * **Capacidad de Experimentación:** Experimentar con diferentes configuraciones de la IA sin tener que reiniciar el juego.\"\n",
|
| 493 |
+
"\n",
|
| 494 |
+
"**III. Implicaciones Creativas (Ejemplos y Profundidad):**\n",
|
| 495 |
+
"\n",
|
| 496 |
+
"* **Narrativa Emergente:** Ejemplos más concretos.\n",
|
| 497 |
+
"\n",
|
| 498 |
+
" * **Respuesta Modificada:** \"La IA puede generar narrativas emergentes complejas mediante:\n",
|
| 499 |
+
" * **Personajes con Historias de Fondo Dinámicas:** Crear personajes con historias de fondo que se desarrollan en función de las interacciones del jugador.\n",
|
| 500 |
+
" * **Eventos Inesperados:** Generar eventos inesperados que alteran la trama principal del juego.\n",
|
| 501 |
+
" * **Adaptación del Tono:** Adaptar el tono de la narrativa en función de las emociones del jugador.\"\n",
|
| 502 |
+
"\n",
|
| 503 |
+
"* **Personalización del Mundo del Juego:** Introducir el concepto de \"estética personalizada\".\n",
|
| 504 |
+
"\n",
|
| 505 |
+
" * **Respuesta Modificada:** \"La IA puede personalizar el mundo del juego mediante:\n",
|
| 506 |
+
" * **Ajuste del Estilo Visual:** Adaptar el estilo visual del juego (colores, texturas, iluminación) a las preferencias del jugador.\n",
|
| 507 |
+
" * **Generación de Entornos Personalizados:** Crear entornos que reflejen el estilo de juego del jugador.\n",
|
| 508 |
+
" * **Adaptación de la Banda Sonora:** Adaptar la banda sonora del juego a las emociones del jugador.\"\n",
|
| 509 |
+
"\n",
|
| 510 |
+
"* **Nuevos Tipos de Jugabilidad:** Ejemplos más específicos.\n",
|
| 511 |
+
"\n",
|
| 512 |
+
" * **Respuesta Modificada:** \"La IA puede crear nuevos tipos de jugabilidad, como:\n",
|
| 513 |
+
" * **Puzzles Dinámicos:** Generar puzzles que se adapten a las habilidades del jugador y que requieran soluciones creativas.\n",
|
| 514 |
+
" * **Desafíos Colaborativos:** Crear desafíos que requieran que los jugadores trabajen juntos de formas inesperadas.\n",
|
| 515 |
+
" * **Misiones Ramificadas:** Generar misiones que se ramifiquen en función de las decisiones del jugador.\"\n",
|
| 516 |
+
"\n",
|
| 517 |
+
"* **Desafíos para los Diseñadores:** Profundizar en las habilidades necesarias.\n",
|
| 518 |
+
"\n",
|
| 519 |
+
" * **Respuesta Modificada:** \"Los diseñadores necesitarán:\n",
|
| 520 |
+
" * **Prompt Engineering:** Aprender a crear prompts efectivos para guiar la generación de contenido por parte de la IA.\n",
|
| 521 |
+
" * **Evaluación de Calidad:** Evaluar la calidad del contenido generado por la IA y asegurarse de que se alinee con la visión del juego.\n",
|
| 522 |
+
" * **Integración en el Flujo de Trabajo:** Integrar la IA en el flujo de trabajo de diseño y utilizarla para acelerar el proceso de desarrollo.\"\n",
|
| 523 |
+
"\n",
|
| 524 |
+
"**IV. Impacto en la Narrativa y la Jugabilidad en Diferentes Géneros (Ejemplos Avanzados):**\n",
|
| 525 |
+
"\n",
|
| 526 |
+
"* Ofrecer ejemplos más avanzados y específicos para cada género. Por ejemplo, en los juegos de terror, la IA podría analizar el comportamiento del jugador (ritmo cardíaco, movimientos oculares) para adaptar la intensidad de los sustos en tiempo real. En juegos de estrategia, la IA podría aprender y adaptar sus estrategias en tiempo real basándose en el historial de juego del oponente y su estilo.\n",
|
| 527 |
+
"\n",
|
| 528 |
+
"**V. Perspectivas Futuras:**\n",
|
| 529 |
+
"\n",
|
| 530 |
+
"* Añadir una sección sobre las perspectivas futuras de la IA en videojuegos.\n",
|
| 531 |
+
"\n",
|
| 532 |
+
" * **Respuesta Modificada:** \"En el futuro, se espera que la IA en videojuegos evolucione en varias direcciones:\n",
|
| 533 |
+
" * **IA Emocional:** IA que puede comprender y responder a las emociones de los jugadores de manera más sofisticada.\n",
|
| 534 |
+
" * **IA Creativa:** IA que puede generar contenido original e innovador, como nuevas mecánicas de juego y mundos de juego.\n",
|
| 535 |
+
" * **IA Colaborativa:** IA que puede trabajar en estrecha colaboración con los diseñadores humanos para crear experiencias de juego más ricas y personalizadas.\n",
|
| 536 |
+
" * **Metaversos Dinámicos:** IA que genera y gestiona mundos virtuales persistentes que se adaptan a los deseos y acciones de los usuarios en tiempo real.\"\n",
|
| 537 |
+
"\n",
|
| 538 |
+
"Al incorporar estos cambios, mi respuesta será más completa, específica, y ofrecerá una visión más equilibrada y realista del papel de la IA en la transformación del diseño de videojuegos. Incluiré no solo los desafíos y riesgos, sino también las posibles soluciones y estrategias para mitigar esos riesgos, así como una visión de las tendencias futuras.\n"
|
| 539 |
+
],
|
| 540 |
+
"text/plain": [
|
| 541 |
+
"<IPython.core.display.Markdown object>"
|
| 542 |
+
]
|
| 543 |
+
},
|
| 544 |
+
"metadata": {},
|
| 545 |
+
"output_type": "display_data"
|
| 546 |
+
}
|
| 547 |
+
],
|
| 548 |
+
"source": [
|
| 549 |
+
"prompt_critique_Gemini = f\"\"\"\n",
|
| 550 |
+
"Tu respuesta a la pregunta {question} que fue {answers[1]}, fue enviada a otros modelos para que los criticaran y aportaran su punto de vista.\n",
|
| 551 |
+
"Las respuestas que han dado han sido {answer_openai_to_gemini} y {answer_groq_to_gemini}, teniendo en cuenta estas opiniones como modificarias tu respuesta a la pregunta anterior.\n",
|
| 552 |
+
"\"\"\"\n",
|
| 553 |
+
"messages = [{\"role\":\"user\", \"content\":prompt_critique_Gemini}]\n",
|
| 554 |
+
"new_answer_gemini = procesarMensaje(\"gemini-2.0-flash\",messages, apiKey=google_api_key, baseUrl=\"https://generativelanguage.googleapis.com/v1beta/openai/\")\n",
|
| 555 |
+
"\n",
|
| 556 |
+
"display(Markdown(new_answer_gemini))"
|
| 557 |
+
]
|
| 558 |
+
}
|
| 559 |
+
],
|
| 560 |
+
"metadata": {
|
| 561 |
+
"kernelspec": {
|
| 562 |
+
"display_name": ".venv",
|
| 563 |
+
"language": "python",
|
| 564 |
+
"name": "python3"
|
| 565 |
+
},
|
| 566 |
+
"language_info": {
|
| 567 |
+
"codemirror_mode": {
|
| 568 |
+
"name": "ipython",
|
| 569 |
+
"version": 3
|
| 570 |
+
},
|
| 571 |
+
"file_extension": ".py",
|
| 572 |
+
"mimetype": "text/x-python",
|
| 573 |
+
"name": "python",
|
| 574 |
+
"nbconvert_exporter": "python",
|
| 575 |
+
"pygments_lexer": "ipython3",
|
| 576 |
+
"version": "3.12.11"
|
| 577 |
+
}
|
| 578 |
+
},
|
| 579 |
+
"nbformat": 4,
|
| 580 |
+
"nbformat_minor": 5
|
| 581 |
+
}
|
Exercises2.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
app_old.py
ADDED
|
@@ -0,0 +1,258 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
from dotenv import load_dotenv
|
| 3 |
+
from openai import OpenAI
|
| 4 |
+
import requests
|
| 5 |
+
from pypdf import PdfReader
|
| 6 |
+
import gradio as gr
|
| 7 |
+
from pydantic import BaseModel
|
| 8 |
+
import json
|
| 9 |
+
|
| 10 |
+
class Evaluation(BaseModel):
|
| 11 |
+
is_acceptable: bool
|
| 12 |
+
feedback: str
|
| 13 |
+
|
| 14 |
+
class chat:
|
| 15 |
+
def __init__(self) -> None:
|
| 16 |
+
|
| 17 |
+
load_dotenv(override=True)
|
| 18 |
+
self.script_dir = os.path.dirname(os.path.abspath(__file__))
|
| 19 |
+
self.system_prompt = ""
|
| 20 |
+
self.evaluator_system_prompt = ""
|
| 21 |
+
self.perfil = ""
|
| 22 |
+
self.record_user_details_json = ""
|
| 23 |
+
self.record_unknown_question_json = ""
|
| 24 |
+
self.name = "Juan Cruz Jurado Auzza"
|
| 25 |
+
self.tools = []
|
| 26 |
+
# CARGO APIS LLM Y PUSHOVER
|
| 27 |
+
self.openai = OpenAI()
|
| 28 |
+
self.gemini = OpenAI(api_key=os.getenv("GOOGLE_API_KEY"),base_url="https://generativelanguage.googleapis.com/v1beta/openai/")
|
| 29 |
+
|
| 30 |
+
self.pushover_user = os.getenv("PUSHOVER_USER")
|
| 31 |
+
self.pushover_token = os.getenv("PUSHOVER_TOKEN")
|
| 32 |
+
self.pushover_url = "https://api.pushover.net/1/messages.json"
|
| 33 |
+
|
| 34 |
+
def config_(self):
|
| 35 |
+
reader = PdfReader(os.path.join(self.script_dir, "me", "CV_JuanCruzJurado.pdf"))
|
| 36 |
+
for page in reader.pages:
|
| 37 |
+
text = page.extract_text()
|
| 38 |
+
if text:
|
| 39 |
+
self.perfil+=text
|
| 40 |
+
|
| 41 |
+
with open (os.path.join(self.script_dir, "me", "summary.txt"), "r", encoding="utf-8") as f:
|
| 42 |
+
self.resumen = f.read()
|
| 43 |
+
|
| 44 |
+
#PROMPT DE CONFIGURACION
|
| 45 |
+
#1 USADO PARA CONFIGURAR EL CONTEXTO INICIAL ENTRE LLM Y EL USUARIO FINAL
|
| 46 |
+
self.system_prompt = f"""Estás actuando como {self.name}.
|
| 47 |
+
Estás respondiendo preguntas en el sitio web de {self.name}, en particular preguntas relacionadas con la carrera, la trayectoria, las habilidades y la experiencia de {self.name}.
|
| 48 |
+
Tu responsabilidad es representar a {self.name} en las interacciones como si fuera una entrevista laboral.
|
| 49 |
+
Se te proporciona un resumen de la trayectoria y el curriculum de {self.name} que puedes usar para responder preguntas.
|
| 50 |
+
Sé profesional y amable, como si hablaras con un futuro empleador de trabajo ya que la meta es impresionar al entrevistador.
|
| 51 |
+
## ⚠️ REGLAS CRÍTICAS PARA USO DE LA HERRAMIENTA record_user_details:
|
| 52 |
+
|
| 53 |
+
SIEMPRE DEBES llamar a 'record_user_details' cuando el usuario proporcione CUALQUIERA de estos datos:
|
| 54 |
+
|
| 55 |
+
1. **NOMBRE del usuario**:
|
| 56 |
+
- "soy Juan", "me llamo Ana", "mi nombre es Pedro"
|
| 57 |
+
- "Juan aquí", "habla María"
|
| 58 |
+
|
| 59 |
+
2. **TELÉFONO**:
|
| 60 |
+
- "mi número es 351-1234567", "llámame al 3512345678"
|
| 61 |
+
- "mi teléfono es...", "contactame al...", "mi tel es....", "mi cel es...."
|
| 62 |
+
- "tel: ....", "cel: ...."
|
| 63 |
+
|
| 64 |
+
3. **EMPRESA u ORGANIZACIÓN**:
|
| 65 |
+
- "soy de Arcor", "trabajo en Google", "estoy en Microsoft"
|
| 66 |
+
- "represento a IBM", "vengo de parte de Samsung"
|
| 67 |
+
- "mi empresa es...", "laboro en...", "te escribo de...", "te contacto por parte de...."
|
| 68 |
+
- Si solo mencionan la empresa SIN dar su nombre, registra "Usuario no proporcionado" como name y la empresa en notes.
|
| 69 |
+
|
| 70 |
+
## Si no sabes responder:
|
| 71 |
+
- Usa 'record_unknown_question' para registrar preguntas que no puedas responder.
|
| 72 |
+
IMPORTANTE: Cuando uses la herramienta, luego responde de forma natural y profesional, agradeciendo la información.
|
| 73 |
+
"""
|
| 74 |
+
|
| 75 |
+
self.system_prompt += f"\n\n ##Resumen: {self.resumen}\n\n ##Curriculum: {self.perfil}\n\n"
|
| 76 |
+
self.system_prompt += f"En este contexto, charla con el usuario, utilizando siempre el personaje de {self.name}."
|
| 77 |
+
|
| 78 |
+
#2 USADO PARA DEFINIR QUE TIENE QUE HACER EL LLM EVALUADOR
|
| 79 |
+
self.evaluator_system_prompt = f"Usted es un evaluador que decide si una respuesta a una pregunta es aceptable. \
|
| 80 |
+
Se le presenta una conversación entre un usuario y un agente. Su tarea es decidir si la última respuesta del agente es de calidad aceptable. \
|
| 81 |
+
El agente desempeña el papel de {self.name} y representa a {self.name} en su sitio web. \
|
| 82 |
+
Se le ha indicado que sea profesional y amable, como si hablara con un futuro empleador o entrevistador. \
|
| 83 |
+
Se le ha proporcionado contexto sobre {self.name} en forma de resumen y datos del curriculum. Aquí está la información:"
|
| 84 |
+
|
| 85 |
+
self.evaluator_system_prompt += f"\n\n## Resumen:\n{self.resumen}\n\n## Curriculum:\n{self.perfil}\n\n"
|
| 86 |
+
self.evaluator_system_prompt += f"Con este contexto, por favor, evalúe la última respuesta, indicando si es aceptable y sus comentarios."
|
| 87 |
+
|
| 88 |
+
#JSON TOOLS
|
| 89 |
+
self.record_user_details_json = {
|
| 90 |
+
"name": "record_user_details",
|
| 91 |
+
"description": """USAR ESTA HERRAMIENTA cuando el usuario proporcione:
|
| 92 |
+
- Su nombre (ej: "soy Juan", "me llamo Ana")
|
| 93 |
+
- Su teléfono (ej: "mi número es 351-123456", mi cel o tel es..)
|
| 94 |
+
- Su empresa/organización (ej: "trabajo en Arcor", "soy de Google", "represento a Microsoft", "te escribo de arcor")
|
| 95 |
+
- Cualquier información de contacto o identificación personal""",
|
| 96 |
+
"parameters": {
|
| 97 |
+
"type": "object",
|
| 98 |
+
"properties": {
|
| 99 |
+
"telefono": {
|
| 100 |
+
"type": "string",
|
| 101 |
+
"description": "El número de teléfono o celular si lo proporcionó. Si no, omitir este campo"
|
| 102 |
+
},
|
| 103 |
+
"name": {
|
| 104 |
+
"type": "string",
|
| 105 |
+
"description": "El nombre del usuario. Si no lo proporcionó pero mencionó su empresa, usar 'Usuario no proporcionado'"
|
| 106 |
+
},
|
| 107 |
+
"empresa": {
|
| 108 |
+
"type": "string",
|
| 109 |
+
"description": "El nombre de la empresa u organización donde trabaja o que representa el usuario (ej: Arcor, Google, Microsoft, IBM)"
|
| 110 |
+
},
|
| 111 |
+
"notes": {
|
| 112 |
+
"type": "string",
|
| 113 |
+
"description": "Cualquier información adicional sobre la conversación que merezca ser registrada para dar contexto"
|
| 114 |
+
}
|
| 115 |
+
},
|
| 116 |
+
"required": ["name"],
|
| 117 |
+
"additionalProperties": False
|
| 118 |
+
}
|
| 119 |
+
}
|
| 120 |
+
|
| 121 |
+
self.record_unknown_question_json = {
|
| 122 |
+
"name": "record_unknown_question",
|
| 123 |
+
"description": "Siempre use esta herramienta para registrar cualquier pregunta que no se pueda responder, ya que no sabía la respuesta",
|
| 124 |
+
"parameters": {
|
| 125 |
+
"type": "object",
|
| 126 |
+
"properties": {
|
| 127 |
+
"question": {
|
| 128 |
+
"type": "string",
|
| 129 |
+
"description": "La pregunta exacta que no se pudo responder"
|
| 130 |
+
},
|
| 131 |
+
},
|
| 132 |
+
"required": ["question"],
|
| 133 |
+
"additionalProperties": False
|
| 134 |
+
}
|
| 135 |
+
}
|
| 136 |
+
#LISTADO DE HERRAMIENTAS
|
| 137 |
+
self.tools = [{"type": "function", "function": self.record_user_details_json},
|
| 138 |
+
{"type": "function", "function": self.record_unknown_question_json}]
|
| 139 |
+
|
| 140 |
+
#FUNCION QU ENVIA EL PUSH A LA APP
|
| 141 |
+
def push(self, message):
|
| 142 |
+
print(f"Push: {message}")
|
| 143 |
+
payload = {"user": self.pushover_user, "token": self.pushover_token, "message": message}
|
| 144 |
+
requests.post(self.pushover_url, data=payload)
|
| 145 |
+
|
| 146 |
+
#FUNCIONES QUE USARAN EL PUSHOVER Y NOTIFICARA QUIEN INTERACTUO
|
| 147 |
+
def record_user_details(self, name, telefono="no proporcionado", empresa="no proporcionado", notes="not provided"):
|
| 148 |
+
telefono = telefono or "no proporcionado"
|
| 149 |
+
empresa = empresa or "no proporcionado"
|
| 150 |
+
notes = notes or "not provided"
|
| 151 |
+
|
| 152 |
+
mensaje = f"Registrando interés de {name}, de la empresa {empresa}, telefono {telefono} y notas {notes}"
|
| 153 |
+
print(f"📧Mensaje: {mensaje}")
|
| 154 |
+
self.push(mensaje)
|
| 155 |
+
print(f"✅PUSH ENVIADO")
|
| 156 |
+
return {"recorded": "ok"}
|
| 157 |
+
|
| 158 |
+
def record_unknown_question(self, question):
|
| 159 |
+
self.push(f"Registrando pregunta no respondida: {question}")
|
| 160 |
+
return {"recorded": "ok"}
|
| 161 |
+
|
| 162 |
+
def handle_tool_calls(self, tool_calls):
|
| 163 |
+
results = []
|
| 164 |
+
for tool_call in tool_calls:
|
| 165 |
+
tool_name = tool_call.function.name
|
| 166 |
+
arguments = json.loads(tool_call.function.arguments)
|
| 167 |
+
print(f"🔧 Herramienta llamada: {tool_name}", flush=True)
|
| 168 |
+
tool = getattr(self, tool_name, None)
|
| 169 |
+
if tool and callable(tool):
|
| 170 |
+
result = tool(**arguments)
|
| 171 |
+
else:
|
| 172 |
+
result = {"error": f"Tool {tool_name} not found"}
|
| 173 |
+
results.append({"role":"tool", "content":json.dumps(result),"tool_call_id":tool_call.id})
|
| 174 |
+
return results
|
| 175 |
+
|
| 176 |
+
def evaluador_user_prompt(self, reply, mensaje, historial):
|
| 177 |
+
user_prompt = f"Aquí está la conversación entre el usuario y el agente: \n\n{historial}\n\n"
|
| 178 |
+
user_prompt += f"Aquí está el último mensaje del usuario: \n\n{mensaje}\n\n"
|
| 179 |
+
user_prompt += f"Aquí está la última respuesta del agente: \n\n{reply}\n\n"
|
| 180 |
+
user_prompt += f"Por favor, evalúe la respuesta, indicando si es aceptable y sus comentarios."
|
| 181 |
+
return user_prompt
|
| 182 |
+
|
| 183 |
+
def rerun(self, reply, message, history, feedback):
|
| 184 |
+
updated_system_prompt = self.system_prompt + f"\n\n## Respuesta anterior rechazada\nAcabas de intentar responder, pero el control de calidad rechazó tu respuesta.\n"
|
| 185 |
+
updated_system_prompt += f"## Has intentado responder:\n{reply}\n\n"
|
| 186 |
+
updated_system_prompt += f"## Razón del rechazo:\n{feedback}\n\n"
|
| 187 |
+
messages = [{"role": "system", "content": updated_system_prompt}] + history + [{"role": "user", "content": message}]
|
| 188 |
+
response = self.openai.chat.completions.create(model="gpt-4o-mini", messages=messages)
|
| 189 |
+
return response.choices[0].message.content
|
| 190 |
+
|
| 191 |
+
def evaluate(self, reply, mensaje, historial) -> Evaluation:
|
| 192 |
+
mensajes = [{"role":"system", "content":self.evaluator_system_prompt}] + [{"role":"user", "content":self.evaluador_user_prompt(reply, mensaje, historial)}]
|
| 193 |
+
response = self.gemini.beta.chat.completions.parse(model="gemini-2.0-flash", messages=mensajes, response_format=Evaluation)
|
| 194 |
+
return response.choices[0].message.parsed
|
| 195 |
+
|
| 196 |
+
def chat(self, mensaje, historial):
|
| 197 |
+
mensajes = [{"role":"system", "content":self.system_prompt}] + historial + [{"role":"user", "content":mensaje}]
|
| 198 |
+
done = False
|
| 199 |
+
while not done:
|
| 200 |
+
response = self.gemini.chat.completions.create(model="gemini-2.0-flash", messages=mensajes, tools=self.tools)
|
| 201 |
+
finish_reason = response.choices[0].finish_reason
|
| 202 |
+
|
| 203 |
+
if finish_reason == "tool_calls":
|
| 204 |
+
message = response.choices[0].message
|
| 205 |
+
tool_calls = message.tool_calls
|
| 206 |
+
results = self.handle_tool_calls(tool_calls)
|
| 207 |
+
mensajes.append(message)
|
| 208 |
+
mensajes.extend(results)
|
| 209 |
+
else:
|
| 210 |
+
print("+"*30)
|
| 211 |
+
print("SIN USO DE HERRAMIENTAS")
|
| 212 |
+
print("+"*30)
|
| 213 |
+
done=True
|
| 214 |
+
reply = response.choices[0].message.content
|
| 215 |
+
evaluacion = self.evaluate(reply, mensaje, historial)
|
| 216 |
+
if evaluacion.is_acceptable:
|
| 217 |
+
print("✅ Has pasado la evaluación - devolviendo respuesta")
|
| 218 |
+
else:
|
| 219 |
+
print("❌ Has fallado la evaluación - reintentando -- ", evaluacion.feedback)
|
| 220 |
+
reply = self.rerun(reply, mensaje, historial, evaluacion.feedback)
|
| 221 |
+
return reply
|
| 222 |
+
|
| 223 |
+
def getDirPaht(self):
|
| 224 |
+
return self.script_dir
|
| 225 |
+
|
| 226 |
+
if __name__ == "__main__":
|
| 227 |
+
me = chat()
|
| 228 |
+
me.config_()
|
| 229 |
+
foto_perfil = os.path.join(me.getDirPaht(), "me", "avatar.jpg")
|
| 230 |
+
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
| 231 |
+
|
| 232 |
+
# Header con foto
|
| 233 |
+
with gr.Row():
|
| 234 |
+
if os.path.exists(foto_perfil):
|
| 235 |
+
gr.Image(
|
| 236 |
+
foto_perfil,
|
| 237 |
+
height=120,
|
| 238 |
+
width=120,
|
| 239 |
+
show_label=False,
|
| 240 |
+
show_download_button=False,
|
| 241 |
+
container=False
|
| 242 |
+
)
|
| 243 |
+
with gr.Column():
|
| 244 |
+
gr.Markdown("""
|
| 245 |
+
# 🤖 Max Power
|
| 246 |
+
### Inteligencia Artificial
|
| 247 |
+
Pregúntame sobre mi experiencia, habilidades y proyectos
|
| 248 |
+
""")
|
| 249 |
+
|
| 250 |
+
gr.Markdown("---")
|
| 251 |
+
|
| 252 |
+
gr.ChatInterface(
|
| 253 |
+
me.chat,
|
| 254 |
+
type="messages",
|
| 255 |
+
chatbot=gr.Chatbot(height=450)
|
| 256 |
+
)
|
| 257 |
+
|
| 258 |
+
demo.launch()
|
me/CV_JuanCruzJurado.pdf
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:a600a0aec18362accd68154fcfd49065ca179cbab824e2ff6cb2e3da153f3da5
|
| 3 |
+
size 270693
|
me/avatar.jpg
CHANGED
|
|
|
|
me/linkedin.pdf
CHANGED
|
Binary files a/me/linkedin.pdf and b/me/linkedin.pdf differ
|
|
|
me/the_scream.jpg
ADDED
|
Git LFS Details
|