diff --git a/templates/agents/with_langgraph/.env.example b/templates/agents/with_langgraph/.env.example new file mode 100644 index 0000000..7435310 --- /dev/null +++ b/templates/agents/with_langgraph/.env.example @@ -0,0 +1,17 @@ +# For tools +CB_CONN_STRING=couchbase://localhost +CB_USERNAME=Administrator +CB_PASSWORD=password + +# For agent catalog +AGENT_CATALOG_CONN_STRING=couchbase://localhost +AGENT_CATALOG_USERNAME=Administrator +AGENT_CATALOG_PASSWORD=password +AGENT_CATALOG_BUCKET=travel-sample + +# In case of capella instance or if secure connection is required +# replace couchbase with couchbases in AGENT_CATALOG_CONN_STRING and add the following +# AGENT_CATALOG_CONN_ROOT_CERTIFICATE=/path/to/cluster/root/certificate/on/local/system + +OPENAI_API_KEY=... +SERPAPI_KEY=... \ No newline at end of file diff --git a/templates/agents/with_langgraph/.gitignore b/templates/agents/with_langgraph/.gitignore new file mode 100644 index 0000000..7932c86 --- /dev/null +++ b/templates/agents/with_langgraph/.gitignore @@ -0,0 +1,7 @@ +.agent-catalog +.agent-activity +.data +.model-cache +__pycache__ +.env +poetry.lock \ No newline at end of file diff --git a/templates/agents/with_langgraph/README.md b/templates/agents/with_langgraph/README.md new file mode 100644 index 0000000..81ac7fd --- /dev/null +++ b/templates/agents/with_langgraph/README.md @@ -0,0 +1,130 @@ +# A Research Agent + +This directory contains a starter project for building agents with Couchbase, Langgraph, and Agent Catalog. + +## Getting Started + +### Running Your Agent + +1. Make sure you have Python 3.12 and [Poetry](https://python-poetry.org/docs/#installation) installed! +2. Clone this repository and navigate to this directory (we will assume all subsequent commands are run from here). + + ```bash + git clone https://github.com/couchbaselabs/agent-catalog + cd templates/agents/with_langgraph + ``` + +3. Agent Catalog uses Git for its versioning. + Run the command below to initialize a new Git repository within the `templates/agents/with_langgraph` directory. + + ```bash + git init + git add * ; git add .gitignore .env.example + git commit -m "Initial commit" + ``` + +4. Installing anaconda. + We recommend using Anaconda to create a virtual environment for your project to ensure no global dependencies interfere with the project. + + [Click here](https://docs.conda.io/projects/conda/en/latest/user-guide/install/index.html) for installation steps. + + Once anaconda or any of its distribution is installed, execute the following commands to active the environment. + + ```bash + conda create -n research-agent python=3.12 + + conda activate research-agent + ``` + +5. Install this project with Poetry. We recommend using Anaconda to create a virtual environment for your project to ensure no global dependencies interfere with the project. + + ```bash + poetry install + ``` + +6. Run `agentc` to make sure this project has installed correctly (note that your first run will take a couple of + seconds as certain packages need to be compiled, subsequent runs will be faster). + + ```bash + Usage: agentc [OPTIONS] COMMAND [ARGS]... + + The Couchbase Agent Catalog command line tool. + + Options: + -c, --catalog DIRECTORY Directory of the local catalog files. [default: .agent-catalog] + -a, --activity DIRECTORY Directory of the local activity files (runtime data). [default: .agent-activity] + -v, --verbose Flag to enable verbose output. [default: 0; 0<=x<=2] + -i, --interactive / -ni, --no-interactive + Flag to enable interactive mode. [default: i] + --help Show this message and exit. + + Commands: + add Interactively create a new tool or prompt and save it to the filesystem (output). + clean Delete all agent catalog related files / collections. + env Return all agentc related environment and configuration parameters as a JSON object. + execute Search and execute a specific tool. + find Find items from the catalog based on a natural language QUERY string or by name. + index Walk the source directory trees (SOURCE_DIRS) to index source files into the local catalog. + publish Upload the local catalog to a Couchbase instance. + status Show the status of the local catalog. + version Show the current version of agentc. + + See: https://docs.couchbase.com or https://couchbaselabs.github.io/agent-catalog/index.html# for more information. + ``` + +7. Make sure your Git repo is clean, and run `agentc index` to index your tools and prompts. + Note that `tools` and `prompts` are _relative paths_ to the `tools` and `prompts` folder. + + ```bash + agentc index tools prompts + ``` + + The command will subsequently crawl the `tools` and `prompts` folder for both tools and prompts. + + _Hint: if you've made changes but want to keep the same commit ID for the later "publish" step, use + `git add $MY_FILES` followed by `git commit --amend`!_ + +8. Start up a Couchbase instance. + + 1. For those interested in using a local Couchbase instance, see + [here](https://docs.couchbase.com/server/current/install/install-intro.html). + 2. For those interested in using Couchbase within a Docker container, run the command below: + + ```bash + mkdir -p .data/couchbase + docker run -d --name my_couchbase \ + -p 8091-8096:8091-8096 -p 11210-11211:11210-11211 \ + -v "$(pwd)/.data/couchbase:/opt/couchbase/var" \ + couchbase + ``` + + 3. For those interested in using Capella, see [here](https://cloud.couchbase.com/sign-up). + + This specific agent also uses the `travel-sample` bucket. + You'll need to navigate to your instance's UI (for local instances, this is on http://localhost:8091) to import + this sample bucket. + +9. Create a `.env` file using `.env.example` as a reference and tweak it according to your environment. + + ```bash + cp .env.example .env + vi .env + ``` + +10. Publish your local agent catalog to your Couchbase instance with `agentc publish`. + Your Couchbase instance details in the `.env` file will be used for authentication. + Again, this specific starter agent uses the `travel-sample` bucket. + + ```bash + agentc publish tool prompt --bucket travel-sample + ``` + +11. Run your agent! + + To start jupyter server, run the following command: + + ```bash + poetry run jupyter notebook + ``` + + Once the server is running, open the `agent.ipynb` notebook and execute it to interact with your agent. \ No newline at end of file diff --git a/templates/agents/with_langgraph/agent.ipynb b/templates/agents/with_langgraph/agent.ipynb new file mode 100644 index 0000000..c8aa126 --- /dev/null +++ b/templates/agents/with_langgraph/agent.ipynb @@ -0,0 +1,482 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9c88d73d5305b095", + "metadata": {}, + "source": [ + "## Introduction" + ] + }, + { + "cell_type": "markdown", + "id": "12cb11fca83dfe85", + "metadata": {}, + "source": [ + "Agent Catalog aims at simplifying your agent development process at scale by providing a consolidated view of tools and prompts used by agents as well as providing traceability through a logger. The logging also helps in iteratively modifying your workflow, tool, and/or prompts to ensure the best outcome from your agentic system every time.\n", + "\n", + "User guide for Agent Catalog can be found [here](https://docs.google.com/document/d/1Fv-L_Hx-ljPARH5P9EN5PMS9Nu6_VOmALKtLJoPOC20/edit?usp=sharing).\n", + "\n", + "Documentation for Agent Catalog can be found [here](https://couchbaselabs.github.io/agent-catalog/).\n" + ] + }, + { + "cell_type": "markdown", + "id": "d1b7f6df29204754", + "metadata": {}, + "source": [ + "## Setup\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "eb575122ff85ec49", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-22T04:58:07.489191Z", + "start_time": "2025-01-22T04:58:07.477561Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import dotenv\n", + "\n", + "dotenv.load_dotenv(dotenv.find_dotenv(usecwd=True))" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "initial_id", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-22T04:58:19.906547Z", + "start_time": "2025-01-22T04:58:19.904243Z" + } + }, + "outputs": [], + "source": [ + "import getpass\n", + "import os\n", + "\n", + "\n", + "def _set_if_undefined(var: str):\n", + " if os.environ.get(var) is None:\n", + " os.environ[var] = getpass.getpass(f\"Please provide your {var}\")\n", + "\n", + "\n", + "_set_if_undefined(\"OPENAI_API_KEY\")" + ] + }, + { + "cell_type": "markdown", + "id": "f6a6bd010246e2e6", + "metadata": {}, + "source": [ + "## Create graph" + ] + }, + { + "cell_type": "markdown", + "id": "67c3b0df53c6c5f8", + "metadata": {}, + "source": [ + "### Setup provider and auditor\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b0e7425e7b169ceb", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-22T04:58:23.290561Z", + "start_time": "2025-01-22T04:58:21.626496Z" + } + }, + "outputs": [], + "source": [ + "import agentc\n", + "\n", + "from langchain_core.tools import tool\n", + "from pydantic import SecretStr\n", + "\n", + "provider = agentc.Provider(\n", + " decorator=lambda t: tool(t.func),\n", + " secrets={\n", + " \"CB_CONN_STRING\": SecretStr(os.getenv(\"CB_CONN_STRING\")),\n", + " \"CB_USERNAME\": SecretStr(os.getenv(\"CB_USERNAME\")),\n", + " \"CB_PASSWORD\": SecretStr(os.getenv(\"CB_PASSWORD\")),\n", + " },\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "24d8687086c9bcaa", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-22T04:58:24.793805Z", + "start_time": "2025-01-22T04:58:23.926259Z" + } + }, + "outputs": [], + "source": [ + "# Initialising the auditor to track the agents' thought processes\n", + "auditor = agentc.Auditor(agent_name=\"Sample Research Agent\")" + ] + }, + { + "cell_type": "markdown", + "id": "54e8c2d2bc7ef64", + "metadata": {}, + "source": [ + "### Create nodes" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "d56e6c7ef94b68c2", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-22T04:58:26.718999Z", + "start_time": "2025-01-22T04:58:25.791986Z" + } + }, + "outputs": [], + "source": [ + "from agentc.langchain import audit\n", + "from langchain_core.messages import BaseMessage\n", + "from langchain_openai.chat_models import ChatOpenAI\n", + "from langgraph.graph import END\n", + "from langgraph.prebuilt import create_react_agent\n", + "\n", + "llm = ChatOpenAI(model=\"gpt-4o\", openai_api_key=os.environ[\"OPENAI_API_KEY\"], temperature=0)\n", + "\n", + "\n", + "def get_next_node(last_message: BaseMessage, goto: str):\n", + " if \"FINAL ANSWER\" in last_message.content:\n", + " # Any agent decided the work is done\n", + " return END\n", + " return goto" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "ef3fd973987d232a", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-22T04:58:27.581068Z", + "start_time": "2025-01-22T04:58:27.578558Z" + } + }, + "outputs": [], + "source": [ + "from langchain_core.messages import HumanMessage\n", + "from langgraph.graph import MessagesState\n", + "from langgraph.types import Command\n", + "from typing import Literal" + ] + }, + { + "cell_type": "markdown", + "id": "a0f361da3040d9ec", + "metadata": {}, + "source": [ + "#### Research agent and node" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "36dddec1dc5cbf94", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-22T04:58:29.332526Z", + "start_time": "2025-01-22T04:58:29.172215Z" + } + }, + "outputs": [], + "source": [ + "research_agent = create_react_agent(\n", + " model=audit(llm, session=\"doc\", auditor=auditor),\n", + " tools=provider.get_item(name=\"web_search\", item_type=\"tool\"),\n", + " state_modifier=provider.get_item(name=\"sampleapp_system_instructions\", item_type=\"prompt\").prompt.render(\n", + " suffix=\"You can only do research. You are working with a chart generator colleague.\"\n", + " ),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "49b39848ebcf95d5", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-22T04:58:31.041516Z", + "start_time": "2025-01-22T04:58:31.039351Z" + } + }, + "outputs": [], + "source": [ + "def research_node(\n", + " state: MessagesState,\n", + ") -> Command[Literal[\"chart_generator\", END]]:\n", + " result = research_agent.invoke(state)\n", + " goto = get_next_node(result[\"messages\"][-1], \"chart_generator\")\n", + " result[\"messages\"][-1] = HumanMessage(content=result[\"messages\"][-1].content, name=\"researcher\")\n", + " return Command(\n", + " update={\n", + " # share internal message history of research agent with other agents\n", + " \"messages\": result[\"messages\"],\n", + " },\n", + " goto=goto,\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "898bbf190accd75", + "metadata": {}, + "source": [ + "#### Charting agent and node" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "204063da79c472a8", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-22T04:58:33.560167Z", + "start_time": "2025-01-22T04:58:33.412265Z" + } + }, + "outputs": [], + "source": [ + "chart_agent = create_react_agent(\n", + " model=audit(llm, session=\"doc\", auditor=auditor),\n", + " tools=provider.get_item(name=\"repl_tool\", item_type=\"tool\"),\n", + " state_modifier=provider.get_item(name=\"sampleapp_system_instructions\", item_type=\"prompt\").prompt.render(\n", + " suffix=\"You can only generate charts. You are working with a researcher colleague.\"\n", + " ),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "fd21c71c0c7d1442", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-22T04:58:35.654095Z", + "start_time": "2025-01-22T04:58:35.651792Z" + } + }, + "outputs": [], + "source": [ + "def chart_node(state: MessagesState) -> Command[Literal[\"researcher\", END]]:\n", + " result = chart_agent.invoke(state)\n", + " goto = get_next_node(result[\"messages\"][-1], \"researcher\")\n", + " result[\"messages\"][-1] = HumanMessage(content=result[\"messages\"][-1].content, name=\"chart_generator\")\n", + " return Command(\n", + " update={\n", + " # share internal message history of chart agent with other agents\n", + " \"messages\": result[\"messages\"],\n", + " },\n", + " goto=goto,\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "8434bccb9918d4e", + "metadata": {}, + "source": [ + "### Create graph" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "826ac8719323985c", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-22T04:58:37.416731Z", + "start_time": "2025-01-22T04:58:37.412948Z" + } + }, + "outputs": [], + "source": [ + "from langgraph.graph import START\n", + "from langgraph.graph import StateGraph\n", + "\n", + "workflow = StateGraph(MessagesState)\n", + "workflow.add_node(\"researcher\", research_node)\n", + "workflow.add_node(\"chart_generator\", chart_node)\n", + "\n", + "workflow.add_edge(START, \"researcher\")\n", + "graph = workflow.compile()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "981f9a270032c622", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-22T04:58:39.874752Z", + "start_time": "2025-01-22T04:58:39.342524Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from IPython.display import Image\n", + "from IPython.display import display\n", + "\n", + "display(Image(graph.get_graph().draw_mermaid_png()))" + ] + }, + { + "cell_type": "markdown", + "id": "a6edce19e0d8dcb9", + "metadata": {}, + "source": [ + "### Invoke agents" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "d11e6005a218026d", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-22T05:06:18.102622Z", + "start_time": "2025-01-22T05:06:00.800900Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "First, get the UK's GDP over the past 5 years, then give a brief summary of it along with a pie chart. Once you make the chart, finish.\n", + "----\n", + "Sorry, need more steps to process this request.\n", + "----\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Python REPL can execute arbitrary code. Use with caution.\n" + ] + }, + { + "data": { + "image/png": "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E5wRERHK9178rF9++eUe70TR8n3p7KPtz0UoLy9XtpGLiopSthYUP3+xQ01H39Oe1C+2JhTPCfF8EL9f4usQ/160aNFhtYrdXhISEpz33Xdfj742Il+kEf+RHTqJiPyZWF9PtCaL1ifRIkaeJcajiiVvxLjZjtbyI1IDBj4iIi8guo9Fl7nomiXPEt3mYmJKT7YyJPJVDHxEREREKsdZukREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEREREQqx8BHREREpHIMfEQ+6LHHHsPo0aMREhKC2NhYTJ8+HTt27Gh3jMViwU033YSoqCgEBwfjvPPOQ1FRUev9GzZswMUXX4wBAwbAbDYjOzsbs2bNaneOn376CePGjVPOIY7JysrCs88+67Gvk4iIXEPvovMQkQetWLFCCXMi9NlsNtxzzz2YMmUKtm7diqCgIOWYO+64A0uXLsXChQsRFhaGm2++Geeeey5Wrlyp3L927VolLM6dO1cJfatWrcJ1110HnU6nHCuIc4n/P/LII5X/FwHwb3/7m/L/4lgiIvINGqfT6ZRdBBH1T0lJiRLeRBCcMGECqqqqEBMTg3nz5uH8889Xjtm+fbvSird69WqMGTOmw/OIELlt2zZ89913nV5LhEYR+N599123fT1ERORa7NIlUgER8ITIyMjW1rumpiZMnjy59RjRHZuSkqIEvq7O03KOjqxbt05pCTzxxBNdWj8REbkXu3SJfJzD4cDtt9+ujLUbPny4clthYSGMRiPCw8PbHRsXF6fc1xER5N5//32lG/hQycnJSiui6D5+8MEHcc0117jpqyEiIndg4CPycaIbdvPmzcr4ur4Sj582bRoe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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "First, get the UK's GDP over the past 5 years, then give a brief summary of it along with a pie chart. Once you make the chart, finish.\n", + "----\n", + "Sorry, need more steps to process this request.\n", + "----\n", + "FINAL ANSWER\n", + "\n", + "Here is a summary of the UK's GDP over the past 5 years along with a pie chart:\n", + "\n", + "- **2019**: $2.85 trillion\n", + "- **2020**: $2.70 trillion\n", + "- **2021**: $3.03 trillion\n", + "- **2022**: $3.14 trillion\n", + "- **2023**: $3.38 trillion\n", + "\n", + "The pie chart below represents the distribution of the UK's GDP from 2019 to 2023:\n", + "\n", + "![UK GDP Distribution (2019-2023)](attachment://uk_gdp_pie_chart.png)\n", + "----\n" + ] + } + ], + "source": [ + "events = graph.stream(\n", + " {\n", + " \"messages\": [\n", + " (\n", + " \"user\",\n", + " \"First, get the UK's GDP over the past 5 years, then give a brief summary of it along with a pie chart. \"\n", + " \"Once you make the chart, finish.\",\n", + " )\n", + " ],\n", + " },\n", + " # Maximum number of steps to take in the graph\n", + " {\"recursion_limit\": 10},\n", + ")\n", + "\n", + "for event in events:\n", + " for key in event:\n", + " for msg in event[key][\"messages\"]:\n", + " if isinstance(msg, HumanMessage):\n", + " print(msg.content)\n", + " print(\"----\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.12.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/templates/agents/with_langgraph/prompts/system_instructions.jinja b/templates/agents/with_langgraph/prompts/system_instructions.jinja new file mode 100644 index 0000000..34c1509 --- /dev/null +++ b/templates/agents/with_langgraph/prompts/system_instructions.jinja @@ -0,0 +1,16 @@ +--- +record_kind: jinja_prompt + +name: sampleapp_system_instructions + +description: > + System instructions for AI assistant responsible for collaborating with other assistants + +--- +You are a helpful AI assistant, collaborating with other assistants. +Use the provided tools to progress towards answering the question. +If you are unable to fully answer, that's OK, another assistant with different tools +will help where you left off. Execute what you can to make progress. +If you or any of the other assistants have the final answer or deliverable, +prefix your response with FINAL ANSWER so the team knows to stop. +{{ suffix }} \ No newline at end of file diff --git a/templates/agents/with_langgraph/pyproject.toml b/templates/agents/with_langgraph/pyproject.toml new file mode 100644 index 0000000..c629f04 --- /dev/null +++ b/templates/agents/with_langgraph/pyproject.toml @@ -0,0 +1,36 @@ +[tool.poetry] +name = "research-agent" +version = "0.1.0" +description = "Research agent application built using Couchbase Agent Catalog." +repository = "https://github.com/couchbaselabs/agent-catalog" +authors = [ + "Tanvi Johari ", + "Thejas N U " +] +readme = "README.md" +package-mode = false + +[tool.poetry.dependencies] +python = "^3.12" +python-dotenv = "^1.0.1" +couchbase = "^4.3.0" +# For Google search +serpapi = "^0.1.5" +google_search_results = "^2.4.2" +# For graphs +ipython = "^8.27.0" +langgraph = "^0.2.52" +langchain-community = "^0.3.10" +langchain-experimental = "^0.3.3" +matplotlib = "^3.9.3" +jupyter = "^1.1.1" +ipykernel = "^6.29.5" + +[tool.poetry.dependencies.agentc] +path = "../../../libs/agentc" +extras = ["langchain"] +develop = true + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" \ No newline at end of file diff --git a/templates/agents/with_langgraph/tools/repl_tool.py b/templates/agents/with_langgraph/tools/repl_tool.py new file mode 100644 index 0000000..c787bae --- /dev/null +++ b/templates/agents/with_langgraph/tools/repl_tool.py @@ -0,0 +1,17 @@ +from agentc import tool +from langchain_experimental.utilities import PythonREPL + + +@tool +def repl_tool(code: str) -> str: + """Tool to execute python code""" + + repl = PythonREPL() + try: + result = repl.run(code) + except BaseException as e: + return f"Failed to execute. Error: {repr(e)}" + + result_str = f"Successfully executed:\n```python\n{code}\n```\nStdout: {result}" + + return result_str + "\n\nIf you have completed all tasks, respond with FINAL ANSWER." diff --git a/templates/agents/with_langgraph/tools/web_search.py b/templates/agents/with_langgraph/tools/web_search.py new file mode 100644 index 0000000..9b018a3 --- /dev/null +++ b/templates/agents/with_langgraph/tools/web_search.py @@ -0,0 +1,17 @@ +import os + +from agentc import tool +from serpapi import GoogleSearch + +serpapi_params = {"engine": "google", "api_key": os.getenv("SERPAPI_KEY")} + + +@tool() +def web_search(query: str) -> str: + """Finds general knowledge information using Google search. Can also be used + to augment more 'general' knowledge to a previous specialist query.""" + + search = GoogleSearch({**serpapi_params, "q": query, "num": 5}) + results = search.get_dict()["organic_results"] + contexts = "\n---\n".join(["\n".join([x["title"], x["snippet"], x["link"]]) for x in results]) + return contexts