Commit Graph

180 Commits

Author SHA1 Message Date
Kurtis Van Gent
497fb06fae feat: add local quickstart (#232)
This is a continuation of #218, which add a local quickstart for running
Toolbox with Python and LangGraph.

---------

Co-authored-by: Twisha Bansal <twishabansal@google.com>
Co-authored-by: Anubhav Dhawan <anubhav756@gmail.com>
2025-01-24 12:18:19 -07:00
Wenxin Du
4639cc6560 fix: Auth token verification failure should not throw error immedicately (#234)
Currently, we are throwing 401 error immediately after auth token
verification failure. This is not expected in the following situations:
1. Non-auth tool invocation with auth token that is invalid.
2. Auth tool invocation with all the required auth token, but the header
contains extra non-required token that is invalid
These requests should pass the authorization check but fail under the
current implementation.

Change made in this PR:
1. Do not throw error immediately after auth token verification failure.
Instead only log it and continue to the next header iteration.
2. In the parseParams() method, if an auth parameter is missing, we
should error with the message telling the user that either the auth
header is missing or is invalid.
2025-01-24 08:49:51 -07:00
Wenxin Du
9bad952060 feat: Add Cloud SQL for SQL Server Source and Tool (#223)
1. `sql/database` provides a `Scan()`interface to scan query results
into typed variables. Therefore we have to create a slice of typed
variables (types retrieved from rows.ColumnTypes()) to pass them into
`Scan()`. Using []byte works but makes the printing result different
from other tools (e.g [1] instead of %!s(int32=1)]
2. MS SQL supports both named (e.g @name) and positional args (e.g @p2),
so we have to check if the name is contained in the original statement
before passing them into `db.Query()` as either named arg or as values.
2025-01-23 21:21:12 +08:00
Kurtis Van Gent
1de3853006 chore: move sources documentation to docsite (#225)
Migrates the docs/sources documentation to the new docsite.

---------

Co-authored-by: Anubhav Dhawan <anubhav756@gmail.com>
2025-01-22 16:57:06 +00:00
Anubhav Dhawan
e2faaf2069 fix: Add coverage file to .gitignore (#228) 2025-01-22 08:45:27 +00:00
Anubhav Dhawan
779bf6b9a2 fix(langchain-sdk): Inherit from BaseTool and implement placeholder _run method.
This is some ground-work before we add sync tool calls support to ToolboxTool.
2025-01-22 14:04:43 +05:30
Yuan
f1f61d7087 feat: add cloudsql mysql source and tool (#221)
Add CloudSQL for MySQL source and tool.

CloudSQLMySQL source is initialize with the following config:
```
sources:
    my-cloudsqlmysql-source:
        kind: cloud-sql-mysql
        project: my-project-name
        region: my-region
        instance: my-instance-name
        user: my_user
        password: my_pass
        database: my_db
        # ipType: public # The default dialect is public.
```

MySQL tool is initialize with the following config.
```
tools:
    test_tool:
        kind: mysql
        source: my-cloudsqlmysql-source
        description: >
            Testing tool.
        statement: "SELECT 1;"
```
2025-01-21 13:53:37 +00:00
Anubhav Dhawan
0937200644 doc(langchain-sdk): Update LangChain SDK README according to the updated APIs for ToolboxTool. (#193) 2025-01-20 07:31:47 +00:00
Anubhav Dhawan
e0ee1286f9 feat(langchain-sdk): Add features for binding parameters to ToolboxTool class. (#192)
The newly implemented `ToolboxTool` class manages tool state and
supports this new feature of binding parameters along wiith the existing
OAuth.

> [!NOTE]
> These changes are done in the LlamaIndex SDK as well in #203, along
with documentation updates in #193.
2025-01-20 12:57:50 +05:30
Anubhav Dhawan
a136308f55 feat(langchain-sdk)!: Migrate existing state and APIs to a tools level class. (#171)
# `ToolboxTool` Class

The newly implemented `ToolboxTool` class manages tool state and
supports features like bound params and OAuth.

We have also added the logic as well as state related to bound params to
`ToolboxTool` in #192.

`ToolboxTool` follows a functional approach, meaning it ensures that the
internal tool state remains unchanged and a new copy of the tool is
updated with the new values of auth tokens (or bound params from #192).

## `ToolboxTool` Class Diagram

To better explain, here's a visual diagram of the ToolboxTool class.

The boxes have member function names, and the "red" box means a function
is mutating the internal state, while "green" means it does not change
the internal state (like a C++ `const` function or JS immutable
function). The red box also shows the member variable they mutated.

![Image of a diagram showing the `ToolboxTool` class with member
functions and their colors indicating whether they mutate the internal
state](https://github.com/user-attachments/assets/a59eadf2-4aa5-49f0-9b8d-65864e26df07)

## Constructor

From the diagram above, it is evident that all the state changes, or
rather setting of the state, is done in the class constructor.

For further reference, here's a visual explanation of the functionality
of the constructor showing which params we add as auth tokens, which
params we add to the underlying schema, and for what the error/warnings
are thrown.

![Image of a diagram showing the functionality of the `ToolboxTool`
constructor](https://github.com/user-attachments/assets/b4e6c0a1-f0da-4cf5-a56c-976c4c4b006e)

> [!NOTE]
> Documentation updates are done by #193 and the corresponding changes
to the LlamaIndex SDK are done by #203.
2025-01-20 12:38:36 +05:30
Twisha Bansal
b6e753add9 test(llamaindex-sdk): Add more test cases to e2e tests (#219)
Test for tool calls with

1. Missing params
2. Wrong param type
2025-01-17 06:11:08 +00:00
Yuan
45fc046437 chore: migrate yaml library to goccy/go-yaml (#211)
Migrate yaml library from
[gopkg.in/yaml.v3](https://pkg.go.dev/gopkg.in/yaml.v3) to
[goccy/go-yaml](https://github.com/goccy/go-yaml).

We are trying to add validation feature to the unmarshaling of yaml.
However, `yaml.v3` currently does not support that and the library had
not been actively maintained for awhile. This migration will allow us to
use validation processing such as
[go-playground/validator](https://github.com/go-playground/validator)

---------

Co-authored-by: Kurtis Van Gent <31518063+kurtisvg@users.noreply.github.com>
2025-01-16 09:15:18 -08:00
Yuan
0c3d12ae04 fix: fix typo in postgres test (#216) 2025-01-15 17:53:04 +00:00
Twisha Bansal
58aee52f40 ci: toolbox release latest version (#213) 2025-01-15 08:26:20 +00:00
Twisha Bansal
60c72bc750 ci: toolbox release latest version (#214) 2025-01-15 12:33:04 +05:30
Yuan
9fabfc3b8b docs: add example $VERSION for container image installation (#212)
container image uses `0.0.1` whereas the binary or source uses `v0.0.1`.
Example is added so that this is clear to the user.
2025-01-14 20:02:24 -08:00
release-please[bot]
afb24d322f chore(main): release 0.0.5 (#164)
🤖 I have created a release *beep* *boop*
---


##
[0.0.5](https://github.com/googleapis/genai-toolbox/compare/v0.0.4...v0.0.5)
(2025-01-14)


### ⚠ BREAKING CHANGES

* replace Source field `ip_type` with `ipType` for consistency
([#197](https://github.com/googleapis/genai-toolbox/issues/197))
* **toolbox-sdk:** deprecate 'add_auth_headers' in favor of
'add_auth_tokens'
([#170](https://github.com/googleapis/genai-toolbox/issues/170))

### Features

* Add support for OpenTelemetry
([#205](https://github.com/googleapis/genai-toolbox/issues/205))
([1fcc20a](1fcc20a846))
* Added Neo4j Source and Tool
([#189](https://github.com/googleapis/genai-toolbox/issues/189))
([8a1224b](8a1224b9e0))
* **llamaindex-sdk:** Implement OAuth support for LlamaIndex.
([#159](https://github.com/googleapis/genai-toolbox/issues/159))
([003ce51](003ce510a1))
* Replace Source field `ip_type` with `ipType` for consistency
([#197](https://github.com/googleapis/genai-toolbox/issues/197))
([e069520](e069520bb7))
* Update log with given context
([#147](https://github.com/googleapis/genai-toolbox/issues/147))
([809e547](809e547a48))


### Bug Fixes

* Correct parsing of floats/ints from json
([#180](https://github.com/googleapis/genai-toolbox/issues/180))
([387a5b5](387a5b56b5))
* **doc:** Update example `clientId` field
([#198](https://github.com/googleapis/genai-toolbox/issues/198))
([0c86e89](0c86e89506))
* Fix config name in auth doc samples
([#186](https://github.com/googleapis/genai-toolbox/issues/186))
([bb03457](bb0345767e))
* Handle shutdown gracefully
([#178](https://github.com/googleapis/genai-toolbox/issues/178))
([66ab70f](66ab70f702))
* Improve return error for parameters
([#206](https://github.com/googleapis/genai-toolbox/issues/206))
([346c57d](346c57da23))
* **toolbox-sdk:** Deprecate 'add_auth_headers' in favor of
'add_auth_tokens'
([#170](https://github.com/googleapis/genai-toolbox/issues/170))
([b56fa68](b56fa685e3))


### Miscellaneous Chores

* Release 0.0.5
([#210](https://github.com/googleapis/genai-toolbox/issues/210))
([bd407c0](bd407c0ab7))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
v0.0.5
2025-01-15 01:52:22 +08:00
Wenxin Du
bd407c0ab7 chore: release 0.0.5 (#210)
Release-As: 0.0.5
2025-01-15 01:43:35 +08:00
Yuan
346c57da23 fix: improve return error for parameters (#206) 2025-01-14 16:35:33 +00:00
Michael Hunger
8a1224b9e0 feat: Added Neo4j Source and Tool (#189)
- configure neo4j source with url, username, password, database
- configure neo4j tools with cypher statement and paramters
- tests based on the postgres tests
- neo4j.yaml for integration tests
---------

Co-authored-by: duwenxin <duwenxin@google.com>
2025-01-14 09:17:18 -07:00
Twisha Bansal
cce93629a9 tests(sdk): e2e tests for llamaindex sdk (#207) 2025-01-14 07:20:17 +00:00
Wenxin Du
22bf137b8d ci(auth): Add OAuth integration test to Cloud SQL (#172)
1. Add generic integration test helpers for authenticated parameters and
auth-required tool invocations.
2. Call generic test helpers as Cloud SQL integration tests.
2025-01-14 14:02:50 +08:00
Wenxin Du
6ffcca0573 ci: Increase AlloyDB integration test coverage (#187)
add tests for tool invocation with params, connection over public IP,
and connection over private IP.
2025-01-14 12:07:34 +08:00
Wenxin Du
0c86e89506 fix(doc): Update example clientId field (#198) 2025-01-14 11:00:41 +08:00
Wenxin Du
e069520bb7 feat!: replace Source field ip_type with ipType for consistency (#197)
Replace `ip_type` with `ipType` to match the camel-case of the other
fields.
Update docs since we support both private and public IP connections.
2025-01-14 10:56:06 +08:00
Yuan
1fcc20a846 feat: add support for OpenTelemetry (#205)
Co-authored-by: Kurtis Van Gent <31518063+kurtisvg@users.noreply.github.com>
Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2025-01-13 15:38:38 -08:00
Kurtis Van Gent
141cae7702 docs: add site for hosting docs on github pages (#204)
Adds a static site generation using Hugo, and deployed to GitHub pages
(googleapis.github.io/genai-toolbox).
2025-01-13 15:37:31 -07:00
Twisha Bansal
61627803db test: do not skip fixed tests (#201) 2025-01-13 16:54:04 +05:30
Yuan
d8ffbc68ee ci(spanner): add integration tests (#188) 2025-01-12 21:56:14 -08:00
Yuan
d65cefc600 chore: Add debug logs (#195)
Add debug logs to Toolbox. 

For example when a http fail, it will just show Error at the http level,
but not log with actual error message. err message are returned to the
api as following `{"status":"Internal Server Error","error":"error while
invoking tool: unable to execute client: spanner: code =
\"InvalidArgument\", desc = \"invalid session pool\""}`.

After adding this, if user/dev run toolbox with `--log-level=debug`, it
will output the following (debug log in addition to the error for http
request):

```
2025-01-08T14:16:25.040824-08:00 DEBUG "error while invoking tool: unable to execute client: spanner: code = \"InvalidArgument\", desc = \"invalid session pool\""

2025-01-08T14:16:25.040968-08:00 ERROR Response: 500 Server Error service: "httplog" httpRequest: {url: "http://127.0.0.1:5000/api/tool/test_tool_two/invoke" method: "POST" path: "/api/tool/test_tool_two/invoke" remoteIP: "127.0.0.1:51708" proto: "HTTP/1.1" requestID: "yuanteoh-macbookpro.roam.internal/N7LNMcLIUH-000001" scheme: "http" header: {user-agent: "curl/8.7.1" accept: "*/*" content-type: "application/json" content-length: "2"}} httpResponse: {status: 500 bytes: 167 elapsed: 0.301917}
```
2025-01-13 05:47:46 +00:00
Twisha Bansal
ae732e637f tests(sdk): e2e tests for langchain sdk (#176)
This PR contains toolbox Set up and e2e tests for the following
functionality:

- Load tools
- Load toolsets
- Running tools
- Auth for tools
- Auth for tool parameters

---------

Co-authored-by: Anubhav Dhawan <anubhav756@gmail.com>
2025-01-10 08:25:37 +00:00
Anubhav Dhawan
c58f0104f8 doc(langchain-sdk): Update LangChain SDK example to use Gemini Pro model for better tool selection. (#196) 2025-01-10 11:02:23 +05:30
Anubhav Dhawan
cccc34d019 doc(langchain-sdk): Use Gemini 1.5 Flash model in LangGraph example in the README. (#194) 2025-01-08 19:44:45 +05:30
Twisha Bansal
c4e9da0028 chore(docs): Use project id instead of project name in source (#184) 2025-01-07 09:33:24 -08:00
Twisha Bansal
3c74deeae9 sdk(langchain): Added license headers (#182) 2025-01-07 04:50:52 +00:00
Wenxin Du
bb0345767e fix: Fix config name in auth doc samples (#186)
The config names should be in camel case.
2025-01-06 13:45:25 -05:00
Twisha Bansal
4d7b94da9d sdk(llamaindex): Added license headers (#183) 2025-01-06 09:15:14 -07:00
Kurtis Van Gent
387a5b56b5 fix: correct parsing of floats/ints from json (#180)
Corrects an issue caused by Go defaulting to parsing JSON Numbers as
float64s. This caused some numbers to be incorrectly parsed as floats
when they were integers. This defaults to parsing using json.Number,
which allows us to parse between Int/Float more accurately.
2025-01-03 10:09:45 -07:00
Kurtis Van Gent
66ab70f702 fix: handle shutdown gracefully (#178)
Adds logic to make the server shutdown gracefully, including better
respecting cancelled contexts and providing up to 10 seconds to finish
current connections.
2024-12-31 09:53:53 -07:00
Kurtis Van Gent
c9f267c9c3 ci: cache dependencies for integration tests (#179)
Adds a cache step to cache the integration tests to speed up test time
2024-12-31 08:58:57 -07:00
Yuan
655afa51f5 ci: update lint with integration build tag (#177)
Update golangcilint to run the `integration` build tag as well.
2024-12-30 14:42:28 -08:00
Twisha Bansal
8f2ad44fb4 chore(docs): Fix source kind in example (#175) 2024-12-30 09:07:44 -07:00
Anubhav Dhawan
b56fa685e3 fix(toolbox-sdk)!: deprecate 'add_auth_headers' in favor of 'add_auth_tokens' (#170)
Client code should not be concerned with how authentication tokens are
handled internally. This commit refactors method and parameter names to
use the more abstract term "token" instead of "header," improving the
developer experience and hiding implementation details.
2024-12-28 06:29:07 +00:00
Yuan
9ac0d08acc ci(postgres): add end to end integration test (#162)
End to end integration test for postgres.

Include checks for one tool's get (manifest) and post (invoke) endpoint.

Integration tests are excluded from regular unit tests.
2024-12-27 21:29:17 -08:00
Twisha Bansal
bd6a7455f1 chore: fix link (#168) 2024-12-25 20:01:45 +00:00
Twisha Bansal
6edcf36a2b chore: added period (#169) 2024-12-25 11:55:43 -08:00
Yuan
809e547a48 feat: update log with given context (#147)
Update logging with the given context.
2024-12-23 19:55:25 -08:00
Yuan
bf276e5f56 ci: combine integration cloudbuild job (#166) 2024-12-23 15:29:35 -08:00
Twisha Bansal
938f7b41d7 chore: fix comments (#163) 2024-12-23 09:28:14 -07:00
Anubhav Dhawan
003ce510a1 feat(llamaindex-sdk): Implement OAuth support for LlamaIndex. (#159)
* Update docs for Authenticated Tools.
* Implement test cases for OAuth in LlamaIndex.
* Sync SDK dependency versions b/w LangChain and LlamaIndex.
2024-12-23 14:24:22 +05:30