File size: 63,308 Bytes
e6583bf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 92,
   "id": "f342f56f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "from typing import Optional\n",
    "from pydantic import BaseModel, HttpUrl, ValidationError\n",
    "from IPython.display import Image, display\n",
    "from langgraph.graph import END, StateGraph\n",
    "from langchain_community.document_loaders import SeleniumURLLoader\n",
    "from langchain_huggingface import ChatHuggingFace, HuggingFaceEndpoint\n",
    "from langchain.prompts import PromptTemplate\n",
    "from dotenv import load_dotenv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "id": "41a233ae",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "load_dotenv('../.env')  # Load environment variables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "id": "11d2a6f2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# ----------------------------\n",
    "# State definition\n",
    "# ----------------------------\n",
    "class WebSearchState(BaseModel):\n",
    "    url: Optional[HttpUrl] = None\n",
    "    content: Optional[str] = None\n",
    "    summary: Optional[str] = None\n",
    "\n",
    "# Default URL to use initially\n",
    "DEFAULT_URL = \"https://www.mdpi.com/2076-3417/11/20/9772\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "id": "bafa9ce6",
   "metadata": {},
   "outputs": [],
   "source": [
    "def search_node(state: WebSearchState) -> dict:\n",
    "    # If URL already in state, summarize it first\n",
    "    if state.url:\n",
    "        print(f\"[Search] Using existing URL: {state.url}\")\n",
    "        return {\"url\": str(state.url)}\n",
    "\n",
    "    # Prompt user for URL with default shown\n",
    "    user_input = input(f\"🔗 Please enter a URL to summarize [default: {DEFAULT_URL}]: \").strip()\n",
    "    url_input = user_input if user_input else DEFAULT_URL\n",
    "\n",
    "    # Validate URL\n",
    "    try:\n",
    "        validated_state = WebSearchState(url=url_input)\n",
    "    except ValidationError as e:\n",
    "        raise ValueError(f\"❌ Invalid URL: {e}\")\n",
    "\n",
    "    print(f\"[Search] Using URL: {validated_state.url}\")\n",
    "    return {\"url\": str(validated_state.url)}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "id": "5de07a81",
   "metadata": {},
   "outputs": [],
   "source": [
    "# ----------------------------\n",
    "# 2. Load Webpage Node\n",
    "# ----------------------------\n",
    "def load_node(state: WebSearchState) -> dict:\n",
    "    # Limit content length to ~100,000 characters (≈ 32,000 tokens max)\n",
    "    MAX_CHARS = 30000\n",
    "    url = state.url\n",
    "    if not url:\n",
    "        return {\"content\": \"No URL to load\"}\n",
    "    loader = SeleniumURLLoader(urls=[str(url)])\n",
    "    docs = loader.load()\n",
    "    content = docs[0].page_content if docs else \"No content loaded\"\n",
    "    # Truncate early to prevent overload later\n",
    "    truncated_content = content[:MAX_CHARS]\n",
    "    print(f\"[Load] Loaded {len(truncated_content)} characters\")\n",
    "    return {\"content\": content}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "id": "ffa2a1a0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# ----------------------------\n",
    "# 3. Summarize Node\n",
    "# ----------------------------\n",
    "# loadding Huggingface token\n",
    "HUGGINGFACEHUB_API_TOKEN = os.getenv(\"HUGGINGFACEHUB_API_TOKEN\")\n",
    "repo_id = \"mistralai/Mistral-7B-Instruct-v0.3\"\n",
    "model_kwargs = {\"temperature\": 0.1, \n",
    "                \"max_new_tokens\": 100, # Maximum tokens to generate\n",
    "                \"timeout\": 6000}\n",
    "\n",
    "llm = HuggingFaceEndpoint(\n",
    "    repo_id=repo_id,\n",
    "    huggingfacehub_api_token=HUGGINGFACEHUB_API_TOKEN,\n",
    "    **model_kwargs\n",
    ")\n",
    "chat_model = ChatHuggingFace(llm=llm)\n",
    "\n",
    "WRITER_PROMPT = \"\"\"\n",
    "You are an expert summarizer with 20 years of experience.\n",
    "Read the following webpage content \n",
    "carefully and produce a detailed \n",
    "but concise summary that captures key points clearly.\n",
    "\n",
    "Webpage content:\n",
    "{content}\n",
    "\n",
    "Summary:\n",
    "\"\"\"\n",
    "prompt = PromptTemplate.from_template(WRITER_PROMPT)\n",
    "summarize_chain = prompt | chat_model\n",
    "\n",
    "def summarize_node(state: WebSearchState) -> dict:\n",
    "    if not state.content:\n",
    "        return {\"summary\": \"No content to summarize\"}\n",
    "    result = summarize_chain.invoke({\"content\": state.content})\n",
    "    result = result.content\n",
    "    print(\"[Summarize] Done\")\n",
    "    # print(result)\n",
    "    return {\"summary\": result}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "id": "ea51e28d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# ----------------------------\n",
    "# LangGraph Construction\n",
    "# ----------------------------\n",
    "builder = StateGraph(WebSearchState)\n",
    "builder.add_node(\"search\", search_node)\n",
    "builder.add_node(\"load\", load_node)\n",
    "builder.add_node(\"summarize\", summarize_node)\n",
    "\n",
    "builder.set_entry_point(\"search\")\n",
    "builder.add_edge(\"search\", \"load\")\n",
    "builder.add_edge(\"load\", \"summarize\")\n",
    "builder.add_edge(\"summarize\", END)\n",
    "\n",
    "graph = builder.compile()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "id": "39b02b00",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def graph_visualiser(graph):\n",
    "    try:\n",
    "        display(Image(graph.get_graph().draw_mermaid_png()))\n",
    "    except Exception as e:\n",
    "        print(e)\n",
    "\n",
    "graph_visualiser(graph=graph)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "id": "47efdcd7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--- Generating summary for default URL ---\n",
      "[Search] Using existing URL: https://www.mdpi.com/2076-3417/11/20/9772\n",
      "[Load] Loaded 30000 characters\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\DANNY\\AppData\\Local\\Temp\\ipykernel_9704\\1414824205.py:8: PydanticDeprecatedSince20: The `parse_obj` method is deprecated; use `model_validate` instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.11/migration/\n",
      "  final_state_model = WebSearchState.parse_obj(final_state)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[Summarize] Done\n",
      "\n",
      "URL: https://www.mdpi.com/2076-3417/11/20/9772\n",
      "SUMMARY:\n",
      "  The article discusses the design of a gas cyclone using a hybrid particle swarm optimization (PSO) algorithm. The research aims to simplify complex mathematical models and the sensitivity approach for gas cyclone design with the use of an objective function, which is of the minimization type. The process makes use of the initial population generated by the DE algorithm, and the stopping criterion of DE is set as the fitness value. When the fitness value is not less than the current global best, the DE population is taken over by PSO. For each iteration, the new velocity and position are updated in every generation until the optimal solution is achieved. The hybrid DEPSO method first reduces the search space using the DE algorithm, and then the obtained populations are used as the initial population by the PSO to achieve a fast convergence rate to a final global optimum. The proposed DEPSO method is compared to PSO and DE algorithms, and it is found that DEPSO solves the issue of premature convergence in PSO by utilizing the crossover operator of DE to improve the distribution of information between candidate solutions. The optimized cyclone geometry, using PSO, DE, and hybrid DEPSO algorithms, is shown, and it is concluded that DEPSO had a better cost value but lower efficiency compared to PSO and DE algorithms. The research received no external funding and the authors declare no conflict of interest.\n",
      "\n",
      "Keywords:\n",
      "  - particle swarm optimization (PSO)\n",
      "  - differential evolution (DE)\n",
      "  - gas cyclone\n",
      "  - hybridised particle swarm optimization\n",
      "  - evolutionary algorithm\n",
      "\n",
      "References:\n",
      "  - Kennedy, J.; Eberhart, R. Particle Swarm Optimization. In Proceedings of the IEEE international Conference on Neural Networks, Perth, WA, Australia, 27 November–1 December 1995; Volume 4, pp. 1942–1948.\n",
      "  - Storn, R.; Price, K. Differential Evolution—A Simple and Efficient Heuristic for global Optimization over Continuous Spaces. J. Glob. Optim. 1997, 11, 341–359.\n",
      "  - Liu, J.; Lampinen, J. On setting the control parameter of the differential evolution method. In Proceedings of the 8th International Conference on Soft Computing (MENDEL’02), Brno, Czech Republic, 8–10 June 2002; pp. 11–18.\n",
      "  - Tang, Y.; Gao, H.; Zou, W.; Kurths, J. Identifying controlling nodes in neuronal networks in different scales. PLoS ONE 2012, 7, e41375.\n",
      "  - Storn, R. Differential evolution design of an IIR-filter. In Proceedings of the 1996 IEEE International Conference on Evolutionary Computation (ICEC’96), Nagoya, Japan, 20–22 May 1996; pp. 268–273.\n",
      "  - Varadarajan, M.; Swarup, K. Differential evolution approach for optimal reactive power dispatch. Appl. Soft Comput. 2008, 8, 1549–1561.\n",
      "  - Mallipeddi, R.; Suganthan, P.N. Differential evolution algorithm with ensemble of parameters and mutation and crossover strategies. In Proceedings of the Swarm Evolutionary and Memetic Computing Conference, Chennai, India, 16–18 December 2010; pp. 71–78.\n",
      "  - Brest, J.; Greiner, S.; Bôskovi’c, B.; Mernik, M.; Zumer, V. Self-adapting control parameters in differential evolution: A comparative study on numerical benchmark problems. IEEE Trans. Evol. Comput. 2006, 10, 646–657.\n",
      "  - Yang, Z.; Tang, K.; Yao, X. Self-adaptive differential evolution with neighborhood search. In Proceedings of the IEEE Congress on Evolutionary Computation (CEC’08), Hong Kong, China, 1–6 June 2008; pp. 1110–1116.\n",
      "  - Zhang, J.; Sanderson, A.C. JADE: Adaptive Differential Evolution with Optional External Archive. In IEEE Transactions on Evolutionary Computation; IEEE: Manhattan, NY, USA, 2009; Volume 13, pp. 945–958.\n",
      "  - Pant, M.; Thangaraj, R.; Abraham, A. DE-PSO: A new hybrid meta-heuristic for solving global optimization problems. Electr. Power Syst. Res. 2004, 70, 203–210.\n",
      "  - Talbi, H.; Batouche, M. Hybrid particle swarm with differential evolution for multimodal image registration. In Proceedings of the IEEE International Conference on Industrial Technology (ICIT ‘04), Hammamet, Tunisia, 1 December 2004; pp. 1567–1572.\n",
      "  - Omran, M.G.H.; Engelbrecht, A.P.; Salman, A. Differential evolution based particle swarm optimization. In Proceedings of the IEEE Swarm Intelligence Symposium (SIS ‘07), Honolulu, HI, USA, 1–5 April 2007; pp. 112–119.\n",
      "  - Hao, Z.F.; Guo, G.H.; Huang, H. A particle swarm optimization algorithm with differential evolution. In Proceedings of the 6th International Conference on Machine Learning and Cybernetics (ICMLC ‘07), Hong Kong, China, 19–22 August 2007; pp. 1031–1035.\n",
      "  - Wang, L. Theoretical Study of Cyclone Design. Ph.D. Thesis, Texas A&M University, College Station, TX, USA, 2004. Available online: https://core.ac.uk/download/pdf/147123938.pdf (accessed on 2 October 2021).\n",
      "  - Mao, B.; Xie, Z.; Wang, Y.; Handroos, H.; Wu, H. A Hybrid Strategy of Differential Evolution and Modified Particle Swarm Optimization for Numerical Solution of a Parallel Manipulator. Math. Probl. Eng. 2018, 2018, 1–9.\n",
      "  - Wang, L.; Parnell, C.B.; Shaw, B.W. 1D2D, 1D3D, 2D2D cyclone fractional efficiency curves for fine dust. In Proceedings of the 2000 Beltwide Cotton Conferences, San Antonio, TX, USA, 4−8 January 2000.\n",
      "  - Wang, L.; Parnell, C.B.; Shaw, B.W. A New Theoretical Approach for Predicting Number of Turns and Cyclone Pressure Drop; ASAE: Washington, DC, USA; St. Joseph, MI, USA, 2001.\n",
      "  - Wang, L.; Parnell, C.B.; Oemler, J.A.; Shaw, B.W.; Lacey, R.E. Analysis of Cyclone Collection Efficiency; ASAE: Washington, DC, USA; St. Joseph, MI, USA, 2003.\n",
      "  - Lapple, C.E. Processes use many collector types. Chem. Eng. 1951, 58, 144–151.\n",
      "  - Müller, P.K.S.; Airaghi, S.; Marchetto, J. Optimization algorithms based on a model of bacterial chemotaxis. In From Animals to Animats 6: Proceedings of the Sixth International Conference on Simulation of Adaptive Behavior, 1st ed.; A Bradford Book: London, UK, 2000; pp. 375–384. Available online: https://direct.mit.edu/books/book/4493/From-Animals-to-Animats-6Proceedings-of-the-Sixth (accessed on 2 October 2021).\n",
      "  - Passino, K.M. Biomimicry of bacterial foraging for distributed optimization and control. IEEE Control. Syst. Mag. 2002, 22, 52–67.\n",
      "  - Karaboga, D.; Basturk, B. Artificial Bee Colony (ABC) optimization algorithm\n",
      "Exiting. Goodbye!\n",
      "[Search] Using existing URL: https://www.geeksforgeeks.org/machine-learning/getting-started-with-transformers/\n",
      "[Load] Loaded 30000 characters\n"
     ]
    },
    {
     "ename": "HfHubHTTPError",
     "evalue": "402 Client Error: Payment Required for url: https://router.huggingface.co/together/v1/chat/completions (Request ID: Root=1-686fdd94-63190e1c129ec1a04138b33e;4cdc7b66-a1fe-4e32-901f-ee8dc7eb98c7)\n\nYou have exceeded your monthly included credits for Inference Providers. Subscribe to PRO to get 20x more monthly included credits.",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mHTTPError\u001b[0m                                 Traceback (most recent call last)",
      "File \u001b[1;32mc:\\Users\\DANNY\\Desktop\\llmai\\llm_deep\\Lib\\site-packages\\huggingface_hub\\utils\\_http.py:409\u001b[0m, in \u001b[0;36mhf_raise_for_status\u001b[1;34m(response, endpoint_name)\u001b[0m\n\u001b[0;32m    408\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 409\u001b[0m     \u001b[43mresponse\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mraise_for_status\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m    410\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m HTTPError \u001b[38;5;28;01mas\u001b[39;00m e:\n",
      "File \u001b[1;32mc:\\Users\\DANNY\\Desktop\\llmai\\llm_deep\\Lib\\site-packages\\requests\\models.py:1024\u001b[0m, in \u001b[0;36mResponse.raise_for_status\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m   1023\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m http_error_msg:\n\u001b[1;32m-> 1024\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m HTTPError(http_error_msg, response\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m)\n",
      "\u001b[1;31mHTTPError\u001b[0m: 402 Client Error: Payment Required for url: https://router.huggingface.co/together/v1/chat/completions",
      "\nThe above exception was the direct cause of the following exception:\n",
      "\u001b[1;31mHfHubHTTPError\u001b[0m                            Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[100], line 25\u001b[0m\n\u001b[0;32m     22\u001b[0m         \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid URL entered: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00me\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m     23\u001b[0m         \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[1;32m---> 25\u001b[0m final_state \u001b[38;5;241m=\u001b[39m \u001b[43mgraph\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\u001b[43muser_state\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m     26\u001b[0m final_state_model \u001b[38;5;241m=\u001b[39m WebSearchState\u001b[38;5;241m.\u001b[39mparse_obj(final_state)\n\u001b[0;32m     27\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124mURL:\u001b[39m\u001b[38;5;124m\"\u001b[39m, final_state_model\u001b[38;5;241m.\u001b[39murl)\n",
      "File \u001b[1;32mc:\\Users\\DANNY\\Desktop\\llmai\\llm_deep\\Lib\\site-packages\\langgraph\\pregel\\__init__.py:2823\u001b[0m, in \u001b[0;36mPregel.invoke\u001b[1;34m(self, input, config, stream_mode, output_keys, interrupt_before, interrupt_after, checkpoint_during, debug, **kwargs)\u001b[0m\n\u001b[0;32m   2820\u001b[0m chunks: \u001b[38;5;28mlist\u001b[39m[Union[\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any], Any]] \u001b[38;5;241m=\u001b[39m []\n\u001b[0;32m   2821\u001b[0m interrupts: \u001b[38;5;28mlist\u001b[39m[Interrupt] \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m-> 2823\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m   2824\u001b[0m \u001b[43m    \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m   2825\u001b[0m \u001b[43m    \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m   2826\u001b[0m \u001b[43m    \u001b[49m\u001b[43mstream_mode\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream_mode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m   2827\u001b[0m \u001b[43m    \u001b[49m\u001b[43moutput_keys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_keys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m   2828\u001b[0m \u001b[43m    \u001b[49m\u001b[43minterrupt_before\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minterrupt_before\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m   2829\u001b[0m \u001b[43m    \u001b[49m\u001b[43minterrupt_after\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minterrupt_after\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m   2830\u001b[0m \u001b[43m    \u001b[49m\u001b[43mcheckpoint_during\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcheckpoint_during\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m   2831\u001b[0m \u001b[43m    \u001b[49m\u001b[43mdebug\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdebug\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m   2832\u001b[0m \u001b[43m    \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m   2833\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[0;32m   2834\u001b[0m \u001b[43m    \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mstream_mode\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m==\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mvalues\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\n\u001b[0;32m   2835\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m   2836\u001b[0m \u001b[43m            \u001b[49m\u001b[38;5;28;43misinstance\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mdict\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m   2837\u001b[0m \u001b[43m            \u001b[49m\u001b[38;5;129;43;01mand\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[43mints\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m:=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[43mINTERRUPT\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\n\u001b[0;32m   2838\u001b[0m \u001b[43m        \u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n",
      "File \u001b[1;32mc:\\Users\\DANNY\\Desktop\\llmai\\llm_deep\\Lib\\site-packages\\langgraph\\pregel\\__init__.py:2461\u001b[0m, in \u001b[0;36mPregel.stream\u001b[1;34m(self, input, config, stream_mode, output_keys, interrupt_before, interrupt_after, checkpoint_during, debug, subgraphs)\u001b[0m\n\u001b[0;32m   2455\u001b[0m     \u001b[38;5;66;03m# Similarly to Bulk Synchronous Parallel / Pregel model\u001b[39;00m\n\u001b[0;32m   2456\u001b[0m     \u001b[38;5;66;03m# computation proceeds in steps, while there are channel updates.\u001b[39;00m\n\u001b[0;32m   2457\u001b[0m     \u001b[38;5;66;03m# Channel updates from step N are only visible in step N+1\u001b[39;00m\n\u001b[0;32m   2458\u001b[0m     \u001b[38;5;66;03m# channels are guaranteed to be immutable for the duration of the step,\u001b[39;00m\n\u001b[0;32m   2459\u001b[0m     \u001b[38;5;66;03m# with channel updates applied only at the transition between steps.\u001b[39;00m\n\u001b[0;32m   2460\u001b[0m     \u001b[38;5;28;01mwhile\u001b[39;00m loop\u001b[38;5;241m.\u001b[39mtick(input_keys\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39minput_channels):\n\u001b[1;32m-> 2461\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43m_\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrunner\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtick\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m   2462\u001b[0m \u001b[43m            \u001b[49m\u001b[43mloop\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtasks\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalues\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m   2463\u001b[0m \u001b[43m            \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstep_timeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m   2464\u001b[0m \u001b[43m            \u001b[49m\u001b[43mretry_policy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mretry_policy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m   2465\u001b[0m \u001b[43m            \u001b[49m\u001b[43mget_waiter\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mget_waiter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m   2466\u001b[0m \u001b[43m        \u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[0;32m   2467\u001b[0m \u001b[43m            \u001b[49m\u001b[38;5;66;43;03m# emit output\u001b[39;49;00m\n\u001b[0;32m   2468\u001b[0m \u001b[43m            \u001b[49m\u001b[38;5;28;43;01myield from\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43moutput\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m   2469\u001b[0m \u001b[38;5;66;03m# emit output\u001b[39;00m\n",
      "File \u001b[1;32mc:\\Users\\DANNY\\Desktop\\llmai\\llm_deep\\Lib\\site-packages\\langgraph\\pregel\\runner.py:153\u001b[0m, in \u001b[0;36mPregelRunner.tick\u001b[1;34m(self, tasks, reraise, timeout, retry_policy, get_waiter)\u001b[0m\n\u001b[0;32m    151\u001b[0m t \u001b[38;5;241m=\u001b[39m tasks[\u001b[38;5;241m0\u001b[39m]\n\u001b[0;32m    152\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 153\u001b[0m     \u001b[43mrun_with_retry\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m    154\u001b[0m \u001b[43m        \u001b[49m\u001b[43mt\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    155\u001b[0m \u001b[43m        \u001b[49m\u001b[43mretry_policy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    156\u001b[0m \u001b[43m        \u001b[49m\u001b[43mconfigurable\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m{\u001b[49m\n\u001b[0;32m    157\u001b[0m \u001b[43m            \u001b[49m\u001b[43mCONFIG_KEY_CALL\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mpartial\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m    158\u001b[0m \u001b[43m                \u001b[49m\u001b[43m_call\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    159\u001b[0m \u001b[43m                \u001b[49m\u001b[43mweakref\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mref\u001b[49m\u001b[43m(\u001b[49m\u001b[43mt\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    160\u001b[0m \u001b[43m                \u001b[49m\u001b[43mretry\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mretry_policy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    161\u001b[0m \u001b[43m                \u001b[49m\u001b[43mfutures\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mweakref\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mref\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfutures\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    162\u001b[0m \u001b[43m                \u001b[49m\u001b[43mschedule_task\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mschedule_task\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    163\u001b[0m \u001b[43m                \u001b[49m\u001b[43msubmit\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msubmit\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    164\u001b[0m \u001b[43m                \u001b[49m\u001b[43mreraise\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreraise\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    165\u001b[0m \u001b[43m            \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    166\u001b[0m \u001b[43m        \u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    167\u001b[0m \u001b[43m    \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m    168\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcommit(t, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[0;32m    169\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n",
      "File \u001b[1;32mc:\\Users\\DANNY\\Desktop\\llmai\\llm_deep\\Lib\\site-packages\\langgraph\\pregel\\retry.py:40\u001b[0m, in \u001b[0;36mrun_with_retry\u001b[1;34m(task, retry_policy, configurable)\u001b[0m\n\u001b[0;32m     38\u001b[0m     task\u001b[38;5;241m.\u001b[39mwrites\u001b[38;5;241m.\u001b[39mclear()\n\u001b[0;32m     39\u001b[0m     \u001b[38;5;66;03m# run the task\u001b[39;00m\n\u001b[1;32m---> 40\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mtask\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mproc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtask\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minput\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m     41\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ParentCommand \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[0;32m     42\u001b[0m     ns: \u001b[38;5;28mstr\u001b[39m \u001b[38;5;241m=\u001b[39m config[CONF][CONFIG_KEY_CHECKPOINT_NS]\n",
      "File \u001b[1;32mc:\\Users\\DANNY\\Desktop\\llmai\\llm_deep\\Lib\\site-packages\\langgraph\\utils\\runnable.py:623\u001b[0m, in \u001b[0;36mRunnableSeq.invoke\u001b[1;34m(self, input, config, **kwargs)\u001b[0m\n\u001b[0;32m    621\u001b[0m     \u001b[38;5;66;03m# run in context\u001b[39;00m\n\u001b[0;32m    622\u001b[0m     \u001b[38;5;28;01mwith\u001b[39;00m set_config_context(config, run) \u001b[38;5;28;01mas\u001b[39;00m context:\n\u001b[1;32m--> 623\u001b[0m         \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[43mcontext\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstep\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m    624\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m    625\u001b[0m     \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m step\u001b[38;5;241m.\u001b[39minvoke(\u001b[38;5;28minput\u001b[39m, config)\n",
      "File \u001b[1;32mc:\\Users\\DANNY\\Desktop\\llmai\\llm_deep\\Lib\\site-packages\\langgraph\\utils\\runnable.py:377\u001b[0m, in \u001b[0;36mRunnableCallable.invoke\u001b[1;34m(self, input, config, **kwargs)\u001b[0m\n\u001b[0;32m    375\u001b[0m         run_manager\u001b[38;5;241m.\u001b[39mon_chain_end(ret)\n\u001b[0;32m    376\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 377\u001b[0m     ret \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m    378\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrecurse \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(ret, Runnable):\n\u001b[0;32m    379\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m ret\u001b[38;5;241m.\u001b[39minvoke(\u001b[38;5;28minput\u001b[39m, config)\n",
      "Cell \u001b[1;32mIn[97], line 35\u001b[0m, in \u001b[0;36msummarize_node\u001b[1;34m(state)\u001b[0m\n\u001b[0;32m     33\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m state\u001b[38;5;241m.\u001b[39mcontent:\n\u001b[0;32m     34\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msummary\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNo content to summarize\u001b[39m\u001b[38;5;124m\"\u001b[39m}\n\u001b[1;32m---> 35\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43msummarize_chain\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcontent\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mstate\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcontent\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m     36\u001b[0m result \u001b[38;5;241m=\u001b[39m result\u001b[38;5;241m.\u001b[39mcontent\n\u001b[0;32m     37\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m[Summarize] Done\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
      "File \u001b[1;32mc:\\Users\\DANNY\\Desktop\\llmai\\llm_deep\\Lib\\site-packages\\langchain_core\\runnables\\base.py:3034\u001b[0m, in \u001b[0;36mRunnableSequence.invoke\u001b[1;34m(self, input, config, **kwargs)\u001b[0m\n\u001b[0;32m   3032\u001b[0m                 \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m context\u001b[38;5;241m.\u001b[39mrun(step\u001b[38;5;241m.\u001b[39minvoke, \u001b[38;5;28minput\u001b[39m, config, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m   3033\u001b[0m             \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 3034\u001b[0m                 \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m context\u001b[38;5;241m.\u001b[39mrun(step\u001b[38;5;241m.\u001b[39minvoke, \u001b[38;5;28minput\u001b[39m, config)\n\u001b[0;32m   3035\u001b[0m \u001b[38;5;66;03m# finish the root run\u001b[39;00m\n\u001b[0;32m   3036\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n",
      "File \u001b[1;32mc:\\Users\\DANNY\\Desktop\\llmai\\llm_deep\\Lib\\site-packages\\langchain_core\\language_models\\chat_models.py:370\u001b[0m, in \u001b[0;36mBaseChatModel.invoke\u001b[1;34m(self, input, config, stop, **kwargs)\u001b[0m\n\u001b[0;32m    358\u001b[0m \u001b[38;5;129m@override\u001b[39m\n\u001b[0;32m    359\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\n\u001b[0;32m    360\u001b[0m     \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m    365\u001b[0m     \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[0;32m    366\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m BaseMessage:\n\u001b[0;32m    367\u001b[0m     config \u001b[38;5;241m=\u001b[39m ensure_config(config)\n\u001b[0;32m    368\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m cast(\n\u001b[0;32m    369\u001b[0m         \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mChatGeneration\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m--> 370\u001b[0m         \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgenerate_prompt\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m    371\u001b[0m \u001b[43m            \u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_convert_input\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    372\u001b[0m \u001b[43m            \u001b[49m\u001b[43mstop\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    373\u001b[0m \u001b[43m            \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcallbacks\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    374\u001b[0m \u001b[43m            \u001b[49m\u001b[43mtags\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mtags\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    375\u001b[0m \u001b[43m            \u001b[49m\u001b[43mmetadata\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmetadata\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    376\u001b[0m \u001b[43m            \u001b[49m\u001b[43mrun_name\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mrun_name\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    377\u001b[0m \u001b[43m            \u001b[49m\u001b[43mrun_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpop\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mrun_id\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    378\u001b[0m \u001b[43m            \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    379\u001b[0m \u001b[43m        \u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mgenerations[\u001b[38;5;241m0\u001b[39m][\u001b[38;5;241m0\u001b[39m],\n\u001b[0;32m    380\u001b[0m     )\u001b[38;5;241m.\u001b[39mmessage\n",
      "File \u001b[1;32mc:\\Users\\DANNY\\Desktop\\llmai\\llm_deep\\Lib\\site-packages\\langchain_core\\language_models\\chat_models.py:947\u001b[0m, in \u001b[0;36mBaseChatModel.generate_prompt\u001b[1;34m(self, prompts, stop, callbacks, **kwargs)\u001b[0m\n\u001b[0;32m    938\u001b[0m \u001b[38;5;129m@override\u001b[39m\n\u001b[0;32m    939\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mgenerate_prompt\u001b[39m(\n\u001b[0;32m    940\u001b[0m     \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m    944\u001b[0m     \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[0;32m    945\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m LLMResult:\n\u001b[0;32m    946\u001b[0m     prompt_messages \u001b[38;5;241m=\u001b[39m [p\u001b[38;5;241m.\u001b[39mto_messages() \u001b[38;5;28;01mfor\u001b[39;00m p \u001b[38;5;129;01min\u001b[39;00m prompts]\n\u001b[1;32m--> 947\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgenerate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprompt_messages\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcallbacks\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[1;32mc:\\Users\\DANNY\\Desktop\\llmai\\llm_deep\\Lib\\site-packages\\langchain_core\\language_models\\chat_models.py:766\u001b[0m, in \u001b[0;36mBaseChatModel.generate\u001b[1;34m(self, messages, stop, callbacks, tags, metadata, run_name, run_id, **kwargs)\u001b[0m\n\u001b[0;32m    763\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(input_messages):\n\u001b[0;32m    764\u001b[0m     \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m    765\u001b[0m         results\u001b[38;5;241m.\u001b[39mappend(\n\u001b[1;32m--> 766\u001b[0m             \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_generate_with_cache\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m    767\u001b[0m \u001b[43m                \u001b[49m\u001b[43mm\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    768\u001b[0m \u001b[43m                \u001b[49m\u001b[43mstop\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    769\u001b[0m \u001b[43m                \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_managers\u001b[49m\u001b[43m[\u001b[49m\u001b[43mi\u001b[49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrun_managers\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[0;32m    770\u001b[0m \u001b[43m                \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m    771\u001b[0m \u001b[43m            \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m    772\u001b[0m         )\n\u001b[0;32m    773\u001b[0m     \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m    774\u001b[0m         \u001b[38;5;28;01mif\u001b[39;00m run_managers:\n",
      "File \u001b[1;32mc:\\Users\\DANNY\\Desktop\\llmai\\llm_deep\\Lib\\site-packages\\langchain_core\\language_models\\chat_models.py:1012\u001b[0m, in \u001b[0;36mBaseChatModel._generate_with_cache\u001b[1;34m(self, messages, stop, run_manager, **kwargs)\u001b[0m\n\u001b[0;32m   1010\u001b[0m     result \u001b[38;5;241m=\u001b[39m generate_from_stream(\u001b[38;5;28miter\u001b[39m(chunks))\n\u001b[0;32m   1011\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m inspect\u001b[38;5;241m.\u001b[39msignature(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_generate)\u001b[38;5;241m.\u001b[39mparameters\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrun_manager\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[1;32m-> 1012\u001b[0m     result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_generate\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m   1013\u001b[0m \u001b[43m        \u001b[49m\u001b[43mmessages\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\n\u001b[0;32m   1014\u001b[0m \u001b[43m    \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m   1015\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m   1016\u001b[0m     result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_generate(messages, stop\u001b[38;5;241m=\u001b[39mstop, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n",
      "File \u001b[1;32mc:\\Users\\DANNY\\Desktop\\llmai\\llm_deep\\Lib\\site-packages\\langchain_huggingface\\chat_models\\huggingface.py:574\u001b[0m, in \u001b[0;36mChatHuggingFace._generate\u001b[1;34m(self, messages, stop, run_manager, stream, **kwargs)\u001b[0m\n\u001b[0;32m    567\u001b[0m     message_dicts, params \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_create_message_dicts(messages, stop)\n\u001b[0;32m    568\u001b[0m     params \u001b[38;5;241m=\u001b[39m {\n\u001b[0;32m    569\u001b[0m         \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstop\u001b[39m\u001b[38;5;124m\"\u001b[39m: stop,\n\u001b[0;32m    570\u001b[0m         \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mparams,\n\u001b[0;32m    571\u001b[0m         \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m({\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstream\u001b[39m\u001b[38;5;124m\"\u001b[39m: stream} \u001b[38;5;28;01mif\u001b[39;00m stream \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m {}),\n\u001b[0;32m    572\u001b[0m         \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs,\n\u001b[0;32m    573\u001b[0m     }\n\u001b[1;32m--> 574\u001b[0m     answer \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mllm\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mclient\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mchat_completion\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmessages\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmessage_dicts\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mparams\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m    575\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_create_chat_result(answer)\n\u001b[0;32m    576\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n",
      "File \u001b[1;32mc:\\Users\\DANNY\\Desktop\\llmai\\llm_deep\\Lib\\site-packages\\huggingface_hub\\inference\\_client.py:923\u001b[0m, in \u001b[0;36mInferenceClient.chat_completion\u001b[1;34m(self, messages, model, stream, frequency_penalty, logit_bias, logprobs, max_tokens, n, presence_penalty, response_format, seed, stop, stream_options, temperature, tool_choice, tool_prompt, tools, top_logprobs, top_p, extra_body)\u001b[0m\n\u001b[0;32m    895\u001b[0m parameters \u001b[38;5;241m=\u001b[39m {\n\u001b[0;32m    896\u001b[0m     \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmodel\u001b[39m\u001b[38;5;124m\"\u001b[39m: payload_model,\n\u001b[0;32m    897\u001b[0m     \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfrequency_penalty\u001b[39m\u001b[38;5;124m\"\u001b[39m: frequency_penalty,\n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m    914\u001b[0m     \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m(extra_body \u001b[38;5;129;01mor\u001b[39;00m {}),\n\u001b[0;32m    915\u001b[0m }\n\u001b[0;32m    916\u001b[0m request_parameters \u001b[38;5;241m=\u001b[39m provider_helper\u001b[38;5;241m.\u001b[39mprepare_request(\n\u001b[0;32m    917\u001b[0m     inputs\u001b[38;5;241m=\u001b[39mmessages,\n\u001b[0;32m    918\u001b[0m     parameters\u001b[38;5;241m=\u001b[39mparameters,\n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m    921\u001b[0m     api_key\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtoken,\n\u001b[0;32m    922\u001b[0m )\n\u001b[1;32m--> 923\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_inner_post\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest_parameters\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m    925\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m stream:\n\u001b[0;32m    926\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m _stream_chat_completion_response(data)  \u001b[38;5;66;03m# type: ignore[arg-type]\u001b[39;00m\n",
      "File \u001b[1;32mc:\\Users\\DANNY\\Desktop\\llmai\\llm_deep\\Lib\\site-packages\\huggingface_hub\\inference\\_client.py:279\u001b[0m, in \u001b[0;36mInferenceClient._inner_post\u001b[1;34m(self, request_parameters, stream)\u001b[0m\n\u001b[0;32m    276\u001b[0m         \u001b[38;5;28;01mraise\u001b[39;00m InferenceTimeoutError(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInference call timed out: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mrequest_parameters\u001b[38;5;241m.\u001b[39murl\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merror\u001b[39;00m  \u001b[38;5;66;03m# type: ignore\u001b[39;00m\n\u001b[0;32m    278\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 279\u001b[0m     \u001b[43mhf_raise_for_status\u001b[49m\u001b[43m(\u001b[49m\u001b[43mresponse\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m    280\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m response\u001b[38;5;241m.\u001b[39miter_lines() \u001b[38;5;28;01mif\u001b[39;00m stream \u001b[38;5;28;01melse\u001b[39;00m response\u001b[38;5;241m.\u001b[39mcontent\n\u001b[0;32m    281\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m HTTPError \u001b[38;5;28;01mas\u001b[39;00m error:\n",
      "File \u001b[1;32mc:\\Users\\DANNY\\Desktop\\llmai\\llm_deep\\Lib\\site-packages\\huggingface_hub\\utils\\_http.py:482\u001b[0m, in \u001b[0;36mhf_raise_for_status\u001b[1;34m(response, endpoint_name)\u001b[0m\n\u001b[0;32m    478\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m _format(HfHubHTTPError, message, response) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01me\u001b[39;00m\n\u001b[0;32m    480\u001b[0m \u001b[38;5;66;03m# Convert `HTTPError` into a `HfHubHTTPError` to display request information\u001b[39;00m\n\u001b[0;32m    481\u001b[0m \u001b[38;5;66;03m# as well (request id and/or server error message)\u001b[39;00m\n\u001b[1;32m--> 482\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m _format(HfHubHTTPError, \u001b[38;5;28mstr\u001b[39m(e), response) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01me\u001b[39;00m\n",
      "\u001b[1;31mHfHubHTTPError\u001b[0m: 402 Client Error: Payment Required for url: https://router.huggingface.co/together/v1/chat/completions (Request ID: Root=1-686fdd94-63190e1c129ec1a04138b33e;4cdc7b66-a1fe-4e32-901f-ee8dc7eb98c7)\n\nYou have exceeded your monthly included credits for Inference Providers. Subscribe to PRO to get 20x more monthly included credits.",
      "\u001b[0mDuring task with name 'summarize' and id 'ca8d9b22-54c9-a9e6-e4d3-512d5d9c7d2f'"
     ]
    }
   ],
   "source": [
    "# ----------------------------\n",
    "# Run It\n",
    "# ----------------------------\n",
    "# Run once with default URL to get initial summary\n",
    "print(\"\\n--- Generating summary for default URL ---\")\n",
    "initial_state = WebSearchState(url=DEFAULT_URL)\n",
    "final_state = graph.invoke(initial_state)\n",
    "final_state_model = WebSearchState.parse_obj(final_state)\n",
    "print(\"\\nURL:\", final_state_model.url)\n",
    "print(\"SUMMARY:\\n\", final_state_model.summary)\n",
    "\n",
    "\n",
    "# Now prompt user to enter a new URL or leave blank to keep previous summary\n",
    "while True:\n",
    "    user_input = input(\"\\nEnter a new URL to summarize or press Enter to exit: \").strip()\n",
    "    if not user_input:\n",
    "        print(\"Exiting. Goodbye!\")\n",
    "        break\n",
    "    try:\n",
    "        user_state = WebSearchState(url=user_input)\n",
    "    except ValidationError as e:\n",
    "        print(f\"Invalid URL entered: {e}\")\n",
    "        continue\n",
    "\n",
    "final_state = graph.invoke(user_state)\n",
    "final_state_model = WebSearchState.parse_obj(final_state)\n",
    "print(\"\\nURL:\", final_state_model.url)\n",
    "print(\"SUMMARY:\\n\", final_state_model.summary)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}