From 59b4282adb71de49dc256ec99d63d0ca18323c1a Mon Sep 17 00:00:00 2001 From: Kurtis Van Gent <31518063+kurtisvg@users.noreply.github.com> Date: Wed, 5 Feb 2025 21:01:54 -0700 Subject: [PATCH] chore: update README and move to docs site (#273) Updates the README and pushes doc site changes. --- .hugo/hugo.toml | 11 +- README.md | 200 ++++++++---------- architecture.png | Bin 26047 -> 0 bytes docs/en/_index.md | 7 +- docs/en/about/_index.md | 2 +- docs/en/concepts/overview.md | 6 - docs/en/getting-started/configure.md | 82 +++++++ docs/en/getting-started/introduction.md | 10 - .../en/getting-started/introduction/_index.md | 122 +++++++++++ .../introduction/architecture.png | Bin 0 -> 44850 bytes docs/en/getting-started/local_quickstart.md | 2 +- 11 files changed, 310 insertions(+), 132 deletions(-) delete mode 100644 architecture.png delete mode 100644 docs/en/concepts/overview.md create mode 100644 docs/en/getting-started/configure.md delete mode 100644 docs/en/getting-started/introduction.md create mode 100644 docs/en/getting-started/introduction/_index.md create mode 100644 docs/en/getting-started/introduction/architecture.png diff --git a/.hugo/hugo.toml b/.hugo/hugo.toml index 2fd2553ce..ead807161 100644 --- a/.hugo/hugo.toml +++ b/.hugo/hugo.toml @@ -39,7 +39,10 @@ enableRobotsTXT = true sidebar_menu_compact = false [[menu.main]] - name = "GitHub" - weight = 50 - url = "/~https://github.com/googleapis/genai-toolbox" - pre = "" \ No newline at end of file + name = "GitHub" + weight = 50 + url = "/~https://github.com/googleapis/genai-toolbox" + pre = "" + +[markup.goldmark.renderer] + unsafe= true \ No newline at end of file diff --git a/README.md b/README.md index 98d5e227b..162934e16 100644 --- a/README.md +++ b/README.md @@ -1,72 +1,93 @@ -![toolbox_logo](logo.png) -# 🧰 Toolbox +# 🧰 Gen AI Toolbox for Databases -> [!CAUTION] -> Toolbox is experimental and not an official Google product. This is -> an early access project, intended to be shared under NDA to gather feedback -> validate direction. You should not share or discuss this project with anyone -> not under NDA. +> [!NOTE] +> Gen AI Toolbox for Databases is currently in beta, and may see breaking +> changes until the first stable release (v1.0). -Toolbox is an open source server that enables developers to build -production-grade, agent-based generative AI applications that connect to -databases via tools. It enables you to create database-focused tools -easier, faster, and more securely by handling the complexities around +Gen AI Toolbox for Databases is an open source server that makes it easier to +build Gen AI tools for interacting with databases. It enables you to develop +tools easier, faster, and more securely by handling the complexities such as connection pooling, authentication, and more. -Toolbox also helps simplifies the management of your tools by allowing you to -add, remove, or update tools without necessarily redeploying your application. -It sits between your application's orchestration framework (such as LangChain -and LlamaIndex) and your database, providing a control plane that is used to -modify, distribute, and invoke tools. - -![architecture](architecture.png) +This README provides a brief overview. For comprehensive details, see the full +[documentation](https://vigilant-guacamole-plnwrm9.pages.github.io/). ## Table of Contents +- [Why Toolbox?](#why-toolbox) +- [General Architecture](#general-architecture) - [Getting Started](#getting-started) - - [Installing the server](#installing-the-server) - - [Running the server](#running-the-server) - - [Using with Client SDKs](#using-with-client-sdks) + - [Installing the server](#installing-the-server) + - [Running the server](#running-the-server) + - [Integrating your application](#integrating-your-application) - [Configuration](#configuration) - - [Sources](#sources) - - [Tools](#tools) - - [Toolsets](#toolsets) + - [Sources](#sources) + - [Tools](#tools) + - [Toolsets](#toolsets) - [Versioning](#versioning) - [Contributing](#contributing) + +## Why Toolbox? + +Toolbox helps you build Gen AI tools that let your agents access data in your +database. Toolbox provides: +- **Simplified development**: Integrate tools to your agent in less than 10 +- lines of code, reuse tools between multiple agents or frameworks, and deploy + new versions of tools more easily. +- **Better performance**: Best practices such as connection pooling, + authentication, and more. +- **Enhanced security**: Integrated auth for more secure access to your data +- **End-to-end observability**: Out of the box metrics and tracing with built-in + support for OpenTelemetry. + + +## General Architecture + +Toolbox sits between your application's orchestration framework and your +database, providing a control plane that is used to modify, distribute, or +invoke tools. It simplifies the management of your tools by providing you with a +centralized location to store and update tools, allowing you to share tools +between agents and applications and update those tools without necessarily +redeploying your application. + +![architecture](./docs/en/getting-started/introduction/architecture.png) + ## Getting Started ### Installing the server - For the latest version, check the [releases page][releases] and use the following instructions for your OS and CPU architecture. +[releases]: /~https://github.com/googleapis/genai-toolbox/releases +
Binary -[releases]: /~https://github.com/googleapis/genai-toolbox/releases +To install Toolbox as a binary: ```sh # see releases page for other versions -curl -O https://storage.googleapis.com/genai-toolbox/v0.0.1/linux/amd64/toolbox +export VERSION=0.1.0 +curl -O https://storage.googleapis.com/genai-toolbox/v$VERSION/linux/amd64/toolbox chmod +x toolbox ```
-Container Images +Container image You can also install Toolbox as a container: ```sh # see releases page for other versions -export VERSION=0.0.1 +export VERSION=0.1.0 docker pull us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:$VERSION ``` @@ -76,14 +97,13 @@ docker pull us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:$VERSION Compile from source To install from source, ensure you have the latest version of -[Go installed](https://go.dev/doc/install). +[Go installed](https://go.dev/doc/install), and then run the following command: ```sh -go install github.com/googleapis/genai-toolbox@v0.0.1 +go install github.com/googleapis/genai-toolbox@v0.1.0 ```
- ### Running the server @@ -98,11 +118,10 @@ You can use `toolbox help` for a full list of flags! To stop the server, send a terminate signal (`ctrl+c` on most platforms). For more detailed documentation on deploying to different environments, check -out the following in the `/docs/deploy` folder: +out the resources in the [How-to +section](https://vigilant-guacamole-plnwrm9.pages.github.io/how-to/) -- [Cloud Run](./docs/deploy/deploy_toolbox.md). - -### Using with Client SDKs +### Integrating your application Once your server is up and running, you can load the tools into your application. See below the list of Client SDKs for using various frameworks: @@ -133,10 +152,12 @@ For more detailed instructions on using the Toolbox LangChain, see the ## Configuration -You can configure what tools are available by updating the `tools.yaml` file. If -you have multiple files, you can tell toolbox which to load with the -`--tools_file tools.yaml` flag. +The primary way to configure Toolbox is through the `tools.yaml` file. If you +have multiple files, you can tell toolbox which to load with the `--tools_file +tools.yaml` flag. +You can find more detailed reference documentation to all resource types in the +[Resources](https://vigilant-guacamole-plnwrm9.pages.github.io/resources/). ### Sources The `sources` section of your `tools.yaml` defines what data sources your @@ -145,70 +166,39 @@ execute against. ```yaml sources: - # This tool kind has some requirements. - # See /~https://github.com/googleapis/genai-toolbox/blob/main/docs/sources/cloud-sql-pg.md#requirements - my-cloud-sql-source: - kind: cloud-sql-postgres - project: my-project-id - region: us-central1 - instance: my-instance-name - user: my-user - password: my-password - database: my_db -``` - -Example for Neo4j - -```yaml -sources: - my-neo4j-source: - kind: neo4j - uri: neo4j+s://my-neo4j-host:7687 - user: neo4j - password: my-password - database: my_db + my-pg-source: + kind: postgres + host: 127.0.0.1 + port: 5432 + database: toolbox_db + user: toolbox_user + password: my-password ``` -For more details on configuring different types of sources, see the [Source -documentation.](docs/sources/README.md) +For more details on configuring different types of sources, see the +[Sources](https://vigilant-guacamole-plnwrm9.pages.github.io/resources/sources/. ### Tools -The `tools` section of your `tools.yaml` define your tools: what kind of tool it -is, which source it affects, what parameters it takes, etc. - -```yaml -tools: - get_flight_by_id: - kind: postgres-sql - source: my-cloud-sql-source - description: > - Use this tool to lookup a flight by its unique identifier. - statement: "SELECT * FROM flights WHERE id = $1" - parameters: - - name: id - type: integer - description: 'id' represents the unique ID for each flight. -``` - -Neo4j-Cypher Example +The `tools` section of your `tools.yaml` define your the actions your agent can +take: what kind of tool it is, which source(s) it affects, what parameters it +uses, etc. ```yaml tools: - get_movies_in_year: - kind: neo4j-cypher - source: my-neo4j-instance - description: > - Use this tool to list all movies titles in a given year. - statement: "MATCH (m:Movie) WHERE m.year = $year RETURN m.title" - parameters: - - name: "year" - type: integer - description: 'year' represents a 4 digit year since 1900 up to the current year + search-hotels-by-name: + kind: postgres-sql + source: my-pg-source + description: Search for hotels based on name. + parameters: + - name: name + type: string + description: The name of the hotel. + statement: SELECT * FROM hotels WHERE name ILIKE '%' || $1 || '%'; ``` -For more details on configuring different types of tools, see the [Tool -documentation.](docs/tools/README.md) +For more details on configuring different types of tools, see the +[Tools](https://vigilant-guacamole-plnwrm9.pages.github.io/resources/tools). ### Toolsets @@ -237,25 +227,17 @@ all_tools = await client.aload_toolset() my_second_toolset = await client.aload_toolset("my_second_toolset") ``` -### AuthSources - -The `authSources` section of your `tools.yaml` defines what authentication sources your -Toolbox should interact with. - -```yaml -authSources: - my-google-auth: - kind: google - clientId: YOUR_GOOGLE_CLIENT_ID -``` +## Versioning -For more details on configuring different types of sources, see the [AuthSources -documentation](docs/authSources/README.md). +This project uses [semantic versioning](https://semver.org/), including a +`MAJOR.MINOR.PATCH` version number that increments with: -## Versioning +- MAJOR version when we make incompatible API changes +- MINOR version when we add functionality in a backward compatible manner +- PATCH version when we make backward compatible bug fixes -This project uses [semantic versioning](https://semver.org/), and uses the -following lifecycle regarding support for a major version. +The public API that this applies to is the CLI associated with Toolbox, the +interactions with official SDKs, and the definitions in the `tools.yaml` file. ## Contributing diff --git a/architecture.png b/architecture.png deleted file mode 100644 index a27a85de766b0d2a9f8e56be9a9108c6d42b736e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26047 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 QH?p9pC}_x+$y$W`f5p~1$N&HU diff --git a/docs/en/_index.md b/docs/en/_index.md index 4ea04cd7f..4b801ce52 100644 --- a/docs/en/_index.md +++ b/docs/en/_index.md @@ -7,4 +7,9 @@ description: > All of Toolbox's documentation. --- -Placeholder for top-level directory. \ No newline at end of file + + + + + + \ No newline at end of file diff --git a/docs/en/about/_index.md b/docs/en/about/_index.md index 5f45068b7..0196a6979 100644 --- a/docs/en/about/_index.md +++ b/docs/en/about/_index.md @@ -3,4 +3,4 @@ title: "About" type: docs weight: 5 description: A list of other information related to Toolbox. ---- \ No newline at end of file +--- diff --git a/docs/en/concepts/overview.md b/docs/en/concepts/overview.md deleted file mode 100644 index eeb54ac17..000000000 --- a/docs/en/concepts/overview.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "Architecture" -type: docs -weight: 2 -description: An overview of Toolbox's architecture ---- diff --git a/docs/en/getting-started/configure.md b/docs/en/getting-started/configure.md new file mode 100644 index 000000000..5f102ebe0 --- /dev/null +++ b/docs/en/getting-started/configure.md @@ -0,0 +1,82 @@ +--- +title: "Configuration" +type: docs +weight: 3 +description: How to configure Toolbox's tools.yaml file. +--- + +The primary way to configure Toolbox is through the `tools.yaml` file. If you +have multiple files, you can tell toolbox which to load with the `--tools_file +tools.yaml` flag. + +You can find more detailed reference documentation to all resource types in the +[Resources](../resources/). + +### Sources + +The `sources` section of your `tools.yaml` defines what data sources your +Toolbox should have access to. Most tools will have at least one source to +execute against. + +```yaml +sources: + my-pg-source: + kind: postgres + host: 127.0.0.1 + port: 5432 + database: toolbox_db + user: toolbox_user + password: my-password +``` + +For more details on configuring different types of sources, see the +[Sources](../resources/sources/). + +### Tools + +The `tools` section of your `tools.yaml` define your the actions your agent can +take: what kind of tool it is, which source(s) it affects, what parameters it +uses, etc. + +```yaml +tools: + search-hotels-by-name: + kind: postgres-sql + source: my-pg-source + description: Search for hotels based on name. + parameters: + - name: name + type: string + description: The name of the hotel. + statement: SELECT * FROM hotels WHERE name ILIKE '%' || $1 || '%'; +``` + +For more details on configuring different types of tools, see the +[Tools](../resources/tools/). + + +### Toolsets + +The `toolsets` section of your `tools.yaml` allows you to define groups of tools +that you want to be able to load together. This can be useful for defining +different sets for different agents or different applications. + +```yaml +toolsets: + my_first_toolset: + - my_first_tool + - my_second_tool + my_second_toolset: + - my_second_tool + - my_third_tool +``` + +You can load toolsets by name: + +```python +# This will load all tools +all_tools = await client.aload_toolset() + +# This will only load the tools listed in 'my_second_toolset' +my_second_toolset = await aclient.load_toolset("my_second_toolset") +``` \ No newline at end of file diff --git a/docs/en/getting-started/introduction.md b/docs/en/getting-started/introduction.md deleted file mode 100644 index d0336eec1..000000000 --- a/docs/en/getting-started/introduction.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: "Introduction" -type: docs -weight: 1 -description: An introduction to Toolbox ---- - -# Introduction - -This is a placeholder for the introduction. \ No newline at end of file diff --git a/docs/en/getting-started/introduction/_index.md b/docs/en/getting-started/introduction/_index.md new file mode 100644 index 000000000..34a788687 --- /dev/null +++ b/docs/en/getting-started/introduction/_index.md @@ -0,0 +1,122 @@ +--- +title: "Introduction" +type: docs +weight: 1 +description: An introduction to Gen AI Toolbox for Databases. +--- + +Gen AI Toolbox for Databases is an open source server that makes it easier to +build Gen AI tools for interacting with databases. It enables you to develop +tools easier, faster, and more securely by handling the complexities such as +connection pooling, authentication, and more. + +## Why Toolbox? + +Toolbox helps you build Gen AI tools that let your agents access data in your +database. Toolbox provides: +- **Simplified development**: Integrate tools to your agent in less than 10 +- lines of code, reuse tools between multiple agents or frameworks, and deploy + new versions of tools more easily. +- **Better performance**: Best practices such as connection pooling, + authentication, and more. +- **Enhanced security**: Integrated auth for more secure access to your data +- **End-to-end observability**: Out of the box metrics and tracing with built-in + support for OpenTelemetry. + + +## General Architecture + +Toolbox sits between your application's orchestration framework and your +database, providing a control plane that is used to modify, distribute, or +invoke tools. It simplifies the management of your tools by providing you with a +centralized location to store and update tools, allowing you to share tools +between agents and applications and update those tools without necessarily +redeploying your application. + +![architecture](./architecture.png) + +## Getting Started + +### Installing the server +For the latest version, check the [releases page][releases] and use the +following instructions for your OS and CPU architecture. + +[releases]: /~https://github.com/googleapis/genai-toolbox/releases + +{{< tabpane text=true >}} +{{% tab header="Binary" lang="en" %}} + +To install Toolbox as a binary: + +```sh +# see releases page for other versions +export VERSION=0.1.0 +curl -O https://storage.googleapis.com/genai-toolbox/v$VERSION/linux/amd64/toolbox +chmod +x toolbox +``` + +{{% /tab %}} +{{% tab header="Container image" lang="en" %}} +You can also install Toolbox as a container: + +```sh +# see releases page for other versions +export VERSION=0.1.0 +docker pull us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:$VERSION +``` + +{{% /tab %}} +{{% tab header="Compile from source" lang="en" %}} + +To install from source, ensure you have the latest version of +[Go installed](https://go.dev/doc/install), and then run the following command: + +```sh +go install github.com/googleapis/genai-toolbox@v0.1.0 +``` + +{{% /tab %}} +{{< /tabpane >}} + +### Running the server + +[Configure](../configure.md) a `tools.yaml` to define your tools, and then +execute `toolbox` to start the server: + +```sh +./toolbox --tools_file "tools.yaml" +``` + +You can use `toolbox help` for a full list of flags! To stop the server, send a +terminate signal (`ctrl+c` on most platforms). + +For more detailed documentation on deploying to different environments, check +out the resources in the [How-to section](../../how-to/_index.md) + +### Integrating your application + +Once your server is up and running, you can load the tools into your +application. See below the list of Client SDKs for using various frameworks: + +{{< tabpane text=true >}} +{{% tab header="LangChain" lang="en" %}} + +Once you've installed the [Toolbox LangChain +SDK](/~https://github.com/googleapis/genai-toolbox-langchain-python), you can load +tools: + +{{< highlight python >}} +from toolbox_langchain import ToolboxClient + +# update the url to point to your server +client = ToolboxClient("http://127.0.0.1:5000") + +# these tools can be passed to your application! +tools = await client.aload_toolset() +{{< /highlight >}} + +For more detailed instructions on using the Toolbox LangChain SDK, see the +[project's README](/~https://github.com/googleapis/genai-toolbox-langchain-python/blob/main/README.md). + +{{% /tab %}} +{{< /tabpane >}} diff --git a/docs/en/getting-started/introduction/architecture.png b/docs/en/getting-started/introduction/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..d5041e5bc0c04539c4303d9c124b7343093519b7 GIT binary patch literal 44850 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 X=3<#tO0}} ```bash export OS="linux/amd64" # one of linux/amd64, darwin/arm64, darwin/amd64, or windows/amd64 - curl -O https://storage.googleapis.com/genai-toolbox/v0.0.5/$OS/toolbox + curl -O https://storage.googleapis.com/genai-toolbox/v0.1.0/$OS/toolbox ``` 1. Make the binary executable: