{ "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": [ "" ] }, "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 }