diff --git a/Exercises/Exercise_Graph5.ipynb b/Exercises/Exercise_Graph5.ipynb index 5e519f4..74af67b 100644 --- a/Exercises/Exercise_Graph5.ipynb +++ b/Exercises/Exercise_Graph5.ipynb @@ -2,101 +2,95 @@ "cells": [ { "cell_type": "code", - "execution_count": 23, + "execution_count": 25, "id": "af02ff61", "metadata": {}, "outputs": [], "source": [ - "from langgraph.graph import StateGraph, END\n", - "import random\n", - "from typing import Dict, List, TypedDict" + "from typing import TypedDict, List\n", + "from langgraph.graph import StateGraph, START, END\n", + "from random import randint\n", + "import random" ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 26, "id": "44d6b90d", "metadata": {}, "outputs": [], "source": [ - "class GameState(TypedDict):\n", + "class AgentState(TypedDict):\n", " player_name: str\n", - " target_number: int\n", " guesses: List[int]\n", " attempts: int\n", - " hint: str\n", + " upper_bound: int\n", " lower_bound: int \n", - " upper_bound: int " + " target_number: int\n", + " hint: str" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "id": "4f376365", "metadata": {}, "outputs": [], "source": [ - "def setup_node(state: GameState) -> GameState:\n", - " \"\"\"Initialize the game with a random target number\"\"\"\n", + "def setup_node(state:AgentState) -> AgentState:\n", + " \"\"\" \n", + " Initialize the game with a random target number\n", + " \"\"\"\n", " state[\"player_name\"] = f\"Welcome, {state['player_name']}!\"\n", - " state[\"target_number\"] = random.randint(1, 20)\n", + " state[\"target_number\"] = randint(state[\"lower_bound\"], state[\"upper_bound\"])\n", " state[\"guesses\"] = []\n", " state[\"attempts\"] = 0\n", " state[\"hint\"] = \"Game started! Try to guess the number.\"\n", - " state[\"lower_bound\"] = 1 \n", - " state[\"upper_bound\"] = 20 \n", - " print(f\"{state['player_name']} The game has begun. I'm thinking of a number between 1 and 20.\")\n", - " return state" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2208b483", - "metadata": {}, - "outputs": [], - "source": [ - "def guess_node(state: GameState) -> GameState:\n", - " \"\"\"Generate a smarter guess based on previous hints\"\"\"\n", - " \n", - " possible_guesses = [i for i in range(state[\"lower_bound\"], state[\"upper_bound\"] + 1) if i not in state[\"guesses\"]]\n", + " print(f\"{state['player_name']} The game has begun. I'm thinking of a number between {state['lower_bound']} and {state['upper_bound']}.\")\n", + " return state\n", + "\n", + "def guess_node(state:AgentState) -> AgentState:\n", + " \"\"\" \n", + " Generate a smarter guess based on previous hints\n", + " \"\"\"\n", + " possible_guesses = [i for i in range(state[\"lower_bound\"],state[\"upper_bound\"]+1) if i not in state[\"guesses\"]]\n", " if possible_guesses:\n", " guess = random.choice(possible_guesses)\n", " else:\n", - " \n", - " guess = random.randint(state[\"lower_bound\"], state[\"upper_bound\"])\n", + " raise Exception(\"Sorry, there is an error in the logic.\")\n", " \n", - " state[\"guesses\"].append(guess)\n", - " state[\"attempts\"] += 1\n", + " state['guesses'].append(guess)\n", + " state['attempts'] += 1\n", " print(f\"Attempt {state['attempts']}: Guessing {guess} (Current range: {state['lower_bound']}-{state['upper_bound']})\")\n", " return state" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "id": "6e207d50", "metadata": {}, "outputs": [], "source": [ - "def hint_node(state: GameState) -> GameState:\n", - " \"\"\"Here we provide a hint based on the last guess and update the bounds\"\"\"\n", + "def hint_node(state:AgentState) -> AgentState:\n", + " \"\"\" \n", + " Here we provide a hint based on the last guess and update the bounds\n", + " \"\"\"\n", " latest_guess = state[\"guesses\"][-1]\n", - " target = state[\"target_number\"]\n", " \n", - " if latest_guess < target:\n", + " if latest_guess < state[\"target_number\"]:\n", " state[\"hint\"] = f\"The number {latest_guess} is too low. Try higher!\"\n", " \n", - " state[\"lower_bound\"] = max(state[\"lower_bound\"], latest_guess + 1)\n", + " state[\"lower_bound\"] = latest_guess + 1\n", " print(f\"Hint: {state['hint']}\")\n", " \n", - " elif latest_guess > target:\n", + " elif latest_guess > state[\"target_number\"]:\n", " state[\"hint\"] = f\"The number {latest_guess} is too high. Try lower!\"\n", " \n", - " state[\"upper_bound\"] = min(state[\"upper_bound\"], latest_guess - 1)\n", + " state[\"upper_bound\"] = latest_guess - 1\n", " print(f\"Hint: {state['hint']}\")\n", " else:\n", - " state[\"hint\"] = f\"Correct! You found the number {target} in {state['attempts']} attempts.\"\n", + " state[\"hint\"] = f\"Correct! You found the number {state['target_number']} in {state['attempts']} attempts.\"\n", " print(f\"Success! {state['hint']}\")\n", " \n", " return state" @@ -104,13 +98,15 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "id": "8a3ba030", "metadata": {}, "outputs": [], "source": [ - "def should_continue(state: GameState) -> str:\n", - " \"\"\"Determine if we should continue guessing or end the game\"\"\"\n", + "def should_continue(state: AgentState) -> str:\n", + " \"\"\"\n", + " Determine if we should continue guessing or end the game\n", + " \"\"\"\n", " \n", " # There are 2 end conditions - either 7 is reached or the correct number is guessed\n", " \n", @@ -128,43 +124,40 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "id": "03142071", "metadata": {}, "outputs": [], "source": [ - "graph = StateGraph(GameState)\n", - "graph.add_node(\"setup\", setup_node)\n", - "graph.add_node(\"guess\", guess_node)\n", - "graph.add_node(\"hint_node\", hint_node) \n", - "\n", + "graph = StateGraph(AgentState)\n", "\n", - "graph.add_edge(\"setup\", \"guess\")\n", - "graph.add_edge(\"guess\", \"hint_node\") \n", + "graph.add_node(\"setup\",setup_node)\n", + "graph.add_node(\"guess\",guess_node)\n", + "graph.add_node(\"hint_node\", hint_node)\n", "\n", + "graph.add_edge(\"setup\",\"guess\")\n", + "graph.add_edge(\"guess\",\"hint_node\")\n", + "graph.set_entry_point(\"setup\")\n", "\n", - "graph.add_conditional_edges(\n", - " \"hint_node\", \n", - " should_continue,\n", - " {\n", - " \"continue\": \"guess\",\n", - " \"end\": END\n", - " }\n", - ")\n", + "graph.add_conditional_edges(source = \"hint_node\",\n", + " path = should_continue,\n", + " path_map= {\n", + " \"end\":END,\n", + " \"continue\":\"guess\" \n", + " })\n", "\n", - "graph.set_entry_point(\"setup\")\n", "app = graph.compile()" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 31, "id": "cacf5547", "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "" ] @@ -180,7 +173,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 32, "id": "d611d3c0", "metadata": {}, "outputs": [ @@ -189,37 +182,32 @@ "output_type": "stream", "text": [ "Welcome, Student! The game has begun. I'm thinking of a number between 1 and 20.\n", - "Attempt 1: Guessing 11 (Current range: 1-20)\n", - "Hint: The number 11 is too high. Try lower!\n", + "Attempt 1: Guessing 2 (Current range: 1-20)\n", + "Hint: The number 2 is too low. Try higher!\n", "CONTINUING: 1/7 attempts used\n", - "Attempt 2: Guessing 8 (Current range: 1-10)\n", - "Hint: The number 8 is too low. Try higher!\n", + "Attempt 2: Guessing 3 (Current range: 3-20)\n", + "Hint: The number 3 is too low. Try higher!\n", "CONTINUING: 2/7 attempts used\n", - "Attempt 3: Guessing 9 (Current range: 9-10)\n", - "Hint: The number 9 is too low. Try higher!\n", + "Attempt 3: Guessing 6 (Current range: 4-20)\n", + "Hint: The number 6 is too high. Try lower!\n", "CONTINUING: 3/7 attempts used\n", - "Attempt 4: Guessing 10 (Current range: 10-10)\n", - "Success! Correct! You found the number 10 in 4 attempts.\n", + "Attempt 4: Guessing 5 (Current range: 4-5)\n", + "Hint: The number 5 is too high. Try lower!\n", + "CONTINUING: 4/7 attempts used\n", + "Attempt 5: Guessing 4 (Current range: 4-4)\n", + "Success! Correct! You found the number 4 in 5 attempts.\n", "GAME OVER: Number found!\n" ] } ], "source": [ - "result = app.invoke({\"player_name\": \"Student\", \"guesses\": [], \"attempts\": 0, \"lower_bound\": 1, \"upper_bound\": 20})" + "result = app.invoke({\"player_name\": \"Student\", \"lower_bound\": 1, \"upper_bound\": 20})" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dc92fcb8", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { "kernelspec": { - "display_name": "myenv", + "display_name": ".venv", "language": "python", "name": "python3" }, @@ -233,7 +221,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.6" + "version": "3.11.6" } }, "nbformat": 4,