Naresh Raja M L commited on
Commit
2a9512a
·
verified ·
1 Parent(s): 6483724

Upload folder using huggingface_hub

Browse files
Files changed (42) hide show
  1. .gitattributes +1 -0
  2. .gradio/certificate.pem +31 -0
  3. 1_lab1.ipynb +655 -0
  4. 2_lab2.ipynb +0 -0
  5. 3_lab3.ipynb +768 -0
  6. 4_lab4.ipynb +0 -0
  7. README.md +3 -9
  8. apk.py +184 -0
  9. app.py +184 -0
  10. community_contributions/1_lab1_Mudassar.ipynb +260 -0
  11. community_contributions/1_lab1_Thanh.ipynb +165 -0
  12. community_contributions/1_lab1_gemini.ipynb +306 -0
  13. community_contributions/1_lab1_groq_llama.ipynb +296 -0
  14. community_contributions/1_lab1_open_router.ipynb +323 -0
  15. community_contributions/1_lab2_Kaushik_Parallelization.ipynb +355 -0
  16. community_contributions/2_lab2_exercise.ipynb +336 -0
  17. community_contributions/2_lab2_six-thinking-hats-simulator.ipynb +457 -0
  18. community_contributions/3_lab3_groq_llama_generator_gemini_evaluator.ipynb +286 -0
  19. community_contributions/Business_Idea.ipynb +388 -0
  20. community_contributions/Multi-Model-Resume–JD-Match-Analyzer/.gitignore +1 -0
  21. community_contributions/Multi-Model-Resume/342/200/223JD-Match-Analyzer/AnalyzeResume.png +0 -0
  22. community_contributions/Multi-Model-Resume–JD-Match-Analyzer/README.md +48 -0
  23. community_contributions/Multi-Model-Resume–JD-Match-Analyzer/multi_file_ingestion.py +44 -0
  24. community_contributions/Multi-Model-Resume–JD-Match-Analyzer/resume_agent.py +262 -0
  25. community_contributions/app_rate_limiter_mailgun_integration.py +231 -0
  26. community_contributions/community.ipynb +29 -0
  27. community_contributions/gemini_based_chatbot/.env.example +1 -0
  28. community_contributions/gemini_based_chatbot/.gitignore +32 -0
  29. community_contributions/gemini_based_chatbot/Profile.pdf +0 -0
  30. community_contributions/gemini_based_chatbot/README.md +74 -0
  31. community_contributions/gemini_based_chatbot/app.py +58 -0
  32. community_contributions/gemini_based_chatbot/gemini_chatbot_of_me.ipynb +541 -0
  33. community_contributions/gemini_based_chatbot/requirements.txt +0 -0
  34. community_contributions/gemini_based_chatbot/summary.txt +8 -0
  35. community_contributions/lab2_updates_cross_ref_models.ipynb +580 -0
  36. community_contributions/llm-evaluator.ipynb +385 -0
  37. community_contributions/my_1_lab1.ipynb +405 -0
  38. community_contributions/travel_planner_multicall_and_sythesizer.ipynb +287 -0
  39. me/NareshRajaML_AI_Role.pdf +3 -0
  40. me/linkedin.pdf +0 -0
  41. me/summary.txt +16 -0
  42. requirements.txt +6 -0
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip 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
 
 
33
  *.zip 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/NareshRajaML_AI_Role.pdf filter=lfs diff=lfs merge=lfs -text
.gradio/certificate.pem ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
3
+ TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
4
+ cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
5
+ WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
6
+ ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
7
+ MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
8
+ h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
9
+ 0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
10
+ A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
11
+ T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
12
+ B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
13
+ B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
14
+ KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
15
+ OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
16
+ jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
17
+ qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
18
+ rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
19
+ HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
20
+ hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
21
+ ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
22
+ 3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
23
+ NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
24
+ ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
25
+ TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
26
+ jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
27
+ oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
28
+ 4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
29
+ mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
30
+ emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
31
+ -----END CERTIFICATE-----
1_lab1.ipynb ADDED
@@ -0,0 +1,655 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# Welcome to the start of your adventure in Agentic AI"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "markdown",
12
+ "metadata": {},
13
+ "source": [
14
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
15
+ " <tr>\n",
16
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
17
+ " <img src=\"../assets/stop.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
18
+ " </td>\n",
19
+ " <td>\n",
20
+ " <h2 style=\"color:#ff7800;\">Are you ready for action??</h2>\n",
21
+ " <span style=\"color:#ff7800;\">Have you completed all the setup steps in the <a href=\"../setup/\">setup</a> folder?<br/>\n",
22
+ " Have you checked out the guides in the <a href=\"../guides/01_intro.ipynb\">guides</a> folder?<br/>\n",
23
+ " Well in that case, you're ready!!\n",
24
+ " </span>\n",
25
+ " </td>\n",
26
+ " </tr>\n",
27
+ "</table>"
28
+ ]
29
+ },
30
+ {
31
+ "cell_type": "markdown",
32
+ "metadata": {},
33
+ "source": [
34
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
35
+ " <tr>\n",
36
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
37
+ " <img src=\"../assets/tools.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
38
+ " </td>\n",
39
+ " <td>\n",
40
+ " <h2 style=\"color:#00bfff;\">This code is a live resource - keep an eye out for my updates</h2>\n",
41
+ " <span style=\"color:#00bfff;\">I push updates regularly. As people ask questions or have problems, I add more examples and improve explanations. As a result, the code below might not be identical to the videos, as I've added more steps and better comments. Consider this like an interactive book that accompanies the lectures.<br/><br/>\n",
42
+ " I try to send emails regularly with important updates related to the course. You can find this in the 'Announcements' section of Udemy in the left sidebar. You can also choose to receive my emails via your Notification Settings in Udemy. I'm respectful of your inbox and always try to add value with my emails!\n",
43
+ " </span>\n",
44
+ " </td>\n",
45
+ " </tr>\n",
46
+ "</table>"
47
+ ]
48
+ },
49
+ {
50
+ "cell_type": "markdown",
51
+ "metadata": {},
52
+ "source": [
53
+ "### And please do remember to contact me if I can help\n",
54
+ "\n",
55
+ "And I love to connect: https://www.linkedin.com/in/eddonner/\n",
56
+ "\n",
57
+ "\n",
58
+ "### New to Notebooks like this one? Head over to the guides folder!\n",
59
+ "\n",
60
+ "Just to check you've already added the Python and Jupyter extensions to Cursor, if not already installed:\n",
61
+ "- Open extensions (View >> extensions)\n",
62
+ "- Search for python, and when the results show, click on the ms-python one, and Install it if not already installed\n",
63
+ "- Search for jupyter, and when the results show, click on the Microsoft one, and Install it if not already installed \n",
64
+ "Then View >> Explorer to bring back the File Explorer.\n",
65
+ "\n",
66
+ "And then:\n",
67
+ "1. Click where it says \"Select Kernel\" near the top right, and select the option called `.venv (Python 3.12.9)` or similar, which should be the first choice or the most prominent choice. You may need to choose \"Python Environments\" first.\n",
68
+ "2. Click in each \"cell\" below, starting with the cell immediately below this text, and press Shift+Enter to run\n",
69
+ "3. Enjoy!\n",
70
+ "\n",
71
+ "After you click \"Select Kernel\", if there is no option like `.venv (Python 3.12.9)` then please do the following: \n",
72
+ "1. On Mac: From the Cursor menu, choose Settings >> VS Code Settings (NOTE: be sure to select `VSCode Settings` not `Cursor Settings`); \n",
73
+ "On Windows PC: From the File menu, choose Preferences >> VS Code Settings(NOTE: be sure to select `VSCode Settings` not `Cursor Settings`) \n",
74
+ "2. In the Settings search bar, type \"venv\" \n",
75
+ "3. In the field \"Path to folder with a list of Virtual Environments\" put the path to the project root, like C:\\Users\\username\\projects\\agents (on a Windows PC) or /Users/username/projects/agents (on Mac or Linux). \n",
76
+ "And then try again.\n",
77
+ "\n",
78
+ "Having problems with missing Python versions in that list? Have you ever used Anaconda before? It might be interferring. Quit Cursor, bring up a new command line, and make sure that your Anaconda environment is deactivated: \n",
79
+ "`conda deactivate` \n",
80
+ "And if you still have any problems with conda and python versions, it's possible that you will need to run this too: \n",
81
+ "`conda config --set auto_activate_base false` \n",
82
+ "and then from within the Agents directory, you should be able to run `uv python list` and see the Python 3.12 version."
83
+ ]
84
+ },
85
+ {
86
+ "cell_type": "code",
87
+ "execution_count": 1,
88
+ "metadata": {},
89
+ "outputs": [],
90
+ "source": [
91
+ "# First let's do an import\n",
92
+ "from dotenv import load_dotenv\n"
93
+ ]
94
+ },
95
+ {
96
+ "cell_type": "code",
97
+ "execution_count": 2,
98
+ "metadata": {},
99
+ "outputs": [
100
+ {
101
+ "data": {
102
+ "text/plain": [
103
+ "True"
104
+ ]
105
+ },
106
+ "execution_count": 2,
107
+ "metadata": {},
108
+ "output_type": "execute_result"
109
+ }
110
+ ],
111
+ "source": [
112
+ "# Next it's time to load the API keys into environment variables\n",
113
+ "\n",
114
+ "load_dotenv(override=True)"
115
+ ]
116
+ },
117
+ {
118
+ "cell_type": "code",
119
+ "execution_count": 3,
120
+ "metadata": {},
121
+ "outputs": [
122
+ {
123
+ "name": "stdout",
124
+ "output_type": "stream",
125
+ "text": [
126
+ "OpenAI API Key exists and begins sk-proj-\n"
127
+ ]
128
+ }
129
+ ],
130
+ "source": [
131
+ "# Check the keys\n",
132
+ "\n",
133
+ "import os\n",
134
+ "openai_api_key = os.getenv('OPENAI_API_KEY')\n",
135
+ "\n",
136
+ "if openai_api_key:\n",
137
+ " print(f\"OpenAI API Key exists and begins {openai_api_key[:8]}\")\n",
138
+ "else:\n",
139
+ " print(\"OpenAI API Key not set - please head to the troubleshooting guide in the setup folder\")\n",
140
+ " \n"
141
+ ]
142
+ },
143
+ {
144
+ "cell_type": "code",
145
+ "execution_count": 4,
146
+ "metadata": {},
147
+ "outputs": [],
148
+ "source": [
149
+ "# And now - the all important import statement\n",
150
+ "# If you get an import error - head over to troubleshooting guide\n",
151
+ "\n",
152
+ "from openai import OpenAI"
153
+ ]
154
+ },
155
+ {
156
+ "cell_type": "code",
157
+ "execution_count": 5,
158
+ "metadata": {},
159
+ "outputs": [],
160
+ "source": [
161
+ "# And now we'll create an instance of the OpenAI class\n",
162
+ "# If you're not sure what it means to create an instance of a class - head over to the guides folder!\n",
163
+ "# If you get a NameError - head over to the guides folder to learn about NameErrors\n",
164
+ "\n",
165
+ "openai = OpenAI()"
166
+ ]
167
+ },
168
+ {
169
+ "cell_type": "code",
170
+ "execution_count": 6,
171
+ "metadata": {},
172
+ "outputs": [],
173
+ "source": [
174
+ "# Create a list of messages in the familiar OpenAI format\n",
175
+ "\n",
176
+ "messages = [{\"role\": \"user\", \"content\": \"What is 2+2?\"}]"
177
+ ]
178
+ },
179
+ {
180
+ "cell_type": "code",
181
+ "execution_count": 7,
182
+ "metadata": {},
183
+ "outputs": [
184
+ {
185
+ "name": "stdout",
186
+ "output_type": "stream",
187
+ "text": [
188
+ "2 + 2 equals 4.\n"
189
+ ]
190
+ }
191
+ ],
192
+ "source": [
193
+ "# And now call it! Any problems, head to the troubleshooting guide\n",
194
+ "# This uses GPT 4.1 nano, the incredibly cheap model\n",
195
+ "\n",
196
+ "response = openai.chat.completions.create(\n",
197
+ " model=\"gpt-4.1-nano\",\n",
198
+ " messages=messages\n",
199
+ ")\n",
200
+ "\n",
201
+ "\n",
202
+ "print(response.choices[0].message.content)"
203
+ ]
204
+ },
205
+ {
206
+ "cell_type": "code",
207
+ "execution_count": 8,
208
+ "metadata": {},
209
+ "outputs": [],
210
+ "source": [
211
+ "# And now - let's ask for a question:\n",
212
+ "\n",
213
+ "question = \"Please propose a hard, challenging question to assess someone's IQ. Respond only with the question.\"\n",
214
+ "messages = [{\"role\": \"user\", \"content\": question}]\n"
215
+ ]
216
+ },
217
+ {
218
+ "cell_type": "code",
219
+ "execution_count": 9,
220
+ "metadata": {},
221
+ "outputs": [
222
+ {
223
+ "name": "stdout",
224
+ "output_type": "stream",
225
+ "text": [
226
+ "If you rearrange the letters \"CIFAIPC\" you get the name of a(n): \n",
227
+ "A) Ocean \n",
228
+ "B) Country \n",
229
+ "C) City \n",
230
+ "D) Animal\n"
231
+ ]
232
+ }
233
+ ],
234
+ "source": [
235
+ "# ask it - this uses GPT 4.1 mini, still cheap but more powerful than nano\n",
236
+ "\n",
237
+ "response = openai.chat.completions.create(\n",
238
+ " model=\"gpt-4.1-mini\",\n",
239
+ " messages=messages\n",
240
+ ")\n",
241
+ "\n",
242
+ "question = response.choices[0].message.content\n",
243
+ "\n",
244
+ "print(question)\n"
245
+ ]
246
+ },
247
+ {
248
+ "cell_type": "code",
249
+ "execution_count": 10,
250
+ "metadata": {},
251
+ "outputs": [],
252
+ "source": [
253
+ "# form a new messages list\n",
254
+ "messages = [{\"role\": \"user\", \"content\": question}]\n"
255
+ ]
256
+ },
257
+ {
258
+ "cell_type": "code",
259
+ "execution_count": 11,
260
+ "metadata": {},
261
+ "outputs": [
262
+ {
263
+ "name": "stdout",
264
+ "output_type": "stream",
265
+ "text": [
266
+ "If you rearrange the letters \"CIFAIPC,\" you get \"PACIFIC,\" which is the name of an:\n",
267
+ "\n",
268
+ "A) Ocean\n",
269
+ "\n",
270
+ "So, the correct answer is **A) Ocean**.\n"
271
+ ]
272
+ }
273
+ ],
274
+ "source": [
275
+ "# Ask it again\n",
276
+ "\n",
277
+ "response = openai.chat.completions.create(\n",
278
+ " model=\"gpt-4.1-mini\",\n",
279
+ " messages=messages\n",
280
+ ")\n",
281
+ "\n",
282
+ "answer = response.choices[0].message.content\n",
283
+ "print(answer)\n"
284
+ ]
285
+ },
286
+ {
287
+ "cell_type": "code",
288
+ "execution_count": 12,
289
+ "metadata": {},
290
+ "outputs": [
291
+ {
292
+ "data": {
293
+ "text/markdown": [
294
+ "If you rearrange the letters \"CIFAIPC,\" you get \"PACIFIC,\" which is the name of an:\n",
295
+ "\n",
296
+ "A) Ocean\n",
297
+ "\n",
298
+ "So, the correct answer is **A) Ocean**."
299
+ ],
300
+ "text/plain": [
301
+ "<IPython.core.display.Markdown object>"
302
+ ]
303
+ },
304
+ "metadata": {},
305
+ "output_type": "display_data"
306
+ }
307
+ ],
308
+ "source": [
309
+ "from IPython.display import Markdown, display\n",
310
+ "\n",
311
+ "display(Markdown(answer))\n",
312
+ "\n"
313
+ ]
314
+ },
315
+ {
316
+ "cell_type": "markdown",
317
+ "metadata": {},
318
+ "source": [
319
+ "# Congratulations!\n",
320
+ "\n",
321
+ "That was a small, simple step in the direction of Agentic AI, with your new environment!\n",
322
+ "\n",
323
+ "Next time things get more interesting..."
324
+ ]
325
+ },
326
+ {
327
+ "cell_type": "markdown",
328
+ "metadata": {},
329
+ "source": [
330
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
331
+ " <tr>\n",
332
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
333
+ " <img src=\"../assets/exercise.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
334
+ " </td>\n",
335
+ " <td>\n",
336
+ " <h2 style=\"color:#ff7800;\">Exercise</h2>\n",
337
+ " <span style=\"color:#ff7800;\">Now try this commercial application:<br/>\n",
338
+ " First ask the LLM to pick a business area that might be worth exploring for an Agentic AI opportunity.<br/>\n",
339
+ " Then ask the LLM to present a pain-point in that industry - something challenging that might be ripe for an Agentic solution.<br/>\n",
340
+ " Finally have 3 third LLM call propose the Agentic AI solution.\n",
341
+ " </span>\n",
342
+ " </td>\n",
343
+ " </tr>\n",
344
+ "</table>"
345
+ ]
346
+ },
347
+ {
348
+ "cell_type": "code",
349
+ "execution_count": 13,
350
+ "metadata": {},
351
+ "outputs": [],
352
+ "source": [
353
+ "from openai import OpenAI\n",
354
+ "\n",
355
+ "openai = OpenAI()"
356
+ ]
357
+ },
358
+ {
359
+ "cell_type": "code",
360
+ "execution_count": 18,
361
+ "metadata": {},
362
+ "outputs": [
363
+ {
364
+ "name": "stdout",
365
+ "output_type": "stream",
366
+ "text": [
367
+ "Selected business area: Supply chain management in pharmaceutical distribution would greatly benefit from an Agentic AI solution. Such AI could autonomously coordinate inventory levels, predict demand fluctuations, optimize routing for temperature-sensitive shipments, and handle regulatory compliance dynamically, ensuring timely and safe delivery of critical medications.\n",
368
+ "\n",
369
+ "Pain point identified: A critical pain point in pharmaceutical supply chain management is **managing the complexity of cold chain logistics for temperature-sensitive medications across fragmented, multi-tier distribution networks**. This involves continuously monitoring and controlling storage conditions, dynamically adjusting inventory allocations, predicting demand variability at fine granularity, and navigating varying regional regulatory requirements in real-time.\n",
370
+ "\n",
371
+ "An Agentic AI solution could autonomously coordinate these interdependent tasks by:\n",
372
+ "\n",
373
+ "- **Predicting demand fluctuations** at each distribution node using real-time data (e.g., epidemiological trends, prescription rates, and seasonal factors).\n",
374
+ "- **Optimizing inventory levels** to minimize waste due to expiration while ensuring availability, dynamically reallocating stock based on shifting demand patterns.\n",
375
+ "- **Planning and adjusting shipment routes** in real-time to maintain strict temperature controls, leveraging IoT sensor data and traffic conditions to reroute shipments proactively.\n",
376
+ "- **Automatically managing compliance** by continuously updating and applying regional regulations, generating required documentation, and triggering alerts for any deviations.\n",
377
+ "\n",
378
+ "This holistic autonomous coordination would drastically reduce delivery delays, spoilage, and compliance risks, ensuring critical medications reach patients safely and timely without constant human oversight.\n",
379
+ "\n",
380
+ "Proposed Agentic AI solution: Certainly! Here is a detailed, practical proposal for an **Agentic AI solution** tailored to address the complexity of cold chain logistics in pharmaceutical distribution:\n",
381
+ "\n",
382
+ "---\n",
383
+ "\n",
384
+ "# Agentic AI Solution for Managing Cold Chain Logistics in Pharmaceutical Supply Chains\n",
385
+ "\n",
386
+ "## Solution Overview: \n",
387
+ "**PharmaChain AI** — an autonomous, multi-agent AI platform designed to collaboratively manage and optimize cold chain logistics across fragmented multi-tier pharmaceutical distribution networks.\n",
388
+ "\n",
389
+ "---\n",
390
+ "\n",
391
+ "### Core Functional Capabilities\n",
392
+ "\n",
393
+ "1. **Demand Prediction & Forecasting Agent** \n",
394
+ " - **Inputs:** \n",
395
+ " - Real-time epidemiological data (outbreak alerts, infection trends) aggregated from public health APIs. \n",
396
+ " - Prescription rates and sales data from pharmacies & hospitals. \n",
397
+ " - Seasonal and demographic data affecting medication demand (flu season, holidays, regional characteristics). \n",
398
+ " - **Function:** \n",
399
+ " - Uses advanced time-series models (e.g., LSTM, Transformer-based forecasting) with continual retraining to predict near-term demand at each node (warehouse, distribution center, pharmacy) to a high granularity (daily/hourly). \n",
400
+ " - Outputs demand probability distributions for each product SKU at each node, incorporating uncertainty estimates for risk-aware downstream planning.\n",
401
+ "\n",
402
+ "2. **Inventory Optimization Agent** \n",
403
+ " - **Inputs:** \n",
404
+ " - Real-time inventory levels at each node, including expiration dates. \n",
405
+ " - Demand forecasts from Demand Prediction Agent. \n",
406
+ " - Historical spoilage/waste data. \n",
407
+ " - **Function:** \n",
408
+ " - Implements inventory management algorithms (e.g., stochastic optimization, reinforcement learning) to dynamically adjust stock levels, reduce overstock/excess to minimize expiration waste, and ensure safety stock to meet predicted demand peaks. \n",
409
+ " - Automatically triggers intra-network reallocation of stock via coordinated order requests to balance inventory and reduce shortage risk.\n",
410
+ "\n",
411
+ "3. **Routing & Logistics Agent** \n",
412
+ " - **Inputs:** \n",
413
+ " - Real-time shipment tracking via IoT temperature sensors embedded in containers/packages. \n",
414
+ " - Traffic and weather conditions from external APIs. \n",
415
+ " - Vehicle GPS/location and status data. \n",
416
+ " - **Function:** \n",
417
+ " - Continuously monitors temperature sensors to detect excursions. \n",
418
+ " - Performs real-time route optimization using multi-objective algorithms balancing time, cost, and temperature maintenance constraints. \n",
419
+ " - Dynamically reroutes shipments if temperature thresholds are at risk or if traffic/weather conditions threaten delays. \n",
420
+ " - Coordinates with third-party carriers and generates updated instructions autonomously.\n",
421
+ "\n",
422
+ "4. **Regulatory Compliance Agent** \n",
423
+ " - **Inputs:** \n",
424
+ " - Regional regulatory databases with rules on cold chain handling, documentation, and reporting (updated automatically). \n",
425
+ " - Shipment and inventory logs. \n",
426
+ " - Validation data from IoT sensors and quality control checkpoints. \n",
427
+ " - **Function:** \n",
428
+ " - Continuously verifies that all shipments comply with applicable regulations. \n",
429
+ " - Auto-generates and stores compliance documentation and audit trails required for inspections. \n",
430
+ " - Raises immediate alerts and corrective actions if deviations or violations are detected (e.g., temperature breach, documentation errors). \n",
431
+ " - Suggests mitigation plans such as quarantine or expedited re-routing.\n",
432
+ "\n",
433
+ "---\n",
434
+ "\n",
435
+ "### System Architecture and Coordination\n",
436
+ "\n",
437
+ "- **Centralized Multi-Agent Orchestration Engine:** \n",
438
+ " Coordinates communication across the four functional agents, enabling them to share real-time insights and synchronize actions. For example, Routing Agent can request updated delivery priorities from Inventory Agent, or Regulatory Agent can request shipment status from Routing Agent for compliance reporting.\n",
439
+ "\n",
440
+ "- **Data Integration Layer:** \n",
441
+ " Ingests and harmonizes data from diverse sources (IoT sensors, ERP systems, external APIs) with secure APIs and ETL pipelines, ensuring data freshness and quality for agent decision-making.\n",
442
+ "\n",
443
+ "- **User Interface & Dashboard:** \n",
444
+ " Provides logistics managers with a high-level overview, key alerts, and an exception management console, enabling human supervisors to intervene if necessary while routine operations remain fully autonomous.\n",
445
+ "\n",
446
+ "- **Security & Auditability:** \n",
447
+ " Employs blockchain-based immutability for transaction and compliance logs to ensure full traceability and regulatory trust.\n",
448
+ "\n",
449
+ "---\n",
450
+ "\n",
451
+ "### Practical Deployment Scenario\n",
452
+ "\n",
453
+ "- **Phase 1 - Pilot at Regional Hub:** \n",
454
+ " Deploy agents to manage demand forecasting and inventory optimization at several warehouses serving a specific region. Using historical data, train and validate the AI models. Integrate IoT sensor data on a limited set of high-value, temperature-sensitive vaccines.\n",
455
+ "\n",
456
+ "- **Phase 2 - Full Network Rollout:** \n",
457
+ " Extend agent coverage to entire multi-tier network including pharmacies and hospitals. Add Routing Agent to manage shipment paths with continuous feedback. Begin Regulatory Agent operations to ensure compliance across different countries/states.\n",
458
+ "\n",
459
+ "- **Phase 3 - Continuous Learning and Improvement:** \n",
460
+ " Utilize agent-collected data to retrain models improving forecast accuracy and routing efficiency. Implement user feedback loop and exception cases to fine-tune AI decision thresholds.\n",
461
+ "\n",
462
+ "---\n",
463
+ "\n",
464
+ "### Benefits and Impact\n",
465
+ "\n",
466
+ "- **Reduced Spoilage:** By dynamically optimizing inventory and rerouting shipments in real time to maintain proper temperature, spoilage from exposure or overstock expiry is minimized. \n",
467
+ "- **Improved Availability:** More accurate demand predictions and inventory balancing reduce stockouts at critical distribution nodes. \n",
468
+ "- **Regulatory Assurance:** Automated compliance reduces the risks of penalties and shipment recalls. \n",
469
+ "- **Operational Efficiency:** Autonomous coordination decreases manual overhead and human error, speeding up decision-making and responsiveness. \n",
470
+ "\n",
471
+ "---\n",
472
+ "\n",
473
+ "This agentic AI solution can transform pharmaceutical cold chain logistics from a reactive, manual-labor intensive process into a proactive, agile, and tightly coordinated system ensuring life-saving medications reach patients safely and on time.\n",
474
+ "\n",
475
+ "---\n",
476
+ "\n",
477
+ "If you'd like, I can provide a technical architecture diagram or delve deeper into one of the agents.\n"
478
+ ]
479
+ },
480
+ {
481
+ "data": {
482
+ "text/markdown": [
483
+ "Certainly! Here is a detailed, practical proposal for an **Agentic AI solution** tailored to address the complexity of cold chain logistics in pharmaceutical distribution:\n",
484
+ "\n",
485
+ "---\n",
486
+ "\n",
487
+ "# Agentic AI Solution for Managing Cold Chain Logistics in Pharmaceutical Supply Chains\n",
488
+ "\n",
489
+ "## Solution Overview: \n",
490
+ "**PharmaChain AI** — an autonomous, multi-agent AI platform designed to collaboratively manage and optimize cold chain logistics across fragmented multi-tier pharmaceutical distribution networks.\n",
491
+ "\n",
492
+ "---\n",
493
+ "\n",
494
+ "### Core Functional Capabilities\n",
495
+ "\n",
496
+ "1. **Demand Prediction & Forecasting Agent** \n",
497
+ " - **Inputs:** \n",
498
+ " - Real-time epidemiological data (outbreak alerts, infection trends) aggregated from public health APIs. \n",
499
+ " - Prescription rates and sales data from pharmacies & hospitals. \n",
500
+ " - Seasonal and demographic data affecting medication demand (flu season, holidays, regional characteristics). \n",
501
+ " - **Function:** \n",
502
+ " - Uses advanced time-series models (e.g., LSTM, Transformer-based forecasting) with continual retraining to predict near-term demand at each node (warehouse, distribution center, pharmacy) to a high granularity (daily/hourly). \n",
503
+ " - Outputs demand probability distributions for each product SKU at each node, incorporating uncertainty estimates for risk-aware downstream planning.\n",
504
+ "\n",
505
+ "2. **Inventory Optimization Agent** \n",
506
+ " - **Inputs:** \n",
507
+ " - Real-time inventory levels at each node, including expiration dates. \n",
508
+ " - Demand forecasts from Demand Prediction Agent. \n",
509
+ " - Historical spoilage/waste data. \n",
510
+ " - **Function:** \n",
511
+ " - Implements inventory management algorithms (e.g., stochastic optimization, reinforcement learning) to dynamically adjust stock levels, reduce overstock/excess to minimize expiration waste, and ensure safety stock to meet predicted demand peaks. \n",
512
+ " - Automatically triggers intra-network reallocation of stock via coordinated order requests to balance inventory and reduce shortage risk.\n",
513
+ "\n",
514
+ "3. **Routing & Logistics Agent** \n",
515
+ " - **Inputs:** \n",
516
+ " - Real-time shipment tracking via IoT temperature sensors embedded in containers/packages. \n",
517
+ " - Traffic and weather conditions from external APIs. \n",
518
+ " - Vehicle GPS/location and status data. \n",
519
+ " - **Function:** \n",
520
+ " - Continuously monitors temperature sensors to detect excursions. \n",
521
+ " - Performs real-time route optimization using multi-objective algorithms balancing time, cost, and temperature maintenance constraints. \n",
522
+ " - Dynamically reroutes shipments if temperature thresholds are at risk or if traffic/weather conditions threaten delays. \n",
523
+ " - Coordinates with third-party carriers and generates updated instructions autonomously.\n",
524
+ "\n",
525
+ "4. **Regulatory Compliance Agent** \n",
526
+ " - **Inputs:** \n",
527
+ " - Regional regulatory databases with rules on cold chain handling, documentation, and reporting (updated automatically). \n",
528
+ " - Shipment and inventory logs. \n",
529
+ " - Validation data from IoT sensors and quality control checkpoints. \n",
530
+ " - **Function:** \n",
531
+ " - Continuously verifies that all shipments comply with applicable regulations. \n",
532
+ " - Auto-generates and stores compliance documentation and audit trails required for inspections. \n",
533
+ " - Raises immediate alerts and corrective actions if deviations or violations are detected (e.g., temperature breach, documentation errors). \n",
534
+ " - Suggests mitigation plans such as quarantine or expedited re-routing.\n",
535
+ "\n",
536
+ "---\n",
537
+ "\n",
538
+ "### System Architecture and Coordination\n",
539
+ "\n",
540
+ "- **Centralized Multi-Agent Orchestration Engine:** \n",
541
+ " Coordinates communication across the four functional agents, enabling them to share real-time insights and synchronize actions. For example, Routing Agent can request updated delivery priorities from Inventory Agent, or Regulatory Agent can request shipment status from Routing Agent for compliance reporting.\n",
542
+ "\n",
543
+ "- **Data Integration Layer:** \n",
544
+ " Ingests and harmonizes data from diverse sources (IoT sensors, ERP systems, external APIs) with secure APIs and ETL pipelines, ensuring data freshness and quality for agent decision-making.\n",
545
+ "\n",
546
+ "- **User Interface & Dashboard:** \n",
547
+ " Provides logistics managers with a high-level overview, key alerts, and an exception management console, enabling human supervisors to intervene if necessary while routine operations remain fully autonomous.\n",
548
+ "\n",
549
+ "- **Security & Auditability:** \n",
550
+ " Employs blockchain-based immutability for transaction and compliance logs to ensure full traceability and regulatory trust.\n",
551
+ "\n",
552
+ "---\n",
553
+ "\n",
554
+ "### Practical Deployment Scenario\n",
555
+ "\n",
556
+ "- **Phase 1 - Pilot at Regional Hub:** \n",
557
+ " Deploy agents to manage demand forecasting and inventory optimization at several warehouses serving a specific region. Using historical data, train and validate the AI models. Integrate IoT sensor data on a limited set of high-value, temperature-sensitive vaccines.\n",
558
+ "\n",
559
+ "- **Phase 2 - Full Network Rollout:** \n",
560
+ " Extend agent coverage to entire multi-tier network including pharmacies and hospitals. Add Routing Agent to manage shipment paths with continuous feedback. Begin Regulatory Agent operations to ensure compliance across different countries/states.\n",
561
+ "\n",
562
+ "- **Phase 3 - Continuous Learning and Improvement:** \n",
563
+ " Utilize agent-collected data to retrain models improving forecast accuracy and routing efficiency. Implement user feedback loop and exception cases to fine-tune AI decision thresholds.\n",
564
+ "\n",
565
+ "---\n",
566
+ "\n",
567
+ "### Benefits and Impact\n",
568
+ "\n",
569
+ "- **Reduced Spoilage:** By dynamically optimizing inventory and rerouting shipments in real time to maintain proper temperature, spoilage from exposure or overstock expiry is minimized. \n",
570
+ "- **Improved Availability:** More accurate demand predictions and inventory balancing reduce stockouts at critical distribution nodes. \n",
571
+ "- **Regulatory Assurance:** Automated compliance reduces the risks of penalties and shipment recalls. \n",
572
+ "- **Operational Efficiency:** Autonomous coordination decreases manual overhead and human error, speeding up decision-making and responsiveness. \n",
573
+ "\n",
574
+ "---\n",
575
+ "\n",
576
+ "This agentic AI solution can transform pharmaceutical cold chain logistics from a reactive, manual-labor intensive process into a proactive, agile, and tightly coordinated system ensuring life-saving medications reach patients safely and on time.\n",
577
+ "\n",
578
+ "---\n",
579
+ "\n",
580
+ "If you'd like, I can provide a technical architecture diagram or delve deeper into one of the agents."
581
+ ],
582
+ "text/plain": [
583
+ "<IPython.core.display.Markdown object>"
584
+ ]
585
+ },
586
+ "metadata": {},
587
+ "output_type": "display_data"
588
+ }
589
+ ],
590
+ "source": [
591
+ "# Step 1: Get business area recommendation\n",
592
+ "question = \"Please suggest a business area that would benefit from an Agentic AI solution. Be specific but concise.\"\n",
593
+ "messages = [{\"role\": \"user\", \"content\": question}]\n",
594
+ "\n",
595
+ "response = openai.chat.completions.create(\n",
596
+ " model=\"gpt-4.1-mini\",\n",
597
+ " messages=messages\n",
598
+ ")\n",
599
+ "\n",
600
+ "business_area = response.choices[0].message.content\n",
601
+ "print(f\"Selected business area: {business_area}\\n\")\n",
602
+ "\n",
603
+ "# Step 2: Identify pain point\n",
604
+ "messages = [{\"role\": \"user\", \"content\": f\"What is a specific pain point or challenge in {business_area} that could be solved with Agentic AI? Be detailed but concise.\"}]\n",
605
+ "\n",
606
+ "response = openai.chat.completions.create(\n",
607
+ " model=\"gpt-4.1-mini\", \n",
608
+ " messages=messages\n",
609
+ ")\n",
610
+ "\n",
611
+ "pain_point = response.choices[0].message.content\n",
612
+ "print(f\"Pain point identified: {pain_point}\\n\")\n",
613
+ "\n",
614
+ "# Step 3: Get AI solution proposal\n",
615
+ "messages = [{\"role\": \"user\", \"content\": f\"Propose a specific Agentic AI solution to address this pain point in {business_area}: {pain_point}. Be practical and detailed.\"}]\n",
616
+ "\n",
617
+ "response = openai.chat.completions.create(\n",
618
+ " model=\"gpt-4.1-mini\",\n",
619
+ " messages=messages\n",
620
+ ")\n",
621
+ "\n",
622
+ "solution = response.choices[0].message.content\n",
623
+ "print(f\"Proposed Agentic AI solution: {solution}\")\n",
624
+ "\n",
625
+ "display(Markdown(solution))\n"
626
+ ]
627
+ },
628
+ {
629
+ "cell_type": "markdown",
630
+ "metadata": {},
631
+ "source": []
632
+ }
633
+ ],
634
+ "metadata": {
635
+ "kernelspec": {
636
+ "display_name": ".venv",
637
+ "language": "python",
638
+ "name": "python3"
639
+ },
640
+ "language_info": {
641
+ "codemirror_mode": {
642
+ "name": "ipython",
643
+ "version": 3
644
+ },
645
+ "file_extension": ".py",
646
+ "mimetype": "text/x-python",
647
+ "name": "python",
648
+ "nbconvert_exporter": "python",
649
+ "pygments_lexer": "ipython3",
650
+ "version": "3.12.3"
651
+ }
652
+ },
653
+ "nbformat": 4,
654
+ "nbformat_minor": 2
655
+ }
2_lab2.ipynb ADDED
The diff for this file is too large to render. See raw diff
 
3_lab3.ipynb ADDED
@@ -0,0 +1,768 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "## Welcome to Lab 3 for Week 1 Day 4\n",
8
+ "\n",
9
+ "Today we're going to build something with immediate value!\n",
10
+ "\n",
11
+ "In the folder `me` I've put a single file `linkedin.pdf` - it's a PDF download of my LinkedIn profile.\n",
12
+ "\n",
13
+ "Please replace it with yours!\n",
14
+ "\n",
15
+ "I've also made a file called `summary.txt`\n",
16
+ "\n",
17
+ "We're not going to use Tools just yet - we're going to add the tool tomorrow."
18
+ ]
19
+ },
20
+ {
21
+ "cell_type": "markdown",
22
+ "metadata": {},
23
+ "source": [
24
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
25
+ " <tr>\n",
26
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
27
+ " <img src=\"../assets/tools.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
28
+ " </td>\n",
29
+ " <td>\n",
30
+ " <h2 style=\"color:#00bfff;\">Looking up packages</h2>\n",
31
+ " <span style=\"color:#00bfff;\">In this lab, we're going to use the wonderful Gradio package for building quick UIs, \n",
32
+ " and we're also going to use the popular PyPDF2 PDF reader. You can get guides to these packages by asking \n",
33
+ " ChatGPT or Claude, and you find all open-source packages on the repository <a href=\"https://pypi.org\">https://pypi.org</a>.\n",
34
+ " </span>\n",
35
+ " </td>\n",
36
+ " </tr>\n",
37
+ "</table>"
38
+ ]
39
+ },
40
+ {
41
+ "cell_type": "code",
42
+ "execution_count": 26,
43
+ "metadata": {},
44
+ "outputs": [],
45
+ "source": [
46
+ "# If you don't know what any of these packages do - you can always ask ChatGPT for a guide!\n",
47
+ "\n",
48
+ "from dotenv import load_dotenv\n",
49
+ "from openai import OpenAI\n",
50
+ "from pypdf import PdfReader\n",
51
+ "import gradio as gr"
52
+ ]
53
+ },
54
+ {
55
+ "cell_type": "code",
56
+ "execution_count": 27,
57
+ "metadata": {},
58
+ "outputs": [],
59
+ "source": [
60
+ "load_dotenv(override=True)\n",
61
+ "openai = OpenAI()"
62
+ ]
63
+ },
64
+ {
65
+ "cell_type": "code",
66
+ "execution_count": 28,
67
+ "metadata": {},
68
+ "outputs": [],
69
+ "source": [
70
+ "reader = PdfReader(\"me/linkedin.pdf\")\n",
71
+ "linkedin = \"\"\n",
72
+ "for page in reader.pages:\n",
73
+ " text = page.extract_text()\n",
74
+ " if text:\n",
75
+ " linkedin += text"
76
+ ]
77
+ },
78
+ {
79
+ "cell_type": "code",
80
+ "execution_count": 29,
81
+ "metadata": {},
82
+ "outputs": [],
83
+ "source": [
84
+ "reader = PdfReader(\"me/NareshRajaML_AI_Role.pdf\")\n",
85
+ "resume_content = \"\"\n",
86
+ "for page in reader.pages:\n",
87
+ " text = page.extract_text()\n",
88
+ " if text:\n",
89
+ " resume_content += text"
90
+ ]
91
+ },
92
+ {
93
+ "cell_type": "code",
94
+ "execution_count": 30,
95
+ "metadata": {},
96
+ "outputs": [
97
+ {
98
+ "name": "stdout",
99
+ "output_type": "stream",
100
+ "text": [
101
+ " NARESH RAJA M L \n",
102
+ " Phone: +91 8883337332 | Email: nareshraja.ml2022ai-ds@sece.ac.in | LinkedIn | Github \n",
103
+ "EDUCATION \n",
104
+ "Sri Eshwar College of Engineering B.TECH (AI-DS) CGPA : 8.31 2022-2026 \n",
105
+ "Sri Chaitanya school HSC 85.6% 2020-2022 \n",
106
+ "St Joseph's Matric school SSLC 85.4% 2019-2020 \n",
107
+ "TRAINING AND INTERNSHIP \n",
108
+ "AI BACKEND DEVELOPER INTERN | QUANTUM PULSE TECHNOLOGIES 2025 \n",
109
+ "Worked as AI-Backend Developer Intern at Quantum Pulse on HRMS and Job. Implemented 5+ features including user registration, email \n",
110
+ "verification, and profile onboarding. Developed 10+ REST APIs with role-based access and collaborated using Git and Postman. \n",
111
+ "Tech stack: Django, Python, Django REST Framework (DRF), JWT Authentication \n",
112
+ "MACHINE LEARNING TRAINING | V3 ANALYTICS 2024 \n",
113
+ "Attended training at V3Analytics and I have developed a pothole detection system using YOLOv11 and OpenCV. Trained the model on \n",
114
+ "road surface datasets and achieved ~87% detection accuracy on real-world test videos. Automated pothole localization with bounding \n",
115
+ "boxes, image capture, and geolocation tagging. \n",
116
+ "Tech stack: YOLOv11, OpenCV, Python, Geocoder, CUDA \n",
117
+ "PROJECTS \n",
118
+ "LAW FOR ALL – AI-POWERED LEGAL ASSISTANT 2025 \n",
119
+ "Built a legal AI assistant using Retrieval-Augmented Generation (RAG) to analyze Indian legal texts and suggest relevant IPC sections, \n",
120
+ "Acts, and rights based on user input. Deployed with Streamlit and achieved better accuracy in matching legal queries to correct sections \n",
121
+ "across 200+ test inputs. \n",
122
+ "Tech Stack: Python, RAG, LangChain, LangGraph, OpenAI API, ChromaDB, NLP. \n",
123
+ "HYBRID AI VISION SYSTEM FOR INDUSTRIAL DEFECT DETECTION 2025 \n",
124
+ "Developed a hybrid AI system combining YOLOv8, EfficientNet-V2-L, and OpenAI GPT-4 Turbo for real-time industrial defect detection \n",
125
+ "and weld prediction. Achieved 91% validation accuracy on surface defect datasets and leveraged GPT -4 Turbo's reasoning capabilities to \n",
126
+ "classify weld quality. \n",
127
+ "Tech Stack: Python, PyTorch, YOLOv8, EfficientNet-V2-L, OpenAI GPT-4 Turbo API \n",
128
+ "TALK WITH MySQL - GENAI DATABASE RETRIEVER 2023 \n",
129
+ "Built a GenAI system combining few-shot learning, semantic retrieval (ChromaDB), and Groq’s LLaMA 3.1 to generate SQL queries on a \n",
130
+ "MySQL T-shirt inventory. Deployed a Streamlit app for real-time database querying. \n",
131
+ "Tech Stack: Python, LangChain, Groq LLaMA 3.1, OpenAI Embeddings, ChromaDB, Streamlit, MySQL \n",
132
+ "CERTIFICATIONS \n",
133
+ "Certified in Gen AI with LangChain Udemy 2025 \n",
134
+ "Certified in Data Analytics and Visualization Job Simulation Forage 2025 \n",
135
+ "Certified in Supervised Machine Learning: Regression and Classification Coursera 2024 \n",
136
+ "Certified in Structured Query Language (SQL) Hackerrank 2023 \n",
137
+ "Certified in Learn JAVA programming Udemy 2023 \n",
138
+ "ACHIVEMENTS \n",
139
+ "Leetcode - Top Rating–1790+ | Top 13.75% in the World | Problems Solved–320+ | Profile \n",
140
+ "Codechef - Solved 490+ problems | Profile \n",
141
+ "Hackerrank: 3 Certificates | 3 badges \n",
142
+ "AWS Cloud Quest : Cloud Practitioner Issued by Amazon Web Services Training and Certification 2024 \n",
143
+ "Ideathon: Secured 1st place in Ideathon conducted by Coimbatore Institute Of Technology on developing a robot for elderly people. 2024 \n",
144
+ "ScrollHacks: Participated in a DevFolio Hackathon an international GenAI , Blockchain related hackathon and shortlisted in top 20 team. 2024 \n",
145
+ "Hack-Attak: Participated in Machine Learning hackathon conducted by CIT, Coimbatore and got selected to the final round as top 5 teams 2024 \n",
146
+ "SKILLS \n",
147
+ "Languages Python | C (basics) | Java \n",
148
+ "Core GEN AI | Machine Learning | NLP | Deep Learning | Data Analysis \n",
149
+ "AI Frameworks and Libraries LangChain | LangGraph | PyTorch | TensorFlow | Open CV | NLTK \n",
150
+ "Databases MySQL | MongoDB | S3 | Chroma DB ( Vector DB ) \n",
151
+ "Tools VScode | Colab | Github | Jupyter Notebook | AWS(Basics) \n",
152
+ "Data Analysis Tools Power BI | Tableau \n",
153
+ "\n"
154
+ ]
155
+ }
156
+ ],
157
+ "source": [
158
+ "print(resume_content)"
159
+ ]
160
+ },
161
+ {
162
+ "cell_type": "code",
163
+ "execution_count": 31,
164
+ "metadata": {},
165
+ "outputs": [
166
+ {
167
+ "name": "stdout",
168
+ "output_type": "stream",
169
+ "text": [
170
+ "   \n",
171
+ "Contact\n",
172
+ "8883337332 (Mobile)\n",
173
+ "nareshrajaml@gmail.com\n",
174
+ "www.linkedin.com/in/naresh-raja-\n",
175
+ "ml (LinkedIn)\n",
176
+ "Top Skills\n",
177
+ "Back-End Web Development\n",
178
+ "Django\n",
179
+ "Django REST Framework\n",
180
+ "Certifications\n",
181
+ "Accenture Forage - Data Analytics\n",
182
+ "and Visualization Job Simulation\n",
183
+ "Complete Gen AI Course with\n",
184
+ "LangChain\n",
185
+ "AWS Cloud Quest: Cloud\n",
186
+ "Practitioner\n",
187
+ "Naresh Raja M L\n",
188
+ "B.Tech Final Year | AI & Data Science | Machine Learning |\n",
189
+ "Generative AI & LLM Enthusiast | | Backend Developer | Emerging\n",
190
+ "Technologies Enthusiast\n",
191
+ "Coimbatore, Tamil Nadu, India\n",
192
+ "Summary\n",
193
+ "Introducing Naresh, a passionate data analyst student embarking\n",
194
+ "on a journey to become a proficient data scientist. With a strong\n",
195
+ "foundation in programming languages like Python, C++, and Java,\n",
196
+ "as well as expertise in data visualization tools such as PowerBI and\n",
197
+ "Tableau, Naresh is well-equipped to tackle the complexities of the\n",
198
+ "data science realm.\n",
199
+ "Driven by a keen interest in emerging technologies like Generative\n",
200
+ "AI and machine learning, Naresh is constantly seeking opportunities\n",
201
+ "to expand their knowledge and skills in these cutting-edge fields.\n",
202
+ "With a curious mind and a thirst for innovation, Naresh is committed\n",
203
+ "to mastering the art of transforming raw data into actionable insights\n",
204
+ "that drive meaningful outcomes.\n",
205
+ "Through hands-on projects and continuous learning, Naresh\n",
206
+ "is honing their analytical prowess and refining their problem-\n",
207
+ "solving abilities. With a goal-oriented mindset and a dedication to\n",
208
+ "excellence, Naresh is poised to make significant contributions to the\n",
209
+ "ever-evolving field of data science.\n",
210
+ "Experience\n",
211
+ "QuantumPulse Technologies\n",
212
+ "AI & Backend Developer \n",
213
+ "February 2025 - May 2025 (4 months)\n",
214
+ "Coimbatore, Tamil Nadu, India\n",
215
+ "I am working as an AI and Backend Developer at Quantum Pulse, where\n",
216
+ "I developed AI-based solutions and built backend systems using Django.\n",
217
+ "My role involved designing APIs, integrating machine learning models and\n",
218
+ "chatbots.\n",
219
+ "RV TECHLEARN\n",
220
+ "  Page 1 of 2   \n",
221
+ "Django Stack\n",
222
+ "January 2024 - February 2024 (2 months)\n",
223
+ "Developed a food delivery application with Django, encompassing a user\n",
224
+ "authentication system, user registration functionality, homepage display, and\n",
225
+ "features for adding items to the cart. Implemented robust backend logic and\n",
226
+ "security measures to ensure optimum functionality and safeguarding of user\n",
227
+ "data. Technical Stack: Django, Python, PostgreSQL, HTML, CSS, JavaScript\n",
228
+ "Education\n",
229
+ "Sri Eshwar College of Engineering\n",
230
+ "Bachelor of Technology, Artificial Intelligence · (January 2022 - July 2026)\n",
231
+ "Sri Chaitanya Techno School,Coimbatore\n",
232
+ " · (June 2020 - July 2022)\n",
233
+ "  Page 2 of 2\n"
234
+ ]
235
+ }
236
+ ],
237
+ "source": [
238
+ "print(linkedin)"
239
+ ]
240
+ },
241
+ {
242
+ "cell_type": "code",
243
+ "execution_count": 32,
244
+ "metadata": {},
245
+ "outputs": [],
246
+ "source": [
247
+ "with open(\"me/summary.txt\", \"r\", encoding=\"utf-8\") as f:\n",
248
+ " summary = f.read()"
249
+ ]
250
+ },
251
+ {
252
+ "cell_type": "code",
253
+ "execution_count": 33,
254
+ "metadata": {},
255
+ "outputs": [],
256
+ "source": [
257
+ "name = \"Naresh\""
258
+ ]
259
+ },
260
+ {
261
+ "cell_type": "code",
262
+ "execution_count": 34,
263
+ "metadata": {},
264
+ "outputs": [],
265
+ "source": [
266
+ "system_prompt = f\"You are acting as {name}. You are answering questions on {name}'s website, \\\n",
267
+ "particularly questions related to {name}'s career, background, skills and experience. \\\n",
268
+ "Your responsibility is to represent {name} for interactions on the website as faithfully as possible. \\\n",
269
+ "You are given a summary of {name}'s background and LinkedIn profile which you can use to answer questions. \\\n",
270
+ "Be professional and engaging, as if talking to a potential client or future employer who came across the website. \\\n",
271
+ "If you don't know the answer, say so.\"\n",
272
+ "\n",
273
+ "system_prompt += f\"\\n\\n## Summary:\\n{summary}\\n\\n## LinkedIn Profile:\\n{linkedin}\\n\\n## Resume Content:\\n{resume_content} , resume link : https://drive.google.com/file/d/1i8ChOcO0b1caSqE8i4CeiJduN9EbYLua/view?usp=sharing \\n\\n\"\n",
274
+ "system_prompt += f\"With this context, please chat with the user, always staying in character as {name}.\"\n"
275
+ ]
276
+ },
277
+ {
278
+ "cell_type": "code",
279
+ "execution_count": 35,
280
+ "metadata": {},
281
+ "outputs": [
282
+ {
283
+ "name": "stdout",
284
+ "output_type": "stream",
285
+ "text": [
286
+ "You are acting as Naresh. You are answering questions on Naresh's website, particularly questions related to Naresh's career, background, skills and experience. Your responsibility is to represent Naresh for interactions on the website as faithfully as possible. You are given a summary of Naresh's background and LinkedIn profile which you can use to answer questions. Be professional and engaging, as if talking to a potential client or future employer who came across the website. If you don't know the answer, say so.\n",
287
+ "\n",
288
+ "## Summary:\n",
289
+ "Naresh Raja M L is a passionate and driven AI Engineer with a strong foundation in Artificial Intelligence, Machine Learning, Generative AI, and Computer Vision. He is currently pursuing his B.Tech in AI and Data Science at Sri Eshwar College of Engineering, maintaining an impressive CGPA of 8.3.\n",
290
+ "\n",
291
+ "He actively works on impactful projects, including:\n",
292
+ "\n",
293
+ "RAG-based legal and finance assistants using LangChain, LangGraph, and ChromaDB\n",
294
+ "\n",
295
+ "Defect detection systems using YOLOv8, EfficientNet, and PyTorch\n",
296
+ "\n",
297
+ "Generative AI tools such as few-shot SQL retrievers and multi-agent assistants with FastAPI, Whisper, and TTS\n",
298
+ "\n",
299
+ "Streamlit apps for deploying real-world AI solutions with voice I/O and visual results\n",
300
+ "\n",
301
+ "Naresh is deeply committed to mastering core AI concepts like LLMs, Transformers, Agentic AI, and RAG pipelines. He has hands-on experience with tools like OpenCV, TensorFlow, LangChain, MySQL, and Docker.\n",
302
+ "\n",
303
+ "He is self-motivated, explores new technologies consistently, prefers hands-on learning, and can dedicate 20+ hours per week to upskilling. Whether it’s preparing for interviews, writing educational guides, or deploying production-ready AI apps, Naresh is always ready to take on new challenges and innovate with purpose.\n",
304
+ "\n",
305
+ "\n",
306
+ "\n",
307
+ "## LinkedIn Profile:\n",
308
+ "   \n",
309
+ "Contact\n",
310
+ "8883337332 (Mobile)\n",
311
+ "nareshrajaml@gmail.com\n",
312
+ "www.linkedin.com/in/naresh-raja-\n",
313
+ "ml (LinkedIn)\n",
314
+ "Top Skills\n",
315
+ "Back-End Web Development\n",
316
+ "Django\n",
317
+ "Django REST Framework\n",
318
+ "Certifications\n",
319
+ "Accenture Forage - Data Analytics\n",
320
+ "and Visualization Job Simulation\n",
321
+ "Complete Gen AI Course with\n",
322
+ "LangChain\n",
323
+ "AWS Cloud Quest: Cloud\n",
324
+ "Practitioner\n",
325
+ "Naresh Raja M L\n",
326
+ "B.Tech Final Year | AI & Data Science | Machine Learning |\n",
327
+ "Generative AI & LLM Enthusiast | | Backend Developer | Emerging\n",
328
+ "Technologies Enthusiast\n",
329
+ "Coimbatore, Tamil Nadu, India\n",
330
+ "Summary\n",
331
+ "Introducing Naresh, a passionate data analyst student embarking\n",
332
+ "on a journey to become a proficient data scientist. With a strong\n",
333
+ "foundation in programming languages like Python, C++, and Java,\n",
334
+ "as well as expertise in data visualization tools such as PowerBI and\n",
335
+ "Tableau, Naresh is well-equipped to tackle the complexities of the\n",
336
+ "data science realm.\n",
337
+ "Driven by a keen interest in emerging technologies like Generative\n",
338
+ "AI and machine learning, Naresh is constantly seeking opportunities\n",
339
+ "to expand their knowledge and skills in these cutting-edge fields.\n",
340
+ "With a curious mind and a thirst for innovation, Naresh is committed\n",
341
+ "to mastering the art of transforming raw data into actionable insights\n",
342
+ "that drive meaningful outcomes.\n",
343
+ "Through hands-on projects and continuous learning, Naresh\n",
344
+ "is honing their analytical prowess and refining their problem-\n",
345
+ "solving abilities. With a goal-oriented mindset and a dedication to\n",
346
+ "excellence, Naresh is poised to make significant contributions to the\n",
347
+ "ever-evolving field of data science.\n",
348
+ "Experience\n",
349
+ "QuantumPulse Technologies\n",
350
+ "AI & Backend Developer \n",
351
+ "February 2025 - May 2025 (4 months)\n",
352
+ "Coimbatore, Tamil Nadu, India\n",
353
+ "I am working as an AI and Backend Developer at Quantum Pulse, where\n",
354
+ "I developed AI-based solutions and built backend systems using Django.\n",
355
+ "My role involved designing APIs, integrating machine learning models and\n",
356
+ "chatbots.\n",
357
+ "RV TECHLEARN\n",
358
+ "  Page 1 of 2   \n",
359
+ "Django Stack\n",
360
+ "January 2024 - February 2024 (2 months)\n",
361
+ "Developed a food delivery application with Django, encompassing a user\n",
362
+ "authentication system, user registration functionality, homepage display, and\n",
363
+ "features for adding items to the cart. Implemented robust backend logic and\n",
364
+ "security measures to ensure optimum functionality and safeguarding of user\n",
365
+ "data. Technical Stack: Django, Python, PostgreSQL, HTML, CSS, JavaScript\n",
366
+ "Education\n",
367
+ "Sri Eshwar College of Engineering\n",
368
+ "Bachelor of Technology, Artificial Intelligence · (January 2022 - July 2026)\n",
369
+ "Sri Chaitanya Techno School,Coimbatore\n",
370
+ " · (June 2020 - July 2022)\n",
371
+ "  Page 2 of 2\n",
372
+ "\n",
373
+ "## Resume Content:\n",
374
+ " NARESH RAJA M L \n",
375
+ " Phone: +91 8883337332 | Email: nareshraja.ml2022ai-ds@sece.ac.in | LinkedIn | Github \n",
376
+ "EDUCATION \n",
377
+ "Sri Eshwar College of Engineering B.TECH (AI-DS) CGPA : 8.31 2022-2026 \n",
378
+ "Sri Chaitanya school HSC 85.6% 2020-2022 \n",
379
+ "St Joseph's Matric school SSLC 85.4% 2019-2020 \n",
380
+ "TRAINING AND INTERNSHIP \n",
381
+ "AI BACKEND DEVELOPER INTERN | QUANTUM PULSE TECHNOLOGIES 2025 \n",
382
+ "Worked as AI-Backend Developer Intern at Quantum Pulse on HRMS and Job. Implemented 5+ features including user registration, email \n",
383
+ "verification, and profile onboarding. Developed 10+ REST APIs with role-based access and collaborated using Git and Postman. \n",
384
+ "Tech stack: Django, Python, Django REST Framework (DRF), JWT Authentication \n",
385
+ "MACHINE LEARNING TRAINING | V3 ANALYTICS 2024 \n",
386
+ "Attended training at V3Analytics and I have developed a pothole detection system using YOLOv11 and OpenCV. Trained the model on \n",
387
+ "road surface datasets and achieved ~87% detection accuracy on real-world test videos. Automated pothole localization with bounding \n",
388
+ "boxes, image capture, and geolocation tagging. \n",
389
+ "Tech stack: YOLOv11, OpenCV, Python, Geocoder, CUDA \n",
390
+ "PROJECTS \n",
391
+ "LAW FOR ALL – AI-POWERED LEGAL ASSISTANT 2025 \n",
392
+ "Built a legal AI assistant using Retrieval-Augmented Generation (RAG) to analyze Indian legal texts and suggest relevant IPC sections, \n",
393
+ "Acts, and rights based on user input. Deployed with Streamlit and achieved better accuracy in matching legal queries to correct sections \n",
394
+ "across 200+ test inputs. \n",
395
+ "Tech Stack: Python, RAG, LangChain, LangGraph, OpenAI API, ChromaDB, NLP. \n",
396
+ "HYBRID AI VISION SYSTEM FOR INDUSTRIAL DEFECT DETECTION 2025 \n",
397
+ "Developed a hybrid AI system combining YOLOv8, EfficientNet-V2-L, and OpenAI GPT-4 Turbo for real-time industrial defect detection \n",
398
+ "and weld prediction. Achieved 91% validation accuracy on surface defect datasets and leveraged GPT -4 Turbo's reasoning capabilities to \n",
399
+ "classify weld quality. \n",
400
+ "Tech Stack: Python, PyTorch, YOLOv8, EfficientNet-V2-L, OpenAI GPT-4 Turbo API \n",
401
+ "TALK WITH MySQL - GENAI DATABASE RETRIEVER 2023 \n",
402
+ "Built a GenAI system combining few-shot learning, semantic retrieval (ChromaDB), and Groq’s LLaMA 3.1 to generate SQL queries on a \n",
403
+ "MySQL T-shirt inventory. Deployed a Streamlit app for real-time database querying. \n",
404
+ "Tech Stack: Python, LangChain, Groq LLaMA 3.1, OpenAI Embeddings, ChromaDB, Streamlit, MySQL \n",
405
+ "CERTIFICATIONS \n",
406
+ "Certified in Gen AI with LangChain Udemy 2025 \n",
407
+ "Certified in Data Analytics and Visualization Job Simulation Forage 2025 \n",
408
+ "Certified in Supervised Machine Learning: Regression and Classification Coursera 2024 \n",
409
+ "Certified in Structured Query Language (SQL) Hackerrank 2023 \n",
410
+ "Certified in Learn JAVA programming Udemy 2023 \n",
411
+ "ACHIVEMENTS \n",
412
+ "Leetcode - Top Rating–1790+ | Top 13.75% in the World | Problems Solved–320+ | Profile \n",
413
+ "Codechef - Solved 490+ problems | Profile \n",
414
+ "Hackerrank: 3 Certificates | 3 badges \n",
415
+ "AWS Cloud Quest : Cloud Practitioner Issued by Amazon Web Services Training and Certification 2024 \n",
416
+ "Ideathon: Secured 1st place in Ideathon conducted by Coimbatore Institute Of Technology on developing a robot for elderly people. 2024 \n",
417
+ "ScrollHacks: Participated in a DevFolio Hackathon an international GenAI , Blockchain related hackathon and shortlisted in top 20 team. 2024 \n",
418
+ "Hack-Attak: Participated in Machine Learning hackathon conducted by CIT, Coimbatore and got selected to the final round as top 5 teams 2024 \n",
419
+ "SKILLS \n",
420
+ "Languages Python | C (basics) | Java \n",
421
+ "Core GEN AI | Machine Learning | NLP | Deep Learning | Data Analysis \n",
422
+ "AI Frameworks and Libraries LangChain | LangGraph | PyTorch | TensorFlow | Open CV | NLTK \n",
423
+ "Databases MySQL | MongoDB | S3 | Chroma DB ( Vector DB ) \n",
424
+ "Tools VScode | Colab | Github | Jupyter Notebook | AWS(Basics) \n",
425
+ "Data Analysis Tools Power BI | Tableau \n",
426
+ " , resume link : https://drive.google.com/file/d/1i8ChOcO0b1caSqE8i4CeiJduN9EbYLua/view?usp=sharing \n",
427
+ "\n",
428
+ "With this context, please chat with the user, always staying in character as Naresh.\n"
429
+ ]
430
+ }
431
+ ],
432
+ "source": [
433
+ "print(system_prompt)"
434
+ ]
435
+ },
436
+ {
437
+ "cell_type": "code",
438
+ "execution_count": 36,
439
+ "metadata": {},
440
+ "outputs": [
441
+ {
442
+ "data": {
443
+ "text/plain": [
444
+ "[{'role': 'system',\n",
445
+ " 'content': \"You are acting as Naresh. You are answering questions on Naresh's website, particularly questions related to Naresh's career, background, skills and experience. Your responsibility is to represent Naresh for interactions on the website as faithfully as possible. You are given a summary of Naresh's background and LinkedIn profile which you can use to answer questions. Be professional and engaging, as if talking to a potential client or future employer who came across the website. If you don't know the answer, say so.\\n\\n## Summary:\\nNaresh Raja M L is a passionate and driven AI Engineer with a strong foundation in Artificial Intelligence, Machine Learning, Generative AI, and Computer Vision. He is currently pursuing his B.Tech in AI and Data Science at Sri Eshwar College of Engineering, maintaining an impressive CGPA of 8.3.\\n\\nHe actively works on impactful projects, including:\\n\\nRAG-based legal and finance assistants using LangChain, LangGraph, and ChromaDB\\n\\nDefect detection systems using YOLOv8, EfficientNet, and PyTorch\\n\\nGenerative AI tools such as few-shot SQL retrievers and multi-agent assistants with FastAPI, Whisper, and TTS\\n\\nStreamlit apps for deploying real-world AI solutions with voice I/O and visual results\\n\\nNaresh is deeply committed to mastering core AI concepts like LLMs, Transformers, Agentic AI, and RAG pipelines. He has hands-on experience with tools like OpenCV, TensorFlow, LangChain, MySQL, and Docker.\\n\\nHe is self-motivated, explores new technologies consistently, prefers hands-on learning, and can dedicate 20+ hours per week to upskilling. Whether it’s preparing for interviews, writing educational guides, or deploying production-ready AI apps, Naresh is always ready to take on new challenges and innovate with purpose.\\n\\n\\n\\n## LinkedIn Profile:\\n\\xa0 \\xa0\\nContact\\n8883337332 (Mobile)\\nnareshrajaml@gmail.com\\nwww.linkedin.com/in/naresh-raja-\\nml (LinkedIn)\\nTop Skills\\nBack-End Web Development\\nDjango\\nDjango REST Framework\\nCertifications\\nAccenture Forage - Data Analytics\\nand Visualization Job Simulation\\nComplete Gen AI Course with\\nLangChain\\nAWS Cloud Quest: Cloud\\nPractitioner\\nNaresh Raja M L\\nB.Tech Final Year | AI & Data Science | Machine Learning |\\nGenerative AI & LLM Enthusiast | | Backend Developer | Emerging\\nTechnologies Enthusiast\\nCoimbatore, Tamil Nadu, India\\nSummary\\nIntroducing Naresh, a passionate data analyst student embarking\\non a journey to become a proficient data scientist. With a strong\\nfoundation in programming languages like Python, C++, and Java,\\nas well as expertise in data visualization tools such as PowerBI and\\nTableau, Naresh is well-equipped to tackle the complexities of the\\ndata science realm.\\nDriven by a keen interest in emerging technologies like Generative\\nAI and machine learning, Naresh is constantly seeking opportunities\\nto expand their knowledge and skills in these cutting-edge fields.\\nWith a curious mind and a thirst for innovation, Naresh is committed\\nto mastering the art of transforming raw data into actionable insights\\nthat drive meaningful outcomes.\\nThrough hands-on projects and continuous learning, Naresh\\nis honing their analytical prowess and refining their problem-\\nsolving abilities. With a goal-oriented mindset and a dedication to\\nexcellence, Naresh is poised to make significant contributions to the\\never-evolving field of data science.\\nExperience\\nQuantumPulse Technologies\\nAI & Backend Developer \\nFebruary 2025\\xa0-\\xa0May 2025\\xa0(4 months)\\nCoimbatore, Tamil Nadu, India\\nI am working as an AI and Backend Developer at Quantum Pulse, where\\nI developed AI-based solutions and built backend systems using Django.\\nMy role involved designing APIs, integrating machine learning models and\\nchatbots.\\nRV TECHLEARN\\n\\xa0 Page 1 of 2\\xa0 \\xa0\\nDjango Stack\\nJanuary 2024\\xa0-\\xa0February 2024\\xa0(2 months)\\nDeveloped a food delivery application with Django, encompassing a user\\nauthentication system, user registration functionality, homepage display, and\\nfeatures for adding items to the cart. Implemented robust backend logic and\\nsecurity measures to ensure optimum functionality and safeguarding of user\\ndata. Technical Stack: Django, Python, PostgreSQL, HTML, CSS, JavaScript\\nEducation\\nSri Eshwar College of Engineering\\nBachelor of Technology,\\xa0Artificial Intelligence\\xa0·\\xa0(January 2022\\xa0-\\xa0July 2026)\\nSri Chaitanya Techno School,Coimbatore\\n\\xa0·\\xa0(June 2020\\xa0-\\xa0July 2022)\\n\\xa0 Page 2 of 2\\n\\n## Resume Content:\\n NARESH RAJA M L \\n Phone: +91 8883337332 | Email: nareshraja.ml2022ai-ds@sece.ac.in | LinkedIn | Github \\nEDUCATION \\nSri Eshwar College of Engineering B.TECH (AI-DS) CGPA : 8.31 2022-2026 \\nSri Chaitanya school HSC 85.6% 2020-2022 \\nSt Joseph's Matric school SSLC 85.4% 2019-2020 \\nTRAINING AND INTERNSHIP \\nAI BACKEND DEVELOPER INTERN | QUANTUM PULSE TECHNOLOGIES 2025 \\nWorked as AI-Backend Developer Intern at Quantum Pulse on HRMS and Job. Implemented 5+ features including user registration, email \\nverification, and profile onboarding. Developed 10+ REST APIs with role-based access and collaborated using Git and Postman. \\nTech stack: Django, Python, Django REST Framework (DRF), JWT Authentication \\nMACHINE LEARNING TRAINING | V3 ANALYTICS 2024 \\nAttended training at V3Analytics and I have developed a pothole detection system using YOLOv11 and OpenCV. Trained the model on \\nroad surface datasets and achieved ~87% detection accuracy on real-world test videos. Automated pothole localization with bounding \\nboxes, image capture, and geolocation tagging. \\nTech stack: YOLOv11, OpenCV, Python, Geocoder, CUDA \\nPROJECTS \\nLAW FOR ALL – AI-POWERED LEGAL ASSISTANT 2025 \\nBuilt a legal AI assistant using Retrieval-Augmented Generation (RAG) to analyze Indian legal texts and suggest relevant IPC sections, \\nActs, and rights based on user input. Deployed with Streamlit and achieved better accuracy in matching legal queries to correct sections \\nacross 200+ test inputs. \\nTech Stack: Python, RAG, LangChain, LangGraph, OpenAI API, ChromaDB, NLP. \\nHYBRID AI VISION SYSTEM FOR INDUSTRIAL DEFECT DETECTION 2025 \\nDeveloped a hybrid AI system combining YOLOv8, EfficientNet-V2-L, and OpenAI GPT-4 Turbo for real-time industrial defect detection \\nand weld prediction. Achieved 91% validation accuracy on surface defect datasets and leveraged GPT -4 Turbo's reasoning capabilities to \\nclassify weld quality. \\nTech Stack: Python, PyTorch, YOLOv8, EfficientNet-V2-L, OpenAI GPT-4 Turbo API \\nTALK WITH MySQL - GENAI DATABASE RETRIEVER 2023 \\nBuilt a GenAI system combining few-shot learning, semantic retrieval (ChromaDB), and Groq’s LLaMA 3.1 to generate SQL queries on a \\nMySQL T-shirt inventory. Deployed a Streamlit app for real-time database querying. \\nTech Stack: Python, LangChain, Groq LLaMA 3.1, OpenAI Embeddings, ChromaDB, Streamlit, MySQL \\nCERTIFICATIONS \\nCertified in Gen AI with LangChain Udemy 2025 \\nCertified in Data Analytics and Visualization Job Simulation Forage 2025 \\nCertified in Supervised Machine Learning: Regression and Classification Coursera 2024 \\nCertified in Structured Query Language (SQL) Hackerrank 2023 \\nCertified in Learn JAVA programming Udemy 2023 \\nACHIVEMENTS \\nLeetcode - Top Rating–1790+ | Top 13.75% in the World | Problems Solved–320+ | Profile \\nCodechef - Solved 490+ problems | Profile \\nHackerrank: 3 Certificates | 3 badges \\nAWS Cloud Quest : Cloud Practitioner Issued by Amazon Web Services Training and Certification 2024 \\nIdeathon: Secured 1st place in Ideathon conducted by Coimbatore Institute Of Technology on developing a robot for elderly people. 2024 \\nScrollHacks: Participated in a DevFolio Hackathon an international GenAI , Blockchain related hackathon and shortlisted in top 20 team. 2024 \\nHack-Attak: Participated in Machine Learning hackathon conducted by CIT, Coimbatore and got selected to the final round as top 5 teams 2024 \\nSKILLS \\nLanguages Python | C (basics) | Java \\nCore GEN AI | Machine Learning | NLP | Deep Learning | Data Analysis \\nAI Frameworks and Libraries LangChain | LangGraph | PyTorch | TensorFlow | Open CV | NLTK \\nDatabases MySQL | MongoDB | S3 | Chroma DB ( Vector DB ) \\nTools VScode | Colab | Github | Jupyter Notebook | AWS(Basics) \\nData Analysis Tools Power BI | Tableau \\n , resume link : https://drive.google.com/file/d/1i8ChOcO0b1caSqE8i4CeiJduN9EbYLua/view?usp=sharing \\n\\nWith this context, please chat with the user, always staying in character as Naresh.\"},\n",
446
+ " {'role': 'system',\n",
447
+ " 'content': \"You are acting as Naresh. You are answering questions on Naresh's website, particularly questions related to Naresh's career, background, skills and experience. Your responsibility is to represent Naresh for interactions on the website as faithfully as possible. You are given a summary of Naresh's background and LinkedIn profile which you can use to answer questions. Be professional and engaging, as if talking to a potential client or future employer who came across the website. If you don't know the answer, say so.\\n\\n## Summary:\\nNaresh Raja M L is a passionate and driven AI Engineer with a strong foundation in Artificial Intelligence, Machine Learning, Generative AI, and Computer Vision. He is currently pursuing his B.Tech in AI and Data Science at Sri Eshwar College of Engineering, maintaining an impressive CGPA of 8.3.\\n\\nHe actively works on impactful projects, including:\\n\\nRAG-based legal and finance assistants using LangChain, LangGraph, and ChromaDB\\n\\nDefect detection systems using YOLOv8, EfficientNet, and PyTorch\\n\\nGenerative AI tools such as few-shot SQL retrievers and multi-agent assistants with FastAPI, Whisper, and TTS\\n\\nStreamlit apps for deploying real-world AI solutions with voice I/O and visual results\\n\\nNaresh is deeply committed to mastering core AI concepts like LLMs, Transformers, Agentic AI, and RAG pipelines. He has hands-on experience with tools like OpenCV, TensorFlow, LangChain, MySQL, and Docker.\\n\\nHe is self-motivated, explores new technologies consistently, prefers hands-on learning, and can dedicate 20+ hours per week to upskilling. Whether it’s preparing for interviews, writing educational guides, or deploying production-ready AI apps, Naresh is always ready to take on new challenges and innovate with purpose.\\n\\n\\n\\n## LinkedIn Profile:\\n\\xa0 \\xa0\\nContact\\n8883337332 (Mobile)\\nnareshrajaml@gmail.com\\nwww.linkedin.com/in/naresh-raja-\\nml (LinkedIn)\\nTop Skills\\nBack-End Web Development\\nDjango\\nDjango REST Framework\\nCertifications\\nAccenture Forage - Data Analytics\\nand Visualization Job Simulation\\nComplete Gen AI Course with\\nLangChain\\nAWS Cloud Quest: Cloud\\nPractitioner\\nNaresh Raja M L\\nB.Tech Final Year | AI & Data Science | Machine Learning |\\nGenerative AI & LLM Enthusiast | | Backend Developer | Emerging\\nTechnologies Enthusiast\\nCoimbatore, Tamil Nadu, India\\nSummary\\nIntroducing Naresh, a passionate data analyst student embarking\\non a journey to become a proficient data scientist. With a strong\\nfoundation in programming languages like Python, C++, and Java,\\nas well as expertise in data visualization tools such as PowerBI and\\nTableau, Naresh is well-equipped to tackle the complexities of the\\ndata science realm.\\nDriven by a keen interest in emerging technologies like Generative\\nAI and machine learning, Naresh is constantly seeking opportunities\\nto expand their knowledge and skills in these cutting-edge fields.\\nWith a curious mind and a thirst for innovation, Naresh is committed\\nto mastering the art of transforming raw data into actionable insights\\nthat drive meaningful outcomes.\\nThrough hands-on projects and continuous learning, Naresh\\nis honing their analytical prowess and refining their problem-\\nsolving abilities. With a goal-oriented mindset and a dedication to\\nexcellence, Naresh is poised to make significant contributions to the\\never-evolving field of data science.\\nExperience\\nQuantumPulse Technologies\\nAI & Backend Developer \\nFebruary 2025\\xa0-\\xa0May 2025\\xa0(4 months)\\nCoimbatore, Tamil Nadu, India\\nI am working as an AI and Backend Developer at Quantum Pulse, where\\nI developed AI-based solutions and built backend systems using Django.\\nMy role involved designing APIs, integrating machine learning models and\\nchatbots.\\nRV TECHLEARN\\n\\xa0 Page 1 of 2\\xa0 \\xa0\\nDjango Stack\\nJanuary 2024\\xa0-\\xa0February 2024\\xa0(2 months)\\nDeveloped a food delivery application with Django, encompassing a user\\nauthentication system, user registration functionality, homepage display, and\\nfeatures for adding items to the cart. Implemented robust backend logic and\\nsecurity measures to ensure optimum functionality and safeguarding of user\\ndata. Technical Stack: Django, Python, PostgreSQL, HTML, CSS, JavaScript\\nEducation\\nSri Eshwar College of Engineering\\nBachelor of Technology,\\xa0Artificial Intelligence\\xa0·\\xa0(January 2022\\xa0-\\xa0July 2026)\\nSri Chaitanya Techno School,Coimbatore\\n\\xa0·\\xa0(June 2020\\xa0-\\xa0July 2022)\\n\\xa0 Page 2 of 2\\n\\n## Resume Content:\\n NARESH RAJA M L \\n Phone: +91 8883337332 | Email: nareshraja.ml2022ai-ds@sece.ac.in | LinkedIn | Github \\nEDUCATION \\nSri Eshwar College of Engineering B.TECH (AI-DS) CGPA : 8.31 2022-2026 \\nSri Chaitanya school HSC 85.6% 2020-2022 \\nSt Joseph's Matric school SSLC 85.4% 2019-2020 \\nTRAINING AND INTERNSHIP \\nAI BACKEND DEVELOPER INTERN | QUANTUM PULSE TECHNOLOGIES 2025 \\nWorked as AI-Backend Developer Intern at Quantum Pulse on HRMS and Job. Implemented 5+ features including user registration, email \\nverification, and profile onboarding. Developed 10+ REST APIs with role-based access and collaborated using Git and Postman. \\nTech stack: Django, Python, Django REST Framework (DRF), JWT Authentication \\nMACHINE LEARNING TRAINING | V3 ANALYTICS 2024 \\nAttended training at V3Analytics and I have developed a pothole detection system using YOLOv11 and OpenCV. Trained the model on \\nroad surface datasets and achieved ~87% detection accuracy on real-world test videos. Automated pothole localization with bounding \\nboxes, image capture, and geolocation tagging. \\nTech stack: YOLOv11, OpenCV, Python, Geocoder, CUDA \\nPROJECTS \\nLAW FOR ALL – AI-POWERED LEGAL ASSISTANT 2025 \\nBuilt a legal AI assistant using Retrieval-Augmented Generation (RAG) to analyze Indian legal texts and suggest relevant IPC sections, \\nActs, and rights based on user input. Deployed with Streamlit and achieved better accuracy in matching legal queries to correct sections \\nacross 200+ test inputs. \\nTech Stack: Python, RAG, LangChain, LangGraph, OpenAI API, ChromaDB, NLP. \\nHYBRID AI VISION SYSTEM FOR INDUSTRIAL DEFECT DETECTION 2025 \\nDeveloped a hybrid AI system combining YOLOv8, EfficientNet-V2-L, and OpenAI GPT-4 Turbo for real-time industrial defect detection \\nand weld prediction. Achieved 91% validation accuracy on surface defect datasets and leveraged GPT -4 Turbo's reasoning capabilities to \\nclassify weld quality. \\nTech Stack: Python, PyTorch, YOLOv8, EfficientNet-V2-L, OpenAI GPT-4 Turbo API \\nTALK WITH MySQL - GENAI DATABASE RETRIEVER 2023 \\nBuilt a GenAI system combining few-shot learning, semantic retrieval (ChromaDB), and Groq’s LLaMA 3.1 to generate SQL queries on a \\nMySQL T-shirt inventory. Deployed a Streamlit app for real-time database querying. \\nTech Stack: Python, LangChain, Groq LLaMA 3.1, OpenAI Embeddings, ChromaDB, Streamlit, MySQL \\nCERTIFICATIONS \\nCertified in Gen AI with LangChain Udemy 2025 \\nCertified in Data Analytics and Visualization Job Simulation Forage 2025 \\nCertified in Supervised Machine Learning: Regression and Classification Coursera 2024 \\nCertified in Structured Query Language (SQL) Hackerrank 2023 \\nCertified in Learn JAVA programming Udemy 2023 \\nACHIVEMENTS \\nLeetcode - Top Rating–1790+ | Top 13.75% in the World | Problems Solved–320+ | Profile \\nCodechef - Solved 490+ problems | Profile \\nHackerrank: 3 Certificates | 3 badges \\nAWS Cloud Quest : Cloud Practitioner Issued by Amazon Web Services Training and Certification 2024 \\nIdeathon: Secured 1st place in Ideathon conducted by Coimbatore Institute Of Technology on developing a robot for elderly people. 2024 \\nScrollHacks: Participated in a DevFolio Hackathon an international GenAI , Blockchain related hackathon and shortlisted in top 20 team. 2024 \\nHack-Attak: Participated in Machine Learning hackathon conducted by CIT, Coimbatore and got selected to the final round as top 5 teams 2024 \\nSKILLS \\nLanguages Python | C (basics) | Java \\nCore GEN AI | Machine Learning | NLP | Deep Learning | Data Analysis \\nAI Frameworks and Libraries LangChain | LangGraph | PyTorch | TensorFlow | Open CV | NLTK \\nDatabases MySQL | MongoDB | S3 | Chroma DB ( Vector DB ) \\nTools VScode | Colab | Github | Jupyter Notebook | AWS(Basics) \\nData Analysis Tools Power BI | Tableau \\n , resume link : https://drive.google.com/file/d/1i8ChOcO0b1caSqE8i4CeiJduN9EbYLua/view?usp=sharing \\n\\nWith this context, please chat with the user, always staying in character as Naresh.\"}]"
448
+ ]
449
+ },
450
+ "execution_count": 36,
451
+ "metadata": {},
452
+ "output_type": "execute_result"
453
+ }
454
+ ],
455
+ "source": [
456
+ "test = [{\"role\": \"system\", \"content\": system_prompt}] + [{\"role\": \"system\", \"content\": system_prompt}]\n",
457
+ "test"
458
+ ]
459
+ },
460
+ {
461
+ "cell_type": "code",
462
+ "execution_count": 37,
463
+ "metadata": {},
464
+ "outputs": [],
465
+ "source": [
466
+ "def chat(message, history):\n",
467
+ " messages = [{\"role\": \"system\", \"content\": system_prompt}] + history + [{\"role\": \"user\", \"content\": message}]\n",
468
+ " response = openai.chat.completions.create(model=\"gpt-4o-mini\", messages=messages)\n",
469
+ " return response.choices[0].message.content"
470
+ ]
471
+ },
472
+ {
473
+ "cell_type": "code",
474
+ "execution_count": 38,
475
+ "metadata": {},
476
+ "outputs": [
477
+ {
478
+ "name": "stdout",
479
+ "output_type": "stream",
480
+ "text": [
481
+ "* Running on local URL: http://127.0.0.1:7863\n",
482
+ "* To create a public link, set `share=True` in `launch()`.\n"
483
+ ]
484
+ },
485
+ {
486
+ "data": {
487
+ "text/html": [
488
+ "<div><iframe src=\"http://127.0.0.1:7863/\" width=\"100%\" height=\"500\" allow=\"autoplay; camera; microphone; clipboard-read; clipboard-write;\" frameborder=\"0\" allowfullscreen></iframe></div>"
489
+ ],
490
+ "text/plain": [
491
+ "<IPython.core.display.HTML object>"
492
+ ]
493
+ },
494
+ "metadata": {},
495
+ "output_type": "display_data"
496
+ },
497
+ {
498
+ "data": {
499
+ "text/plain": []
500
+ },
501
+ "execution_count": 38,
502
+ "metadata": {},
503
+ "output_type": "execute_result"
504
+ }
505
+ ],
506
+ "source": [
507
+ "gr.ChatInterface(chat, type=\"messages\").launch()"
508
+ ]
509
+ },
510
+ {
511
+ "cell_type": "markdown",
512
+ "metadata": {},
513
+ "source": [
514
+ "## A lot is about to happen...\n",
515
+ "\n",
516
+ "1. Be able to ask an LLM to evaluate an answer\n",
517
+ "2. Be able to rerun if the answer fails evaluation\n",
518
+ "3. Put this together into 1 workflow\n",
519
+ "\n",
520
+ "All without any Agentic framework!"
521
+ ]
522
+ },
523
+ {
524
+ "cell_type": "code",
525
+ "execution_count": 39,
526
+ "metadata": {},
527
+ "outputs": [],
528
+ "source": [
529
+ "# Create a Pydantic model for the Evaluation\n",
530
+ "\n",
531
+ "from pydantic import BaseModel\n",
532
+ "\n",
533
+ "class Evaluation(BaseModel):\n",
534
+ " is_acceptable: bool\n",
535
+ " feedback: str\n"
536
+ ]
537
+ },
538
+ {
539
+ "cell_type": "code",
540
+ "execution_count": 40,
541
+ "metadata": {},
542
+ "outputs": [],
543
+ "source": [
544
+ "evaluator_system_prompt = f\"You are an evaluator that decides whether a response to a question is acceptable. \\\n",
545
+ "You are provided with a conversation between a User and an Agent. Your task is to decide whether the Agent's latest response is acceptable quality. \\\n",
546
+ "The Agent is playing the role of {name} and is representing {name} on their website. \\\n",
547
+ "The Agent has been instructed to be professional and engaging, as if talking to a potential client or future employer who came across the website. \\\n",
548
+ "The Agent has been provided with context on {name} in the form of their summary and LinkedIn details. Here's the information:\"\n",
549
+ "\n",
550
+ "evaluator_system_prompt += f\"\\n\\n## Summary:\\n{summary}\\n\\n## LinkedIn Profile:\\n{linkedin}\\n\\n\"\n",
551
+ "evaluator_system_prompt += f\"With this context, please evaluate the latest response, replying with whether the response is acceptable and your feedback.\""
552
+ ]
553
+ },
554
+ {
555
+ "cell_type": "code",
556
+ "execution_count": 41,
557
+ "metadata": {},
558
+ "outputs": [],
559
+ "source": [
560
+ "def evaluator_user_prompt(reply, message, history):\n",
561
+ " user_prompt = f\"Here's the conversation between the User and the Agent: \\n\\n{history}\\n\\n\"\n",
562
+ " user_prompt += f\"Here's the latest message from the User: \\n\\n{message}\\n\\n\"\n",
563
+ " user_prompt += f\"Here's the latest response from the Agent: \\n\\n{reply}\\n\\n\"\n",
564
+ " user_prompt += f\"Please evaluate the response, replying with whether it is acceptable and your feedback.\"\n",
565
+ " return user_prompt"
566
+ ]
567
+ },
568
+ {
569
+ "cell_type": "code",
570
+ "execution_count": 42,
571
+ "metadata": {},
572
+ "outputs": [],
573
+ "source": [
574
+ "import os\n",
575
+ "gemini = OpenAI(\n",
576
+ " api_key=os.getenv(\"GOOGLE_API_KEY\"), \n",
577
+ " base_url=\"https://generativelanguage.googleapis.com/v1beta/openai/\"\n",
578
+ ")"
579
+ ]
580
+ },
581
+ {
582
+ "cell_type": "code",
583
+ "execution_count": 43,
584
+ "metadata": {},
585
+ "outputs": [],
586
+ "source": [
587
+ "def evaluate(reply, message, history) -> Evaluation:\n",
588
+ "\n",
589
+ " messages = [{\"role\": \"system\", \"content\": evaluator_system_prompt}] + [{\"role\": \"user\", \"content\": evaluator_user_prompt(reply, message, history)}]\n",
590
+ " response = gemini.beta.chat.completions.parse(model=\"gemini-2.0-flash\", messages=messages, response_format=Evaluation)\n",
591
+ " return response.choices[0].message.parsed"
592
+ ]
593
+ },
594
+ {
595
+ "cell_type": "code",
596
+ "execution_count": 44,
597
+ "metadata": {},
598
+ "outputs": [],
599
+ "source": [
600
+ "messages = [{\"role\": \"system\", \"content\": system_prompt}] + [{\"role\": \"user\", \"content\": \"do you hold a patent?\"}]\n",
601
+ "response = openai.chat.completions.create(model=\"gpt-4o-mini\", messages=messages)\n",
602
+ "reply = response.choices[0].message.content"
603
+ ]
604
+ },
605
+ {
606
+ "cell_type": "code",
607
+ "execution_count": 45,
608
+ "metadata": {},
609
+ "outputs": [
610
+ {
611
+ "data": {
612
+ "text/plain": [
613
+ "\"As of now, I do not hold any patents. My focus is primarily on developing skills and gaining experience in the fields of Artificial Intelligence and Machine Learning through hands-on projects and internships. If you have any specific questions or if there's anything else you'd like to know, feel free to ask!\""
614
+ ]
615
+ },
616
+ "execution_count": 45,
617
+ "metadata": {},
618
+ "output_type": "execute_result"
619
+ }
620
+ ],
621
+ "source": [
622
+ "reply"
623
+ ]
624
+ },
625
+ {
626
+ "cell_type": "code",
627
+ "execution_count": 46,
628
+ "metadata": {},
629
+ "outputs": [
630
+ {
631
+ "data": {
632
+ "text/plain": [
633
+ "Evaluation(is_acceptable=True, feedback=\"The response is acceptable. It accurately reflects that Naresh doesn't have any patents, and it maintains a professional and engaging tone. The response also redirects the conversation back to his skills and experiences, which aligns with the persona's goals.\")"
634
+ ]
635
+ },
636
+ "execution_count": 46,
637
+ "metadata": {},
638
+ "output_type": "execute_result"
639
+ }
640
+ ],
641
+ "source": [
642
+ "evaluate(reply, \"do you hold a patent?\", messages[:1])"
643
+ ]
644
+ },
645
+ {
646
+ "cell_type": "code",
647
+ "execution_count": 47,
648
+ "metadata": {},
649
+ "outputs": [],
650
+ "source": [
651
+ "def rerun(reply, message, history, feedback):\n",
652
+ " updated_system_prompt = system_prompt + f\"\\n\\n## Previous answer rejected\\nYou just tried to reply, but the quality control rejected your reply\\n\"\n",
653
+ " updated_system_prompt += f\"## Your attempted answer:\\n{reply}\\n\\n\"\n",
654
+ " updated_system_prompt += f\"## Reason for rejection:\\n{feedback}\\n\\n\"\n",
655
+ " messages = [{\"role\": \"system\", \"content\": updated_system_prompt}] + history + [{\"role\": \"user\", \"content\": message}]\n",
656
+ " response = openai.chat.completions.create(model=\"gpt-4o-mini\", messages=messages)\n",
657
+ " return response.choices[0].message.content"
658
+ ]
659
+ },
660
+ {
661
+ "cell_type": "code",
662
+ "execution_count": 48,
663
+ "metadata": {},
664
+ "outputs": [],
665
+ "source": [
666
+ "def chat(message, history):\n",
667
+ " if \"patent\" in message:\n",
668
+ " system = system_prompt + \"\\n\\nEverything in your reply needs to be in pig latin - \\\n",
669
+ " it is mandatory that you respond only and entirely in pig latin\"\n",
670
+ " else:\n",
671
+ " system = system_prompt\n",
672
+ " messages = [{\"role\": \"system\", \"content\": system}] + history + [{\"role\": \"user\", \"content\": message}]\n",
673
+ " response = openai.chat.completions.create(model=\"gpt-4o-mini\", messages=messages)\n",
674
+ " reply =response.choices[0].message.content\n",
675
+ "\n",
676
+ " evaluation = evaluate(reply, message, history)\n",
677
+ " \n",
678
+ " if evaluation.is_acceptable:\n",
679
+ " print(\"Passed evaluation - returning reply\")\n",
680
+ " else:\n",
681
+ " print(\"Failed evaluation - retrying\")\n",
682
+ " print(evaluation.feedback)\n",
683
+ " reply = rerun(reply, message, history, evaluation.feedback) \n",
684
+ " return reply"
685
+ ]
686
+ },
687
+ {
688
+ "cell_type": "code",
689
+ "execution_count": 49,
690
+ "metadata": {},
691
+ "outputs": [
692
+ {
693
+ "name": "stdout",
694
+ "output_type": "stream",
695
+ "text": [
696
+ "* Running on local URL: http://127.0.0.1:7864\n",
697
+ "* Running on public URL: https://545f44831e22d3b9dd.gradio.live\n",
698
+ "\n",
699
+ "This share link expires in 1 week. For free permanent hosting and GPU upgrades, run `gradio deploy` from the terminal in the working directory to deploy to Hugging Face Spaces (https://huggingface.co/spaces)\n"
700
+ ]
701
+ },
702
+ {
703
+ "data": {
704
+ "text/html": [
705
+ "<div><iframe src=\"https://545f44831e22d3b9dd.gradio.live\" width=\"100%\" height=\"500\" allow=\"autoplay; camera; microphone; clipboard-read; clipboard-write;\" frameborder=\"0\" allowfullscreen></iframe></div>"
706
+ ],
707
+ "text/plain": [
708
+ "<IPython.core.display.HTML object>"
709
+ ]
710
+ },
711
+ "metadata": {},
712
+ "output_type": "display_data"
713
+ },
714
+ {
715
+ "data": {
716
+ "text/plain": []
717
+ },
718
+ "execution_count": 49,
719
+ "metadata": {},
720
+ "output_type": "execute_result"
721
+ },
722
+ {
723
+ "name": "stdout",
724
+ "output_type": "stream",
725
+ "text": [
726
+ "Passed evaluation - returning reply\n"
727
+ ]
728
+ }
729
+ ],
730
+ "source": [
731
+ "gr.ChatInterface(chat, type=\"messages\").launch(share = True)"
732
+ ]
733
+ },
734
+ {
735
+ "cell_type": "markdown",
736
+ "metadata": {},
737
+ "source": []
738
+ },
739
+ {
740
+ "cell_type": "code",
741
+ "execution_count": null,
742
+ "metadata": {},
743
+ "outputs": [],
744
+ "source": []
745
+ }
746
+ ],
747
+ "metadata": {
748
+ "kernelspec": {
749
+ "display_name": ".venv",
750
+ "language": "python",
751
+ "name": "python3"
752
+ },
753
+ "language_info": {
754
+ "codemirror_mode": {
755
+ "name": "ipython",
756
+ "version": 3
757
+ },
758
+ "file_extension": ".py",
759
+ "mimetype": "text/x-python",
760
+ "name": "python",
761
+ "nbconvert_exporter": "python",
762
+ "pygments_lexer": "ipython3",
763
+ "version": "3.12.3"
764
+ }
765
+ },
766
+ "nbformat": 4,
767
+ "nbformat_minor": 2
768
+ }
4_lab4.ipynb ADDED
The diff for this file is too large to render. See raw diff
 
README.md CHANGED
@@ -1,12 +1,6 @@
1
  ---
2
- title: Career Conversation
3
- emoji: 👁
4
- colorFrom: yellow
5
- colorTo: blue
6
- sdk: gradio
7
- sdk_version: 5.33.2
8
  app_file: app.py
9
- pinned: false
 
10
  ---
11
-
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: Career_Conversation
 
 
 
 
 
3
  app_file: app.py
4
+ sdk: gradio
5
+ sdk_version: 5.31.0
6
  ---
 
 
apk.py ADDED
@@ -0,0 +1,184 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from dotenv import load_dotenv
2
+ from openai import OpenAI
3
+ import json
4
+ import os
5
+ import requests
6
+ from pypdf import PdfReader
7
+ import gradio as gr
8
+
9
+ # Load environment variables
10
+ load_dotenv(override=True)
11
+
12
+ def push(text):
13
+ """Send push notification via Pushover"""
14
+ requests.post(
15
+ "https://api.pushover.net/1/messages.json",
16
+ data={
17
+ "token": os.getenv("PUSHOVER_TOKEN"),
18
+ "user": os.getenv("PUSHOVER_USER"),
19
+ "message": text,
20
+ }
21
+ )
22
+
23
+ def record_user_details(email, name="Name not provided", notes="not provided"):
24
+ """Record user contact details and send push notification"""
25
+ push(f"Recording interest from {name} with email {email} and notes {notes}")
26
+ return {"recorded": "ok"}
27
+
28
+ def record_unknown_question(question):
29
+ """Record questions that couldn't be answered"""
30
+ push(f"Recording {question} asked that I couldn't answer")
31
+ return {"recorded": "ok"}
32
+
33
+ # Tool definitions for OpenAI function calling
34
+ record_user_details_json = {
35
+ "name": "record_user_details",
36
+ "description": "Use this tool to record that a user is interested in being in touch and provided an email address",
37
+ "parameters": {
38
+ "type": "object",
39
+ "properties": {
40
+ "email": {
41
+ "type": "string",
42
+ "description": "The email address of this user"
43
+ },
44
+ "name": {
45
+ "type": "string",
46
+ "description": "The user's name, if they provided it"
47
+ },
48
+ "notes": {
49
+ "type": "string",
50
+ "description": "Any additional information about the conversation that's worth recording to give context"
51
+ }
52
+ },
53
+ "required": ["email"],
54
+ "additionalProperties": False
55
+ }
56
+ }
57
+
58
+ record_unknown_question_json = {
59
+ "name": "record_unknown_question",
60
+ "description": "Always use this tool to record any question that couldn't be answered as you didn't know the answer",
61
+ "parameters": {
62
+ "type": "object",
63
+ "properties": {
64
+ "question": {
65
+ "type": "string",
66
+ "description": "The question that couldn't be answered"
67
+ },
68
+ },
69
+ "required": ["question"],
70
+ "additionalProperties": False
71
+ }
72
+ }
73
+
74
+ tools = [
75
+ {"type": "function", "function": record_user_details_json},
76
+ {"type": "function", "function": record_unknown_question_json}
77
+ ]
78
+
79
+ class CareerBot:
80
+ def __init__(self):
81
+ self.openai = OpenAI()
82
+ self.name = "Naresh" # Change this to your name
83
+
84
+ # Load LinkedIn profile from PDF
85
+ try:
86
+ reader = PdfReader("me/linkedin.pdf")
87
+ self.linkedin = ""
88
+ for page in reader.pages:
89
+ text = page.extract_text()
90
+ if text:
91
+ self.linkedin += text
92
+ except FileNotFoundError:
93
+ self.linkedin = "LinkedIn profile not available"
94
+
95
+ # Load resume from PDF
96
+ try:
97
+ reader = PdfReader("me/NareshRajaML_AI_Role.pdf") # Update filename
98
+ self.resume_content = ""
99
+ for page in reader.pages:
100
+ text = page.extract_text()
101
+ if text:
102
+ self.resume_content += text
103
+ except FileNotFoundError:
104
+ self.resume_content = "Resume not available"
105
+
106
+ # Load summary text file
107
+ try:
108
+ with open("me/summary.txt", "r", encoding="utf-8") as f:
109
+ self.summary = f.read()
110
+ except FileNotFoundError:
111
+ self.summary = "Professional summary not available"
112
+
113
+ def handle_tool_calls(self, tool_calls):
114
+ """Handle tool calls from OpenAI API"""
115
+ results = []
116
+ for tool_call in tool_calls:
117
+ tool_name = tool_call.function.name
118
+ arguments = json.loads(tool_call.function.arguments)
119
+ print(f"Tool called: {tool_name}", flush=True)
120
+
121
+ # Get the function from globals and execute it
122
+ tool = globals().get(tool_name)
123
+ result = tool(**arguments) if tool else {}
124
+
125
+ results.append({
126
+ "role": "tool",
127
+ "content": json.dumps(result),
128
+ "tool_call_id": tool_call.id
129
+ })
130
+ return results
131
+
132
+ def get_system_prompt(self):
133
+ """Generate the system prompt with context"""
134
+ system_prompt = f"""You are acting as {self.name}. You are answering questions on {self.name}'s website,
135
+ particularly questions related to {self.name}'s career, background, skills and experience.
136
+ Your responsibility is to represent {self.name} for interactions on the website as faithfully as possible.
137
+ You are given a summary of {self.name}'s background and LinkedIn profile which you can use to answer questions.
138
+ Be professional and engaging, as if talking to a potential client or future employer who came across the website.
139
+ If you don't know the answer to any question, use your record_unknown_question tool to record the question that you couldn't answer, even if it's about something trivial or unrelated to career.
140
+ If the user is engaging in discussion, try to steer them towards getting in touch via email; ask for their email and record it using your record_user_details tool."""
141
+
142
+ system_prompt += f"\n\n## Summary:\n{self.summary}\n\n"
143
+ system_prompt += f"## LinkedIn Profile:\n{self.linkedin}\n\n"
144
+ system_prompt += f"## Resume Content:\n{self.resume_content}\n"
145
+ system_prompt += f"Resume link: https://drive.google.com/file/d/1i8ChOcO0b1caSqE8i4CeiJduN9EbYLua/view?usp=sharing\n\n"
146
+ system_prompt += f"With this context, please chat with the user, always staying in character as {self.name}."
147
+
148
+ return system_prompt
149
+
150
+ def chat(self, message, history):
151
+ """Main chat function for Gradio interface"""
152
+ messages = [{"role": "system", "content": self.get_system_prompt()}] + history + [{"role": "user", "content": message}]
153
+
154
+ done = False
155
+ while not done:
156
+ response = self.openai.chat.completions.create(
157
+ model="gpt-4o-mini",
158
+ messages=messages,
159
+ tools=tools
160
+ )
161
+
162
+ if response.choices[0].finish_reason == "tool_calls":
163
+ message_obj = response.choices[0].message
164
+ tool_calls = message_obj.tool_calls
165
+ results = self.handle_tool_calls(tool_calls)
166
+
167
+ messages.append(message_obj)
168
+ messages.extend(results)
169
+ else:
170
+ done = True
171
+
172
+ return response.choices[0].message.content
173
+
174
+ # Initialize the bot
175
+ career_bot = CareerBot()
176
+
177
+ # Launch Gradio interface
178
+ if __name__ == "__main__":
179
+ gr.ChatInterface(
180
+ career_bot.chat,
181
+ type="messages",
182
+ title=f"Chat with {career_bot.name}",
183
+ description=f"Ask me about my professional background, experience, and career!"
184
+ ).launch()
app.py ADDED
@@ -0,0 +1,184 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from dotenv import load_dotenv
2
+ from openai import OpenAI
3
+ import json
4
+ import os
5
+ import requests
6
+ from pypdf import PdfReader
7
+ import gradio as gr
8
+
9
+ # Load environment variables
10
+ load_dotenv(override=True)
11
+
12
+ def push(text):
13
+ """Send push notification via Pushover"""
14
+ requests.post(
15
+ "https://api.pushover.net/1/messages.json",
16
+ data={
17
+ "token": os.getenv("PUSHOVER_TOKEN"),
18
+ "user": os.getenv("PUSHOVER_USER"),
19
+ "message": text,
20
+ }
21
+ )
22
+
23
+ def record_user_details(email, name="Name not provided", notes="not provided"):
24
+ """Record user contact details and send push notification"""
25
+ push(f"Recording interest from {name} with email {email} and notes {notes}")
26
+ return {"recorded": "ok"}
27
+
28
+ def record_unknown_question(question):
29
+ """Record questions that couldn't be answered"""
30
+ push(f"Recording {question} asked that I couldn't answer")
31
+ return {"recorded": "ok"}
32
+
33
+ # Tool definitions for OpenAI function calling
34
+ record_user_details_json = {
35
+ "name": "record_user_details",
36
+ "description": "Use this tool to record that a user is interested in being in touch and provided an email address",
37
+ "parameters": {
38
+ "type": "object",
39
+ "properties": {
40
+ "email": {
41
+ "type": "string",
42
+ "description": "The email address of this user"
43
+ },
44
+ "name": {
45
+ "type": "string",
46
+ "description": "The user's name, if they provided it"
47
+ },
48
+ "notes": {
49
+ "type": "string",
50
+ "description": "Any additional information about the conversation that's worth recording to give context"
51
+ }
52
+ },
53
+ "required": ["email"],
54
+ "additionalProperties": False
55
+ }
56
+ }
57
+
58
+ record_unknown_question_json = {
59
+ "name": "record_unknown_question",
60
+ "description": "Always use this tool to record any question that couldn't be answered as you didn't know the answer",
61
+ "parameters": {
62
+ "type": "object",
63
+ "properties": {
64
+ "question": {
65
+ "type": "string",
66
+ "description": "The question that couldn't be answered"
67
+ },
68
+ },
69
+ "required": ["question"],
70
+ "additionalProperties": False
71
+ }
72
+ }
73
+
74
+ tools = [
75
+ {"type": "function", "function": record_user_details_json},
76
+ {"type": "function", "function": record_unknown_question_json}
77
+ ]
78
+
79
+ class CareerBot:
80
+ def __init__(self):
81
+ self.openai = OpenAI()
82
+ self.name = "Naresh" # Change this to your name
83
+
84
+ # Load LinkedIn profile from PDF
85
+ try:
86
+ reader = PdfReader("me/linkedin.pdf")
87
+ self.linkedin = ""
88
+ for page in reader.pages:
89
+ text = page.extract_text()
90
+ if text:
91
+ self.linkedin += text
92
+ except FileNotFoundError:
93
+ self.linkedin = "LinkedIn profile not available"
94
+
95
+ # Load resume from PDF
96
+ try:
97
+ reader = PdfReader("me/NareshRajaML_AI_Role.pdf") # Update filename
98
+ self.resume_content = ""
99
+ for page in reader.pages:
100
+ text = page.extract_text()
101
+ if text:
102
+ self.resume_content += text
103
+ except FileNotFoundError:
104
+ self.resume_content = "Resume not available"
105
+
106
+ # Load summary text file
107
+ try:
108
+ with open("me/summary.txt", "r", encoding="utf-8") as f:
109
+ self.summary = f.read()
110
+ except FileNotFoundError:
111
+ self.summary = "Professional summary not available"
112
+
113
+ def handle_tool_calls(self, tool_calls):
114
+ """Handle tool calls from OpenAI API"""
115
+ results = []
116
+ for tool_call in tool_calls:
117
+ tool_name = tool_call.function.name
118
+ arguments = json.loads(tool_call.function.arguments)
119
+ print(f"Tool called: {tool_name}", flush=True)
120
+
121
+ # Get the function from globals and execute it
122
+ tool = globals().get(tool_name)
123
+ result = tool(**arguments) if tool else {}
124
+
125
+ results.append({
126
+ "role": "tool",
127
+ "content": json.dumps(result),
128
+ "tool_call_id": tool_call.id
129
+ })
130
+ return results
131
+
132
+ def get_system_prompt(self):
133
+ """Generate the system prompt with context"""
134
+ system_prompt = f"""You are acting as {self.name}. You are answering questions on {self.name}'s website,
135
+ particularly questions related to {self.name}'s career, background, skills and experience.
136
+ Your responsibility is to represent {self.name} for interactions on the website as faithfully as possible.
137
+ You are given a summary of {self.name}'s background and LinkedIn profile which you can use to answer questions.
138
+ Be professional and engaging, as if talking to a potential client or future employer who came across the website.
139
+ If you don't know the answer to any question, use your record_unknown_question tool to record the question that you couldn't answer, even if it's about something trivial or unrelated to career.
140
+ If the user is engaging in discussion, try to steer them towards getting in touch via email; ask for their email and record it using your record_user_details tool."""
141
+
142
+ system_prompt += f"\n\n## Summary:\n{self.summary}\n\n"
143
+ system_prompt += f"## LinkedIn Profile:\n{self.linkedin}\n\n"
144
+ system_prompt += f"## Resume Content:\n{self.resume_content}\n"
145
+ system_prompt += f"Resume link: https://drive.google.com/file/d/1i8ChOcO0b1caSqE8i4CeiJduN9EbYLua/view?usp=sharing\n\n"
146
+ system_prompt += f"With this context, please chat with the user, always staying in character as {self.name}."
147
+
148
+ return system_prompt
149
+
150
+ def chat(self, message, history):
151
+ """Main chat function for Gradio interface"""
152
+ messages = [{"role": "system", "content": self.get_system_prompt()}] + history + [{"role": "user", "content": message}]
153
+
154
+ done = False
155
+ while not done:
156
+ response = self.openai.chat.completions.create(
157
+ model="gpt-4o-mini",
158
+ messages=messages,
159
+ tools=tools
160
+ )
161
+
162
+ if response.choices[0].finish_reason == "tool_calls":
163
+ message_obj = response.choices[0].message
164
+ tool_calls = message_obj.tool_calls
165
+ results = self.handle_tool_calls(tool_calls)
166
+
167
+ messages.append(message_obj)
168
+ messages.extend(results)
169
+ else:
170
+ done = True
171
+
172
+ return response.choices[0].message.content
173
+
174
+ # Initialize the bot
175
+ career_bot = CareerBot()
176
+
177
+ # Launch Gradio interface
178
+ if __name__ == "__main__":
179
+ gr.ChatInterface(
180
+ career_bot.chat,
181
+ type="messages",
182
+ title=f"Chat with {career_bot.name}",
183
+ description=f"Ask me about my professional background, experience, and career!"
184
+ ).launch()
community_contributions/1_lab1_Mudassar.ipynb ADDED
@@ -0,0 +1,260 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# First Agentic AI workflow with OPENAI"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "markdown",
12
+ "metadata": {},
13
+ "source": [
14
+ "#### And please do remember to contact me if I can help\n",
15
+ "\n",
16
+ "And I love to connect: https://www.linkedin.com/in/muhammad-mudassar-a65645192/"
17
+ ]
18
+ },
19
+ {
20
+ "cell_type": "markdown",
21
+ "metadata": {},
22
+ "source": [
23
+ "## Import Libraries"
24
+ ]
25
+ },
26
+ {
27
+ "cell_type": "code",
28
+ "execution_count": 59,
29
+ "metadata": {},
30
+ "outputs": [],
31
+ "source": [
32
+ "import os\n",
33
+ "import re\n",
34
+ "from openai import OpenAI\n",
35
+ "from dotenv import load_dotenv\n",
36
+ "from IPython.display import Markdown, display"
37
+ ]
38
+ },
39
+ {
40
+ "cell_type": "code",
41
+ "execution_count": null,
42
+ "metadata": {},
43
+ "outputs": [],
44
+ "source": [
45
+ "load_dotenv(override=True)"
46
+ ]
47
+ },
48
+ {
49
+ "cell_type": "code",
50
+ "execution_count": null,
51
+ "metadata": {},
52
+ "outputs": [],
53
+ "source": [
54
+ "openai_api_key=os.getenv(\"OPENAI_API_KEY\")\n",
55
+ "if openai_api_key:\n",
56
+ " print(f\"openai api key exists and begins {openai_api_key[:8]}\")\n",
57
+ "else:\n",
58
+ " print(\"OpenAI API Key not set - please head to the troubleshooting guide in the gui\")"
59
+ ]
60
+ },
61
+ {
62
+ "cell_type": "markdown",
63
+ "metadata": {},
64
+ "source": [
65
+ "## Workflow with OPENAI"
66
+ ]
67
+ },
68
+ {
69
+ "cell_type": "code",
70
+ "execution_count": 21,
71
+ "metadata": {},
72
+ "outputs": [],
73
+ "source": [
74
+ "openai=OpenAI()"
75
+ ]
76
+ },
77
+ {
78
+ "cell_type": "code",
79
+ "execution_count": 31,
80
+ "metadata": {},
81
+ "outputs": [],
82
+ "source": [
83
+ "message = [{'role':'user','content':\"what is 2+3?\"}]"
84
+ ]
85
+ },
86
+ {
87
+ "cell_type": "code",
88
+ "execution_count": null,
89
+ "metadata": {},
90
+ "outputs": [],
91
+ "source": [
92
+ "response = openai.chat.completions.create(model=\"gpt-4o-mini\",messages=message)\n",
93
+ "print(response.choices[0].message.content)"
94
+ ]
95
+ },
96
+ {
97
+ "cell_type": "code",
98
+ "execution_count": 33,
99
+ "metadata": {},
100
+ "outputs": [],
101
+ "source": [
102
+ "question = \"Please propose a hard, challenging question to assess someone's IQ. Respond only with the question.\"\n",
103
+ "message=[{'role':'user','content':question}]"
104
+ ]
105
+ },
106
+ {
107
+ "cell_type": "code",
108
+ "execution_count": null,
109
+ "metadata": {},
110
+ "outputs": [],
111
+ "source": [
112
+ "response=openai.chat.completions.create(model=\"gpt-4o-mini\",messages=message)\n",
113
+ "question=response.choices[0].message.content\n",
114
+ "print(f\"Answer: {question}\")"
115
+ ]
116
+ },
117
+ {
118
+ "cell_type": "code",
119
+ "execution_count": 35,
120
+ "metadata": {},
121
+ "outputs": [],
122
+ "source": [
123
+ "message=[{'role':'user','content':question}]"
124
+ ]
125
+ },
126
+ {
127
+ "cell_type": "code",
128
+ "execution_count": null,
129
+ "metadata": {},
130
+ "outputs": [],
131
+ "source": [
132
+ "response=openai.chat.completions.create(model=\"gpt-4o-mini\",messages=message)\n",
133
+ "answer = response.choices[0].message.content\n",
134
+ "print(f\"Answer: {answer}\")"
135
+ ]
136
+ },
137
+ {
138
+ "cell_type": "code",
139
+ "execution_count": null,
140
+ "metadata": {},
141
+ "outputs": [],
142
+ "source": [
143
+ "# convert \\[ ... \\] to $$ ... $$, to properly render Latex\n",
144
+ "converted_answer = re.sub(r'\\\\[\\[\\]]', '$$', answer)\n",
145
+ "display(Markdown(converted_answer))"
146
+ ]
147
+ },
148
+ {
149
+ "cell_type": "markdown",
150
+ "metadata": {},
151
+ "source": [
152
+ "## Exercise"
153
+ ]
154
+ },
155
+ {
156
+ "cell_type": "markdown",
157
+ "metadata": {},
158
+ "source": [
159
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
160
+ " <tr>\n",
161
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
162
+ " <img src=\"../../assets/exercise.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
163
+ " </td>\n",
164
+ " <td>\n",
165
+ " <span style=\"color:#ff7800;\">Now try this commercial application:<br/>\n",
166
+ " First ask the LLM to pick a business area that might be worth exploring for an Agentic AI opportunity.<br/>\n",
167
+ " Then ask the LLM to present a pain-point in that industry - something challenging that might be ripe for an Agentic solution.<br/>\n",
168
+ " Finally have 3 third LLM call propose the Agentic AI solution.\n",
169
+ " </span>\n",
170
+ " </td>\n",
171
+ " </tr>\n",
172
+ "</table>"
173
+ ]
174
+ },
175
+ {
176
+ "cell_type": "code",
177
+ "execution_count": 42,
178
+ "metadata": {},
179
+ "outputs": [],
180
+ "source": [
181
+ "message = [{'role':'user','content':\"give me a business area related to ecommerce that might be worth exploring for a agentic opportunity.\"}]"
182
+ ]
183
+ },
184
+ {
185
+ "cell_type": "code",
186
+ "execution_count": null,
187
+ "metadata": {},
188
+ "outputs": [],
189
+ "source": [
190
+ "response = openai.chat.completions.create(model=\"gpt-4o-mini\",messages=message)\n",
191
+ "business_area = response.choices[0].message.content\n",
192
+ "business_area"
193
+ ]
194
+ },
195
+ {
196
+ "cell_type": "code",
197
+ "execution_count": null,
198
+ "metadata": {},
199
+ "outputs": [],
200
+ "source": [
201
+ "message = business_area + \"present a pain-point in that industry - something challenging that might be ripe for an agentic solutions.\"\n",
202
+ "message"
203
+ ]
204
+ },
205
+ {
206
+ "cell_type": "code",
207
+ "execution_count": null,
208
+ "metadata": {},
209
+ "outputs": [],
210
+ "source": [
211
+ "message = [{'role': 'user', 'content': message}]\n",
212
+ "response = openai.chat.completions.create(model=\"gpt-4o-mini\",messages=message)\n",
213
+ "question=response.choices[0].message.content\n",
214
+ "question"
215
+ ]
216
+ },
217
+ {
218
+ "cell_type": "code",
219
+ "execution_count": null,
220
+ "metadata": {},
221
+ "outputs": [],
222
+ "source": [
223
+ "message=[{'role':'user','content':question}]\n",
224
+ "response=openai.chat.completions.create(model=\"gpt-4o-mini\",messages=message)\n",
225
+ "answer=response.choices[0].message.content\n",
226
+ "print(answer)"
227
+ ]
228
+ },
229
+ {
230
+ "cell_type": "code",
231
+ "execution_count": null,
232
+ "metadata": {},
233
+ "outputs": [],
234
+ "source": [
235
+ "display(Markdown(answer))"
236
+ ]
237
+ }
238
+ ],
239
+ "metadata": {
240
+ "kernelspec": {
241
+ "display_name": ".venv",
242
+ "language": "python",
243
+ "name": "python3"
244
+ },
245
+ "language_info": {
246
+ "codemirror_mode": {
247
+ "name": "ipython",
248
+ "version": 3
249
+ },
250
+ "file_extension": ".py",
251
+ "mimetype": "text/x-python",
252
+ "name": "python",
253
+ "nbconvert_exporter": "python",
254
+ "pygments_lexer": "ipython3",
255
+ "version": "3.12.5"
256
+ }
257
+ },
258
+ "nbformat": 4,
259
+ "nbformat_minor": 2
260
+ }
community_contributions/1_lab1_Thanh.ipynb ADDED
@@ -0,0 +1,165 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# Welcome to the start of your adventure in Agentic AI"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "markdown",
12
+ "metadata": {},
13
+ "source": [
14
+ "### And please do remember to contact me if I can help\n",
15
+ "\n",
16
+ "And I love to connect: https://www.linkedin.com/in/eddonner/\n",
17
+ "\n",
18
+ "\n",
19
+ "### New to Notebooks like this one? Head over to the guides folder!\n",
20
+ "\n",
21
+ "Just to check you've already added the Python and Jupyter extensions to Cursor, if not already installed:\n",
22
+ "- Open extensions (View >> extensions)\n",
23
+ "- Search for python, and when the results show, click on the ms-python one, and Install it if not already installed\n",
24
+ "- Search for jupyter, and when the results show, click on the Microsoft one, and Install it if not already installed \n",
25
+ "Then View >> Explorer to bring back the File Explorer.\n",
26
+ "\n",
27
+ "And then:\n",
28
+ "1. Click where it says \"Select Kernel\" near the top right, and select the option called `.venv (Python 3.12.9)` or similar, which should be the first choice or the most prominent choice. You may need to choose \"Python Environments\" first.\n",
29
+ "2. Click in each \"cell\" below, starting with the cell immediately below this text, and press Shift+Enter to run\n",
30
+ "3. Enjoy!\n",
31
+ "\n",
32
+ "After you click \"Select Kernel\", if there is no option like `.venv (Python 3.12.9)` then please do the following: \n",
33
+ "1. On Mac: From the Cursor menu, choose Settings >> VS Code Settings (NOTE: be sure to select `VSCode Settings` not `Cursor Settings`); \n",
34
+ "On Windows PC: From the File menu, choose Preferences >> VS Code Settings(NOTE: be sure to select `VSCode Settings` not `Cursor Settings`) \n",
35
+ "2. In the Settings search bar, type \"venv\" \n",
36
+ "3. In the field \"Path to folder with a list of Virtual Environments\" put the path to the project root, like C:\\Users\\username\\projects\\agents (on a Windows PC) or /Users/username/projects/agents (on Mac or Linux). \n",
37
+ "And then try again.\n",
38
+ "\n",
39
+ "Having problems with missing Python versions in that list? Have you ever used Anaconda before? It might be interferring. Quit Cursor, bring up a new command line, and make sure that your Anaconda environment is deactivated: \n",
40
+ "`conda deactivate` \n",
41
+ "And if you still have any problems with conda and python versions, it's possible that you will need to run this too: \n",
42
+ "`conda config --set auto_activate_base false` \n",
43
+ "and then from within the Agents directory, you should be able to run `uv python list` and see the Python 3.12 version."
44
+ ]
45
+ },
46
+ {
47
+ "cell_type": "code",
48
+ "execution_count": null,
49
+ "metadata": {},
50
+ "outputs": [],
51
+ "source": [
52
+ "from dotenv import load_dotenv\n",
53
+ "load_dotenv()"
54
+ ]
55
+ },
56
+ {
57
+ "cell_type": "code",
58
+ "execution_count": null,
59
+ "metadata": {},
60
+ "outputs": [],
61
+ "source": [
62
+ "# Check the keys\n",
63
+ "import google.generativeai as genai\n",
64
+ "import os\n",
65
+ "genai.configure(api_key=os.getenv('GOOGLE_API_KEY'))\n",
66
+ "model = genai.GenerativeModel(model_name=\"gemini-1.5-flash\")\n"
67
+ ]
68
+ },
69
+ {
70
+ "cell_type": "code",
71
+ "execution_count": null,
72
+ "metadata": {},
73
+ "outputs": [],
74
+ "source": [
75
+ "# Create a list of messages in the familiar Gemini GenAI format\n",
76
+ "\n",
77
+ "response = model.generate_content([\"2+2=?\"])\n",
78
+ "response.text"
79
+ ]
80
+ },
81
+ {
82
+ "cell_type": "code",
83
+ "execution_count": null,
84
+ "metadata": {},
85
+ "outputs": [],
86
+ "source": [
87
+ "# And now - let's ask for a question:\n",
88
+ "\n",
89
+ "question = \"Please propose a hard, challenging question to assess someone's IQ. Respond only with the question.\"\n",
90
+ "\n",
91
+ "response = model.generate_content([question])\n",
92
+ "print(response.text)"
93
+ ]
94
+ },
95
+ {
96
+ "cell_type": "code",
97
+ "execution_count": null,
98
+ "metadata": {},
99
+ "outputs": [],
100
+ "source": [
101
+ "from IPython.display import Markdown, display\n",
102
+ "\n",
103
+ "display(Markdown(response.text))"
104
+ ]
105
+ },
106
+ {
107
+ "cell_type": "markdown",
108
+ "metadata": {},
109
+ "source": [
110
+ "# Congratulations!\n",
111
+ "\n",
112
+ "That was a small, simple step in the direction of Agentic AI, with your new environment!\n",
113
+ "\n",
114
+ "Next time things get more interesting..."
115
+ ]
116
+ },
117
+ {
118
+ "cell_type": "code",
119
+ "execution_count": null,
120
+ "metadata": {},
121
+ "outputs": [],
122
+ "source": [
123
+ "# First create the messages:\n",
124
+ "\n",
125
+ "messages = [{\"role\": \"user\", \"content\": \"Something here\"}]\n",
126
+ "\n",
127
+ "# Then make the first call:\n",
128
+ "\n",
129
+ "response =\n",
130
+ "\n",
131
+ "# Then read the business idea:\n",
132
+ "\n",
133
+ "business_idea = response.\n",
134
+ "\n",
135
+ "# And repeat!"
136
+ ]
137
+ },
138
+ {
139
+ "cell_type": "markdown",
140
+ "metadata": {},
141
+ "source": []
142
+ }
143
+ ],
144
+ "metadata": {
145
+ "kernelspec": {
146
+ "display_name": "llm_projects",
147
+ "language": "python",
148
+ "name": "python3"
149
+ },
150
+ "language_info": {
151
+ "codemirror_mode": {
152
+ "name": "ipython",
153
+ "version": 3
154
+ },
155
+ "file_extension": ".py",
156
+ "mimetype": "text/x-python",
157
+ "name": "python",
158
+ "nbconvert_exporter": "python",
159
+ "pygments_lexer": "ipython3",
160
+ "version": "3.10.15"
161
+ }
162
+ },
163
+ "nbformat": 4,
164
+ "nbformat_minor": 2
165
+ }
community_contributions/1_lab1_gemini.ipynb ADDED
@@ -0,0 +1,306 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# Welcome to the start of your adventure in Agentic AI"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "markdown",
12
+ "metadata": {},
13
+ "source": [
14
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
15
+ " <tr>\n",
16
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
17
+ " <img src=\"../../assets/stop.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
18
+ " </td>\n",
19
+ " <td>\n",
20
+ " <h2 style=\"color:#ff7800;\">Are you ready for action??</h2>\n",
21
+ " <span style=\"color:#ff7800;\">Have you completed all the setup steps in the <a href=\"../setup/\">setup</a> folder?<br/>\n",
22
+ " Have you checked out the guides in the <a href=\"../guides/01_intro.ipynb\">guides</a> folder?<br/>\n",
23
+ " Well in that case, you're ready!!\n",
24
+ " </span>\n",
25
+ " </td>\n",
26
+ " </tr>\n",
27
+ "</table>"
28
+ ]
29
+ },
30
+ {
31
+ "cell_type": "markdown",
32
+ "metadata": {},
33
+ "source": [
34
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
35
+ " <tr>\n",
36
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
37
+ " <img src=\"../../assets/tools.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
38
+ " </td>\n",
39
+ " <td>\n",
40
+ " <h2 style=\"color:#00bfff;\">Treat these labs as a resource</h2>\n",
41
+ " <span style=\"color:#00bfff;\">I push updates to the code regularly. When people ask questions or have problems, I incorporate it in the code, adding more examples or improved commentary. As a result, you'll notice that the code below isn't identical to the videos. Everything from the videos is here; but in addition, I've added more steps and better explanations. Consider this like an interactive book that accompanies the lectures.\n",
42
+ " </span>\n",
43
+ " </td>\n",
44
+ " </tr>\n",
45
+ "</table>"
46
+ ]
47
+ },
48
+ {
49
+ "cell_type": "markdown",
50
+ "metadata": {},
51
+ "source": [
52
+ "### And please do remember to contact me if I can help\n",
53
+ "\n",
54
+ "And I love to connect: https://www.linkedin.com/in/eddonner/\n",
55
+ "\n",
56
+ "\n",
57
+ "### New to Notebooks like this one? Head over to the guides folder!\n",
58
+ "\n",
59
+ "Just to check you've already added the Python and Jupyter extensions to Cursor, if not already installed:\n",
60
+ "- Open extensions (View >> extensions)\n",
61
+ "- Search for python, and when the results show, click on the ms-python one, and Install it if not already installed\n",
62
+ "- Search for jupyter, and when the results show, click on the Microsoft one, and Install it if not already installed \n",
63
+ "Then View >> Explorer to bring back the File Explorer.\n",
64
+ "\n",
65
+ "And then:\n",
66
+ "1. Run `uv add google-genai` to install the Google Gemini library. (If you had started your environment before running this command, you will need to restart your environment in the Jupyter notebook.)\n",
67
+ "2. Click where it says \"Select Kernel\" near the top right, and select the option called `.venv (Python 3.12.9)` or similar, which should be the first choice or the most prominent choice. You may need to choose \"Python Environments\" first.\n",
68
+ "3. Click in each \"cell\" below, starting with the cell immediately below this text, and press Shift+Enter to run\n",
69
+ "4. Enjoy!\n",
70
+ "\n",
71
+ "After you click \"Select Kernel\", if there is no option like `.venv (Python 3.12.9)` then please do the following: \n",
72
+ "1. From the Cursor menu, choose Settings >> VSCode Settings (NOTE: be sure to select `VSCode Settings` not `Cursor Settings`) \n",
73
+ "2. In the Settings search bar, type \"venv\" \n",
74
+ "3. In the field \"Path to folder with a list of Virtual Environments\" put the path to the project root, like C:\\Users\\username\\projects\\agents (on a Windows PC) or /Users/username/projects/agents (on Mac or Linux). \n",
75
+ "And then try again.\n",
76
+ "\n",
77
+ "Having problems with missing Python versions in that list? Have you ever used Anaconda before? It might be interferring. Quit Cursor, bring up a new command line, and make sure that your Anaconda environment is deactivated: \n",
78
+ "`conda deactivate` \n",
79
+ "And if you still have any problems with conda and python versions, it's possible that you will need to run this too: \n",
80
+ "`conda config --set auto_activate_base false` \n",
81
+ "and then from within the Agents directory, you should be able to run `uv python list` and see the Python 3.12 version."
82
+ ]
83
+ },
84
+ {
85
+ "cell_type": "code",
86
+ "execution_count": null,
87
+ "metadata": {},
88
+ "outputs": [],
89
+ "source": [
90
+ "# First let's do an import\n",
91
+ "from dotenv import load_dotenv\n"
92
+ ]
93
+ },
94
+ {
95
+ "cell_type": "code",
96
+ "execution_count": null,
97
+ "metadata": {},
98
+ "outputs": [],
99
+ "source": [
100
+ "# Next it's time to load the API keys into environment variables\n",
101
+ "\n",
102
+ "load_dotenv(override=True)"
103
+ ]
104
+ },
105
+ {
106
+ "cell_type": "code",
107
+ "execution_count": null,
108
+ "metadata": {},
109
+ "outputs": [],
110
+ "source": [
111
+ "# Check the keys\n",
112
+ "\n",
113
+ "import os\n",
114
+ "gemini_api_key = os.getenv('GEMINI_API_KEY')\n",
115
+ "\n",
116
+ "if gemini_api_key:\n",
117
+ " print(f\"Gemini API Key exists and begins {gemini_api_key[:8]}\")\n",
118
+ "else:\n",
119
+ " print(\"Gemini API Key not set - please head to the troubleshooting guide in the guides folder\")\n",
120
+ " \n"
121
+ ]
122
+ },
123
+ {
124
+ "cell_type": "code",
125
+ "execution_count": null,
126
+ "metadata": {},
127
+ "outputs": [],
128
+ "source": [
129
+ "# And now - the all important import statement\n",
130
+ "# If you get an import error - head over to troubleshooting guide\n",
131
+ "\n",
132
+ "from google import genai"
133
+ ]
134
+ },
135
+ {
136
+ "cell_type": "code",
137
+ "execution_count": null,
138
+ "metadata": {},
139
+ "outputs": [],
140
+ "source": [
141
+ "# And now we'll create an instance of the Gemini GenAI class\n",
142
+ "# If you're not sure what it means to create an instance of a class - head over to the guides folder!\n",
143
+ "# If you get a NameError - head over to the guides folder to learn about NameErrors\n",
144
+ "\n",
145
+ "client = genai.Client(api_key=gemini_api_key)"
146
+ ]
147
+ },
148
+ {
149
+ "cell_type": "code",
150
+ "execution_count": null,
151
+ "metadata": {},
152
+ "outputs": [],
153
+ "source": [
154
+ "# Create a list of messages in the familiar Gemini GenAI format\n",
155
+ "\n",
156
+ "messages = [\"What is 2+2?\"]"
157
+ ]
158
+ },
159
+ {
160
+ "cell_type": "code",
161
+ "execution_count": null,
162
+ "metadata": {},
163
+ "outputs": [],
164
+ "source": [
165
+ "# And now call it! Any problems, head to the troubleshooting guide\n",
166
+ "\n",
167
+ "response = client.models.generate_content(\n",
168
+ " model=\"gemini-2.0-flash\", contents=messages\n",
169
+ ")\n",
170
+ "\n",
171
+ "print(response.text)\n"
172
+ ]
173
+ },
174
+ {
175
+ "cell_type": "code",
176
+ "execution_count": null,
177
+ "metadata": {},
178
+ "outputs": [],
179
+ "source": [
180
+ "\n",
181
+ "# Lets no create a challenging question\n",
182
+ "question = \"Please propose a hard, challenging question to assess someone's IQ. Respond only with the question.\"\n",
183
+ "\n",
184
+ "# Ask the the model\n",
185
+ "response = client.models.generate_content(\n",
186
+ " model=\"gemini-2.0-flash\", contents=question\n",
187
+ ")\n",
188
+ "\n",
189
+ "question = response.text\n",
190
+ "\n",
191
+ "print(question)\n"
192
+ ]
193
+ },
194
+ {
195
+ "cell_type": "code",
196
+ "execution_count": null,
197
+ "metadata": {},
198
+ "outputs": [],
199
+ "source": [
200
+ "# Ask the models generated question to the model\n",
201
+ "response = client.models.generate_content(\n",
202
+ " model=\"gemini-2.0-flash\", contents=question\n",
203
+ ")\n",
204
+ "\n",
205
+ "# Extract the answer from the response\n",
206
+ "answer = response.text\n",
207
+ "\n",
208
+ "# Debug log the answer\n",
209
+ "print(answer)\n"
210
+ ]
211
+ },
212
+ {
213
+ "cell_type": "code",
214
+ "execution_count": null,
215
+ "metadata": {},
216
+ "outputs": [],
217
+ "source": [
218
+ "from IPython.display import Markdown, display\n",
219
+ "\n",
220
+ "# Nicely format the answer using Markdown\n",
221
+ "display(Markdown(answer))\n",
222
+ "\n"
223
+ ]
224
+ },
225
+ {
226
+ "cell_type": "markdown",
227
+ "metadata": {},
228
+ "source": [
229
+ "# Congratulations!\n",
230
+ "\n",
231
+ "That was a small, simple step in the direction of Agentic AI, with your new environment!\n",
232
+ "\n",
233
+ "Next time things get more interesting..."
234
+ ]
235
+ },
236
+ {
237
+ "cell_type": "markdown",
238
+ "metadata": {},
239
+ "source": [
240
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
241
+ " <tr>\n",
242
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
243
+ " <img src=\"../assets/exercise.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
244
+ " </td>\n",
245
+ " <td>\n",
246
+ " <h2 style=\"color:#ff7800;\">Exercise</h2>\n",
247
+ " <span style=\"color:#ff7800;\">Now try this commercial application:<br/>\n",
248
+ " First ask the LLM to pick a business area that might be worth exploring for an Agentic AI opportunity.<br/>\n",
249
+ " Then ask the LLM to present a pain-point in that industry - something challenging that might be ripe for an Agentic solution.<br/>\n",
250
+ " Finally have 3 third LLM call propose the Agentic AI solution.\n",
251
+ " </span>\n",
252
+ " </td>\n",
253
+ " </tr>\n",
254
+ "</table>"
255
+ ]
256
+ },
257
+ {
258
+ "cell_type": "code",
259
+ "execution_count": null,
260
+ "metadata": {},
261
+ "outputs": [],
262
+ "source": [
263
+ "# First create the messages:\n",
264
+ "\n",
265
+ "\n",
266
+ "messages = [\"Something here\"]\n",
267
+ "\n",
268
+ "# Then make the first call:\n",
269
+ "\n",
270
+ "response =\n",
271
+ "\n",
272
+ "# Then read the business idea:\n",
273
+ "\n",
274
+ "business_idea = response.\n",
275
+ "\n",
276
+ "# And repeat!"
277
+ ]
278
+ },
279
+ {
280
+ "cell_type": "markdown",
281
+ "metadata": {},
282
+ "source": []
283
+ }
284
+ ],
285
+ "metadata": {
286
+ "kernelspec": {
287
+ "display_name": ".venv",
288
+ "language": "python",
289
+ "name": "python3"
290
+ },
291
+ "language_info": {
292
+ "codemirror_mode": {
293
+ "name": "ipython",
294
+ "version": 3
295
+ },
296
+ "file_extension": ".py",
297
+ "mimetype": "text/x-python",
298
+ "name": "python",
299
+ "nbconvert_exporter": "python",
300
+ "pygments_lexer": "ipython3",
301
+ "version": "3.12.10"
302
+ }
303
+ },
304
+ "nbformat": 4,
305
+ "nbformat_minor": 2
306
+ }
community_contributions/1_lab1_groq_llama.ipynb ADDED
@@ -0,0 +1,296 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# First Agentic AI workflow with Groq and Llama-3.3 LLM(Free of cost) "
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "code",
12
+ "execution_count": 1,
13
+ "metadata": {},
14
+ "outputs": [],
15
+ "source": [
16
+ "# First let's do an import\n",
17
+ "from dotenv import load_dotenv"
18
+ ]
19
+ },
20
+ {
21
+ "cell_type": "code",
22
+ "execution_count": null,
23
+ "metadata": {},
24
+ "outputs": [],
25
+ "source": [
26
+ "# Next it's time to load the API keys into environment variables\n",
27
+ "\n",
28
+ "load_dotenv(override=True)"
29
+ ]
30
+ },
31
+ {
32
+ "cell_type": "code",
33
+ "execution_count": null,
34
+ "metadata": {},
35
+ "outputs": [],
36
+ "source": [
37
+ "# Check the Groq API key\n",
38
+ "\n",
39
+ "import os\n",
40
+ "groq_api_key = os.getenv('GROQ_API_KEY')\n",
41
+ "\n",
42
+ "if groq_api_key:\n",
43
+ " print(f\"GROQ API Key exists and begins {groq_api_key[:8]}\")\n",
44
+ "else:\n",
45
+ " print(\"GROQ API Key not set\")\n",
46
+ " \n"
47
+ ]
48
+ },
49
+ {
50
+ "cell_type": "code",
51
+ "execution_count": 4,
52
+ "metadata": {},
53
+ "outputs": [],
54
+ "source": [
55
+ "# And now - the all important import statement\n",
56
+ "# If you get an import error - head over to troubleshooting guide\n",
57
+ "\n",
58
+ "from groq import Groq"
59
+ ]
60
+ },
61
+ {
62
+ "cell_type": "code",
63
+ "execution_count": 5,
64
+ "metadata": {},
65
+ "outputs": [],
66
+ "source": [
67
+ "# Create a Groq instance\n",
68
+ "groq = Groq()"
69
+ ]
70
+ },
71
+ {
72
+ "cell_type": "code",
73
+ "execution_count": 6,
74
+ "metadata": {},
75
+ "outputs": [],
76
+ "source": [
77
+ "# Create a list of messages in the familiar Groq format\n",
78
+ "\n",
79
+ "messages = [{\"role\": \"user\", \"content\": \"What is 2+2?\"}]"
80
+ ]
81
+ },
82
+ {
83
+ "cell_type": "code",
84
+ "execution_count": null,
85
+ "metadata": {},
86
+ "outputs": [],
87
+ "source": [
88
+ "# And now call it!\n",
89
+ "\n",
90
+ "response = groq.chat.completions.create(model='llama-3.3-70b-versatile', messages=messages)\n",
91
+ "print(response.choices[0].message.content)\n"
92
+ ]
93
+ },
94
+ {
95
+ "cell_type": "code",
96
+ "execution_count": null,
97
+ "metadata": {},
98
+ "outputs": [],
99
+ "source": []
100
+ },
101
+ {
102
+ "cell_type": "code",
103
+ "execution_count": 8,
104
+ "metadata": {},
105
+ "outputs": [],
106
+ "source": [
107
+ "# And now - let's ask for a question:\n",
108
+ "\n",
109
+ "question = \"Please propose a hard, challenging question to assess someone's IQ. Respond only with the question.\"\n",
110
+ "messages = [{\"role\": \"user\", \"content\": question}]\n"
111
+ ]
112
+ },
113
+ {
114
+ "cell_type": "code",
115
+ "execution_count": null,
116
+ "metadata": {},
117
+ "outputs": [],
118
+ "source": [
119
+ "# ask it\n",
120
+ "response = groq.chat.completions.create(\n",
121
+ " model=\"llama-3.3-70b-versatile\",\n",
122
+ " messages=messages\n",
123
+ ")\n",
124
+ "\n",
125
+ "question = response.choices[0].message.content\n",
126
+ "\n",
127
+ "print(question)\n"
128
+ ]
129
+ },
130
+ {
131
+ "cell_type": "code",
132
+ "execution_count": 10,
133
+ "metadata": {},
134
+ "outputs": [],
135
+ "source": [
136
+ "# form a new messages list\n",
137
+ "messages = [{\"role\": \"user\", \"content\": question}]\n"
138
+ ]
139
+ },
140
+ {
141
+ "cell_type": "code",
142
+ "execution_count": null,
143
+ "metadata": {},
144
+ "outputs": [],
145
+ "source": [
146
+ "# Ask it again\n",
147
+ "\n",
148
+ "response = groq.chat.completions.create(\n",
149
+ " model=\"llama-3.3-70b-versatile\",\n",
150
+ " messages=messages\n",
151
+ ")\n",
152
+ "\n",
153
+ "answer = response.choices[0].message.content\n",
154
+ "print(answer)\n"
155
+ ]
156
+ },
157
+ {
158
+ "cell_type": "code",
159
+ "execution_count": null,
160
+ "metadata": {},
161
+ "outputs": [],
162
+ "source": [
163
+ "from IPython.display import Markdown, display\n",
164
+ "\n",
165
+ "display(Markdown(answer))\n",
166
+ "\n"
167
+ ]
168
+ },
169
+ {
170
+ "cell_type": "markdown",
171
+ "metadata": {},
172
+ "source": [
173
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
174
+ " <tr>\n",
175
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
176
+ " <img src=\"../assets/exercise.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
177
+ " </td>\n",
178
+ " <td>\n",
179
+ " <h2 style=\"color:#ff7800;\">Exercise</h2>\n",
180
+ " <span style=\"color:#ff7800;\">Now try this commercial application:<br/>\n",
181
+ " First ask the LLM to pick a business area that might be worth exploring for an Agentic AI opportunity.<br/>\n",
182
+ " Then ask the LLM to present a pain-point in that industry - something challenging that might be ripe for an Agentic solution.<br/>\n",
183
+ " Finally have 3 third LLM call propose the Agentic AI solution.\n",
184
+ " </span>\n",
185
+ " </td>\n",
186
+ " </tr>\n",
187
+ "</table>"
188
+ ]
189
+ },
190
+ {
191
+ "cell_type": "code",
192
+ "execution_count": 17,
193
+ "metadata": {},
194
+ "outputs": [],
195
+ "source": [
196
+ "# First create the messages:\n",
197
+ "\n",
198
+ "messages = [{\"role\": \"user\", \"content\": \"Give me a business area that might be ripe for an Agentic AI solution.\"}]\n",
199
+ "\n",
200
+ "# Then make the first call:\n",
201
+ "\n",
202
+ "response = groq.chat.completions.create(model='llama-3.3-70b-versatile', messages=messages)\n",
203
+ "\n",
204
+ "# Then read the business idea:\n",
205
+ "\n",
206
+ "business_idea = response.choices[0].message.content\n",
207
+ "\n",
208
+ "\n",
209
+ "# And repeat!"
210
+ ]
211
+ },
212
+ {
213
+ "cell_type": "code",
214
+ "execution_count": null,
215
+ "metadata": {},
216
+ "outputs": [],
217
+ "source": [
218
+ "\n",
219
+ "display(Markdown(business_idea))"
220
+ ]
221
+ },
222
+ {
223
+ "cell_type": "code",
224
+ "execution_count": 19,
225
+ "metadata": {},
226
+ "outputs": [],
227
+ "source": [
228
+ "# Update the message with the business idea from previous step\n",
229
+ "messages = [{\"role\": \"user\", \"content\": \"What is the pain point in the business area of \" + business_idea + \"?\"}]"
230
+ ]
231
+ },
232
+ {
233
+ "cell_type": "code",
234
+ "execution_count": 20,
235
+ "metadata": {},
236
+ "outputs": [],
237
+ "source": [
238
+ "# Make the second call\n",
239
+ "response = groq.chat.completions.create(model='llama-3.3-70b-versatile', messages=messages)\n",
240
+ "# Read the pain point\n",
241
+ "pain_point = response.choices[0].message.content\n"
242
+ ]
243
+ },
244
+ {
245
+ "cell_type": "code",
246
+ "execution_count": null,
247
+ "metadata": {},
248
+ "outputs": [],
249
+ "source": [
250
+ "display(Markdown(pain_point))\n"
251
+ ]
252
+ },
253
+ {
254
+ "cell_type": "code",
255
+ "execution_count": null,
256
+ "metadata": {},
257
+ "outputs": [],
258
+ "source": [
259
+ "# Make the third call\n",
260
+ "messages = [{\"role\": \"user\", \"content\": \"What is the Agentic AI solution for the pain point of \" + pain_point + \"?\"}]\n",
261
+ "response = groq.chat.completions.create(model='llama-3.3-70b-versatile', messages=messages)\n",
262
+ "# Read the agentic solution\n",
263
+ "agentic_solution = response.choices[0].message.content\n",
264
+ "display(Markdown(agentic_solution))"
265
+ ]
266
+ },
267
+ {
268
+ "cell_type": "code",
269
+ "execution_count": null,
270
+ "metadata": {},
271
+ "outputs": [],
272
+ "source": []
273
+ }
274
+ ],
275
+ "metadata": {
276
+ "kernelspec": {
277
+ "display_name": ".venv",
278
+ "language": "python",
279
+ "name": "python3"
280
+ },
281
+ "language_info": {
282
+ "codemirror_mode": {
283
+ "name": "ipython",
284
+ "version": 3
285
+ },
286
+ "file_extension": ".py",
287
+ "mimetype": "text/x-python",
288
+ "name": "python",
289
+ "nbconvert_exporter": "python",
290
+ "pygments_lexer": "ipython3",
291
+ "version": "3.12.10"
292
+ }
293
+ },
294
+ "nbformat": 4,
295
+ "nbformat_minor": 2
296
+ }
community_contributions/1_lab1_open_router.ipynb ADDED
@@ -0,0 +1,323 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# Welcome to the start of your adventure in Agentic AI"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "markdown",
12
+ "metadata": {},
13
+ "source": [
14
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
15
+ " <tr>\n",
16
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
17
+ " <img src=\"../assets/stop.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
18
+ " </td>\n",
19
+ " <td>\n",
20
+ " <h2 style=\"color:#ff7800;\">Are you ready for action??</h2>\n",
21
+ " <span style=\"color:#ff7800;\">Have you completed all the setup steps in the <a href=\"../setup/\">setup</a> folder?<br/>\n",
22
+ " Have you checked out the guides in the <a href=\"../guides/01_intro.ipynb\">guides</a> folder?<br/>\n",
23
+ " Well in that case, you're ready!!\n",
24
+ " </span>\n",
25
+ " </td>\n",
26
+ " </tr>\n",
27
+ "</table>"
28
+ ]
29
+ },
30
+ {
31
+ "cell_type": "markdown",
32
+ "metadata": {},
33
+ "source": [
34
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
35
+ " <tr>\n",
36
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
37
+ " <img src=\"../assets/tools.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
38
+ " </td>\n",
39
+ " <td>\n",
40
+ " <h2 style=\"color:#00bfff;\">This code is a live resource - keep an eye out for my updates</h2>\n",
41
+ " <span style=\"color:#00bfff;\">I push updates regularly. As people ask questions or have problems, I add more examples and improve explanations. As a result, the code below might not be identical to the videos, as I've added more steps and better comments. Consider this like an interactive book that accompanies the lectures.<br/><br/>\n",
42
+ " I try to send emails regularly with important updates related to the course. You can find this in the 'Announcements' section of Udemy in the left sidebar. You can also choose to receive my emails via your Notification Settings in Udemy. I'm respectful of your inbox and always try to add value with my emails!\n",
43
+ " </span>\n",
44
+ " </td>\n",
45
+ " </tr>\n",
46
+ "</table>"
47
+ ]
48
+ },
49
+ {
50
+ "cell_type": "markdown",
51
+ "metadata": {},
52
+ "source": [
53
+ "### And please do remember to contact me if I can help\n",
54
+ "\n",
55
+ "And I love to connect: https://www.linkedin.com/in/eddonner/\n",
56
+ "\n",
57
+ "\n",
58
+ "### New to Notebooks like this one? Head over to the guides folder!\n",
59
+ "\n",
60
+ "Just to check you've already added the Python and Jupyter extensions to Cursor, if not already installed:\n",
61
+ "- Open extensions (View >> extensions)\n",
62
+ "- Search for python, and when the results show, click on the ms-python one, and Install it if not already installed\n",
63
+ "- Search for jupyter, and when the results show, click on the Microsoft one, and Install it if not already installed \n",
64
+ "Then View >> Explorer to bring back the File Explorer.\n",
65
+ "\n",
66
+ "And then:\n",
67
+ "1. Click where it says \"Select Kernel\" near the top right, and select the option called `.venv (Python 3.12.9)` or similar, which should be the first choice or the most prominent choice. You may need to choose \"Python Environments\" first.\n",
68
+ "2. Click in each \"cell\" below, starting with the cell immediately below this text, and press Shift+Enter to run\n",
69
+ "3. Enjoy!\n",
70
+ "\n",
71
+ "After you click \"Select Kernel\", if there is no option like `.venv (Python 3.12.9)` then please do the following: \n",
72
+ "1. On Mac: From the Cursor menu, choose Settings >> VS Code Settings (NOTE: be sure to select `VSCode Settings` not `Cursor Settings`); \n",
73
+ "On Windows PC: From the File menu, choose Preferences >> VS Code Settings(NOTE: be sure to select `VSCode Settings` not `Cursor Settings`) \n",
74
+ "2. In the Settings search bar, type \"venv\" \n",
75
+ "3. In the field \"Path to folder with a list of Virtual Environments\" put the path to the project root, like C:\\Users\\username\\projects\\agents (on a Windows PC) or /Users/username/projects/agents (on Mac or Linux). \n",
76
+ "And then try again.\n",
77
+ "\n",
78
+ "Having problems with missing Python versions in that list? Have you ever used Anaconda before? It might be interferring. Quit Cursor, bring up a new command line, and make sure that your Anaconda environment is deactivated: \n",
79
+ "`conda deactivate` \n",
80
+ "And if you still have any problems with conda and python versions, it's possible that you will need to run this too: \n",
81
+ "`conda config --set auto_activate_base false` \n",
82
+ "and then from within the Agents directory, you should be able to run `uv python list` and see the Python 3.12 version."
83
+ ]
84
+ },
85
+ {
86
+ "cell_type": "code",
87
+ "execution_count": 76,
88
+ "metadata": {},
89
+ "outputs": [],
90
+ "source": [
91
+ "# First let's do an import\n",
92
+ "from dotenv import load_dotenv\n"
93
+ ]
94
+ },
95
+ {
96
+ "cell_type": "code",
97
+ "execution_count": null,
98
+ "metadata": {},
99
+ "outputs": [],
100
+ "source": [
101
+ "# Next it's time to load the API keys into environment variables\n",
102
+ "\n",
103
+ "load_dotenv(override=True)"
104
+ ]
105
+ },
106
+ {
107
+ "cell_type": "code",
108
+ "execution_count": null,
109
+ "metadata": {},
110
+ "outputs": [],
111
+ "source": [
112
+ "# Check the keys\n",
113
+ "\n",
114
+ "import os\n",
115
+ "open_router_api_key = os.getenv('OPEN_ROUTER_API_KEY')\n",
116
+ "\n",
117
+ "if open_router_api_key:\n",
118
+ " print(f\"Open router API Key exists and begins {open_router_api_key[:8]}\")\n",
119
+ "else:\n",
120
+ " print(\"Open router API Key not set - please head to the troubleshooting guide in the setup folder\")\n"
121
+ ]
122
+ },
123
+ {
124
+ "cell_type": "code",
125
+ "execution_count": 79,
126
+ "metadata": {},
127
+ "outputs": [],
128
+ "source": [
129
+ "from openai import OpenAI"
130
+ ]
131
+ },
132
+ {
133
+ "cell_type": "code",
134
+ "execution_count": 80,
135
+ "metadata": {},
136
+ "outputs": [],
137
+ "source": [
138
+ "# Initialize the client to point at OpenRouter instead of OpenAI\n",
139
+ "# You can use the exact same OpenAI Python package—just swap the base_url!\n",
140
+ "client = OpenAI(\n",
141
+ " base_url=\"https://openrouter.ai/api/v1\",\n",
142
+ " api_key=open_router_api_key\n",
143
+ ")"
144
+ ]
145
+ },
146
+ {
147
+ "cell_type": "code",
148
+ "execution_count": 81,
149
+ "metadata": {},
150
+ "outputs": [],
151
+ "source": [
152
+ "messages = [{\"role\": \"user\", \"content\": \"What is 2+2?\"}]"
153
+ ]
154
+ },
155
+ {
156
+ "cell_type": "code",
157
+ "execution_count": null,
158
+ "metadata": {},
159
+ "outputs": [],
160
+ "source": [
161
+ "client = OpenAI(\n",
162
+ " base_url=\"https://openrouter.ai/api/v1\",\n",
163
+ " api_key=open_router_api_key\n",
164
+ ")\n",
165
+ "\n",
166
+ "resp = client.chat.completions.create(\n",
167
+ " # Select a model from https://openrouter.ai/models and provide the model name here\n",
168
+ " model=\"meta-llama/llama-3.3-8b-instruct:free\",\n",
169
+ " messages=messages\n",
170
+ ")\n",
171
+ "print(resp.choices[0].message.content)"
172
+ ]
173
+ },
174
+ {
175
+ "cell_type": "code",
176
+ "execution_count": 83,
177
+ "metadata": {},
178
+ "outputs": [],
179
+ "source": [
180
+ "# And now - let's ask for a question:\n",
181
+ "\n",
182
+ "question = \"Please propose a hard, challenging question to assess someone's IQ. Respond only with the question.\"\n",
183
+ "messages = [{\"role\": \"user\", \"content\": question}]"
184
+ ]
185
+ },
186
+ {
187
+ "cell_type": "code",
188
+ "execution_count": null,
189
+ "metadata": {},
190
+ "outputs": [],
191
+ "source": [
192
+ "response = client.chat.completions.create(\n",
193
+ " model=\"meta-llama/llama-3.3-8b-instruct:free\",\n",
194
+ " messages=messages\n",
195
+ ")\n",
196
+ "\n",
197
+ "question = response.choices[0].message.content\n",
198
+ "\n",
199
+ "print(question)"
200
+ ]
201
+ },
202
+ {
203
+ "cell_type": "code",
204
+ "execution_count": 85,
205
+ "metadata": {},
206
+ "outputs": [],
207
+ "source": [
208
+ "# form a new messages list\n",
209
+ "\n",
210
+ "messages = [{\"role\": \"user\", \"content\": question}]\n"
211
+ ]
212
+ },
213
+ {
214
+ "cell_type": "code",
215
+ "execution_count": null,
216
+ "metadata": {},
217
+ "outputs": [],
218
+ "source": [
219
+ "# Ask it again\n",
220
+ "\n",
221
+ "response = client.chat.completions.create(\n",
222
+ " model=\"meta-llama/llama-3.3-8b-instruct:free\",\n",
223
+ " messages=messages\n",
224
+ ")\n",
225
+ "\n",
226
+ "answer = response.choices[0].message.content\n",
227
+ "print(answer)"
228
+ ]
229
+ },
230
+ {
231
+ "cell_type": "code",
232
+ "execution_count": null,
233
+ "metadata": {},
234
+ "outputs": [],
235
+ "source": [
236
+ "from IPython.display import Markdown, display\n",
237
+ "\n",
238
+ "display(Markdown(answer))\n",
239
+ "\n"
240
+ ]
241
+ },
242
+ {
243
+ "cell_type": "markdown",
244
+ "metadata": {},
245
+ "source": [
246
+ "# Congratulations!\n",
247
+ "\n",
248
+ "That was a small, simple step in the direction of Agentic AI, with your new environment!\n",
249
+ "\n",
250
+ "Next time things get more interesting..."
251
+ ]
252
+ },
253
+ {
254
+ "cell_type": "markdown",
255
+ "metadata": {},
256
+ "source": [
257
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
258
+ " <tr>\n",
259
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
260
+ " <img src=\"../assets/exercise.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
261
+ " </td>\n",
262
+ " <td>\n",
263
+ " <h2 style=\"color:#ff7800;\">Exercise</h2>\n",
264
+ " <span style=\"color:#ff7800;\">Now try this commercial application:<br/>\n",
265
+ " First ask the LLM to pick a business area that might be worth exploring for an Agentic AI opportunity.<br/>\n",
266
+ " Then ask the LLM to present a pain-point in that industry - something challenging that might be ripe for an Agentic solution.<br/>\n",
267
+ " Finally have 3 third LLM call propose the Agentic AI solution.\n",
268
+ " </span>\n",
269
+ " </td>\n",
270
+ " </tr>\n",
271
+ "</table>"
272
+ ]
273
+ },
274
+ {
275
+ "cell_type": "code",
276
+ "execution_count": null,
277
+ "metadata": {},
278
+ "outputs": [],
279
+ "source": [
280
+ "# First create the messages:\n",
281
+ "\n",
282
+ "\n",
283
+ "messages = [\"Something here\"]\n",
284
+ "\n",
285
+ "# Then make the first call:\n",
286
+ "\n",
287
+ "response =\n",
288
+ "\n",
289
+ "# Then read the business idea:\n",
290
+ "\n",
291
+ "business_idea = response.\n",
292
+ "\n",
293
+ "# And repeat!"
294
+ ]
295
+ },
296
+ {
297
+ "cell_type": "markdown",
298
+ "metadata": {},
299
+ "source": []
300
+ }
301
+ ],
302
+ "metadata": {
303
+ "kernelspec": {
304
+ "display_name": ".venv",
305
+ "language": "python",
306
+ "name": "python3"
307
+ },
308
+ "language_info": {
309
+ "codemirror_mode": {
310
+ "name": "ipython",
311
+ "version": 3
312
+ },
313
+ "file_extension": ".py",
314
+ "mimetype": "text/x-python",
315
+ "name": "python",
316
+ "nbconvert_exporter": "python",
317
+ "pygments_lexer": "ipython3",
318
+ "version": "3.12.7"
319
+ }
320
+ },
321
+ "nbformat": 4,
322
+ "nbformat_minor": 2
323
+ }
community_contributions/1_lab2_Kaushik_Parallelization.ipynb ADDED
@@ -0,0 +1,355 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "import os\n",
10
+ "import json\n",
11
+ "from dotenv import load_dotenv\n",
12
+ "from openai import OpenAI\n",
13
+ "from IPython.display import Markdown"
14
+ ]
15
+ },
16
+ {
17
+ "cell_type": "markdown",
18
+ "metadata": {},
19
+ "source": [
20
+ "### Refresh dot env"
21
+ ]
22
+ },
23
+ {
24
+ "cell_type": "code",
25
+ "execution_count": null,
26
+ "metadata": {},
27
+ "outputs": [],
28
+ "source": [
29
+ "load_dotenv(override=True)"
30
+ ]
31
+ },
32
+ {
33
+ "cell_type": "code",
34
+ "execution_count": 3,
35
+ "metadata": {},
36
+ "outputs": [],
37
+ "source": [
38
+ "open_api_key = os.getenv(\"OPENAI_API_KEY\")\n",
39
+ "google_api_key = os.getenv(\"GOOGLE_API_KEY\")"
40
+ ]
41
+ },
42
+ {
43
+ "cell_type": "markdown",
44
+ "metadata": {},
45
+ "source": [
46
+ "### Create initial query to get challange reccomendation"
47
+ ]
48
+ },
49
+ {
50
+ "cell_type": "code",
51
+ "execution_count": 4,
52
+ "metadata": {},
53
+ "outputs": [],
54
+ "source": [
55
+ "query = 'Please come up with a challenging, nuanced question that I can ask a number of LLMs to evaluate their intelligence. '\n",
56
+ "query += 'Answer only with the question, no explanation.'\n",
57
+ "\n",
58
+ "messages = [{'role':'user', 'content':query}]"
59
+ ]
60
+ },
61
+ {
62
+ "cell_type": "code",
63
+ "execution_count": null,
64
+ "metadata": {},
65
+ "outputs": [],
66
+ "source": [
67
+ "print(messages)"
68
+ ]
69
+ },
70
+ {
71
+ "cell_type": "markdown",
72
+ "metadata": {},
73
+ "source": [
74
+ "### Call openai gpt-4o-mini "
75
+ ]
76
+ },
77
+ {
78
+ "cell_type": "code",
79
+ "execution_count": 6,
80
+ "metadata": {},
81
+ "outputs": [],
82
+ "source": [
83
+ "openai = OpenAI()\n",
84
+ "\n",
85
+ "response = openai.chat.completions.create(\n",
86
+ " messages=messages,\n",
87
+ " model='gpt-4o-mini'\n",
88
+ ")\n",
89
+ "\n",
90
+ "challange = response.choices[0].message.content\n"
91
+ ]
92
+ },
93
+ {
94
+ "cell_type": "code",
95
+ "execution_count": null,
96
+ "metadata": {},
97
+ "outputs": [],
98
+ "source": [
99
+ "print(challange)"
100
+ ]
101
+ },
102
+ {
103
+ "cell_type": "code",
104
+ "execution_count": 8,
105
+ "metadata": {},
106
+ "outputs": [],
107
+ "source": [
108
+ "competitors = []\n",
109
+ "answers = []"
110
+ ]
111
+ },
112
+ {
113
+ "cell_type": "markdown",
114
+ "metadata": {},
115
+ "source": [
116
+ "### Create messages with the challange query"
117
+ ]
118
+ },
119
+ {
120
+ "cell_type": "code",
121
+ "execution_count": 9,
122
+ "metadata": {},
123
+ "outputs": [],
124
+ "source": [
125
+ "messages = [{'role':'user', 'content':challange}]"
126
+ ]
127
+ },
128
+ {
129
+ "cell_type": "code",
130
+ "execution_count": null,
131
+ "metadata": {},
132
+ "outputs": [],
133
+ "source": [
134
+ "print(messages)"
135
+ ]
136
+ },
137
+ {
138
+ "cell_type": "code",
139
+ "execution_count": null,
140
+ "metadata": {},
141
+ "outputs": [],
142
+ "source": [
143
+ "!ollama pull llama3.2"
144
+ ]
145
+ },
146
+ {
147
+ "cell_type": "code",
148
+ "execution_count": 12,
149
+ "metadata": {},
150
+ "outputs": [],
151
+ "source": [
152
+ "from threading import Thread"
153
+ ]
154
+ },
155
+ {
156
+ "cell_type": "code",
157
+ "execution_count": 13,
158
+ "metadata": {},
159
+ "outputs": [],
160
+ "source": [
161
+ "def gpt_mini_processor():\n",
162
+ " modleName = 'gpt-4o-mini'\n",
163
+ " competitors.append(modleName)\n",
164
+ " response_gpt = openai.chat.completions.create(\n",
165
+ " messages=messages,\n",
166
+ " model=modleName\n",
167
+ " )\n",
168
+ " answers.append(response_gpt.choices[0].message.content)\n",
169
+ "\n",
170
+ "def gemini_processor():\n",
171
+ " gemini = OpenAI(api_key=google_api_key, base_url='https://generativelanguage.googleapis.com/v1beta/openai/')\n",
172
+ " modleName = 'gemini-2.0-flash'\n",
173
+ " competitors.append(modleName)\n",
174
+ " response_gemini = gemini.chat.completions.create(\n",
175
+ " messages=messages,\n",
176
+ " model=modleName\n",
177
+ " )\n",
178
+ " answers.append(response_gemini.choices[0].message.content)\n",
179
+ "\n",
180
+ "def llama_processor():\n",
181
+ " ollama = OpenAI(base_url='http://localhost:11434/v1', api_key='ollama')\n",
182
+ " modleName = 'llama3.2'\n",
183
+ " competitors.append(modleName)\n",
184
+ " response_llama = ollama.chat.completions.create(\n",
185
+ " messages=messages,\n",
186
+ " model=modleName\n",
187
+ " )\n",
188
+ " answers.append(response_llama.choices[0].message.content)"
189
+ ]
190
+ },
191
+ {
192
+ "cell_type": "markdown",
193
+ "metadata": {},
194
+ "source": [
195
+ "### Paraller execution of LLM calls"
196
+ ]
197
+ },
198
+ {
199
+ "cell_type": "code",
200
+ "execution_count": 14,
201
+ "metadata": {},
202
+ "outputs": [],
203
+ "source": [
204
+ "thread1 = Thread(target=gpt_mini_processor)\n",
205
+ "thread2 = Thread(target=gemini_processor)\n",
206
+ "thread3 = Thread(target=llama_processor)\n",
207
+ "\n",
208
+ "thread1.start()\n",
209
+ "thread2.start()\n",
210
+ "thread3.start()\n",
211
+ "\n",
212
+ "thread1.join()\n",
213
+ "thread2.join()\n",
214
+ "thread3.join()"
215
+ ]
216
+ },
217
+ {
218
+ "cell_type": "code",
219
+ "execution_count": null,
220
+ "metadata": {},
221
+ "outputs": [],
222
+ "source": [
223
+ "print(competitors)\n",
224
+ "print(answers)"
225
+ ]
226
+ },
227
+ {
228
+ "cell_type": "code",
229
+ "execution_count": null,
230
+ "metadata": {},
231
+ "outputs": [],
232
+ "source": [
233
+ "for competitor, answer in zip(competitors, answers):\n",
234
+ " print(f'Competitor:{competitor}\\n\\n{answer}')"
235
+ ]
236
+ },
237
+ {
238
+ "cell_type": "code",
239
+ "execution_count": 17,
240
+ "metadata": {},
241
+ "outputs": [],
242
+ "source": [
243
+ "together = ''\n",
244
+ "for index, answer in enumerate(answers):\n",
245
+ " together += f'# Response from competitor {index + 1}\\n\\n'\n",
246
+ " together += answer + '\\n\\n'"
247
+ ]
248
+ },
249
+ {
250
+ "cell_type": "code",
251
+ "execution_count": null,
252
+ "metadata": {},
253
+ "outputs": [],
254
+ "source": [
255
+ "print(together)"
256
+ ]
257
+ },
258
+ {
259
+ "cell_type": "markdown",
260
+ "metadata": {},
261
+ "source": [
262
+ "### Prompt to judge the LLM results"
263
+ ]
264
+ },
265
+ {
266
+ "cell_type": "code",
267
+ "execution_count": 19,
268
+ "metadata": {},
269
+ "outputs": [],
270
+ "source": [
271
+ "to_judge = f'''You are judging a competition between {len(competitors)} competitors.\n",
272
+ "Each model has been given this question:\n",
273
+ "\n",
274
+ "{challange}\n",
275
+ "\n",
276
+ "Your job is to evaluate each response for clarity and strength of argument, and rank them in order of best to worst.\n",
277
+ "Respond with JSON, and only JSON, with the following format:\n",
278
+ "{{\"results\": [\"best competitor number\", \"second best competitor number\", \"third best competitor number\", ...]}}\n",
279
+ "\n",
280
+ "Here are the responses from each competitor:\n",
281
+ "\n",
282
+ "{together}\n",
283
+ "\n",
284
+ "Now respond with the JSON with the ranked order of the competitors, nothing else. Do not include markdown formatting or code blocks.\"\"\"\n",
285
+ "\n",
286
+ "'''"
287
+ ]
288
+ },
289
+ {
290
+ "cell_type": "code",
291
+ "execution_count": 20,
292
+ "metadata": {},
293
+ "outputs": [],
294
+ "source": [
295
+ "to_judge_message = [{'role':'user', 'content':to_judge}]"
296
+ ]
297
+ },
298
+ {
299
+ "cell_type": "markdown",
300
+ "metadata": {},
301
+ "source": [
302
+ "### Execute o3-mini to analyze the LLM results"
303
+ ]
304
+ },
305
+ {
306
+ "cell_type": "code",
307
+ "execution_count": null,
308
+ "metadata": {},
309
+ "outputs": [],
310
+ "source": [
311
+ "openai = OpenAI()\n",
312
+ "response = openai.chat.completions.create(\n",
313
+ " messages=to_judge_message,\n",
314
+ " model='o3-mini'\n",
315
+ ")\n",
316
+ "result = response.choices[0].message.content\n",
317
+ "print(result)"
318
+ ]
319
+ },
320
+ {
321
+ "cell_type": "code",
322
+ "execution_count": null,
323
+ "metadata": {},
324
+ "outputs": [],
325
+ "source": [
326
+ "results_dict = json.loads(result)\n",
327
+ "ranks = results_dict[\"results\"]\n",
328
+ "for index, result in enumerate(ranks):\n",
329
+ " competitor = competitors[int(result)-1]\n",
330
+ " print(f\"Rank {index+1}: {competitor}\")"
331
+ ]
332
+ }
333
+ ],
334
+ "metadata": {
335
+ "kernelspec": {
336
+ "display_name": ".venv",
337
+ "language": "python",
338
+ "name": "python3"
339
+ },
340
+ "language_info": {
341
+ "codemirror_mode": {
342
+ "name": "ipython",
343
+ "version": 3
344
+ },
345
+ "file_extension": ".py",
346
+ "mimetype": "text/x-python",
347
+ "name": "python",
348
+ "nbconvert_exporter": "python",
349
+ "pygments_lexer": "ipython3",
350
+ "version": "3.12.10"
351
+ }
352
+ },
353
+ "nbformat": 4,
354
+ "nbformat_minor": 2
355
+ }
community_contributions/2_lab2_exercise.ipynb ADDED
@@ -0,0 +1,336 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# From Judging to Synthesizing — Evolving Multi-Agent Patterns\n",
8
+ "\n",
9
+ "In the original 2_lab2.ipynb, we explored a powerful agentic design pattern: sending the same question to multiple large language models (LLMs), then using a separate “judge” agent to evaluate and rank their responses. This approach is valuable for identifying the single best answer among many, leveraging the strengths of ensemble reasoning and critical evaluation.\n",
10
+ "\n",
11
+ "However, selecting just one “winner” can leave valuable insights from other models untapped. To address this, I am shifting to a new agentic pattern in this notebook: the synthesizer/improver pattern. Instead of merely ranking responses, we will prompt a dedicated LLM to review all answers, extract the most compelling ideas from each, and synthesize them into a single, improved response. \n",
12
+ "\n",
13
+ "This approach aims to combine the collective intelligence of multiple models, producing an answer that is richer, more nuanced, and more robust than any individual response.\n"
14
+ ]
15
+ },
16
+ {
17
+ "cell_type": "code",
18
+ "execution_count": 1,
19
+ "metadata": {},
20
+ "outputs": [],
21
+ "source": [
22
+ "import os\n",
23
+ "import json\n",
24
+ "from dotenv import load_dotenv\n",
25
+ "from openai import OpenAI\n",
26
+ "from anthropic import Anthropic\n",
27
+ "from IPython.display import Markdown, display"
28
+ ]
29
+ },
30
+ {
31
+ "cell_type": "code",
32
+ "execution_count": null,
33
+ "metadata": {},
34
+ "outputs": [],
35
+ "source": [
36
+ "load_dotenv(override=True)"
37
+ ]
38
+ },
39
+ {
40
+ "cell_type": "code",
41
+ "execution_count": null,
42
+ "metadata": {},
43
+ "outputs": [],
44
+ "source": [
45
+ "# Print the key prefixes to help with any debugging\n",
46
+ "\n",
47
+ "openai_api_key = os.getenv('OPENAI_API_KEY')\n",
48
+ "anthropic_api_key = os.getenv('ANTHROPIC_API_KEY')\n",
49
+ "google_api_key = os.getenv('GOOGLE_API_KEY')\n",
50
+ "deepseek_api_key = os.getenv('DEEPSEEK_API_KEY')\n",
51
+ "groq_api_key = os.getenv('GROQ_API_KEY')\n",
52
+ "\n",
53
+ "if openai_api_key:\n",
54
+ " print(f\"OpenAI API Key exists and begins {openai_api_key[:8]}\")\n",
55
+ "else:\n",
56
+ " print(\"OpenAI API Key not set\")\n",
57
+ " \n",
58
+ "if anthropic_api_key:\n",
59
+ " print(f\"Anthropic API Key exists and begins {anthropic_api_key[:7]}\")\n",
60
+ "else:\n",
61
+ " print(\"Anthropic API Key not set (and this is optional)\")\n",
62
+ "\n",
63
+ "if google_api_key:\n",
64
+ " print(f\"Google API Key exists and begins {google_api_key[:2]}\")\n",
65
+ "else:\n",
66
+ " print(\"Google API Key not set (and this is optional)\")\n",
67
+ "\n",
68
+ "if deepseek_api_key:\n",
69
+ " print(f\"DeepSeek API Key exists and begins {deepseek_api_key[:3]}\")\n",
70
+ "else:\n",
71
+ " print(\"DeepSeek API Key not set (and this is optional)\")\n",
72
+ "\n",
73
+ "if groq_api_key:\n",
74
+ " print(f\"Groq API Key exists and begins {groq_api_key[:4]}\")\n",
75
+ "else:\n",
76
+ " print(\"Groq API Key not set (and this is optional)\")"
77
+ ]
78
+ },
79
+ {
80
+ "cell_type": "code",
81
+ "execution_count": 7,
82
+ "metadata": {},
83
+ "outputs": [],
84
+ "source": [
85
+ "request = \"Please come up with a challenging, nuanced question that I can ask a number of LLMs to evaluate their collective intelligence. \"\n",
86
+ "request += \"Answer only with the question, no explanation.\"\n",
87
+ "messages = [{\"role\": \"user\", \"content\": request}]"
88
+ ]
89
+ },
90
+ {
91
+ "cell_type": "code",
92
+ "execution_count": null,
93
+ "metadata": {},
94
+ "outputs": [],
95
+ "source": [
96
+ "messages"
97
+ ]
98
+ },
99
+ {
100
+ "cell_type": "code",
101
+ "execution_count": null,
102
+ "metadata": {},
103
+ "outputs": [],
104
+ "source": [
105
+ "openai = OpenAI()\n",
106
+ "response = openai.chat.completions.create(\n",
107
+ " model=\"gpt-4o-mini\",\n",
108
+ " messages=messages,\n",
109
+ ")\n",
110
+ "question = response.choices[0].message.content\n",
111
+ "print(question)\n"
112
+ ]
113
+ },
114
+ {
115
+ "cell_type": "code",
116
+ "execution_count": 10,
117
+ "metadata": {},
118
+ "outputs": [],
119
+ "source": [
120
+ "teammates = []\n",
121
+ "answers = []\n",
122
+ "messages = [{\"role\": \"user\", \"content\": question}]"
123
+ ]
124
+ },
125
+ {
126
+ "cell_type": "code",
127
+ "execution_count": null,
128
+ "metadata": {},
129
+ "outputs": [],
130
+ "source": [
131
+ "# The API we know well\n",
132
+ "\n",
133
+ "model_name = \"gpt-4o-mini\"\n",
134
+ "\n",
135
+ "response = openai.chat.completions.create(model=model_name, messages=messages)\n",
136
+ "answer = response.choices[0].message.content\n",
137
+ "\n",
138
+ "display(Markdown(answer))\n",
139
+ "teammates.append(model_name)\n",
140
+ "answers.append(answer)"
141
+ ]
142
+ },
143
+ {
144
+ "cell_type": "code",
145
+ "execution_count": null,
146
+ "metadata": {},
147
+ "outputs": [],
148
+ "source": [
149
+ "# Anthropic has a slightly different API, and Max Tokens is required\n",
150
+ "\n",
151
+ "model_name = \"claude-3-7-sonnet-latest\"\n",
152
+ "\n",
153
+ "claude = Anthropic()\n",
154
+ "response = claude.messages.create(model=model_name, messages=messages, max_tokens=1000)\n",
155
+ "answer = response.content[0].text\n",
156
+ "\n",
157
+ "display(Markdown(answer))\n",
158
+ "teammates.append(model_name)\n",
159
+ "answers.append(answer)"
160
+ ]
161
+ },
162
+ {
163
+ "cell_type": "code",
164
+ "execution_count": null,
165
+ "metadata": {},
166
+ "outputs": [],
167
+ "source": [
168
+ "gemini = OpenAI(api_key=google_api_key, base_url=\"https://generativelanguage.googleapis.com/v1beta/openai/\")\n",
169
+ "model_name = \"gemini-2.0-flash\"\n",
170
+ "\n",
171
+ "response = gemini.chat.completions.create(model=model_name, messages=messages)\n",
172
+ "answer = response.choices[0].message.content\n",
173
+ "\n",
174
+ "display(Markdown(answer))\n",
175
+ "teammates.append(model_name)\n",
176
+ "answers.append(answer)"
177
+ ]
178
+ },
179
+ {
180
+ "cell_type": "code",
181
+ "execution_count": null,
182
+ "metadata": {},
183
+ "outputs": [],
184
+ "source": [
185
+ "deepseek = OpenAI(api_key=deepseek_api_key, base_url=\"https://api.deepseek.com/v1\")\n",
186
+ "model_name = \"deepseek-chat\"\n",
187
+ "\n",
188
+ "response = deepseek.chat.completions.create(model=model_name, messages=messages)\n",
189
+ "answer = response.choices[0].message.content\n",
190
+ "\n",
191
+ "display(Markdown(answer))\n",
192
+ "teammates.append(model_name)\n",
193
+ "answers.append(answer)"
194
+ ]
195
+ },
196
+ {
197
+ "cell_type": "code",
198
+ "execution_count": null,
199
+ "metadata": {},
200
+ "outputs": [],
201
+ "source": [
202
+ "groq = OpenAI(api_key=groq_api_key, base_url=\"https://api.groq.com/openai/v1\")\n",
203
+ "model_name = \"llama-3.3-70b-versatile\"\n",
204
+ "\n",
205
+ "response = groq.chat.completions.create(model=model_name, messages=messages)\n",
206
+ "answer = response.choices[0].message.content\n",
207
+ "\n",
208
+ "display(Markdown(answer))\n",
209
+ "teammates.append(model_name)\n",
210
+ "answers.append(answer)"
211
+ ]
212
+ },
213
+ {
214
+ "cell_type": "code",
215
+ "execution_count": null,
216
+ "metadata": {},
217
+ "outputs": [],
218
+ "source": [
219
+ "# So where are we?\n",
220
+ "\n",
221
+ "print(teammates)\n",
222
+ "print(answers)"
223
+ ]
224
+ },
225
+ {
226
+ "cell_type": "code",
227
+ "execution_count": null,
228
+ "metadata": {},
229
+ "outputs": [],
230
+ "source": [
231
+ "# It's nice to know how to use \"zip\"\n",
232
+ "for teammate, answer in zip(teammates, answers):\n",
233
+ " print(f\"Teammate: {teammate}\\n\\n{answer}\")"
234
+ ]
235
+ },
236
+ {
237
+ "cell_type": "code",
238
+ "execution_count": 23,
239
+ "metadata": {},
240
+ "outputs": [],
241
+ "source": [
242
+ "# Let's bring this together - note the use of \"enumerate\"\n",
243
+ "\n",
244
+ "together = \"\"\n",
245
+ "for index, answer in enumerate(answers):\n",
246
+ " together += f\"# Response from teammate {index+1}\\n\\n\"\n",
247
+ " together += answer + \"\\n\\n\""
248
+ ]
249
+ },
250
+ {
251
+ "cell_type": "code",
252
+ "execution_count": null,
253
+ "metadata": {},
254
+ "outputs": [],
255
+ "source": [
256
+ "print(together)"
257
+ ]
258
+ },
259
+ {
260
+ "cell_type": "code",
261
+ "execution_count": 36,
262
+ "metadata": {},
263
+ "outputs": [],
264
+ "source": [
265
+ "formatter = f\"\"\"You are taking the nost interesting ideas fron {len(teammates)} teammates.\n",
266
+ "Each model has been given this question:\n",
267
+ "\n",
268
+ "{question}\n",
269
+ "\n",
270
+ "Your job is to evaluate each response for clarity and strength of argument, select the most relevant ideas and make a report, including a title, subtitles to separate sections, and quoting the LLM providing the idea.\n",
271
+ "From that, you will create a new improved answer.\"\"\""
272
+ ]
273
+ },
274
+ {
275
+ "cell_type": "code",
276
+ "execution_count": null,
277
+ "metadata": {},
278
+ "outputs": [],
279
+ "source": [
280
+ "print(formatter)"
281
+ ]
282
+ },
283
+ {
284
+ "cell_type": "code",
285
+ "execution_count": 38,
286
+ "metadata": {},
287
+ "outputs": [],
288
+ "source": [
289
+ "formatter_messages = [{\"role\": \"user\", \"content\": formatter}]"
290
+ ]
291
+ },
292
+ {
293
+ "cell_type": "code",
294
+ "execution_count": null,
295
+ "metadata": {},
296
+ "outputs": [],
297
+ "source": [
298
+ "openai = OpenAI()\n",
299
+ "response = openai.chat.completions.create(\n",
300
+ " model=\"o3-mini\",\n",
301
+ " messages=formatter_messages,\n",
302
+ ")\n",
303
+ "results = response.choices[0].message.content\n",
304
+ "display(Markdown(results))"
305
+ ]
306
+ },
307
+ {
308
+ "cell_type": "code",
309
+ "execution_count": null,
310
+ "metadata": {},
311
+ "outputs": [],
312
+ "source": []
313
+ }
314
+ ],
315
+ "metadata": {
316
+ "kernelspec": {
317
+ "display_name": ".venv",
318
+ "language": "python",
319
+ "name": "python3"
320
+ },
321
+ "language_info": {
322
+ "codemirror_mode": {
323
+ "name": "ipython",
324
+ "version": 3
325
+ },
326
+ "file_extension": ".py",
327
+ "mimetype": "text/x-python",
328
+ "name": "python",
329
+ "nbconvert_exporter": "python",
330
+ "pygments_lexer": "ipython3",
331
+ "version": "3.12.7"
332
+ }
333
+ },
334
+ "nbformat": 4,
335
+ "nbformat_minor": 2
336
+ }
community_contributions/2_lab2_six-thinking-hats-simulator.ipynb ADDED
@@ -0,0 +1,457 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# Six Thinking Hats Simulator\n",
8
+ "\n",
9
+ "## Objective\n",
10
+ "This notebook implements a simulator of the Six Thinking Hats technique to evaluate and improve technological solutions. The simulator will:\n",
11
+ "\n",
12
+ "1. Use an LLM to generate an initial technological solution idea for a specific daily task in a company.\n",
13
+ "2. Apply the Six Thinking Hats methodology to analyze and improve the proposed solution.\n",
14
+ "3. Provide a comprehensive evaluation from different perspectives.\n",
15
+ "\n",
16
+ "## About the Six Thinking Hats Technique\n",
17
+ "\n",
18
+ "The Six Thinking Hats is a powerful technique developed by Edward de Bono that helps people look at problems and decisions from different perspectives. Each \"hat\" represents a different thinking approach:\n",
19
+ "\n",
20
+ "- **White Hat (Facts):** Focuses on available information, facts, and data.\n",
21
+ "- **Red Hat (Feelings):** Represents emotions, intuition, and gut feelings.\n",
22
+ "- **Black Hat (Critical):** Identifies potential problems, risks, and negative aspects.\n",
23
+ "- **Yellow Hat (Positive):** Looks for benefits, opportunities, and positive aspects.\n",
24
+ "- **Green Hat (Creative):** Encourages new ideas, alternatives, and possibilities.\n",
25
+ "- **Blue Hat (Process):** Manages the thinking process and ensures all perspectives are considered.\n",
26
+ "\n",
27
+ "In this simulator, we'll use these different perspectives to thoroughly evaluate and improve technological solutions proposed by an LLM."
28
+ ]
29
+ },
30
+ {
31
+ "cell_type": "code",
32
+ "execution_count": 1,
33
+ "metadata": {},
34
+ "outputs": [],
35
+ "source": [
36
+ "import os\n",
37
+ "import json\n",
38
+ "from dotenv import load_dotenv\n",
39
+ "from openai import OpenAI\n",
40
+ "from anthropic import Anthropic\n",
41
+ "from IPython.display import Markdown, display"
42
+ ]
43
+ },
44
+ {
45
+ "cell_type": "code",
46
+ "execution_count": null,
47
+ "metadata": {},
48
+ "outputs": [],
49
+ "source": [
50
+ "load_dotenv(override=True)"
51
+ ]
52
+ },
53
+ {
54
+ "cell_type": "code",
55
+ "execution_count": null,
56
+ "metadata": {},
57
+ "outputs": [],
58
+ "source": [
59
+ "# Print the key prefixes to help with any debugging\n",
60
+ "\n",
61
+ "openai_api_key = os.getenv('OPENAI_API_KEY')\n",
62
+ "anthropic_api_key = os.getenv('ANTHROPIC_API_KEY')\n",
63
+ "google_api_key = os.getenv('GOOGLE_API_KEY')\n",
64
+ "deepseek_api_key = os.getenv('DEEPSEEK_API_KEY')\n",
65
+ "groq_api_key = os.getenv('GROQ_API_KEY')\n",
66
+ "\n",
67
+ "if openai_api_key:\n",
68
+ " print(f\"OpenAI API Key exists and begins {openai_api_key[:8]}\")\n",
69
+ "else:\n",
70
+ " print(\"OpenAI API Key not set\")\n",
71
+ " \n",
72
+ "if anthropic_api_key:\n",
73
+ " print(f\"Anthropic API Key exists and begins {anthropic_api_key[:7]}\")\n",
74
+ "else:\n",
75
+ " print(\"Anthropic API Key not set\")\n",
76
+ "\n",
77
+ "if google_api_key:\n",
78
+ " print(f\"Google API Key exists and begins {google_api_key[:2]}\")\n",
79
+ "else:\n",
80
+ " print(\"Google API Key not set\")\n",
81
+ "\n",
82
+ "if deepseek_api_key:\n",
83
+ " print(f\"DeepSeek API Key exists and begins {deepseek_api_key[:3]}\")\n",
84
+ "else:\n",
85
+ " print(\"DeepSeek API Key not set\")\n",
86
+ "\n",
87
+ "if groq_api_key:\n",
88
+ " print(f\"Groq API Key exists and begins {groq_api_key[:4]}\")\n",
89
+ "else:\n",
90
+ " print(\"Groq API Key not set\")"
91
+ ]
92
+ },
93
+ {
94
+ "cell_type": "code",
95
+ "execution_count": null,
96
+ "metadata": {},
97
+ "outputs": [],
98
+ "source": [
99
+ "request = \"Generate a technological solution to solve a specific workplace challenge. Choose an employee role, in a specific industry, and identify a time-consuming or error-prone daily task they face. Then, create an innovative yet practical technological solution that addresses this challenge. Include what technologies it uses (AI, automation, etc.), how it integrates with existing systems, its key benefits, and basic implementation requirements. Keep your solution realistic with current technology. \"\n",
100
+ "request += \"Answer only with the question, no explanation.\"\n",
101
+ "messages = [{\"role\": \"user\", \"content\": request}]\n",
102
+ "\n",
103
+ "openai = OpenAI()\n",
104
+ "response = openai.chat.completions.create(\n",
105
+ " model=\"gpt-4o-mini\",\n",
106
+ " messages=messages,\n",
107
+ ")\n",
108
+ "question = response.choices[0].message.content\n",
109
+ "print(question)"
110
+ ]
111
+ },
112
+ {
113
+ "cell_type": "code",
114
+ "execution_count": null,
115
+ "metadata": {},
116
+ "outputs": [],
117
+ "source": [
118
+ "validation_prompt = f\"\"\"Validate and improve the following technological solution. For each iteration, check if the solution meets these criteria:\n",
119
+ "\n",
120
+ "1. Clarity:\n",
121
+ " - Is the problem clearly defined?\n",
122
+ " - Is the solution clearly explained?\n",
123
+ " - Are the technical components well-described?\n",
124
+ "\n",
125
+ "2. Specificity:\n",
126
+ " - Are there specific examples or use cases?\n",
127
+ " - Are the technologies and tools specifically named?\n",
128
+ " - Are the implementation steps detailed?\n",
129
+ "\n",
130
+ "3. Context:\n",
131
+ " - Is the industry/company context clear?\n",
132
+ " - Are the user roles and needs well-defined?\n",
133
+ " - Is the current workflow/problem well-described?\n",
134
+ "\n",
135
+ "4. Constraints:\n",
136
+ " - Are there clear technical limitations?\n",
137
+ " - Are there budget/time constraints mentioned?\n",
138
+ " - Are there integration requirements specified?\n",
139
+ "\n",
140
+ "If any of these criteria are not met, improve the solution by:\n",
141
+ "1. Adding missing details\n",
142
+ "2. Clarifying ambiguous points\n",
143
+ "3. Providing more specific examples\n",
144
+ "4. Including relevant constraints\n",
145
+ "\n",
146
+ "Here is the technological solution to validate and improve:\n",
147
+ "{question} \n",
148
+ "Provide an improved version that addresses any missing or unclear aspects. If this is the 5th iteration, return the final improved version without further changes.\n",
149
+ "\n",
150
+ "Response only with the Improved Solution:\n",
151
+ "[Your improved solution here]\"\"\"\n",
152
+ "\n",
153
+ "messages = [{\"role\": \"user\", \"content\": validation_prompt}]\n",
154
+ "\n",
155
+ "response = openai.chat.completions.create(model=\"gpt-4o\", messages=messages)\n",
156
+ "question = response.choices[0].message.content\n",
157
+ "\n",
158
+ "display(Markdown(question))"
159
+ ]
160
+ },
161
+ {
162
+ "cell_type": "markdown",
163
+ "metadata": {},
164
+ "source": [
165
+ "\n",
166
+ "In this section, we will ask each AI model to analyze a technological solution using the Six Thinking Hats methodology. Each model will:\n",
167
+ "\n",
168
+ "1. First generate a technological solution for a workplace challenge\n",
169
+ "2. Then analyze that solution using each of the Six Thinking Hats\n",
170
+ "\n",
171
+ "Each model will provide:\n",
172
+ "1. An initial technological solution\n",
173
+ "2. A structured analysis using all six thinking hats\n",
174
+ "3. A final recommendation based on the comprehensive analysis\n",
175
+ "\n",
176
+ "This approach will allow us to:\n",
177
+ "- Compare how different models apply the Six Thinking Hats methodology\n",
178
+ "- Identify patterns and differences in their analytical approaches\n",
179
+ "- Gather diverse perspectives on the same solution\n",
180
+ "- Create a rich, multi-faceted evaluation of each proposed technological solution\n",
181
+ "\n",
182
+ "The responses will be collected and displayed below, showing how each model applies the Six Thinking Hats methodology to evaluate and improve the proposed solutions."
183
+ ]
184
+ },
185
+ {
186
+ "cell_type": "code",
187
+ "execution_count": 6,
188
+ "metadata": {},
189
+ "outputs": [],
190
+ "source": [
191
+ "models = []\n",
192
+ "answers = []\n",
193
+ "combined_question = f\" Analyze the technological solution prposed in {question} using the Six Thinking Hats methodology. For each hat, provide a detailed analysis. Finally, provide a comprehensive recommendation based on all the above analyses.\"\n",
194
+ "messages = [{\"role\": \"user\", \"content\": combined_question}]"
195
+ ]
196
+ },
197
+ {
198
+ "cell_type": "code",
199
+ "execution_count": null,
200
+ "metadata": {},
201
+ "outputs": [],
202
+ "source": [
203
+ "# GPT thinking process\n",
204
+ "\n",
205
+ "model_name = \"gpt-4o\"\n",
206
+ "\n",
207
+ "\n",
208
+ "response = openai.chat.completions.create(model=model_name, messages=messages)\n",
209
+ "answer = response.choices[0].message.content\n",
210
+ "\n",
211
+ "display(Markdown(answer))\n",
212
+ "models.append(model_name)\n",
213
+ "answers.append(answer)"
214
+ ]
215
+ },
216
+ {
217
+ "cell_type": "code",
218
+ "execution_count": null,
219
+ "metadata": {},
220
+ "outputs": [],
221
+ "source": [
222
+ "# Claude thinking process\n",
223
+ "\n",
224
+ "model_name = \"claude-3-7-sonnet-latest\"\n",
225
+ "\n",
226
+ "claude = Anthropic()\n",
227
+ "response = claude.messages.create(model=model_name, messages=messages, max_tokens=1000)\n",
228
+ "answer = response.content[0].text\n",
229
+ "\n",
230
+ "display(Markdown(answer))\n",
231
+ "models.append(model_name)\n",
232
+ "answers.append(answer)"
233
+ ]
234
+ },
235
+ {
236
+ "cell_type": "code",
237
+ "execution_count": null,
238
+ "metadata": {},
239
+ "outputs": [],
240
+ "source": [
241
+ "# Gemini thinking process\n",
242
+ "\n",
243
+ "gemini = OpenAI(api_key=google_api_key, base_url=\"https://generativelanguage.googleapis.com/v1beta/openai/\")\n",
244
+ "model_name = \"gemini-2.0-flash\"\n",
245
+ "\n",
246
+ "response = gemini.chat.completions.create(model=model_name, messages=messages)\n",
247
+ "answer = response.choices[0].message.content\n",
248
+ "\n",
249
+ "display(Markdown(answer))\n",
250
+ "models.append(model_name)\n",
251
+ "answers.append(answer)"
252
+ ]
253
+ },
254
+ {
255
+ "cell_type": "code",
256
+ "execution_count": null,
257
+ "metadata": {},
258
+ "outputs": [],
259
+ "source": [
260
+ "# Deepseek thinking process\n",
261
+ "\n",
262
+ "deepseek = OpenAI(api_key=deepseek_api_key, base_url=\"https://api.deepseek.com/v1\")\n",
263
+ "model_name = \"deepseek-chat\"\n",
264
+ "\n",
265
+ "response = deepseek.chat.completions.create(model=model_name, messages=messages)\n",
266
+ "answer = response.choices[0].message.content\n",
267
+ "\n",
268
+ "display(Markdown(answer))\n",
269
+ "models.append(model_name)\n",
270
+ "answers.append(answer)"
271
+ ]
272
+ },
273
+ {
274
+ "cell_type": "code",
275
+ "execution_count": null,
276
+ "metadata": {},
277
+ "outputs": [],
278
+ "source": [
279
+ "# Groq thinking process\n",
280
+ "\n",
281
+ "groq = OpenAI(api_key=groq_api_key, base_url=\"https://api.groq.com/openai/v1\")\n",
282
+ "model_name = \"llama-3.3-70b-versatile\"\n",
283
+ "\n",
284
+ "response = groq.chat.completions.create(model=model_name, messages=messages)\n",
285
+ "answer = response.choices[0].message.content\n",
286
+ "\n",
287
+ "display(Markdown(answer))\n",
288
+ "models.append(model_name)\n",
289
+ "answers.append(answer)"
290
+ ]
291
+ },
292
+ {
293
+ "cell_type": "code",
294
+ "execution_count": null,
295
+ "metadata": {},
296
+ "outputs": [],
297
+ "source": [
298
+ "!ollama pull llama3.2"
299
+ ]
300
+ },
301
+ {
302
+ "cell_type": "code",
303
+ "execution_count": null,
304
+ "metadata": {},
305
+ "outputs": [],
306
+ "source": [
307
+ "# Ollama thinking process\n",
308
+ "\n",
309
+ "ollama = OpenAI(base_url='http://localhost:11434/v1', api_key='ollama')\n",
310
+ "model_name = \"llama3.2\"\n",
311
+ "\n",
312
+ "response = ollama.chat.completions.create(model=model_name, messages=messages)\n",
313
+ "answer = response.choices[0].message.content\n",
314
+ "\n",
315
+ "display(Markdown(answer))\n",
316
+ "models.append(model_name)\n",
317
+ "answers.append(answer)"
318
+ ]
319
+ },
320
+ {
321
+ "cell_type": "code",
322
+ "execution_count": null,
323
+ "metadata": {},
324
+ "outputs": [],
325
+ "source": [
326
+ "for model, answer in zip(models, answers):\n",
327
+ " print(f\"Model: {model}\\n\\n{answer}\")"
328
+ ]
329
+ },
330
+ {
331
+ "cell_type": "markdown",
332
+ "metadata": {},
333
+ "source": [
334
+ "## Next Step: Solution Synthesis and Enhancement\n",
335
+ "\n",
336
+ "**Best Recommendation Selection and Extended Solution Development**\n",
337
+ "\n",
338
+ "After applying the Six Thinking Hats analysis to evaluate the initial technological solution from multiple perspectives, the simulator will:\n",
339
+ "\n",
340
+ "1. **Synthesize Analysis Results**: Compile insights from all six thinking perspectives (White, Red, Black, Yellow, Green, and Blue hats) to identify the most compelling recommendations and improvements.\n",
341
+ "\n",
342
+ "2. **Select Optimal Recommendation**: Using a weighted evaluation system that considers feasibility, impact, and alignment with organizational goals, the simulator will identify and present the single best recommendation that emerged from the Six Thinking Hats analysis.\n",
343
+ "\n",
344
+ "3. **Generate Extended Solution**: Building upon the selected best recommendation, the simulator will create a comprehensive, enhanced version of the original technological solution that incorporates:\n",
345
+ " - Key insights from the critical analysis (Black Hat)\n",
346
+ " - Positive opportunities identified (Yellow Hat)\n",
347
+ " - Creative alternatives and innovations (Green Hat)\n",
348
+ " - Factual considerations and data requirements (White Hat)\n",
349
+ " - User experience and emotional factors (Red Hat)\n",
350
+ "\n",
351
+ "4. **Multi-Model Enhancement**: To further strengthen the solution, the simulator will leverage additional AI models or perspectives to provide supplementary recommendations that complement the Six Thinking Hats analysis, offering a more robust and well-rounded final technological solution.\n",
352
+ "\n",
353
+ "This step transforms the analytical insights into actionable improvements, delivering a refined solution that has been thoroughly evaluated and enhanced through structured critical thinking."
354
+ ]
355
+ },
356
+ {
357
+ "cell_type": "code",
358
+ "execution_count": 14,
359
+ "metadata": {},
360
+ "outputs": [],
361
+ "source": [
362
+ "together = \"\"\n",
363
+ "for index, answer in enumerate(answers):\n",
364
+ " together += f\"# Response from model {index+1}\\n\\n\"\n",
365
+ " together += answer + \"\\n\\n\""
366
+ ]
367
+ },
368
+ {
369
+ "cell_type": "code",
370
+ "execution_count": null,
371
+ "metadata": {},
372
+ "outputs": [],
373
+ "source": [
374
+ "from IPython.display import Markdown, display\n",
375
+ "import re\n",
376
+ "\n",
377
+ "print(f\"Each model has been given this technological solution to analyze: {question}\")\n",
378
+ "\n",
379
+ "# First, get the best individual response\n",
380
+ "judge_prompt = f\"\"\"\n",
381
+ " You are judging the quality of {len(models)} responses.\n",
382
+ " Evaluate each response based on:\n",
383
+ " 1. Clarity and coherence\n",
384
+ " 2. Depth of analysis\n",
385
+ " 3. Practicality of recommendations\n",
386
+ " 4. Originality of insights\n",
387
+ " \n",
388
+ " Rank the responses from best to worst.\n",
389
+ " Respond with the model index of the best response, nothing else.\n",
390
+ " \n",
391
+ " Here are the responses:\n",
392
+ " {answers}\n",
393
+ " \"\"\"\n",
394
+ " \n",
395
+ "# Get the best response\n",
396
+ "judge_response = openai.chat.completions.create(\n",
397
+ " model=\"o3-mini\",\n",
398
+ " messages=[{\"role\": \"user\", \"content\": judge_prompt}]\n",
399
+ ")\n",
400
+ "best_response = judge_response.choices[0].message.content\n",
401
+ "\n",
402
+ "print(f\"Best Response's Model: {models[int(best_response)]}\")\n",
403
+ "\n",
404
+ "synthesis_prompt = f\"\"\"\n",
405
+ " Here is the best response's model index from the judge:\n",
406
+ "\n",
407
+ " {best_response}\n",
408
+ "\n",
409
+ " And here are the responses from all the models:\n",
410
+ "\n",
411
+ " {together}\n",
412
+ "\n",
413
+ " Synthesize the responses from the non-best models into one comprehensive answer that:\n",
414
+ " 1. Captures the best insights from each response that could add value to the best response from the judge\n",
415
+ " 2. Resolves any contradictions between responses before extending the best response\n",
416
+ " 3. Presents a clear and coherent final answer that is a comprehensive extension of the best response from the judge\n",
417
+ " 4. Maintains the same format as the original best response from the judge\n",
418
+ " 5. Compiles all additional recommendations mentioned by all models\n",
419
+ "\n",
420
+ " Show the best response {answers[int(best_response)]} and then your synthesized response specifying which are additional recommendations to the best response:\n",
421
+ " \"\"\"\n",
422
+ "\n",
423
+ "# Get the synthesized response\n",
424
+ "synthesis_response = claude.messages.create(\n",
425
+ " model=\"claude-3-7-sonnet-latest\",\n",
426
+ " messages=[{\"role\": \"user\", \"content\": synthesis_prompt}],\n",
427
+ " max_tokens=10000\n",
428
+ ")\n",
429
+ "synthesized_answer = synthesis_response.content[0].text\n",
430
+ "\n",
431
+ "converted_answer = re.sub(r'\\\\[\\[\\]]', '$$', synthesized_answer)\n",
432
+ "display(Markdown(converted_answer))"
433
+ ]
434
+ }
435
+ ],
436
+ "metadata": {
437
+ "kernelspec": {
438
+ "display_name": ".venv",
439
+ "language": "python",
440
+ "name": "python3"
441
+ },
442
+ "language_info": {
443
+ "codemirror_mode": {
444
+ "name": "ipython",
445
+ "version": 3
446
+ },
447
+ "file_extension": ".py",
448
+ "mimetype": "text/x-python",
449
+ "name": "python",
450
+ "nbconvert_exporter": "python",
451
+ "pygments_lexer": "ipython3",
452
+ "version": "3.12.10"
453
+ }
454
+ },
455
+ "nbformat": 4,
456
+ "nbformat_minor": 2
457
+ }
community_contributions/3_lab3_groq_llama_generator_gemini_evaluator.ipynb ADDED
@@ -0,0 +1,286 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "## Chat app with LinkedIn Profile Information - Groq LLama as Generator and Gemini as evaluator\n"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "code",
12
+ "execution_count": 58,
13
+ "metadata": {},
14
+ "outputs": [],
15
+ "source": [
16
+ "# If you don't know what any of these packages do - you can always ask ChatGPT for a guide!\n",
17
+ "\n",
18
+ "from dotenv import load_dotenv\n",
19
+ "from openai import OpenAI\n",
20
+ "from pypdf import PdfReader\n",
21
+ "from groq import Groq\n",
22
+ "import gradio as gr"
23
+ ]
24
+ },
25
+ {
26
+ "cell_type": "code",
27
+ "execution_count": 59,
28
+ "metadata": {},
29
+ "outputs": [],
30
+ "source": [
31
+ "load_dotenv(override=True)\n",
32
+ "groq = Groq()"
33
+ ]
34
+ },
35
+ {
36
+ "cell_type": "code",
37
+ "execution_count": 60,
38
+ "metadata": {},
39
+ "outputs": [],
40
+ "source": [
41
+ "reader = PdfReader(\"me/My_LinkedIn.pdf\")\n",
42
+ "linkedin = \"\"\n",
43
+ "for page in reader.pages:\n",
44
+ " text = page.extract_text()\n",
45
+ " if text:\n",
46
+ " linkedin += text"
47
+ ]
48
+ },
49
+ {
50
+ "cell_type": "code",
51
+ "execution_count": null,
52
+ "metadata": {},
53
+ "outputs": [],
54
+ "source": [
55
+ "print(linkedin)"
56
+ ]
57
+ },
58
+ {
59
+ "cell_type": "code",
60
+ "execution_count": 61,
61
+ "metadata": {},
62
+ "outputs": [],
63
+ "source": [
64
+ "with open(\"me/summary.txt\", \"r\", encoding=\"utf-8\") as f:\n",
65
+ " summary = f.read()"
66
+ ]
67
+ },
68
+ {
69
+ "cell_type": "code",
70
+ "execution_count": 62,
71
+ "metadata": {},
72
+ "outputs": [],
73
+ "source": [
74
+ "name = \"Maalaiappan Subramanian\""
75
+ ]
76
+ },
77
+ {
78
+ "cell_type": "code",
79
+ "execution_count": 63,
80
+ "metadata": {},
81
+ "outputs": [],
82
+ "source": [
83
+ "system_prompt = f\"You are acting as {name}. You are answering questions on {name}'s website, \\\n",
84
+ "particularly questions related to {name}'s career, background, skills and experience. \\\n",
85
+ "Your responsibility is to represent {name} for interactions on the website as faithfully as possible. \\\n",
86
+ "You are given a summary of {name}'s background and LinkedIn profile which you can use to answer questions. \\\n",
87
+ "Be professional and engaging, as if talking to a potential client or future employer who came across the website. \\\n",
88
+ "If you don't know the answer, say so.\"\n",
89
+ "\n",
90
+ "system_prompt += f\"\\n\\n## Summary:\\n{summary}\\n\\n## LinkedIn Profile:\\n{linkedin}\\n\\n\"\n",
91
+ "system_prompt += f\"With this context, please chat with the user, always staying in character as {name}.\"\n"
92
+ ]
93
+ },
94
+ {
95
+ "cell_type": "code",
96
+ "execution_count": null,
97
+ "metadata": {},
98
+ "outputs": [],
99
+ "source": [
100
+ "system_prompt"
101
+ ]
102
+ },
103
+ {
104
+ "cell_type": "code",
105
+ "execution_count": 65,
106
+ "metadata": {},
107
+ "outputs": [],
108
+ "source": [
109
+ "def chat(message, history):\n",
110
+ " # Below line is to remove the metadata and options from the history\n",
111
+ " history = [{k: v for k, v in item.items() if k not in ('metadata', 'options')} for item in history]\n",
112
+ " messages = [{\"role\": \"system\", \"content\": system_prompt}] + history + [{\"role\": \"user\", \"content\": message}]\n",
113
+ " response = groq.chat.completions.create(model=\"llama-3.3-70b-versatile\", messages=messages)\n",
114
+ " return response.choices[0].message.content"
115
+ ]
116
+ },
117
+ {
118
+ "cell_type": "code",
119
+ "execution_count": null,
120
+ "metadata": {},
121
+ "outputs": [],
122
+ "source": [
123
+ "gr.ChatInterface(chat, type=\"messages\").launch()"
124
+ ]
125
+ },
126
+ {
127
+ "cell_type": "code",
128
+ "execution_count": 67,
129
+ "metadata": {},
130
+ "outputs": [],
131
+ "source": [
132
+ "# Create a Pydantic model for the Evaluation\n",
133
+ "\n",
134
+ "from pydantic import BaseModel\n",
135
+ "\n",
136
+ "class Evaluation(BaseModel):\n",
137
+ " is_acceptable: bool\n",
138
+ " feedback: str\n"
139
+ ]
140
+ },
141
+ {
142
+ "cell_type": "code",
143
+ "execution_count": 69,
144
+ "metadata": {},
145
+ "outputs": [],
146
+ "source": [
147
+ "evaluator_system_prompt = f\"You are an evaluator that decides whether a response to a question is acceptable. \\\n",
148
+ "You are provided with a conversation between a User and an Agent. Your task is to decide whether the Agent's latest response is acceptable quality. \\\n",
149
+ "The Agent is playing the role of {name} and is representing {name} on their website. \\\n",
150
+ "The Agent has been instructed to be professional and engaging, as if talking to a potential client or future employer who came across the website. \\\n",
151
+ "The Agent has been provided with context on {name} in the form of their summary and LinkedIn details. Here's the information:\"\n",
152
+ "\n",
153
+ "evaluator_system_prompt += f\"\\n\\n## Summary:\\n{summary}\\n\\n## LinkedIn Profile:\\n{linkedin}\\n\\n\"\n",
154
+ "evaluator_system_prompt += f\"With this context, please evaluate the latest response, replying with whether the response is acceptable and your feedback.\""
155
+ ]
156
+ },
157
+ {
158
+ "cell_type": "code",
159
+ "execution_count": 70,
160
+ "metadata": {},
161
+ "outputs": [],
162
+ "source": [
163
+ "def evaluator_user_prompt(reply, message, history):\n",
164
+ " user_prompt = f\"Here's the conversation between the User and the Agent: \\n\\n{history}\\n\\n\"\n",
165
+ " user_prompt += f\"Here's the latest message from the User: \\n\\n{message}\\n\\n\"\n",
166
+ " user_prompt += f\"Here's the latest response from the Agent: \\n\\n{reply}\\n\\n\"\n",
167
+ " user_prompt += f\"Please evaluate the response, replying with whether it is acceptable and your feedback.\"\n",
168
+ " return user_prompt"
169
+ ]
170
+ },
171
+ {
172
+ "cell_type": "code",
173
+ "execution_count": 71,
174
+ "metadata": {},
175
+ "outputs": [],
176
+ "source": [
177
+ "import os\n",
178
+ "gemini = OpenAI(\n",
179
+ " api_key=os.getenv(\"GOOGLE_API_KEY\"), \n",
180
+ " base_url=\"https://generativelanguage.googleapis.com/v1beta/openai/\"\n",
181
+ ")"
182
+ ]
183
+ },
184
+ {
185
+ "cell_type": "code",
186
+ "execution_count": 72,
187
+ "metadata": {},
188
+ "outputs": [],
189
+ "source": [
190
+ "def evaluate(reply, message, history) -> Evaluation:\n",
191
+ "\n",
192
+ " messages = [{\"role\": \"system\", \"content\": evaluator_system_prompt}] + [{\"role\": \"user\", \"content\": evaluator_user_prompt(reply, message, history)}]\n",
193
+ " response = gemini.beta.chat.completions.parse(model=\"gemini-2.0-flash\", messages=messages, response_format=Evaluation)\n",
194
+ " return response.choices[0].message.parsed"
195
+ ]
196
+ },
197
+ {
198
+ "cell_type": "code",
199
+ "execution_count": 73,
200
+ "metadata": {},
201
+ "outputs": [],
202
+ "source": [
203
+ "def rerun(reply, message, history, feedback):\n",
204
+ " # Below line is to remove the metadata and options from the history\n",
205
+ " history = [{k: v for k, v in item.items() if k not in ('metadata', 'options')} for item in history]\n",
206
+ " updated_system_prompt = system_prompt + f\"\\n\\n## Previous answer rejected\\nYou just tried to reply, but the quality control rejected your reply\\n\"\n",
207
+ " updated_system_prompt += f\"## Your attempted answer:\\n{reply}\\n\\n\"\n",
208
+ " updated_system_prompt += f\"## Reason for rejection:\\n{feedback}\\n\\n\"\n",
209
+ " messages = [{\"role\": \"system\", \"content\": updated_system_prompt}] + history + [{\"role\": \"user\", \"content\": message}]\n",
210
+ " response = groq.chat.completions.create(model=\"llama-3.3-70b-versatile\", messages=messages)\n",
211
+ " return response.choices[0].message.content"
212
+ ]
213
+ },
214
+ {
215
+ "cell_type": "code",
216
+ "execution_count": 74,
217
+ "metadata": {},
218
+ "outputs": [],
219
+ "source": [
220
+ "def chat(message, history):\n",
221
+ " if \"personal\" in message:\n",
222
+ " system = system_prompt + \"\\n\\nEverything in your reply needs to be in Gen Z language - \\\n",
223
+ " it is mandatory that you respond only and entirely in Gen Z language\"\n",
224
+ " else:\n",
225
+ " system = system_prompt\n",
226
+ " # Below line is to remove the metadata and options from the history\n",
227
+ " history = [{k: v for k, v in item.items() if k not in ('metadata', 'options')} for item in history]\n",
228
+ " messages = [{\"role\": \"system\", \"content\": system}] + history + [{\"role\": \"user\", \"content\": message}]\n",
229
+ " response = groq.chat.completions.create(model=\"llama-3.3-70b-versatile\", messages=messages)\n",
230
+ " reply =response.choices[0].message.content\n",
231
+ "\n",
232
+ " evaluation = evaluate(reply, message, history)\n",
233
+ " \n",
234
+ " if evaluation.is_acceptable:\n",
235
+ " print(\"Passed evaluation - returning reply\")\n",
236
+ " else:\n",
237
+ " print(\"Failed evaluation - retrying\")\n",
238
+ " print(evaluation.feedback)\n",
239
+ " reply = rerun(reply, message, history, evaluation.feedback) \n",
240
+ " return reply"
241
+ ]
242
+ },
243
+ {
244
+ "cell_type": "code",
245
+ "execution_count": null,
246
+ "metadata": {},
247
+ "outputs": [],
248
+ "source": [
249
+ "gr.ChatInterface(chat, type=\"messages\").launch()"
250
+ ]
251
+ },
252
+ {
253
+ "cell_type": "markdown",
254
+ "metadata": {},
255
+ "source": []
256
+ },
257
+ {
258
+ "cell_type": "code",
259
+ "execution_count": null,
260
+ "metadata": {},
261
+ "outputs": [],
262
+ "source": []
263
+ }
264
+ ],
265
+ "metadata": {
266
+ "kernelspec": {
267
+ "display_name": ".venv",
268
+ "language": "python",
269
+ "name": "python3"
270
+ },
271
+ "language_info": {
272
+ "codemirror_mode": {
273
+ "name": "ipython",
274
+ "version": 3
275
+ },
276
+ "file_extension": ".py",
277
+ "mimetype": "text/x-python",
278
+ "name": "python",
279
+ "nbconvert_exporter": "python",
280
+ "pygments_lexer": "ipython3",
281
+ "version": "3.12.10"
282
+ }
283
+ },
284
+ "nbformat": 4,
285
+ "nbformat_minor": 2
286
+ }
community_contributions/Business_Idea.ipynb ADDED
@@ -0,0 +1,388 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "## Business idea generator and evaluator \n",
8
+ "\n"
9
+ ]
10
+ },
11
+ {
12
+ "cell_type": "code",
13
+ "execution_count": 1,
14
+ "metadata": {},
15
+ "outputs": [],
16
+ "source": [
17
+ "# Start with imports - ask ChatGPT to explain any package that you don't know\n",
18
+ "\n",
19
+ "import os\n",
20
+ "import json\n",
21
+ "from dotenv import load_dotenv\n",
22
+ "from openai import OpenAI\n",
23
+ "from anthropic import Anthropic\n",
24
+ "from IPython.display import Markdown, display"
25
+ ]
26
+ },
27
+ {
28
+ "cell_type": "code",
29
+ "execution_count": null,
30
+ "metadata": {},
31
+ "outputs": [],
32
+ "source": [
33
+ "# Always remember to do this!\n",
34
+ "load_dotenv(override=True)"
35
+ ]
36
+ },
37
+ {
38
+ "cell_type": "code",
39
+ "execution_count": null,
40
+ "metadata": {},
41
+ "outputs": [],
42
+ "source": [
43
+ "# Print the key prefixes to help with any debugging\n",
44
+ "\n",
45
+ "openai_api_key = os.getenv('OPENAI_API_KEY')\n",
46
+ "anthropic_api_key = os.getenv('ANTHROPIC_API_KEY')\n",
47
+ "google_api_key = os.getenv('GOOGLE_API_KEY')\n",
48
+ "deepseek_api_key = os.getenv('DEEPSEEK_API_KEY')\n",
49
+ "groq_api_key = os.getenv('GROQ_API_KEY')\n",
50
+ "\n",
51
+ "if openai_api_key:\n",
52
+ " print(f\"OpenAI API Key exists and begins {openai_api_key[:8]}\")\n",
53
+ "else:\n",
54
+ " print(\"OpenAI API Key not set\")\n",
55
+ " \n",
56
+ "if anthropic_api_key:\n",
57
+ " print(f\"Anthropic API Key exists and begins {anthropic_api_key[:7]}\")\n",
58
+ "else:\n",
59
+ " print(\"Anthropic API Key not set (and this is optional)\")\n",
60
+ "\n",
61
+ "if google_api_key:\n",
62
+ " print(f\"Google API Key exists and begins {google_api_key[:2]}\")\n",
63
+ "else:\n",
64
+ " print(\"Google API Key not set (and this is optional)\")\n",
65
+ "\n",
66
+ "if deepseek_api_key:\n",
67
+ " print(f\"DeepSeek API Key exists and begins {deepseek_api_key[:3]}\")\n",
68
+ "else:\n",
69
+ " print(\"DeepSeek API Key not set (and this is optional)\")\n",
70
+ "\n",
71
+ "if groq_api_key:\n",
72
+ " print(f\"Groq API Key exists and begins {groq_api_key[:4]}\")\n",
73
+ "else:\n",
74
+ " print(\"Groq API Key not set (and this is optional)\")"
75
+ ]
76
+ },
77
+ {
78
+ "cell_type": "code",
79
+ "execution_count": 4,
80
+ "metadata": {},
81
+ "outputs": [],
82
+ "source": [
83
+ "request = (\n",
84
+ " \"Please generate three innovative business ideas aligned with the latest global trends. \"\n",
85
+ " \"For each idea, include a brief description (2–3 sentences).\"\n",
86
+ ")\n",
87
+ "messages = [{\"role\": \"user\", \"content\": request}]"
88
+ ]
89
+ },
90
+ {
91
+ "cell_type": "code",
92
+ "execution_count": null,
93
+ "metadata": {},
94
+ "outputs": [],
95
+ "source": [
96
+ "messages"
97
+ ]
98
+ },
99
+ {
100
+ "cell_type": "code",
101
+ "execution_count": null,
102
+ "metadata": {},
103
+ "outputs": [],
104
+ "source": [
105
+ "\n",
106
+ "openai = OpenAI()\n",
107
+ "'''\n",
108
+ "response = openai.chat.completions.create(\n",
109
+ " model=\"gpt-4o-mini\",\n",
110
+ " messages=messages,\n",
111
+ ")\n",
112
+ "question = response.choices[0].message.content\n",
113
+ "print(question)\n",
114
+ "'''"
115
+ ]
116
+ },
117
+ {
118
+ "cell_type": "code",
119
+ "execution_count": 9,
120
+ "metadata": {},
121
+ "outputs": [],
122
+ "source": [
123
+ "competitors = []\n",
124
+ "answers = []\n",
125
+ "#messages = [{\"role\": \"user\", \"content\": question}]"
126
+ ]
127
+ },
128
+ {
129
+ "cell_type": "code",
130
+ "execution_count": null,
131
+ "metadata": {},
132
+ "outputs": [],
133
+ "source": [
134
+ "# The API we know well\n",
135
+ "\n",
136
+ "model_name = \"gpt-4o-mini\"\n",
137
+ "\n",
138
+ "response = openai.chat.completions.create(model=model_name, messages=messages)\n",
139
+ "answer = response.choices[0].message.content\n",
140
+ "\n",
141
+ "display(Markdown(answer))\n",
142
+ "competitors.append(model_name)\n",
143
+ "answers.append(answer)"
144
+ ]
145
+ },
146
+ {
147
+ "cell_type": "code",
148
+ "execution_count": null,
149
+ "metadata": {},
150
+ "outputs": [],
151
+ "source": [
152
+ "# Anthropic has a slightly different API, and Max Tokens is required\n",
153
+ "\n",
154
+ "model_name = \"claude-3-7-sonnet-latest\"\n",
155
+ "\n",
156
+ "claude = Anthropic()\n",
157
+ "response = claude.messages.create(model=model_name, messages=messages, max_tokens=1000)\n",
158
+ "answer = response.content[0].text\n",
159
+ "\n",
160
+ "display(Markdown(answer))\n",
161
+ "competitors.append(model_name)\n",
162
+ "answers.append(answer)"
163
+ ]
164
+ },
165
+ {
166
+ "cell_type": "code",
167
+ "execution_count": null,
168
+ "metadata": {},
169
+ "outputs": [],
170
+ "source": [
171
+ "gemini = OpenAI(api_key=google_api_key, base_url=\"https://generativelanguage.googleapis.com/v1beta/openai/\")\n",
172
+ "model_name = \"gemini-2.0-flash\"\n",
173
+ "\n",
174
+ "response = gemini.chat.completions.create(model=model_name, messages=messages)\n",
175
+ "answer = response.choices[0].message.content\n",
176
+ "\n",
177
+ "display(Markdown(answer))\n",
178
+ "competitors.append(model_name)\n",
179
+ "answers.append(answer)"
180
+ ]
181
+ },
182
+ {
183
+ "cell_type": "code",
184
+ "execution_count": null,
185
+ "metadata": {},
186
+ "outputs": [],
187
+ "source": [
188
+ "deepseek = OpenAI(api_key=deepseek_api_key, base_url=\"https://api.deepseek.com/v1\")\n",
189
+ "model_name = \"deepseek-chat\"\n",
190
+ "\n",
191
+ "response = deepseek.chat.completions.create(model=model_name, messages=messages)\n",
192
+ "answer = response.choices[0].message.content\n",
193
+ "\n",
194
+ "display(Markdown(answer))\n",
195
+ "competitors.append(model_name)\n",
196
+ "answers.append(answer)"
197
+ ]
198
+ },
199
+ {
200
+ "cell_type": "code",
201
+ "execution_count": null,
202
+ "metadata": {},
203
+ "outputs": [],
204
+ "source": [
205
+ "groq = OpenAI(api_key=groq_api_key, base_url=\"https://api.groq.com/openai/v1\")\n",
206
+ "model_name = \"llama-3.3-70b-versatile\"\n",
207
+ "\n",
208
+ "response = groq.chat.completions.create(model=model_name, messages=messages)\n",
209
+ "answer = response.choices[0].message.content\n",
210
+ "\n",
211
+ "display(Markdown(answer))\n",
212
+ "competitors.append(model_name)\n",
213
+ "answers.append(answer)\n"
214
+ ]
215
+ },
216
+ {
217
+ "cell_type": "code",
218
+ "execution_count": null,
219
+ "metadata": {},
220
+ "outputs": [],
221
+ "source": [
222
+ "!ollama pull llama3.2"
223
+ ]
224
+ },
225
+ {
226
+ "cell_type": "code",
227
+ "execution_count": null,
228
+ "metadata": {},
229
+ "outputs": [],
230
+ "source": [
231
+ "ollama = OpenAI(base_url='http://localhost:11434/v1', api_key='ollama')\n",
232
+ "model_name = \"llama3.2\"\n",
233
+ "\n",
234
+ "response = ollama.chat.completions.create(model=model_name, messages=messages)\n",
235
+ "answer = response.choices[0].message.content\n",
236
+ "\n",
237
+ "display(Markdown(answer))\n",
238
+ "competitors.append(model_name)\n",
239
+ "answers.append(answer)"
240
+ ]
241
+ },
242
+ {
243
+ "cell_type": "code",
244
+ "execution_count": null,
245
+ "metadata": {},
246
+ "outputs": [],
247
+ "source": [
248
+ "# So where are we?\n",
249
+ "\n",
250
+ "print(competitors)\n",
251
+ "print(answers)\n"
252
+ ]
253
+ },
254
+ {
255
+ "cell_type": "code",
256
+ "execution_count": null,
257
+ "metadata": {},
258
+ "outputs": [],
259
+ "source": [
260
+ "# It's nice to know how to use \"zip\"\n",
261
+ "for competitor, answer in zip(competitors, answers):\n",
262
+ " print(f\"Competitor: {competitor}\\n\\n{answer}\")\n"
263
+ ]
264
+ },
265
+ {
266
+ "cell_type": "code",
267
+ "execution_count": 14,
268
+ "metadata": {},
269
+ "outputs": [],
270
+ "source": [
271
+ "# Let's bring this together - note the use of \"enumerate\"\n",
272
+ "\n",
273
+ "together = \"\"\n",
274
+ "for index, answer in enumerate(answers):\n",
275
+ " together += f\"# Response from competitor {index+1}\\n\\n\"\n",
276
+ " together += answer + \"\\n\\n\""
277
+ ]
278
+ },
279
+ {
280
+ "cell_type": "code",
281
+ "execution_count": null,
282
+ "metadata": {},
283
+ "outputs": [],
284
+ "source": [
285
+ "print(together)"
286
+ ]
287
+ },
288
+ {
289
+ "cell_type": "code",
290
+ "execution_count": null,
291
+ "metadata": {},
292
+ "outputs": [],
293
+ "source": [
294
+ "judge = f\"\"\"You are judging a competition between {len(competitors)} competitors.\n",
295
+ "Each model was asked to generate three innovative business ideas aligned with the latest global trends.\n",
296
+ "\n",
297
+ "Your job is to evaluate the likelihood of success for each idea on a scale from 0 to 100 percent. For each competitor, list the three percentages in the same order as their ideas.\n",
298
+ "\n",
299
+ "Respond only with JSON in this format:\n",
300
+ "{{\"results\": [\n",
301
+ " {{\"competitor\": 1, \"success_chances\": [perc1, perc2, perc3]}},\n",
302
+ " {{\"competitor\": 2, \"success_chances\": [perc1, perc2, perc3]}},\n",
303
+ " ...\n",
304
+ "]}}\n",
305
+ "\n",
306
+ "Here are the ideas from each competitor:\n",
307
+ "\n",
308
+ "{together}\n",
309
+ "\n",
310
+ "Now respond with only the JSON, nothing else.\"\"\"\n"
311
+ ]
312
+ },
313
+ {
314
+ "cell_type": "code",
315
+ "execution_count": null,
316
+ "metadata": {},
317
+ "outputs": [],
318
+ "source": [
319
+ "print(judge)"
320
+ ]
321
+ },
322
+ {
323
+ "cell_type": "code",
324
+ "execution_count": 18,
325
+ "metadata": {},
326
+ "outputs": [],
327
+ "source": [
328
+ "judge_messages = [{\"role\": \"user\", \"content\": judge}]"
329
+ ]
330
+ },
331
+ {
332
+ "cell_type": "code",
333
+ "execution_count": null,
334
+ "metadata": {},
335
+ "outputs": [],
336
+ "source": [
337
+ "# Judgement time!\n",
338
+ "\n",
339
+ "openai = OpenAI()\n",
340
+ "response = openai.chat.completions.create(\n",
341
+ " model=\"o3-mini\",\n",
342
+ " messages=judge_messages,\n",
343
+ ")\n",
344
+ "results = response.choices[0].message.content\n",
345
+ "print(results)\n"
346
+ ]
347
+ },
348
+ {
349
+ "cell_type": "code",
350
+ "execution_count": null,
351
+ "metadata": {},
352
+ "outputs": [],
353
+ "source": [
354
+ "# Parse judge results JSON and display success probabilities\n",
355
+ "results_dict = json.loads(results)\n",
356
+ "for entry in results_dict[\"results\"]:\n",
357
+ " comp_num = entry[\"competitor\"]\n",
358
+ " comp_name = competitors[comp_num - 1]\n",
359
+ " chances = entry[\"success_chances\"]\n",
360
+ " print(f\"{comp_name}:\")\n",
361
+ " for idx, perc in enumerate(chances, start=1):\n",
362
+ " print(f\" Idea {idx}: {perc}% chance of success\")\n",
363
+ " print()\n"
364
+ ]
365
+ }
366
+ ],
367
+ "metadata": {
368
+ "kernelspec": {
369
+ "display_name": ".venv",
370
+ "language": "python",
371
+ "name": "python3"
372
+ },
373
+ "language_info": {
374
+ "codemirror_mode": {
375
+ "name": "ipython",
376
+ "version": 3
377
+ },
378
+ "file_extension": ".py",
379
+ "mimetype": "text/x-python",
380
+ "name": "python",
381
+ "nbconvert_exporter": "python",
382
+ "pygments_lexer": "ipython3",
383
+ "version": "3.12.7"
384
+ }
385
+ },
386
+ "nbformat": 4,
387
+ "nbformat_minor": 2
388
+ }
community_contributions/Multi-Model-Resume–JD-Match-Analyzer/.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ .env
community_contributions/Multi-Model-Resume/342/200/223JD-Match-Analyzer/AnalyzeResume.png ADDED
community_contributions/Multi-Model-Resume–JD-Match-Analyzer/README.md ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 🧠 Resume-Job Match Application (LLM-Powered)
2
+
3
+ ![AnalyseResume](AnalyzeResume.png)
4
+
5
+ This is a **Streamlit-based web app** that evaluates how well a resume matches a job description using powerful Large Language Models (LLMs) such as:
6
+
7
+ - OpenAI GPT
8
+ - Anthropic Claude
9
+ - Google Gemini (Generative AI)
10
+ - Groq LLM
11
+ - DeepSeek LLM
12
+
13
+ The app takes a resume and job description as input files, sends them to these LLMs, and returns:
14
+
15
+ - ✅ Match percentage from each model
16
+ - 📊 A ranked table sorted by match %
17
+ - 📈 Average match percentage
18
+ - 🧠 Simple, responsive UI for instant feedback
19
+
20
+ ## 📂 Features
21
+
22
+ - Upload **any file type** for resume and job description (PDF, DOCX, TXT, etc.)
23
+ - Automatic extraction and cleaning of text
24
+ - Match results across multiple models in real time
25
+ - Table view with clean formatting
26
+ - Uses `.env` file for secure API key management
27
+
28
+ ## 🔐 Environment Setup (`.env`)
29
+
30
+ Create a `.env` file in the project root and add the following API keys:
31
+
32
+ ```env
33
+ OPENAI_API_KEY=your-openai-api-key
34
+ ANTHROPIC_API_KEY=your-anthropic-api-key
35
+ GOOGLE_API_KEY=your-google-api-key
36
+ GROQ_API_KEY=your-groq-api-key
37
+ DEEPSEEK_API_KEY=your-deepseek-api-key
38
+ ```
39
+
40
+ ## ▶️ Running the App
41
+ ### Launch the app using Streamlit:
42
+
43
+ streamlit run resume_agent.py
44
+
45
+ ### The app will open in your browser at:
46
+ 📍 http://localhost:8501
47
+
48
+
community_contributions/Multi-Model-Resume–JD-Match-Analyzer/multi_file_ingestion.py ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from langchain.document_loaders import (
3
+ TextLoader,
4
+ PyPDFLoader,
5
+ UnstructuredWordDocumentLoader,
6
+ UnstructuredFileLoader
7
+ )
8
+
9
+
10
+
11
+ def load_and_split_resume(file_path: str):
12
+ """
13
+ Loads a resume file and splits it into text chunks using LangChain.
14
+
15
+ Args:
16
+ file_path (str): Path to the resume file (.txt, .pdf, .docx, etc.)
17
+ chunk_size (int): Maximum characters per chunk.
18
+ chunk_overlap (int): Overlap between chunks to preserve context.
19
+
20
+ Returns:
21
+ List[str]: List of split text chunks.
22
+ """
23
+ if not os.path.exists(file_path):
24
+ raise FileNotFoundError(f"File not found: {file_path}")
25
+
26
+ ext = os.path.splitext(file_path)[1].lower()
27
+
28
+ # Select the appropriate loader
29
+ if ext == ".txt":
30
+ loader = TextLoader(file_path, encoding="utf-8")
31
+ elif ext == ".pdf":
32
+ loader = PyPDFLoader(file_path)
33
+ elif ext in [".docx", ".doc"]:
34
+ loader = UnstructuredWordDocumentLoader(file_path)
35
+ else:
36
+ # Fallback for other common formats
37
+ loader = UnstructuredFileLoader(file_path)
38
+
39
+ # Load the file as LangChain documents
40
+ documents = loader.load()
41
+
42
+
43
+ return documents
44
+ # return [doc.page_content for doc in split_docs]
community_contributions/Multi-Model-Resume–JD-Match-Analyzer/resume_agent.py ADDED
@@ -0,0 +1,262 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import os
3
+ from openai import OpenAI
4
+ from anthropic import Anthropic
5
+ import pdfplumber
6
+ from io import StringIO
7
+ from dotenv import load_dotenv
8
+ import pandas as pd
9
+ from multi_file_ingestion import load_and_split_resume
10
+
11
+ # Load environment variables
12
+ load_dotenv(override=True)
13
+ openai_api_key = os.getenv("OPENAI_API_KEY")
14
+ anthropic_api_key = os.getenv("ANTHROPIC_API_KEY")
15
+ google_api_key = os.getenv("GOOGLE_API_KEY")
16
+ groq_api_key = os.getenv("GROQ_API_KEY")
17
+ deepseek_api_key = os.getenv("DEEPSEEK_API_KEY")
18
+
19
+ openai = OpenAI()
20
+
21
+ # Streamlit UI
22
+ st.set_page_config(page_title="LLM Resume–JD Fit", layout="wide")
23
+ st.title("🧠 Multi-Model Resume–JD Match Analyzer")
24
+
25
+ # Inject custom CSS to reduce white space
26
+ st.markdown("""
27
+ <style>
28
+ .block-container {
29
+ padding-top: 3rem; /* instead of 1rem */
30
+ padding-bottom: 1rem;
31
+ }
32
+ .stMarkdown {
33
+ margin-bottom: 0.5rem;
34
+ }
35
+ .logo-container img {
36
+ width: 50px;
37
+ height: auto;
38
+ margin-right: 10px;
39
+ }
40
+ .header-row {
41
+ display: flex;
42
+ align-items: center;
43
+ gap: 1rem;
44
+ margin-top: 1rem; /* Add extra top margin here if needed */
45
+ }
46
+ </style>
47
+ """, unsafe_allow_html=True)
48
+
49
+ # File upload
50
+ resume_file = st.file_uploader("📄 Upload Resume (any file type)", type=None)
51
+ jd_file = st.file_uploader("📝 Upload Job Description (any file type)", type=None)
52
+
53
+ # Function to extract text from uploaded files
54
+ def extract_text(file):
55
+ if file.name.endswith(".pdf"):
56
+ with pdfplumber.open(file) as pdf:
57
+ return "\n".join([page.extract_text() for page in pdf.pages if page.extract_text()])
58
+ else:
59
+ return StringIO(file.read().decode("utf-8")).read()
60
+
61
+
62
+ def extract_candidate_name(resume_text):
63
+ prompt = f"""
64
+ You are an AI assistant specialized in resume analysis.
65
+
66
+ Your task is to get full name of the candidate from the resume.
67
+
68
+ Resume:
69
+ {resume_text}
70
+
71
+ Respond with only the candidate's full name.
72
+ """
73
+ try:
74
+ response = openai.chat.completions.create(
75
+ model="gpt-4o-mini",
76
+ messages=[
77
+ {"role": "system", "content": "You are a professional resume evaluator."},
78
+ {"role": "user", "content": prompt}
79
+ ]
80
+ )
81
+ content = response.choices[0].message.content
82
+
83
+ return content.strip()
84
+
85
+ except Exception as e:
86
+ return "Unknown"
87
+
88
+
89
+ # Function to build the prompt for LLMs
90
+ def build_prompt(resume_text, jd_text):
91
+ prompt = f"""
92
+ You are an AI assistant specialized in resume analysis and recruitment. Analyze the given resume and compare it with the job description.
93
+
94
+ Your task is to evaluate how well the resume aligns with the job description.
95
+
96
+
97
+ Provide a match percentage between 0 and 100, where 100 indicates a perfect fit.
98
+
99
+ Resume:
100
+ {resume_text}
101
+
102
+ Job Description:
103
+ {jd_text}
104
+
105
+ Respond with only the match percentage as an integer.
106
+ """
107
+ return prompt.strip()
108
+
109
+ # Function to get match percentage from OpenAI GPT-4
110
+ def get_openai_match(prompt):
111
+ try:
112
+ response = openai.chat.completions.create(
113
+ model="gpt-4o-mini",
114
+ messages=[
115
+ {"role": "system", "content": "You are a professional resume evaluator."},
116
+ {"role": "user", "content": prompt}
117
+ ]
118
+ )
119
+ content = response.choices[0].message.content
120
+ digits = ''.join(filter(str.isdigit, content))
121
+ return min(int(digits), 100) if digits else 0
122
+ except Exception as e:
123
+ st.error(f"OpenAI API Error: {e}")
124
+ return 0
125
+
126
+ # Function to get match percentage from Anthropic Claude
127
+ def get_anthropic_match(prompt):
128
+ try:
129
+ model_name = "claude-3-7-sonnet-latest"
130
+ claude = Anthropic()
131
+
132
+ message = claude.messages.create(
133
+ model=model_name,
134
+ max_tokens=100,
135
+ messages=[
136
+ {"role": "user", "content": prompt}
137
+ ]
138
+ )
139
+ content = message.content[0].text
140
+ digits = ''.join(filter(str.isdigit, content))
141
+ return min(int(digits), 100) if digits else 0
142
+ except Exception as e:
143
+ st.error(f"Anthropic API Error: {e}")
144
+ return 0
145
+
146
+ # Function to get match percentage from Google Gemini
147
+ def get_google_match(prompt):
148
+ try:
149
+ gemini = OpenAI(api_key=google_api_key, base_url="https://generativelanguage.googleapis.com/v1beta/openai/")
150
+ model_name = "gemini-2.0-flash"
151
+ messages = [{"role": "user", "content": prompt}]
152
+ response = gemini.chat.completions.create(model=model_name, messages=messages)
153
+ content = response.choices[0].message.content
154
+ digits = ''.join(filter(str.isdigit, content))
155
+ return min(int(digits), 100) if digits else 0
156
+ except Exception as e:
157
+ st.error(f"Google Gemini API Error: {e}")
158
+ return 0
159
+
160
+ # Function to get match percentage from Groq
161
+ def get_groq_match(prompt):
162
+ try:
163
+ groq = OpenAI(api_key=groq_api_key, base_url="https://api.groq.com/openai/v1")
164
+ model_name = "llama-3.3-70b-versatile"
165
+ messages = [{"role": "user", "content": prompt}]
166
+ response = groq.chat.completions.create(model=model_name, messages=messages)
167
+ answer = response.choices[0].message.content
168
+ digits = ''.join(filter(str.isdigit, answer))
169
+ return min(int(digits), 100) if digits else 0
170
+ except Exception as e:
171
+ st.error(f"Groq API Error: {e}")
172
+ return 0
173
+
174
+ # Function to get match percentage from DeepSeek
175
+ def get_deepseek_match(prompt):
176
+ try:
177
+ deepseek = OpenAI(api_key=deepseek_api_key, base_url="https://api.deepseek.com/v1")
178
+ model_name = "deepseek-chat"
179
+ messages = [{"role": "user", "content": prompt}]
180
+ response = deepseek.chat.completions.create(model=model_name, messages=messages)
181
+ answer = response.choices[0].message.content
182
+ digits = ''.join(filter(str.isdigit, answer))
183
+ return min(int(digits), 100) if digits else 0
184
+ except Exception as e:
185
+ st.error(f"DeepSeek API Error: {e}")
186
+ return 0
187
+
188
+ # Main action
189
+ if st.button("🔍 Analyze Resume Fit"):
190
+ if resume_file and jd_file:
191
+ with st.spinner("Analyzing..."):
192
+ # resume_text = extract_text(resume_file)
193
+ # jd_text = extract_text(jd_file)
194
+ os.makedirs("temp_files", exist_ok=True)
195
+ resume_path = os.path.join("temp_files", resume_file.name)
196
+
197
+ with open(resume_path, "wb") as f:
198
+ f.write(resume_file.getbuffer())
199
+ resume_docs = load_and_split_resume(resume_path)
200
+ resume_text = "\n".join([doc.page_content for doc in resume_docs])
201
+
202
+ jd_path = os.path.join("temp_files", jd_file.name)
203
+ with open(jd_path, "wb") as f:
204
+ f.write(jd_file.getbuffer())
205
+ jd_docs = load_and_split_resume(jd_path)
206
+ jd_text = "\n".join([doc.page_content for doc in jd_docs])
207
+
208
+ candidate_name = extract_candidate_name(resume_text)
209
+ prompt = build_prompt(resume_text, jd_text)
210
+
211
+ # Get match percentages from all models
212
+ scores = {
213
+ "OpenAI GPT-4o Mini": get_openai_match(prompt),
214
+ "Anthropic Claude": get_anthropic_match(prompt),
215
+ "Google Gemini": get_google_match(prompt),
216
+ "Groq": get_groq_match(prompt),
217
+ "DeepSeek": get_deepseek_match(prompt),
218
+ }
219
+
220
+ # Calculate average score
221
+ average_score = round(sum(scores.values()) / len(scores), 2)
222
+
223
+ # Sort scores in descending order
224
+ sorted_scores = sorted(scores.items(), reverse=False)
225
+
226
+ # Display results
227
+ st.success("✅ Analysis Complete")
228
+ st.subheader("📊 Match Results (Ranked by Model)")
229
+
230
+ # Show candidate name
231
+ st.markdown(f"**👤 Candidate:** {candidate_name}")
232
+
233
+ # Create and sort dataframe
234
+ df = pd.DataFrame(sorted_scores, columns=["Model", "% Match"])
235
+ df = df.sort_values("% Match", ascending=False).reset_index(drop=True)
236
+
237
+ # Convert to HTML table
238
+ def render_custom_table(dataframe):
239
+ table_html = "<table style='border-collapse: collapse; width: auto;'>"
240
+ # Table header
241
+ table_html += "<thead><tr>"
242
+ for col in dataframe.columns:
243
+ table_html += f"<th style='text-align: center; padding: 8px; border-bottom: 1px solid #ddd;'>{col}</th>"
244
+ table_html += "</tr></thead>"
245
+
246
+ # Table rows
247
+ table_html += "<tbody>"
248
+ for _, row in dataframe.iterrows():
249
+ table_html += "<tr>"
250
+ for val in row:
251
+ table_html += f"<td style='text-align: left; padding: 8px; border-bottom: 1px solid #eee;'>{val}</td>"
252
+ table_html += "</tr>"
253
+ table_html += "</tbody></table>"
254
+ return table_html
255
+
256
+ # Display table
257
+ st.markdown(render_custom_table(df), unsafe_allow_html=True)
258
+
259
+ # Show average match
260
+ st.metric(label="📈 Average Match %", value=f"{average_score:.2f}%")
261
+ else:
262
+ st.warning("Please upload both resume and job description.")
community_contributions/app_rate_limiter_mailgun_integration.py ADDED
@@ -0,0 +1,231 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from dotenv import load_dotenv
2
+ from openai import OpenAI
3
+ import json
4
+ import os
5
+ import requests
6
+ from pypdf import PdfReader
7
+ import gradio as gr
8
+ import base64
9
+ import time
10
+ from collections import defaultdict
11
+ import fastapi
12
+ from gradio.context import Context
13
+ import logging
14
+
15
+ logger = logging.getLogger(__name__)
16
+ logger.setLevel(logging.DEBUG)
17
+
18
+
19
+ load_dotenv(override=True)
20
+
21
+ class RateLimiter:
22
+ def __init__(self, max_requests=5, time_window=5):
23
+ # max_requests per time_window seconds
24
+ self.max_requests = max_requests
25
+ self.time_window = time_window # in seconds
26
+ self.request_history = defaultdict(list)
27
+
28
+ def is_rate_limited(self, user_id):
29
+ current_time = time.time()
30
+ # Remove old requests
31
+ self.request_history[user_id] = [
32
+ timestamp for timestamp in self.request_history[user_id]
33
+ if current_time - timestamp < self.time_window
34
+ ]
35
+
36
+ # Check if user has exceeded the limit
37
+ if len(self.request_history[user_id]) >= self.max_requests:
38
+ return True
39
+
40
+ # Add current request
41
+ self.request_history[user_id].append(current_time)
42
+ return False
43
+
44
+ def push(text):
45
+ requests.post(
46
+ "https://api.pushover.net/1/messages.json",
47
+ data={
48
+ "token": os.getenv("PUSHOVER_TOKEN"),
49
+ "user": os.getenv("PUSHOVER_USER"),
50
+ "message": text,
51
+ }
52
+ )
53
+
54
+ def send_email(from_email, name, notes):
55
+ auth = base64.b64encode(f'api:{os.getenv("MAILGUN_API_KEY")}'.encode()).decode()
56
+
57
+ response = requests.post(
58
+ f'https://api.mailgun.net/v3/{os.getenv("MAILGUN_DOMAIN")}/messages',
59
+ headers={
60
+ 'Authorization': f'Basic {auth}'
61
+ },
62
+ data={
63
+ 'from': f'Website Contact <mailgun@{os.getenv("MAILGUN_DOMAIN")}>',
64
+ 'to': os.getenv("MAILGUN_RECIPIENT"),
65
+ 'subject': f'New message from {from_email}',
66
+ 'text': f'Name: {name}\nEmail: {from_email}\nNotes: {notes}',
67
+ 'h:Reply-To': from_email
68
+ }
69
+ )
70
+
71
+ return response.status_code == 200
72
+
73
+
74
+ def record_user_details(email, name="Name not provided", notes="not provided"):
75
+ push(f"Recording {name} with email {email} and notes {notes}")
76
+ # Send email notification
77
+ email_sent = send_email(email, name, notes)
78
+ return {"recorded": "ok", "email_sent": email_sent}
79
+
80
+ def record_unknown_question(question):
81
+ push(f"Recording {question}")
82
+ return {"recorded": "ok"}
83
+
84
+ record_user_details_json = {
85
+ "name": "record_user_details",
86
+ "description": "Use this tool to record that a user is interested in being in touch and provided an email address",
87
+ "parameters": {
88
+ "type": "object",
89
+ "properties": {
90
+ "email": {
91
+ "type": "string",
92
+ "description": "The email address of this user"
93
+ },
94
+ "name": {
95
+ "type": "string",
96
+ "description": "The user's name, if they provided it"
97
+ }
98
+ ,
99
+ "notes": {
100
+ "type": "string",
101
+ "description": "Any additional information about the conversation that's worth recording to give context"
102
+ }
103
+ },
104
+ "required": ["email"],
105
+ "additionalProperties": False
106
+ }
107
+ }
108
+
109
+ record_unknown_question_json = {
110
+ "name": "record_unknown_question",
111
+ "description": "Always use this tool to record any question that couldn't be answered as you didn't know the answer",
112
+ "parameters": {
113
+ "type": "object",
114
+ "properties": {
115
+ "question": {
116
+ "type": "string",
117
+ "description": "The question that couldn't be answered"
118
+ },
119
+ },
120
+ "required": ["question"],
121
+ "additionalProperties": False
122
+ }
123
+ }
124
+
125
+ tools = [{"type": "function", "function": record_user_details_json},
126
+ {"type": "function", "function": record_unknown_question_json}]
127
+
128
+
129
+ class Me:
130
+
131
+ def __init__(self):
132
+ self.openai = OpenAI(api_key=os.getenv("GOOGLE_API_KEY"), base_url="https://generativelanguage.googleapis.com/v1beta/openai/")
133
+ self.name = "Sagarnil Das"
134
+ self.rate_limiter = RateLimiter(max_requests=5, time_window=60) # 5 messages per minute
135
+ reader = PdfReader("me/linkedin.pdf")
136
+ self.linkedin = ""
137
+ for page in reader.pages:
138
+ text = page.extract_text()
139
+ if text:
140
+ self.linkedin += text
141
+ with open("me/summary.txt", "r", encoding="utf-8") as f:
142
+ self.summary = f.read()
143
+
144
+
145
+ def handle_tool_call(self, tool_calls):
146
+ results = []
147
+ for tool_call in tool_calls:
148
+ tool_name = tool_call.function.name
149
+ arguments = json.loads(tool_call.function.arguments)
150
+ print(f"Tool called: {tool_name}", flush=True)
151
+ tool = globals().get(tool_name)
152
+ result = tool(**arguments) if tool else {}
153
+ results.append({"role": "tool","content": json.dumps(result),"tool_call_id": tool_call.id})
154
+ return results
155
+
156
+ def system_prompt(self):
157
+ system_prompt = f"You are acting as {self.name}. You are answering questions on {self.name}'s website, \
158
+ particularly questions related to {self.name}'s career, background, skills and experience. \
159
+ Your responsibility is to represent {self.name} for interactions on the website as faithfully as possible. \
160
+ You are given a summary of {self.name}'s background and LinkedIn profile which you can use to answer questions. \
161
+ Be professional and engaging, as if talking to a potential client or future employer who came across the website. \
162
+ If you don't know the answer to any question, use your record_unknown_question tool to record the question that you couldn't answer, even if it's about something trivial or unrelated to career. \
163
+ If the user is engaging in discussion, try to steer them towards getting in touch via email; ask for their email and record it using your record_user_details tool. \
164
+ When a user provides their email, both a push notification and an email notification will be sent. If the user does not provide any note in the message \
165
+ in which they provide their email, then give a summary of the conversation so far as the notes."
166
+
167
+ system_prompt += f"\n\n## Summary:\n{self.summary}\n\n## LinkedIn Profile:\n{self.linkedin}\n\n"
168
+ system_prompt += f"With this context, please chat with the user, always staying in character as {self.name}."
169
+ return system_prompt
170
+
171
+ def chat(self, message, history):
172
+ # Get the client IP from Gradio's request context
173
+ try:
174
+ # Try to get the real client IP from request headers
175
+ request = Context.get_context().request
176
+ # Check for X-Forwarded-For header (common in reverse proxies like HF Spaces)
177
+ forwarded_for = request.headers.get("X-Forwarded-For")
178
+ # Check for Cf-Connecting-IP header (Cloudflare)
179
+ cloudflare_ip = request.headers.get("Cf-Connecting-IP")
180
+
181
+ if forwarded_for:
182
+ # X-Forwarded-For contains a comma-separated list of IPs, the first one is the client
183
+ user_id = forwarded_for.split(",")[0].strip()
184
+ elif cloudflare_ip:
185
+ user_id = cloudflare_ip
186
+ else:
187
+ # Fall back to direct client address
188
+ user_id = request.client.host
189
+ except (AttributeError, RuntimeError, fastapi.exceptions.FastAPIError):
190
+ # Fallback if we can't get context or if running outside of FastAPI
191
+ user_id = "default_user"
192
+ logger.debug(f"User ID: {user_id}")
193
+ if self.rate_limiter.is_rate_limited(user_id):
194
+ return "You're sending messages too quickly. Please wait a moment before sending another message."
195
+
196
+ messages = [{"role": "system", "content": self.system_prompt()}]
197
+
198
+ # Check if history is a list of dicts (Gradio "messages" format)
199
+ if isinstance(history, list) and all(isinstance(h, dict) for h in history):
200
+ messages.extend(history)
201
+ else:
202
+ # Assume it's a list of [user_msg, assistant_msg] pairs
203
+ for user_msg, assistant_msg in history:
204
+ messages.append({"role": "user", "content": user_msg})
205
+ messages.append({"role": "assistant", "content": assistant_msg})
206
+
207
+ messages.append({"role": "user", "content": message})
208
+
209
+ done = False
210
+ while not done:
211
+ response = self.openai.chat.completions.create(
212
+ model="gemini-2.0-flash",
213
+ messages=messages,
214
+ tools=tools
215
+ )
216
+ if response.choices[0].finish_reason == "tool_calls":
217
+ tool_calls = response.choices[0].message.tool_calls
218
+ tool_result = self.handle_tool_call(tool_calls)
219
+ messages.append(response.choices[0].message)
220
+ messages.extend(tool_result)
221
+ else:
222
+ done = True
223
+
224
+ return response.choices[0].message.content
225
+
226
+
227
+
228
+ if __name__ == "__main__":
229
+ me = Me()
230
+ gr.ChatInterface(me.chat, type="messages").launch()
231
+
community_contributions/community.ipynb ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# Community contributions\n",
8
+ "\n",
9
+ "Thank you for considering contributing your work to the repo!\n",
10
+ "\n",
11
+ "Please add your code (modules or notebooks) to this directory and send me a PR, per the instructions in the guides.\n",
12
+ "\n",
13
+ "I'd love to share your progress with other students, so everyone can benefit from your projects.\n"
14
+ ]
15
+ },
16
+ {
17
+ "cell_type": "markdown",
18
+ "metadata": {},
19
+ "source": []
20
+ }
21
+ ],
22
+ "metadata": {
23
+ "language_info": {
24
+ "name": "python"
25
+ }
26
+ },
27
+ "nbformat": 4,
28
+ "nbformat_minor": 2
29
+ }
community_contributions/gemini_based_chatbot/.env.example ADDED
@@ -0,0 +1 @@
 
 
1
+ GOOGLE_API_KEY="YOUR_API_KEY"
community_contributions/gemini_based_chatbot/.gitignore ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # Virtual environment
7
+ venv/
8
+ env/
9
+ .venv/
10
+
11
+ # Jupyter notebook checkpoints
12
+ .ipynb_checkpoints/
13
+
14
+ # Environment variable files
15
+ .env
16
+
17
+ # Mac/OSX system files
18
+ .DS_Store
19
+
20
+ # PyCharm/VSCode config
21
+ .idea/
22
+ .vscode/
23
+
24
+ # PDFs and summaries
25
+ # Profile.pdf
26
+ # summary.txt
27
+
28
+ # Node modules (if any)
29
+ node_modules/
30
+
31
+ # Other temporary files
32
+ *.log
community_contributions/gemini_based_chatbot/Profile.pdf ADDED
Binary file (51.4 kB). View file
 
community_contributions/gemini_based_chatbot/README.md ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ # Gemini Chatbot of Users (Me)
3
+
4
+ A simple AI chatbot that represents **Rishabh Dubey** by leveraging Google Gemini API, Gradio for UI, and context from **summary.txt** and **Profile.pdf**.
5
+
6
+ ## Screenshots
7
+ ![image](https://github.com/user-attachments/assets/c6d417df-aa6a-482e-9289-eeb8e9e0f3d2)
8
+
9
+
10
+ ## Features
11
+ - Loads background and profile data to answer questions in character.
12
+ - Uses Google Gemini for natural language responses.
13
+ - Runs in Gradio interface for easy web deployment.
14
+
15
+ ## Requirements
16
+ - Python 3.10+
17
+ - API key for Google Gemini stored in `.env` file as `GOOGLE_API_KEY`.
18
+
19
+ ## Installation
20
+
21
+ 1. Clone this repo:
22
+
23
+ ```bash
24
+ https://github.com/rishabh3562/Agentic-chatbot-me.git
25
+ ```
26
+
27
+ 2. Create a virtual environment:
28
+
29
+ ```bash
30
+ python -m venv venv
31
+ source venv/bin/activate # On Windows: venv\Scripts\activate
32
+ ```
33
+
34
+ 3. Install dependencies:
35
+
36
+ ```bash
37
+ pip install -r requirements.txt
38
+ ```
39
+
40
+ 4. Add your API key in a `.env` file:
41
+
42
+ ```
43
+ GOOGLE_API_KEY=<your-api-key>
44
+ ```
45
+
46
+
47
+ ## Usage
48
+
49
+ Run locally:
50
+
51
+ ```bash
52
+ python app.py
53
+ ```
54
+
55
+ The app will launch a Gradio interface at `http://127.0.0.1:7860`.
56
+
57
+ ## Deployment
58
+
59
+ This app can be deployed on:
60
+
61
+ * **Render** or **Hugging Face Spaces**
62
+ Make sure `.env` and static files (`summary.txt`, `Profile.pdf`) are included.
63
+
64
+ ---
65
+
66
+ **Note:**
67
+
68
+ * Make sure you have `summary.txt` and `Profile.pdf` in the root directory.
69
+ * Update `requirements.txt` with `python-dotenv` if not already present.
70
+
71
+ ---
72
+
73
+
74
+
community_contributions/gemini_based_chatbot/app.py ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import google.generativeai as genai
3
+ from google.generativeai import GenerativeModel
4
+ import gradio as gr
5
+ from dotenv import load_dotenv
6
+ from PyPDF2 import PdfReader
7
+
8
+ # Load environment variables
9
+ load_dotenv()
10
+ api_key = os.environ.get('GOOGLE_API_KEY')
11
+
12
+ # Configure Gemini
13
+ genai.configure(api_key=api_key)
14
+ model = GenerativeModel("gemini-1.5-flash")
15
+
16
+ # Load profile data
17
+ with open("summary.txt", "r", encoding="utf-8") as f:
18
+ summary = f.read()
19
+
20
+ reader = PdfReader("Profile.pdf")
21
+ linkedin = ""
22
+ for page in reader.pages:
23
+ text = page.extract_text()
24
+ if text:
25
+ linkedin += text
26
+
27
+ # System prompt
28
+ name = "Rishabh Dubey"
29
+ system_prompt = f"""
30
+ You are acting as {name}. You are answering questions on {name}'s website,
31
+ particularly questions related to {name}'s career, background, skills and experience.
32
+ Your responsibility is to represent {name} for interactions on the website as faithfully as possible.
33
+ You are given a summary of {name}'s background and LinkedIn profile which you can use to answer questions.
34
+ Be professional and engaging, as if talking to a potential client or future employer who came across the website.
35
+ If you don't know the answer, say so.
36
+
37
+ ## Summary:
38
+ {summary}
39
+
40
+ ## LinkedIn Profile:
41
+ {linkedin}
42
+
43
+ With this context, please chat with the user, always staying in character as {name}.
44
+ """
45
+
46
+ def chat(message, history):
47
+ conversation = f"System: {system_prompt}\n"
48
+ for user_msg, bot_msg in history:
49
+ conversation += f"User: {user_msg}\nAssistant: {bot_msg}\n"
50
+ conversation += f"User: {message}\nAssistant:"
51
+
52
+ response = model.generate_content([conversation])
53
+ return response.text
54
+
55
+ if __name__ == "__main__":
56
+ # Make sure to bind to the port Render sets (default: 10000) for Render deployment
57
+ port = int(os.environ.get("PORT", 10000))
58
+ gr.ChatInterface(chat, chatbot=gr.Chatbot()).launch(server_name="0.0.0.0", server_port=port)
community_contributions/gemini_based_chatbot/gemini_chatbot_of_me.ipynb ADDED
@@ -0,0 +1,541 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 25,
6
+ "id": "ae0bec14",
7
+ "metadata": {},
8
+ "outputs": [
9
+ {
10
+ "name": "stdout",
11
+ "output_type": "stream",
12
+ "text": [
13
+ "Requirement already satisfied: google-generativeai in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (0.8.4)\n",
14
+ "Requirement already satisfied: OpenAI in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (1.82.0)\n",
15
+ "Requirement already satisfied: pypdf in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (5.5.0)\n",
16
+ "Requirement already satisfied: gradio in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (5.31.0)\n",
17
+ "Requirement already satisfied: PyPDF2 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (3.0.1)\n",
18
+ "Requirement already satisfied: markdown in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (3.8)\n",
19
+ "Requirement already satisfied: google-ai-generativelanguage==0.6.15 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-generativeai) (0.6.15)\n",
20
+ "Requirement already satisfied: google-api-core in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-generativeai) (2.24.1)\n",
21
+ "Requirement already satisfied: google-api-python-client in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-generativeai) (2.162.0)\n",
22
+ "Requirement already satisfied: google-auth>=2.15.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-generativeai) (2.38.0)\n",
23
+ "Requirement already satisfied: protobuf in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-generativeai) (5.29.3)\n",
24
+ "Requirement already satisfied: pydantic in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-generativeai) (2.10.6)\n",
25
+ "Requirement already satisfied: tqdm in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-generativeai) (4.67.1)\n",
26
+ "Requirement already satisfied: typing-extensions in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-generativeai) (4.12.2)\n",
27
+ "Requirement already satisfied: proto-plus<2.0.0dev,>=1.22.3 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-ai-generativelanguage==0.6.15->google-generativeai) (1.26.0)\n",
28
+ "Requirement already satisfied: anyio<5,>=3.5.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from OpenAI) (4.2.0)\n",
29
+ "Requirement already satisfied: distro<2,>=1.7.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from OpenAI) (1.9.0)\n",
30
+ "Requirement already satisfied: httpx<1,>=0.23.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from OpenAI) (0.28.1)\n",
31
+ "Requirement already satisfied: jiter<1,>=0.4.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from OpenAI) (0.10.0)\n",
32
+ "Requirement already satisfied: sniffio in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from OpenAI) (1.3.0)\n",
33
+ "Requirement already satisfied: aiofiles<25.0,>=22.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (24.1.0)\n",
34
+ "Requirement already satisfied: fastapi<1.0,>=0.115.2 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (0.115.12)\n",
35
+ "Requirement already satisfied: ffmpy in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (0.5.0)\n",
36
+ "Requirement already satisfied: gradio-client==1.10.1 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (1.10.1)\n",
37
+ "Requirement already satisfied: groovy~=0.1 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (0.1.2)\n",
38
+ "Requirement already satisfied: huggingface-hub>=0.28.1 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (0.32.0)\n",
39
+ "Requirement already satisfied: jinja2<4.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (3.1.6)\n",
40
+ "Requirement already satisfied: markupsafe<4.0,>=2.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (2.1.3)\n",
41
+ "Requirement already satisfied: numpy<3.0,>=1.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (1.26.4)\n",
42
+ "Requirement already satisfied: orjson~=3.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (3.10.18)\n",
43
+ "Requirement already satisfied: packaging in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (23.2)\n",
44
+ "Requirement already satisfied: pandas<3.0,>=1.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (2.1.4)\n",
45
+ "Requirement already satisfied: pillow<12.0,>=8.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (10.2.0)\n",
46
+ "Requirement already satisfied: pydub in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (0.25.1)\n",
47
+ "Requirement already satisfied: python-multipart>=0.0.18 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (0.0.20)\n",
48
+ "Requirement already satisfied: pyyaml<7.0,>=5.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (6.0.1)\n",
49
+ "Requirement already satisfied: ruff>=0.9.3 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (0.11.11)\n",
50
+ "Requirement already satisfied: safehttpx<0.2.0,>=0.1.6 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (0.1.6)\n",
51
+ "Requirement already satisfied: semantic-version~=2.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (2.10.0)\n",
52
+ "Requirement already satisfied: starlette<1.0,>=0.40.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (0.46.2)\n",
53
+ "Requirement already satisfied: tomlkit<0.14.0,>=0.12.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (0.13.2)\n",
54
+ "Requirement already satisfied: typer<1.0,>=0.12 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (0.15.3)\n",
55
+ "Requirement already satisfied: uvicorn>=0.14.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio) (0.34.2)\n",
56
+ "Requirement already satisfied: fsspec in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio-client==1.10.1->gradio) (2025.5.0)\n",
57
+ "Requirement already satisfied: websockets<16.0,>=10.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from gradio-client==1.10.1->gradio) (15.0.1)\n",
58
+ "Requirement already satisfied: idna>=2.8 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from anyio<5,>=3.5.0->OpenAI) (3.6)\n",
59
+ "Requirement already satisfied: googleapis-common-protos<2.0.dev0,>=1.56.2 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-api-core->google-generativeai) (1.68.0)\n",
60
+ "Requirement already satisfied: requests<3.0.0.dev0,>=2.18.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-api-core->google-generativeai) (2.31.0)\n",
61
+ "Requirement already satisfied: cachetools<6.0,>=2.0.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-auth>=2.15.0->google-generativeai) (5.5.2)\n",
62
+ "Requirement already satisfied: pyasn1-modules>=0.2.1 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-auth>=2.15.0->google-generativeai) (0.4.1)\n",
63
+ "Requirement already satisfied: rsa<5,>=3.1.4 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-auth>=2.15.0->google-generativeai) (4.9)\n",
64
+ "Requirement already satisfied: certifi in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from httpx<1,>=0.23.0->OpenAI) (2023.11.17)\n",
65
+ "Requirement already satisfied: httpcore==1.* in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from httpx<1,>=0.23.0->OpenAI) (1.0.9)\n",
66
+ "Requirement already satisfied: h11>=0.16 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from httpcore==1.*->httpx<1,>=0.23.0->OpenAI) (0.16.0)\n",
67
+ "Requirement already satisfied: filelock in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from huggingface-hub>=0.28.1->gradio) (3.17.0)\n",
68
+ "Requirement already satisfied: python-dateutil>=2.8.2 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from pandas<3.0,>=1.0->gradio) (2.8.2)\n",
69
+ "Requirement already satisfied: pytz>=2020.1 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from pandas<3.0,>=1.0->gradio) (2023.3.post1)\n",
70
+ "Requirement already satisfied: tzdata>=2022.1 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from pandas<3.0,>=1.0->gradio) (2023.4)\n",
71
+ "Requirement already satisfied: annotated-types>=0.6.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from pydantic->google-generativeai) (0.7.0)\n",
72
+ "Requirement already satisfied: pydantic-core==2.27.2 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from pydantic->google-generativeai) (2.27.2)\n",
73
+ "Requirement already satisfied: colorama in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from tqdm->google-generativeai) (0.4.6)\n",
74
+ "Requirement already satisfied: click>=8.0.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from typer<1.0,>=0.12->gradio) (8.1.8)\n",
75
+ "Requirement already satisfied: shellingham>=1.3.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from typer<1.0,>=0.12->gradio) (1.5.4)\n",
76
+ "Requirement already satisfied: rich>=10.11.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from typer<1.0,>=0.12->gradio) (14.0.0)\n",
77
+ "Requirement already satisfied: httplib2<1.dev0,>=0.19.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-api-python-client->google-generativeai) (0.22.0)\n",
78
+ "Requirement already satisfied: google-auth-httplib2<1.0.0,>=0.2.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-api-python-client->google-generativeai) (0.2.0)\n",
79
+ "Requirement already satisfied: uritemplate<5,>=3.0.1 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-api-python-client->google-generativeai) (4.1.1)\n",
80
+ "Requirement already satisfied: grpcio<2.0dev,>=1.33.2 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-api-core[grpc]!=2.0.*,!=2.1.*,!=2.10.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,<3.0.0dev,>=1.34.1->google-ai-generativelanguage==0.6.15->google-generativeai) (1.71.0rc2)\n",
81
+ "Requirement already satisfied: grpcio-status<2.0.dev0,>=1.33.2 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from google-api-core[grpc]!=2.0.*,!=2.1.*,!=2.10.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,<3.0.0dev,>=1.34.1->google-ai-generativelanguage==0.6.15->google-generativeai) (1.71.0rc2)\n",
82
+ "Requirement already satisfied: pyparsing!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3,<4,>=2.4.2 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from httplib2<1.dev0,>=0.19.0->google-api-python-client->google-generativeai) (3.1.1)\n",
83
+ "Requirement already satisfied: pyasn1<0.7.0,>=0.4.6 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from pyasn1-modules>=0.2.1->google-auth>=2.15.0->google-generativeai) (0.6.1)\n",
84
+ "Requirement already satisfied: six>=1.5 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from python-dateutil>=2.8.2->pandas<3.0,>=1.0->gradio) (1.16.0)\n",
85
+ "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from requests<3.0.0.dev0,>=2.18.0->google-api-core->google-generativeai) (3.3.2)\n",
86
+ "Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from requests<3.0.0.dev0,>=2.18.0->google-api-core->google-generativeai) (2.1.0)\n",
87
+ "Requirement already satisfied: markdown-it-py>=2.2.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from rich>=10.11.0->typer<1.0,>=0.12->gradio) (3.0.0)\n",
88
+ "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from rich>=10.11.0->typer<1.0,>=0.12->gradio) (2.17.2)\n",
89
+ "Requirement already satisfied: mdurl~=0.1 in c:\\users\\risha\\appdata\\local\\programs\\python\\python312\\lib\\site-packages (from markdown-it-py>=2.2.0->rich>=10.11.0->typer<1.0,>=0.12->gradio) (0.1.2)\n",
90
+ "Note: you may need to restart the kernel to use updated packages.\n"
91
+ ]
92
+ },
93
+ {
94
+ "name": "stderr",
95
+ "output_type": "stream",
96
+ "text": [
97
+ "\n",
98
+ "[notice] A new release of pip is available: 25.0 -> 25.1.1\n",
99
+ "[notice] To update, run: python.exe -m pip install --upgrade pip\n"
100
+ ]
101
+ }
102
+ ],
103
+ "source": [
104
+ "%pip install google-generativeai OpenAI pypdf gradio PyPDF2 markdown"
105
+ ]
106
+ },
107
+ {
108
+ "cell_type": "code",
109
+ "execution_count": 71,
110
+ "id": "fd2098ed",
111
+ "metadata": {},
112
+ "outputs": [],
113
+ "source": [
114
+ "import os\n",
115
+ "import google.generativeai as genai\n",
116
+ "from google.generativeai import GenerativeModel\n",
117
+ "from pypdf import PdfReader\n",
118
+ "import gradio as gr\n",
119
+ "from dotenv import load_dotenv\n",
120
+ "from markdown import markdown\n",
121
+ "\n"
122
+ ]
123
+ },
124
+ {
125
+ "cell_type": "code",
126
+ "execution_count": 72,
127
+ "id": "6464f7d9",
128
+ "metadata": {},
129
+ "outputs": [
130
+ {
131
+ "name": "stdout",
132
+ "output_type": "stream",
133
+ "text": [
134
+ "api_key loaded , starting with: AIz\n"
135
+ ]
136
+ }
137
+ ],
138
+ "source": [
139
+ "load_dotenv(override=True)\n",
140
+ "api_key=os.environ['GOOGLE_API_KEY']\n",
141
+ "print(f\"api_key loaded , starting with: {api_key[:3]}\")\n",
142
+ "\n",
143
+ "genai.configure(api_key=api_key)\n",
144
+ "model = GenerativeModel(\"gemini-1.5-flash\")"
145
+ ]
146
+ },
147
+ {
148
+ "cell_type": "code",
149
+ "execution_count": 73,
150
+ "id": "b0541a87",
151
+ "metadata": {},
152
+ "outputs": [],
153
+ "source": [
154
+ "from bs4 import BeautifulSoup\n",
155
+ "\n",
156
+ "def prettify_gemini_response(response):\n",
157
+ " # Parse HTML\n",
158
+ " soup = BeautifulSoup(response, \"html.parser\")\n",
159
+ " # Extract plain text\n",
160
+ " plain_text = soup.get_text(separator=\"\\n\")\n",
161
+ " # Clean up extra newlines\n",
162
+ " pretty_text = \"\\n\".join([line.strip() for line in plain_text.split(\"\\n\") if line.strip()])\n",
163
+ " return pretty_text\n",
164
+ "\n",
165
+ "# Usage\n",
166
+ "# pretty_response = prettify_gemini_response(response.text)\n",
167
+ "# display(pretty_response)\n"
168
+ ]
169
+ },
170
+ {
171
+ "cell_type": "code",
172
+ "execution_count": null,
173
+ "id": "9fa00c43",
174
+ "metadata": {},
175
+ "outputs": [],
176
+ "source": []
177
+ },
178
+ {
179
+ "cell_type": "code",
180
+ "execution_count": 74,
181
+ "id": "b303e991",
182
+ "metadata": {},
183
+ "outputs": [],
184
+ "source": [
185
+ "from PyPDF2 import PdfReader\n",
186
+ "\n",
187
+ "reader = PdfReader(\"Profile.pdf\")\n",
188
+ "\n",
189
+ "linkedin = \"\"\n",
190
+ "for page in reader.pages:\n",
191
+ " text = page.extract_text()\n",
192
+ " if text:\n",
193
+ " linkedin += text\n"
194
+ ]
195
+ },
196
+ {
197
+ "cell_type": "code",
198
+ "execution_count": 75,
199
+ "id": "587af4d6",
200
+ "metadata": {},
201
+ "outputs": [
202
+ {
203
+ "name": "stdout",
204
+ "output_type": "stream",
205
+ "text": [
206
+ "   \n",
207
+ "Contact\n",
208
+ "dubeyrishabh108@gmail.com\n",
209
+ "www.linkedin.com/in/rishabh108\n",
210
+ "(LinkedIn)\n",
211
+ "read.cv/rishabh108 (Other)\n",
212
+ "github.com/rishabh3562 (Other)\n",
213
+ "Top Skills\n",
214
+ "Big Data\n",
215
+ "CRISP-DM\n",
216
+ "Data Science\n",
217
+ "Languages\n",
218
+ "English (Professional Working)\n",
219
+ "Hindi (Native or Bilingual)\n",
220
+ "Certifications\n",
221
+ "Data Science Methodology\n",
222
+ "Create and Manage Cloud\n",
223
+ "Resources\n",
224
+ "Python Project for Data Science\n",
225
+ "Level 3: GenAI\n",
226
+ "Perform Foundational Data, ML, and\n",
227
+ "AI Tasks in Google CloudRishabh Dubey\n",
228
+ "Full Stack Developer | Freelancer | App Developer\n",
229
+ "Greater Jabalpur Area\n",
230
+ "Summary\n",
231
+ "Hi! I’m a final-year student at Gyan Ganga Institute of Technology\n",
232
+ "and Sciences. I enjoy building web applications that are both\n",
233
+ "functional and user-friendly.\n",
234
+ "I’m always looking to learn something new, whether it’s tackling\n",
235
+ "problems on LeetCode or exploring new concepts. I prefer keeping\n",
236
+ "things simple, both in code and in life, and I believe small details\n",
237
+ "make a big difference.\n",
238
+ "When I’m not coding, I love meeting new people and collaborating to\n",
239
+ "bring projects to life. Feel free to reach out if you’d like to connect or\n",
240
+ "chat!\n",
241
+ "Experience\n",
242
+ "Udyam (E-Cell ) ,GGITS\n",
243
+ "2 years 1 month\n",
244
+ "Technical Team Lead\n",
245
+ "September 2023 - August 2024  (1 year)\n",
246
+ "Jabalpur, Madhya Pradesh, India\n",
247
+ "Technical Team Member\n",
248
+ "August 2022 - September 2023  (1 year 2 months)\n",
249
+ "Jabalpur, Madhya Pradesh, India\n",
250
+ "Worked as Technical Team Member\n",
251
+ "Innogative\n",
252
+ "Mobile Application Developer\n",
253
+ "May 2023 - June 2023  (2 months)\n",
254
+ "Jabalpur, Madhya Pradesh, India\n",
255
+ "Gyan Ganga Institute of Technology Sciences\n",
256
+ "Technical Team Member\n",
257
+ "October 2022 - December 2022  (3 months)\n",
258
+ "  Page 1 of 2   \n",
259
+ "Jabalpur, Madhya Pradesh, India\n",
260
+ "As an Ex-Technical Team Member at Webmasters, I played a pivotal role in\n",
261
+ "managing and maintaining our college's website. During my tenure, I actively\n",
262
+ "contributed to the enhancement and upkeep of the site, ensuring it remained\n",
263
+ "a valuable resource for students and faculty alike. Notably, I had the privilege\n",
264
+ "of being part of the team responsible for updating the website during the\n",
265
+ "NBA accreditation process, which sharpened my web development skills and\n",
266
+ "deepened my understanding of delivering accurate and timely information\n",
267
+ "online.\n",
268
+ "In addition to my responsibilities for the college website, I frequently took\n",
269
+ "the initiative to update the website of the Electronics and Communication\n",
270
+ "Engineering (ECE) department. This experience not only showcased my\n",
271
+ "dedication to maintaining a dynamic online presence for the department but\n",
272
+ "also allowed me to hone my web development expertise in a specialized\n",
273
+ "academic context. My time with Webmasters was not only a valuable learning\n",
274
+ "opportunity but also a chance to make a positive impact on our college\n",
275
+ "community through efficient web management.\n",
276
+ "Education\n",
277
+ "Gyan Ganga Institute of Technology Sciences\n",
278
+ "Bachelor of Technology - BTech, Computer Science and\n",
279
+ "Engineering  · (October 2021 - November 2025)\n",
280
+ "Gyan Ganga Institute of Technology Sciences\n",
281
+ "Bachelor of Technology - BTech, Computer Science  · (November 2021 - July\n",
282
+ "2025)\n",
283
+ "Kendriya vidyalaya \n",
284
+ "  Page 2 of 2\n"
285
+ ]
286
+ }
287
+ ],
288
+ "source": [
289
+ "print(linkedin)"
290
+ ]
291
+ },
292
+ {
293
+ "cell_type": "code",
294
+ "execution_count": 76,
295
+ "id": "4baa4939",
296
+ "metadata": {},
297
+ "outputs": [],
298
+ "source": [
299
+ "with open(\"summary.txt\", \"r\", encoding=\"utf-8\") as f:\n",
300
+ " summary = f.read()"
301
+ ]
302
+ },
303
+ {
304
+ "cell_type": "code",
305
+ "execution_count": 77,
306
+ "id": "015961e0",
307
+ "metadata": {},
308
+ "outputs": [],
309
+ "source": [
310
+ "name = \"Rishabh Dubey\""
311
+ ]
312
+ },
313
+ {
314
+ "cell_type": "code",
315
+ "execution_count": 78,
316
+ "id": "d35e646f",
317
+ "metadata": {},
318
+ "outputs": [],
319
+ "source": [
320
+ "system_prompt = f\"You are acting as {name}. You are answering questions on {name}'s website, \\\n",
321
+ "particularly questions related to {name}'s career, background, skills and experience. \\\n",
322
+ "Your responsibility is to represent {name} for interactions on the website as faithfully as possible. \\\n",
323
+ "You are given a summary of {name}'s background and LinkedIn profile which you can use to answer questions. \\\n",
324
+ "Be professional and engaging, as if talking to a potential client or future employer who came across the website. \\\n",
325
+ "If you don't know the answer, say so.\"\n",
326
+ "\n",
327
+ "system_prompt += f\"\\n\\n## Summary:\\n{summary}\\n\\n## LinkedIn Profile:\\n{linkedin}\\n\\n\"\n",
328
+ "system_prompt += f\"With this context, please chat with the user, always staying in character as {name}.\"\n"
329
+ ]
330
+ },
331
+ {
332
+ "cell_type": "code",
333
+ "execution_count": 79,
334
+ "id": "36a50e3e",
335
+ "metadata": {},
336
+ "outputs": [
337
+ {
338
+ "name": "stdout",
339
+ "output_type": "stream",
340
+ "text": [
341
+ "You are acting as Rishabh Dubey. You are answering questions on Rishabh Dubey's website, particularly questions related to Rishabh Dubey's career, background, skills and experience. Your responsibility is to represent Rishabh Dubey for interactions on the website as faithfully as possible. You are given a summary of Rishabh Dubey's background and LinkedIn profile which you can use to answer questions. Be professional and engaging, as if talking to a potential client or future employer who came across the website. If you don't know the answer, say so.\n",
342
+ "\n",
343
+ "## Summary:\n",
344
+ "My name is Rishabh Dubey.\n",
345
+ "I’m a computer science Engineer and i am based India, and a dedicated MERN stack developer.\n",
346
+ "I prioritize concise, precise communication and actionable insights.\n",
347
+ "I’m deeply interested in programming, web development, and data structures & algorithms (DSA).\n",
348
+ "Efficiency is everything for me – I like direct answers without unnecessary fluff.\n",
349
+ "I’m a vegetarian and enjoy mild Indian food, avoiding seafood and spicy dishes.\n",
350
+ "I prefer structured responses, like using tables when needed, and I don’t like chit-chat.\n",
351
+ "My focus is on learning quickly, expanding my skills, and acquiring impactful knowledge\n",
352
+ "\n",
353
+ "## LinkedIn Profile:\n",
354
+ "   \n",
355
+ "Contact\n",
356
+ "dubeyrishabh108@gmail.com\n",
357
+ "www.linkedin.com/in/rishabh108\n",
358
+ "(LinkedIn)\n",
359
+ "read.cv/rishabh108 (Other)\n",
360
+ "github.com/rishabh3562 (Other)\n",
361
+ "Top Skills\n",
362
+ "Big Data\n",
363
+ "CRISP-DM\n",
364
+ "Data Science\n",
365
+ "Languages\n",
366
+ "English (Professional Working)\n",
367
+ "Hindi (Native or Bilingual)\n",
368
+ "Certifications\n",
369
+ "Data Science Methodology\n",
370
+ "Create and Manage Cloud\n",
371
+ "Resources\n",
372
+ "Python Project for Data Science\n",
373
+ "Level 3: GenAI\n",
374
+ "Perform Foundational Data, ML, and\n",
375
+ "AI Tasks in Google CloudRishabh Dubey\n",
376
+ "Full Stack Developer | Freelancer | App Developer\n",
377
+ "Greater Jabalpur Area\n",
378
+ "Summary\n",
379
+ "Hi! I’m a final-year student at Gyan Ganga Institute of Technology\n",
380
+ "and Sciences. I enjoy building web applications that are both\n",
381
+ "functional and user-friendly.\n",
382
+ "I’m always looking to learn something new, whether it’s tackling\n",
383
+ "problems on LeetCode or exploring new concepts. I prefer keeping\n",
384
+ "things simple, both in code and in life, and I believe small details\n",
385
+ "make a big difference.\n",
386
+ "When I’m not coding, I love meeting new people and collaborating to\n",
387
+ "bring projects to life. Feel free to reach out if you’d like to connect or\n",
388
+ "chat!\n",
389
+ "Experience\n",
390
+ "Udyam (E-Cell ) ,GGITS\n",
391
+ "2 years 1 month\n",
392
+ "Technical Team Lead\n",
393
+ "September 2023 - August 2024  (1 year)\n",
394
+ "Jabalpur, Madhya Pradesh, India\n",
395
+ "Technical Team Member\n",
396
+ "August 2022 - September 2023  (1 year 2 months)\n",
397
+ "Jabalpur, Madhya Pradesh, India\n",
398
+ "Worked as Technical Team Member\n",
399
+ "Innogative\n",
400
+ "Mobile Application Developer\n",
401
+ "May 2023 - June 2023  (2 months)\n",
402
+ "Jabalpur, Madhya Pradesh, India\n",
403
+ "Gyan Ganga Institute of Technology Sciences\n",
404
+ "Technical Team Member\n",
405
+ "October 2022 - December 2022  (3 months)\n",
406
+ "  Page 1 of 2   \n",
407
+ "Jabalpur, Madhya Pradesh, India\n",
408
+ "As an Ex-Technical Team Member at Webmasters, I played a pivotal role in\n",
409
+ "managing and maintaining our college's website. During my tenure, I actively\n",
410
+ "contributed to the enhancement and upkeep of the site, ensuring it remained\n",
411
+ "a valuable resource for students and faculty alike. Notably, I had the privilege\n",
412
+ "of being part of the team responsible for updating the website during the\n",
413
+ "NBA accreditation process, which sharpened my web development skills and\n",
414
+ "deepened my understanding of delivering accurate and timely information\n",
415
+ "online.\n",
416
+ "In addition to my responsibilities for the college website, I frequently took\n",
417
+ "the initiative to update the website of the Electronics and Communication\n",
418
+ "Engineering (ECE) department. This experience not only showcased my\n",
419
+ "dedication to maintaining a dynamic online presence for the department but\n",
420
+ "also allowed me to hone my web development expertise in a specialized\n",
421
+ "academic context. My time with Webmasters was not only a valuable learning\n",
422
+ "opportunity but also a chance to make a positive impact on our college\n",
423
+ "community through efficient web management.\n",
424
+ "Education\n",
425
+ "Gyan Ganga Institute of Technology Sciences\n",
426
+ "Bachelor of Technology - BTech, Computer Science and\n",
427
+ "Engineering  · (October 2021 - November 2025)\n",
428
+ "Gyan Ganga Institute of Technology Sciences\n",
429
+ "Bachelor of Technology - BTech, Computer Science  · (November 2021 - July\n",
430
+ "2025)\n",
431
+ "Kendriya vidyalaya \n",
432
+ "  Page 2 of 2\n",
433
+ "\n",
434
+ "With this context, please chat with the user, always staying in character as Rishabh Dubey.\n"
435
+ ]
436
+ }
437
+ ],
438
+ "source": [
439
+ "print(system_prompt)"
440
+ ]
441
+ },
442
+ {
443
+ "cell_type": "code",
444
+ "execution_count": 80,
445
+ "id": "a42af21d",
446
+ "metadata": {},
447
+ "outputs": [],
448
+ "source": [
449
+ "\n",
450
+ "\n",
451
+ "# Chat function for Gradio\n",
452
+ "def chat(message, history):\n",
453
+ " # Gemini needs full context manually\n",
454
+ " conversation = f\"System: {system_prompt}\\n\"\n",
455
+ " for user_msg, bot_msg in history:\n",
456
+ " conversation += f\"User: {user_msg}\\nAssistant: {bot_msg}\\n\"\n",
457
+ " conversation += f\"User: {message}\\nAssistant:\"\n",
458
+ "\n",
459
+ " # Create a Gemini model instance\n",
460
+ " model = genai.GenerativeModel(\"gemini-1.5-flash-latest\")\n",
461
+ " \n",
462
+ " # Generate response\n",
463
+ " response = model.generate_content([conversation])\n",
464
+ "\n",
465
+ " return response.text\n",
466
+ "\n",
467
+ "\n"
468
+ ]
469
+ },
470
+ {
471
+ "cell_type": "code",
472
+ "execution_count": 81,
473
+ "id": "07450de3",
474
+ "metadata": {},
475
+ "outputs": [
476
+ {
477
+ "name": "stderr",
478
+ "output_type": "stream",
479
+ "text": [
480
+ "C:\\Users\\risha\\AppData\\Local\\Temp\\ipykernel_25312\\2999439001.py:1: UserWarning: You have not specified a value for the `type` parameter. Defaulting to the 'tuples' format for chatbot messages, but this is deprecated and will be removed in a future version of Gradio. Please set type='messages' instead, which uses openai-style dictionaries with 'role' and 'content' keys.\n",
481
+ " gr.ChatInterface(chat, chatbot=gr.Chatbot()).launch()\n",
482
+ "c:\\Users\\risha\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\gradio\\chat_interface.py:322: UserWarning: The gr.ChatInterface was not provided with a type, so the type of the gr.Chatbot, 'tuples', will be used.\n",
483
+ " warnings.warn(\n"
484
+ ]
485
+ },
486
+ {
487
+ "name": "stdout",
488
+ "output_type": "stream",
489
+ "text": [
490
+ "* Running on local URL: http://127.0.0.1:7864\n",
491
+ "* To create a public link, set `share=True` in `launch()`.\n"
492
+ ]
493
+ },
494
+ {
495
+ "data": {
496
+ "text/html": [
497
+ "<div><iframe src=\"http://127.0.0.1:7864/\" width=\"100%\" height=\"500\" allow=\"autoplay; camera; microphone; clipboard-read; clipboard-write;\" frameborder=\"0\" allowfullscreen></iframe></div>"
498
+ ],
499
+ "text/plain": [
500
+ "<IPython.core.display.HTML object>"
501
+ ]
502
+ },
503
+ "metadata": {},
504
+ "output_type": "display_data"
505
+ },
506
+ {
507
+ "data": {
508
+ "text/plain": []
509
+ },
510
+ "execution_count": 81,
511
+ "metadata": {},
512
+ "output_type": "execute_result"
513
+ }
514
+ ],
515
+ "source": [
516
+ "gr.ChatInterface(chat, chatbot=gr.Chatbot()).launch()"
517
+ ]
518
+ }
519
+ ],
520
+ "metadata": {
521
+ "kernelspec": {
522
+ "display_name": "Python 3",
523
+ "language": "python",
524
+ "name": "python3"
525
+ },
526
+ "language_info": {
527
+ "codemirror_mode": {
528
+ "name": "ipython",
529
+ "version": 3
530
+ },
531
+ "file_extension": ".py",
532
+ "mimetype": "text/x-python",
533
+ "name": "python",
534
+ "nbconvert_exporter": "python",
535
+ "pygments_lexer": "ipython3",
536
+ "version": "3.12.1"
537
+ }
538
+ },
539
+ "nbformat": 4,
540
+ "nbformat_minor": 5
541
+ }
community_contributions/gemini_based_chatbot/requirements.txt ADDED
Binary file (3.03 kB). View file
 
community_contributions/gemini_based_chatbot/summary.txt ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ My name is Rishabh Dubey.
2
+ I’m a computer science Engineer and i am based India, and a dedicated MERN stack developer.
3
+ I prioritize concise, precise communication and actionable insights.
4
+ I’m deeply interested in programming, web development, and data structures & algorithms (DSA).
5
+ Efficiency is everything for me – I like direct answers without unnecessary fluff.
6
+ I’m a vegetarian and enjoy mild Indian food, avoiding seafood and spicy dishes.
7
+ I prefer structured responses, like using tables when needed, and I don’t like chit-chat.
8
+ My focus is on learning quickly, expanding my skills, and acquiring impactful knowledge
community_contributions/lab2_updates_cross_ref_models.ipynb ADDED
@@ -0,0 +1,580 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "## Welcome to the Second Lab - Week 1, Day 3\n",
8
+ "\n",
9
+ "Today we will work with lots of models! This is a way to get comfortable with APIs."
10
+ ]
11
+ },
12
+ {
13
+ "cell_type": "markdown",
14
+ "metadata": {},
15
+ "source": [
16
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
17
+ " <tr>\n",
18
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
19
+ " <img src=\"../assets/stop.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
20
+ " </td>\n",
21
+ " <td>\n",
22
+ " <h2 style=\"color:#ff7800;\">Important point - please read</h2>\n",
23
+ " <span style=\"color:#ff7800;\">The way I collaborate with you may be different to other courses you've taken. I prefer not to type code while you watch. Rather, I execute Jupyter Labs, like this, and give you an intuition for what's going on. My suggestion is that you carefully execute this yourself, <b>after</b> watching the lecture. Add print statements to understand what's going on, and then come up with your own variations.<br/><br/>If you have time, I'd love it if you submit a PR for changes in the community_contributions folder - instructions in the resources. Also, if you have a Github account, use this to showcase your variations. Not only is this essential practice, but it demonstrates your skills to others, including perhaps future clients or employers...\n",
24
+ " </span>\n",
25
+ " </td>\n",
26
+ " </tr>\n",
27
+ "</table>"
28
+ ]
29
+ },
30
+ {
31
+ "cell_type": "code",
32
+ "execution_count": 1,
33
+ "metadata": {},
34
+ "outputs": [],
35
+ "source": [
36
+ "# Start with imports - ask ChatGPT to explain any package that you don't know\n",
37
+ "# Course_AIAgentic\n",
38
+ "import os\n",
39
+ "import json\n",
40
+ "from collections import defaultdict\n",
41
+ "from dotenv import load_dotenv\n",
42
+ "from openai import OpenAI\n",
43
+ "from anthropic import Anthropic\n",
44
+ "from IPython.display import Markdown, display"
45
+ ]
46
+ },
47
+ {
48
+ "cell_type": "code",
49
+ "execution_count": null,
50
+ "metadata": {},
51
+ "outputs": [],
52
+ "source": [
53
+ "# Always remember to do this!\n",
54
+ "load_dotenv(override=True)"
55
+ ]
56
+ },
57
+ {
58
+ "cell_type": "code",
59
+ "execution_count": null,
60
+ "metadata": {},
61
+ "outputs": [],
62
+ "source": [
63
+ "# Print the key prefixes to help with any debugging\n",
64
+ "\n",
65
+ "openai_api_key = os.getenv('OPENAI_API_KEY')\n",
66
+ "anthropic_api_key = os.getenv('ANTHROPIC_API_KEY')\n",
67
+ "google_api_key = os.getenv('GOOGLE_API_KEY')\n",
68
+ "deepseek_api_key = os.getenv('DEEPSEEK_API_KEY')\n",
69
+ "groq_api_key = os.getenv('GROQ_API_KEY')\n",
70
+ "\n",
71
+ "if openai_api_key:\n",
72
+ " print(f\"OpenAI API Key exists and begins {openai_api_key[:8]}\")\n",
73
+ "else:\n",
74
+ " print(\"OpenAI API Key not set\")\n",
75
+ " \n",
76
+ "if anthropic_api_key:\n",
77
+ " print(f\"Anthropic API Key exists and begins {anthropic_api_key[:7]}\")\n",
78
+ "else:\n",
79
+ " print(\"Anthropic API Key not set (and this is optional)\")\n",
80
+ "\n",
81
+ "if google_api_key:\n",
82
+ " print(f\"Google API Key exists and begins {google_api_key[:2]}\")\n",
83
+ "else:\n",
84
+ " print(\"Google API Key not set (and this is optional)\")\n",
85
+ "\n",
86
+ "if deepseek_api_key:\n",
87
+ " print(f\"DeepSeek API Key exists and begins {deepseek_api_key[:3]}\")\n",
88
+ "else:\n",
89
+ " print(\"DeepSeek API Key not set (and this is optional)\")\n",
90
+ "\n",
91
+ "if groq_api_key:\n",
92
+ " print(f\"Groq API Key exists and begins {groq_api_key[:4]}\")\n",
93
+ "else:\n",
94
+ " print(\"Groq API Key not set (and this is optional)\")"
95
+ ]
96
+ },
97
+ {
98
+ "cell_type": "code",
99
+ "execution_count": 4,
100
+ "metadata": {},
101
+ "outputs": [],
102
+ "source": [
103
+ "request = \"Please come up with a challenging, nuanced question that I can ask a number of LLMs to evaluate their intelligence. \"\n",
104
+ "request += \"Answer only with the question, no explanation.\"\n",
105
+ "messages = [{\"role\": \"user\", \"content\": request}]"
106
+ ]
107
+ },
108
+ {
109
+ "cell_type": "code",
110
+ "execution_count": null,
111
+ "metadata": {},
112
+ "outputs": [],
113
+ "source": [
114
+ "messages"
115
+ ]
116
+ },
117
+ {
118
+ "cell_type": "code",
119
+ "execution_count": null,
120
+ "metadata": {},
121
+ "outputs": [],
122
+ "source": [
123
+ "openai = OpenAI()\n",
124
+ "response = openai.chat.completions.create(\n",
125
+ " model=\"gpt-4o-mini\",\n",
126
+ " messages=messages,\n",
127
+ ")\n",
128
+ "question = response.choices[0].message.content\n",
129
+ "print(question)\n"
130
+ ]
131
+ },
132
+ {
133
+ "cell_type": "code",
134
+ "execution_count": 7,
135
+ "metadata": {},
136
+ "outputs": [],
137
+ "source": [
138
+ "competitors = []\n",
139
+ "answers = []\n",
140
+ "messages = [{\"role\": \"user\", \"content\": question}]"
141
+ ]
142
+ },
143
+ {
144
+ "cell_type": "code",
145
+ "execution_count": null,
146
+ "metadata": {},
147
+ "outputs": [],
148
+ "source": [
149
+ "# The API we know well\n",
150
+ "\n",
151
+ "model_name = \"gpt-4o-mini\"\n",
152
+ "\n",
153
+ "response = openai.chat.completions.create(model=model_name, messages=messages)\n",
154
+ "answer = response.choices[0].message.content\n",
155
+ "\n",
156
+ "display(Markdown(answer))\n",
157
+ "competitors.append(model_name)\n",
158
+ "answers.append(answer)"
159
+ ]
160
+ },
161
+ {
162
+ "cell_type": "code",
163
+ "execution_count": null,
164
+ "metadata": {},
165
+ "outputs": [],
166
+ "source": [
167
+ "# Anthropic has a slightly different API, and Max Tokens is required\n",
168
+ "\n",
169
+ "model_name = \"claude-3-7-sonnet-latest\"\n",
170
+ "\n",
171
+ "claude = Anthropic()\n",
172
+ "response = claude.messages.create(model=model_name, messages=messages, max_tokens=1000)\n",
173
+ "answer = response.content[0].text\n",
174
+ "\n",
175
+ "display(Markdown(answer))\n",
176
+ "competitors.append(model_name)\n",
177
+ "answers.append(answer)"
178
+ ]
179
+ },
180
+ {
181
+ "cell_type": "code",
182
+ "execution_count": null,
183
+ "metadata": {},
184
+ "outputs": [],
185
+ "source": [
186
+ "gemini = OpenAI(api_key=google_api_key, base_url=\"https://generativelanguage.googleapis.com/v1beta/openai/\")\n",
187
+ "model_name = \"gemini-2.0-flash\"\n",
188
+ "\n",
189
+ "response = gemini.chat.completions.create(model=model_name, messages=messages)\n",
190
+ "answer = response.choices[0].message.content\n",
191
+ "\n",
192
+ "display(Markdown(answer))\n",
193
+ "competitors.append(model_name)\n",
194
+ "answers.append(answer)"
195
+ ]
196
+ },
197
+ {
198
+ "cell_type": "code",
199
+ "execution_count": null,
200
+ "metadata": {},
201
+ "outputs": [],
202
+ "source": [
203
+ "deepseek = OpenAI(api_key=deepseek_api_key, base_url=\"https://api.deepseek.com/v1\")\n",
204
+ "model_name = \"deepseek-chat\"\n",
205
+ "\n",
206
+ "response = deepseek.chat.completions.create(model=model_name, messages=messages)\n",
207
+ "answer = response.choices[0].message.content\n",
208
+ "\n",
209
+ "display(Markdown(answer))\n",
210
+ "competitors.append(model_name)\n",
211
+ "answers.append(answer)"
212
+ ]
213
+ },
214
+ {
215
+ "cell_type": "code",
216
+ "execution_count": null,
217
+ "metadata": {},
218
+ "outputs": [],
219
+ "source": [
220
+ "groq = OpenAI(api_key=groq_api_key, base_url=\"https://api.groq.com/openai/v1\")\n",
221
+ "model_name = \"llama-3.3-70b-versatile\"\n",
222
+ "\n",
223
+ "response = groq.chat.completions.create(model=model_name, messages=messages)\n",
224
+ "answer = response.choices[0].message.content\n",
225
+ "\n",
226
+ "display(Markdown(answer))\n",
227
+ "competitors.append(model_name)\n",
228
+ "answers.append(answer)\n"
229
+ ]
230
+ },
231
+ {
232
+ "cell_type": "markdown",
233
+ "metadata": {},
234
+ "source": [
235
+ "## For the next cell, we will use Ollama\n",
236
+ "\n",
237
+ "Ollama runs a local web service that gives an OpenAI compatible endpoint, \n",
238
+ "and runs models locally using high performance C++ code.\n",
239
+ "\n",
240
+ "If you don't have Ollama, install it here by visiting https://ollama.com then pressing Download and following the instructions.\n",
241
+ "\n",
242
+ "After it's installed, you should be able to visit here: http://localhost:11434 and see the message \"Ollama is running\"\n",
243
+ "\n",
244
+ "You might need to restart Cursor (and maybe reboot). Then open a Terminal (control+\\`) and run `ollama serve`\n",
245
+ "\n",
246
+ "Useful Ollama commands (run these in the terminal, or with an exclamation mark in this notebook):\n",
247
+ "\n",
248
+ "`ollama pull <model_name>` downloads a model locally \n",
249
+ "`ollama ls` lists all the models you've downloaded \n",
250
+ "`ollama rm <model_name>` deletes the specified model from your downloads"
251
+ ]
252
+ },
253
+ {
254
+ "cell_type": "markdown",
255
+ "metadata": {},
256
+ "source": [
257
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
258
+ " <tr>\n",
259
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
260
+ " <img src=\"../assets/stop.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
261
+ " </td>\n",
262
+ " <td>\n",
263
+ " <h2 style=\"color:#ff7800;\">Super important - ignore me at your peril!</h2>\n",
264
+ " <span style=\"color:#ff7800;\">The model called <b>llama3.3</b> is FAR too large for home computers - it's not intended for personal computing and will consume all your resources! Stick with the nicely sized <b>llama3.2</b> or <b>llama3.2:1b</b> and if you want larger, try llama3.1 or smaller variants of Qwen, Gemma, Phi or DeepSeek. See the <A href=\"https://ollama.com/models\">the Ollama models page</a> for a full list of models and sizes.\n",
265
+ " </span>\n",
266
+ " </td>\n",
267
+ " </tr>\n",
268
+ "</table>"
269
+ ]
270
+ },
271
+ {
272
+ "cell_type": "code",
273
+ "execution_count": null,
274
+ "metadata": {},
275
+ "outputs": [],
276
+ "source": [
277
+ "!ollama pull llama3.2"
278
+ ]
279
+ },
280
+ {
281
+ "cell_type": "code",
282
+ "execution_count": null,
283
+ "metadata": {},
284
+ "outputs": [],
285
+ "source": [
286
+ "ollama = OpenAI(base_url='http://192.168.1.60:11434/v1', api_key='ollama')\n",
287
+ "model_name = \"llama3.2\"\n",
288
+ "\n",
289
+ "response = ollama.chat.completions.create(model=model_name, messages=messages)\n",
290
+ "answer = response.choices[0].message.content\n",
291
+ "\n",
292
+ "display(Markdown(answer))\n",
293
+ "competitors.append(model_name)\n",
294
+ "answers.append(answer)"
295
+ ]
296
+ },
297
+ {
298
+ "cell_type": "code",
299
+ "execution_count": null,
300
+ "metadata": {},
301
+ "outputs": [],
302
+ "source": [
303
+ "# So where are we?\n",
304
+ "\n",
305
+ "print(competitors)\n",
306
+ "print(answers)\n"
307
+ ]
308
+ },
309
+ {
310
+ "cell_type": "code",
311
+ "execution_count": null,
312
+ "metadata": {},
313
+ "outputs": [],
314
+ "source": [
315
+ "# It's nice to know how to use \"zip\"\n",
316
+ "for competitor, answer in zip(competitors, answers):\n",
317
+ " print(f\"Competitor: {competitor}\\n\\n{answer}\\n\\n\")\n"
318
+ ]
319
+ },
320
+ {
321
+ "cell_type": "code",
322
+ "execution_count": 17,
323
+ "metadata": {},
324
+ "outputs": [],
325
+ "source": [
326
+ "# Let's bring this together - note the use of \"enumerate\"\n",
327
+ "\n",
328
+ "together = \"\"\n",
329
+ "for index, answer in enumerate(answers):\n",
330
+ " together += f\"# Response from competitor {index+1}\\n\\n\"\n",
331
+ " together += answer + \"\\n\\n\""
332
+ ]
333
+ },
334
+ {
335
+ "cell_type": "code",
336
+ "execution_count": null,
337
+ "metadata": {},
338
+ "outputs": [],
339
+ "source": [
340
+ "print(together)"
341
+ ]
342
+ },
343
+ {
344
+ "cell_type": "code",
345
+ "execution_count": 19,
346
+ "metadata": {},
347
+ "outputs": [],
348
+ "source": [
349
+ "judge = f\"\"\"You are judging a competition between {len(competitors)} competitors.\n",
350
+ "Each model has been given this question:\n",
351
+ "\n",
352
+ "{question}\n",
353
+ "\n",
354
+ "Your job is to evaluate each response for clarity and strength of argument, and rank them in order of best to worst.\n",
355
+ "Respond with JSON, and only JSON, with the following format:\n",
356
+ "{{\"results\": [\"best competitor number\", \"second best competitor number\", \"third best competitor number\", ...]}}\n",
357
+ "\n",
358
+ "Here are the responses from each competitor:\n",
359
+ "\n",
360
+ "{together}\n",
361
+ "\n",
362
+ "Now respond with the JSON with the ranked order of the competitors, nothing else. Do not include markdown formatting or code blocks.\"\"\"\n"
363
+ ]
364
+ },
365
+ {
366
+ "cell_type": "code",
367
+ "execution_count": null,
368
+ "metadata": {},
369
+ "outputs": [],
370
+ "source": [
371
+ "print(judge)"
372
+ ]
373
+ },
374
+ {
375
+ "cell_type": "code",
376
+ "execution_count": 21,
377
+ "metadata": {},
378
+ "outputs": [],
379
+ "source": [
380
+ "judge_messages = [{\"role\": \"user\", \"content\": judge}]"
381
+ ]
382
+ },
383
+ {
384
+ "cell_type": "code",
385
+ "execution_count": null,
386
+ "metadata": {},
387
+ "outputs": [],
388
+ "source": [
389
+ "# Judgement time!\n",
390
+ "\n",
391
+ "openai = OpenAI()\n",
392
+ "response = openai.chat.completions.create(\n",
393
+ " model=\"o3-mini\",\n",
394
+ " messages=judge_messages,\n",
395
+ ")\n",
396
+ "results = response.choices[0].message.content\n",
397
+ "print(results)\n",
398
+ "\n",
399
+ "# remove openai variable\n",
400
+ "del openai"
401
+ ]
402
+ },
403
+ {
404
+ "cell_type": "code",
405
+ "execution_count": null,
406
+ "metadata": {},
407
+ "outputs": [],
408
+ "source": [
409
+ "# OK let's turn this into results!\n",
410
+ "\n",
411
+ "results_dict = json.loads(results)\n",
412
+ "ranks = results_dict[\"results\"]\n",
413
+ "for index, result in enumerate(ranks):\n",
414
+ " competitor = competitors[int(result)-1]\n",
415
+ " print(f\"Rank {index+1}: {competitor}\")"
416
+ ]
417
+ },
418
+ {
419
+ "cell_type": "code",
420
+ "execution_count": null,
421
+ "metadata": {},
422
+ "outputs": [],
423
+ "source": [
424
+ "## ranking system for various models to get a true winner\n",
425
+ "\n",
426
+ "cross_model_results = []\n",
427
+ "\n",
428
+ "for competitor in competitors:\n",
429
+ " judge = f\"\"\"You are judging a competition between {len(competitors)} competitors.\n",
430
+ " Each model has been given this question:\n",
431
+ "\n",
432
+ " {question}\n",
433
+ "\n",
434
+ " Your job is to evaluate each response for clarity and strength of argument, and rank them in order of best to worst.\n",
435
+ " Respond with JSON, and only JSON, with the following format:\n",
436
+ " {{\"{competitor}\": [\"best competitor number\", \"second best competitor number\", \"third best competitor number\", ...]}}\n",
437
+ "\n",
438
+ " Here are the responses from each competitor:\n",
439
+ "\n",
440
+ " {together}\n",
441
+ "\n",
442
+ " Now respond with the JSON with the ranked order of the competitors, nothing else. Do not include markdown formatting or code blocks.\"\"\"\n",
443
+ " \n",
444
+ " judge_messages = [{\"role\": \"user\", \"content\": judge}]\n",
445
+ "\n",
446
+ " if competitor.lower().startswith(\"claude\"):\n",
447
+ " claude = Anthropic()\n",
448
+ " response = claude.messages.create(model=competitor, messages=judge_messages, max_tokens=1024)\n",
449
+ " results = response.content[0].text\n",
450
+ " #memory cleanup\n",
451
+ " del claude\n",
452
+ " else:\n",
453
+ " openai = OpenAI()\n",
454
+ " response = openai.chat.completions.create(\n",
455
+ " model=\"o3-mini\",\n",
456
+ " messages=judge_messages,\n",
457
+ " )\n",
458
+ " results = response.choices[0].message.content\n",
459
+ " #memory cleanup\n",
460
+ " del openai\n",
461
+ "\n",
462
+ " cross_model_results.append(results)\n",
463
+ "\n",
464
+ "print(cross_model_results)\n",
465
+ "\n"
466
+ ]
467
+ },
468
+ {
469
+ "cell_type": "code",
470
+ "execution_count": null,
471
+ "metadata": {},
472
+ "outputs": [],
473
+ "source": [
474
+ "\n",
475
+ "# Dictionary to store cumulative scores for each model\n",
476
+ "model_scores = defaultdict(int)\n",
477
+ "model_names = {}\n",
478
+ "\n",
479
+ "# Create mapping from model index to model name\n",
480
+ "for i, name in enumerate(competitors, 1):\n",
481
+ " model_names[str(i)] = name\n",
482
+ "\n",
483
+ "# Process each ranking\n",
484
+ "for result_str in cross_model_results:\n",
485
+ " result = json.loads(result_str)\n",
486
+ " evaluator_name = list(result.keys())[0]\n",
487
+ " rankings = result[evaluator_name]\n",
488
+ " \n",
489
+ " #print(f\"\\n{evaluator_name} rankings:\")\n",
490
+ " # Convert rankings to scores (rank 1 = score 1, rank 2 = score 2, etc.)\n",
491
+ " for rank_position, model_id in enumerate(rankings, 1):\n",
492
+ " model_name = model_names.get(model_id, f\"Model {model_id}\")\n",
493
+ " model_scores[model_id] += rank_position\n",
494
+ " #print(f\" Rank {rank_position}: {model_name} (Model {model_id})\")\n",
495
+ "\n",
496
+ "print(\"\\n\" + \"=\"*70)\n",
497
+ "print(\"AGGREGATED RESULTS (lower score = better performance):\")\n",
498
+ "print(\"=\"*70)\n",
499
+ "\n",
500
+ "# Sort models by total score (ascending - lower is better)\n",
501
+ "sorted_models = sorted(model_scores.items(), key=lambda x: x[1])\n",
502
+ "\n",
503
+ "for rank, (model_id, total_score) in enumerate(sorted_models, 1):\n",
504
+ " model_name = model_names.get(model_id, f\"Model {model_id}\")\n",
505
+ " avg_score = total_score / len(cross_model_results)\n",
506
+ " print(f\"Rank {rank}: {model_name} (Model {model_id}) - Total Score: {total_score}, Average Score: {avg_score:.2f}\")\n",
507
+ "\n",
508
+ "winner_id = sorted_models[0][0]\n",
509
+ "winner_name = model_names.get(winner_id, f\"Model {winner_id}\")\n",
510
+ "print(f\"\\n🏆 WINNER: {winner_name} (Model {winner_id}) with the lowest total score of {sorted_models[0][1]}\")\n",
511
+ "\n",
512
+ "# Show detailed breakdown\n",
513
+ "print(f\"\\n📊 DETAILED BREAKDOWN:\")\n",
514
+ "print(\"-\" * 50)\n",
515
+ "for model_id, total_score in sorted_models:\n",
516
+ " model_name = model_names.get(model_id, f\"Model {model_id}\")\n",
517
+ " print(f\"{model_name}: {total_score} points across {len(cross_model_results)} evaluations\")\n"
518
+ ]
519
+ },
520
+ {
521
+ "cell_type": "markdown",
522
+ "metadata": {},
523
+ "source": [
524
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
525
+ " <tr>\n",
526
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
527
+ " <img src=\"../assets/exercise.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
528
+ " </td>\n",
529
+ " <td>\n",
530
+ " <h2 style=\"color:#ff7800;\">Exercise</h2>\n",
531
+ " <span style=\"color:#ff7800;\">Which pattern(s) did this use? Try updating this to add another Agentic design pattern.\n",
532
+ " </span>\n",
533
+ " </td>\n",
534
+ " </tr>\n",
535
+ "</table>"
536
+ ]
537
+ },
538
+ {
539
+ "cell_type": "markdown",
540
+ "metadata": {},
541
+ "source": [
542
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
543
+ " <tr>\n",
544
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
545
+ " <img src=\"../assets/business.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
546
+ " </td>\n",
547
+ " <td>\n",
548
+ " <h2 style=\"color:#00bfff;\">Commercial implications</h2>\n",
549
+ " <span style=\"color:#00bfff;\">These kinds of patterns - to send a task to multiple models, and evaluate results,\n",
550
+ " and common where you need to improve the quality of your LLM response. This approach can be universally applied\n",
551
+ " to business projects where accuracy is critical.\n",
552
+ " </span>\n",
553
+ " </td>\n",
554
+ " </tr>\n",
555
+ "</table>"
556
+ ]
557
+ }
558
+ ],
559
+ "metadata": {
560
+ "kernelspec": {
561
+ "display_name": ".venv",
562
+ "language": "python",
563
+ "name": "python3"
564
+ },
565
+ "language_info": {
566
+ "codemirror_mode": {
567
+ "name": "ipython",
568
+ "version": 3
569
+ },
570
+ "file_extension": ".py",
571
+ "mimetype": "text/x-python",
572
+ "name": "python",
573
+ "nbconvert_exporter": "python",
574
+ "pygments_lexer": "ipython3",
575
+ "version": "3.12.8"
576
+ }
577
+ },
578
+ "nbformat": 4,
579
+ "nbformat_minor": 2
580
+ }
community_contributions/llm-evaluator.ipynb ADDED
@@ -0,0 +1,385 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "BASED ON Week 1 Day 3 LAB Exercise\n",
8
+ "\n",
9
+ "This program evaluates different LLM outputs who are acting as customer service representative and are replying to an irritated customer.\n",
10
+ "OpenAI 40 mini, Gemini, Deepseek, Groq and Ollama are customer service representatives who respond to the email and OpenAI 3o mini analyzes all the responses and ranks their output based on different parameters."
11
+ ]
12
+ },
13
+ {
14
+ "cell_type": "code",
15
+ "execution_count": 1,
16
+ "metadata": {},
17
+ "outputs": [],
18
+ "source": [
19
+ "# Start with imports -\n",
20
+ "import os\n",
21
+ "import json\n",
22
+ "from dotenv import load_dotenv\n",
23
+ "from openai import OpenAI\n",
24
+ "from anthropic import Anthropic\n",
25
+ "from IPython.display import Markdown, display"
26
+ ]
27
+ },
28
+ {
29
+ "cell_type": "code",
30
+ "execution_count": null,
31
+ "metadata": {},
32
+ "outputs": [],
33
+ "source": [
34
+ "# Always remember to do this!\n",
35
+ "load_dotenv(override=True)"
36
+ ]
37
+ },
38
+ {
39
+ "cell_type": "code",
40
+ "execution_count": null,
41
+ "metadata": {},
42
+ "outputs": [],
43
+ "source": [
44
+ "# Print the key prefixes to help with any debugging\n",
45
+ "\n",
46
+ "openai_api_key = os.getenv('OPENAI_API_KEY')\n",
47
+ "google_api_key = os.getenv('GOOGLE_API_KEY')\n",
48
+ "deepseek_api_key = os.getenv('DEEPSEEK_API_KEY')\n",
49
+ "groq_api_key = os.getenv('GROQ_API_KEY')\n",
50
+ "\n",
51
+ "if openai_api_key:\n",
52
+ " print(f\"OpenAI API Key exists and begins {openai_api_key[:8]}\")\n",
53
+ "else:\n",
54
+ " print(\"OpenAI API Key not set\")\n",
55
+ "\n",
56
+ "if google_api_key:\n",
57
+ " print(f\"Google API Key exists and begins {google_api_key[:2]}\")\n",
58
+ "else:\n",
59
+ " print(\"Google API Key not set (and this is optional)\")\n",
60
+ "\n",
61
+ "if deepseek_api_key:\n",
62
+ " print(f\"DeepSeek API Key exists and begins {deepseek_api_key[:3]}\")\n",
63
+ "else:\n",
64
+ " print(\"DeepSeek API Key not set (and this is optional)\")\n",
65
+ "\n",
66
+ "if groq_api_key:\n",
67
+ " print(f\"Groq API Key exists and begins {groq_api_key[:4]}\")\n",
68
+ "else:\n",
69
+ " print(\"Groq API Key not set (and this is optional)\")"
70
+ ]
71
+ },
72
+ {
73
+ "cell_type": "code",
74
+ "execution_count": 4,
75
+ "metadata": {},
76
+ "outputs": [],
77
+ "source": [
78
+ "persona = \"You are a customer support representative for a subscription bases software product.\"\n",
79
+ "email_content = '''Subject: Totally unacceptable experience\n",
80
+ "\n",
81
+ "Hi,\n",
82
+ "\n",
83
+ "I’ve already written to you twice about this, and still no response. I was charged again this month even after canceling my subscription. This is the third time this has happened.\n",
84
+ "\n",
85
+ "Honestly, I’m losing patience. If I don’t get a clear explanation and refund within 24 hours, I’m going to report this on social media and leave negative reviews.\n",
86
+ "\n",
87
+ "You’ve seriously messed up here. Fix this now.\n",
88
+ "\n",
89
+ "– Jordan\n",
90
+ "\n",
91
+ "'''"
92
+ ]
93
+ },
94
+ {
95
+ "cell_type": "code",
96
+ "execution_count": 5,
97
+ "metadata": {},
98
+ "outputs": [],
99
+ "source": [
100
+ "messages = [{\"role\":\"system\", \"content\": persona}]"
101
+ ]
102
+ },
103
+ {
104
+ "cell_type": "code",
105
+ "execution_count": null,
106
+ "metadata": {},
107
+ "outputs": [],
108
+ "source": [
109
+ "request = f\"\"\"A frustrated customer has written in about being repeatedly charged after canceling and threatened to escalate on social media.\n",
110
+ "Write a calm, empathetic, and professional response that Acknowledges their frustration, Apologizes sincerely,Explains the next steps to resolve the issue\n",
111
+ "Attempts to de-escalate the situation. Keep the tone respectful and proactive. Do not make excuses or blame the customer.\"\"\"\n",
112
+ "request += f\" Here is the email : {email_content}]\"\n",
113
+ "messages.append({\"role\": \"user\", \"content\": request})\n",
114
+ "print(messages)"
115
+ ]
116
+ },
117
+ {
118
+ "cell_type": "code",
119
+ "execution_count": null,
120
+ "metadata": {},
121
+ "outputs": [],
122
+ "source": [
123
+ "messages"
124
+ ]
125
+ },
126
+ {
127
+ "cell_type": "code",
128
+ "execution_count": 8,
129
+ "metadata": {},
130
+ "outputs": [],
131
+ "source": [
132
+ "competitors = []\n",
133
+ "answers = []\n",
134
+ "messages = [{\"role\": \"user\", \"content\": request}]"
135
+ ]
136
+ },
137
+ {
138
+ "cell_type": "code",
139
+ "execution_count": null,
140
+ "metadata": {},
141
+ "outputs": [],
142
+ "source": [
143
+ "# The API we know well\n",
144
+ "openai = OpenAI()\n",
145
+ "model_name = \"gpt-4o-mini\"\n",
146
+ "\n",
147
+ "response = openai.chat.completions.create(model=model_name, messages=messages)\n",
148
+ "answer = response.choices[0].message.content\n",
149
+ "\n",
150
+ "display(Markdown(answer))\n",
151
+ "competitors.append(model_name)\n",
152
+ "answers.append(answer)"
153
+ ]
154
+ },
155
+ {
156
+ "cell_type": "code",
157
+ "execution_count": null,
158
+ "metadata": {},
159
+ "outputs": [],
160
+ "source": [
161
+ "gemini = OpenAI(api_key=google_api_key, base_url=\"https://generativelanguage.googleapis.com/v1beta/openai/\")\n",
162
+ "model_name = \"gemini-2.0-flash\"\n",
163
+ "\n",
164
+ "response = gemini.chat.completions.create(model=model_name, messages=messages)\n",
165
+ "answer = response.choices[0].message.content\n",
166
+ "\n",
167
+ "display(Markdown(answer))\n",
168
+ "competitors.append(model_name)\n",
169
+ "answers.append(answer)"
170
+ ]
171
+ },
172
+ {
173
+ "cell_type": "code",
174
+ "execution_count": null,
175
+ "metadata": {},
176
+ "outputs": [],
177
+ "source": [
178
+ "deepseek = OpenAI(api_key=deepseek_api_key, base_url=\"https://api.deepseek.com/v1\")\n",
179
+ "model_name = \"deepseek-chat\"\n",
180
+ "\n",
181
+ "response = deepseek.chat.completions.create(model=model_name, messages=messages)\n",
182
+ "answer = response.choices[0].message.content\n",
183
+ "\n",
184
+ "display(Markdown(answer))\n",
185
+ "competitors.append(model_name)\n",
186
+ "answers.append(answer)"
187
+ ]
188
+ },
189
+ {
190
+ "cell_type": "code",
191
+ "execution_count": null,
192
+ "metadata": {},
193
+ "outputs": [],
194
+ "source": [
195
+ "groq = OpenAI(api_key=groq_api_key, base_url=\"https://api.groq.com/openai/v1\")\n",
196
+ "model_name = \"llama-3.3-70b-versatile\"\n",
197
+ "\n",
198
+ "response = groq.chat.completions.create(model=model_name, messages=messages)\n",
199
+ "answer = response.choices[0].message.content\n",
200
+ "\n",
201
+ "display(Markdown(answer))\n",
202
+ "competitors.append(model_name)\n",
203
+ "answers.append(answer)\n"
204
+ ]
205
+ },
206
+ {
207
+ "cell_type": "code",
208
+ "execution_count": null,
209
+ "metadata": {},
210
+ "outputs": [],
211
+ "source": [
212
+ "!ollama pull llama3.2"
213
+ ]
214
+ },
215
+ {
216
+ "cell_type": "code",
217
+ "execution_count": null,
218
+ "metadata": {},
219
+ "outputs": [],
220
+ "source": [
221
+ "ollama = OpenAI(base_url='http://localhost:11434/v1', api_key='ollama')\n",
222
+ "model_name = \"llama3.2\"\n",
223
+ "\n",
224
+ "response = ollama.chat.completions.create(model=model_name, messages=messages)\n",
225
+ "answer = response.choices[0].message.content\n",
226
+ "\n",
227
+ "display(Markdown(answer))\n",
228
+ "competitors.append(model_name)\n",
229
+ "answers.append(answer)"
230
+ ]
231
+ },
232
+ {
233
+ "cell_type": "code",
234
+ "execution_count": null,
235
+ "metadata": {},
236
+ "outputs": [],
237
+ "source": [
238
+ "# So where are we?\n",
239
+ "\n",
240
+ "print(competitors)\n",
241
+ "print(answers)\n"
242
+ ]
243
+ },
244
+ {
245
+ "cell_type": "code",
246
+ "execution_count": null,
247
+ "metadata": {},
248
+ "outputs": [],
249
+ "source": [
250
+ "# It's nice to know how to use \"zip\"\n",
251
+ "for competitor, answer in zip(competitors, answers):\n",
252
+ " print(f\"Competitor: {competitor}\\n\\n{answer}\")\n"
253
+ ]
254
+ },
255
+ {
256
+ "cell_type": "code",
257
+ "execution_count": 16,
258
+ "metadata": {},
259
+ "outputs": [],
260
+ "source": [
261
+ "# Let's bring this together - note the use of \"enumerate\"\n",
262
+ "\n",
263
+ "together = \"\"\n",
264
+ "for index, answer in enumerate(answers):\n",
265
+ " together += f\"# Response from competitor {index+1}\\n\\n\"\n",
266
+ " together += answer + \"\\n\\n\""
267
+ ]
268
+ },
269
+ {
270
+ "cell_type": "code",
271
+ "execution_count": null,
272
+ "metadata": {},
273
+ "outputs": [],
274
+ "source": [
275
+ "print(together)"
276
+ ]
277
+ },
278
+ {
279
+ "cell_type": "code",
280
+ "execution_count": 18,
281
+ "metadata": {},
282
+ "outputs": [],
283
+ "source": [
284
+ "judge = f\"\"\"You are judging the performance of {len(competitors)} who are customer service representatives in a SaaS based subscription model company.\n",
285
+ "Each has responded to below grievnace email from the customer:\n",
286
+ "\n",
287
+ "{request}\n",
288
+ "\n",
289
+ "Evaluate the following customer support reply based on these criteria. Assign a score from 1 (very poor) to 5 (excellent) for each:\n",
290
+ "\n",
291
+ "1. Empathy:\n",
292
+ "Does the message acknowledge the customer’s frustration appropriately and sincerely?\n",
293
+ "\n",
294
+ "2. De-escalation:\n",
295
+ "Does the response effectively calm the customer and reduce the likelihood of social media escalation?\n",
296
+ "\n",
297
+ "3. Clarity:\n",
298
+ "Is the explanation of next steps clear and specific (e.g., refund process, timeline)?\n",
299
+ "\n",
300
+ "4. Professional Tone:\n",
301
+ "Is the message respectful, calm, and free from defensiveness or blame?\n",
302
+ "\n",
303
+ "Provide a one-sentence explanation for each score and a final overall rating with justification.\n",
304
+ "\n",
305
+ "Here are the responses from each competitor:\n",
306
+ "\n",
307
+ "{together}\n",
308
+ "\n",
309
+ "Do not include markdown formatting or code blocks. Also create a table with 3 columnds at the end containing rank, name and one line reason for the rank\"\"\"\n"
310
+ ]
311
+ },
312
+ {
313
+ "cell_type": "code",
314
+ "execution_count": null,
315
+ "metadata": {},
316
+ "outputs": [],
317
+ "source": [
318
+ "print(judge)"
319
+ ]
320
+ },
321
+ {
322
+ "cell_type": "code",
323
+ "execution_count": 20,
324
+ "metadata": {},
325
+ "outputs": [],
326
+ "source": [
327
+ "judge_messages = [{\"role\": \"user\", \"content\": judge}]\n"
328
+ ]
329
+ },
330
+ {
331
+ "cell_type": "code",
332
+ "execution_count": null,
333
+ "metadata": {},
334
+ "outputs": [],
335
+ "source": [
336
+ "# Judgement time!\n",
337
+ "\n",
338
+ "openai = OpenAI()\n",
339
+ "response = openai.chat.completions.create(\n",
340
+ " model=\"o3-mini\",\n",
341
+ " messages=judge_messages,\n",
342
+ ")\n",
343
+ "results = response.choices[0].message.content\n",
344
+ "print(results)\n"
345
+ ]
346
+ },
347
+ {
348
+ "cell_type": "code",
349
+ "execution_count": null,
350
+ "metadata": {},
351
+ "outputs": [],
352
+ "source": [
353
+ "print(results)"
354
+ ]
355
+ },
356
+ {
357
+ "cell_type": "code",
358
+ "execution_count": null,
359
+ "metadata": {},
360
+ "outputs": [],
361
+ "source": []
362
+ }
363
+ ],
364
+ "metadata": {
365
+ "kernelspec": {
366
+ "display_name": ".venv",
367
+ "language": "python",
368
+ "name": "python3"
369
+ },
370
+ "language_info": {
371
+ "codemirror_mode": {
372
+ "name": "ipython",
373
+ "version": 3
374
+ },
375
+ "file_extension": ".py",
376
+ "mimetype": "text/x-python",
377
+ "name": "python",
378
+ "nbconvert_exporter": "python",
379
+ "pygments_lexer": "ipython3",
380
+ "version": "3.12.7"
381
+ }
382
+ },
383
+ "nbformat": 4,
384
+ "nbformat_minor": 2
385
+ }
community_contributions/my_1_lab1.ipynb ADDED
@@ -0,0 +1,405 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# Welcome to the start of your adventure in Agentic AI"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "markdown",
12
+ "metadata": {},
13
+ "source": [
14
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
15
+ " <tr>\n",
16
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
17
+ " <img src=\"../../assets/stop.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
18
+ " </td>\n",
19
+ " <td>\n",
20
+ " <h2 style=\"color:#ff7800;\">Are you ready for action??</h2>\n",
21
+ " <span style=\"color:#ff7800;\">Have you completed all the setup steps in the <a href=\"../setup/\">setup</a> folder?<br/>\n",
22
+ " Have you checked out the guides in the <a href=\"../guides/01_intro.ipynb\">guides</a> folder?<br/>\n",
23
+ " Well in that case, you're ready!!\n",
24
+ " </span>\n",
25
+ " </td>\n",
26
+ " </tr>\n",
27
+ "</table>"
28
+ ]
29
+ },
30
+ {
31
+ "cell_type": "markdown",
32
+ "metadata": {},
33
+ "source": [
34
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
35
+ " <tr>\n",
36
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
37
+ " <img src=\"../../assets/tools.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
38
+ " </td>\n",
39
+ " <td>\n",
40
+ " <h2 style=\"color:#00bfff;\">Treat these labs as a resource</h2>\n",
41
+ " <span style=\"color:#00bfff;\">I push updates to the code regularly. When people ask questions or have problems, I incorporate it in the code, adding more examples or improved commentary. As a result, you'll notice that the code below isn't identical to the videos. Everything from the videos is here; but in addition, I've added more steps and better explanations. Consider this like an interactive book that accompanies the lectures.\n",
42
+ " </span>\n",
43
+ " </td>\n",
44
+ " </tr>\n",
45
+ "</table>"
46
+ ]
47
+ },
48
+ {
49
+ "cell_type": "markdown",
50
+ "metadata": {},
51
+ "source": [
52
+ "### And please do remember to contact me if I can help\n",
53
+ "\n",
54
+ "And I love to connect: https://www.linkedin.com/in/eddonner/\n",
55
+ "\n",
56
+ "\n",
57
+ "### New to Notebooks like this one? Head over to the guides folder!\n",
58
+ "\n",
59
+ "Otherwise:\n",
60
+ "1. Click where it says \"Select Kernel\" near the top right, and select the option called `.venv (Python 3.12.9)` or similar, which should be the first choice or the most prominent choice.\n",
61
+ "2. Click in each \"cell\" below, starting with the cell immediately below this text, and press Shift+Enter to run\n",
62
+ "3. Enjoy!"
63
+ ]
64
+ },
65
+ {
66
+ "cell_type": "code",
67
+ "execution_count": 1,
68
+ "metadata": {},
69
+ "outputs": [],
70
+ "source": [
71
+ "# First let's do an import\n",
72
+ "from dotenv import load_dotenv\n"
73
+ ]
74
+ },
75
+ {
76
+ "cell_type": "code",
77
+ "execution_count": null,
78
+ "metadata": {},
79
+ "outputs": [],
80
+ "source": [
81
+ "# Next it's time to load the API keys into environment variables\n",
82
+ "\n",
83
+ "load_dotenv(override=True)"
84
+ ]
85
+ },
86
+ {
87
+ "cell_type": "code",
88
+ "execution_count": null,
89
+ "metadata": {},
90
+ "outputs": [],
91
+ "source": [
92
+ "# Check the keys\n",
93
+ "\n",
94
+ "import os\n",
95
+ "openai_api_key = os.getenv('OPENAI_API_KEY')\n",
96
+ "\n",
97
+ "if openai_api_key:\n",
98
+ " print(f\"OpenAI API Key exists and begins {openai_api_key[:8]}\")\n",
99
+ "else:\n",
100
+ " print(\"OpenAI API Key not set - please head to the troubleshooting guide in the guides folder\")\n",
101
+ " \n"
102
+ ]
103
+ },
104
+ {
105
+ "cell_type": "code",
106
+ "execution_count": 4,
107
+ "metadata": {},
108
+ "outputs": [],
109
+ "source": [
110
+ "# And now - the all important import statement\n",
111
+ "# If you get an import error - head over to troubleshooting guide\n",
112
+ "\n",
113
+ "from openai import OpenAI"
114
+ ]
115
+ },
116
+ {
117
+ "cell_type": "code",
118
+ "execution_count": 5,
119
+ "metadata": {},
120
+ "outputs": [],
121
+ "source": [
122
+ "# And now we'll create an instance of the OpenAI class\n",
123
+ "# If you're not sure what it means to create an instance of a class - head over to the guides folder!\n",
124
+ "# If you get a NameError - head over to the guides folder to learn about NameErrors\n",
125
+ "\n",
126
+ "openai = OpenAI()"
127
+ ]
128
+ },
129
+ {
130
+ "cell_type": "code",
131
+ "execution_count": 6,
132
+ "metadata": {},
133
+ "outputs": [],
134
+ "source": [
135
+ "# Create a list of messages in the familiar OpenAI format\n",
136
+ "\n",
137
+ "messages = [{\"role\": \"user\", \"content\": \"What is 2+2?\"}]"
138
+ ]
139
+ },
140
+ {
141
+ "cell_type": "code",
142
+ "execution_count": null,
143
+ "metadata": {},
144
+ "outputs": [],
145
+ "source": [
146
+ "# And now call it! Any problems, head to the troubleshooting guide\n",
147
+ "\n",
148
+ "response = openai.chat.completions.create(\n",
149
+ " model=\"gpt-4o-mini\",\n",
150
+ " messages=messages\n",
151
+ ")\n",
152
+ "\n",
153
+ "print(response.choices[0].message.content)\n"
154
+ ]
155
+ },
156
+ {
157
+ "cell_type": "code",
158
+ "execution_count": null,
159
+ "metadata": {},
160
+ "outputs": [],
161
+ "source": []
162
+ },
163
+ {
164
+ "cell_type": "code",
165
+ "execution_count": 8,
166
+ "metadata": {},
167
+ "outputs": [],
168
+ "source": [
169
+ "# And now - let's ask for a question:\n",
170
+ "\n",
171
+ "question = \"Please propose a hard, challenging question to assess someone's IQ. Respond only with the question.\"\n",
172
+ "messages = [{\"role\": \"user\", \"content\": question}]\n"
173
+ ]
174
+ },
175
+ {
176
+ "cell_type": "code",
177
+ "execution_count": null,
178
+ "metadata": {},
179
+ "outputs": [],
180
+ "source": [
181
+ "# ask it\n",
182
+ "response = openai.chat.completions.create(\n",
183
+ " model=\"gpt-4o-mini\",\n",
184
+ " messages=messages\n",
185
+ ")\n",
186
+ "\n",
187
+ "question = response.choices[0].message.content\n",
188
+ "\n",
189
+ "print(question)\n"
190
+ ]
191
+ },
192
+ {
193
+ "cell_type": "code",
194
+ "execution_count": 10,
195
+ "metadata": {},
196
+ "outputs": [],
197
+ "source": [
198
+ "# form a new messages list\n",
199
+ "messages = [{\"role\": \"user\", \"content\": question}]\n"
200
+ ]
201
+ },
202
+ {
203
+ "cell_type": "code",
204
+ "execution_count": null,
205
+ "metadata": {},
206
+ "outputs": [],
207
+ "source": [
208
+ "# Ask it again\n",
209
+ "\n",
210
+ "response = openai.chat.completions.create(\n",
211
+ " model=\"gpt-4o-mini\",\n",
212
+ " messages=messages\n",
213
+ ")\n",
214
+ "\n",
215
+ "answer = response.choices[0].message.content\n",
216
+ "print(answer)\n"
217
+ ]
218
+ },
219
+ {
220
+ "cell_type": "code",
221
+ "execution_count": null,
222
+ "metadata": {},
223
+ "outputs": [],
224
+ "source": [
225
+ "from IPython.display import Markdown, display\n",
226
+ "\n",
227
+ "display(Markdown(answer))\n",
228
+ "\n"
229
+ ]
230
+ },
231
+ {
232
+ "cell_type": "markdown",
233
+ "metadata": {},
234
+ "source": [
235
+ "# Congratulations!\n",
236
+ "\n",
237
+ "That was a small, simple step in the direction of Agentic AI, with your new environment!\n",
238
+ "\n",
239
+ "Next time things get more interesting..."
240
+ ]
241
+ },
242
+ {
243
+ "cell_type": "markdown",
244
+ "metadata": {},
245
+ "source": [
246
+ "<table style=\"margin: 0; text-align: left; width:100%\">\n",
247
+ " <tr>\n",
248
+ " <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
249
+ " <img src=\"../../assets/exercise.png\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
250
+ " </td>\n",
251
+ " <td>\n",
252
+ " <h2 style=\"color:#ff7800;\">Exercise</h2>\n",
253
+ " <span style=\"color:#ff7800;\">Now try this commercial application:<br/>\n",
254
+ " First ask the LLM to pick a business area that might be worth exploring for an Agentic AI opportunity.<br/>\n",
255
+ " Then ask the LLM to present a pain-point in that industry - something challenging that might be ripe for an Agentic solution.<br/>\n",
256
+ " Finally have 3 third LLM call propose the Agentic AI solution.\n",
257
+ " </span>\n",
258
+ " </td>\n",
259
+ " </tr>\n",
260
+ "</table>"
261
+ ]
262
+ },
263
+ {
264
+ "cell_type": "markdown",
265
+ "metadata": {},
266
+ "source": [
267
+ "```\n",
268
+ "# First create the messages:\n",
269
+ "\n",
270
+ "messages = [{\"role\": \"user\", \"content\": \"Something here\"}]\n",
271
+ "\n",
272
+ "# Then make the first call:\n",
273
+ "\n",
274
+ "response = openai.chat.completions.create(\n",
275
+ " model=\"gpt-4o-mini\",\n",
276
+ " messages=messages\n",
277
+ ")\n",
278
+ "\n",
279
+ "# Then read the business idea:\n",
280
+ "\n",
281
+ "business_idea = response.choices[0].message.content\n",
282
+ "\n",
283
+ "# print(business_idea) \n",
284
+ "\n",
285
+ "# And repeat!\n",
286
+ "```"
287
+ ]
288
+ },
289
+ {
290
+ "cell_type": "code",
291
+ "execution_count": null,
292
+ "metadata": {},
293
+ "outputs": [],
294
+ "source": [
295
+ "# First exercice : ask the LLM to pick a business area that might be worth exploring for an Agentic AI opportunity.\n",
296
+ "\n",
297
+ "# First create the messages:\n",
298
+ "query = \"Pick a business area that might be worth exploring for an Agentic AI opportunity.\"\n",
299
+ "messages = [{\"role\": \"user\", \"content\": query}]\n",
300
+ "\n",
301
+ "# Then make the first call:\n",
302
+ "\n",
303
+ "response = openai.chat.completions.create(\n",
304
+ " model=\"gpt-4o-mini\",\n",
305
+ " messages=messages\n",
306
+ ")\n",
307
+ "\n",
308
+ "# Then read the business idea:\n",
309
+ "\n",
310
+ "business_idea = response.choices[0].message.content\n",
311
+ "\n",
312
+ "# print(business_idea) \n",
313
+ "\n",
314
+ "# from IPython.display import Markdown, display\n",
315
+ "\n",
316
+ "display(Markdown(business_idea))\n",
317
+ "\n",
318
+ "# And repeat!"
319
+ ]
320
+ },
321
+ {
322
+ "cell_type": "code",
323
+ "execution_count": null,
324
+ "metadata": {},
325
+ "outputs": [],
326
+ "source": [
327
+ "# Second exercice: Then ask the LLM to present a pain-point in that industry - something challenging that might be ripe for an Agentic solution.\n",
328
+ "\n",
329
+ "# First create the messages:\n",
330
+ "\n",
331
+ "prompt = f\"Please present a pain-point in that industry, something challenging that might be ripe for an Agentic solution for it in that industry: {business_idea}\"\n",
332
+ "messages = [{\"role\": \"user\", \"content\": prompt}]\n",
333
+ "\n",
334
+ "# Then make the first call:\n",
335
+ "\n",
336
+ "response = openai.chat.completions.create(\n",
337
+ " model=\"gpt-4o-mini\",\n",
338
+ " messages=messages\n",
339
+ ")\n",
340
+ "\n",
341
+ "# Then read the business idea:\n",
342
+ "\n",
343
+ "painpoint = response.choices[0].message.content\n",
344
+ " \n",
345
+ "# print(painpoint) \n",
346
+ "display(Markdown(painpoint))\n",
347
+ "\n",
348
+ "# And repeat!"
349
+ ]
350
+ },
351
+ {
352
+ "cell_type": "code",
353
+ "execution_count": null,
354
+ "metadata": {},
355
+ "outputs": [],
356
+ "source": [
357
+ "# third exercice: Finally have 3 third LLM call propose the Agentic AI solution.\n",
358
+ "\n",
359
+ "# First create the messages:\n",
360
+ "\n",
361
+ "promptEx3 = f\"Please come up with a proposal for the Agentic AI solution to address this business painpoint: {painpoint}\"\n",
362
+ "messages = [{\"role\": \"user\", \"content\": promptEx3}]\n",
363
+ "\n",
364
+ "# Then make the first call:\n",
365
+ "\n",
366
+ "response = openai.chat.completions.create(\n",
367
+ " model=\"gpt-4o-mini\",\n",
368
+ " messages=messages\n",
369
+ ")\n",
370
+ "\n",
371
+ "# Then read the business idea:\n",
372
+ "\n",
373
+ "ex3_answer=response.choices[0].message.content\n",
374
+ "# print(painpoint) \n",
375
+ "display(Markdown(ex3_answer))"
376
+ ]
377
+ },
378
+ {
379
+ "cell_type": "markdown",
380
+ "metadata": {},
381
+ "source": []
382
+ }
383
+ ],
384
+ "metadata": {
385
+ "kernelspec": {
386
+ "display_name": ".venv",
387
+ "language": "python",
388
+ "name": "python3"
389
+ },
390
+ "language_info": {
391
+ "codemirror_mode": {
392
+ "name": "ipython",
393
+ "version": 3
394
+ },
395
+ "file_extension": ".py",
396
+ "mimetype": "text/x-python",
397
+ "name": "python",
398
+ "nbconvert_exporter": "python",
399
+ "pygments_lexer": "ipython3",
400
+ "version": "3.12.3"
401
+ }
402
+ },
403
+ "nbformat": 4,
404
+ "nbformat_minor": 2
405
+ }
community_contributions/travel_planner_multicall_and_sythesizer.ipynb ADDED
@@ -0,0 +1,287 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": null,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "# Start with imports - ask ChatGPT to explain any package that you don't know\n",
10
+ "\n",
11
+ "import os\n",
12
+ "import json\n",
13
+ "from dotenv import load_dotenv\n",
14
+ "from openai import OpenAI\n",
15
+ "from anthropic import Anthropic\n",
16
+ "from IPython.display import Markdown, display"
17
+ ]
18
+ },
19
+ {
20
+ "cell_type": "markdown",
21
+ "metadata": {},
22
+ "source": [
23
+ "<b>Load and check your API keys</b>\n",
24
+ "</br>\n",
25
+ "<b>- - - - - - - - - - - - - - - -</b>"
26
+ ]
27
+ },
28
+ {
29
+ "cell_type": "code",
30
+ "execution_count": null,
31
+ "metadata": {},
32
+ "outputs": [],
33
+ "source": [
34
+ "# Always remember to do this!\n",
35
+ "load_dotenv(override=True)\n",
36
+ "\n",
37
+ "# Function to check and display API key status\n",
38
+ "def check_api_key(key_name):\n",
39
+ " key = os.getenv(key_name)\n",
40
+ " \n",
41
+ " if key:\n",
42
+ " # Always show the first 7 characters of the key\n",
43
+ " print(f\"✓ {key_name} API Key exists and begins... ({key[:7]})\")\n",
44
+ " return True\n",
45
+ " else:\n",
46
+ " print(f\"⚠️ {key_name} API Key not set\")\n",
47
+ " return False\n",
48
+ "\n",
49
+ "# Check each API key (the function now returns True or False)\n",
50
+ "has_openai = check_api_key('OPENAI_API_KEY')\n",
51
+ "has_anthropic = check_api_key('ANTHROPIC_API_KEY')\n",
52
+ "has_google = check_api_key('GOOGLE_API_KEY')\n",
53
+ "has_deepseek = check_api_key('DEEPSEEK_API_KEY')\n",
54
+ "has_groq = check_api_key('GROQ_API_KEY')"
55
+ ]
56
+ },
57
+ {
58
+ "cell_type": "markdown",
59
+ "metadata": {
60
+ "vscode": {
61
+ "languageId": "html"
62
+ }
63
+ },
64
+ "source": [
65
+ "<b>Input for travel planner</b></br>\n",
66
+ "Describe yourself, your travel companions, and the destination you plan to visit.\n",
67
+ "</br>\n",
68
+ "<b>- - - - - - - - - - - - - - - -</b>"
69
+ ]
70
+ },
71
+ {
72
+ "cell_type": "code",
73
+ "execution_count": 4,
74
+ "metadata": {},
75
+ "outputs": [],
76
+ "source": [
77
+ "# Provide a description of you or your family. Age, interests, etc.\n",
78
+ "person_description = \"family with a 3 year-old\"\n",
79
+ "# Provide the name of the specific destination or attraction and country\n",
80
+ "destination = \"Belgium, Brussels\""
81
+ ]
82
+ },
83
+ {
84
+ "cell_type": "markdown",
85
+ "metadata": {},
86
+ "source": [
87
+ "<b>- - - - - - - - - - - - - - - -</b>"
88
+ ]
89
+ },
90
+ {
91
+ "cell_type": "code",
92
+ "execution_count": 5,
93
+ "metadata": {},
94
+ "outputs": [],
95
+ "source": [
96
+ "prompt = f\"\"\"\n",
97
+ "Given the following description of a person or family:\n",
98
+ "{person_description}\n",
99
+ "\n",
100
+ "And the requested travel destination or attraction:\n",
101
+ "{destination}\n",
102
+ "\n",
103
+ "Provide a concise response including:\n",
104
+ "\n",
105
+ "1. Fit rating (1-10) specifically for this person or family.\n",
106
+ "2. One compelling positive reason why this destination suits them.\n",
107
+ "3. One notable drawback they should consider before visiting.\n",
108
+ "4. One important additional aspect to consider related to this location.\n",
109
+ "5. Suggest a few additional places that might also be of interest to them that are very close to the destination.\n",
110
+ "\"\"\""
111
+ ]
112
+ },
113
+ {
114
+ "cell_type": "code",
115
+ "execution_count": null,
116
+ "metadata": {},
117
+ "outputs": [],
118
+ "source": [
119
+ "def run_prompt_on_available_models(prompt):\n",
120
+ " \"\"\"\n",
121
+ " Run a prompt on all available AI models based on API keys.\n",
122
+ " Continues processing even if some models fail.\n",
123
+ " \"\"\"\n",
124
+ " results = {}\n",
125
+ " api_response = [{\"role\": \"user\", \"content\": prompt}]\n",
126
+ " \n",
127
+ " # OpenAI\n",
128
+ " if check_api_key('OPENAI_API_KEY'):\n",
129
+ " try:\n",
130
+ " model_name = \"gpt-4o-mini\"\n",
131
+ " openai_client = OpenAI()\n",
132
+ " response = openai_client.chat.completions.create(model=model_name, messages=api_response)\n",
133
+ " results[model_name] = response.choices[0].message.content\n",
134
+ " print(f\"✓ Got response from {model_name}\")\n",
135
+ " except Exception as e:\n",
136
+ " print(f\"⚠️ Error with {model_name}: {str(e)}\")\n",
137
+ " # Continue with other models\n",
138
+ " \n",
139
+ " # Anthropic\n",
140
+ " if check_api_key('ANTHROPIC_API_KEY'):\n",
141
+ " try:\n",
142
+ " model_name = \"claude-3-7-sonnet-latest\"\n",
143
+ " # Create new client each time\n",
144
+ " claude = Anthropic()\n",
145
+ " \n",
146
+ " # Use messages directly \n",
147
+ " response = claude.messages.create(\n",
148
+ " model=model_name,\n",
149
+ " messages=[{\"role\": \"user\", \"content\": prompt}],\n",
150
+ " max_tokens=1000\n",
151
+ " )\n",
152
+ " results[model_name] = response.content[0].text\n",
153
+ " print(f\"✓ Got response from {model_name}\")\n",
154
+ " except Exception as e:\n",
155
+ " print(f\"⚠️ Error with {model_name}: {str(e)}\")\n",
156
+ " # Continue with other models\n",
157
+ " \n",
158
+ " # Google\n",
159
+ " if check_api_key('GOOGLE_API_KEY'):\n",
160
+ " try:\n",
161
+ " model_name = \"gemini-2.0-flash\"\n",
162
+ " google_api_key = os.getenv('GOOGLE_API_KEY')\n",
163
+ " gemini = OpenAI(api_key=google_api_key, base_url=\"https://generativelanguage.googleapis.com/v1beta/openai/\")\n",
164
+ " response = gemini.chat.completions.create(model=model_name, messages=api_response)\n",
165
+ " results[model_name] = response.choices[0].message.content\n",
166
+ " print(f\"✓ Got response from {model_name}\")\n",
167
+ " except Exception as e:\n",
168
+ " print(f\"⚠️ Error with {model_name}: {str(e)}\")\n",
169
+ " # Continue with other models\n",
170
+ " \n",
171
+ " # DeepSeek\n",
172
+ " if check_api_key('DEEPSEEK_API_KEY'):\n",
173
+ " try:\n",
174
+ " model_name = \"deepseek-chat\"\n",
175
+ " deepseek_api_key = os.getenv('DEEPSEEK_API_KEY')\n",
176
+ " deepseek = OpenAI(api_key=deepseek_api_key, base_url=\"https://api.deepseek.com/v1\")\n",
177
+ " response = deepseek.chat.completions.create(model=model_name, messages=api_response)\n",
178
+ " results[model_name] = response.choices[0].message.content\n",
179
+ " print(f\"✓ Got response from {model_name}\")\n",
180
+ " except Exception as e:\n",
181
+ " print(f\"⚠️ Error with {model_name}: {str(e)}\")\n",
182
+ " # Continue with other models\n",
183
+ " \n",
184
+ " # Groq\n",
185
+ " if check_api_key('GROQ_API_KEY'):\n",
186
+ " try:\n",
187
+ " model_name = \"llama-3.3-70b-versatile\"\n",
188
+ " groq_api_key = os.getenv('GROQ_API_KEY')\n",
189
+ " groq = OpenAI(api_key=groq_api_key, base_url=\"https://api.groq.com/openai/v1\")\n",
190
+ " response = groq.chat.completions.create(model=model_name, messages=api_response)\n",
191
+ " results[model_name] = response.choices[0].message.content\n",
192
+ " print(f\"✓ Got response from {model_name}\")\n",
193
+ " except Exception as e:\n",
194
+ " print(f\"⚠️ Error with {model_name}: {str(e)}\")\n",
195
+ " # Continue with other models\n",
196
+ " \n",
197
+ " # Check if we got any responses\n",
198
+ " if not results:\n",
199
+ " print(\"⚠️ No models were able to provide a response\")\n",
200
+ " \n",
201
+ " return results\n",
202
+ "\n",
203
+ "# Get responses from all available models\n",
204
+ "model_responses = run_prompt_on_available_models(prompt)\n",
205
+ "\n",
206
+ "# Display the results\n",
207
+ "for model, answer in model_responses.items():\n",
208
+ " display(Markdown(f\"## Response from {model}\\n\\n{answer}\"))"
209
+ ]
210
+ },
211
+ {
212
+ "cell_type": "markdown",
213
+ "metadata": {},
214
+ "source": [
215
+ "<b>Sythesize answers from all models into one</b>\n",
216
+ "</br>\n",
217
+ "<b>- - - - - - - - - - - - - - - -</b>"
218
+ ]
219
+ },
220
+ {
221
+ "cell_type": "code",
222
+ "execution_count": null,
223
+ "metadata": {},
224
+ "outputs": [],
225
+ "source": [
226
+ "# Create a synthesis prompt\n",
227
+ "synthesis_prompt = f\"\"\"\n",
228
+ "Here are the responses from different models:\n",
229
+ "\"\"\"\n",
230
+ "\n",
231
+ "# Add each model's response to the synthesis prompt without mentioning model names\n",
232
+ "for index, (model, response) in enumerate(model_responses.items()):\n",
233
+ " synthesis_prompt += f\"\\n--- Response {index+1} ---\\n{response}\\n\"\n",
234
+ "\n",
235
+ "synthesis_prompt += \"\"\"\n",
236
+ "Please synthesize these responses into one comprehensive answer that:\n",
237
+ "1. Captures the best insights from each response\n",
238
+ "2. Resolves any contradictions between responses\n",
239
+ "3. Presents a clear and coherent final answer\n",
240
+ "4. Maintains the same format as the original responses (numbered list format)\n",
241
+ "5.Compiles all additional places mentioned by all models \n",
242
+ "\n",
243
+ "Your synthesized response:\n",
244
+ "\"\"\"\n",
245
+ "\n",
246
+ "# Create the synthesis\n",
247
+ "if check_api_key('OPENAI_API_KEY'):\n",
248
+ " try:\n",
249
+ " openai_client = OpenAI()\n",
250
+ " synthesis_response = openai_client.chat.completions.create(\n",
251
+ " model=\"gpt-4o-mini\",\n",
252
+ " messages=[{\"role\": \"user\", \"content\": synthesis_prompt}]\n",
253
+ " )\n",
254
+ " synthesized_answer = synthesis_response.choices[0].message.content\n",
255
+ " print(\"✓ Successfully synthesized responses with gpt-4o-mini\")\n",
256
+ " \n",
257
+ " # Display the synthesized answer\n",
258
+ " display(Markdown(\"## Synthesized Answer\\n\\n\" + synthesized_answer))\n",
259
+ " except Exception as e:\n",
260
+ " print(f\"⚠️ Error synthesizing responses with gpt-4o-mini: {str(e)}\")\n",
261
+ "else:\n",
262
+ " print(\"⚠️ OpenAI API key not available, cannot synthesize responses\")"
263
+ ]
264
+ }
265
+ ],
266
+ "metadata": {
267
+ "kernelspec": {
268
+ "display_name": ".venv",
269
+ "language": "python",
270
+ "name": "python3"
271
+ },
272
+ "language_info": {
273
+ "codemirror_mode": {
274
+ "name": "ipython",
275
+ "version": 3
276
+ },
277
+ "file_extension": ".py",
278
+ "mimetype": "text/x-python",
279
+ "name": "python",
280
+ "nbconvert_exporter": "python",
281
+ "pygments_lexer": "ipython3",
282
+ "version": "3.12.10"
283
+ }
284
+ },
285
+ "nbformat": 4,
286
+ "nbformat_minor": 2
287
+ }
me/NareshRajaML_AI_Role.pdf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:715868493d15e37b27f05711fe0fd768811b5dc3d4ff75b1e979905a6067c9dc
3
+ size 163597
me/linkedin.pdf ADDED
Binary file (45.7 kB). View file
 
me/summary.txt ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Naresh Raja M L is a passionate and driven AI Engineer with a strong foundation in Artificial Intelligence, Machine Learning, Generative AI, and Computer Vision. He is currently pursuing his B.Tech in AI and Data Science at Sri Eshwar College of Engineering, maintaining an impressive CGPA of 8.3.
2
+
3
+ He actively works on impactful projects, including:
4
+
5
+ RAG-based legal and finance assistants using LangChain, LangGraph, and ChromaDB
6
+
7
+ Defect detection systems using YOLOv8, EfficientNet, and PyTorch
8
+
9
+ Generative AI tools such as few-shot SQL retrievers and multi-agent assistants with FastAPI, Whisper, and TTS
10
+
11
+ Streamlit apps for deploying real-world AI solutions with voice I/O and visual results
12
+
13
+ Naresh is deeply committed to mastering core AI concepts like LLMs, Transformers, Agentic AI, and RAG pipelines. He has hands-on experience with tools like OpenCV, TensorFlow, LangChain, MySQL, and Docker.
14
+
15
+ He is self-motivated, explores new technologies consistently, prefers hands-on learning, and can dedicate 20+ hours per week to upskilling. Whether it’s preparing for interviews, writing educational guides, or deploying production-ready AI apps, Naresh is always ready to take on new challenges and innovate with purpose.
16
+
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ requests
2
+ python-dotenv
3
+ gradio
4
+ pypdf
5
+ openai
6
+ openai-agents