Compare commits

...

302 Commits

Author SHA1 Message Date
Twisha Bansal
2e9a21a60c Merge branch 'main' into binary-npx 2026-03-31 15:37:55 +05:30
Yuan Teoh
28a4910daa tests: update --enable-api to be part of args input (#2905)
Update the `--enable-api` flag in integration test to be part of args
input rather than hard coded in `StartCmd()` function.
2026-03-30 21:37:29 +00:00
Disha Prakash
1e8a183cf2 chore: Release 0.31.0 npx binary 2026-03-30 19:09:30 +00:00
Wenxin Du
4baf758b62 docs: Add SECURITY.md (#2551)
Update GitHub workflow security to align with [Google Open Source
security
requirements](https://opensource.google/documentation/reference/github/security).

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-30 18:01:11 +00:00
Wenxin Du
0e94cec904 ci: add SLSA build provenance to docker images (#2556)
Ref: [Generate Cloud Build
provenance](https://docs.cloud.google.com/build/docs/securing-builds/generate-validate-build-provenance)

- Remove the original binary upload steps.
- Let artifact registry config automatically upload binaries & dockers
and generate provenance.
- Add a new final step to create versioned directories containing
binaries to be automatically uploaded.
2026-03-30 13:41:57 -04:00
Niraj Nandre
a769f15c3a fix(tests/Bigtable): implement uuid-based isolation and reliable resource cleanup (#2880)
## Description

- **UUID-based Isolation**: Refactored the Bigtable integration tests to
generate a single `uniqueID` at the start of the test run, which is used
as a suffix for all temporary table names.

- **Centralized Cleanup Utility**: Added the `CleanupBigtableTables`
function to `tests/common.go` to identify and delete all tables matching
the specific `uniqueID`.

- **Reliable Teardown**: Replaced `defer` calls with the `t.Cleanup`
hook and `context.Background()` to ensure that test-specific tables are
consistently removed, even if the test fails or times out.

**Why it was required**:

- **Prevent Resource leaks**: Previous test runs frequently leaked
tables when teardown logic was interrupted, leading to significant
clutter in the toolbox-testing-438616 project.
- **Resource Limit Near-Exhaustion**: The Bigtable instance was found to
have **876** tables currently in use, approaching the standard cloud
limit of **1,000 tables**. This cleanup is critical to maintain the
health of the shared testing environment.
- **Enable Concurrency**: Strict isolation ensures that parallel builds
in CI/CD do not interfere with or accidentally delete resources
belonging to other active test runs.

Reference Doc -
[https://docs.google.com/document/d/1LzOVRhuwU6z88FFE5ocyJ_7MIhY0kdpRFnuqU_yYAPg/edit?resourcekey=0-dcyFbd8jFgPgULqmeUlRjQ&tab=t.1rq6wvhsf9yn](https://docs.google.com/document/d/1LzOVRhuwU6z88FFE5ocyJ_7MIhY0kdpRFnuqU_yYAPg/edit?resourcekey=0-dcyFbd8jFgPgULqmeUlRjQ&tab=t.1rq6wvhsf9yn
)
> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-03-30 18:53:13 +05:30
Twisha Bansal
ddf409da8f docs: add styleguide for Gemini Code Assist reviews (#2690)
## Description

This PR adds a styleguide.md file to the root directory to provide
expert procedural guidance for Gemini Code Assist during automated code
reviews. This guide adds Conventional Commit & PR Title standards for
automated versioning.

Reference:
https://developers.google.com/gemini-code-assist/docs/customize-gemini-behavior-github#add-configuration-files

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-03-30 11:09:45 +00:00
Twisha Bansal
b2a6cfa4a4 Revert "ci: remove issue assignment for OOO" (#2894)
Reverts googleapis/genai-toolbox#2778
2026-03-30 14:23:36 +05:30
Wenxin Du
912aa9edd7 feat(embeddingModel): Add Backend API selection fields (#2592)
Allow users to use both VertexAI and Google AI as gemini embedding model
backend.
- Use ADC for VertexAI authentication (either configure `project` and
`location` inside the yaml file or as env vars).
- Use API key for Google AI authentication.
2026-03-30 03:34:09 +00:00
Keefer
9c3a748de4 fix(bigquery): add impersonateServiceAccount to prebuilt config (#2770)
## Summary

Add `BIGQUERY_IMPERSONATE_SERVICE_ACCOUNT` env var support to the
prebuilt BigQuery configuration, enabling service account impersonation
without requiring a custom `--tools-file`.

## Problem

The BigQuery source already supports `impersonateServiceAccount` (added
in #1641 / #906), but the prebuilt config at
`internal/prebuiltconfigs/tools/bigquery.yaml` does not expose it via an
environment variable. This forces users who need impersonation to
abandon `--prebuilt bigquery` entirely and create a custom
`--tools-file` that manually redefines all 9 tools — just to set one
field on the source.

This is a common need for organizations that use service account
impersonation to scope permissions for AI agents, rather than granting
broad access to individual user accounts.

## Solution

Add a single line to the prebuilt BigQuery YAML:

```yaml
impersonateServiceAccount: ${BIGQUERY_IMPERSONATE_SERVICE_ACCOUNT:}
```

The empty default (`:`) means existing users are unaffected — the field
is ignored when the env var is not set, preserving full backward
compatibility.

## Validation

Built the patched binary locally and confirmed:
- Without the env var: `SESSION_USER()` returns the personal account
(unchanged behavior)
- With the env var: `SESSION_USER()` returns the impersonated service
account

## PR Checklist

- [x] Make sure you reviewed
[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Make sure to open an issue as a
[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
before writing your code! That way we can discuss the change, evaluate
designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [x] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #2769

---------

Co-authored-by: kkeefer1 <kyle_keefer@intuit.com>
Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2026-03-27 21:05:48 +00:00
Niraj Nandre
479d842404 fix(tests/bigquery): implement uuid-based isolation and reliable resource cleanup (#2547)
## Description

### **Description of Changes:**

- **Centralized Cleanup**: Added `CleanupBigQueryDatasets` to
`tests/common.go` which uses `DeleteWithContents` to recursively wipe
test datasets.
- **UUID Isolation**: Refactored BigQuery integration tests to generate
a single `uniqueID` per run, used as a suffix for all datasets and
tables.
- **Reliable Teardown**: Replaced defer calls with `t.Cleanup` to
guarantee resource removal even after test timeouts or fatal errors.
- **Logging**: Added `t.Logf` statements to track the `uniqueID`
throughout the test lifecycle for easier debugging.
- **Deadlock Resolution (Log Draining)**: Added a background goroutine
to drain `cmd.Out` using `io.Copy(io.Discard, cmd.Out)` immediately
after the server starts.

### **Why it was required:**

- **Prevent Resource Leaks**: Previous tests often leaked "Disallowed"
datasets if table deletion failed, cluttering the
`toolbox-testing-438616` project.
- **Enable Concurrency**: Using a single shared project for CI/CD
requires strict isolation so concurrent builds do not delete or
overwrite each other's data.
- **Timeout Resilience**: Standard `defer` blocks could fail if the test
context was cancelled; using `context.Background()` in t.Cleanup ensures
teardown logic has a fresh context to complete.
- **Timeout & Deadlock Fix**: I observed a deadlock where the Toolbox
server would block while attempting to write logs to a full `64KB` OS
pipe buffer. Since the test runner was waiting for an HTTP response from
the blocked server, the entire suite would time out at 10 minutes.


## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-03-27 21:02:01 +05:30
Yuan Teoh
ef8bfe54d2 ci: update sample test config format with latest release (#2839)
note: this should be merged only after v1.0 release.
2026-03-27 03:49:50 +00:00
release-please[bot]
c6b811c4f4 chore(main): release 0.31.0 (#2814)
🤖 I have created a release *beep* *boop*
---


##
[0.31.0](https://github.com/googleapis/genai-toolbox/compare/v0.30.0...v0.31.0)
(2026-03-26)


### ⚠ BREAKING CHANGES

* release upgraded docsite
([#2831](https://github.com/googleapis/genai-toolbox/issues/2831))
* **http:** sanitize non-2xx error output
([#2654](https://github.com/googleapis/genai-toolbox/issues/2654))
* add a new `enable-api` flag
([#2846](https://github.com/googleapis/genai-toolbox/issues/2846))
* remove deprecations and update tools-file flag
([#2806](https://github.com/googleapis/genai-toolbox/issues/2806))

### Features

* Add a new `enable-api` flag
([#2846](https://github.com/googleapis/genai-toolbox/issues/2846))
([7a070da](7a070dae4f))
* **auth:** Add generic `authService` type for MCP
([#2619](https://github.com/googleapis/genai-toolbox/issues/2619))
([f6678f8](f6678f8e29))
* **auth:** Add Protected Resource Metadata endpoint
([#2698](https://github.com/googleapis/genai-toolbox/issues/2698))
([b53dcf2](b53dcf2069))
* **auth:** Support manual PRM override
([#2717](https://github.com/googleapis/genai-toolbox/issues/2717))
([283e4e3](283e4e3317))
* **dataplex:** Add support for lookup context tool.
([#2744](https://github.com/googleapis/genai-toolbox/issues/2744))
([facb69d](facb69d01f))
* Remove deprecations and update tools-file flag
([#2806](https://github.com/googleapis/genai-toolbox/issues/2806))
([ab64c95](ab64c9514a))


### Bug Fixes

* **ci:** Remove search index generation from preview deployment
workflow
([#2859](https://github.com/googleapis/genai-toolbox/issues/2859))
([f8891b8](f8891b82fc))
* **docs:** Skip empty folders in pagination & reduce PR comment noise
([#2853](https://github.com/googleapis/genai-toolbox/issues/2853))
([9ebd93a](9ebd93a8ec))
* **http:** Sanitize non-2xx error output
([#2654](https://github.com/googleapis/genai-toolbox/issues/2654))
([5bef954](5bef954507))
* **skills:** Fix integer parameter parsing through agent skills
([#2847](https://github.com/googleapis/genai-toolbox/issues/2847))
([4564efe](4564efe754))


### Documentation

* Release upgraded docsite
([#2831](https://github.com/googleapis/genai-toolbox/issues/2831))
([5b25ce0](5b25ce0812))


---
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>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-26 17:00:15 -07:00
Yuan Teoh
e694fc1122 chore: release 0.31.0 (#2865)
Release-As: 0.31.0
2026-03-26 23:50:06 +00:00
Wenxin Du
941c75237b test(couchbase): refactor integration tests to use testcontainers (#2858)
Refactor Couchbase integration tests to use testcontainers to fix test
flakiness.
🛠️ Fixes https://github.com/googleapis/genai-toolbox/issues/2808
2026-03-26 23:22:54 +00:00
Yuan Teoh
8ecf708ceb Revert "chore(deps): update module google.golang.org/adk to v1" (#2867)
Reverts googleapis/genai-toolbox#2837 

Revert since this might break the samples.
2026-03-26 16:05:24 -07:00
dishaprakash
ee70433946 docs: Move documentation to new path (#2866)
## Description

Move new auth doc to new path

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-03-26 15:51:33 -07:00
Averi Kitsch
591f3cea42 docs: add Google Cloud MCP server faq (#2820)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: Kurtis Van Gent <31518063+kurtisvg@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-26 22:37:41 +00:00
Mend Renovate
d7d5c5a29b chore(config): migrate Renovate config (#2838)
The Renovate config in this repository needs migrating. Typically this
is because one or more configuration options you are using have been
renamed.

You don't need to merge this PR right away, because Renovate will
continue to migrate these fields internally each time it runs. But later
some of these fields may be fully deprecated and the migrations removed.
So it's a good idea to merge this migration PR soon.



#### [PLEASE
NOTE](https://docs.renovatebot.com/configuration-options#configmigration):
JSON5 config file migrated! All comments & trailing commas were removed.

🔕 **Ignore**: Close this PR and you won't be reminded about config
migration again, but one day your current config may no longer be valid.

 Got questions? Does something look wrong to you? Please don't hesitate
to [request help
here](https://redirect.github.com/renovatebot/renovate/discussions).


---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

Co-authored-by: Averi Kitsch <akitsch@google.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-26 15:34:02 -07:00
Averi Kitsch
a68cb22f9f docs: overhaul readme (#2821)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: Kurtis Van Gent <31518063+kurtisvg@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-26 22:26:23 +00:00
dishaprakash
837047bb9f docs: Add prebuilt configs under integrations and add migration banner (#2857)
## Description

This PR :
- Splits the complete list of prebuilt configs adds the config specific
each source under the `integrations/` section.
- A shortcode has been added to link these files in the
`documentation/configuration/prebuilt-configs/_index.md`
- Adds migration banner to redirect users to new url
- Adds documentation for contributors on file structure for both samples
and prebuilt configs

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [x] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-26 15:20:14 -07:00
Mend Renovate
4ea11ff2aa chore(deps): update module google.golang.org/adk to v1 (#2837)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [google.golang.org/adk](https://redirect.github.com/google/adk-go) |
`v0.3.0` → `v1.0.0` |
![age](https://developer.mend.io/api/mc/badges/age/go/google.golang.org%2fadk/v1.0.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/google.golang.org%2fadk/v0.3.0/v1.0.0?slim=true)
|

---

### Release Notes

<details>
<summary>google/adk-go (google.golang.org/adk)</summary>

###
[`v1.0.0`](https://redirect.github.com/google/adk-go/releases/tag/v1.0.0)

[Compare
Source](https://redirect.github.com/google/adk-go/compare/v0.6.0...v1.0.0)

##### What's Changed

- Add replay plugin by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;618](https://redirect.github.com/google/adk-go/pull/618)
- Add example tool that adds examples to llm request by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;612](https://redirect.github.com/google/adk-go/pull/612)
- all: run go fix ./... by
[@&#8203;hyangah](https://redirect.github.com/hyangah) in
[#&#8203;634](https://redirect.github.com/google/adk-go/pull/634)
- Initialize EventActions' ArtifactDelta to empty map by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;610](https://redirect.github.com/google/adk-go/pull/610)
- Change content "For context" formatting by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;613](https://redirect.github.com/google/adk-go/pull/613)
- Add runner options, WithStateDelta by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;615](https://redirect.github.com/google/adk-go/pull/615)
- Add pathPrefix config to api launcher by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;616](https://redirect.github.com/google/adk-go/pull/616)
- feat: extension points for remoteagent part conversions by
[@&#8203;nahapetyan-serob](https://redirect.github.com/nahapetyan-serob)
in [#&#8203;627](https://redirect.github.com/google/adk-go/pull/627)
- feat: add apigee model by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;639](https://redirect.github.com/google/adk-go/pull/639)
- Modify append instructions to modify existig part. Add ExampleTool
factory to configurable. by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;640](https://redirect.github.com/google/adk-go/pull/640)
- Upgrade GitHub Actions to latest versions by
[@&#8203;salmanmkc](https://redirect.github.com/salmanmkc) in
[#&#8203;643](https://redirect.github.com/google/adk-go/pull/643)
- Upgrade GitHub Actions for Node 24 compatibility by
[@&#8203;salmanmkc](https://redirect.github.com/salmanmkc) in
[#&#8203;642](https://redirect.github.com/google/adk-go/pull/642)
- Do not retry confirmation requests as they are not really errors. by
[@&#8203;caglar10ur](https://redirect.github.com/caglar10ur) in
[#&#8203;641](https://redirect.github.com/google/adk-go/pull/641)
- fix: skip vendor in copyright header test by
[@&#8203;zchee](https://redirect.github.com/zchee) in
[#&#8203;636](https://redirect.github.com/google/adk-go/pull/636)
- refactor: remove duplicated ConfirmationProvider by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;649](https://redirect.github.com/google/adk-go/pull/649)
- refactor: consistent memory service naming by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;650](https://redirect.github.com/google/adk-go/pull/650)
- feat: remoteagent and executor subtask cleanup by
[@&#8203;yarolegovich](https://redirect.github.com/yarolegovich) in
[#&#8203;645](https://redirect.github.com/google/adk-go/pull/645)
- Add progressive SSE to streaming aggregator and parallel function call
execution by [@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;654](https://redirect.github.com/google/adk-go/pull/654)
- fix: interleaved thought\&text aggregation in remoteagent by
[@&#8203;yarolegovich](https://redirect.github.com/yarolegovich) in
[#&#8203;655](https://redirect.github.com/google/adk-go/pull/655)
- Plumb part converter to input required processor by
[@&#8203;zbirkenbuel](https://redirect.github.com/zbirkenbuel) in
[#&#8203;657](https://redirect.github.com/google/adk-go/pull/657)
- refactor: remove launcher dependency from adkrest by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;660](https://redirect.github.com/google/adk-go/pull/660)
- feat(otel): use synchronous span and log processors for debug
endpoints by
[@&#8203;pawel-maciejczek](https://redirect.github.com/pawel-maciejczek)
in [#&#8203;661](https://redirect.github.com/google/adk-go/pull/661)
- feat(adk-web): update adk-web to the latest version by
[@&#8203;pawel-maciejczek](https://redirect.github.com/pawel-maciejczek)
in [#&#8203;653](https://redirect.github.com/google/adk-go/pull/653)
- chore(deps): bump google.golang.org/grpc from 1.78.0 to 1.79.3 in the
go\_modules group across 1 directory by
[@&#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&#8203;663](https://redirect.github.com/google/adk-go/pull/663)
- chore: update a2a-go and fix test race by
[@&#8203;yarolegovich](https://redirect.github.com/yarolegovich) in
[#&#8203;664](https://redirect.github.com/google/adk-go/pull/664)
- feat(adk-web): update adk-web to the latest version by
[@&#8203;kdroste-google](https://redirect.github.com/kdroste-google) in
[#&#8203;666](https://redirect.github.com/google/adk-go/pull/666)
- chore(deps): bump github.com/modelcontextprotocol/go-sdk from 1.4.0 to
1.4.1 in the go\_modules group across 1 directory by
[@&#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&#8203;667](https://redirect.github.com/google/adk-go/pull/667)
- feat: allow the runner to automatically create a session if
AutoCreateSession is enabled. by
[@&#8203;hanorik](https://redirect.github.com/hanorik) in
[#&#8203;622](https://redirect.github.com/google/adk-go/pull/622)
- refactor: update memory req/resp names by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;671](https://redirect.github.com/google/adk-go/pull/671)

##### New Contributors

- [@&#8203;salmanmkc](https://redirect.github.com/salmanmkc) made their
first contribution in
[#&#8203;643](https://redirect.github.com/google/adk-go/pull/643)

**Full Changelog**:
<https://github.com/google/adk-go/compare/v0.6.0...v1.0.0>

###
[`v0.6.0`](https://redirect.github.com/google/adk-go/releases/tag/v0.6.0)

[Compare
Source](https://redirect.github.com/google/adk-go/compare/v0.5.0...v0.6.0)

#### What's Changed

- feat: add otel structured logging by
[@&#8203;pawel-maciejczek](https://redirect.github.com/pawel-maciejczek)
in [#&#8203;552](https://redirect.github.com/google/adk-go/pull/552)
- feat(telemetry): add OTel logger initialization by
[@&#8203;pawel-maciejczek](https://redirect.github.com/pawel-maciejczek)
in [#&#8203;573](https://redirect.github.com/google/adk-go/pull/573)
- feat: add script for updating embedded adk-web by
[@&#8203;pawel-maciejczek](https://redirect.github.com/pawel-maciejczek)
in [#&#8203;594](https://redirect.github.com/google/adk-go/pull/594)
- runssehandler-causes-superfluous-responsewriteheader-on-errors by
[@&#8203;indurireddy-TF](https://redirect.github.com/indurireddy-TF) in
[#&#8203;531](https://redirect.github.com/google/adk-go/pull/531)
- Pull request template for Go by
[@&#8203;rohityan](https://redirect.github.com/rohityan) in
[#&#8203;565](https://redirect.github.com/google/adk-go/pull/565)
- feat: adka2a mode with artifact per non-partial event by
[@&#8203;yarolegovich](https://redirect.github.com/yarolegovich) in
[#&#8203;599](https://redirect.github.com/google/adk-go/pull/599)
- feat: integrate debug endpoints with adk-web by
[@&#8203;pawel-maciejczek](https://redirect.github.com/pawel-maciejczek)
in [#&#8203;597](https://redirect.github.com/google/adk-go/pull/597)
- fix: deterministic remoteagent aggregate event emit order by
[@&#8203;yarolegovich](https://redirect.github.com/yarolegovich) in
[#&#8203;603](https://redirect.github.com/google/adk-go/pull/603)
- feat: refactor debugtelemetry - optimize trace access by
[@&#8203;pawel-maciejczek](https://redirect.github.com/pawel-maciejczek)
in [#&#8203;593](https://redirect.github.com/google/adk-go/pull/593)
- Introduce tool.WithConfirmation. by
[@&#8203;caglar10ur](https://redirect.github.com/caglar10ur) in
[#&#8203;579](https://redirect.github.com/google/adk-go/pull/579)
- fix: race conditions in parallel agents by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;530](https://redirect.github.com/google/adk-go/pull/530)
- chore(deps): bump github.com/modelcontextprotocol/go-sdk from 0.7.0 to
1.3.1 in the go\_modules group across 1 directory by
[@&#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&#8203;604](https://redirect.github.com/google/adk-go/pull/604)
- feat: implements identityRequestProcessor to internal/llminternal by
[@&#8203;zchee](https://redirect.github.com/zchee) in
[#&#8203;585](https://redirect.github.com/google/adk-go/pull/585)
- Remove loopagent dependency from sequential agent by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;611](https://redirect.github.com/google/adk-go/pull/611)
- test: regenerate parallel agent test by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;614](https://redirect.github.com/google/adk-go/pull/614)
- fix: use LLMRequest.Model in Gemini GenerateContent calls by
[@&#8203;dmora](https://redirect.github.com/dmora) in
[#&#8203;620](https://redirect.github.com/google/adk-go/pull/620)
- fix: `generateRequestConfirmationEvent` creates events with empty ID
by [@&#8203;dannovikov](https://redirect.github.com/dannovikov) in
[#&#8203;588](https://redirect.github.com/google/adk-go/pull/588)
- Add missing fields to adkrest data model and event's ModelVersion
field by [@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;609](https://redirect.github.com/google/adk-go/pull/609)
- test: fixed expected model name by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;621](https://redirect.github.com/google/adk-go/pull/621)
- fix output not rendering in non-TTY environments
([#&#8203;536](https://redirect.github.com/google/adk-go/issues/536)) by
[@&#8203;benzaidfoued](https://redirect.github.com/benzaidfoued) in
[#&#8203;568](https://redirect.github.com/google/adk-go/pull/568)
- Add http.RoundTripper to merge request's header values. by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;607](https://redirect.github.com/google/adk-go/pull/607)
- fix: switch to the new mcp.ErrSessionMissing by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;625](https://redirect.github.com/google/adk-go/pull/625)
- Add adk configurable and cli initializer by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;617](https://redirect.github.com/google/adk-go/pull/617)
- chore: update internal version by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;628](https://redirect.github.com/google/adk-go/pull/628)

#### New Contributors

- [@&#8203;rohityan](https://redirect.github.com/rohityan) made their
first contribution in
[#&#8203;565](https://redirect.github.com/google/adk-go/pull/565)
- [@&#8203;dmora](https://redirect.github.com/dmora) made their first
contribution in
[#&#8203;620](https://redirect.github.com/google/adk-go/pull/620)
- [@&#8203;dannovikov](https://redirect.github.com/dannovikov) made
their first contribution in
[#&#8203;588](https://redirect.github.com/google/adk-go/pull/588)
- [@&#8203;benzaidfoued](https://redirect.github.com/benzaidfoued) made
their first contribution in
[#&#8203;568](https://redirect.github.com/google/adk-go/pull/568)

**Full Changelog**:
<https://github.com/google/adk-go/compare/v0.5.0...v0.6.0>

###
[`v0.5.0`](https://redirect.github.com/google/adk-go/releases/tag/v0.5.0)

[Compare
Source](https://redirect.github.com/google/adk-go/compare/v0.4.0...v0.5.0)

##### What's Changed

- Update feature\_request.md by
[@&#8203;ymodak](https://redirect.github.com/ymodak) in
[#&#8203;520](https://redirect.github.com/google/adk-go/pull/520)
- Update bug\_report.md by
[@&#8203;ymodak](https://redirect.github.com/ymodak) in
[#&#8203;519](https://redirect.github.com/google/adk-go/pull/519)
- Implement the load memory tool for searching memory by
[@&#8203;git-hulk](https://redirect.github.com/git-hulk) in
[#&#8203;497](https://redirect.github.com/google/adk-go/pull/497)
- fix InvocationId being replaced on invocationContext duplication by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;525](https://redirect.github.com/google/adk-go/pull/525)
- feat: add human in the loop confirmation for mcp toolset by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;523](https://redirect.github.com/google/adk-go/pull/523)
- feature: add WithContext method to agent.InvocationContext to support
context modification by
[@&#8203;pawel-maciejczek](https://redirect.github.com/pawel-maciejczek)
in [#&#8203;526](https://redirect.github.com/google/adk-go/pull/526)
- feat: add logging plugin by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;534](https://redirect.github.com/google/adk-go/pull/534)
- feat: implement graceful shutdown in console launcher by
[@&#8203;pawel-maciejczek](https://redirect.github.com/pawel-maciejczek)
in [#&#8203;533](https://redirect.github.com/google/adk-go/pull/533)
- fix: Apply temp state deltas to local session object. by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;537](https://redirect.github.com/google/adk-go/pull/537)
- feat: add a function call modifier plugin. by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;535](https://redirect.github.com/google/adk-go/pull/535)
- Add support of the preload memory tool by
[@&#8203;git-hulk](https://redirect.github.com/git-hulk) in
[#&#8203;527](https://redirect.github.com/google/adk-go/pull/527)
- feat: add OpenTelemetry configuration and initialization -
TracerProvider by
[@&#8203;pawel-maciejczek](https://redirect.github.com/pawel-maciejczek)
in [#&#8203;524](https://redirect.github.com/google/adk-go/pull/524)
- Move the function call modifier plugin into one package by
[@&#8203;git-hulk](https://redirect.github.com/git-hulk) in
[#&#8203;546](https://redirect.github.com/google/adk-go/pull/546)
- feat: switch the old tracing to single TracerProvider and add basic
trace context propagation by
[@&#8203;pawel-maciejczek](https://redirect.github.com/pawel-maciejczek)
in [#&#8203;529](https://redirect.github.com/google/adk-go/pull/529)
- fix: set SkipSummarization in RequestConfirmation to stop agent loop
by [@&#8203;code2gold](https://redirect.github.com/code2gold) in
[#&#8203;544](https://redirect.github.com/google/adk-go/pull/544)
- fix: remoteagent partial response handling leads to data duplication
by [@&#8203;yarolegovich](https://redirect.github.com/yarolegovich) in
[#&#8203;545](https://redirect.github.com/google/adk-go/pull/545)
- fix: pass long\_running\_function\_ids in the request\_confirmation
event by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;553](https://redirect.github.com/google/adk-go/pull/553)
- chore: added tests to verify tool confirmation works with a2a by
[@&#8203;yarolegovich](https://redirect.github.com/yarolegovich) in
[#&#8203;560](https://redirect.github.com/google/adk-go/pull/560)
- fix: clear aggregated text and thoughts when receiving a non-appending
task artifact update by
[@&#8203;sherryfox](https://redirect.github.com/sherryfox) in
[#&#8203;555](https://redirect.github.com/google/adk-go/pull/555)
- feat: Implement OpenTelemetry semconv tracing by
[@&#8203;pawel-maciejczek](https://redirect.github.com/pawel-maciejczek)
in [#&#8203;548](https://redirect.github.com/google/adk-go/pull/548)
- cleanup: remove `call_llm` spans after adding semconv tracing by
[@&#8203;pawel-maciejczek](https://redirect.github.com/pawel-maciejczek)
in [#&#8203;556](https://redirect.github.com/google/adk-go/pull/556)
- fix: Fix flaky TestGenerateContentTracing by
[@&#8203;pawel-maciejczek](https://redirect.github.com/pawel-maciejczek)
in [#&#8203;563](https://redirect.github.com/google/adk-go/pull/563)
- fix: enable llm variant for gemini 2.5 and below by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;562](https://redirect.github.com/google/adk-go/pull/562)
- chore: remove internal mutable session struct by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;572](https://redirect.github.com/google/adk-go/pull/572)
- Introduce Retry and Reflect pluging by
[@&#8203;caglar10ur](https://redirect.github.com/caglar10ur) in
[#&#8203;564](https://redirect.github.com/google/adk-go/pull/564)
- fix: format go.mod by direct and indirect dependencies by
[@&#8203;zchee](https://redirect.github.com/zchee) in
[#&#8203;580](https://redirect.github.com/google/adk-go/pull/580)
- feature: implement v2 trace debug endpoints based on semconv spans and
logs by
[@&#8203;pawel-maciejczek](https://redirect.github.com/pawel-maciejczek)
in [#&#8203;570](https://redirect.github.com/google/adk-go/pull/570)
- feature: enhance telemetry project validation to fail if whitespace
only is passed by opts or env var by
[@&#8203;pawel-maciejczek](https://redirect.github.com/pawel-maciejczek)
in [#&#8203;584](https://redirect.github.com/google/adk-go/pull/584)

##### New Contributors

- [@&#8203;ymodak](https://redirect.github.com/ymodak) made their first
contribution in
[#&#8203;520](https://redirect.github.com/google/adk-go/pull/520)
-
[@&#8203;pawel-maciejczek](https://redirect.github.com/pawel-maciejczek)
made their first contribution in
[#&#8203;526](https://redirect.github.com/google/adk-go/pull/526)
- [@&#8203;code2gold](https://redirect.github.com/code2gold) made their
first contribution in
[#&#8203;544](https://redirect.github.com/google/adk-go/pull/544)
- [@&#8203;sherryfox](https://redirect.github.com/sherryfox) made their
first contribution in
[#&#8203;555](https://redirect.github.com/google/adk-go/pull/555)

**Full Changelog**:
<https://github.com/google/adk-go/compare/v0.4.0...v0.5.0>

###
[`v0.4.0`](https://redirect.github.com/google/adk-go/releases/tag/v0.4.0)

[Compare
Source](https://redirect.github.com/google/adk-go/compare/v0.3.0...v0.4.0)

##### New major features

- Plugins: <https://google.github.io/adk-docs/plugins/>
- Tool Confirmation (human in the loop):
<https://google.github.io/adk-docs/tools-custom/confirmation/>
- VertexAI Session Service:
<https://google.github.io/adk-docs/sessions/session/#vertexaisessionservice>

note: adk docs will be updated with Go examples

##### What's Changed

- docs: update contributing.md by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;431](https://redirect.github.com/google/adk-go/pull/431)
- fix: align and correct eventBelongsToBranch to match adk-python by
[@&#8203;sjy3](https://redirect.github.com/sjy3) in
[#&#8203;437](https://redirect.github.com/google/adk-go/pull/437)
- fix: update time truncation in database session service by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;448](https://redirect.github.com/google/adk-go/pull/448)
- fix: Only last state change for multiple tool calls is being committed
to state by [@&#8203;majiayu000](https://redirect.github.com/majiayu000)
in [#&#8203;449](https://redirect.github.com/google/adk-go/pull/449)
- fix: remote agent responses are not stored in streaming mode by
[@&#8203;yarolegovich](https://redirect.github.com/yarolegovich) in
[#&#8203;420](https://redirect.github.com/google/adk-go/pull/420)
- fix: support CitationMetadata by
[@&#8203;nahapetyan-serob](https://redirect.github.com/nahapetyan-serob)
in [#&#8203;463](https://redirect.github.com/google/adk-go/pull/463)
- fix: parse events with errors in agenttool by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;468](https://redirect.github.com/google/adk-go/pull/468)
- chore: correct LoadArtifactHandler Route Name by
[@&#8203;IAmSurajBobade](https://redirect.github.com/IAmSurajBobade) in
[#&#8203;464](https://redirect.github.com/google/adk-go/pull/464)
- artifact: don't allow file names with path separators by
[@&#8203;rakyll](https://redirect.github.com/rakyll) in
[#&#8203;472](https://redirect.github.com/google/adk-go/pull/472)
- Implement graceful shutdown for web server via context cancellation by
[@&#8203;imrenagi](https://redirect.github.com/imrenagi) in
[#&#8203;462](https://redirect.github.com/google/adk-go/pull/462)
- fix: resolve nil pointer in tool.Context.SearchMemory in webui mode by
[@&#8203;sjy3](https://redirect.github.com/sjy3) in
[#&#8203;476](https://redirect.github.com/google/adk-go/pull/476)
- Implement OutputResponseProcessor to enable use of OutputSchema and
tools by [@&#8203;caglar10ur](https://redirect.github.com/caglar10ur) in
[#&#8203;441](https://redirect.github.com/google/adk-go/pull/441)
- feat: include gen\_ai.conversation.id in OTEL spans
([#&#8203;421](https://redirect.github.com/google/adk-go/issues/421)) by
[@&#8203;JEETDESAI25](https://redirect.github.com/JEETDESAI25) in
[#&#8203;428](https://redirect.github.com/google/adk-go/pull/428)
- fix: return nil when server has been shutdown by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;487](https://redirect.github.com/google/adk-go/pull/487)
- fix(database): cascade delete events when deleting session by
[@&#8203;iuga](https://redirect.github.com/iuga) in
[#&#8203;483](https://redirect.github.com/google/adk-go/pull/483)
- Make the type comparison case insensitive by
[@&#8203;caglar10ur](https://redirect.github.com/caglar10ur) in
[#&#8203;488](https://redirect.github.com/google/adk-go/pull/488)
- feat: add FilterToolset helper by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;489](https://redirect.github.com/google/adk-go/pull/489)
- fix: mark cancellation events as Final in Executor by
[@&#8203;nahapetyan-serob](https://redirect.github.com/nahapetyan-serob)
in [#&#8203;494](https://redirect.github.com/google/adk-go/pull/494)
- Update adk-web to
[`958c8d6`](958c8d6278)
by [@&#8203;caglar10ur](https://redirect.github.com/caglar10ur) in
[#&#8203;491](https://redirect.github.com/google/adk-go/pull/491)
- feat: add plugin package by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;480](https://redirect.github.com/google/adk-go/pull/480)
- Avoid maintaining the copyright year manually by
[@&#8203;git-hulk](https://redirect.github.com/git-hulk) in
[#&#8203;495](https://redirect.github.com/google/adk-go/pull/495)
- Add vertexAi session service by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;235](https://redirect.github.com/google/adk-go/pull/235)
- fix run mode config ineffective issue in a2a remote agent by
[@&#8203;sjy3](https://redirect.github.com/sjy3) in
[#&#8203;485](https://redirect.github.com/google/adk-go/pull/485)
- Add MCP session reconnection with Ping health check by
[@&#8203;Nerja](https://redirect.github.com/Nerja) in
[#&#8203;417](https://redirect.github.com/google/adk-go/pull/417)
- update docs for llmagent by
[@&#8203;indurireddy-TF](https://redirect.github.com/indurireddy-TF) in
[#&#8203;500](https://redirect.github.com/google/adk-go/pull/500)
- feat: enable plugin support in launcher config with tests by
[@&#8203;MarcoCerino23](https://redirect.github.com/MarcoCerino23) in
[#&#8203;503](https://redirect.github.com/google/adk-go/pull/503)
- fix: pass pluginConfig instead of only plugins by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;504](https://redirect.github.com/google/adk-go/pull/504)
- fix: long-running operation handling as a2a input-required task by
[@&#8203;yarolegovich](https://redirect.github.com/yarolegovich) in
[#&#8203;499](https://redirect.github.com/google/adk-go/pull/499)
- Fix MCP reconnection on EOF error by
[@&#8203;Nerja](https://redirect.github.com/Nerja) in
[#&#8203;505](https://redirect.github.com/google/adk-go/pull/505)
- docs: upd docs for vertexai by
[@&#8203;dpasiukevich](https://redirect.github.com/dpasiukevich) in
[#&#8203;515](https://redirect.github.com/google/adk-go/pull/515)
- Removed plugin manager's after callback symmetry by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;514](https://redirect.github.com/google/adk-go/pull/514)
- feat: add human in the loop confirmation by
[@&#8203;baptmont](https://redirect.github.com/baptmont) in
[#&#8203;490](https://redirect.github.com/google/adk-go/pull/490)
- Add custom part converters to ADK Executor. by
[@&#8203;zbirkenbuel](https://redirect.github.com/zbirkenbuel) in
[#&#8203;512](https://redirect.github.com/google/adk-go/pull/512)
- feat: provide access to session events from executor callbacks by
[@&#8203;yarolegovich](https://redirect.github.com/yarolegovich) in
[#&#8203;521](https://redirect.github.com/google/adk-go/pull/521)

##### New Contributors

- [@&#8203;sjy3](https://redirect.github.com/sjy3) made their first
contribution in
[#&#8203;437](https://redirect.github.com/google/adk-go/pull/437)
- [@&#8203;majiayu000](https://redirect.github.com/majiayu000) made
their first contribution in
[#&#8203;449](https://redirect.github.com/google/adk-go/pull/449)
-
[@&#8203;nahapetyan-serob](https://redirect.github.com/nahapetyan-serob)
made their first contribution in
[#&#8203;463](https://redirect.github.com/google/adk-go/pull/463)
- [@&#8203;IAmSurajBobade](https://redirect.github.com/IAmSurajBobade)
made their first contribution in
[#&#8203;464](https://redirect.github.com/google/adk-go/pull/464)
- [@&#8203;imrenagi](https://redirect.github.com/imrenagi) made their
first contribution in
[#&#8203;462](https://redirect.github.com/google/adk-go/pull/462)
- [@&#8203;JEETDESAI25](https://redirect.github.com/JEETDESAI25) made
their first contribution in
[#&#8203;428](https://redirect.github.com/google/adk-go/pull/428)
- [@&#8203;iuga](https://redirect.github.com/iuga) made their first
contribution in
[#&#8203;483](https://redirect.github.com/google/adk-go/pull/483)
- [@&#8203;Nerja](https://redirect.github.com/Nerja) made their first
contribution in
[#&#8203;417](https://redirect.github.com/google/adk-go/pull/417)
- [@&#8203;indurireddy-TF](https://redirect.github.com/indurireddy-TF)
made their first contribution in
[#&#8203;500](https://redirect.github.com/google/adk-go/pull/500)
- [@&#8203;MarcoCerino23](https://redirect.github.com/MarcoCerino23)
made their first contribution in
[#&#8203;503](https://redirect.github.com/google/adk-go/pull/503)
- [@&#8203;zbirkenbuel](https://redirect.github.com/zbirkenbuel) made
their first contribution in
[#&#8203;512](https://redirect.github.com/google/adk-go/pull/512)

**Full Changelog**:
<https://github.com/google/adk-go/compare/v0.3.0...v0.4.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My42Ni40IiwidXBkYXRlZEluVmVyIjoiNDMuOTEuNSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-26 14:50:01 -07:00
dependabot[bot]
259c541539 chore(deps): bump brace-expansion and gaxios in /docs/en/documentation/configuration/pre-post-processing/js/langchain (#2861)
Removes
[brace-expansion](https://github.com/juliangruber/brace-expansion). It's
no longer used after updating ancestor dependency
[gaxios](https://github.com/googleapis/google-cloud-node-core/tree/HEAD/packages/gaxios).
These dependencies need to be updated together.

Removes `brace-expansion`

Updates `gaxios` from 7.1.3 to 7.1.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/google-cloud-node-core/releases">gaxios's
releases</a>.</em></p>
<blockquote>
<h2>gaxios: v7.1.4</h2>
<h2><a
href="https://github.com/googleapis/google-cloud-node-core/compare/gaxios-v7.1.3...gaxios-v7.1.4">7.1.4</a>
(2025-12-17)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Set rimraf as dev dependency (<a
href="https://redirect.github.com/googleapis/google-cloud-node-core/issues/837">#837</a>)
(<a
href="0622b50989">0622b50</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/google-cloud-node-core/blob/main/packages/gaxios/CHANGELOG.md">gaxios's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/googleapis/google-cloud-node-core/compare/gaxios-v7.1.3...gaxios-v7.1.4">7.1.4</a>
(2025-12-17)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Set rimraf as dev dependency (<a
href="https://redirect.github.com/googleapis/google-cloud-node-core/issues/837">#837</a>)
(<a
href="0622b50989">0622b50</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="383aa514c3"><code>383aa51</code></a>
chore: release main</li>
<li><a
href="4b4ec058af"><code>4b4ec05</code></a>
build: integrate nodejs core libraries (<a
href="https://github.com/googleapis/google-cloud-node-core/tree/HEAD/packages/gaxios/issues/848">#848</a>)</li>
<li><a
href="0622b50989"><code>0622b50</code></a>
fix: set rimraf as dev dependency (<a
href="https://github.com/googleapis/google-cloud-node-core/tree/HEAD/packages/gaxios/issues/837">#837</a>)</li>
<li>See full diff in <a
href="https://github.com/googleapis/google-cloud-node-core/commits/gaxios-v7.1.4/packages/gaxios">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-26 14:43:56 -07:00
Mend Renovate
6a9d693c7b chore(deps): update module github.com/couchbase/gocb/v2 to v2.12.1 (#2854)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[github.com/couchbase/gocb/v2](https://redirect.github.com/couchbase/gocb)
| `v2.12.0` → `v2.12.1` |
![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fcouchbase%2fgocb%2fv2/v2.12.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fcouchbase%2fgocb%2fv2/v2.12.0/v2.12.1?slim=true)
|

---

### Release Notes

<details>
<summary>couchbase/gocb (github.com/couchbase/gocb/v2)</summary>

###
[`v2.12.1`](https://redirect.github.com/couchbase/gocb/compare/v2.12.0...v2.12.1)

[Compare
Source](https://redirect.github.com/couchbase/gocb/compare/v2.12.0...v2.12.1)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My42Ni40IiwidXBkYXRlZEluVmVyIjoiNDMuOTEuNSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-26 21:37:24 +00:00
Anubhav Dhawan
84d530d10a chore: v0.30.0 release 2026-03-27 02:44:54 +05:30
Mend Renovate
1d21b6980c chore(deps): update github actions (major) (#2850)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/checkout](https://redirect.github.com/actions/checkout) |
action | major | `v4` → `v6` |
|
[actions/download-artifact](https://redirect.github.com/actions/download-artifact)
| action | major | `v4` → `v8` |
| [actions/setup-node](https://redirect.github.com/actions/setup-node) |
action | major | `v4` → `v6` |
|
[actions/setup-python](https://redirect.github.com/actions/setup-python)
| action | major | `v5` → `v6` |
|
[actions/upload-artifact](https://redirect.github.com/actions/upload-artifact)
| action | major | `v4` → `v7` |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/363) for more information.

---

### Release Notes

<details>
<summary>actions/checkout (actions/checkout)</summary>

### [`v6`](https://redirect.github.com/actions/checkout/compare/v5...v6)

[Compare
Source](https://redirect.github.com/actions/checkout/compare/v5...v6)

### [`v5`](https://redirect.github.com/actions/checkout/compare/v4...v5)

[Compare
Source](https://redirect.github.com/actions/checkout/compare/v4...v5)

</details>

<details>
<summary>actions/download-artifact (actions/download-artifact)</summary>

###
[`v8`](https://redirect.github.com/actions/download-artifact/compare/v7...v8)

[Compare
Source](https://redirect.github.com/actions/download-artifact/compare/v7...v8)

###
[`v7`](https://redirect.github.com/actions/download-artifact/compare/v6...v7)

[Compare
Source](https://redirect.github.com/actions/download-artifact/compare/v6...v7)

###
[`v6`](https://redirect.github.com/actions/download-artifact/compare/v5...v6)

[Compare
Source](https://redirect.github.com/actions/download-artifact/compare/v5...v6)

###
[`v5`](https://redirect.github.com/actions/download-artifact/compare/v4...v5)

[Compare
Source](https://redirect.github.com/actions/download-artifact/compare/v4...v5)

</details>

<details>
<summary>actions/setup-node (actions/setup-node)</summary>

###
[`v6`](https://redirect.github.com/actions/setup-node/compare/v5...v6)

[Compare
Source](https://redirect.github.com/actions/setup-node/compare/v5...v6)

###
[`v5`](https://redirect.github.com/actions/setup-node/compare/v4...v5)

[Compare
Source](https://redirect.github.com/actions/setup-node/compare/v4...v5)

</details>

<details>
<summary>actions/setup-python (actions/setup-python)</summary>

###
[`v6`](https://redirect.github.com/actions/setup-python/compare/v5...v6)

[Compare
Source](https://redirect.github.com/actions/setup-python/compare/v5...v6)

</details>

<details>
<summary>actions/upload-artifact (actions/upload-artifact)</summary>

###
[`v7`](https://redirect.github.com/actions/upload-artifact/compare/v6...v7)

[Compare
Source](https://redirect.github.com/actions/upload-artifact/compare/v6...v7)

###
[`v6`](https://redirect.github.com/actions/upload-artifact/compare/v5...v6)

[Compare
Source](https://redirect.github.com/actions/upload-artifact/compare/v5...v6)

###
[`v5`](https://redirect.github.com/actions/upload-artifact/compare/v4...v5)

[Compare
Source](https://redirect.github.com/actions/upload-artifact/compare/v4...v5)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My42Ni40IiwidXBkYXRlZEluVmVyIjoiNDMuOTEuNSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-26 14:09:34 -07:00
Mohammadreza Pourreza
a8cc6a1f6d docs: add advanced usage section for Parameterized Secure Views in cl… (#2860)
Adds an Advanced Usage section to the cloud-gemini-data-analytics-query
tool documentation covering Parameterized Secure Views (PSV).

PSV provides Row-Level Access Control (RLAC) by requiring mandatory
parameters at query time, preventing callers from accessing underlying
base tables directly. This section explains how PSV works conceptually
and provides ready-to-use YAML configuration examples for both
PostgreSQL and MySQL engines, including the correct
parameterizedSecureViewParameters structure.


- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-03-26 16:55:53 -04:00
Wenxin Du
283e4e3317 feat(auth): support manual PRM override (#2717)
Add flag to allow manual PRM override.
2026-03-26 20:30:12 +00:00
Twisha Bansal
3bfeebe684 chore: v0.29.0 release 2026-03-27 01:14:10 +05:30
Twisha Bansal
4031a3847b npm v0.28.0 release 2026-03-27 01:14:10 +05:30
Twisha Bansal
9d109e948e update versions for v0.27.0 release 2026-03-27 01:14:10 +05:30
Twisha Bansal
082d3b28eb have better release scripts 2026-03-27 01:14:10 +05:30
Twisha Bansal
dd1d1cd7ff update versions 2026-03-27 01:14:10 +05:30
Anubhav Dhawan
0cb96930df feat(npm): Bump server package versions to 0.25.0 and generate new platform-specific build artifacts. (#2284)
Releases the NPM package versions with latest toolbox release
(`v.0.25.0`).
2026-03-27 01:14:10 +05:30
Twisha Bansal
cc72115cf1 update versions'
update versions
2026-03-27 01:14:10 +05:30
Twisha Bansal
3dfb12a42b update version 2026-03-27 01:14:10 +05:30
Twisha Bansal
4d1fe5986d script for server release 2026-03-27 01:14:10 +05:30
Twisha Bansal
7c72d20f87 update dep versions 2026-03-27 01:14:10 +05:30
Twisha Bansal
243bdaeff2 rename file 2026-03-27 01:14:10 +05:30
Twisha Bansal
2c57b25fb3 release dep package script 2026-03-27 01:14:10 +05:30
Twisha Bansal
ef7323c61d add script to update server packages 2026-03-27 01:14:10 +05:30
Twisha Bansal
e53d1a645e update versions 2026-03-27 01:14:10 +05:30
Twisha Bansal
b9fe23927a bump version 2026-03-27 01:14:10 +05:30
Twisha Bansal
552cb5edb2 update supported platforms 2026-03-27 01:14:10 +05:30
Twisha Bansal
dac445eb6b bump version 2026-03-27 01:14:10 +05:30
Twisha Bansal
f05435f578 update linux package versions 2026-03-27 01:14:10 +05:30
Twisha Bansal
d2b4746563 fix server package 2026-03-27 01:14:10 +05:30
Twisha Bansal
59c9f13830 update server versions 2026-03-27 01:14:10 +05:30
Twisha Bansal
a47ff3ad98 upate version 2026-03-27 01:14:10 +05:30
Twisha Bansal
c999846ec2 remove apple quarantine 2026-03-27 01:14:10 +05:30
Twisha Bansal
0489c57796 Update downloadBinary.js 2026-03-27 01:14:10 +05:30
Twisha Bansal
f1fa046de6 Update downloadBinary.js 2026-03-27 01:14:10 +05:30
Twisha Bansal
79e287d0a6 Update downloadBinary.js 2026-03-27 01:14:10 +05:30
Twisha Bansal
142d2a6766 Update downloadBinary.js 2026-03-27 01:14:10 +05:30
Twisha Bansal
d17038f030 Update testing.md 2026-03-27 01:14:10 +05:30
Twisha Bansal
97bb2764fa fix 2026-03-27 01:14:10 +05:30
Twisha Bansal
bf96093a02 fix path 2026-03-27 01:14:10 +05:30
Twisha Bansal
2e486ba511 fix package.json 2026-03-27 01:14:10 +05:30
Twisha Bansal
b118dfbcdb fix testing 2026-03-27 01:14:10 +05:30
Twisha Bansal
d379d0d474 Update testing.md 2026-03-27 01:14:10 +05:30
Twisha Bansal
6c8ac81a87 Update testing.md 2026-03-27 01:14:10 +05:30
Twisha Bansal
c038ac496b fix package 2026-03-27 01:14:10 +05:30
Twisha Bansal
c20d0f5616 Fixed readme 2026-03-27 01:14:10 +05:30
Twisha Bansal
9c6af13a8e add markdown on how to test 2026-03-27 01:14:10 +05:30
Twisha Bansal
daec9deeeb fix 2026-03-27 01:14:10 +05:30
Twisha Bansal
08c08ec3a8 fix 2026-03-27 01:14:09 +05:30
Twisha Bansal
6de7b5e6f5 add files 2026-03-27 01:14:09 +05:30
dishaprakash
f8891b82fc fix(ci): Remove search index generation from preview deployment workflow (#2859)
## Description

This PR removes the search index generation from the preview deployment
workflow. This step is not required in this workflow as it is handled in
the [preview build
workflow](5a3465e960/.github/workflows/docs_preview_build.yaml (L72)).

This fixes the PR Preview failures

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-03-27 01:03:41 +05:30
Wenxin Du
b53dcf2069 feat(auth): add Protected Resource Metadata endpoint (#2698)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-03-26 19:20:03 +00:00
dependabot[bot]
5a3465e960 chore(deps): bump picomatch in /docs/en/documentation/getting-started/quickstart/js/adk (#2851)
Bumps and [picomatch](https://github.com/micromatch/picomatch). These
dependencies needed to be updated together.
Updates `picomatch` from 2.3.1 to 2.3.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/micromatch/picomatch/releases">picomatch's
releases</a>.</em></p>
<blockquote>
<h2>2.3.2</h2>
<p>This is a security release fixing several security relevant
issues.</p>
<h2>What's Changed</h2>
<ul>
<li>fix: exception when glob pattern contains constructor by <a
href="https://github.com/Jason3S"><code>@​Jason3S</code></a> in <a
href="https://redirect.github.com/micromatch/picomatch/pull/144">micromatch/picomatch#144</a></li>
<li>Fix for <a
href="https://github.com/micromatch/picomatch/security/advisories/GHSA-c2c7-rcm5-vvqj">CVE-2026-33671</a></li>
<li>Fix for <a
href="https://github.com/micromatch/picomatch/security/advisories/GHSA-3v7f-55p6-f55p">CVE-2026-33672</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2">https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md">picomatch's
changelog</a>.</em></p>
<blockquote>
<h1>Release history</h1>
<p><strong>All notable changes to this project will be documented in
this file.</strong></p>
<p>The format is based on <a
href="http://keepachangelog.com/en/1.0.0/">Keep a Changelog</a>
and this project adheres to <a
href="http://semver.org/spec/v2.0.0.html">Semantic Versioning</a>.</p>
<!-- raw HTML omitted -->
<ul>
<li>Changelogs are for humans, not machines.</li>
<li>There should be an entry for every single version.</li>
<li>The same types of changes should be grouped.</li>
<li>Versions and sections should be linkable.</li>
<li>The latest version comes first.</li>
<li>The release date of each versions is displayed.</li>
<li>Mention whether you follow Semantic Versioning.</li>
</ul>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Changelog entries are classified using the following labels <em>(from
<a href="http://keepachangelog.com/">keep-a-changelog</a></em>):</p>
<ul>
<li><code>Added</code> for new features.</li>
<li><code>Changed</code> for changes in existing functionality.</li>
<li><code>Deprecated</code> for soon-to-be removed features.</li>
<li><code>Removed</code> for now removed features.</li>
<li><code>Fixed</code> for any bug fixes.</li>
<li><code>Security</code> in case of vulnerabilities.</li>
</ul>
<!-- raw HTML omitted -->
<h2>4.0.0 (2024-02-07)</h2>
<h3>Fixes</h3>
<ul>
<li>Fix bad text values in parse <a
href="https://redirect.github.com/micromatch/picomatch/issues/126">#126</a>,
thanks to <a
href="https://github.com/connor4312"><code>@​connor4312</code></a></li>
</ul>
<h3>Changed</h3>
<ul>
<li>Remove process global to work outside of node <a
href="https://redirect.github.com/micromatch/picomatch/issues/129">#129</a>,
thanks to <a
href="https://github.com/styfle"><code>@​styfle</code></a></li>
<li>Add sideEffects to package.json <a
href="https://redirect.github.com/micromatch/picomatch/issues/128">#128</a>,
thanks to <a
href="https://github.com/frandiox"><code>@​frandiox</code></a></li>
<li>Removed <code>os</code>, make compatible browser environment. See <a
href="https://redirect.github.com/micromatch/picomatch/issues/124">#124</a>,
thanks to <a
href="https://github.com/gwsbhqt"><code>@​gwsbhqt</code></a></li>
</ul>
<h2>3.0.1</h2>
<h3>Fixes</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="81cba8d4b7"><code>81cba8d</code></a>
Publish 2.3.2</li>
<li><a
href="fc1f6b6900"><code>fc1f6b6</code></a>
Merge commit from fork</li>
<li><a
href="eec17aee54"><code>eec17ae</code></a>
Merge commit from fork</li>
<li><a
href="78f8ca4362"><code>78f8ca4</code></a>
Merge pull request <a
href="https://redirect.github.com/micromatch/picomatch/issues/156">#156</a>
from micromatch/backport-144</li>
<li><a
href="3f4f10eaa6"><code>3f4f10e</code></a>
Merge pull request <a
href="https://redirect.github.com/micromatch/picomatch/issues/144">#144</a>
from Jason3S/jdent-object-properties</li>
<li>See full diff in <a
href="https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `picomatch` from 4.0.3 to 4.0.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/micromatch/picomatch/releases">picomatch's
releases</a>.</em></p>
<blockquote>
<h2>2.3.2</h2>
<p>This is a security release fixing several security relevant
issues.</p>
<h2>What's Changed</h2>
<ul>
<li>fix: exception when glob pattern contains constructor by <a
href="https://github.com/Jason3S"><code>@​Jason3S</code></a> in <a
href="https://redirect.github.com/micromatch/picomatch/pull/144">micromatch/picomatch#144</a></li>
<li>Fix for <a
href="https://github.com/micromatch/picomatch/security/advisories/GHSA-c2c7-rcm5-vvqj">CVE-2026-33671</a></li>
<li>Fix for <a
href="https://github.com/micromatch/picomatch/security/advisories/GHSA-3v7f-55p6-f55p">CVE-2026-33672</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2">https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md">picomatch's
changelog</a>.</em></p>
<blockquote>
<h1>Release history</h1>
<p><strong>All notable changes to this project will be documented in
this file.</strong></p>
<p>The format is based on <a
href="http://keepachangelog.com/en/1.0.0/">Keep a Changelog</a>
and this project adheres to <a
href="http://semver.org/spec/v2.0.0.html">Semantic Versioning</a>.</p>
<!-- raw HTML omitted -->
<ul>
<li>Changelogs are for humans, not machines.</li>
<li>There should be an entry for every single version.</li>
<li>The same types of changes should be grouped.</li>
<li>Versions and sections should be linkable.</li>
<li>The latest version comes first.</li>
<li>The release date of each versions is displayed.</li>
<li>Mention whether you follow Semantic Versioning.</li>
</ul>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Changelog entries are classified using the following labels <em>(from
<a href="http://keepachangelog.com/">keep-a-changelog</a></em>):</p>
<ul>
<li><code>Added</code> for new features.</li>
<li><code>Changed</code> for changes in existing functionality.</li>
<li><code>Deprecated</code> for soon-to-be removed features.</li>
<li><code>Removed</code> for now removed features.</li>
<li><code>Fixed</code> for any bug fixes.</li>
<li><code>Security</code> in case of vulnerabilities.</li>
</ul>
<!-- raw HTML omitted -->
<h2>4.0.0 (2024-02-07)</h2>
<h3>Fixes</h3>
<ul>
<li>Fix bad text values in parse <a
href="https://redirect.github.com/micromatch/picomatch/issues/126">#126</a>,
thanks to <a
href="https://github.com/connor4312"><code>@​connor4312</code></a></li>
</ul>
<h3>Changed</h3>
<ul>
<li>Remove process global to work outside of node <a
href="https://redirect.github.com/micromatch/picomatch/issues/129">#129</a>,
thanks to <a
href="https://github.com/styfle"><code>@​styfle</code></a></li>
<li>Add sideEffects to package.json <a
href="https://redirect.github.com/micromatch/picomatch/issues/128">#128</a>,
thanks to <a
href="https://github.com/frandiox"><code>@​frandiox</code></a></li>
<li>Removed <code>os</code>, make compatible browser environment. See <a
href="https://redirect.github.com/micromatch/picomatch/issues/124">#124</a>,
thanks to <a
href="https://github.com/gwsbhqt"><code>@​gwsbhqt</code></a></li>
</ul>
<h2>3.0.1</h2>
<h3>Fixes</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="81cba8d4b7"><code>81cba8d</code></a>
Publish 2.3.2</li>
<li><a
href="fc1f6b6900"><code>fc1f6b6</code></a>
Merge commit from fork</li>
<li><a
href="eec17aee54"><code>eec17ae</code></a>
Merge commit from fork</li>
<li><a
href="78f8ca4362"><code>78f8ca4</code></a>
Merge pull request <a
href="https://redirect.github.com/micromatch/picomatch/issues/156">#156</a>
from micromatch/backport-144</li>
<li><a
href="3f4f10eaa6"><code>3f4f10e</code></a>
Merge pull request <a
href="https://redirect.github.com/micromatch/picomatch/issues/144">#144</a>
from Jason3S/jdent-object-properties</li>
<li>See full diff in <a
href="https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-26 11:54:19 -07:00
Mend Renovate
a00343e8fd chore(deps): update github actions (#2849)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/cache](https://redirect.github.com/actions/cache)
([changelog](cdf6c1fa76..668228422a))
| action | digest | `cdf6c1f` → `6682284` |
| [actions/checkout](https://redirect.github.com/actions/checkout) |
action | pinDigest | → `34e1148` |
|
[actions/download-artifact](https://redirect.github.com/actions/download-artifact)
| action | pinDigest | → `d3f86a1` |
| [actions/setup-node](https://redirect.github.com/actions/setup-node) |
action | pinDigest | → `49933ea` |
| [actions/setup-node](https://redirect.github.com/actions/setup-node)
([changelog](6044e13b5d..53b83947a5))
| action | digest | `6044e13` → `53b8394` |
|
[actions/setup-python](https://redirect.github.com/actions/setup-python)
| action | pinDigest | → `a26af69` |
|
[actions/upload-artifact](https://redirect.github.com/actions/upload-artifact)
| action | pinDigest | → `ea165f8` |
|
[cloudflare/wrangler-action](https://redirect.github.com/cloudflare/wrangler-action)
| action | pinDigest | → `da0e0df` |
|
[peaceiris/actions-gh-pages](https://redirect.github.com/peaceiris/actions-gh-pages)
| action | pinDigest | → `4f9cc66` |
|
[peaceiris/actions-hugo](https://redirect.github.com/peaceiris/actions-hugo)
| action | pinDigest | → `75d2e84` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My42Ni40IiwidXBkYXRlZEluVmVyIjoiNDMuOTEuNSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-26 18:49:14 +00:00
dependabot[bot]
293a5341f8 chore(deps): bump yaml from 2.8.1 to 2.8.3 in /docs/en/documentation/getting-started/quickstart/js/genkit (#2848)
Bumps [yaml](https://github.com/eemeli/yaml) from 2.8.1 to 2.8.3.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/eemeli/yaml/releases">yaml's
releases</a>.</em></p>
<blockquote>
<h2>v2.8.3</h2>
<ul>
<li>Add <code>trailingComma</code> ToString option for multiline flow
formatting (<a
href="https://redirect.github.com/eemeli/yaml/issues/670">#670</a>)</li>
<li>Catch stack overflow during node composition (1e84ebb)</li>
</ul>
<h2>v2.8.2</h2>
<ul>
<li>Serialize -0 as -0 (<a
href="https://redirect.github.com/eemeli/yaml/issues/638">#638</a>)</li>
<li>Do not double newlines for empty map values (<a
href="https://redirect.github.com/eemeli/yaml/issues/642">#642</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="ce14587484"><code>ce14587</code></a>
2.8.3</li>
<li><a
href="1e84ebbea7"><code>1e84ebb</code></a>
fix: Catch stack overflow during node composition</li>
<li><a
href="6b24090280"><code>6b24090</code></a>
ci: Include Prettier check in lint action</li>
<li><a
href="9424dee38c"><code>9424dee</code></a>
chore: Refresh lockfile</li>
<li><a
href="d1aca82bc1"><code>d1aca82</code></a>
Add trailingComma ToString option for multiline flow formatting (<a
href="https://redirect.github.com/eemeli/yaml/issues/670">#670</a>)</li>
<li><a
href="43215099f7"><code>4321509</code></a>
ci: Drop the branch filter from GitHub PR actions</li>
<li><a
href="47207d0fc7"><code>47207d0</code></a>
chore: Update docs-slate</li>
<li><a
href="5212faeed5"><code>5212fae</code></a>
chore: Update docs-slate</li>
<li><a
href="086fa6b5ba"><code>086fa6b</code></a>
2.8.2</li>
<li><a
href="95f01e9803"><code>95f01e9</code></a>
chore: Add funding to package.json</li>
<li>Additional commits viewable in <a
href="https://github.com/eemeli/yaml/compare/v2.8.1...v2.8.3">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=yaml&package-manager=npm_and_yarn&previous-version=2.8.1&new-version=2.8.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-26 11:46:54 -07:00
Yuan Teoh
68d5fac31d docs: add upgrading doc for v1 release (#2832)
The new markdown doc outlines changes associated with Toolbox v1.0.0
release.

---------

Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-03-26 11:16:28 -07:00
sumedhdk22
409a354d45 feat(dataplex): improve dataplex params (#2855)
## Description

feat(dataplex): refine dataplex tools for better agent usability

Refines the parameters and descriptions for Dataplex tools to reduce
redundancy
and improve tool selection accuracy for AI agents.

Key changes:
- Removed the redundant 'name' parameter from 'lookup_entry' and
'lookup_context' tools.
- Implemented automatic derivation of the parent resource path (project
and location)
  from the 'entry' or 'resources' arguments.
- Added validation logic to ensure provided resource names follow the
correct format
and that all resources in a batch request belong to the same project and
location.
- Enhanced tool and parameter descriptions across 'search_entries',
'lookup_entry',
and 'lookup_context' to provide clearer instructions and search syntax
examples.
- Updated integration tests and YAML configurations to align with the
new schema.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-03-26 17:40:28 +00:00
Wenxin Du
f6678f8e29 feat(auth): add generic authService type for MCP (#2619)
Add new generic `authService` type as part of the MCP auth
implementation.
2026-03-26 13:12:43 -04:00
dishaprakash
9ebd93a8ec fix(docs): Skip empty folders in pagination & reduce PR comment noise (#2853)
## Description

This PR addresses two UX and CI/CD improvements:
- Pagination (pager.html): Injects a "fast-forward/rewind" filter to
automatically skip empty structural wrappers (like database roots,
tools/, and samples/ folders) in the integrations directory. This
ensures seamless sequential navigation without trapping users in empty
folders
- Preview Workflow: Updates the Cloudflare deployment action to check
for an existing preview link via a hidden HTML marker. It now posts the
URL only once per PR, eliminating comment spam on subsequent pushes.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [x] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-26 15:46:55 +05:30
dishaprakash
5b25ce0812 docs!: v1 docsite (#2831)
## Description

This PR creates the new v1 docsite.

### Documentation Section
- Clear use-case based folder structure and navigation

### Integrations Section
- New folder structure for each source and compatible tools
- Integration specific samples are moved into their folders

### Samples
- New samples gallery to search for samples from all across the
documentation site
- Search and filter based on tags

### Reference
- FAQ and CLI details

### Hugo
- New secondary top navbar
- Increased search capability

## Merge conflicts
- versioning.md has been added to path `docs/en/reference/versioning.md`
- style-guide has been added to path `docs/en/reference/style-guide.md`

## CloudFlare setup
- workflows added to deploy to cloudflare for new release, dev and
previous release
- individual ephemeral PR preview using cloudflare pages

## Individual PRs
- https://github.com/googleapis/genai-toolbox/pull/2647
- https://github.com/googleapis/genai-toolbox/pull/2648
- https://github.com/googleapis/genai-toolbox/pull/2649
- https://github.com/googleapis/genai-toolbox/pull/2650
- https://github.com/googleapis/genai-toolbox/pull/2652
- https://github.com/googleapis/genai-toolbox/pull/2664
- https://github.com/googleapis/genai-toolbox/pull/2665
- https://github.com/googleapis/genai-toolbox/pull/2666
- https://github.com/googleapis/genai-toolbox/pull/2668
- https://github.com/googleapis/genai-toolbox/pull/2670
- https://github.com/googleapis/genai-toolbox/pull/2723
- https://github.com/googleapis/genai-toolbox/pull/2779
- https://github.com/googleapis/genai-toolbox/pull/2788
- https://github.com/googleapis/genai-toolbox/pull/2790

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [x] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-03-26 06:38:01 +05:30
DEEVEN SERU
5bef954507 fix(http)!: sanitize non-2xx error output (#2654)
## Summary
- sanitize non-2xx response errors by default (no upstream body)
- add returnFullError opt-in for raw body in error
- log truncated body at debug level when sanitized
- add regression tests + docs
## Breaking change
- non-2xx errors now return sanitized messages unless returnFullError is
enabled
## Testing
- go test ./internal/sources/http
   Fixes #2617

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-25 23:46:59 +00:00
Haoyu Wang
4564efe754 fix(skills): fix integer parameter parsing through agent skills (#2847)
This PR fixes an issue where integer parameters were incorrectly parsed
as float64 when invoking tools via the CLI.

Co-authored-by: Pavan Krishna Rampalli <pavanrampalli@google.com>

---------

Co-authored-by: Pavan Krishna Rampalli <pavanrampalli@google.com>
2026-03-25 19:04:22 -04:00
Yuan Teoh
7a070dae4f feat!: add a new enable-api flag (#2846)
This PR introduces a new `--enable-api` command-line flag to activate
the /api endpoint. By default, this endpoint is disabled.

**Usage:**

```
./toolbox --enable-api
```

**Important Notes:**

* UI Dependency: Until the UI is officially migrated, the UI requires
the API to function. You must run the toolbox with both flags:
`./toolbox --ui --enable-api`.
* Testing: The integration tests are now configured to run with the
`--enable-api` flag until it is fully migrated.

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-25 13:27:17 -07:00
Mend Renovate
d0879a7a80 chore(deps): update go (#2835)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) | Type |
Update | Pending |
|---|---|---|---|---|---|---|
|
[cloud.google.com/go/alloydbconn](https://redirect.github.com/googlecloudplatform/alloydb-go-connector)
| `v1.17.3` → `v1.18.0` |
![age](https://developer.mend.io/api/mc/badges/age/go/cloud.google.com%2fgo%2falloydbconn/v1.18.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/cloud.google.com%2fgo%2falloydbconn/v1.17.3/v1.18.0?slim=true)
| require | minor | `v1.18.1` |
|
[cloud.google.com/go/bigtable](https://redirect.github.com/googleapis/google-cloud-go)
| `v1.42.0` → `v1.43.0` |
![age](https://developer.mend.io/api/mc/badges/age/go/cloud.google.com%2fgo%2fbigtable/v1.43.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/cloud.google.com%2fgo%2fbigtable/v1.42.0/v1.43.0?slim=true)
| require | minor | |
|
[cloud.google.com/go/cloudsqlconn](https://redirect.github.com/googlecloudplatform/cloud-sql-go-connector)
| `v1.20.1` → `v1.20.2` |
![age](https://developer.mend.io/api/mc/badges/age/go/cloud.google.com%2fgo%2fcloudsqlconn/v1.20.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/cloud.google.com%2fgo%2fcloudsqlconn/v1.20.1/v1.20.2?slim=true)
| require | patch | |
|
[cloud.google.com/go/geminidataanalytics](https://redirect.github.com/googleapis/google-cloud-go)
| `v0.7.0` → `v0.8.0` |
![age](https://developer.mend.io/api/mc/badges/age/go/cloud.google.com%2fgo%2fgeminidataanalytics/v0.8.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/cloud.google.com%2fgo%2fgeminidataanalytics/v0.7.0/v0.8.0?slim=true)
| require | minor | |
| [github.com/jackc/pgx/v5](https://redirect.github.com/jackc/pgx) |
`v5.8.0` → `v5.9.1` |
![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fjackc%2fpgx%2fv5/v5.9.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fjackc%2fpgx%2fv5/v5.8.0/v5.9.1?slim=true)
| require | minor | |
|
[github.com/nakagami/firebirdsql](https://redirect.github.com/nakagami/firebirdsql)
| `v0.9.15` → `v0.9.16` |
![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fnakagami%2ffirebirdsql/v0.9.16?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fnakagami%2ffirebirdsql/v0.9.15/v0.9.16?slim=true)
| require | patch | |
|
[github.com/testcontainers/testcontainers-go](https://redirect.github.com/testcontainers/testcontainers-go)
| `v0.40.0` → `v0.41.0` |
![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2ftestcontainers%2ftestcontainers-go/v0.41.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2ftestcontainers%2ftestcontainers-go/v0.40.0/v0.41.0?slim=true)
| require | minor | |
|
[github.com/testcontainers/testcontainers-go/modules/cockroachdb](https://redirect.github.com/testcontainers/testcontainers-go)
| `v0.40.0` → `v0.41.0` |
![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2ftestcontainers%2ftestcontainers-go%2fmodules%2fcockroachdb/v0.41.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2ftestcontainers%2ftestcontainers-go%2fmodules%2fcockroachdb/v0.40.0/v0.41.0?slim=true)
| require | minor | |
|
[github.com/valkey-io/valkey-go](https://redirect.github.com/valkey-io/valkey-go)
| `v1.0.72` → `v1.0.73` |
![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fvalkey-io%2fvalkey-go/v1.0.73?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fvalkey-io%2fvalkey-go/v1.0.72/v1.0.73?slim=true)
| require | patch | |
| [go](https://go.dev/)
([source](https://redirect.github.com/golang/go)) | `1.25.8` → `1.26.1`
|
![age](https://developer.mend.io/api/mc/badges/age/golang-version/go/1.26.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/golang-version/go/1.25.8/1.26.1?slim=true)
| toolchain | minor | |
|
[go.opentelemetry.io/contrib/propagators/autoprop](https://redirect.github.com/open-telemetry/opentelemetry-go-contrib)
| `v0.66.0` → `v0.67.0` |
![age](https://developer.mend.io/api/mc/badges/age/go/go.opentelemetry.io%2fcontrib%2fpropagators%2fautoprop/v0.67.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/go.opentelemetry.io%2fcontrib%2fpropagators%2fautoprop/v0.66.0/v0.67.0?slim=true)
| require | minor | |
|
[go.opentelemetry.io/otel](https://redirect.github.com/open-telemetry/opentelemetry-go)
| `v1.41.0` → `v1.42.0` |
![age](https://developer.mend.io/api/mc/badges/age/go/go.opentelemetry.io%2fotel/v1.42.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/go.opentelemetry.io%2fotel/v1.41.0/v1.42.0?slim=true)
| require | minor | |
|
[go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp](https://redirect.github.com/open-telemetry/opentelemetry-go)
| `v1.41.0` → `v1.42.0` |
![age](https://developer.mend.io/api/mc/badges/age/go/go.opentelemetry.io%2fotel%2fexporters%2fotlp%2fotlpmetric%2fotlpmetrichttp/v1.42.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/go.opentelemetry.io%2fotel%2fexporters%2fotlp%2fotlpmetric%2fotlpmetrichttp/v1.41.0/v1.42.0?slim=true)
| require | minor | |
|
[go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp](https://redirect.github.com/open-telemetry/opentelemetry-go)
| `v1.41.0` → `v1.42.0` |
![age](https://developer.mend.io/api/mc/badges/age/go/go.opentelemetry.io%2fotel%2fexporters%2fotlp%2fotlptrace%2fotlptracehttp/v1.42.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/go.opentelemetry.io%2fotel%2fexporters%2fotlp%2fotlptrace%2fotlptracehttp/v1.41.0/v1.42.0?slim=true)
| require | minor | |
|
[go.opentelemetry.io/otel/metric](https://redirect.github.com/open-telemetry/opentelemetry-go)
| `v1.41.0` → `v1.42.0` |
![age](https://developer.mend.io/api/mc/badges/age/go/go.opentelemetry.io%2fotel%2fmetric/v1.42.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/go.opentelemetry.io%2fotel%2fmetric/v1.41.0/v1.42.0?slim=true)
| require | minor | |
|
[go.opentelemetry.io/otel/sdk](https://redirect.github.com/open-telemetry/opentelemetry-go)
| `v1.41.0` → `v1.42.0` |
![age](https://developer.mend.io/api/mc/badges/age/go/go.opentelemetry.io%2fotel%2fsdk/v1.42.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/go.opentelemetry.io%2fotel%2fsdk/v1.41.0/v1.42.0?slim=true)
| require | minor | |
|
[go.opentelemetry.io/otel/sdk/metric](https://redirect.github.com/open-telemetry/opentelemetry-go)
| `v1.41.0` → `v1.42.0` |
![age](https://developer.mend.io/api/mc/badges/age/go/go.opentelemetry.io%2fotel%2fsdk%2fmetric/v1.42.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/go.opentelemetry.io%2fotel%2fsdk%2fmetric/v1.41.0/v1.42.0?slim=true)
| require | minor | |
|
[go.opentelemetry.io/otel/trace](https://redirect.github.com/open-telemetry/opentelemetry-go)
| `v1.41.0` → `v1.42.0` |
![age](https://developer.mend.io/api/mc/badges/age/go/go.opentelemetry.io%2fotel%2ftrace/v1.42.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/go.opentelemetry.io%2fotel%2ftrace/v1.41.0/v1.42.0?slim=true)
| require | minor | |
|
[google.golang.org/genai](https://redirect.github.com/googleapis/go-genai)
| `v1.49.0` → `v1.51.0` |
![age](https://developer.mend.io/api/mc/badges/age/go/google.golang.org%2fgenai/v1.51.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/google.golang.org%2fgenai/v1.49.0/v1.51.0?slim=true)
| require | minor | |
|
[google.golang.org/genproto](https://redirect.github.com/googleapis/go-genproto)
| `a57be14` → `d00831a` |
![age](https://developer.mend.io/api/mc/badges/age/go/google.golang.org%2fgenproto/v0.0.0-20260319201613-d00831a3d3e7?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/google.golang.org%2fgenproto/v0.0.0-20260226221140-a57be14db171/v0.0.0-20260319201613-d00831a3d3e7?slim=true)
| require | digest | |
| [modernc.org/sqlite](https://gitlab.com/cznic/sqlite) | `v1.46.1` →
`v1.47.0` |
![age](https://developer.mend.io/api/mc/badges/age/go/modernc.org%2fsqlite/v1.47.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/modernc.org%2fsqlite/v1.46.1/v1.47.0?slim=true)
| require | minor | |

---

### Release Notes

<details>
<summary>googlecloudplatform/alloydb-go-connector
(cloud.google.com/go/alloydbconn)</summary>

###
[`v1.18.0`](https://redirect.github.com/GoogleCloudPlatform/alloydb-go-connector/releases/tag/v1.18.0)

[Compare
Source](https://redirect.github.com/googlecloudplatform/alloydb-go-connector/compare/v1.17.3...v1.18.0)

##### Features

- bump lowest Go version to v1.25
([#&#8203;756](https://redirect.github.com/GoogleCloudPlatform/alloydb-go-connector/issues/756))
([2620045](2620045509))

</details>

<details>
<summary>googlecloudplatform/cloud-sql-go-connector
(cloud.google.com/go/cloudsqlconn)</summary>

###
[`v1.20.2`](https://redirect.github.com/GoogleCloudPlatform/cloud-sql-go-connector/releases/tag/v1.20.2)

[Compare
Source](https://redirect.github.com/googlecloudplatform/cloud-sql-go-connector/compare/v1.20.1...v1.20.2)

##### Bug Fixes

- update dependencies to latest
([#&#8203;1075](https://redirect.github.com/GoogleCloudPlatform/cloud-sql-go-connector/issues/1075))
([cd61b59](cd61b59936))

##### Note

- Deprecate support for pgx v4. The pgx v4 library was declared end life
by its maintainer as of July 2025. We will remove support for the Cloud
SQL Connector in July 2026

</details>

<details>
<summary>googleapis/google-cloud-go
(cloud.google.com/go/geminidataanalytics)</summary>

###
[`v0.8.0`](https://redirect.github.com/googleapis/google-cloud-go/blob/HEAD/CHANGES.md#v080)

[Compare
Source](https://redirect.github.com/googleapis/google-cloud-go/compare/v0.7.0...v0.8.0)

- profiler package added.
- storage:
  - Retry Objects.Insert call.
  - Add ProgressFunc to WRiter.
- pubsub: breaking changes:
- Publish is now asynchronous
([announcement](https://groups.google.com/d/topic/google-api-go-announce/aaqRDIQ3rvU/discussion)).
- Subscription.Pull replaced by Subscription.Receive, which takes a
callback
([announcement](https://groups.google.com/d/topic/google-api-go-announce/8pt6oetAdKc/discussion)).
  - Message.Done replaced with Message.Ack and Message.Nack.

</details>

<details>
<summary>jackc/pgx (github.com/jackc/pgx/v5)</summary>

###
[`v5.9.1`](https://redirect.github.com/jackc/pgx/compare/v5.9.0...v5.9.1)

[Compare
Source](https://redirect.github.com/jackc/pgx/compare/v5.9.0...v5.9.1)

###
[`v5.9.0`](https://redirect.github.com/jackc/pgx/compare/v5.8.0...v5.9.0)

[Compare
Source](https://redirect.github.com/jackc/pgx/compare/v5.8.0...v5.9.0)

</details>

<details>
<summary>nakagami/firebirdsql
(github.com/nakagami/firebirdsql)</summary>

###
[`v0.9.16`](https://redirect.github.com/nakagami/firebirdsql/compare/v0.9.15...v0.9.16)

[Compare
Source](https://redirect.github.com/nakagami/firebirdsql/compare/v0.9.15...v0.9.16)

</details>

<details>
<summary>testcontainers/testcontainers-go
(github.com/testcontainers/testcontainers-go)</summary>

###
[`v0.41.0`](https://redirect.github.com/testcontainers/testcontainers-go/releases/tag/v0.41.0)

[Compare
Source](https://redirect.github.com/testcontainers/testcontainers-go/compare/v0.40.0...v0.41.0)

##### What's Changed

##### 🚀 Features

- feat: add TiDB module
([#&#8203;3575](https://redirect.github.com/testcontainers/testcontainers-go/issues/3575))
[@&#8203;iyiola-dev](https://redirect.github.com/iyiola-dev)
- feat: add Forgejo module
([#&#8203;3556](https://redirect.github.com/testcontainers/testcontainers-go/issues/3556))
[@&#8203;s04](https://redirect.github.com/s04)
- feat: improve container conflict detection
([#&#8203;3574](https://redirect.github.com/testcontainers/testcontainers-go/issues/3574))
[@&#8203;Desuuuu](https://redirect.github.com/Desuuuu)
- feat(azure): add lowkey vault container
([#&#8203;3542](https://redirect.github.com/testcontainers/testcontainers-go/issues/3542))
[@&#8203;nagyesta](https://redirect.github.com/nagyesta)
- feat(chroma): update to chroma 1.x
([#&#8203;3552](https://redirect.github.com/testcontainers/testcontainers-go/issues/3552))
[@&#8203;tazarov](https://redirect.github.com/tazarov)
- feat(cassandra): add ssl option cassandra
([#&#8203;3151](https://redirect.github.com/testcontainers/testcontainers-go/issues/3151))
[@&#8203;MitulShah1](https://redirect.github.com/MitulShah1)

##### 🐛 Bug Fixes

- fix(redpanda): closing provider in test after use
([#&#8203;3539](https://redirect.github.com/testcontainers/testcontainers-go/issues/3539))
[@&#8203;mabrarov](https://redirect.github.com/mabrarov)
- fix: docker auth for docker.io images
([#&#8203;3482](https://redirect.github.com/testcontainers/testcontainers-go/issues/3482))
[@&#8203;LaurentGoderre](https://redirect.github.com/LaurentGoderre)
- fix(solace): set ulimits for container
([#&#8203;3497](https://redirect.github.com/testcontainers/testcontainers-go/issues/3497))
[@&#8203;mdelapenya](https://redirect.github.com/mdelapenya)
- fix(kafka): strip architecture suffix from Kafka image tags for semver
parsing
([#&#8203;3276](https://redirect.github.com/testcontainers/testcontainers-go/issues/3276))
[@&#8203;asahasrabuddhe](https://redirect.github.com/asahasrabuddhe)

##### 📖 Documentation

- docs(metrics): automate usage metrics collection and publish it in the
docs site
([#&#8203;3495](https://redirect.github.com/testcontainers/testcontainers-go/issues/3495))
[@&#8203;mdelapenya](https://redirect.github.com/mdelapenya)

##### 🧹 Housekeeping

- chore(deps): bump actions/checkout from 6.0.1 to 6.0.2
([#&#8203;3560](https://redirect.github.com/testcontainers/testcontainers-go/issues/3560))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(pulsar): bump base image to 4.x, replacing the wait for log
strategy with wait for listening port (deterministic)
([#&#8203;3573](https://redirect.github.com/testcontainers/testcontainers-go/issues/3573))
[@&#8203;mdelapenya](https://redirect.github.com/mdelapenya)
- chore(deps): bump github.com/modelcontextprotocol/go-sdk from 1.0.0 to
1.3.1 in /modules/dockermcpgateway
([#&#8203;3557](https://redirect.github.com/testcontainers/testcontainers-go/issues/3557))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore: update usage metrics (2026-03-02)
([#&#8203;3565](https://redirect.github.com/testcontainers/testcontainers-go/issues/3565))
@&#8203;[github-actions\[bot\]](https://redirect.github.com/apps/github-actions)
- chore(deps): bump mkdocs-include-markdown-plugin from 7.2.0 to 7.2.1
([#&#8203;3547](https://redirect.github.com/testcontainers/testcontainers-go/issues/3547))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump tj-actions/changed-files from 47.0.0 to 47.0.1
([#&#8203;3546](https://redirect.github.com/testcontainers/testcontainers-go/issues/3546))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump actions/upload-artifact from 4.6.2 to 6.0.0
([#&#8203;3545](https://redirect.github.com/testcontainers/testcontainers-go/issues/3545))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore: update usage metrics (2026-02-02)
([#&#8203;3551](https://redirect.github.com/testcontainers/testcontainers-go/issues/3551))
@&#8203;[github-actions\[bot\]](https://redirect.github.com/apps/github-actions)
- chore(deps): bump pymdown-extensions from 10.8.1 to 10.16.1
([#&#8203;3513](https://redirect.github.com/testcontainers/testcontainers-go/issues/3513))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore: update usage metrics (2026-01-01)
([#&#8203;3515](https://redirect.github.com/testcontainers/testcontainers-go/issues/3515))
@&#8203;[github-actions\[bot\]](https://redirect.github.com/apps/github-actions)
- chore: update usage metrics (2025-12-01)
([#&#8203;3506](https://redirect.github.com/testcontainers/testcontainers-go/issues/3506))
@&#8203;[github-actions\[bot\]](https://redirect.github.com/apps/github-actions)
- chore(metrics): allow sending PRs from the workflow
([#&#8203;3503](https://redirect.github.com/testcontainers/testcontainers-go/issues/3503))
[@&#8203;mdelapenya](https://redirect.github.com/mdelapenya)
- fix(metrics): use the right CSV file
([#&#8203;3502](https://redirect.github.com/testcontainers/testcontainers-go/issues/3502))
[@&#8203;mdelapenya](https://redirect.github.com/mdelapenya)
- fix(metrics): use the right CSV file
([#&#8203;3501](https://redirect.github.com/testcontainers/testcontainers-go/issues/3501))
[@&#8203;mdelapenya](https://redirect.github.com/mdelapenya)
- chore(metrics): even better rate limit strategy
([#&#8203;3500](https://redirect.github.com/testcontainers/testcontainers-go/issues/3500))
[@&#8203;mdelapenya](https://redirect.github.com/mdelapenya)
- chore(metrics): properly detect rate limits
([#&#8203;3499](https://redirect.github.com/testcontainers/testcontainers-go/issues/3499))
[@&#8203;mdelapenya](https://redirect.github.com/mdelapenya)
- fix(metrics): set GH \_TOKEN in workflow
([#&#8203;3498](https://redirect.github.com/testcontainers/testcontainers-go/issues/3498))
[@&#8203;mdelapenya](https://redirect.github.com/mdelapenya)

##### 📦 Dependency updates

- fix: update compose-replace Makefile target to use compose/v5
([#&#8203;3590](https://redirect.github.com/testcontainers/testcontainers-go/issues/3590))
[@&#8203;mdelapenya](https://redirect.github.com/mdelapenya)
- chore(deps): bump atomicjar/testcontainers-cloud-setup-action from
1.3.0 to 1.4.0
([#&#8203;3559](https://redirect.github.com/testcontainers/testcontainers-go/issues/3559))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump golang.org/x/text from 0.14.0 to 0.34.0 in
/modulegen
([#&#8203;3582](https://redirect.github.com/testcontainers/testcontainers-go/issues/3582))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump mkdocs-codeinclude-plugin from 0.2.1 to 0.3.1
([#&#8203;3579](https://redirect.github.com/testcontainers/testcontainers-go/issues/3579))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump golang.org/x/mod from 0.16.0 to 0.33.0 in /modulegen
([#&#8203;3583](https://redirect.github.com/testcontainers/testcontainers-go/issues/3583))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump github.com/aerospike/aerospike-client-go/v8 from
8.2.0 to 8.6.0 in /modules/aerospike
([#&#8203;3584](https://redirect.github.com/testcontainers/testcontainers-go/issues/3584))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump golang.org/x/mod from 0.16.0 to 0.33.0 in
/modules/localstack
([#&#8203;3587](https://redirect.github.com/testcontainers/testcontainers-go/issues/3587))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump golang.org/x/mod from 0.16.0 to 0.33.0 in
/modules/elasticsearch
([#&#8203;3585](https://redirect.github.com/testcontainers/testcontainers-go/issues/3585))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump golang.org/x/mod from 0.16.0 to 0.33.0 in
/modules/redpanda
([#&#8203;3588](https://redirect.github.com/testcontainers/testcontainers-go/issues/3588))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump golang.org/x/mod from 0.16.0 to 0.33.0 in
/modules/kafka
([#&#8203;3586](https://redirect.github.com/testcontainers/testcontainers-go/issues/3586))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump github.com/shirou/gopsutil/v4 from 4.25.12 to 4.26.2
([#&#8203;3576](https://redirect.github.com/testcontainers/testcontainers-go/issues/3576))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump github.com/moby/go-archive from 0.1.0 to 0.2.0
([#&#8203;3548](https://redirect.github.com/testcontainers/testcontainers-go/issues/3548))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump github.com/moby/term from 0.5.0 to 0.5.2
([#&#8203;3081](https://redirect.github.com/testcontainers/testcontainers-go/issues/3081))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump actions/checkout from 6.0.1 to 6.0.2
([#&#8203;3560](https://redirect.github.com/testcontainers/testcontainers-go/issues/3560))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump go.opentelemetry.io/otel/sdk to v1.41.0
([#&#8203;3589](https://redirect.github.com/testcontainers/testcontainers-go/issues/3589))
[@&#8203;mdelapenya](https://redirect.github.com/mdelapenya)
- chore(deps): bump go to 1.25 everywhere
([#&#8203;3572](https://redirect.github.com/testcontainers/testcontainers-go/issues/3572))
[@&#8203;mdelapenya](https://redirect.github.com/mdelapenya)
- chore(deps): bump github.com/sigstore/sigstore from 1.10.0 to 1.10.4
in /modules/compose
([#&#8203;3571](https://redirect.github.com/testcontainers/testcontainers-go/issues/3571))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(compose): update to compose-v5
([#&#8203;3568](https://redirect.github.com/testcontainers/testcontainers-go/issues/3568))
[@&#8203;mdelapenya](https://redirect.github.com/mdelapenya)
- chore(deps): bump github.com/modelcontextprotocol/go-sdk from 1.0.0 to
1.3.1 in /modules/dockermcpgateway
([#&#8203;3557](https://redirect.github.com/testcontainers/testcontainers-go/issues/3557))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump mkdocs-codeinclude-plugin from 0.2.1 to 0.3.1
([#&#8203;3561](https://redirect.github.com/testcontainers/testcontainers-go/issues/3561))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump mkdocs-include-markdown-plugin from 7.2.0 to 7.2.1
([#&#8203;3562](https://redirect.github.com/testcontainers/testcontainers-go/issues/3562))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump go.opentelemetry.io/otel/sdk from 1.28.0 to 1.40.0
in /modules/grafana-lgtm
([#&#8203;3563](https://redirect.github.com/testcontainers/testcontainers-go/issues/3563))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump go.opentelemetry.io/otel/sdk from 1.35.0 to 1.40.0
in /modules/toxiproxy
([#&#8203;3564](https://redirect.github.com/testcontainers/testcontainers-go/issues/3564))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump mkdocs-include-markdown-plugin from 7.2.0 to 7.2.1
([#&#8203;3547](https://redirect.github.com/testcontainers/testcontainers-go/issues/3547))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump tj-actions/changed-files from 47.0.0 to 47.0.1
([#&#8203;3546](https://redirect.github.com/testcontainers/testcontainers-go/issues/3546))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump actions/upload-artifact from 4.6.2 to 6.0.0
([#&#8203;3545](https://redirect.github.com/testcontainers/testcontainers-go/issues/3545))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump urllib3 from 2.6.0 to 2.6.3
([#&#8203;3538](https://redirect.github.com/testcontainers/testcontainers-go/issues/3538))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump github.com/shirou/gopsutil/v4 from 4.25.6 to 4.25.12
([#&#8203;3519](https://redirect.github.com/testcontainers/testcontainers-go/issues/3519))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump golang.org/x/sys from 0.38.0 to 0.39.0
([#&#8203;3521](https://redirect.github.com/testcontainers/testcontainers-go/issues/3521))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump ossf/scorecard-action from 2.4.1 to 2.4.3
([#&#8203;3516](https://redirect.github.com/testcontainers/testcontainers-go/issues/3516))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump github.com/docker/docker from 28.5.1+incompatible to
28.5.2+incompatible
([#&#8203;3537](https://redirect.github.com/testcontainers/testcontainers-go/issues/3537))
[@&#8203;mdelapenya](https://redirect.github.com/mdelapenya)
- chore(deps): bump pymdown-extensions from 10.8.1 to 10.16.1
([#&#8203;3513](https://redirect.github.com/testcontainers/testcontainers-go/issues/3513))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump actions/checkout from 4.2.2 to 6.0.1
([#&#8203;3517](https://redirect.github.com/testcontainers/testcontainers-go/issues/3517))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump github.com/weaviate/weaviate from 1.29.0 to 1.30.20
in /modules/weaviate
([#&#8203;3511](https://redirect.github.com/testcontainers/testcontainers-go/issues/3511))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump urllib3 from 2.5.0 to 2.6.0
([#&#8203;3508](https://redirect.github.com/testcontainers/testcontainers-go/issues/3508))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore: switch YAML library
([#&#8203;3507](https://redirect.github.com/testcontainers/testcontainers-go/issues/3507))
[@&#8203;ash2k](https://redirect.github.com/ash2k)
- chore(deps): bump golang.org/x/crypto from 0.43.0 to 0.45.0
([#&#8203;3493](https://redirect.github.com/testcontainers/testcontainers-go/issues/3493))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump github.com/dvsekhvalnov/jose2go from 1.6.0 to 1.7.0
in /modules/pulsar
([#&#8203;3491](https://redirect.github.com/testcontainers/testcontainers-go/issues/3491))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)
- chore(deps): bump github.com/containerd/containerd/v2 from 2.1.4 to
2.1.5 in /modules/compose
([#&#8203;3487](https://redirect.github.com/testcontainers/testcontainers-go/issues/3487))
@&#8203;[dependabot\[bot\]](https://redirect.github.com/apps/dependabot)

</details>

<details>
<summary>valkey-io/valkey-go (github.com/valkey-io/valkey-go)</summary>

###
[`v1.0.73`](https://redirect.github.com/valkey-io/valkey-go/releases/tag/v1.0.73):
1.0.73

[Compare
Source](https://redirect.github.com/valkey-io/valkey-go/compare/v1.0.72...v1.0.73)

### Changes

- feat: add support for Redis Streams XINFO STREAM IDMP fields
([#&#8203;965](https://redirect.github.com/valkey-io/valkey-go/issues/965))
- feat: add XADD IDMP/IDMPAUTO and XCFGSET support
([#&#8203;954](https://redirect.github.com/valkey-io/valkey-go/issues/954))
- feat: make optimistic version locking in om optional
([#&#8203;958](https://redirect.github.com/valkey-io/valkey-go/issues/958))
- feat: add IsCacheHit methods to valkeycompat for CacheCompat supported
commands
([#&#8203;959](https://redirect.github.com/valkey-io/valkey-go/issues/959))
- perf: unify CacheCompat in valkeycompat to use pointer receivers.
- perf: reduce cache hit/miss allocs in valkeyotel.
- perf: optimize metrics recording in valkeyotel.
- docs: clarify AWS ElastiCache for Valkey 7.2 has AZ info only in
`INFO` command
([#&#8203;966](https://redirect.github.com/valkey-io/valkey-go/issues/966))
- fix: JSONGet incompatibility in valkeycompat with go-redis
- ci: add Redis 8.6+ to CI/test setup
([#&#8203;962](https://redirect.github.com/valkey-io/valkey-go/issues/962))

#### Contributors

We'd like to thank all the contributors who worked on this release!

[@&#8203;HurSungYun](https://redirect.github.com/HurSungYun),
[@&#8203;SoulPancake](https://redirect.github.com/SoulPancake),
[@&#8203;akshaykhairmode](https://redirect.github.com/akshaykhairmode),
[@&#8203;gaiaz-iusipov](https://redirect.github.com/gaiaz-iusipov),
[@&#8203;jinbum-kim](https://redirect.github.com/jinbum-kim),
[@&#8203;piyongcai-liucai](https://redirect.github.com/piyongcai-liucai)
and [@&#8203;rueian](https://redirect.github.com/rueian)

</details>

<details>
<summary>golang/go (go)</summary>

###
[`v1.26.1`](https://redirect.github.com/golang/go/compare/go1.26.0...go1.26.1)

###
[`v1.26.0`](https://redirect.github.com/golang/go/compare/go1.25.7...go1.26rc2)

</details>

<details>
<summary>open-telemetry/opentelemetry-go
(go.opentelemetry.io/otel)</summary>

###
[`v1.42.0`](https://redirect.github.com/open-telemetry/opentelemetry-go/releases/tag/v1.42.0):
/v0.64.0/v0.18.0/v0.0.16

[Compare
Source](https://redirect.github.com/open-telemetry/opentelemetry-go/compare/v1.41.0...v1.42.0)

##### Added

- Add `go.opentelemetry.io/otel/semconv/v1.40.0` package.
The package contains semantic conventions from the `v1.40.0` version of
the OpenTelemetry Semantic Conventions.
See the [migration documentation](./semconv/v1.40.0/MIGRATION.md) for
information on how to upgrade from
`go.opentelemetry.io/otel/semconv/v1.39.0`.
([#&#8203;7985](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7985))
- Add `Err` and `SetErr` on `Record` in `go.opentelemetry.io/otel/log`
to attach an error and set record exception attributes in
`go.opentelemetry.io/otel/log/sdk`.
([#&#8203;7924](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7924))

##### Changed

- `TracerProvider.ForceFlush` in `go.opentelemetry.io/otel/sdk/trace`
joins errors together and continues iteration through SpanProcessors as
opposed to returning the first encountered error without attempting
exports on subsequent SpanProcessors.
([#&#8203;7856](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7856))

##### Fixed

- Fix missing `request.GetBody` in
`go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp` to
correctly handle HTTP2 GOAWAY frame.
([#&#8203;7931](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7931))
- Fix semconv v1.39.0 generated metric helpers skipping required
attributes when extra attributes were empty.
([#&#8203;7964](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7964))
- Preserve W3C TraceFlags bitmask (including the random Trace ID flag)
during trace context extraction and injection in
`go.opentelemetry.io/otel/propagation`.
([#&#8203;7834](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7834))

##### Removed

- Drop support for \[Go 1.24].
([#&#8203;7984](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7984))

#### What's Changed

- fix changelog protection marker by
[@&#8203;pellared](https://redirect.github.com/pellared) in
[#&#8203;7986](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7986)
- Drop support for Go 1.24 by
[@&#8203;MrAlias](https://redirect.github.com/MrAlias) in
[#&#8203;7984](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7984)
- fix(deps): update golang.org/x by
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;7907](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7907)
- chore(deps): update module go.opentelemetry.io/collector/featuregate
to v1.53.0 by
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;7981](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7981)
- chore(deps): update benchmark-action/github-action-benchmark action to
v1.21.0 by
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;7989](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7989)
- fix(deps): update module go.opentelemetry.io/collector/pdata to
v1.53.0 by
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;7982](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7982)
- Revert "Revert "Generate semconv/v1.40.0"" by
[@&#8203;MrAlias](https://redirect.github.com/MrAlias) in
[#&#8203;7985](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7985)
- support stdlib request.GetBody on metrics by
[@&#8203;marifari-hue](https://redirect.github.com/marifari-hue) in
[#&#8203;7931](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7931)
- attribute: add TestNotEquivalence and equality operator tests by
[@&#8203;pellared](https://redirect.github.com/pellared) in
[#&#8203;7979](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7979)
- Refactor benchmark CI by
[@&#8203;XSAM](https://redirect.github.com/XSAM) in
[#&#8203;7873](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7873)
- chore(deps): update module github.com/securego/gosec/v2 to v2.24.7 by
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;7988](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7988)
- chore(deps): pin codspeedhq/action action to
[`df47568`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/df47568)
by [@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;7996](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7996)
- chore(deps): update actions/checkout action to v6.0.2 by
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;7997](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7997)
- chore(deps): update codspeedhq/action action to v4.11.0 by
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;7999](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7999)
- Upgrade to semconv/v1.40.0 by
[@&#8203;MrAlias](https://redirect.github.com/MrAlias) in
[#&#8203;7991](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7991)
- Regenerate semconv/v1.40.0/MIGRATION.md by
[@&#8203;MrAlias](https://redirect.github.com/MrAlias) in
[#&#8203;7992](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7992)
- fix: generated semconv helpers skipping attributes by
[@&#8203;victoraugustolls](https://redirect.github.com/victoraugustolls)
in
[#&#8203;7964](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7964)
- Feat: Have SpanContext support the new W3C random flag. by
[@&#8203;nikhilmantri0902](https://redirect.github.com/nikhilmantri0902)
in
[#&#8203;7834](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7834)
- Semconv metric helper caller-slice mutation fix by
[@&#8203;MrAlias](https://redirect.github.com/MrAlias) in
[#&#8203;7993](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7993)
- Fix semconv generated error type to check error chain for custom type
declaration by [@&#8203;MrAlias](https://redirect.github.com/MrAlias) in
[#&#8203;7994](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7994)
- refactor: replace uint64 and int32 with atomic types in tests by
[@&#8203;alexandear](https://redirect.github.com/alexandear) in
[#&#8203;7941](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7941)
- chore(deps): update golang.org/x/telemetry digest to
[`18da590`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/18da590)
by [@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;8000](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/8000)
- TracerProvider ForceFlush() Error Fix by
[@&#8203;sawamurataxman](https://redirect.github.com/sawamurataxman) in
[#&#8203;7856](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7856)
- log: add error field to Record and make SDK to emit exception
attributes by [@&#8203;iblancasa](https://redirect.github.com/iblancasa)
in
[#&#8203;7924](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7924)
- chore(deps): update dependency codespell to v2.4.2 by
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;8003](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/8003)
- chore(deps): update github/codeql-action action to v4.32.6 by
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;8004](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/8004)
- chore(deps): update codspeedhq/action action to v4.11.1 by
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;8001](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/8001)
- fix(deps): update module google.golang.org/grpc to v1.79.2 by
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;8007](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/8007)
- chore(deps): update module github.com/mgechev/revive to v1.15.0 by
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;8009](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/8009)
- chore(deps): update golang.org/x/telemetry digest to
[`e526e8a`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/e526e8a)
by [@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;8010](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/8010)
- Release v1.42.0/v0.64.0/v0.18.0/v0.0.16 by
[@&#8203;pellared](https://redirect.github.com/pellared) in
[#&#8203;8006](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/8006)

#### New Contributors

- [@&#8203;marifari-hue](https://redirect.github.com/marifari-hue) made
their first contribution in
[#&#8203;7931](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7931)
-
[@&#8203;victoraugustolls](https://redirect.github.com/victoraugustolls)
made their first contribution in
[#&#8203;7964](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7964)
- [@&#8203;sawamurataxman](https://redirect.github.com/sawamurataxman)
made their first contribution in
[#&#8203;7856](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7856)
- [@&#8203;iblancasa](https://redirect.github.com/iblancasa) made their
first contribution in
[#&#8203;7924](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7924)

**Full Changelog**:
<https://github.com/open-telemetry/opentelemetry-go/compare/v1.41.0...v1.42.0>

</details>

<details>
<summary>googleapis/go-genai (google.golang.org/genai)</summary>

###
[`v1.51.0`](https://redirect.github.com/googleapis/go-genai/releases/tag/v1.51.0)

[Compare
Source](https://redirect.github.com/googleapis/go-genai/compare/v1.50.0...v1.51.0)

##### Features

- Support include\_server\_side\_tool\_invocations for genai.
([cec4bfd](cec4bfd512))

###
[`v1.50.0`](https://redirect.github.com/googleapis/go-genai/releases/tag/v1.50.0)

[Compare
Source](https://redirect.github.com/googleapis/go-genai/compare/v1.49.0...v1.50.0)

##### Features

- Add inference\_generation\_config to EvaluationConfig for Tuning
([21b360f](21b360fd8d))
- Add register\_files
([43a12bf](43a12bf26f))
- Allow custom endpoints for authentication with Vertex AI in Go
([0ebf016](0ebf016d94))
- enable language code for audio transcription config in Live API for
Vertex AI
([59610d4](59610d4dfb))

</details>

<details>
<summary>cznic/sqlite (modernc.org/sqlite)</summary>

###
[`v1.47.0`](https://gitlab.com/cznic/sqlite/compare/v1.46.2...v1.47.0)

[Compare
Source](https://gitlab.com/cznic/sqlite/compare/v1.46.2...v1.47.0)

###
[`v1.46.2`](https://gitlab.com/cznic/sqlite/compare/v1.46.1...v1.46.2)

[Compare
Source](https://gitlab.com/cznic/sqlite/compare/v1.46.1...v1.46.2)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My42Ni40IiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

---------

Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-03-25 12:01:19 -07:00
dependabot[bot]
489386aa63 chore(deps): bump google.golang.org/grpc from 1.78.0 to 1.79.3 in /docs/en/samples/pre_post_processing/go/adk (#2782)
Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from
1.78.0 to 1.79.3.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/grpc/grpc-go/releases">google.golang.org/grpc's
releases</a>.</em></p>
<blockquote>
<h2>Release 1.79.3</h2>
<h1>Security</h1>
<ul>
<li>server: fix an authorization bypass where malformed :path headers
(missing the leading slash) could bypass path-based restricted
&quot;deny&quot; rules in interceptors like <code>grpc/authz</code>. Any
request with a non-canonical path is now immediately rejected with an
<code>Unimplemented</code> error. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8981">#8981</a>)</li>
</ul>
<h2>Release 1.79.2</h2>
<h1>Bug Fixes</h1>
<ul>
<li>stats: Prevent redundant error logging in health/ORCA producers by
skipping stats/tracing processing when no stats handler is configured.
(<a
href="https://redirect.github.com/grpc/grpc-go/pull/8874">grpc/grpc-go#8874</a>)</li>
</ul>
<h2>Release 1.79.1</h2>
<h1>Bug Fixes</h1>
<ul>
<li>grpc: Remove the <code>-dev</code> suffix from the User-Agent
header. (<a
href="https://redirect.github.com/grpc/grpc-go/pull/8902">grpc/grpc-go#8902</a>)</li>
</ul>
<h2>Release 1.79.0</h2>
<h1>API Changes</h1>
<ul>
<li>mem: Add experimental API <code>SetDefaultBufferPool</code> to
change the default buffer pool. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8806">#8806</a>)
<ul>
<li>Special Thanks: <a
href="https://github.com/vanja-p"><code>@​vanja-p</code></a></li>
</ul>
</li>
<li>experimental/stats: Update <code>MetricsRecorder</code> to require
embedding the new <code>UnimplementedMetricsRecorder</code> (a no-op
struct) in all implementations for forward compatibility. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8780">#8780</a>)</li>
</ul>
<h1>Behavior Changes</h1>
<ul>
<li>balancer/weightedtarget: Remove handling of <code>Addresses</code>
and only handle <code>Endpoints</code> in resolver updates. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8841">#8841</a>)</li>
</ul>
<h1>New Features</h1>
<ul>
<li>experimental/stats: Add support for asynchronous gauge metrics
through the new <code>AsyncMetricReporter</code> and
<code>RegisterAsyncReporter</code> APIs. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8780">#8780</a>)</li>
<li>pickfirst: Add support for weighted random shuffling of endpoints,
as described in <a
href="https://redirect.github.com/grpc/proposal/pull/535">gRFC A113</a>.
<ul>
<li>This is enabled by default, and can be turned off using the
environment variable
<code>GRPC_EXPERIMENTAL_PF_WEIGHTED_SHUFFLING</code>. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8864">#8864</a>)</li>
</ul>
</li>
<li>xds: Implement <code>:authority</code> rewriting, as specified in <a
href="https://github.com/grpc/proposal/blob/master/A81-xds-authority-rewriting.md">gRFC
A81</a>. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8779">#8779</a>)</li>
<li>balancer/randomsubsetting: Implement the
<code>random_subsetting</code> LB policy, as specified in <a
href="https://github.com/grpc/proposal/blob/master/A68-random-subsetting.md">gRFC
A68</a>. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8650">#8650</a>)
<ul>
<li>Special Thanks: <a
href="https://github.com/marek-szews"><code>@​marek-szews</code></a></li>
</ul>
</li>
</ul>
<h1>Bug Fixes</h1>
<ul>
<li>credentials/tls: Fix a bug where the port was not stripped from the
authority override before validation. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8726">#8726</a>)
<ul>
<li>Special Thanks: <a
href="https://github.com/Atul1710"><code>@​Atul1710</code></a></li>
</ul>
</li>
<li>xds/priority: Fix a bug causing delayed failover to lower-priority
clusters when a higher-priority cluster is stuck in
<code>CONNECTING</code> state. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8813">#8813</a>)</li>
<li>health: Fix a bug where health checks failed for clients using
legacy compression options (<code>WithDecompressor</code> or
<code>RPCDecompressor</code>). (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8765">#8765</a>)
<ul>
<li>Special Thanks: <a
href="https://github.com/sanki92"><code>@​sanki92</code></a></li>
</ul>
</li>
<li>transport: Fix an issue where the HTTP/2 server could skip header
size checks when terminating a stream early. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8769">#8769</a>)
<ul>
<li>Special Thanks: <a
href="https://github.com/joybestourous"><code>@​joybestourous</code></a></li>
</ul>
</li>
<li>server: Propagate status detail headers, if available, when
terminating a stream during request header processing. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8754">#8754</a>)
<ul>
<li>Special Thanks: <a
href="https://github.com/joybestourous"><code>@​joybestourous</code></a></li>
</ul>
</li>
</ul>
<h1>Performance Improvements</h1>
<ul>
<li>credentials/alts: Optimize read buffer alignment to reduce copies.
(<a
href="https://redirect.github.com/grpc/grpc-go/issues/8791">#8791</a>)</li>
<li>mem: Optimize pooling and creation of <code>buffer</code> objects.
(<a
href="https://redirect.github.com/grpc/grpc-go/issues/8784">#8784</a>)</li>
<li>transport: Reduce slice re-allocations by reserving slice capacity.
(<a
href="https://redirect.github.com/grpc/grpc-go/issues/8797">#8797</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="dda86dbd9c"><code>dda86db</code></a>
Change version to 1.79.3 (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8983">#8983</a>)</li>
<li><a
href="72186f163e"><code>72186f1</code></a>
grpc: enforce strict path checking for incoming requests on the server
(<a
href="https://redirect.github.com/grpc/grpc-go/issues/8981">#8981</a>)</li>
<li><a
href="97ca3522b2"><code>97ca352</code></a>
Changing version to 1.79.3-dev (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8954">#8954</a>)</li>
<li><a
href="8902ab6efe"><code>8902ab6</code></a>
Change the version to release 1.79.2 (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8947">#8947</a>)</li>
<li><a
href="a9286705aa"><code>a928670</code></a>
Cherry-pick <a
href="https://redirect.github.com/grpc/grpc-go/issues/8874">#8874</a> to
v1.79.x (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8904">#8904</a>)</li>
<li><a
href="06df3638c0"><code>06df363</code></a>
Change version to 1.79.2-dev (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8903">#8903</a>)</li>
<li><a
href="782f2de44f"><code>782f2de</code></a>
Change version to 1.79.1 (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8902">#8902</a>)</li>
<li><a
href="850eccbb22"><code>850eccb</code></a>
Change version to 1.79.1-dev (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8851">#8851</a>)</li>
<li><a
href="765ff056b6"><code>765ff05</code></a>
Change version to 1.79.0 (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8850">#8850</a>)</li>
<li><a
href="68804be0e7"><code>68804be</code></a>
Cherry pick <a
href="https://redirect.github.com/grpc/grpc-go/issues/8864">#8864</a> to
v1.79.x (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8896">#8896</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/grpc/grpc-go/compare/v1.78.0...v1.79.3">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=google.golang.org/grpc&package-manager=go_modules&previous-version=1.78.0&new-version=1.79.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
Co-authored-by: Yuan Teoh <yuanteoh@google.com>
2026-03-24 17:18:45 -07:00
Averi Kitsch
c5d1fb5acb ci: fix renovate config (#2833)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #2817
2026-03-24 15:00:46 -07:00
Parth Ajmera
bde12915ca docs(telemetry): updated documentation for telemetry (#2791)
## Description

> Updated Documentation for latest telemetry as per Semantic Convention

## PR Checklist

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #2222

---------

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-24 14:34:20 -07:00
Anuj Jhunjhunwala
facb69d01f feat(dataplex): Add support for lookup context tool. (#2744)
Added support for lookup context tool in Dataplex.
Fixes #2743

---------

Co-authored-by: Mateusz Nowak <matnow@google.com>
Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2026-03-24 17:04:31 +00:00
dependabot[bot]
18a85ea550 chore(deps): bump fast-xml-parser from 5.4.1 to 5.5.7 in /docs/en/getting-started/quickstart/js/adk (#2795)
Bumps
[fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser)
from 5.4.1 to 5.5.7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/releases">fast-xml-parser's
releases</a>.</em></p>
<blockquote>
<h2>fix entity expansion and incorrect replacement and performance</h2>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.5...v5.5.6">https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.5...v5.5.6</a></p>
<h2>support onDangerousProperty</h2>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.3...v5.5.5">https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.3...v5.5.5</a></p>
<h2>update dependecies to fix typings</h2>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.1...v5.5.2">https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.1...v5.5.2</a></p>
<h2>integrate path-expression-matcher</h2>
<ul>
<li>support path-expression-matcher</li>
<li>fix: stopNode should not be parsed</li>
<li>performance improvement for stopNode checking</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md">fast-xml-parser's
changelog</a>.</em></p>
<blockquote>
<p><!-- raw HTML omitted -->Note: If you find missing information about
particular minor version, that version must have been changed without
any functional change in this library.<!-- raw HTML omitted --></p>
<p>Note: Due to some last quick changes on v4, detail of v4.5.3 &amp;
v4.5.4 are not updated here. v4.5.4x is the last tag of v4 in github
repository. I'm extremely sorry for the confusion</p>
<p><strong>5.5.7 / 2026-03-19</strong></p>
<ul>
<li>fix: entity expansion limits</li>
<li>update strnum package to 2.2.0</li>
</ul>
<p><strong>5.5.6 / 2026-03-16</strong></p>
<ul>
<li>update builder dependency</li>
<li>fix incorrect regex to replace . in entity name</li>
<li>fix check for entitiy expansion for lastEntities and html entities
too</li>
</ul>
<p><strong>5.5.5 / 2026-03-13</strong></p>
<ul>
<li>sanitize dangerous tag or attribute name</li>
<li>error on critical property name</li>
<li>support onDangerousProperty option</li>
</ul>
<p><strong>5.5.4 / 2026-03-13</strong></p>
<ul>
<li>declare Matcher &amp; Expression as unknown so user is not forced to
install path-expression-matcher</li>
</ul>
<p><strong>5.5.3 / 2026-03-11</strong></p>
<ul>
<li>upgrade builder</li>
</ul>
<p><strong>5.5.2 / 2026-03-11</strong></p>
<ul>
<li>update dependency to fix typings</li>
</ul>
<p><strong>5.5.1 / 2026-03-10</strong></p>
<ul>
<li>fix dependency</li>
</ul>
<p><strong>5.5.0 / 2026-03-10</strong></p>
<ul>
<li>support path-expression-matcher</li>
<li>fix: stopNode should not be parsed</li>
<li>performance improvement for stopNode checking</li>
</ul>
<p><strong>5.4.2 / 2026-03-03</strong></p>
<ul>
<li>support maxEntityCount option</li>
</ul>
<p><strong>5.4.1  / 2026-02-25</strong></p>
<ul>
<li>fix (<a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/issues/785">#785</a>)
unpairedTag node should not have tag content</li>
</ul>
<p><strong>5.4.0  / 2026-02-25</strong></p>
<ul>
<li>migrate to fast-xml-builder</li>
</ul>
<p><strong>5.3.9 / 2026-02-25</strong></p>
<ul>
<li>support strictReservedNames</li>
</ul>
<p><strong>5.3.8 / 2026-02-25</strong></p>
<ul>
<li>support maxNestedTags</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a21c44123c"><code>a21c441</code></a>
update package detail</li>
<li><a
href="239b64aa1f"><code>239b64a</code></a>
check for min value for entity exapantion options</li>
<li><a
href="61cb666d13"><code>61cb666</code></a>
restrict more properties to be unsafe</li>
<li><a
href="41abd66adc"><code>41abd66</code></a>
performance improvement of reading DOCTYPE</li>
<li><a
href="3dfcd20c8c"><code>3dfcd20</code></a>
refactor: performance improvement</li>
<li><a
href="870043e75e"><code>870043e</code></a>
update release info</li>
<li><a
href="6df401ef2b"><code>6df401e</code></a>
update builder dependency</li>
<li><a
href="bd26122c83"><code>bd26122</code></a>
check for entitiy expansion for lastEntities and html entities too</li>
<li><a
href="7e70dd8f75"><code>7e70dd8</code></a>
fix incorrect regex to replace . in entity name</li>
<li><a
href="e54155f530"><code>e54155f</code></a>
update package info</li>
<li>Additional commits viewable in <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.4.1...v5.5.7">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=fast-xml-parser&package-manager=npm_and_yarn&previous-version=5.4.1&new-version=5.5.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-24 16:20:26 +00:00
dependabot[bot]
5f6450fb58 chore(deps): bump google.golang.org/grpc from 1.78.0 to 1.79.3 in /docs/en/getting-started/quickstart/go/genkit (#2801)
Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from
1.78.0 to 1.79.3.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/grpc/grpc-go/releases">google.golang.org/grpc's
releases</a>.</em></p>
<blockquote>
<h2>Release 1.79.3</h2>
<h1>Security</h1>
<ul>
<li>server: fix an authorization bypass where malformed :path headers
(missing the leading slash) could bypass path-based restricted
&quot;deny&quot; rules in interceptors like <code>grpc/authz</code>. Any
request with a non-canonical path is now immediately rejected with an
<code>Unimplemented</code> error. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8981">#8981</a>)</li>
</ul>
<h2>Release 1.79.2</h2>
<h1>Bug Fixes</h1>
<ul>
<li>stats: Prevent redundant error logging in health/ORCA producers by
skipping stats/tracing processing when no stats handler is configured.
(<a
href="https://redirect.github.com/grpc/grpc-go/pull/8874">grpc/grpc-go#8874</a>)</li>
</ul>
<h2>Release 1.79.1</h2>
<h1>Bug Fixes</h1>
<ul>
<li>grpc: Remove the <code>-dev</code> suffix from the User-Agent
header. (<a
href="https://redirect.github.com/grpc/grpc-go/pull/8902">grpc/grpc-go#8902</a>)</li>
</ul>
<h2>Release 1.79.0</h2>
<h1>API Changes</h1>
<ul>
<li>mem: Add experimental API <code>SetDefaultBufferPool</code> to
change the default buffer pool. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8806">#8806</a>)
<ul>
<li>Special Thanks: <a
href="https://github.com/vanja-p"><code>@​vanja-p</code></a></li>
</ul>
</li>
<li>experimental/stats: Update <code>MetricsRecorder</code> to require
embedding the new <code>UnimplementedMetricsRecorder</code> (a no-op
struct) in all implementations for forward compatibility. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8780">#8780</a>)</li>
</ul>
<h1>Behavior Changes</h1>
<ul>
<li>balancer/weightedtarget: Remove handling of <code>Addresses</code>
and only handle <code>Endpoints</code> in resolver updates. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8841">#8841</a>)</li>
</ul>
<h1>New Features</h1>
<ul>
<li>experimental/stats: Add support for asynchronous gauge metrics
through the new <code>AsyncMetricReporter</code> and
<code>RegisterAsyncReporter</code> APIs. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8780">#8780</a>)</li>
<li>pickfirst: Add support for weighted random shuffling of endpoints,
as described in <a
href="https://redirect.github.com/grpc/proposal/pull/535">gRFC A113</a>.
<ul>
<li>This is enabled by default, and can be turned off using the
environment variable
<code>GRPC_EXPERIMENTAL_PF_WEIGHTED_SHUFFLING</code>. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8864">#8864</a>)</li>
</ul>
</li>
<li>xds: Implement <code>:authority</code> rewriting, as specified in <a
href="https://github.com/grpc/proposal/blob/master/A81-xds-authority-rewriting.md">gRFC
A81</a>. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8779">#8779</a>)</li>
<li>balancer/randomsubsetting: Implement the
<code>random_subsetting</code> LB policy, as specified in <a
href="https://github.com/grpc/proposal/blob/master/A68-random-subsetting.md">gRFC
A68</a>. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8650">#8650</a>)
<ul>
<li>Special Thanks: <a
href="https://github.com/marek-szews"><code>@​marek-szews</code></a></li>
</ul>
</li>
</ul>
<h1>Bug Fixes</h1>
<ul>
<li>credentials/tls: Fix a bug where the port was not stripped from the
authority override before validation. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8726">#8726</a>)
<ul>
<li>Special Thanks: <a
href="https://github.com/Atul1710"><code>@​Atul1710</code></a></li>
</ul>
</li>
<li>xds/priority: Fix a bug causing delayed failover to lower-priority
clusters when a higher-priority cluster is stuck in
<code>CONNECTING</code> state. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8813">#8813</a>)</li>
<li>health: Fix a bug where health checks failed for clients using
legacy compression options (<code>WithDecompressor</code> or
<code>RPCDecompressor</code>). (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8765">#8765</a>)
<ul>
<li>Special Thanks: <a
href="https://github.com/sanki92"><code>@​sanki92</code></a></li>
</ul>
</li>
<li>transport: Fix an issue where the HTTP/2 server could skip header
size checks when terminating a stream early. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8769">#8769</a>)
<ul>
<li>Special Thanks: <a
href="https://github.com/joybestourous"><code>@​joybestourous</code></a></li>
</ul>
</li>
<li>server: Propagate status detail headers, if available, when
terminating a stream during request header processing. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8754">#8754</a>)
<ul>
<li>Special Thanks: <a
href="https://github.com/joybestourous"><code>@​joybestourous</code></a></li>
</ul>
</li>
</ul>
<h1>Performance Improvements</h1>
<ul>
<li>credentials/alts: Optimize read buffer alignment to reduce copies.
(<a
href="https://redirect.github.com/grpc/grpc-go/issues/8791">#8791</a>)</li>
<li>mem: Optimize pooling and creation of <code>buffer</code> objects.
(<a
href="https://redirect.github.com/grpc/grpc-go/issues/8784">#8784</a>)</li>
<li>transport: Reduce slice re-allocations by reserving slice capacity.
(<a
href="https://redirect.github.com/grpc/grpc-go/issues/8797">#8797</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="dda86dbd9c"><code>dda86db</code></a>
Change version to 1.79.3 (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8983">#8983</a>)</li>
<li><a
href="72186f163e"><code>72186f1</code></a>
grpc: enforce strict path checking for incoming requests on the server
(<a
href="https://redirect.github.com/grpc/grpc-go/issues/8981">#8981</a>)</li>
<li><a
href="97ca3522b2"><code>97ca352</code></a>
Changing version to 1.79.3-dev (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8954">#8954</a>)</li>
<li><a
href="8902ab6efe"><code>8902ab6</code></a>
Change the version to release 1.79.2 (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8947">#8947</a>)</li>
<li><a
href="a9286705aa"><code>a928670</code></a>
Cherry-pick <a
href="https://redirect.github.com/grpc/grpc-go/issues/8874">#8874</a> to
v1.79.x (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8904">#8904</a>)</li>
<li><a
href="06df3638c0"><code>06df363</code></a>
Change version to 1.79.2-dev (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8903">#8903</a>)</li>
<li><a
href="782f2de44f"><code>782f2de</code></a>
Change version to 1.79.1 (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8902">#8902</a>)</li>
<li><a
href="850eccbb22"><code>850eccb</code></a>
Change version to 1.79.1-dev (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8851">#8851</a>)</li>
<li><a
href="765ff056b6"><code>765ff05</code></a>
Change version to 1.79.0 (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8850">#8850</a>)</li>
<li><a
href="68804be0e7"><code>68804be</code></a>
Cherry pick <a
href="https://redirect.github.com/grpc/grpc-go/issues/8864">#8864</a> to
v1.79.x (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8896">#8896</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/grpc/grpc-go/compare/v1.78.0...v1.79.3">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=google.golang.org/grpc&package-manager=go_modules&previous-version=1.78.0&new-version=1.79.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2026-03-24 11:40:20 -04:00
dependabot[bot]
1712dca5d9 chore(deps): bump github.com/buger/jsonparser from 1.1.1 to 1.1.2 in /docs/en/getting-started/quickstart/go/genkit (#2803)
Bumps [github.com/buger/jsonparser](https://github.com/buger/jsonparser)
from 1.1.1 to 1.1.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/buger/jsonparser/releases">github.com/buger/jsonparser's
releases</a>.</em></p>
<blockquote>
<h2>v1.1.2</h2>
<h2>What's Changed</h2>
<ul>
<li>Updated travis to build for 1.13 to 1.15 by <a
href="https://github.com/janreggie"><code>@​janreggie</code></a> in <a
href="https://redirect.github.com/buger/jsonparser/pull/225">buger/jsonparser#225</a></li>
<li>
<ul>
<li>eliminate 2 allocations in EachKey() by <a
href="https://github.com/Villenny"><code>@​Villenny</code></a> in <a
href="https://redirect.github.com/buger/jsonparser/pull/223">buger/jsonparser#223</a></li>
</ul>
</li>
<li>fix issue <a
href="https://redirect.github.com/buger/jsonparser/issues/150">#150</a>
(in deleting case) by <a
href="https://github.com/daria-kay"><code>@​daria-kay</code></a> in <a
href="https://redirect.github.com/buger/jsonparser/pull/226">buger/jsonparser#226</a></li>
<li>fixing the oss-fuzz issue by <a
href="https://github.com/daria-kay"><code>@​daria-kay</code></a> in <a
href="https://redirect.github.com/buger/jsonparser/pull/227">buger/jsonparser#227</a></li>
<li>Fix parseInt overflow check false negative by <a
href="https://github.com/carsonip"><code>@​carsonip</code></a> in <a
href="https://redirect.github.com/buger/jsonparser/pull/231">buger/jsonparser#231</a></li>
<li>Added bespoke error for null cases by <a
href="https://github.com/jonomacd"><code>@​jonomacd</code></a> in <a
href="https://redirect.github.com/buger/jsonparser/pull/228">buger/jsonparser#228</a></li>
<li>Fuzzing: Add CIFuzz by <a
href="https://github.com/AdamKorcz"><code>@​AdamKorcz</code></a> in <a
href="https://redirect.github.com/buger/jsonparser/pull/239">buger/jsonparser#239</a></li>
<li>Added latest versions of go to tests by <a
href="https://github.com/moredure"><code>@​moredure</code></a> in <a
href="https://redirect.github.com/buger/jsonparser/pull/244">buger/jsonparser#244</a></li>
<li>fix EachKey pIdxFlags allocation by <a
href="https://github.com/unxcepted"><code>@​unxcepted</code></a> in <a
href="https://redirect.github.com/buger/jsonparser/pull/241">buger/jsonparser#241</a></li>
<li>fix: prevent panic on negative slice index in Delete with malformed
JSON (GO-2026-4514) by <a
href="https://github.com/dbarrosop"><code>@​dbarrosop</code></a> in <a
href="https://redirect.github.com/buger/jsonparser/pull/276">buger/jsonparser#276</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/janreggie"><code>@​janreggie</code></a>
made their first contribution in <a
href="https://redirect.github.com/buger/jsonparser/pull/225">buger/jsonparser#225</a></li>
<li><a href="https://github.com/Villenny"><code>@​Villenny</code></a>
made their first contribution in <a
href="https://redirect.github.com/buger/jsonparser/pull/223">buger/jsonparser#223</a></li>
<li><a href="https://github.com/daria-kay"><code>@​daria-kay</code></a>
made their first contribution in <a
href="https://redirect.github.com/buger/jsonparser/pull/226">buger/jsonparser#226</a></li>
<li><a href="https://github.com/carsonip"><code>@​carsonip</code></a>
made their first contribution in <a
href="https://redirect.github.com/buger/jsonparser/pull/231">buger/jsonparser#231</a></li>
<li><a href="https://github.com/jonomacd"><code>@​jonomacd</code></a>
made their first contribution in <a
href="https://redirect.github.com/buger/jsonparser/pull/228">buger/jsonparser#228</a></li>
<li><a href="https://github.com/moredure"><code>@​moredure</code></a>
made their first contribution in <a
href="https://redirect.github.com/buger/jsonparser/pull/244">buger/jsonparser#244</a></li>
<li><a href="https://github.com/unxcepted"><code>@​unxcepted</code></a>
made their first contribution in <a
href="https://redirect.github.com/buger/jsonparser/pull/241">buger/jsonparser#241</a></li>
<li><a href="https://github.com/dbarrosop"><code>@​dbarrosop</code></a>
made their first contribution in <a
href="https://redirect.github.com/buger/jsonparser/pull/276">buger/jsonparser#276</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/buger/jsonparser/compare/v1.1.1...v1.1.2">https://github.com/buger/jsonparser/compare/v1.1.1...v1.1.2</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a69e7e01cd"><code>a69e7e0</code></a>
Merge pull request <a
href="https://redirect.github.com/buger/jsonparser/issues/276">#276</a>
from dbarrosop/master</li>
<li><a
href="d3eacc0bab"><code>d3eacc0</code></a>
fix: prevent panic on negative slice index in Delete with malformed JSON
(GO-...</li>
<li><a
href="61b32cfdfa"><code>61b32cf</code></a>
Merge pull request <a
href="https://redirect.github.com/buger/jsonparser/issues/241">#241</a>
from unxcepted/master</li>
<li><a
href="2181e8398f"><code>2181e83</code></a>
Merge pull request <a
href="https://redirect.github.com/buger/jsonparser/issues/244">#244</a>
from ScaleChamp/patch-2</li>
<li><a
href="1510b51941"><code>1510b51</code></a>
Added latest versions of go to tests</li>
<li><a
href="6fc2e488ed"><code>6fc2e48</code></a>
fix: eachkey allocation</li>
<li><a
href="a6f867eb77"><code>a6f867e</code></a>
Merge pull request <a
href="https://redirect.github.com/buger/jsonparser/issues/239">#239</a>
from AdamKorcz/cifuzz1</li>
<li><a
href="cbc01fdbbe"><code>cbc01fd</code></a>
Fuzzing: Add CIFuzz</li>
<li><a
href="dc92d6932a"><code>dc92d69</code></a>
Merge pull request <a
href="https://redirect.github.com/buger/jsonparser/issues/228">#228</a>
from jonomacd/null-handling</li>
<li><a
href="2d9d6343e8"><code>2d9d634</code></a>
Merge pull request <a
href="https://redirect.github.com/buger/jsonparser/issues/231">#231</a>
from carsonip/fix-parseint-overflow-check</li>
<li>Additional commits viewable in <a
href="https://github.com/buger/jsonparser/compare/v1.1.1...v1.1.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/buger/jsonparser&package-manager=go_modules&previous-version=1.1.1&new-version=1.1.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2026-03-24 11:38:44 -04:00
dependabot[bot]
899613b4b9 chore(deps): bump google.golang.org/grpc from 1.78.0 to 1.79.3 in /docs/en/getting-started/quickstart/go/genAI (#2781)
Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from
1.78.0 to 1.79.3.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/grpc/grpc-go/releases">google.golang.org/grpc's
releases</a>.</em></p>
<blockquote>
<h2>Release 1.79.3</h2>
<h1>Security</h1>
<ul>
<li>server: fix an authorization bypass where malformed :path headers
(missing the leading slash) could bypass path-based restricted
&quot;deny&quot; rules in interceptors like <code>grpc/authz</code>. Any
request with a non-canonical path is now immediately rejected with an
<code>Unimplemented</code> error. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8981">#8981</a>)</li>
</ul>
<h2>Release 1.79.2</h2>
<h1>Bug Fixes</h1>
<ul>
<li>stats: Prevent redundant error logging in health/ORCA producers by
skipping stats/tracing processing when no stats handler is configured.
(<a
href="https://redirect.github.com/grpc/grpc-go/pull/8874">grpc/grpc-go#8874</a>)</li>
</ul>
<h2>Release 1.79.1</h2>
<h1>Bug Fixes</h1>
<ul>
<li>grpc: Remove the <code>-dev</code> suffix from the User-Agent
header. (<a
href="https://redirect.github.com/grpc/grpc-go/pull/8902">grpc/grpc-go#8902</a>)</li>
</ul>
<h2>Release 1.79.0</h2>
<h1>API Changes</h1>
<ul>
<li>mem: Add experimental API <code>SetDefaultBufferPool</code> to
change the default buffer pool. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8806">#8806</a>)
<ul>
<li>Special Thanks: <a
href="https://github.com/vanja-p"><code>@​vanja-p</code></a></li>
</ul>
</li>
<li>experimental/stats: Update <code>MetricsRecorder</code> to require
embedding the new <code>UnimplementedMetricsRecorder</code> (a no-op
struct) in all implementations for forward compatibility. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8780">#8780</a>)</li>
</ul>
<h1>Behavior Changes</h1>
<ul>
<li>balancer/weightedtarget: Remove handling of <code>Addresses</code>
and only handle <code>Endpoints</code> in resolver updates. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8841">#8841</a>)</li>
</ul>
<h1>New Features</h1>
<ul>
<li>experimental/stats: Add support for asynchronous gauge metrics
through the new <code>AsyncMetricReporter</code> and
<code>RegisterAsyncReporter</code> APIs. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8780">#8780</a>)</li>
<li>pickfirst: Add support for weighted random shuffling of endpoints,
as described in <a
href="https://redirect.github.com/grpc/proposal/pull/535">gRFC A113</a>.
<ul>
<li>This is enabled by default, and can be turned off using the
environment variable
<code>GRPC_EXPERIMENTAL_PF_WEIGHTED_SHUFFLING</code>. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8864">#8864</a>)</li>
</ul>
</li>
<li>xds: Implement <code>:authority</code> rewriting, as specified in <a
href="https://github.com/grpc/proposal/blob/master/A81-xds-authority-rewriting.md">gRFC
A81</a>. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8779">#8779</a>)</li>
<li>balancer/randomsubsetting: Implement the
<code>random_subsetting</code> LB policy, as specified in <a
href="https://github.com/grpc/proposal/blob/master/A68-random-subsetting.md">gRFC
A68</a>. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8650">#8650</a>)
<ul>
<li>Special Thanks: <a
href="https://github.com/marek-szews"><code>@​marek-szews</code></a></li>
</ul>
</li>
</ul>
<h1>Bug Fixes</h1>
<ul>
<li>credentials/tls: Fix a bug where the port was not stripped from the
authority override before validation. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8726">#8726</a>)
<ul>
<li>Special Thanks: <a
href="https://github.com/Atul1710"><code>@​Atul1710</code></a></li>
</ul>
</li>
<li>xds/priority: Fix a bug causing delayed failover to lower-priority
clusters when a higher-priority cluster is stuck in
<code>CONNECTING</code> state. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8813">#8813</a>)</li>
<li>health: Fix a bug where health checks failed for clients using
legacy compression options (<code>WithDecompressor</code> or
<code>RPCDecompressor</code>). (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8765">#8765</a>)
<ul>
<li>Special Thanks: <a
href="https://github.com/sanki92"><code>@​sanki92</code></a></li>
</ul>
</li>
<li>transport: Fix an issue where the HTTP/2 server could skip header
size checks when terminating a stream early. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8769">#8769</a>)
<ul>
<li>Special Thanks: <a
href="https://github.com/joybestourous"><code>@​joybestourous</code></a></li>
</ul>
</li>
<li>server: Propagate status detail headers, if available, when
terminating a stream during request header processing. (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8754">#8754</a>)
<ul>
<li>Special Thanks: <a
href="https://github.com/joybestourous"><code>@​joybestourous</code></a></li>
</ul>
</li>
</ul>
<h1>Performance Improvements</h1>
<ul>
<li>credentials/alts: Optimize read buffer alignment to reduce copies.
(<a
href="https://redirect.github.com/grpc/grpc-go/issues/8791">#8791</a>)</li>
<li>mem: Optimize pooling and creation of <code>buffer</code> objects.
(<a
href="https://redirect.github.com/grpc/grpc-go/issues/8784">#8784</a>)</li>
<li>transport: Reduce slice re-allocations by reserving slice capacity.
(<a
href="https://redirect.github.com/grpc/grpc-go/issues/8797">#8797</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="dda86dbd9c"><code>dda86db</code></a>
Change version to 1.79.3 (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8983">#8983</a>)</li>
<li><a
href="72186f163e"><code>72186f1</code></a>
grpc: enforce strict path checking for incoming requests on the server
(<a
href="https://redirect.github.com/grpc/grpc-go/issues/8981">#8981</a>)</li>
<li><a
href="97ca3522b2"><code>97ca352</code></a>
Changing version to 1.79.3-dev (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8954">#8954</a>)</li>
<li><a
href="8902ab6efe"><code>8902ab6</code></a>
Change the version to release 1.79.2 (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8947">#8947</a>)</li>
<li><a
href="a9286705aa"><code>a928670</code></a>
Cherry-pick <a
href="https://redirect.github.com/grpc/grpc-go/issues/8874">#8874</a> to
v1.79.x (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8904">#8904</a>)</li>
<li><a
href="06df3638c0"><code>06df363</code></a>
Change version to 1.79.2-dev (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8903">#8903</a>)</li>
<li><a
href="782f2de44f"><code>782f2de</code></a>
Change version to 1.79.1 (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8902">#8902</a>)</li>
<li><a
href="850eccbb22"><code>850eccb</code></a>
Change version to 1.79.1-dev (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8851">#8851</a>)</li>
<li><a
href="765ff056b6"><code>765ff05</code></a>
Change version to 1.79.0 (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8850">#8850</a>)</li>
<li><a
href="68804be0e7"><code>68804be</code></a>
Cherry pick <a
href="https://redirect.github.com/grpc/grpc-go/issues/8864">#8864</a> to
v1.79.x (<a
href="https://redirect.github.com/grpc/grpc-go/issues/8896">#8896</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/grpc/grpc-go/compare/v1.78.0...v1.79.3">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=google.golang.org/grpc&package-manager=go_modules&previous-version=1.78.0&new-version=1.79.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2026-03-24 11:34:18 -04:00
manuka rahul
217fba1406 docs: fix-link-checker-for-forked-repos (#2682)
**Problem**
Previously, this workflow tried to post a comment on every PR. However,
due to GitHub security updates, workflows no longer have "Write" access
to post comments when they come from a forked repository. This was
causing the action to fail or error out.

**Fix**
- The PR automated commenting has been removed to ensure stable workflow
execution.
- Instead of a PR comment, a full summary of any link issues is now
provided directly within the GitHub Actions Summary tab.
2026-03-24 11:06:19 -04:00
Twisha Bansal
c3ce7d72fc ci: remove sync repo settings file (#2761)
Settings are controlled through UI
2026-03-24 14:28:34 +00:00
Harsh Jha
b57f2e37bf docs: add OpenTelemetry integration details for Python SDKs (#2824)
This PR updates the documentation for the Python ADK, Core, LangChain,
and LlamaIndex SDKs to include instructions for enabling and configuring
**OpenTelemetry** tracing and metrics.
2026-03-24 18:33:19 +05:30
manuka rahul
1ec3c9baad ci: ignore failing links (#2815)
The link checker is currently failing because our local firewall blocks
outbound HTTPS (Port 443) requests to Google Cloud. This causes the
workflow to report "broken" links even when the links themselves are
fine.

Changes
Added google.cloud.com to the exclude/ignore list in the link checker
configuration.
Added https://play.dgraph.io/ to exclude/ignore list in the link checker
configuration

Fixes: https://github.com/googleapis/genai-toolbox/issues/2747 ,
https://github.com/googleapis/genai-toolbox/issues/2669
2026-03-24 11:41:43 +05:30
Noriaki Hiraki
09bd5e03f0 chore(deps): upgrade looker go sdk to v0.26.6 (#2822)
## Description

Upgrades the Looker Go SDK
(`github.com/looker-open-source/sdk-codegen/go`) from v0.26.2 to
v0.26.6.
This upgrade is a prerequisite for adding the `looker-agent` tool.
Version 0.26.6 includes the necessary API methods and models for
managing Looker AI Agents (e.g., `SearchAgents`, `CreateAgent`,
`GetAgent`, and `DeleteAgent`) which were not available in the previous
version.


## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-24 00:33:25 +00:00
Yuan Teoh
ab64c9514a feat!: removing deprecations and update tools-file flag (#2806)
This PR includes the following:
* BREAKING CHANGE: Removing cloudsqlmssql support for ipAddress 
* BREAKING CHANGE: Removing support for authSources
* BREAKING CHANGE: Updating flat format config's `kind` value from
plural to singular
* Deprecating the `tools-file`, `tools-files`, and `tools-folder` flag
and adding new `config`, `configs`, and `config-folder` flag.

This is the main PR merging into main that includes previously approved
PRs.
2026-03-23 17:01:28 -07:00
Averi Kitsch
6c8041f709 docs: add versioning policy (#2805)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-23 16:31:38 -07:00
Dr. Strangelove
1bde1007b6 docs(looker): Updates to docs for looker-dev prebuilt tools and fixing some out of date references. (#2818)
## Description

Updates to docs for looker-dev prebuilt tools and fixing some out of
date references.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [X] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [x] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #
2026-03-23 14:25:59 -07:00
Averi Kitsch
cb1381751a chore: Update CODEOWNERS with overrides (#2816)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-03-23 13:23:09 -07:00
Averi Kitsch
a254966b5b ci: update renovate for go samples (#2629)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-03-23 17:33:37 +00:00
Harsh Jha
8cf1c52d67 feat: added java SDK docs (#2675)
### Overview
This PR introduces the official documentation for the **Java SDK** to
the GenAI Toolbox. It includes a high-level overview, installation
guides for Maven and Gradle, and comprehensive usage examples for
integrating the MCP Toolbox into Java applications.

### Key Changes
#### 1. New Documentation
* **Java SDK Landing Page**: Created `docs/en/sdks/java/_index.md`
providing an overview of the SDK's capabilities, including fetching tool
definitions and invoking tools.
* **Core SDK Guide**: Added `docs/en/sdks/java/core/index.md`, which
covers:
* **Installation**: Setup instructions for Maven and Gradle using
version `0.2.0`.
* **Client Initialization**: Examples for local development and Cloud
Run production environments.
* **Usage Patterns**: Detailed guides for loading toolsets, invoking
tools, and handling responses.
* **Authentication**: Instructions for Client-to-Server (ADC/OIDC) and
Tool-level authentication using `AuthTokenGetter`.
* **Parameter Binding**: Documentation for static and dynamic parameter
binding.
#### 2. Directory Refactoring
* Renamed several SDK directories to follow a consistent PascalCase
naming convention:
        * `go-sdk` -> `Go`
        * `JS-sdk` -> `Js`
        * `python-sdk` -> `python`

### Technical Notes
* The documentation emphasizes the **Async-First** nature of the Java
SDK, utilizing `CompletableFuture` for non-blocking execution.
* Updated internal links to reflect the new directory structure for Go,
JS, and Python SDKs.

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Anubhav Dhawan <anubhavdhawan@google.com>
2026-03-23 21:04:08 +05:30
Niraj Nandre
30a06f72d8 ci: implement script-based sharding in integration suite (#2800)
## Description

This PR implements **YAML-based script sharding** within the integration
suite to address long execution times and resource exhaustion. By adding
logic to `.ci/integration.cloudbuild.yaml,` each database-specific test
step now independently determines if it should run based on the files
changed in the Pull Request.

**Technical Implementation**
Each test step now includes a pre-execution check using `git diff`. A
test shard will only execute if:

Relevant database source or test files are modified (e.g.,
`tests/spanner/`).
Core logic is modified (e.g., `internal/server/`).
Common test utilities are modified (e.g., `tests/common.go`,`
tests/tool.go`).

**Why this solution? (Pros vs. Cons)**
We previously evaluated and tested a **multiple trigger-based
approach**, but found it unsuitable for our current project
requirements:

Cons of Multiple Triggers:

- **Redundant Setup**: Every trigger repeated the 2-3 minute dependency
installation and binary compilation phase.
- **Serialization Issues**: Builds often ran in series rather than
parallel, leading to long overall wait times for developers.

**Pros of Current (Single-Trigger) Solution:**

**Efficient One-Time Setup**: The **install-dependencies** and
**compile-test-binary** steps run only once for the entire build.
**Superior Parallelism**: Inside a single build, Cloud Build executes up
to 10 concurrent steps. Shards that are skipped exit instantly, freeing
up concurrent slots for the shards that need to run.

Previous PR -
[https://github.com/googleapis/genai-toolbox/pull/2692](https://github.com/googleapis/genai-toolbox/pull/2692)

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-03-23 18:22:09 +05:30
Harsh Jha
51c49c9093 doc: remove deprecated native protocol references across all sdk pack… (#2775)
This Pull Request removes all references to the deprecated **native
Toolbox protocol** across the SDK documentation.

### Summary of Changes

- **Removed Deprecation Notices**: Deleted warnings for
`Protocol.TOOLBOX` (JS/Python) and `core.Toolbox` (Go), as the removal
date has passed.
- **Updated Examples:** Switched all initialization code snippets to use
the default `Protocol.MCP` ($v2025-06-18$).
- **Cleaned Tables:** Removed the legacy protocol from "Supported
Protocols" tables in the Go, Python, and JavaScript SDK guides.
- **Refined Docs:** Simplified transport descriptions to focus on **MCP
over HTTP**.

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-23 16:43:29 +05:30
ishatilwani1301
4202ad744c ci: enforce strict exit codes for Oracle integration tests (#2748)
## Description
This PR updates the Oracle integration test execution in the
integration.cloudbuild.yaml file to strictly enforce exit codes.

Previously, if the go test command failed, the pipeline could
potentially ignore the test failure, continue to calculate coverage, and
return a false-positive success. This change wraps the test execution in
an if not conditional to catch test failures, print an explicit error
message, and immediately trigger an exit 1 command to halt the build.
2026-03-23 14:59:47 +05:30
Haoyu Wang
ae51f00540 ci(test): reroute AlloyDB AI NL tests to the original database (#2807)
This PR cleans up the AlloyDB AI NL integration test by pointing it to
the original instance after applying the patch.
2026-03-20 23:49:04 +00:00
dependabot[bot]
5270fd51e6 chore(deps): bump fast-xml-parser from 5.4.1 to 5.5.7 in /docs/en/samples/pre_post_processing/js/adk (#2797)
Bumps
[fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser)
from 5.4.1 to 5.5.7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/releases">fast-xml-parser's
releases</a>.</em></p>
<blockquote>
<h2>fix entity expansion and incorrect replacement and performance</h2>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.5...v5.5.6">https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.5...v5.5.6</a></p>
<h2>support onDangerousProperty</h2>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.3...v5.5.5">https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.3...v5.5.5</a></p>
<h2>update dependecies to fix typings</h2>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.1...v5.5.2">https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.1...v5.5.2</a></p>
<h2>integrate path-expression-matcher</h2>
<ul>
<li>support path-expression-matcher</li>
<li>fix: stopNode should not be parsed</li>
<li>performance improvement for stopNode checking</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md">fast-xml-parser's
changelog</a>.</em></p>
<blockquote>
<p><!-- raw HTML omitted -->Note: If you find missing information about
particular minor version, that version must have been changed without
any functional change in this library.<!-- raw HTML omitted --></p>
<p>Note: Due to some last quick changes on v4, detail of v4.5.3 &amp;
v4.5.4 are not updated here. v4.5.4x is the last tag of v4 in github
repository. I'm extremely sorry for the confusion</p>
<p><strong>5.5.7 / 2026-03-19</strong></p>
<ul>
<li>fix: entity expansion limits</li>
<li>update strnum package to 2.2.0</li>
</ul>
<p><strong>5.5.6 / 2026-03-16</strong></p>
<ul>
<li>update builder dependency</li>
<li>fix incorrect regex to replace . in entity name</li>
<li>fix check for entitiy expansion for lastEntities and html entities
too</li>
</ul>
<p><strong>5.5.5 / 2026-03-13</strong></p>
<ul>
<li>sanitize dangerous tag or attribute name</li>
<li>error on critical property name</li>
<li>support onDangerousProperty option</li>
</ul>
<p><strong>5.5.4 / 2026-03-13</strong></p>
<ul>
<li>declare Matcher &amp; Expression as unknown so user is not forced to
install path-expression-matcher</li>
</ul>
<p><strong>5.5.3 / 2026-03-11</strong></p>
<ul>
<li>upgrade builder</li>
</ul>
<p><strong>5.5.2 / 2026-03-11</strong></p>
<ul>
<li>update dependency to fix typings</li>
</ul>
<p><strong>5.5.1 / 2026-03-10</strong></p>
<ul>
<li>fix dependency</li>
</ul>
<p><strong>5.5.0 / 2026-03-10</strong></p>
<ul>
<li>support path-expression-matcher</li>
<li>fix: stopNode should not be parsed</li>
<li>performance improvement for stopNode checking</li>
</ul>
<p><strong>5.4.2 / 2026-03-03</strong></p>
<ul>
<li>support maxEntityCount option</li>
</ul>
<p><strong>5.4.1  / 2026-02-25</strong></p>
<ul>
<li>fix (<a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/issues/785">#785</a>)
unpairedTag node should not have tag content</li>
</ul>
<p><strong>5.4.0  / 2026-02-25</strong></p>
<ul>
<li>migrate to fast-xml-builder</li>
</ul>
<p><strong>5.3.9 / 2026-02-25</strong></p>
<ul>
<li>support strictReservedNames</li>
</ul>
<p><strong>5.3.8 / 2026-02-25</strong></p>
<ul>
<li>support maxNestedTags</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a21c44123c"><code>a21c441</code></a>
update package detail</li>
<li><a
href="239b64aa1f"><code>239b64a</code></a>
check for min value for entity exapantion options</li>
<li><a
href="61cb666d13"><code>61cb666</code></a>
restrict more properties to be unsafe</li>
<li><a
href="41abd66adc"><code>41abd66</code></a>
performance improvement of reading DOCTYPE</li>
<li><a
href="3dfcd20c8c"><code>3dfcd20</code></a>
refactor: performance improvement</li>
<li><a
href="870043e75e"><code>870043e</code></a>
update release info</li>
<li><a
href="6df401ef2b"><code>6df401e</code></a>
update builder dependency</li>
<li><a
href="bd26122c83"><code>bd26122</code></a>
check for entitiy expansion for lastEntities and html entities too</li>
<li><a
href="7e70dd8f75"><code>7e70dd8</code></a>
fix incorrect regex to replace . in entity name</li>
<li><a
href="e54155f530"><code>e54155f</code></a>
update package info</li>
<li>Additional commits viewable in <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.4.1...v5.5.7">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=fast-xml-parser&package-manager=npm_and_yarn&previous-version=5.4.1&new-version=5.5.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-20 16:33:32 -07:00
dependabot[bot]
3e6b8e6866 chore(deps): bump fast-xml-parser from 5.5.6 to 5.5.7 in /docs/en/getting-started/quickstart/js/genkit (#2796)
Bumps
[fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser)
from 5.5.6 to 5.5.7.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md">fast-xml-parser's
changelog</a>.</em></p>
<blockquote>
<p><!-- raw HTML omitted -->Note: If you find missing information about
particular minor version, that version must have been changed without
any functional change in this library.<!-- raw HTML omitted --></p>
<p>Note: Due to some last quick changes on v4, detail of v4.5.3 &amp;
v4.5.4 are not updated here. v4.5.4x is the last tag of v4 in github
repository. I'm extremely sorry for the confusion</p>
<p><strong>5.5.7 / 2026-03-19</strong></p>
<ul>
<li>fix: entity expansion limits</li>
<li>update strnum package to 2.2.0</li>
</ul>
<p><strong>5.5.6 / 2026-03-16</strong></p>
<ul>
<li>update builder dependency</li>
<li>fix incorrect regex to replace . in entity name</li>
<li>fix check for entitiy expansion for lastEntities and html entities
too</li>
</ul>
<p><strong>5.5.5 / 2026-03-13</strong></p>
<ul>
<li>sanitize dangerous tag or attribute name</li>
<li>error on critical property name</li>
<li>support onDangerousProperty option</li>
</ul>
<p><strong>5.5.4 / 2026-03-13</strong></p>
<ul>
<li>declare Matcher &amp; Expression as unknown so user is not forced to
install path-expression-matcher</li>
</ul>
<p><strong>5.5.3 / 2026-03-11</strong></p>
<ul>
<li>upgrade builder</li>
</ul>
<p><strong>5.5.2 / 2026-03-11</strong></p>
<ul>
<li>update dependency to fix typings</li>
</ul>
<p><strong>5.5.1 / 2026-03-10</strong></p>
<ul>
<li>fix dependency</li>
</ul>
<p><strong>5.5.0 / 2026-03-10</strong></p>
<ul>
<li>support path-expression-matcher</li>
<li>fix: stopNode should not be parsed</li>
<li>performance improvement for stopNode checking</li>
</ul>
<p><strong>5.4.2 / 2026-03-03</strong></p>
<ul>
<li>support maxEntityCount option</li>
</ul>
<p><strong>5.4.1  / 2026-02-25</strong></p>
<ul>
<li>fix (<a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/issues/785">#785</a>)
unpairedTag node should not have tag content</li>
</ul>
<p><strong>5.4.0  / 2026-02-25</strong></p>
<ul>
<li>migrate to fast-xml-builder</li>
</ul>
<p><strong>5.3.9 / 2026-02-25</strong></p>
<ul>
<li>support strictReservedNames</li>
</ul>
<p><strong>5.3.8 / 2026-02-25</strong></p>
<ul>
<li>support maxNestedTags</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a21c44123c"><code>a21c441</code></a>
update package detail</li>
<li><a
href="239b64aa1f"><code>239b64a</code></a>
check for min value for entity exapantion options</li>
<li><a
href="61cb666d13"><code>61cb666</code></a>
restrict more properties to be unsafe</li>
<li><a
href="41abd66adc"><code>41abd66</code></a>
performance improvement of reading DOCTYPE</li>
<li><a
href="3dfcd20c8c"><code>3dfcd20</code></a>
refactor: performance improvement</li>
<li>See full diff in <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.6...v5.5.7">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=fast-xml-parser&package-manager=npm_and_yarn&previous-version=5.5.6&new-version=5.5.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-20 16:26:56 -07:00
Haoyu Wang
ec1ffacaac ci(test): fix flaky alloydb ai nl integration test (#2802)
This PR attempts to fix flaky integration test for AlloyDB AI NL by
routing it to a temporary database. Once verified we can apply the same
patch to the original database and reroute the CI/CD back to it.

Co-authored-by: Matthew Jacobs <mjacobs@apache.org>
2026-03-20 15:41:13 -07:00
Dr. Strangelove
d9fe8ecc39 chore: adjust looker integration test for possible race state in Looker (#2804)
## Description

Add sleep in integration test to work around possible race state in
Looker.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [x] Make sure to add `!` if this involve a breaking change

🛠️ Fixes # issue reported by @Yuan325
2026-03-20 14:48:33 -07:00
Mend Renovate
1c7c061d5b chore(deps): update module google.golang.org/grpc to v1.79.3 [security] (#2784)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [google.golang.org/grpc](https://redirect.github.com/grpc/grpc-go) |
`v1.79.1` → `v1.79.3` |
![age](https://developer.mend.io/api/mc/badges/age/go/google.golang.org%2fgrpc/v1.79.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/google.golang.org%2fgrpc/v1.79.1/v1.79.3?slim=true)
|

### GitHub Vulnerability Alerts

####
[CVE-2026-33186](https://redirect.github.com/grpc/grpc-go/security/advisories/GHSA-p77j-4mvh-x3m3)

### Impact
_What kind of vulnerability is it? Who is impacted?_

It is an **Authorization Bypass** resulting from **Improper Input
Validation** of the HTTP/2 `:path` pseudo-header.

The gRPC-Go server was too lenient in its routing logic, accepting
requests where the `:path` omitted the mandatory leading slash (e.g.,
`Service/Method` instead of `/Service/Method`). While the server
successfully routed these requests to the correct handler, authorization
interceptors (including the official `grpc/authz` package) evaluated the
raw, non-canonical path string. Consequently, "deny" rules defined using
canonical paths (starting with `/`) failed to match the incoming
request, allowing it to bypass the policy if a fallback "allow" rule was
present.

**Who is impacted?**
This affects gRPC-Go servers that meet both of the following criteria:
1. They use path-based authorization interceptors, such as the official
RBAC implementation in `google.golang.org/grpc/authz` or custom
interceptors relying on `info.FullMethod` or `grpc.Method(ctx)`.
2. Their security policy contains specific "deny" rules for canonical
paths but allows other requests by default (a fallback "allow" rule).

The vulnerability is exploitable by an attacker who can send raw HTTP/2
frames with malformed `:path` headers directly to the gRPC server.

### Patches
_Has the problem been patched? What versions should users upgrade to?_

Yes, the issue has been patched. The fix ensures that any request with a
`:path` that does not start with a leading slash is immediately rejected
with a `codes.Unimplemented` error, preventing it from reaching
authorization interceptors or handlers with a non-canonical path string.

Users should upgrade to the following versions (or newer):
* **v1.79.3**
* The latest **master** branch.

It is recommended that all users employing path-based authorization
(especially `grpc/authz`) upgrade as soon as the patch is available in a
tagged release.

### Workarounds
_Is there a way for users to fix or remediate the vulnerability without
upgrading?_

While upgrading is the most secure and recommended path, users can
mitigate the vulnerability using one of the following methods:

#### 1. Use a Validating Interceptor (Recommended Mitigation)
Add an "outermost" interceptor to your server that validates the path
before any other authorization logic runs:

```go
func pathValidationInterceptor(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) {
    if info.FullMethod == "" || info.FullMethod[0] != '/' {
        return nil, status.Errorf(codes.Unimplemented, "malformed method name")
    }   
    return handler(ctx, req)
}

// Ensure this is the FIRST interceptor in your chain
s := grpc.NewServer(
    grpc.ChainUnaryInterceptor(pathValidationInterceptor, authzInterceptor),
)
```

#### 2. Infrastructure-Level Normalization
If your gRPC server is behind a reverse proxy or load balancer (such as
Envoy, NGINX, or an L7 Cloud Load Balancer), ensure it is configured to
enforce strict HTTP/2 compliance for pseudo-headers and reject or
normalize requests where the `:path` header does not start with a
leading slash.

#### 3. Policy Hardening
Switch to a "default deny" posture in your authorization policies
(explicitly listing all allowed paths and denying everything else) to
reduce the risk of bypasses via malformed inputs.

---

### Release Notes

<details>
<summary>grpc/grpc-go (google.golang.org/grpc)</summary>

###
[`v1.79.3`](https://redirect.github.com/grpc/grpc-go/releases/tag/v1.79.3):
Release 1.79.3

[Compare
Source](https://redirect.github.com/grpc/grpc-go/compare/v1.79.2...v1.79.3)

### Security

- server: fix an authorization bypass where malformed :path headers
(missing the leading slash) could bypass path-based restricted "deny"
rules in interceptors like `grpc/authz`. Any request with a
non-canonical path is now immediately rejected with an `Unimplemented`
error.
([#&#8203;8981](https://redirect.github.com/grpc/grpc-go/issues/8981))

###
[`v1.79.2`](https://redirect.github.com/grpc/grpc-go/releases/tag/v1.79.2):
Release 1.79.2

[Compare
Source](https://redirect.github.com/grpc/grpc-go/compare/v1.79.1...v1.79.2)

### Bug Fixes

- stats: Prevent redundant error logging in health/ORCA producers by
skipping stats/tracing processing when no stats handler is configured.
([#&#8203;8874](https://redirect.github.com/grpc/grpc-go/pull/8874))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My42Ni40IiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-03-20 19:01:18 +00:00
Wenxin Du
4b074edbf5 docs: Add error categorization docs (#2726)
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-03-20 09:58:39 -07:00
release-please[bot]
5ef1c0ddda chore(main): release 0.30.0 (#2758)
🤖 I have created a release *beep* *boop*
---


##
[0.30.0](https://github.com/googleapis/genai-toolbox/compare/v0.29.0...v0.30.0)
(2026-03-20)


### Features

* **cli:** Add migrate subcommand
([#2679](https://github.com/googleapis/genai-toolbox/issues/2679))
([12171f7](12171f7a02))
* **cli:** Add serve subcommand
([#2550](https://github.com/googleapis/genai-toolbox/issues/2550))
([1e2c7c7](1e2c7c7804))
* **skill:** One skill per toolset
([#2733](https://github.com/googleapis/genai-toolbox/issues/2733))
([5b85c65](5b85c65960))
* **source/oracledb:** Add Oracle DB for MCP tools and configurations,
updated tools and documentation
([#2625](https://github.com/googleapis/genai-toolbox/issues/2625))
([e350fc7](e350fc7879))
* **tools/looker:** Support git_branch tools for looker.
([#2718](https://github.com/googleapis/genai-toolbox/issues/2718))
([70ed8a0](70ed8a0dcb))
* **tools/dataplex-search-entries:** Add `scope` support to
search_entries tool
([#2740](https://github.com/googleapis/genai-toolbox/issues/2740))
([10af468](10af4682cc))


### Bug Fixes

* **cloudloggingadmin:** Increase log injesting time and add auth test
([#2772](https://github.com/googleapis/genai-toolbox/issues/2772))
([50b4457](50b4457095))
* **oracle:** Normalize encoded proxy usernames in go-ora DSN
([#2469](https://github.com/googleapis/genai-toolbox/issues/2469))
([b1333cd](b1333cd271))
* **postgres:** Update execute-sql tool to avoid multi-statements
parameter
([#2707](https://github.com/googleapis/genai-toolbox/issues/2707))
([58bc772](58bc772f88))
* **skills:** Improve flag validation and silence unit test output
([#2759](https://github.com/googleapis/genai-toolbox/issues/2759))
([f3da6aa](f3da6aa5e2))
* **test:** Address flaky healthcare integration test run
([#2742](https://github.com/googleapis/genai-toolbox/issues/2742))
([9590821](9590821bc7))


### Reverts

* **ci:** Implement conditional sharding logic in integration tests
([#2763](https://github.com/googleapis/genai-toolbox/issues/2763))
([1528d7c](1528d7c38d))

---
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>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-20 00:53:52 +00:00
Matt Cornillon
58bc772f88 fix(postgres): update execute-sql tool to avoid multi-statements parameter (#2707)
## Description

This PR updates the `execute-sql` tool to avoid multi-statement
execution parameters.

## PR Checklist

- [x] Make sure you reviewed
[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a
[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
before writing your code! That way we can discuss the change, evaluate
designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

Co-authored-by: Averi Kitsch <akitsch@google.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-20 00:26:43 +00:00
Yuan Teoh
02959cadf0 chore: release hugo update (#2792)
update hugo.toml for 0.30.0 release
2026-03-19 17:05:59 -07:00
sumedhdk22
10af4682cc feat(tools/dataplex-search-entries): add scope support to search_entries tool (#2740)
## Description

This PR adds support for the optional `scope` parameter to the dataplex
`search-entries` tool. This allows users to limit the search space to a
particular project or organization.

## PR Checklist

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #2739

---------

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-19 16:06:59 -07:00
Huan Chen
8276913954 chore(bigquery): increase conversational analytics timeout (#2780)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-19 19:26:27 +00:00
Yuan Teoh
6ef7183637 chore(sources/cloudsqlmysql,sources/mysql): remove required from database name (#2771)
Tested locally.

To connect to MySQL, the database field is optional in the connection
string. If not specified, the client will log into MySQL at root level.
Tested that I am able to access object by full name
`<database_name>.<table_name>` without providing the database field in
source.

Update for mysql source to build DSN using the `go-sql-driver/mysql`
Config struct
(https://pkg.go.dev/github.com/go-sql-driver/mysql#Config.FormatDSN).
2026-03-19 19:03:45 +00:00
Haoyu Wang
5b85c65960 feat(skill): one skill per toolset (#2733)
This PR modifies the skills-generate command behavior to support
generating multiple agent skills at once when multiple toolsets are
defined in a configuration and no specific --toolset argument is
provided.
2026-03-19 10:16:47 -04:00
Yuan Teoh
12171f7a02 feat: add migrate subcommand (#2679)
Add a `migrate` subcommand to help migrate all configuration files to
flat format.

This PR also updates the `LoadConfig()` function in `options.go` by
extracting the custom config path logic into a new function. This
removes duplication and makes the logic reusable for the migrate
subcommand.
2026-03-19 00:42:59 +00:00
Twisha Bansal
cf787a71ea ci: remove issue assignment for OOO (#2778)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-03-18 20:50:06 +00:00
Dr. Strangelove
70ed8a0dcb feat(tool/looker): git_branch tools for looker. (#2718)
## Description

This tool is used to fetch and manipulate the git branch of a LookML
project.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [x] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #2678
2026-03-18 20:43:57 +00:00
johannes c. dumitru
e350fc7879 feat(source/oracledb): add Oracle DB for MCP tools and configurations, updated tools and documentation (#2625)
## Subject
       Oracle DB MCP Toolbox

## Type : Feature

## Description
Add Oracle DB MCP tools and documentation to reflect functionality for
gemini cli extension

🛠️ Feature #<475844916>

---------

Co-authored-by: Bryan Thompson <bthompson@maillocker.net>
Co-authored-by: triepod-ai <199543909+triepod-ai@users.noreply.github.com>
Co-authored-by: bryankthompson <199543909+bryankthompson@users.noreply.github.com>
Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-18 19:26:59 +00:00
Wenxin Du
17a679ba9a test(cloudloggingadmin): Fix flakey list-log-names test (#2777)
Remove check for log names for flexibility
2026-03-18 19:02:59 +00:00
Mend Renovate
67c8eb65f1 chore(deps): update actions/cache digest to 6682284 (#2776)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/cache](https://redirect.github.com/actions/cache)
([changelog](cdf6c1fa76..668228422a))
| action | digest | `cdf6c1f` → `6682284` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My42Ni40IiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
2026-03-18 12:53:43 -04:00
Yuan Teoh
50b4457095 fix(cloudloggingadmin): increase log injesting time and add auth test (#2772)
Addresses flakiness in the list log names test, which was suspected to
caused by querying logs before they were fully ingested.

Adds a new success path test case for `runAuthListLogNamesTest`.
2026-03-18 10:29:57 -04:00
dependabot[bot]
5c92e39cc2 chore(deps): bump fast-xml-parser and @google-cloud/storage in /docs/en/getting-started/quickstart/js/genkit (#2773)
Bumps
[fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser)
and
[@google-cloud/storage](https://github.com/googleapis/nodejs-storage).
These dependencies needed to be updated together.
Updates `fast-xml-parser` from 4.5.4 to 5.5.6
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/releases">fast-xml-parser's
releases</a>.</em></p>
<blockquote>
<h2>fix entity expansion and incorrect replacement and performance</h2>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.5...v5.5.6">https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.5...v5.5.6</a></p>
<h2>support onDangerousProperty</h2>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.3...v5.5.5">https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.3...v5.5.5</a></p>
<h2>update dependecies to fix typings</h2>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.1...v5.5.2">https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.1...v5.5.2</a></p>
<h2>integrate path-expression-matcher</h2>
<ul>
<li>support path-expression-matcher</li>
<li>fix: stopNode should not be parsed</li>
<li>performance improvement for stopNode checking</li>
</ul>
<h2>Separate Builder</h2>
<p>XML Builder was the part of <a
href="https://github.com/NaturalIntelligence/fast-xml-builder">fast-xml-parser</a>
for years. But considering that any bug in builder may false-alarm the
users who are only using parser and vice-versa, we have decided to split
it into a separate package.</p>
<h2>Migration</h2>
<p>To migrate to fast-xml-builder;</p>
<p>From</p>
<pre lang="js"><code>import { XMLBuilder } from
&quot;fast-xml-parser&quot;;
</code></pre>
<p>To</p>
<pre lang="js"><code>import XMLBuilder from
&quot;fast-xml-builder&quot;;
</code></pre>
<p>XMLBuilder will be removed from current package in any next major
version of this library. So better to migrate.</p>
<h2>support strictReservedNames</h2>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.9...v5.3.9">https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.9...v5.3.9</a></p>
<h2>handle non-array input for XML builder &amp;&amp; support
maxNestedTags</h2>
<ul>
<li>support maxNestedTags</li>
<li>handle non-array input for XML builder when preserveOrder is true
(By <a href="https://github.com/Angelopvtac">Angelo Coetzee</a>)</li>
<li>save use of js properies
<strong>Full Changelog</strong>: <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.7...v5.3.8">https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.7...v5.3.8</a></li>
</ul>
<h2>CJS typing fix</h2>
<h2>What's Changed</h2>
<ul>
<li>Unexport <code>X2jOptions</code> at declaration site by <a
href="https://github.com/Drarig29"><code>@​Drarig29</code></a> in <a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/pull/787">NaturalIntelligence/fast-xml-parser#787</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/Drarig29"><code>@​Drarig29</code></a>
made their first contribution in <a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/pull/787">NaturalIntelligence/fast-xml-parser#787</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md">fast-xml-parser's
changelog</a>.</em></p>
<blockquote>
<p><!-- raw HTML omitted -->Note: If you find missing information about
particular minor version, that version must have been changed without
any functional change in this library.<!-- raw HTML omitted --></p>
<p>Note: Due to some last quick changes on v4, detail of v4.5.3 &amp;
v4.5.4 are not updated here. v4.5.4x is the last tag of v4 in github
repository. I'm extremely sorry for the confusion</p>
<p><strong>5.5.6 / 2026-03-16</strong></p>
<ul>
<li>update builder dependency</li>
<li>fix incorrect regex to replace . in entity name</li>
<li>fix check for entitiy expansion for lastEntities and html entities
too</li>
</ul>
<p><strong>5.5.5 / 2026-03-13</strong></p>
<ul>
<li>sanitize dangerous tag or attribute name</li>
<li>error on critical property name</li>
<li>support onDangerousProperty option</li>
</ul>
<p><strong>5.5.4 / 2026-03-13</strong></p>
<ul>
<li>declare Matcher &amp; Expression as unknown so user is not forced to
install path-expression-matcher</li>
</ul>
<p><strong>5.5.3 / 2026-03-11</strong></p>
<ul>
<li>upgrade builder</li>
</ul>
<p><strong>5.5.2 / 2026-03-11</strong></p>
<ul>
<li>update dependency to fix typings</li>
</ul>
<p><strong>5.5.1 / 2026-03-10</strong></p>
<ul>
<li>fix dependency</li>
</ul>
<p><strong>5.5.0 / 2026-03-10</strong></p>
<ul>
<li>support path-expression-matcher</li>
<li>fix: stopNode should not be parsed</li>
<li>performance improvement for stopNode checking</li>
</ul>
<p><strong>5.4.2 / 2026-03-03</strong></p>
<ul>
<li>support maxEntityCount option</li>
</ul>
<p><strong>5.4.1  / 2026-02-25</strong></p>
<ul>
<li>fix (<a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/issues/785">#785</a>)
unpairedTag node should not have tag content</li>
</ul>
<p><strong>5.4.0  / 2026-02-25</strong></p>
<ul>
<li>migrate to fast-xml-builder</li>
</ul>
<p><strong>5.3.9 / 2026-02-25</strong></p>
<ul>
<li>support strictReservedNames</li>
</ul>
<p><strong>5.3.8 / 2026-02-25</strong></p>
<ul>
<li>support maxNestedTags</li>
<li>handle non-array input for XML builder when preserveOrder is true
(By <a href="https://github.com/Angelopvtac">Angelo Coetzee</a>)</li>
<li>save use of js properies</li>
</ul>
<p><strong>5.3.7 / 2026-02-20</strong></p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="870043e75e"><code>870043e</code></a>
update release info</li>
<li><a
href="6df401ef2b"><code>6df401e</code></a>
update builder dependency</li>
<li><a
href="bd26122c83"><code>bd26122</code></a>
check for entitiy expansion for lastEntities and html entities too</li>
<li><a
href="7e70dd8f75"><code>7e70dd8</code></a>
fix incorrect regex to replace . in entity name</li>
<li><a
href="e54155f530"><code>e54155f</code></a>
update package info</li>
<li><a
href="3308fd7a45"><code>3308fd7</code></a>
handle critical properties</li>
<li><a
href="0500f6b4d6"><code>0500f6b</code></a>
refactor</li>
<li><a
href="ea07bb2e84"><code>ea07bb2</code></a>
declare Matcher &amp; Expression as unknown</li>
<li><a
href="0a4dc92f97"><code>0a4dc92</code></a>
upgrade builder</li>
<li><a
href="e0a14f7d15"><code>e0a14f7</code></a>
update dependency to fix typings</li>
<li>Additional commits viewable in <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v4.5.4...v5.5.6">compare
view</a></li>
</ul>
</details>
<br />

Updates `@google-cloud/storage` from 7.17.0 to 7.19.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/nodejs-storage/releases"><code>@​google-cloud/storage</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v7.19.0</h2>
<h2><a
href="https://github.com/googleapis/nodejs-storage/compare/v7.18.0...v7.19.0">7.19.0</a>
(2026-02-05)</h2>
<h3>Features</h3>
<ul>
<li>Enable full object checksum validation on JSON path (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2687">#2687</a>)
(<a
href="08a896240e">08a8962</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>deps:</strong> Update dependency fast-xml-parser to v5
[security] (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2713">#2713</a>)
(<a
href="420935a033">420935a</a>)</li>
</ul>
<h2>v7.18.0</h2>
<h2><a
href="https://github.com/googleapis/nodejs-storage/compare/v7.17.3...v7.18.0">7.18.0</a>
(2025-11-28)</h2>
<h3>Features</h3>
<ul>
<li><strong>listBuckets:</strong> Add support for returning partial
success (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2678">#2678</a>)
(<a
href="c7004daae0">c7004da</a>)</li>
</ul>
<h2>v7.17.3</h2>
<h2><a
href="https://github.com/googleapis/nodejs-storage/compare/v7.17.2...v7.17.3">7.17.3</a>
(2025-11-03)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>🐛 fix the issue 2667, do not mutate object given to options …
(<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2668">#2668</a>)
(<a
href="8a9f25968a">8a9f259</a>)</li>
<li>Revert implement path containment to prevent traversal attacks (<a
href="254b6b2f9e">254b6b2</a>)</li>
</ul>
<h2>v7.17.2</h2>
<h2><a
href="https://github.com/googleapis/nodejs-storage/compare/v7.17.1...v7.17.2">7.17.2</a>
(2025-10-06)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Common Service: should retry a request failed (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2652">#2652</a>)
(<a
href="b38b5d221f">b38b5d2</a>)</li>
<li>Implement path containment to prevent traversal attacks (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2654">#2654</a>)
(<a
href="08d7abf32d">08d7abf</a>)</li>
</ul>
<h2>v7.17.1</h2>
<h2><a
href="https://github.com/googleapis/nodejs-storage/compare/v7.17.0...v7.17.1">7.17.1</a>
(2025-08-27)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Respect useAuthWithCustomEndpoint flag for resumable uploads (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2637">#2637</a>)
(<a
href="707b4f2fe1">707b4f2</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/nodejs-storage/blob/main/CHANGELOG.md"><code>@​google-cloud/storage</code>'s
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/googleapis/nodejs-storage/compare/v7.18.0...v7.19.0">7.19.0</a>
(2026-02-05)</h2>
<h3>Features</h3>
<ul>
<li>Enable full object checksum validation on JSON path (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2687">#2687</a>)
(<a
href="08a896240e">08a8962</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>deps:</strong> Update dependency fast-xml-parser to v5
[security] (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2713">#2713</a>)
(<a
href="420935a033">420935a</a>)</li>
</ul>
<h2><a
href="https://github.com/googleapis/nodejs-storage/compare/v7.17.3...v7.18.0">7.18.0</a>
(2025-11-28)</h2>
<h3>Features</h3>
<ul>
<li><strong>listBuckets:</strong> Add support for returning partial
success (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2678">#2678</a>)
(<a
href="c7004daae0">c7004da</a>)</li>
</ul>
<h2><a
href="https://github.com/googleapis/nodejs-storage/compare/v7.17.2...v7.17.3">7.17.3</a>
(2025-11-03)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>🐛 fix the issue 2667, do not mutate object given to options …
(<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2668">#2668</a>)
(<a
href="8a9f25968a">8a9f259</a>)</li>
<li>Revert implement path containment to prevent traversal attacks (<a
href="254b6b2f9e">254b6b2</a>)</li>
</ul>
<h2><a
href="https://github.com/googleapis/nodejs-storage/compare/v7.17.1...v7.17.2">7.17.2</a>
(2025-10-06)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Common Service: should retry a request failed (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2652">#2652</a>)
(<a
href="b38b5d221f">b38b5d2</a>)</li>
<li>Implement path containment to prevent traversal attacks (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2654">#2654</a>)
(<a
href="08d7abf32d">08d7abf</a>)</li>
</ul>
<h2><a
href="https://github.com/googleapis/nodejs-storage/compare/v7.17.0...v7.17.1">7.17.1</a>
(2025-08-27)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Respect useAuthWithCustomEndpoint flag for resumable uploads (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2637">#2637</a>)
(<a
href="707b4f2fe1">707b4f2</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="95a2af4cc8"><code>95a2af4</code></a>
chore(main): release 7.19.0 (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2694">#2694</a>)</li>
<li><a
href="420935a033"><code>420935a</code></a>
fix(deps): update dependency fast-xml-parser to v5 [security] (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2713">#2713</a>)</li>
<li><a
href="4e3c328ccf"><code>4e3c328</code></a>
test: skip system tests requiring public access (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2717">#2717</a>)</li>
<li><a
href="30522654c5"><code>3052265</code></a>
chore: fix lint failures (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2685">#2685</a>)</li>
<li><a
href="08a896240e"><code>08a8962</code></a>
feat: Enable full object checksum validation on JSON path (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2687">#2687</a>)</li>
<li><a
href="3dcda1b715"><code>3dcda1b</code></a>
chore: lint failures (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2681">#2681</a>)</li>
<li><a
href="3e5210f133"><code>3e5210f</code></a>
chore(main): release 7.18.0 (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2684">#2684</a>)</li>
<li><a
href="c7004daae0"><code>c7004da</code></a>
feat(listBuckets): Add support for returning partial success (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2678">#2678</a>)</li>
<li><a
href="633a13a161"><code>633a13a</code></a>
chore(python): remove configure_previous_major_version_branches (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2675">#2675</a>)</li>
<li><a
href="bae7040760"><code>bae7040</code></a>
samples: Add Soft Delete policy and object management samples (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2676">#2676</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/googleapis/nodejs-storage/compare/v7.17.0...v7.19.0">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-17 16:47:02 -07:00
Mend Renovate
13fb0df042 chore(deps): update pip (#2280)
> ℹ️ **Note**
> 
> This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [google-adk](https://redirect.github.com/google/adk-python)
([changelog](https://redirect.github.com/google/adk-python/blob/main/CHANGELOG.md))
| `==1.23.0` → `==1.27.2` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/google-adk/1.27.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/google-adk/1.23.0/1.27.2?slim=true)
|
| [google-genai](https://redirect.github.com/googleapis/python-genai) |
`==1.62.0` → `==1.67.0` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/google-genai/1.67.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/google-genai/1.62.0/1.67.0?slim=true)
|
| [google-genai](https://redirect.github.com/googleapis/python-genai) |
`==1.57.0` → `==1.67.0` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/google-genai/1.67.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/google-genai/1.57.0/1.67.0?slim=true)
|
| [langchain](https://redirect.github.com/langchain-ai/langchain)
([changelog](https://redirect.github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain%3D%3D1%22))
| `==1.2.6` → `==1.2.12` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/langchain/1.2.12?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/langchain/1.2.6/1.2.12?slim=true)
|
| [langchain](https://redirect.github.com/langchain-ai/langchain)
([changelog](https://redirect.github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain%3D%3D1%22))
| `==1.2.2` → `==1.2.12` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/langchain/1.2.12?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/langchain/1.2.2/1.2.12?slim=true)
|
|
[langchain-google-vertexai](https://redirect.github.com/langchain-ai/langchain-google)
([source](https://redirect.github.com/langchain-ai/langchain-google/tree/HEAD/libs/vertexai),
[changelog](https://redirect.github.com/langchain-ai/langchain-google/releases?q=%22vertexai%22))
| `==3.2.1` → `==3.2.2` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/langchain-google-vertexai/3.2.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/langchain-google-vertexai/3.2.1/3.2.2?slim=true)
|
| [langgraph](https://redirect.github.com/langchain-ai/langgraph)
([source](https://redirect.github.com/langchain-ai/langgraph/tree/HEAD/libs/langgraph),
[changelog](https://redirect.github.com/langchain-ai/langgraph/releases))
| `==1.0.10` → `==1.1.2` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/langgraph/1.1.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/langgraph/1.0.10/1.1.2?slim=true)
|
| [llama-index](https://redirect.github.com/run-llama/llama_index) |
`==0.14.12` → `==0.14.18` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/llama-index/0.14.18?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/llama-index/0.14.12/0.14.18?slim=true)
|
| llama-index-llms-google-genai | `==0.8.3` → `==0.8.7` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/llama-index-llms-google-genai/0.8.7?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/llama-index-llms-google-genai/0.8.3/0.8.7?slim=true)
|
|
[toolbox-adk](https://redirect.github.com/googleapis/mcp-toolbox-sdk-python)
([changelog](https://redirect.github.com/googleapis/mcp-toolbox-sdk-python/blob/main/packages/toolbox-adk/CHANGELOG.md))
| `==0.5.8` → `==0.7.0` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/toolbox-adk/0.7.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/toolbox-adk/0.5.8/0.7.0?slim=true)
|
|
[toolbox-core](https://redirect.github.com/googleapis/mcp-toolbox-sdk-python)
([changelog](https://redirect.github.com/googleapis/mcp-toolbox-sdk-python/blob/main/packages/toolbox-core/CHANGELOG.md))
| `==0.5.4` → `==0.6.0` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/toolbox-core/0.6.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/toolbox-core/0.5.4/0.6.0?slim=true)
|
|
[toolbox-langchain](https://redirect.github.com/googleapis/mcp-toolbox-sdk-python)
([changelog](https://redirect.github.com/googleapis/mcp-toolbox-sdk-python/blob/main/packages/toolbox-langchain/CHANGELOG.md))
| `==0.5.8` → `==0.6.0` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/toolbox-langchain/0.6.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/toolbox-langchain/0.5.8/0.6.0?slim=true)
|
|
[toolbox-langchain](https://redirect.github.com/googleapis/mcp-toolbox-sdk-python)
([changelog](https://redirect.github.com/googleapis/mcp-toolbox-sdk-python/blob/main/packages/toolbox-langchain/CHANGELOG.md))
| `==0.5.4` → `==0.6.0` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/toolbox-langchain/0.6.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/toolbox-langchain/0.5.4/0.6.0?slim=true)
|
|
[toolbox-llamaindex](https://redirect.github.com/googleapis/mcp-toolbox-sdk-python)
([changelog](https://redirect.github.com/googleapis/mcp-toolbox-sdk-python/blob/main/packages/toolbox-llamaindex/CHANGELOG.md))
| `==0.5.4` → `==0.6.0` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/toolbox-llamaindex/0.6.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/toolbox-llamaindex/0.5.4/0.6.0?slim=true)
|

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/363) for more information.

---

### Release Notes

<details>
<summary>google/adk-python (google-adk)</summary>

###
[`v1.27.2`](https://redirect.github.com/google/adk-python/releases/tag/v1.27.2)

[Compare
Source](https://redirect.github.com/google/adk-python/compare/v1.27.1...v1.27.2)

##### Bug Fixes

- Use valid dataplex OAuth scope for BigQueryToolset
([4010716](4010716470))
- Store and retrieve usage\_metadata in Vertex AI custom\_metadata
([b318eee](b318eee979))

###
[`v1.27.1`](https://redirect.github.com/google/adk-python/blob/HEAD/CHANGELOG.md#1271-2026-03-13)

[Compare
Source](https://redirect.github.com/google/adk-python/compare/v1.27.0...v1.27.1)

##### Bug Fixes

- Rolling back change to fix issue affecting LlmAgent creation due to
missing version field
([0e18f81](0e18f81a5c))

###
[`v1.27.0`](https://redirect.github.com/google/adk-python/blob/HEAD/CHANGELOG.md#1270-2026-03-12)

[Compare
Source](https://redirect.github.com/google/adk-python/compare/v1.26.0...v1.27.0)

##### Features

- **\[Core]**
- Introduce A2A request interceptors in RemoteA2aAgent
([6f772d2](6f772d2b08))
- Add UiWidget to EventActions for supporting new experimental UI
Widgets feature
([530ff06](530ff06ece))
- **auth:** Add pluggable support for auth integrations using
AuthProviderRegistry within CredentialManager
([d004074](d004074c90))
- Support all `types.SchemaUnion` as output\_schema in LLM Agent
([63f450e](63f450e023))
- durable runtime support
([07fdd23](07fdd23c9c))
- **runners:** pass GetSessionConfig through Runner to session service
([eff724a](eff724ac9a))

- **\[Models]**
- Add support for PDF documents in Anthropic LLM
([4c8ba74](4c8ba74fcb))
- Add streaming support for Anthropic models
([5770cd3](5770cd3776)),
closes
[#&#8203;3250](https://redirect.github.com/google/adk-python/issues/3250)
- Enable output schema with tools for LiteLlm models
([89df5fc](89df5fcf88)),
closes
[#&#8203;3969](https://redirect.github.com/google/adk-python/issues/3969)
- Preserve thought\_signature in LiteLLM tool calls
([ae565be](ae565be30e)),
closes
[#&#8203;4650](https://redirect.github.com/google/adk-python/issues/4650)

- **\[Web]**
- Updated human in the loop: developers now can respond to long running
functions directly in chat
  - Render artifacts when resuming
  - Fix some light mode styles
- Fix token level streaming not working properly
([22799c0](22799c0833))

- **\[Observability]**
- **telemetry:** add new gen\_ai.agent.version span attribute
([ffe97ec](ffe97ec5ad))
- **otel:** add `gen_ai.tool.definitions` to experimental semconv
([4dd4d5e](4dd4d5ecb6))
- **otel:** add experimental semantic convention and emit
`gen_ai.client.inference.operation.details` event
([19718e9](19718e9c17))
- add missing token usage span attributes during model usage
([77bf325](77bf325d2b))
- capture tool execution error code in OpenTelemetry spans
([e0a6c6d](e0a6c6db6f))

- **\[Tools]**
- Warn when accessing DEFAULT\_SKILL\_SYSTEM\_INSTRUCTION
([35366f4](35366f4e2a))
- add preserve\_property\_names option to OpenAPIToolset
([078b516](078b5163ff))
- Add gcs filesystem support for Skills. It supports skills in text and
pdf format, also has some sample agents
([6edcb97](6edcb97582))
- Add list\_skills\_in\_dir to skills utils
([327b3af](327b3affd2))
- Add support for MCP App UI widgets in MCPTool
([86db35c](86db35c338))
- add Dataplex Catalog search tool to BigQuery ADK
([82c2eef](82c2eefb27))
- Add RunSkillScriptTool to SkillToolset
([636f68f](636f68fbee))
- Add support for ADK tools in SkillToolset
([44a5e6b](44a5e6bdb8))
- limit number of user-provided BigQuery job labels and reserve internal
prefixes
([8c4ff74](8c4ff74e7d))
- Add param support to Bigtable execute\_sql
([5702a4b](5702a4b1f5))
- **bigtable:** add Bigtable cluster metadata tools
([34c560e](34c560e66e))
- execute-type param addition in GkeCodeExecutor
([9c45166](9c45166281))
- **skill:** Add BashTool
([8a31612](8a3161202e))
- Add support for toolsets to additional\_tools field of SkillToolset
([066fcec](066fcec3e8))

- **\[Optimization]**
- Add `adk optimize` command
([b18d7a1](b18d7a140f))
- Add interface between optimization infra and LocalEvalService
([7b7ddda](7b7ddda46c))
- Add GEPA root agent prompt optimizer
([4e3e2cb](4e3e2cb588))

- **\[Integrations]**
- Enhance BigQuery plugin schema upgrades and error reporting
([bcf38fa](bcf38fa2ba))
- Enhance BQ plugin with fork safety, auto views, and trace continuity
([80c5a24](80c5a24555))
- Handle Conflict Errors in BigQuery Agent Analytics Plugin
([372c76b](372c76b857))
- Added tracking headers for ADK CLI command to Agent Engine
([3117446](3117446293))

- **\[A2A]**
- New implementation of A2aAgentExecutor and A2A-ADK conversion
([87ffc55](87ffc55640))
- New implementation of RemoteA2aAgent and A2A-ADK conversion
([6770e41](6770e419f5))

##### Bug Fixes

- Allow artifact services to accept dictionary representations of
types.Part
([b004da5](b004da5027)),
closes
[#&#8203;2886](https://redirect.github.com/google/adk-python/issues/2886)
- Decode image data from ComputerUse tool response into image blobs
([d7cfd8f](d7cfd8fe4d))
- Expand LiteLLM reasoning extraction to include 'reasoning' field
([9468487](94684874e4)),
closes
[#&#8203;3694](https://redirect.github.com/google/adk-python/issues/3694)
- Filter non-agent directories from list\_agents()
([3b5937f](3b5937f022))
- Fix Type Error by initializing user\_content as a Content object
([2addf6b](2addf6b9da))
- Handle length finish reason in LiteLLM responses
([4c6096b](4c6096baa1)),
closes
[#&#8203;4482](https://redirect.github.com/google/adk-python/issues/4482)
- In SaveFilesAsArtifactsPlugin, write the artifact delta to state then
event actions so that the plugin works with ADK Web UI's artifacts panel
([d6f31be](d6f31be554))
- Make invocation\_context optional in convert\_event\_to\_a2a\_message
([8e79a12](8e79a12d6b))
- Optimize row-level locking in append\_event
([d61846f](d61846f6c6)),
closes
[#&#8203;4655](https://redirect.github.com/google/adk-python/issues/4655)
- Preserve thought\_signature in FunctionCall conversions between GenAI
and A2A
([f9c104f](f9c104faf7))
- Prevent splitting of SSE events with artifactDelta for function resume
requests
([6a929af](6a929af718)),
closes
[#&#8203;4487](https://redirect.github.com/google/adk-python/issues/4487)
- Propagate file names during A2A to/from Genai Part conversion
([f324fa2](f324fa2d62))
- Propagate thought from A2A TextPart metadata to GenAI Part
([e59929e](e59929e11a))
- Re-export DEFAULT\_SKILL\_SYSTEM\_INSTRUCTION to skills and
skill/prompt.py to avoid breaking current users
([de4dee8](de4dee899c))
- Refactor type string update in Anthropic tool param conversion
([ab4b736](ab4b736807))
- **simulation:** handle NoneType generated\_content
([9d15517](9d155177b9))
- Store and retrieve EventCompaction via custom\_metadata in Vertex
AISessionService
([2e434ca](2e434ca7be)),
closes
[#&#8203;3465](https://redirect.github.com/google/adk-python/issues/3465)
- Support before\_tool\_callback and after\_tool\_callback in Live mode
([c36a708](c36a708058)),
closes
[#&#8203;4704](https://redirect.github.com/google/adk-python/issues/4704)
- temp-scoped state now visible to subsequent agents in same invocation
([2780ae2](2780ae2892))
- **tools:** Handle JSON Schema boolean schemas in Gemini schema
conversion
([3256a67](3256a679da))
- typo in A2A EXPERIMENTAL warning
([eb55eb7](eb55eb7e7f))
- Update agent\_engine\_sandbox\_code\_executor in ADK
([dff4c44](dff4c44040))
- update Bigtable query tools to async functions
([72f3e7e](72f3e7e1e0))
- Update expected UsageMetadataChunk in LiteLLM tests
([dd0851a](dd0851ac74)),
closes
[#&#8203;4680](https://redirect.github.com/google/adk-python/issues/4680)
- update toolbox server and SDK package versions
([2e370ea](2e370ea688))
- Validate session before streaming instead of eagerly advancing the
runner generator
([ebbc114](ebbc114786))

##### Code Refactoring

- extract reusable functions from hitl and auth preprocessor
([c59afc2](c59afc21cb))
- Rename base classes and TypeVars in optimization data types
([9154ef5](9154ef59d2))

###
[`v1.26.0`](https://redirect.github.com/google/adk-python/blob/HEAD/CHANGELOG.md#1260-2026-02-26)

[Compare
Source](https://redirect.github.com/google/adk-python/compare/v1.25.1...v1.26.0)

##### Features

- **\[Core]**
- Add intra-invocation compaction and token compaction pre-request
([485fcb8](485fcb84e3))
- Use `--memory_service_uri` in ADK CLI run command
([a7b5097](a7b509763c))

- **\[Models]**
- Add `/chat/completions` integration to `ApigeeLlm`
([9c4c445](9c4c445369))
- Add `/chat/completions` streaming support to Apigee LLM
([121d277](121d277416))
- Expand LiteLlm supported models and add registry tests
([d5332f4](d5332f4434))

- **\[Tools]**
- Add `load_skill_from_dir()` method
([9f7d5b3](9f7d5b3f14))
- Agent Skills spec compliance — validation, aliases, scripts, and
auto-injection
([223d9a7](223d9a7ff5))
- BigQuery ADK support for search catalog tool
([bef3f11](bef3f117b4))
- Make skill instruction optimizable and can adapt to user tasks
([21be6ad](21be6adcb8))
- Pass trace context in MCP tool call's `_meta` field with OpenTelemetry
propagator
([bcbfeba](bcbfeba953))

- **\[Evals]**
- Introduce User Personas to the ADK evaluation framework
([6a808c6](6a808c60b3))

- **\[Services]**
- Add generate/create modes for Vertex AI Memory Bank writes
([811e50a](811e50a0cb))
- Add support for memory consolidation via Vertex AI Memory Bank
([4a88804](4a88804ec7))

- **\[A2A]**
- Add interceptor framework to `A2aAgentExecutor`
([87fcd77](87fcd77caa))

- **\[Auth]**
- Add native support for `id_token` in OAuth2 credentials
([33f7d11](33f7d118b3))
- Support ID token exchange in `ServiceAccountCredentialExchanger`
([7be90db](7be90db24b)),
closes
[#&#8203;4458](https://redirect.github.com/google/adk-python/issues/4458)

- **\[Integrations]**
- Agent Registry in ADK
([abaa929](abaa92944c))
- Add schema auto-upgrade, tool provenance, HITL tracing, and span
hierarchy fix to BigQuery Agent Analytics plugin
([4260ef0](4260ef0c7c))
- Change default BigQuery table ID and update docstring
([7557a92](7557a92939))
- Update Agent Registry to create AgentCard from info in get agents
endpoint
([c33d614](c33d614004))

- **\[Web]**
- Enable dependency injection for agent loader in FastAPI app gen
([34da2d5](34da2d5b26))

##### Bug Fixes

- Add OpenAI strict JSON schema enforcement in LiteLLM
([2dbd1f2](2dbd1f25bd)),
closes
[#&#8203;4573](https://redirect.github.com/google/adk-python/issues/4573)
- Add push notification config store to agent\_to\_a2a
([4ca904f](4ca904f111)),
closes
[#&#8203;4126](https://redirect.github.com/google/adk-python/issues/4126)
- Add support for injecting a custom google.genai.Client into Gemini
models
([48105b4](48105b49c5)),
closes
[#&#8203;2560](https://redirect.github.com/google/adk-python/issues/2560)
- Add support for injecting a custom google.genai.Client into Gemini
models
([c615757](c615757ba1)),
closes
[#&#8203;2560](https://redirect.github.com/google/adk-python/issues/2560)
- Check both `input_stream` parameter name and its annotation to decide
whether it's a streaming tool that accept input stream
([d56cb41](d56cb4142c))
- **deps:** Increase pydantic lower version to 2.7.0
([dbd6420](dbd64207ae))
- edit copybara and BUILD config for new adk/integrations folder (added
with Agent Registry)
([37d52b4](37d52b4caf))
- Expand add\_memory to accept MemoryEntry
([f27a9cf](f27a9cfb87))
- Fix pickling lock errors in McpSessionManager
([4e2d615](4e2d6159ae))
- fix typo in PlanReActPlanner instruction
([6d53d80](6d53d800d5))
- handle UnicodeDecodeError when loading skills in ADK
([3fbc27f](3fbc27fa4d))
- Improve BigQuery Agent Analytics plugin reliability and code quality
([ea03487](ea034877ec))
- Include list of skills in every message and remove list\_skills tool
from system instruction
([4285f85](4285f852d5))
- Invoke on\_tool\_error\_callback for missing tools in live mode
([e6b601a](e6b601a2ab))
- Keep query params embedded in OpenAPI paths when using httpx
([ffbcc0a](ffbcc0a626)),
closes
[#&#8203;4555](https://redirect.github.com/google/adk-python/issues/4555)
- Only relay the LiveRequest after tools is invoked
([b53bc55](b53bc555cc))
- Parallelize tool resolution in LlmAgent.canonical\_tools()
([7478bda](7478bdaa98))
- race condition in table creation for `DatabaseSessionService`
([fbe9ecc](fbe9eccd05))
- Re-export DEFAULT\_SKILL\_SYSTEM\_INSTRUCTION to skills and
skill/prompt.py to avoid breaking current users
([40ec134](40ec1343c2))
- Refactor LiteLLM streaming response parsing for compatibility with
LiteLLM 1.81+
([e8019b1](e8019b1b1b)),
closes
[#&#8203;4225](https://redirect.github.com/google/adk-python/issues/4225)
- remove duplicate session GET when using API server, unbreak
auto\_session\_create when using API server
([445dc18](445dc189e9))
- Remove experimental decorators from user persona data models
([eccdf6d](eccdf6d01e))
- Replace the global DEFAULT\_USER\_PERSONA\_REGISTRY with a function
call to get\_default\_persona\_registry
([2703613](2703613572))
- **skill:** coloate default skill SI with skilltoolset
([fc1f1db](fc1f1db005))
- Update agent\_engine\_sandbox\_code\_executor in ADK
([ee8d956](ee8d956413))
- Update agent\_engine\_sandbox\_code\_executor in ADK
([dab80e4](dab80e4a8f))
- Update sample skills agent to use weather-skill instead of
weather\_skill
([8f54281](8f5428150d))
- update Spanner query tools to async functions
([1dbcecc](1dbceccf36))
- use correct msg\_out/msg\_err keys for Agent Engine sandbox output
([b1e33a9](b1e33a90b4))
- Validate session before streaming instead of eagerly advancing the
runner generator
([ab32f33](ab32f33e74))
- **web:** allow session resume without new message
([30b2ed3](30b2ed3ef8))

##### Code Refactoring

- Extract reusable function for building agent transfer instructions
([e1e0d63](e1e0d63616))
- Extract reusable private methods
([976a238](976a238544))
- Extract reusable private methods
([42eeaef](42eeaef2b3))
- Extract reusable private methods
([706f9fe](706f9fe74d))

##### Documentation

- add `thinking_config` in `generate_content_config` in example agent
([c6b1c74](c6b1c74321))

###
[`v1.25.1`](https://redirect.github.com/google/adk-python/blob/HEAD/CHANGELOG.md#1251-2026-02-18)

[Compare
Source](https://redirect.github.com/google/adk-python/compare/v1.25.0...v1.25.1)

##### Bug Fixes

- Fix pickling lock errors in McpSessionManager
([4e2d615](4e2d6159ae))

###
[`v1.25.0`](https://redirect.github.com/google/adk-python/blob/HEAD/CHANGELOG.md#1250-2026-02-11)

[Compare
Source](https://redirect.github.com/google/adk-python/compare/v1.24.1...v1.25.0)

##### Features

- **\[Core]**
- Add a demo for the simple prompt optimizer for the optimization
interface
([0abf4cd](0abf4cd2c7))
- Add `--auto_create_session` flag to `adk api_server` CLI
([40c15d0](40c15d0595))
- Add `add_events_to_memory` facade for event-delta
([59e8897](59e88972ae))
- Add post-invocation token-threshold compaction with event retention
([a88e864](a88e864755))
- Add report generation to `adk conformance test` command
([43c437e](43c437e38b))

- **\[Models]**
- Add base\_url option to Gemini LLM class
([781f605](781f605a1e))

- **\[Tools]**
- Enhance google credentials config to support externally passed access
token
([3cf43e3](3cf43e3842))
- Update agent simulator by improving prompts and add environment data
([7af1858](7af1858f46))
- Add a load MCP resource tool
([e25227d](e25227da5e))
- Add SkillToolset to adk
([8d02792](8d0279251c))

- **\[Web]**
- Add `/health` and `/version` endpoints to ADK web server
([25ec2c6](25ec2c6b61))

##### Bug Fixes

- Use async iteration for VertexAiSessionService.list\_sessions
pagination
([758d337](758d337c76))
- Fix event loop closed bug in McpSessionManager
([4aa4751](4aa475145f))
- Preserve thought\_signature in function call conversions for
interactions API integration
([2010569](2010569010))
- Propagate grounding and citation metadata in streaming responses
([e6da417](e6da417292))
- Add endpoints to get/list artifact version metadata
([e0b9712](e0b9712a49))
- Support escaped curly braces in instruction templates
([7c7d25a](7c7d25a4a6))
- Strip timezone for PostgreSQL timestamps in DatabaseSessionService
([19b6076](19b607684f))
- Prompt token may be None in streaming mode
([32ee07d](32ee07df01))
- Pass invocation\_id from `/run` endpoint to `Runner.run_async`
([d2dba27](d2dba27134))
- Conditionally preserve function call IDs in LLM requests
([663cb75](663cb75b32))
- Migrate VertexAiMemoryBankService to use the async Vertex AI client
([64a44c2](64a44c2897))
- Handle list values in Gemini schema sanitization
([fd8a9e3](fd8a9e3962))
- Used logger to log instead of print in MCP
([6bc70a6](6bc70a6bab))

##### Improvements

- Replace check of instance for LlmAgent with hasAttribute check
([7110336](7110336788))
- Log exception details before re-raising in MCP session execution
([de79bf1](de79bf12b5))

###
[`v1.24.1`](https://redirect.github.com/google/adk-python/blob/HEAD/CHANGELOG.md#1241-2026-02-06)

[Compare
Source](https://redirect.github.com/google/adk-python/compare/v1.24.0...v1.24.1)

##### Bug Fixes

- Add back deprecated eval endpoint for web until we
migrate([ae993e8](ae993e884f))
- Update eval dialog colors, and fix a2ui component types
([3686a3a](3686a3a98f))

###
[`v1.24.0`](https://redirect.github.com/google/adk-python/blob/HEAD/CHANGELOG.md#1240-2026-02-04)

[Compare
Source](https://redirect.github.com/google/adk-python/compare/v1.23.0...v1.24.0)

##### ⚠ BREAKING CHANGES

- Breaking: Make credential manager accept `tool_context` instead of
`callback_context`
([fe82f3c](fe82f3cde8))

##### Highlights

- **\[Web]**
- **Consolidated Event View**: Replaced the Event tab with a more
intuitive "click-to-expand" interaction on message rows, enabling faster
debugging within the chat context
- **Enhanced Accessibility**: Added full support for arrow-key
navigation for a more seamless, keyboard-centric experience
- **Rich Developer Tooling**: Introduced detailed tooltips for function
calls, providing instant visibility into arguments, responses, and state
changes
- **A2UI Integration**: Integrated the **A2UI v0.8** standard catalog to
automatically render spec-compliant ADK parts as native UI components
directly in the chat

##### Features

- **\[Core]**
- Allow passthrough of `GOOGLE_CLOUD_LOCATION` for Agent Engine
deployments
([004e15c](004e15ccb7))
- Add interface for agent optimizers
([4ee125a](4ee125a038))
- Pass event ID as metadata when converted into a message
([85434e2](85434e293f))
- Restructure the bug report template as per the intake process
([324796b](324796b4fe))

- **\[Models]**
- Mark Vertex calls made from non-Gemini models
([7d58e0d](7d58e0d2f3))

- **\[Evals]**
- Allow Vertex AI Client initialization with API Key
([43d6075](43d6075ea7))
- Remove overall evaluation status calculation from
`_CustomMetricEvaluator` and add threshold to custom metric function
expected signature
([553e376](553e376718))

- **\[Tools]**
- Make OpenAPI tool asynchronous
([9290b96](9290b96626))
- Implement toolset authentication for `McpToolset`, `OpenAPIToolset`,
and other toolsets
([798f65d](798f65df86))
- Add framework support for toolset authentication before `get_tools`
calls
([ee873ca](ee873cae2e))
- Support dynamic configuration for `VertexAiSearchTool`
([585ebfd](585ebfdac7))
- Add `get_auth_config` method to toolset to expose authentication
requirements
([381d44c](381d44cab4))
- Add methods in `McpToolset` for users to access MCP resources
([8f7d965](8f7d9659cf))
- Improve error message when failing to get tools from MCP
([3480b3b](3480b3b82d))

- **\[Services]**
- Improve `asyncio` loop handling and test cleanup
([00aba2d](00aba2d884))

- **\[Live]**
- Support running tools in separate threads for live mode
([714c3ad](714c3ad047))

- **\[Observability]**
- Add extra attributes to spans generated with
`opentelemetry-instrumentation-google-genai`
([e87a843](e87a8437fb))

##### Bug Fixes

- Ignore `session_db_kwargs` for SQLite session services
([ce07cd8](ce07cd8144))
- Resolve `MutualTLSChannelError` by adding `pyopenssl` dependency
([125bc85](125bc85ac5))
- Add `update_timestamp_tz` property to `StorageSession`
([666cebe](666cebe369))
- Do not treat Function Calls and Function Responses as invisible when
marked as thoughts
([853a3b0](853a3b0e14))
- Add pre-deployment validation for agent module imports (credit to
[@&#8203;ppgranger](https://redirect.github.com/ppgranger),
[2ac468e](2ac468ea7e))
- Fix cases where `execution_result_delimiters` have `None` type element
([a16e3cc](a16e3cc67e))
- Disable `save_input_blobs_as_artifacts` deprecation warning message
for users not setting it
([c34615e](c34615ecf3))
- Fix agent config path handling in generated deployment script
([8012339](801233902b))
- Add `pypika>=0.50.0` to `project.toml` to support `crewai` on Python
3.12+
([e8f7aa3](e8f7aa3140))
- Update OpenTelemetry dependency versions to relax version constraints
for `opentelemetry-api` and `opentelemetry-sdk`
([706a6dd](706a6dda81))
- Enable `pool_pre_ping` by default for non-SQLite database engines
([da73e71](da73e718ef))
- Ensure database sessions are always rolled back on errors
([63a8eba](63a8eba53f))
- Reload stale session in `DatabaseSessionService` when storage update
time is later than the in-memory session object
([1063fa5](1063fa532c))
- Make credential key generation stable and prevent cross-user
credential leaks
([33012e6](33012e6dda))
- Change MCP `read_resource` to return original contents
([ecce7e5](ecce7e54a6))
- Recognize function responses as non-empty parts in LiteLLM
([d0102ec](d0102ecea3))
- Handle HTTP/HTTPS URLs for media files in LiteLLM content conversion
([47221cd](47221cd5c1))
- Fix Pydantic schema generation error for `ClientSession`
([131fbd3](131fbd3948))
- Fix Click’s Wrapping in `adk eval` help message
([3bcd8f7](3bcd8f7f7a))
- Stream errors as simple JSON objects in ADK web server SSE endpoint
([798d005](798d0053c8))
- Remove print debugging artifact
([0d38a36](0d38a3683f))

##### Improvements

- Check `will_continue` for streaming function calls
([2220d88](2220d885cd))
- Update ADK web, rework events, and add A2UI capabilities
([37e6507](37e6507ce4))
- Improve error handling for LiteLLM import in `gemma_llm.py`
([574ec43](574ec43a17))
- Replace proxy methods with utils implementation
([6ff10b2](6ff10b23be),
[f82ceb0](f82ceb0ce7))
- Replace print statements with logging in ADK evaluation components
([dd8cd27](dd8cd27b2c))
- Add sample agent that requires OAuth flow during MCP tool listing, and
convert `MCPToolset` to `McpToolset` in unit tests
([2770012](2770012cec),
[4341839](4341839420))
- Ensure `BigQueryAgentAnalyticsPlugin` is shut down after each test
([c0c98d9](c0c98d94b3))
- Add ADK logger in `RestApiTool`
([288c2c4](288c2c448d))
- Add GitHub Action check to run `mypy`
([32f9f92](32f9f92042))
- Add `unittests.sh` script and update `CONTRIBUTING.md`
([025b42c](025b42c836))
- Extract helper function for LLM request building and response
processing
([753084f](753084fd46))

</details>

<details>
<summary>googleapis/python-genai (google-genai)</summary>

###
[`v1.67.0`](https://redirect.github.com/googleapis/python-genai/blob/HEAD/CHANGELOG.md#1670-2026-03-12)

[Compare
Source](https://redirect.github.com/googleapis/python-genai/compare/v1.66.0...v1.67.0)

##### Features

- Add inference\_generation\_config to EvaluationConfig for Tuning
([1fdb4b8](1fdb4b87aa))
- Add live history\_config with initial\_history\_in\_client\_content
([a80babd](a80babd22d))
- Add support for referencing registered metrics by resource name in
evaluation run API
([41b348e](41b348ed7a))
- Enable language code for audio transcription config in Live API for
Vertex AI
([c04be0d](c04be0db2b))

##### Bug Fixes

- Forward http\_options in async\_request\_streamed to enable retry
support
([8b3be87](8b3be87440))
- Forward http\_options in async\_request\_streamed to enable retry
support
([#&#8203;2097](https://redirect.github.com/googleapis/python-genai/issues/2097))
([8b10efb](8b10efb034))

###
[`v1.66.0`](https://redirect.github.com/googleapis/python-genai/blob/HEAD/CHANGELOG.md#1660-2026-03-03)

[Compare
Source](https://redirect.github.com/googleapis/python-genai/compare/v1.65.0...v1.66.0)

##### Features

- Add gemini-3.1-flash-image-preview model
([dd52cc2](dd52cc288b))
- Support signature for all Interaction tool types
([abb388e](abb388e905))
- Update data types from discovery doc.
([15666c0](15666c0634))

###
[`v1.65.0`](https://redirect.github.com/googleapis/python-genai/blob/HEAD/CHANGELOG.md#1650-2026-02-26)

[Compare
Source](https://redirect.github.com/googleapis/python-genai/compare/v1.64.0...v1.65.0)

##### Features

- Add gemini-3.1-pro-preview to list of models in Interactions
([fe86870](fe86870752))
- Add Image Grounding support to GoogleSearch tool
([0035182](0035182ec4))
- Enable server side MCP and disable all other AFC when server side MCP
is configured.
([4dd7b16](4dd7b165dc))
- Support more image sizes and resolutions
([8b2a4e0](8b2a4e0470))

##### Bug Fixes

- Change interactions media mime type to enum (breaking change for
experimental feature)
([e0f3378](e0f33786f7))
- Handle non-list response\_stream in HttpResponse.json property
([006042d](006042db83))
- Handle non-list response\_stream in HttpResponse.json property
([#&#8203;1903](https://redirect.github.com/googleapis/python-genai/issues/1903))
([61aec34](61aec3455e))
- Make aiohttp an optional dependency, bump aiohttp version upperbound,
and ensure HttpOptions.async\_client\_args propagates to custom
aiohttp.ClientSession request args for proxy etc.
([b28d144](b28d1445bb)),
closes
[#&#8203;2090](https://redirect.github.com/googleapis/python-genai/issues/2090)
[#&#8203;2051](https://redirect.github.com/googleapis/python-genai/issues/2051)
[#&#8203;1950](https://redirect.github.com/googleapis/python-genai/issues/1950)

##### Documentation

- Regenerate docs for 1.64.0
([a023141](a02314197d))
- Update README and codegen\_instructions for structured outputs
([4d5a978](4d5a978932))

###
[`v1.64.0`](https://redirect.github.com/googleapis/python-genai/blob/HEAD/CHANGELOG.md#1640-2026-02-18)

[Compare
Source](https://redirect.github.com/googleapis/python-genai/compare/v1.63.0...v1.64.0)

##### Features

- Add UnifiedMetric support to Vertex Tuning evaluation config
([9a9908a](9a9908a960))
- Support multimodal embedding for Gemini Embedding 2.0 and support MaaS
models in Models.embed\_content() (Vertex AI API)
([af40cc6](af40cc6297))

###
[`v1.63.0`](https://redirect.github.com/googleapis/python-genai/blob/HEAD/CHANGELOG.md#1630-2026-02-11)

[Compare
Source](https://redirect.github.com/googleapis/python-genai/compare/v1.62.0...v1.63.0)

##### Features

- Add INCOMPLETE status to Interaction.
([1a84605](1a84605bca))
- Support encryption\_spec in tuning job creation configuration for
GenAI SDK
([057d6f0](057d6f077b))

##### Bug Fixes

- Base\_url and global location parsing
([2c40555](2c40555c54))
- Remove build warning due to extra comma: assertion on a tuple is
always true
([1cc2c2d](1cc2c2d411))
- Remove debug print statement.
([60c0a2f](60c0a2ffb4))
- Remove unused import of `websockets`
([3b82b5f](3b82b5f382))

##### Documentation

- Add docstrings to C# and Python SDK Operations methods.
([f2e85a3](f2e85a3911))
- Regenerate docs for 1.62.0
([455ec26](455ec260be))

</details>

<details>
<summary>langchain-ai/langgraph (langgraph)</summary>

###
[`v1.1.2`](https://redirect.github.com/langchain-ai/langgraph/releases/tag/1.1.2):
langgraph&#x3D;&#x3D;1.1.2

[Compare
Source](https://redirect.github.com/langchain-ai/langgraph/compare/1.1.1...1.1.2)

Changes since 1.1.1

- release(langgraph): 1.1.2
([#&#8203;7135](https://redirect.github.com/langchain-ai/langgraph/issues/7135))
- fix: stream part generic order
([#&#8203;7134](https://redirect.github.com/langchain-ai/langgraph/issues/7134))
- feat: add context for remote graph api
([#&#8203;7132](https://redirect.github.com/langchain-ai/langgraph/issues/7132))
- chore: fix typo
([#&#8203;7131](https://redirect.github.com/langchain-ai/langgraph/issues/7131))
- chore(deps): bump tornado from 6.5.4 to 6.5.5 in /libs/langgraph
([#&#8203;7122](https://redirect.github.com/langchain-ai/langgraph/issues/7122))

###
[`v1.1.1`](https://redirect.github.com/langchain-ai/langgraph/releases/tag/1.1.1):
langgraph&#x3D;&#x3D;1.1.1

[Compare
Source](https://redirect.github.com/langchain-ai/langgraph/compare/1.1.0...1.1.1)

Changes since 1.1.0

- release(langgraph): 1.1.1
([#&#8203;7120](https://redirect.github.com/langchain-ai/langgraph/issues/7120))
- fix: replay bug, direct to subgraphs
([#&#8203;7115](https://redirect.github.com/langchain-ai/langgraph/issues/7115))
- chore: remove md notes
([#&#8203;7103](https://redirect.github.com/langchain-ai/langgraph/issues/7103))

###
[`v1.1.0`](https://redirect.github.com/langchain-ai/langgraph/releases/tag/1.1.0):
langgraph&#x3D;&#x3D;1.1.0

[Compare
Source](https://redirect.github.com/langchain-ai/langgraph/compare/1.0.10...1.1.0)

Changes since 1.0.10

- release(langgraph): 1.1
([#&#8203;7102](https://redirect.github.com/langchain-ai/langgraph/issues/7102))
- fix: replay behavior for parent + subgraphs!
([#&#8203;7038](https://redirect.github.com/langchain-ai/langgraph/issues/7038))
- feat: type safe stream/invoke w/ proper output type coercion
([#&#8203;6961](https://redirect.github.com/langchain-ai/langgraph/issues/6961))

#### Type-Safe Streaming & Invoke

LangGraph 1.1 introduces `version="v2"` — a new opt-in streaming format
that brings full type safety to `stream()`, `astream()`, `invoke()`, and
`ainvoke()`.

##### What's changing

**v1 (default, unchanged):** `stream()` yields bare tuples like
`(stream_mode, data)` or just `data`. `invoke()` returns a plain `dict`.
Interrupts are mixed into the output dict under `"__interrupt__"`.

**v2 (opt-in):** `stream()` yields strongly-typed `StreamPart` dicts
with `type`, `ns`, `data`, and (for values) `interrupts` fields.
`invoke()` returns a `GraphOutput` object with `.value` and
`.interrupts` attributes. When your state schema is a Pydantic model or
dataclass, outputs are automatically coerced to the correct type.

##### `invoke()` / `ainvoke()` with `version="v2"`

```python
from langgraph.types import GraphOutput

result = graph.invoke({"input": "hello"}, version="v2")

# result is a GraphOutput, not a dict
assert isinstance(result, GraphOutput)
result.value       # your output — dict, Pydantic model, or dataclass
result.interrupts  # tuple[Interrupt, ...], empty if none occurred
```

With a non-`"values"` stream mode, `invoke(..., stream_mode="updates",
version="v2")` returns `list[StreamPart]` instead of `list[tuple]`.

##### `stream()` / `astream()` with `version="v2"`

```python
for part in graph.stream({"input": "hello"}, version="v2"):
    if part["type"] == "values":
        part["data"]        # OutputT — full state
        part["interrupts"]  # tuple[Interrupt, ...]
    elif part["type"] == "updates":
        part["data"]        # dict[str, Any]
    elif part["type"] == "messages":
        part["data"]        # tuple[BaseMessage, dict]
    elif part["type"] == "custom":
        part

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://redirect.github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/googleapis/genai-toolbox).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi43NC41IiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
2026-03-17 23:17:31 +00:00
Dr. Strangelove
6829416b11 chore(looker): make looker integration tests less error prone (#2730)
## Description

make looker integration tests less error prone by adding a random 8 char
string to the names of objects created and deleted.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [x] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-17 22:31:17 +00:00
Yuan Teoh
1e2c7c7804 feat(cli): add serve subcommand (#2550)
The `serve` subcommand **starts a toolbox server** without any
primitives. It WILL NOT run with config file. In the future, users could
use `serve` with a backend storage.

To stop or shutdown the server, user can just terminate the port. The
terminate signal will shutdown the server.

This new addition **WILL NOT** be a breaking change to existing users.
Users can still run toolbox as is.

**CLI command:**
```
toolbox serve
```

**Flags associated with the serve subcommand:**
| flag | description | default value |
| --- | --- | --- |
| address | Address of the interface the server will listen on. |
127.0.0.1 |
| port | Port the server will listen on. | 5000 |
| stdio | Listens via MCP STDIO instead of acting as a remote HTTP
server. | false |
| ui | Launches the Toolbox UI web server. | false |
| allowed-origins | Specifies a list of origins permitted to access this
server. | `*` |
| allowed-hosts | Specifies a list of hosts permitted to access this
server. | `*` |


**This PR does the following:**
* Add a new `serve` subcommand. Including unit tests for the subcommand
* Rename the `cmd/internal/persistent_flags.go` to
`cmd/internal/flags.go`, and refactored some flag definitions into
dedicated functions. This change allows us to scope flags to specific
subcommands as needed, rather than forcing all subcommands to inherit
them globally via `PersistentFlags`.

---------

Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-03-17 21:46:45 +00:00
Niraj Nandre
1528d7c38d revert(ci): implement conditional sharding logic in integration tests (#2763)
Reverts googleapis/genai-toolbox#2692
2026-03-17 14:51:23 +00:00
Twisha Bansal
f3da6aa5e2 fix(skills): improve flag validation and silence unit test output (#2759)
## Description

This PR improves the error handling and validation for the
`skills-generate` command and cleans up the unit test execution logs.

## Key Changes:
- **Positional Arguments**: Implemented `Args: cobra.NoArgs` to strictly
reject any unexpected positional arguments.
- **Test Output Cleanup**: Updated the test helper in command_test.go to
capture and silence Cobra's usage and error messages during test runs,
preventing them from polluting the terminal output.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-03-17 13:44:12 +00:00
manuka rahul
03eb9607e6 ci: update link checker report labels (#2749)
Change the issue labels for high visibility and quick fixing of the
broken links

https://github.com/googleapis/genai-toolbox/issues/2669#issuecomment-4027529827
2026-03-17 17:11:41 +05:30
Niraj Nandre
8deb3d44f4 ci: implement conditional sharding logic in integration tests (#2692)
## Description

This PR implements test sharding within the integration suite to address
persistent flakiness, resource exhaustion, and long execution times. By
enabling selective test execution based on targeted triggers.

### Implementation

- **Conditional YAML Logic**: Updated .ci/integration.cloudbuild.yaml to
wrap each database-specific step in a conditional block that checks the`
_DB_SHARD` variable.
- **Backward Compatibility**: Maintained support for the original
integration-test-pr trigger by allowing steps to run if `_DB_SHARD` is
unset (empty), ensuring full-suite verification still works.

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-03-17 15:37:09 +05:30
DEEVEN SERU
b1333cd271 fix(oracle): normalize encoded proxy usernames in go-ora DSN (#2469)
## Summary
Fix Oracle go-ora DSN construction so proxy usernames with brackets
(`user[client]`) are handled correctly and pre-encoded usernames are not
double-encoded.

Fixes #2454.

## Root cause
`buildGoOraConnString` built DSNs using `url.URL{Host:
connectStringBase, User: url.UserPassword(...)}`.
For Oracle connect strings like `host:1521/SERVICE`, putting the full
value in `Host` is lossy for URL formatting and brittle for userinfo
handling.
Also, when a username is already percent-encoded (`user%5Bclient%5D`),
passing it directly to `url.UserPassword` can double-encode `%` without
normalization.

## Fix
- Normalize user/password with `url.PathUnescape` before URL userinfo
encoding.
- Construct DSN as:
  - encoded userinfo (`url.UserPassword(...).String()`)
- raw Oracle connect string appended after `@` (preserves
`host:port/service` shape)
- Preserve wallet query args behavior (`ssl=true&wallet=...`).

## Tests
Added regression coverage in
`internal/sources/oracle/oracle_connstring_test.go`:
- bracketed proxy username is encoded correctly.
- already percent-encoded proxy username is not double-encoded.
- existing wallet/non-wallet DSN cases remain correct.

## Validation
- `go test ./internal/sources/oracle -run
'TestBuildGoOraConnString|TestParseFromYamlOracle|TestFailParseFromYaml'`

---------

Co-authored-by: DEVELOPER-DEEVEN <144827577+DEVELOPER-DEEVEN@users.noreply.github.com>
Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2026-03-17 03:53:22 +00:00
Haoyu Wang
9590821bc7 fix(test): address flaky healthcare integration test run (#2742)
This PR introduces an auto-cleanup mechanism to address flakiness in the
Cloud Healthcare integration tests caused by accumulation of orphaned
resources (arising from abrupt CI terminations or local cancellations).

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-16 23:00:10 -04:00
Yuan Teoh
2fca7fcf27 ci(alloydb-ai-nl): temporarily disable auth tool test case (#2757) 2026-03-16 17:04:57 -07:00
Huan Chen
bfb988538c refactor(bigquery-conversational-analytics): simplify response proces… (#2607)
…sing and optimize tokens

## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #2687

---------

Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
Co-authored-by: Averi Kitsch <akitsch@google.com>
Co-authored-by: Yuan Teoh <yuanteoh@google.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-13 23:38:01 +00:00
release-please[bot]
39832a0faa chore(main): release 0.29.0 (#2608)
🤖 I have created a release *beep* *boop*
---


##
[0.29.0](https://github.com/googleapis/genai-toolbox/compare/v0.28.0...v0.29.0)
(2026-03-13)


### ⚠ BREAKING CHANGES

* **source/alloydb:** restructure prebuilt toolsets
([#2639](https://github.com/googleapis/genai-toolbox/issues/2639))
* **source/spanner:** restructure prebuilt toolsets
([#2641](https://github.com/googleapis/genai-toolbox/issues/2641))
* **source/dataplex:** restructure prebuilt toolsets
([#2640](https://github.com/googleapis/genai-toolbox/issues/2640))
* **source/oss-db:** restructure prebuilt toolsets
([#2638](https://github.com/googleapis/genai-toolbox/issues/2638))
* **source/cloudsql:** restructure prebuilt toolsets
([#2635](https://github.com/googleapis/genai-toolbox/issues/2635))
* **source/bigquery:** restructure prebuilt toolsets
([#2637](https://github.com/googleapis/genai-toolbox/issues/2637))
* **source/firestore:** restructure prebuilt toolsets
([#2636](https://github.com/googleapis/genai-toolbox/issues/2636))
* telemetry metrics updates as per semantic convention
([#2566](https://github.com/googleapis/genai-toolbox/issues/2566))

### Features

* Add user agent to embeddings generation
([#2572](https://github.com/googleapis/genai-toolbox/issues/2572))
([287251a](287251a0cf))
* **skill:** Attach user agent metadata for generated skill
([#2697](https://github.com/googleapis/genai-toolbox/issues/2697))
([9598a6a](9598a6a325))
* **skills:** Add additional-notes flag to generate skills command
([#2696](https://github.com/googleapis/genai-toolbox/issues/2696))
([73bf962](73bf962459))
* **skill:** Update skill generation logic
([#2646](https://github.com/googleapis/genai-toolbox/issues/2646))
([c233eee](c233eee98c))
* **source/alloydb:** Restructure prebuilt toolsets
([#2639](https://github.com/googleapis/genai-toolbox/issues/2639))
([5f3f063](5f3f063fc7))
* **source/bigquery:** Restructure prebuilt toolsets
([#2637](https://github.com/googleapis/genai-toolbox/issues/2637))
([dc984ba](dc984badd7))
* **sources/bigquery:** Support custom oauth header name
([#2564](https://github.com/googleapis/genai-toolbox/issues/2564))
([d3baf77](d3baf77d61))
* **source/cloudsql:** Restructure prebuilt toolsets
([#2635](https://github.com/googleapis/genai-toolbox/issues/2635))
([99613dc](99613dcc7a))
* **source/dataplex:** Restructure prebuilt toolsets
([#2640](https://github.com/googleapis/genai-toolbox/issues/2640))
([acb9a80](acb9a80cf2))
* **source/firestore:** Restructure prebuilt toolsets
([#2636](https://github.com/googleapis/genai-toolbox/issues/2636))
([22ab7b9](22ab7b9365))
* **source/oss-db:** Restructure prebuilt toolsets
([#2638](https://github.com/googleapis/genai-toolbox/issues/2638))
([5196c6a](5196c6a78e))
* **source/spanner:** Restructure prebuilt toolsets
([#2641](https://github.com/googleapis/genai-toolbox/issues/2641))
([ea2b698](ea2b698b03))
* Telemetry metrics updates as per semantic convention
([#2566](https://github.com/googleapis/genai-toolbox/issues/2566))
([131d764](131d764f89))
* **tools/mongodb:** Add tool annotations to MongoDB tools for improved
LLM understanding
([#2219](https://github.com/googleapis/genai-toolbox/issues/2219))
([b7a5f80](b7a5f80b42))
* **tools/serverless-spark:** Add get_session_template tool
([#2308](https://github.com/googleapis/genai-toolbox/issues/2308))
([a136e16](a136e169b3))
* **tools/serverless-spark:** Add list/get sessions tools
([#2576](https://github.com/googleapis/genai-toolbox/issues/2576))
([a554298](a554298535))


### Bug Fixes

* Improve list locks integration test for postgres
([#2279](https://github.com/googleapis/genai-toolbox/issues/2279))
([d9ebe5d](d9ebe5d4bf))
* **mcp:** Guard nil SSE session lookup and return 400 for missing
session
([#2681](https://github.com/googleapis/genai-toolbox/issues/2681))
([f66189f](f66189fe43))
* **oracle:** Update oracle-execute-sql tool interface to match source
signature
([#2627](https://github.com/googleapis/genai-toolbox/issues/2627))
([81699a3](81699a375b))
* Return AllParams for GetParameter() for tools with
templateParameter([#2734](https://github.com/googleapis/genai-toolbox/issues/2734))
([bfd7ba6](bfd7ba601a))
* **server/mcp:** Scope defer span.End inside loop iteration
([#2558](https://github.com/googleapis/genai-toolbox/issues/2558))
([c88a62d](c88a62dcf4)),
closes [#2549](https://github.com/googleapis/genai-toolbox/issues/2549)
* **skill:** Fix env variable propagation
([#2645](https://github.com/googleapis/genai-toolbox/issues/2645))
([5271368](5271368720))
* **sources/looker:** Looker and looker-dev prebuilt tools should share
one source definition.
([#2620](https://github.com/googleapis/genai-toolbox/issues/2620))
([df7f2fd](df7f2fd7d5))
* **telemetry:** Histogram buckets from OTel standard to MCP standards
([#2729](https://github.com/googleapis/genai-toolbox/issues/2729))
([87cd4a0](87cd4a0bf4))
* **ui:** Remove module from script
([#2703](https://github.com/googleapis/genai-toolbox/issues/2703))
([6943ab6](6943ab6839))
* Update toolset attributes naming
([#2554](https://github.com/googleapis/genai-toolbox/issues/2554))
([3d6ae4e](3d6ae4eeaf))

---
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>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-13 15:55:27 -07:00
Yuan Teoh
00038f1570 chore: release 0.29.0 (#2731)
Release-As: 0.29.0
2026-03-13 22:25:47 +00:00
Yuan Teoh
bfd7ba601a fix: return AllParams for GetParameter() (#2734)
Fixes for some tools that did not return `t.AllParams` for the
`GetParameters()` when template parameter exists.

🛠️ Fixes #2720
2026-03-13 21:44:48 +00:00
Yuan Teoh
7cea6668b4 chore: downgrade toolchain (#2732)
Downgrade the Go toolchain to `1.25.8` for compatibility with
`golangci-lint`, as it does not yet support Go `1.26`.
2026-03-13 21:11:38 +00:00
Averi Kitsch
5f3f063fc7 feat(source/alloydb)!: restructure prebuilt toolsets (#2639)
… tools tests

## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-13 13:43:42 -07:00
Yuan Teoh
5834ed8a0c ci: update postgres pub table with uuid (#2745) 2026-03-13 13:15:33 -07:00
Averi Kitsch
ea2b698b03 feat(source/spanner)!: restructure prebuilt toolsets (#2641)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-13 10:44:34 -07:00
Averi Kitsch
acb9a80cf2 feat(source/dataplex)!: restructure prebuilt toolsets (#2640)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-13 17:24:35 +00:00
Averi Kitsch
5196c6a78e feat(source/oss-db)!: restructure prebuilt toolsets (#2638)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-13 16:39:11 +00:00
Averi Kitsch
99613dcc7a feat(source/cloudsql)!: restructure prebuilt toolsets (#2635)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-13 16:05:06 +00:00
Parth Ajmera
87cd4a0bf4 fix(telemetry): histogram buckets from OTel standard to MCP standards (#2729)
## Description

> Currently the Histograms for Telemetry Metrics are defaulted to OTel
Standard ExplicitBucketBoundaries. These metrics SHOULD be specified
with
[ExplicitBucketBoundaries](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.50.0/specification/metrics/api.md#instrument-advisory-parameters)
of [ 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 30, 60, 120, 300 ].

## PR Checklist

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #2222

---------

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-13 15:48:46 +00:00
Averi Kitsch
dc984badd7 feat(source/bigquery)!: restructure prebuilt toolsets (#2637)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-12 16:43:32 -07:00
Averi Kitsch
22ab7b9365 feat(source/firestore)!: restructure prebuilt toolsets (#2636)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-12 22:17:19 +00:00
Averi Kitsch
287251a0cf feat: add user agent to embeddings generation (#2572)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-12 21:53:34 +00:00
Siddharth Ravi
d9ebe5d4bf fix: improve list locks integration test for postgres (#2279)
## Description

Fix: Fixed the flakiness in the list locks integration test for postgres

```
go test -tags=integration tests/postgres/postgres_integration_test.go
ok      command-line-arguments  14.392s
```

## PR Checklist


- [X] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [X] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [X] Ensure the tests and linter pass
- [X] Code coverage does not decrease (if any source code was changed)
- [X] Appropriate docs were updated (if necessary)
- [X] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #1738
2026-03-12 21:30:52 +00:00
Averi Kitsch
a11b5c5984 docs: add tools style guide (#2577)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-12 10:46:28 -07:00
Mend Renovate
63da510829 chore(deps): update github actions (major) (#2700)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/checkout](https://redirect.github.com/actions/checkout) |
action | major | `v4` → `v6` |
|
[actions/download-artifact](https://redirect.github.com/actions/download-artifact)
| action | major | `v4` → `v8` |
|
[actions/upload-artifact](https://redirect.github.com/actions/upload-artifact)
| action | major | `v4` → `v7` |

---

### Release Notes

<details>
<summary>actions/checkout (actions/checkout)</summary>

### [`v6`](https://redirect.github.com/actions/checkout/compare/v5...v6)

[Compare
Source](https://redirect.github.com/actions/checkout/compare/v5...v6)

### [`v5`](https://redirect.github.com/actions/checkout/compare/v4...v5)

[Compare
Source](https://redirect.github.com/actions/checkout/compare/v4...v5)

</details>

<details>
<summary>actions/download-artifact (actions/download-artifact)</summary>

###
[`v8`](https://redirect.github.com/actions/download-artifact/compare/v7...v8)

[Compare
Source](https://redirect.github.com/actions/download-artifact/compare/v7...v8)

###
[`v7`](https://redirect.github.com/actions/download-artifact/compare/v6...v7)

[Compare
Source](https://redirect.github.com/actions/download-artifact/compare/v6...v7)

###
[`v6`](https://redirect.github.com/actions/download-artifact/compare/v5...v6)

[Compare
Source](https://redirect.github.com/actions/download-artifact/compare/v5...v6)

###
[`v5`](https://redirect.github.com/actions/download-artifact/compare/v4...v5)

[Compare
Source](https://redirect.github.com/actions/download-artifact/compare/v4...v5)

</details>

<details>
<summary>actions/upload-artifact (actions/upload-artifact)</summary>

###
[`v7`](https://redirect.github.com/actions/upload-artifact/compare/v6...v7)

[Compare
Source](https://redirect.github.com/actions/upload-artifact/compare/v6...v7)

###
[`v6`](https://redirect.github.com/actions/upload-artifact/compare/v5...v6)

[Compare
Source](https://redirect.github.com/actions/upload-artifact/compare/v5...v6)

###
[`v5`](https://redirect.github.com/actions/upload-artifact/compare/v4...v5)

[Compare
Source](https://redirect.github.com/actions/upload-artifact/compare/v4...v5)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4wIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
2026-03-12 09:40:21 -07:00
Mend Renovate
99843d9c94 chore(deps): pin dependencies (#2699)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/checkout](https://redirect.github.com/actions/checkout) |
action | pinDigest | → `34e1148` |
|
[actions/download-artifact](https://redirect.github.com/actions/download-artifact)
| action | pinDigest | → `d3f86a1` |
|
[actions/upload-artifact](https://redirect.github.com/actions/upload-artifact)
| action | pinDigest | → `ea165f8` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4wIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-12 09:20:23 -07:00
Mend Renovate
9871c2e0fa chore(deps): update dependency langgraph to v1.0.10 [security] (#2676)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [langgraph](https://redirect.github.com/langchain-ai/langgraph)
([source](https://redirect.github.com/langchain-ai/langgraph/tree/HEAD/libs/langgraph),
[changelog](https://redirect.github.com/langchain-ai/langgraph/releases))
| `==1.0.5` → `==1.0.10` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/langgraph/1.0.10?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/langgraph/1.0.5/1.0.10?slim=true)
|

### GitHub Vulnerability Alerts

####
[CVE-2026-28277](https://redirect.github.com/langchain-ai/langgraph/security/advisories/GHSA-g48c-2wqr-h844)

LangGraph checkpointers can load msgpack-encoded checkpoints that
reconstruct Python objects during deserialization. If an attacker can
modify checkpoint data in the backing store (for example, after a
database compromise or other privileged write access to the persistence
layer), they can potentially supply a crafted payload that triggers
unsafe object reconstruction when the checkpoint is loaded.

This is a **post-exploitation / defense-in-depth** issue. Exploitation
requires the ability to write attacker-controlled checkpoint bytes at
rest. In most deployments that prerequisite already implies a serious
incident; the additional risk is turning “checkpoint-store write access”
into code execution in the application runtime, which can expand blast
radius (for example by exposing environment variables or cloud
credentials available to the runtime).

There is no evidence of exploitation in the wild, and LangGraph is not
aware of a practical exploitation path in existing deployments today.
This change is intended to reduce the blast radius of a checkpoint-store
compromise.

## Affected users / systems

Users may be affected if they:

- use a persistent checkpointer (database, remote store, shared
filesystem, etc.),
- load/resume from checkpoints, and
- operate in an environment where an attacker could gain privileged
write access to checkpoint data in the backing store.

This issue requires the attacker to be able to modify persisted
checkpoint bytes (or to compromise a trusted component that writes
them). It is generally not reachable by an unauthenticated remote
attacker in a correctly configured deployment.

## Impact
- Potential **arbitrary code execution** or other unsafe side effects
during checkpoint deserialization.
- Escalation from “write access to checkpoint store” to “code execution
in the application runtime,” which may expose runtime secrets or provide
access to other systems the runtime can reach.

## Exploitation scenario (high level)
1. Attacker gains privileged write access to the checkpoint store (for
example, via database compromise, leaked credentials, or abuse of an
administrative data path).
2. Attacker writes a crafted checkpoint payload containing msgpack data
intended to reconstruct dangerous objects.
3. Application resumes and deserializes the checkpoint; unsafe
reconstruction could execute attacker-controlled behavior.

## Mitigation / remediation
LangGraph provides an allowlist-based hardening mechanism for msgpack
checkpoint deserialization.

### Strict mode (environment variable)
- **`LANGGRAPH_STRICT_MSGPACK`**
- When set truthy (`1`, `true`, `yes`), the default msgpack
deserialization policy becomes strict.
- Concretely: `JsonPlusSerializer()` will default
`allowed_msgpack_modules` to `None` (strict) instead of `True`
(warn-and-allow), unless `allowed_msgpack_modules=...` is explicitly
passed.

### `allowed_msgpack_modules` (serializer/checkpointer config)
This setting controls what msgpack “ext” types are allowed to be
reconstructed.

- `True` (default when strict mode is not enabled): allow all ext types,
but log a warning when deserializing a type that is not explicitly
registered.
- `None` (strict): only a built-in safe set is reconstructed; other ext
types are blocked.
- `[(module, class_name), ...]` (strict allowlist): the built-in safe
set plus exactly the listed symbols are reconstructed (exact-match).

### Built-in safe set
A small set of types is always treated as safe to reconstruct (for
example `datetime` types, `uuid.UUID`, `decimal.Decimal`,
`set`/`frozenset`/`deque`, `ipaddress` types, `pathlib` paths,
`zoneinfo.ZoneInfo`, compiled regex patterns, and selected LangGraph
internal types).

### Automatically derived allowlist (only when compiling graphs)
When `LANGGRAPH_STRICT_MSGPACK` is enabled and `StateGraph` is compiled,
LangGraph derives an allowlist from the graph’s schemas and channels and
applies it to the checkpointer.

- The allowlist is built by walking the state/input/output/context
schemas (plus node/branch input schemas) and channel value/update types.
It includes Pydantic v1/v2 models, dataclasses, enums, TypedDict field
types, and common typing constructs (containers, unions, `Annotated`).
- LangGraph also includes a curated set of common LangChain message
classes.

This derived allowlist is only applied if the selected checkpointer
supports `with_allowlist(...)`. If a user is constructing
serializers/checkpointers manually (or using a checkpointer that does
not support allowlist propagation), they will need to configure
`allowed_msgpack_modules` themselves.

### Operational guidance
- Treat checkpoint stores as integrity-sensitive. Restrict write access
and rotate credentials if compromise is suspected.
- Enable strict mode (`LANGGRAPH_STRICT_MSGPACK=true`) in production if
feasible, and rely on schema-driven allowlisting to reduce
incompatibilities.
- Avoid providing custom msgpack deserialization hooks that reconstruct
arbitrary types unless checkpoint data is fully trusted.

## Limitations / important notes
- If a checkpointer implementation does **not** support allowlist
application (i.e., does not implement `with_allowlist`), allowlist
enforcement may be skipped (with a warning). In that situation, strict
expectations may not hold.
- If an application supplies a custom msgpack unpack hook (`ext_hook`),
the custom hook controls reconstruction and can bypass the default
allowlist checks (intentional escape hatch, but it weakens the
protection).

## LangSmith / hosted deployments note
LangSmith is not aware of this issue presenting risk to existing
LangSmith-hosted deployments. The described threat model requires an
attacker to tamper with the checkpoint persistence layer used by the
deployment; typical hosted configurations are designed to prevent such
access.

First reported by:  yardenporat353

---

### Release Notes

<details>
<summary>langchain-ai/langgraph (langgraph)</summary>

###
[`v1.0.10`](https://redirect.github.com/langchain-ai/langgraph/releases/tag/1.0.10):
langgraph&#x3D;&#x3D;1.0.10

[Compare
Source](https://redirect.github.com/langchain-ai/langgraph/compare/1.0.9...1.0.10)

Changes since 1.0.10rc1

- release(langgraph) 1.0.10
([#&#8203;6967](https://redirect.github.com/langchain-ai/langgraph/issues/6967))
- release(checkpoint): 0.4.1
([#&#8203;6966](https://redirect.github.com/langchain-ai/langgraph/issues/6966))
- chore: add serde events
([#&#8203;6954](https://redirect.github.com/langchain-ai/langgraph/issues/6954))
- chore: update defaults
([#&#8203;6953](https://redirect.github.com/langchain-ai/langgraph/issues/6953))
- release: rc2
([#&#8203;6949](https://redirect.github.com/langchain-ai/langgraph/issues/6949))
- chore(deps-dev): bump the all-dependencies group across 1 directory
with 3 updates
([#&#8203;6946](https://redirect.github.com/langchain-ai/langgraph/issues/6946))

###
[`v1.0.9`](https://redirect.github.com/langchain-ai/langgraph/releases/tag/1.0.9):
langgraph&#x3D;&#x3D;1.0.9

[Compare
Source](https://redirect.github.com/langchain-ai/langgraph/compare/1.0.8...1.0.9)

Changes since 1.0.8

- release: langgraph + prebuilt
([#&#8203;6875](https://redirect.github.com/langchain-ai/langgraph/issues/6875))
- fix: sequential interrupt handling w/ functional API
([#&#8203;6863](https://redirect.github.com/langchain-ai/langgraph/issues/6863))
- chore: state\_updated\_at sort by
([#&#8203;6857](https://redirect.github.com/langchain-ai/langgraph/issues/6857))
- chore: bump orjson
([#&#8203;6852](https://redirect.github.com/langchain-ai/langgraph/issues/6852))
- chore: conformance testing
([#&#8203;6842](https://redirect.github.com/langchain-ai/langgraph/issues/6842))
- chore(deps): bump the all-dependencies group in /libs/langgraph with 6
updates
([#&#8203;6815](https://redirect.github.com/langchain-ai/langgraph/issues/6815))
- chore(deps): bump protobuf from 6.33.4 to 6.33.5 in /libs/langgraph
([#&#8203;6833](https://redirect.github.com/langchain-ai/langgraph/issues/6833))
- chore(deps): bump cryptography from 46.0.3 to 46.0.5 in
/libs/langgraph
([#&#8203;6837](https://redirect.github.com/langchain-ai/langgraph/issues/6837))
- chore(deps): bump nbconvert from 7.16.6 to 7.17.0 in /libs/langgraph
([#&#8203;6832](https://redirect.github.com/langchain-ai/langgraph/issues/6832))
- chore: server runtime type
([#&#8203;6774](https://redirect.github.com/langchain-ai/langgraph/issues/6774))
- refactor: replace bare except with BaseException in AsyncQueue
([#&#8203;6765](https://redirect.github.com/langchain-ai/langgraph/issues/6765))

###
[`v1.0.8`](https://redirect.github.com/langchain-ai/langgraph/releases/tag/1.0.8):
langgraph&#x3D;&#x3D;1.0.8

[Compare
Source](https://redirect.github.com/langchain-ai/langgraph/compare/1.0.7...1.0.8)

Changes since 1.0.7

- release(langgraph): 1.0.8
([#&#8203;6757](https://redirect.github.com/langchain-ai/langgraph/issues/6757))
- chore: shallow copy futures
([#&#8203;6755](https://redirect.github.com/langchain-ai/langgraph/issues/6755))
- fix: pydantic messages double streaming
([#&#8203;6753](https://redirect.github.com/langchain-ai/langgraph/issues/6753))
- chore(deps-dev): bump ruff from 0.14.7 to 0.14.11 in /libs/sdk-py
([#&#8203;6673](https://redirect.github.com/langchain-ai/langgraph/issues/6673))
- chore: Omit lock when using connection pool
([#&#8203;6734](https://redirect.github.com/langchain-ai/langgraph/issues/6734))
- docs: enhance `Runtime` and `ToolRuntime` class descriptions for
clarity
([#&#8203;6689](https://redirect.github.com/langchain-ai/langgraph/issues/6689))
- docs: add clarity to use of `thread_id`
([#&#8203;6515](https://redirect.github.com/langchain-ai/langgraph/issues/6515))
- docs: add docstrings to `add_node` overloads
([#&#8203;6514](https://redirect.github.com/langchain-ai/langgraph/issues/6514))
- docs: update notebook links and add archival notices for examples
([#&#8203;6720](https://redirect.github.com/langchain-ai/langgraph/issues/6720))
- release(cli): 0.4.12
([#&#8203;6716](https://redirect.github.com/langchain-ai/langgraph/issues/6716))

###
[`v1.0.7`](https://redirect.github.com/langchain-ai/langgraph/releases/tag/1.0.7):
langgraph&#x3D;&#x3D;1.0.7

[Compare
Source](https://redirect.github.com/langchain-ai/langgraph/compare/1.0.6...1.0.7)

Changes since 1.0.6

- release: langgraph and prebuilt 1.0.7
([#&#8203;6712](https://redirect.github.com/langchain-ai/langgraph/issues/6712))
- fix: aiosqlite's breaking change
([#&#8203;6699](https://redirect.github.com/langchain-ai/langgraph/issues/6699))
- chore(deps): upgrade dependencies with `uv lock --upgrade`
([#&#8203;6671](https://redirect.github.com/langchain-ai/langgraph/issues/6671))
- chore: update twitter URLs
([#&#8203;6683](https://redirect.github.com/langchain-ai/langgraph/issues/6683))

###
[`v1.0.6`](https://redirect.github.com/langchain-ai/langgraph/releases/tag/1.0.6):
langgraph&#x3D;&#x3D;1.0.6

[Compare
Source](https://redirect.github.com/langchain-ai/langgraph/compare/1.0.5...1.0.6)

Changes since 1.0.5

- fix: flip default on base cache
([#&#8203;6677](https://redirect.github.com/langchain-ai/langgraph/issues/6677))
- fix: change default recursion limit
([#&#8203;6676](https://redirect.github.com/langchain-ai/langgraph/issues/6676))
- fix: sanitize namespace for deeply nested graph jumps
([#&#8203;6665](https://redirect.github.com/langchain-ai/langgraph/issues/6665))
- fix: typo: saved the world "BaseMessge" to "BaseMessage"
([#&#8203;6639](https://redirect.github.com/langchain-ai/langgraph/issues/6639))
- release(cli): relax api bounds
([#&#8203;6606](https://redirect.github.com/langchain-ai/langgraph/issues/6606))
- feat(checkpoint): Validate checkpointer type at compile time
([#&#8203;6586](https://redirect.github.com/langchain-ai/langgraph/issues/6586))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4wIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-12 09:13:11 -07:00
Haoyu Wang
9598a6a325 feat(skill): attach user agent metadata for generated skill (#2697)
This PR updates the agent skill script generation logic to extract and
pass the user-agent-metadata during CLI invocation.
2026-03-12 08:18:50 -04:00
Anubhav Dhawan
6f985bc36a doc: Remove 'toolbox' command from Docker config (#2715)
Fixes https://github.com/googleapis/genai-toolbox/issues/2708

The entrypoint binary is already specified in the container image here:
df7f2fd7d5/Dockerfile (L55).
2026-03-12 11:08:09 +05:30
Bruno Andrade
f66189fe43 fix(mcp): guard nil SSE session lookup and return 400 for missing session (#2681)
## Description

Fixes a panic in SSE-backed MCP requests where `POST /mcp?sessionId=...`
could dereference a nil session pointer in `sseManager.get` and return
HTTP 500. The impact is failed MCP message handling after successful
`/mcp/sse` bootstrap. The solution makes session lookup nil-safe,
removes corrupt nil entries defensively, and returns HTTP 400 when a
provided `sessionId` is unavailable.

## PR Checklist

- [x] Make sure you reviewed
[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Make sure to open an issue as a
[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
before writing your code! That way we can discuss the change, evaluate
designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #2680

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-11 23:48:49 +00:00
Mend Renovate
57a0ff6179 chore(deps): update node (#2623)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@google/adk](https://redirect.github.com/google/adk-js) | [`^0.4.0` →
`^0.5.0`](https://renovatebot.com/diffs/npm/@google%2fadk/0.4.0/0.5.0) |
![age](https://developer.mend.io/api/mc/badges/age/npm/@google%2fadk/0.5.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@google%2fadk/0.4.0/0.5.0?slim=true)
|
|
[@toolbox-sdk/adk](https://redirect.github.com/googleapis/mcp-toolbox-sdk-js/blob/main/packages/toolbox-adk)
([source](https://redirect.github.com/googleapis/mcp-toolbox-sdk-js)) |
[`^0.2.1` →
`^0.3.0`](https://renovatebot.com/diffs/npm/@toolbox-sdk%2fadk/0.2.1/0.3.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@toolbox-sdk%2fadk/0.3.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@toolbox-sdk%2fadk/0.2.1/0.3.0?slim=true)
|
|
[@toolbox-sdk/adk](https://redirect.github.com/googleapis/mcp-toolbox-sdk-js/blob/main/packages/toolbox-adk)
([source](https://redirect.github.com/googleapis/mcp-toolbox-sdk-js)) |
[`^0.2.0` →
`^0.3.0`](https://renovatebot.com/diffs/npm/@toolbox-sdk%2fadk/0.2.1/0.3.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@toolbox-sdk%2fadk/0.3.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@toolbox-sdk%2fadk/0.2.1/0.3.0?slim=true)
|
|
[@toolbox-sdk/core](https://redirect.github.com/googleapis/mcp-toolbox-sdk-js/blob/main/packages/toolbox-core)
([source](https://redirect.github.com/googleapis/mcp-toolbox-sdk-js)) |
[`^0.2.1` →
`^0.3.0`](https://renovatebot.com/diffs/npm/@toolbox-sdk%2fcore/0.2.1/0.3.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@toolbox-sdk%2fcore/0.3.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@toolbox-sdk%2fcore/0.2.1/0.3.0?slim=true)
|
|
[@toolbox-sdk/core](https://redirect.github.com/googleapis/mcp-toolbox-sdk-js/blob/main/packages/toolbox-core)
([source](https://redirect.github.com/googleapis/mcp-toolbox-sdk-js)) |
[`^0.2.0` →
`^0.3.0`](https://renovatebot.com/diffs/npm/@toolbox-sdk%2fcore/0.2.1/0.3.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@toolbox-sdk%2fcore/0.3.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@toolbox-sdk%2fcore/0.2.1/0.3.0?slim=true)
|

---

### Release Notes

<details>
<summary>google/adk-js (@&#8203;google/adk)</summary>

###
[`v0.5.0`](e95ecb4128...1a012d266d)

[Compare
Source](e95ecb4128...1a012d266d)

</details>

<details>
<summary>googleapis/mcp-toolbox-sdk-js
(@&#8203;toolbox-sdk/adk)</summary>

###
[`v0.3.0`](2638438b8c...94b0e878da)

[Compare
Source](2638438b8c...be7afa5ae2)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4xIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-11 16:00:17 -07:00
Averi Kitsch
e58314b2bb chore: update go (#2634)
Removed the session pool config in Spanner source. Spanner v1.88.0
ignores the SessionPoolConfig in v1.88.0 since it's deprecated.
Multiplexed sessions are now used for all operations (ref:
https://github.com/googleapis/google-cloud-go/blob/main/spanner/session.go#L71)

---------

Co-authored-by: Mend Renovate <bot@renovateapp.com>
Co-authored-by: Yuan Teoh <yuanteoh@google.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-11 14:54:31 -07:00
Yuan Teoh
6943ab6839 fix(ui): remove module from script (#2703)
Removed `type="module"` from the script with DOM content.

Explanation of the chain of events that is happening currently:
* tools.html loads. It sees <script type="module"
src="/ui/js/tools.js"></script> and the inline <script type="module">
containing renderMainContent() call.
* Because both are modules, the browser waits until the HTML is fully
parsed, then executes them strictly in the order they appear in the
file.
* tools.js executes and attaches its DOMContentLoaded listener.
* The inline script executes and attaches its DOMContentLoaded listener.
* The DOM finishes loading. The browser fires the DOMContentLoaded
event.
* tools.js handles the event first. It runs the code on Line 27, looks
for tool-display-area, but it doesn't exist yet because the inline
script (which calls renderMainContent(...) to build that element) hasn't
run its event handler yet

Without the `type="module"`, it is now a standard script. The browser
will pause HTML parsing, executes the script immediately, and registers
the DOMContentLoaded listener first.

If we want to transition to using ES modules in the future, we will have
to rearrange the scripts. For now, modules is not necessary in this use
case. Hence defaulted to standard script.

Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-03-11 18:27:09 +00:00
Dr. Strangelove
df7f2fd7d5 fix(sources/looker): looker and looker-dev prebuilt tools should share one source definition. (#2620)
## Description

Share the source definition between looker and looker-dev prebuilt
tools.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [x] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #2615
2026-03-11 14:36:05 +00:00
dishaprakash
b5c866c44f chore(ci): Update Hugo versions in the deployment workflows (#2695)
## Description

This PR adds a regex manager to find all mentions of hugo version in the
workflows to update them using Renovate.

The change has been confirmed with `renovate-config-validator` and
`LOG_LEVEL=debug npx renovate --platform=local --dry-run=lookup`

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [x] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-03-11 11:05:18 +05:30
Twisha Bansal
73bf962459 feat(skills): add additional-notes flag to generate skills command (#2696)
## Description

This PR adds a new `--additional-notes` flag to the skills-generate
command. This allows users to provide custom text that will be appended
to the Usage section of the generated SKILL.md file.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-11 05:25:18 +00:00
dependabot[bot]
86c9843a9f chore(deps): bump hono from 4.12.5 to 4.12.7 in /docs/en/getting-started/quickstart/js/adk (#2702)
Bumps [hono](https://github.com/honojs/hono) from 4.12.5 to 4.12.7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/honojs/hono/releases">hono's
releases</a>.</em></p>
<blockquote>
<h2>v4.12.7</h2>
<h2>Security hardening</h2>
<p>Ignore <code>__proto__</code> path segments in parseBody({ dot: true
}) to prevent potential prototype pollution when merged with unsafe
patterns.</p>
<hr />
<p><strong>Full Changelog</strong>: <a
href="https://github.com/honojs/hono/compare/v4.12.6...v4.12.7">https://github.com/honojs/hono/compare/v4.12.6...v4.12.7</a></p>
<h2>v4.12.6</h2>
<h2>What's Changed</h2>
<ul>
<li>fix(accept): replace regex split to mitigate ReDoS by <a
href="https://github.com/EdamAme-x"><code>@​EdamAme-x</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4758">honojs/hono#4758</a></li>
<li>fix(jsx): align link hoisting and dedupe with React 19 by <a
href="https://github.com/usualoma"><code>@​usualoma</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4792">honojs/hono#4792</a></li>
<li>chore(builld): tsconfig project references by <a
href="https://github.com/BarryThePenguin"><code>@​BarryThePenguin</code></a>
in <a
href="https://redirect.github.com/honojs/hono/pull/4797">honojs/hono#4797</a></li>
<li>chore: add <code>tsconfig.spec.json</code> by <a
href="https://github.com/yusukebe"><code>@​yusukebe</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4798">honojs/hono#4798</a></li>
<li>feat(jsx-renderer): support function-based options by <a
href="https://github.com/3w36zj6"><code>@​3w36zj6</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4780">honojs/hono#4780</a></li>
<li>fix(lambda-edge): avoid callback handler deprecation on NODEJS_24_X
by <a href="https://github.com/t0waxx"><code>@​t0waxx</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4782">honojs/hono#4782</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/t0waxx"><code>@​t0waxx</code></a> made
their first contribution in <a
href="https://redirect.github.com/honojs/hono/pull/4782">honojs/hono#4782</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/honojs/hono/compare/v4.12.5...v4.12.6">https://github.com/honojs/hono/compare/v4.12.5...v4.12.6</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="b0aba5bd76"><code>b0aba5b</code></a>
4.12.7</li>
<li><a
href="1be3a53ccb"><code>1be3a53</code></a>
ci: apply automated fixes</li>
<li><a
href="ef902257e0"><code>ef90225</code></a>
Merge commit from fork</li>
<li><a
href="3f886365c8"><code>3f88636</code></a>
4.12.6</li>
<li><a
href="53b66aeac5"><code>53b66ae</code></a>
fix(lambda-edge): avoid callback handler deprecation on NODEJS_24_X (<a
href="https://redirect.github.com/honojs/hono/issues/4782">#4782</a>)</li>
<li><a
href="58825a72f7"><code>58825a7</code></a>
feat(jsx-renderer): support function-based options (<a
href="https://redirect.github.com/honojs/hono/issues/4780">#4780</a>)</li>
<li><a
href="0e80acb9f8"><code>0e80acb</code></a>
chore: add <code>tsconfig.spec.json</code> (<a
href="https://redirect.github.com/honojs/hono/issues/4798">#4798</a>)</li>
<li><a
href="d69deb8886"><code>d69deb8</code></a>
chore(builld): tsconfig project references (<a
href="https://redirect.github.com/honojs/hono/issues/4797">#4797</a>)</li>
<li><a
href="8217d9ece6"><code>8217d9e</code></a>
fix(jsx): align link hoisting and dedupe with React 19 (<a
href="https://redirect.github.com/honojs/hono/issues/4792">#4792</a>)</li>
<li><a
href="5086956298"><code>5086956</code></a>
fix(accept): replace regex split to mitigate ReDoS (<a
href="https://redirect.github.com/honojs/hono/issues/4758">#4758</a>)</li>
<li>See full diff in <a
href="https://github.com/honojs/hono/compare/v4.12.5...v4.12.7">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=hono&package-manager=npm_and_yarn&previous-version=4.12.5&new-version=4.12.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-03-11 10:31:32 +05:30
dependabot[bot]
9b0025fd50 chore(deps): bump hono from 4.12.5 to 4.12.7 in /docs/en/samples/pre_post_processing/js/adk (#2701)
Bumps [hono](https://github.com/honojs/hono) from 4.12.5 to 4.12.7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/honojs/hono/releases">hono's
releases</a>.</em></p>
<blockquote>
<h2>v4.12.7</h2>
<h2>Security hardening</h2>
<p>Ignore <code>__proto__</code> path segments in parseBody({ dot: true
}) to prevent potential prototype pollution when merged with unsafe
patterns.</p>
<hr />
<p><strong>Full Changelog</strong>: <a
href="https://github.com/honojs/hono/compare/v4.12.6...v4.12.7">https://github.com/honojs/hono/compare/v4.12.6...v4.12.7</a></p>
<h2>v4.12.6</h2>
<h2>What's Changed</h2>
<ul>
<li>fix(accept): replace regex split to mitigate ReDoS by <a
href="https://github.com/EdamAme-x"><code>@​EdamAme-x</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4758">honojs/hono#4758</a></li>
<li>fix(jsx): align link hoisting and dedupe with React 19 by <a
href="https://github.com/usualoma"><code>@​usualoma</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4792">honojs/hono#4792</a></li>
<li>chore(builld): tsconfig project references by <a
href="https://github.com/BarryThePenguin"><code>@​BarryThePenguin</code></a>
in <a
href="https://redirect.github.com/honojs/hono/pull/4797">honojs/hono#4797</a></li>
<li>chore: add <code>tsconfig.spec.json</code> by <a
href="https://github.com/yusukebe"><code>@​yusukebe</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4798">honojs/hono#4798</a></li>
<li>feat(jsx-renderer): support function-based options by <a
href="https://github.com/3w36zj6"><code>@​3w36zj6</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4780">honojs/hono#4780</a></li>
<li>fix(lambda-edge): avoid callback handler deprecation on NODEJS_24_X
by <a href="https://github.com/t0waxx"><code>@​t0waxx</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4782">honojs/hono#4782</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/t0waxx"><code>@​t0waxx</code></a> made
their first contribution in <a
href="https://redirect.github.com/honojs/hono/pull/4782">honojs/hono#4782</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/honojs/hono/compare/v4.12.5...v4.12.6">https://github.com/honojs/hono/compare/v4.12.5...v4.12.6</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="b0aba5bd76"><code>b0aba5b</code></a>
4.12.7</li>
<li><a
href="1be3a53ccb"><code>1be3a53</code></a>
ci: apply automated fixes</li>
<li><a
href="ef902257e0"><code>ef90225</code></a>
Merge commit from fork</li>
<li><a
href="3f886365c8"><code>3f88636</code></a>
4.12.6</li>
<li><a
href="53b66aeac5"><code>53b66ae</code></a>
fix(lambda-edge): avoid callback handler deprecation on NODEJS_24_X (<a
href="https://redirect.github.com/honojs/hono/issues/4782">#4782</a>)</li>
<li><a
href="58825a72f7"><code>58825a7</code></a>
feat(jsx-renderer): support function-based options (<a
href="https://redirect.github.com/honojs/hono/issues/4780">#4780</a>)</li>
<li><a
href="0e80acb9f8"><code>0e80acb</code></a>
chore: add <code>tsconfig.spec.json</code> (<a
href="https://redirect.github.com/honojs/hono/issues/4798">#4798</a>)</li>
<li><a
href="d69deb8886"><code>d69deb8</code></a>
chore(builld): tsconfig project references (<a
href="https://redirect.github.com/honojs/hono/issues/4797">#4797</a>)</li>
<li><a
href="8217d9ece6"><code>8217d9e</code></a>
fix(jsx): align link hoisting and dedupe with React 19 (<a
href="https://redirect.github.com/honojs/hono/issues/4792">#4792</a>)</li>
<li><a
href="5086956298"><code>5086956</code></a>
fix(accept): replace regex split to mitigate ReDoS (<a
href="https://redirect.github.com/honojs/hono/issues/4758">#4758</a>)</li>
<li>See full diff in <a
href="https://github.com/honojs/hono/compare/v4.12.5...v4.12.7">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=hono&package-manager=npm_and_yarn&previous-version=4.12.5&new-version=4.12.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-03-11 10:26:21 +05:30
Parth Ajmera
131d764f89 feat!: telemetry metrics updates as per semantic convention (#2566)
## Description

This PR updates MCP telemetry to align with [OTel semantic
conventions](https://opentelemetry.io/docs/specs/semconv/gen-ai/mcp/#metrics)
by removing all existing transport-specific and HTTP-API metrics and
introducing a unified, future-proof set. It adds
1. `mcp.server.operation.duration` to capture per-method request rate,
latency, and errors across all MCP transports;
2. `mcp.server.session.duration` to track session lifecycles for stdio
and SSE;
3. `toolbox.server.mcp.active_sessions` for real-time capacity,
saturation, and leak detection.
4. `toolbox.tool.operation.duration` to isolate backend tool execution
time from MCP/protocol overhead, enabling clearer attribution of
performance bottlenecks between the MCP layer and tool runtime.

Together, these changes simplify the metrics surface while significantly
improving observability and debuggability with minimal runtime overhead.

## PR Checklist

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [x] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #2222

---------

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-11 04:26:18 +00:00
Vinodhini Chockalingam
a136e169b3 feat(tools/serverlessspark): Adding get_session_template tool to serverlessspark (#2308)
## Description

Adding get_session_template tool to Serverless spark

🛠️ Part of https://github.com/googleapis/genai-toolbox/issues/2405

---------

Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2026-03-10 19:09:34 -04:00
dishaprakash
3f83c497b7 chore(ci): Secure docs-preview Deployments (#2673)
## Description

This PR removes an RCE vulnerability in our documentation preview
pipeline while preserving the automated preview deployments for
community forks. It also removes the need for maintainers to manually
apply the `docs: deploy-preview` label.

## Context
Previously, `docs.yam`l used the `pull_request_target` trigger to
evaluate fork PRs. Because it checked out untrusted code and ran npm ci
and hugo in a context with a privileged GITHUB_TOKEN (contents: write,
pull-requests: write) an RCE Vulnerability is created.

## Solution
The pipeline has been split into two isolated workflows to create a gap:

### `docs_preview_build.yaml`:
Triggers on standard pull_request (read-only token).
Safely checks out untrusted fork code in a sandboxed environment.
Runs npm ci --ignore-scripts (added as an extra defense-in-depth layer
to prevent malicious package scripts) and builds the Hugo site.
Packages the generated HTML and the PR number into a secure artifact.

### `docs_preview_deploy.yaml`:
Triggers on workflow_run (runs safely in the context of our base
repository).
Holds the privileged token (contents: write, pull-requests: write).
Never checks out or executes the fork's code.
Simply downloads the artifact, deploys it to the `versioned-gh-pages`
branch, and posts the preview link comment to the PR.

This workflow can be run independently in case of failure by providing
the PR number and the Build workflow's ID

This setup guarantees that untrusted code never executes a token with
write access, keeping our repository and secrets secure.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-03-11 03:59:50 +05:30
Huan Chen
d3baf77d61 feat(bigquery): support custom oauth header name (#2564)
Adds support for custom OAuth header and updates documentation.

## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-03-10 21:24:04 +00:00
DEEVEN SERU
3856913e1c security(http): prevent base URL host override (#2655)
## Summary
- build request URLs by resolving validated relative paths against the
base URL
- reject path templates that attempt to set scheme/host/userinfo
- add regression tests for host-override attempts

## Testing
- go test ./internal/tools/http

Fixes #2616

Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2026-03-10 20:44:36 +05:30
dishaprakash
949e824246 chore(ci): secure tests and lint workflow against RCE (#2671)
## Description

Due to a RCE Vulnerability, we can safely change the workflow to run on
pull_request while still maintaining it's run on PRs from forks.
Changes:
- Remove usage of pull_request_target
- Remove write permissions from the workflow as these workflows will
move from the labeled runs

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-03-10 18:57:45 +05:30
manuka rahul
63d448d428 docs: fix links (#2612)
Fixed broken links

---------

Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-03-10 13:58:00 +05:30
Haoyu Wang
c233eee98c feat(skill): update skill generation logic (#2646)
This PR refactors and improves the skill generation logic to make it
more configurable and also simplifies the generated skill.

- Shift from generating individual tool-specific YAML files to a more
centralized configuration approach using global toolbox flags.
- Add support for --license-header to prepend license information to
generated Node.js scripts.
- Refactored tool parameter documentation from a JSON schema format to a
more readable Markdown table.
- Update tool invocation log level to avoid unnecessary outputs.
- Make generated skill to be compatible with Gemini CLI's env variable.
2026-03-09 21:01:15 -04:00
Haoyu Wang
5271368720 fix(skill): fix env variable propagation (#2645)
This PR refactors the tool file parsing logic by introducing a new
ToolsFileParser struct. This encapsulation allows for stateful parsing,
specifically enabling the tracking of resolved environment variables
during configuration loading. This is useful for skill generation, where
we can now identify and omit default values that correspond to
environment variables, ensuring more precise generated skill.
2026-03-09 20:28:15 -04:00
Parth Ajmera
3d6ae4eeaf fix: update toolset attributes naming and closing of stdio/sse spans (#2554)
## Description

Updated `toolset.name` attribute uniformly across metrics and spans.
Also, updated `session_id` to `mcp.session.id` attribute - as in the
semantic convention

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #2222

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-03-09 23:19:46 +00:00
dependabot[bot]
4df097b692 chore(deps): bump go.opentelemetry.io/otel/sdk from 1.38.0 to 1.40.0 (#2588)
Bumps
[go.opentelemetry.io/otel/sdk](https://github.com/open-telemetry/opentelemetry-go)
from 1.38.0 to 1.40.0.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md">go.opentelemetry.io/otel/sdk's
changelog</a>.</em></p>
<blockquote>
<h2>[1.40.0/0.62.0/0.16.0] 2026-02-02</h2>
<h3>Added</h3>
<ul>
<li>Add <code>AlwaysRecord</code> sampler in
<code>go.opentelemetry.io/otel/sdk/trace</code>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7724">#7724</a>)</li>
<li>Add <code>Enabled</code> method to all synchronous instrument
interfaces (<code>Float64Counter</code>,
<code>Float64UpDownCounter</code>, <code>Float64Histogram</code>,
<code>Float64Gauge</code>, <code>Int64Counter</code>,
<code>Int64UpDownCounter</code>, <code>Int64Histogram</code>,
<code>Int64Gauge</code>,) in
<code>go.opentelemetry.io/otel/metric</code>.
This stabilizes the synchronous instrument enabled feature, allowing
users to check if an instrument will process measurements before
performing computationally expensive operations. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7763">#7763</a>)</li>
<li>Add <code>go.opentelemetry.io/otel/semconv/v1.39.0</code> package.
The package contains semantic conventions from the <code>v1.39.0</code>
version of the OpenTelemetry Semantic Conventions.
See the <a
href="https://github.com/open-telemetry/opentelemetry-go/blob/main/semconv/v1.39.0/MIGRATION.md">migration
documentation</a> for information on how to upgrade from
<code>go.opentelemetry.io/otel/semconv/v1.38.0.</code> (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7783">#7783</a>,
<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7789">#7789</a>)</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Improve the concurrent performance of
<code>HistogramReservoir</code> in
<code>go.opentelemetry.io/otel/sdk/metric/exemplar</code> by 4x. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7443">#7443</a>)</li>
<li>Improve the concurrent performance of
<code>FixedSizeReservoir</code> in
<code>go.opentelemetry.io/otel/sdk/metric/exemplar</code>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7447">#7447</a>)</li>
<li>Improve performance of concurrent histogram measurements in
<code>go.opentelemetry.io/otel/sdk/metric</code>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7474">#7474</a>)</li>
<li>Improve performance of concurrent synchronous gauge measurements in
<code>go.opentelemetry.io/otel/sdk/metric</code>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7478">#7478</a>)</li>
<li>Add experimental observability metrics in
<code>go.opentelemetry.io/otel/exporters/stdout/stdoutmetric</code>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7492">#7492</a>)</li>
<li><code>Exporter</code> in
<code>go.opentelemetry.io/otel/exporters/prometheus</code> ignores
metrics with the scope
<code>go.opentelemetry.io/contrib/bridges/prometheus</code>.
This prevents scrape failures when the Prometheus exporter is
misconfigured to get data from the Prometheus bridge. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7688">#7688</a>)</li>
<li>Improve performance of concurrent exponential histogram measurements
in <code>go.opentelemetry.io/otel/sdk/metric</code>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7702">#7702</a>)</li>
<li>The <code>rpc.grpc.status_code</code> attribute in the experimental
metrics emitted from
<code>go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc</code>
is replaced with the <code>rpc.response.status_code</code> attribute to
align with the semantic conventions. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7854">#7854</a>)</li>
<li>The <code>rpc.grpc.status_code</code> attribute in the experimental
metrics emitted from
<code>go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc</code>
is replaced with the <code>rpc.response.status_code</code> attribute to
align with the semantic conventions. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7854">#7854</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix bad log message when key-value pairs are dropped because of key
duplication in <code>go.opentelemetry.io/otel/sdk/log</code>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7662">#7662</a>)</li>
<li>Fix <code>DroppedAttributes</code> on <code>Record</code> in
<code>go.opentelemetry.io/otel/sdk/log</code> to not count the
non-attribute key-value pairs dropped because of key duplication. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7662">#7662</a>)</li>
<li>Fix <code>SetAttributes</code> on <code>Record</code> in
<code>go.opentelemetry.io/otel/sdk/log</code> to not log that attributes
are dropped when they are actually not dropped. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7662">#7662</a>)</li>
<li>Fix missing <code>request.GetBody</code> in
<code>go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp</code>
to correctly handle HTTP/2 <code>GOAWAY</code> frame. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7794">#7794</a>)</li>
<li><code>WithHostID</code> detector in
<code>go.opentelemetry.io/otel/sdk/resource</code> to use full path for
<code>ioreg</code> command on Darwin (macOS). (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7818">#7818</a>)</li>
</ul>
<h3>Deprecated</h3>
<ul>
<li>Deprecate <code>go.opentelemetry.io/otel/exporters/zipkin</code>.
For more information, see the <a
href="https://opentelemetry.io/blog/2025/deprecating-zipkin-exporters/">OTel
blog post deprecating the Zipkin exporter</a>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7670">#7670</a>)</li>
</ul>
<h2>[1.39.0/0.61.0/0.15.0/0.0.14] 2025-12-05</h2>
<h3>Added</h3>
<ul>
<li>Greatly reduce the cost of recording metrics in
<code>go.opentelemetry.io/otel/sdk/metric</code> using hashing for map
keys. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7175">#7175</a>)</li>
<li>Add <code>WithInstrumentationAttributeSet</code> option to
<code>go.opentelemetry.io/otel/log</code>,
<code>go.opentelemetry.io/otel/metric</code>, and
<code>go.opentelemetry.io/otel/trace</code> packages.
This provides a concurrent-safe and performant alternative to
<code>WithInstrumentationAttributes</code> by accepting a
pre-constructed <code>attribute.Set</code>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7287">#7287</a>)</li>
<li>Add experimental observability for the Prometheus exporter in
<code>go.opentelemetry.io/otel/exporters/prometheus</code>.
Check the
<code>go.opentelemetry.io/otel/exporters/prometheus/internal/x</code>
package documentation for more information. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7345">#7345</a>)</li>
<li>Add experimental observability metrics in
<code>go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc</code>.
(<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7353">#7353</a>)</li>
<li>Add temporality selector functions
<code>DeltaTemporalitySelector</code>,
<code>CumulativeTemporalitySelector</code>,
<code>LowMemoryTemporalitySelector</code> to
<code>go.opentelemetry.io/otel/sdk/metric</code>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7434">#7434</a>)</li>
<li>Add experimental observability metrics for simple log processor in
<code>go.opentelemetry.io/otel/sdk/log</code>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7548">#7548</a>)</li>
<li>Add experimental observability metrics in
<code>go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc</code>.
(<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7459">#7459</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a3a5317c5c"><code>a3a5317</code></a>
Release v1.40.0 (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7859">#7859</a>)</li>
<li><a
href="77785da545"><code>77785da</code></a>
chore(deps): update github/codeql-action action to v4.32.1 (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7858">#7858</a>)</li>
<li><a
href="56fa1c297b"><code>56fa1c2</code></a>
chore(deps): update module github.com/clipperhouse/uax29/v2 to v2.5.0
(<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7857">#7857</a>)</li>
<li><a
href="298cbedf25"><code>298cbed</code></a>
Upgrade semconv use to v1.39.0 (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7854">#7854</a>)</li>
<li><a
href="3264bf171b"><code>3264bf1</code></a>
refactor: modernize code (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7850">#7850</a>)</li>
<li><a
href="fd5d030c0a"><code>fd5d030</code></a>
chore(deps): update module github.com/grpc-ecosystem/grpc-gateway/v2 to
v2.27...</li>
<li><a
href="8d3b4cb250"><code>8d3b4cb</code></a>
chore(deps): update actions/cache action to v5.0.3 (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7847">#7847</a>)</li>
<li><a
href="91f7cadfca"><code>91f7cad</code></a>
chore(deps): update github.com/timakin/bodyclose digest to 73d1f95 (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7845">#7845</a>)</li>
<li><a
href="fdad1eb7f3"><code>fdad1eb</code></a>
chore(deps): update module github.com/grpc-ecosystem/grpc-gateway/v2 to
v2.27...</li>
<li><a
href="c46d3bac18"><code>c46d3ba</code></a>
chore(deps): update golang.org/x/telemetry digest to fcf36f6 (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7843">#7843</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/open-telemetry/opentelemetry-go/compare/v1.38.0...v1.40.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=go.opentelemetry.io/otel/sdk&package-manager=go_modules&previous-version=1.38.0&new-version=1.40.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Averi Kitsch <akitsch@google.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
Co-authored-by: Yuan Teoh <yuanteoh@google.com>
2026-03-09 22:40:34 +00:00
Yuan Teoh
cd8e46774b ci: temporarily disable bigquery integration tests (#2688) 2026-03-09 22:11:02 +00:00
Wenxin Du
f29f719ab0 test(source/cockroachdb): migrate integration tests to testcontainers (#2672)
This PR migrates the CockroachDB integration tests from relying on an
external persistent database instance to using local, ephemeral Docker
containers via `testcontainers-go/modules/cockroachdb`.
It will spin up an isolated `cockroachdb/cockroach:latest-v23.1`
container for each test run.
2026-03-09 10:41:36 -04:00
dependabot[bot]
2d79660378 chore(deps): bump express-rate-limit from 8.2.1 to 8.3.0 in /docs/en/getting-started/quickstart/js/adk (#2657)
Bumps
[express-rate-limit](https://github.com/express-rate-limit/express-rate-limit)
from 8.2.1 to 8.3.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/express-rate-limit/express-rate-limit/releases">express-rate-limit's
releases</a>.</em></p>
<blockquote>
<h2>v8.3.0</h2>
<p>You can view the changelog <a
href="https://express-rate-limit.mintlify.app/reference/changelog">here</a>.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="9c90752747"><code>9c90752</code></a>
ci: setup oidc connect with npm for automatatic publish</li>
<li><a
href="e4477fabff"><code>e4477fa</code></a>
8.3.0</li>
<li><a
href="06d73405db"><code>06d7340</code></a>
docs: add changelog for 8.3.0</li>
<li><a
href="14e53888cd"><code>14e5388</code></a>
fix: handle ipv4 mapped to ipv6 (ghsa-46wh-pxpv-q5gq)</li>
<li><a
href="2767a95493"><code>2767a95</code></a>
chore(deps-dev): bump the development-dependencies group across 1
directory w...</li>
<li><a
href="f400c7fdb7"><code>f400c7f</code></a>
chore(deps-dev): bump the development-dependencies group with 2 updates
(<a
href="https://redirect.github.com/express-rate-limit/express-rate-limit/issues/603">#603</a>)</li>
<li><a
href="4e4884c45b"><code>4e4884c</code></a>
chore(deps-dev): bump the development-dependencies group across 1
directory w...</li>
<li><a
href="fadbccbf37"><code>fadbccb</code></a>
formatting</li>
<li><a
href="7b57b95599"><code>7b57b95</code></a>
biome migration</li>
<li><a
href="88a1f7f791"><code>88a1f7f</code></a>
docs: typo fix</li>
<li>Additional commits viewable in <a
href="https://github.com/express-rate-limit/express-rate-limit/compare/v8.2.1...v8.3.0">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a
href="https://www.npmjs.com/~gamemaker1">gamemaker1</a>, a new releaser
for express-rate-limit since your current version.</p>
</details>
<details>
<summary>Attestation changes</summary>
<p>This version has no provenance attestation, while the previous
version (8.2.1) was attested. Review the <a
href="https://www.npmjs.com/package/express-rate-limit?activeTab=versions">package
versions</a> before updating.</p>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=express-rate-limit&package-manager=npm_and_yarn&previous-version=8.2.1&new-version=8.3.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-03-07 10:57:55 +05:30
Anubhav Dhawan
81699a375b fix(oracle): update oracle-execute-sql tool interface to match source signature (#2627)
## Description

This PR fixes a critical signature mismatch that caused all
`oracle-execute-sql` tool invocations to fail with an incompatible
source type error (`500` Internal Server Error).

In a previous PR
(https://github.com/googleapis/genai-toolbox/pull/2323), the `RunSQL`
method in the Oracle Source was updated to include a `readOnly` bool
parameter to support DML operations for the `oracle-sql` tool:

However, the `oracle-execute-sql` tool's required interface
(`compatibleSource`) was inadvertently left unchanged, still expecting
the old 3-argument signature. Because Go interfaces are satisfied
implicitly, the updated Oracle source no longer implemented the
`oracle-execute-sql` tool's interface, causing
`tools.GetCompatibleSource` to reject it at runtime during invocation.

🛠️ Fixes https://github.com/googleapis/genai-toolbox/issues/2614
2026-03-07 00:22:50 +05:30
dependabot[bot]
a182b056e4 chore(deps): bump hono from 4.12.2 to 4.12.5 in /docs/en/samples/pre_post_processing/js/adk (#2632)
Bumps [hono](https://github.com/honojs/hono) from 4.12.2 to 4.12.5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/honojs/hono/releases">hono's
releases</a>.</em></p>
<blockquote>
<h2>v4.12.5</h2>
<h2>What's Changed</h2>
<ul>
<li>fix(request): return <code>string | undefined</code> from param()
when path type is any by <a
href="https://github.com/andrewdamelio"><code>@​andrewdamelio</code></a>
in <a
href="https://redirect.github.com/honojs/hono/pull/4723">honojs/hono#4723</a></li>
<li>fix(jwt): validate token format in decode and decodeHeader functions
by <a
href="https://github.com/otoneko1102"><code>@​otoneko1102</code></a> in
<a
href="https://redirect.github.com/honojs/hono/pull/4752">honojs/hono#4752</a></li>
<li>fix(jsx): Fix &quot;Invalid state: Controller is already
closed&quot; by <a
href="https://github.com/gaearon"><code>@​gaearon</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4770">honojs/hono#4770</a></li>
<li>chore(eslint): upgrade <code>@hono/eslint-config</code> by <a
href="https://github.com/BarryThePenguin"><code>@​BarryThePenguin</code></a>
in <a
href="https://redirect.github.com/honojs/hono/pull/4781">honojs/hono#4781</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/andrewdamelio"><code>@​andrewdamelio</code></a>
made their first contribution in <a
href="https://redirect.github.com/honojs/hono/pull/4723">honojs/hono#4723</a></li>
<li><a
href="https://github.com/otoneko1102"><code>@​otoneko1102</code></a>
made their first contribution in <a
href="https://redirect.github.com/honojs/hono/pull/4752">honojs/hono#4752</a></li>
<li><a href="https://github.com/gaearon"><code>@​gaearon</code></a> made
their first contribution in <a
href="https://redirect.github.com/honojs/hono/pull/4770">honojs/hono#4770</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/honojs/hono/compare/v4.12.4...v4.12.5">https://github.com/honojs/hono/compare/v4.12.4...v4.12.5</a></p>
<h2>v4.12.4</h2>
<h2>Security fixes</h2>
<p>This release includes fixes for the following security issues:</p>
<h3>SSE Control Field Injection</h3>
<p>Affects: <code>streamSSE()</code> in Streaming Helper. Fixes
injection of unintended SSE fields by rejecting CR/LF characters in
<code>event</code>, <code>id</code>, and <code>retry</code>. <a
href="https://github.com/honojs/hono/security/advisories/GHSA-p6xx-57qc-3wxr">https://github.com/honojs/hono/security/advisories/GHSA-p6xx-57qc-3wxr</a></p>
<h3>Cookie Attribute Injection in <code>setCookie()</code></h3>
<p>Affects: <code>setCookie()</code> from <code>hono/cookie</code>.
Fixes cookie attribute manipulation by rejecting <code>;</code>,
<code>\r</code>, and <code>\n</code> in <code>domain</code> and
<code>path</code> options. <a
href="https://github.com/honojs/hono/security/advisories/GHSA-5pq2-9x2x-5p6w">https://github.com/honojs/hono/security/advisories/GHSA-5pq2-9x2x-5p6w</a></p>
<h3>Middleware Bypass in Serve Static</h3>
<p>Affects: Serve Static middleware. Fixes inconsistent URL decoding
that could allow protected static resources to be accessed without
triggering route-based middleware. <a
href="https://github.com/honojs/hono/security/advisories/GHSA-q5qw-h33p-qvwr">https://github.com/honojs/hono/security/advisories/GHSA-q5qw-h33p-qvwr</a></p>
<p>Users who uses Strreaming Helper, Cookie utility, and Serve Static
are strongly encouraged to upgrade to this version.</p>
<hr />
<h2>Other changes</h2>
<ul>
<li>fix(client): preserve route schema in ApplyGlobalResponse by <a
href="https://github.com/agumy"><code>@​agumy</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4777">honojs/hono#4777</a></li>
<li>fix(utils/url): specify the return type of <code>tryDecodeURI</code>
by <a href="https://github.com/yusukebe"><code>@​yusukebe</code></a> in
<a
href="https://redirect.github.com/honojs/hono/pull/4779">honojs/hono#4779</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/agumy"><code>@​agumy</code></a> made
their first contribution in <a
href="https://redirect.github.com/honojs/hono/pull/4777">honojs/hono#4777</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/honojs/hono/compare/v4.12.3...v4.12.4">https://github.com/honojs/hono/compare/v4.12.3...v4.12.4</a></p>
<h2>v4.12.3</h2>
<h2>What's Changed</h2>
<ul>
<li>fix(validator): prevent type diff bug in form data parsing by <a
href="https://github.com/EdamAme-x"><code>@​EdamAme-x</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4753">honojs/hono#4753</a></li>
<li>fix(jwt): use <code>Math.floor</code> instead of bitwise OR for safe
timestamp by <a
href="https://github.com/EdamAme-x"><code>@​EdamAme-x</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4754">honojs/hono#4754</a></li>
<li>fix(jwt): fix <code>JwtVariables</code> for
<code>ContextVariableMap</code> by <a
href="https://github.com/yusukebe"><code>@​yusukebe</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4764">honojs/hono#4764</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="18cc595fc2"><code>18cc595</code></a>
4.12.5</li>
<li><a
href="5d59ac770b"><code>5d59ac7</code></a>
chore(eslint): upgrade <code>@hono/eslint-config</code> (<a
href="https://redirect.github.com/honojs/hono/issues/4781">#4781</a>)</li>
<li><a
href="b8cff18905"><code>b8cff18</code></a>
fix(jsx): Fix &quot;Invalid state: Controller is already closed&quot;
(<a
href="https://redirect.github.com/honojs/hono/issues/4770">#4770</a>)</li>
<li><a
href="8c4d7f3d2f"><code>8c4d7f3</code></a>
fix(jwt): validate token format in decode and decodeHeader functions (<a
href="https://redirect.github.com/honojs/hono/issues/4752">#4752</a>)</li>
<li><a
href="0f499152ee"><code>0f49915</code></a>
fix(request): return <code>string | undefined</code> from param() when
path type is any ...</li>
<li><a
href="19d20d23a2"><code>19d20d2</code></a>
4.12.4</li>
<li><a
href="44ae0c8cc4"><code>44ae0c8</code></a>
Merge commit from fork</li>
<li><a
href="f4123ed9ea"><code>f4123ed</code></a>
Merge commit from fork</li>
<li><a
href="80a9837904"><code>80a9837</code></a>
fix(utils/url): specify the return type of <code>tryDecodeURI</code> (<a
href="https://redirect.github.com/honojs/hono/issues/4779">#4779</a>)</li>
<li><a
href="6a0607a929"><code>6a0607a</code></a>
Merge commit from fork</li>
<li>Additional commits viewable in <a
href="https://github.com/honojs/hono/compare/v4.12.2...v4.12.5">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=hono&package-manager=npm_and_yarn&previous-version=4.12.2&new-version=4.12.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-03-06 13:26:29 +05:30
dependabot[bot]
80ba0a38ef chore(deps): bump @hono/node-server from 1.19.9 to 1.19.10 in /docs/en/getting-started/quickstart/js/adk (#2631)
Bumps [@hono/node-server](https://github.com/honojs/node-server) from
1.19.9 to 1.19.10.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/honojs/node-server/releases"><code>@​hono/node-server</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v1.19.10</h2>
<h2>Security Fix</h2>
<p>Fixed an authorization bypass in Serve Static Middleware caused by
inconsistent URL decoding (<code>%2F</code> handling) between the router
and static file resolution. Users of Serve Static Middleware are
encouraged to upgrade to this version.</p>
<p>See GHSA-wc8c-qw6v-h7f6 for details.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="2f8ca3665f"><code>2f8ca36</code></a>
1.19.10</li>
<li><a
href="455015be16"><code>455015b</code></a>
Merge commit from fork</li>
<li><a
href="cc05c48d8e"><code>cc05c48</code></a>
chore: add benchmark for comparing with npm and local (dev) (<a
href="https://redirect.github.com/honojs/node-server/issues/305">#305</a>)</li>
<li><a
href="58c4412152"><code>58c4412</code></a>
chore: Adding LICENSE file with MIT license referenced in README.md (<a
href="https://redirect.github.com/honojs/node-server/issues/297">#297</a>)</li>
<li><a
href="b1daa4cfb3"><code>b1daa4c</code></a>
docs(readme): add <a
href="https://github.com/usualoma"><code>@​usualoma</code></a> as an
author (<a
href="https://redirect.github.com/honojs/node-server/issues/300">#300</a>)</li>
<li>See full diff in <a
href="https://github.com/honojs/node-server/compare/v1.19.9...v1.19.10">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@hono/node-server&package-manager=npm_and_yarn&previous-version=1.19.9&new-version=1.19.10)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-03-06 13:18:20 +05:30
dependabot[bot]
6efb7bad58 chore(deps): bump @hono/node-server from 1.19.9 to 1.19.10 in /docs/en/samples/pre_post_processing/js/adk (#2633)
Bumps [@hono/node-server](https://github.com/honojs/node-server) from
1.19.9 to 1.19.10.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/honojs/node-server/releases"><code>@​hono/node-server</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v1.19.10</h2>
<h2>Security Fix</h2>
<p>Fixed an authorization bypass in Serve Static Middleware caused by
inconsistent URL decoding (<code>%2F</code> handling) between the router
and static file resolution. Users of Serve Static Middleware are
encouraged to upgrade to this version.</p>
<p>See GHSA-wc8c-qw6v-h7f6 for details.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="2f8ca3665f"><code>2f8ca36</code></a>
1.19.10</li>
<li><a
href="455015be16"><code>455015b</code></a>
Merge commit from fork</li>
<li><a
href="cc05c48d8e"><code>cc05c48</code></a>
chore: add benchmark for comparing with npm and local (dev) (<a
href="https://redirect.github.com/honojs/node-server/issues/305">#305</a>)</li>
<li><a
href="58c4412152"><code>58c4412</code></a>
chore: Adding LICENSE file with MIT license referenced in README.md (<a
href="https://redirect.github.com/honojs/node-server/issues/297">#297</a>)</li>
<li><a
href="b1daa4cfb3"><code>b1daa4c</code></a>
docs(readme): add <a
href="https://github.com/usualoma"><code>@​usualoma</code></a> as an
author (<a
href="https://redirect.github.com/honojs/node-server/issues/300">#300</a>)</li>
<li>See full diff in <a
href="https://github.com/honojs/node-server/compare/v1.19.9...v1.19.10">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@hono/node-server&package-manager=npm_and_yarn&previous-version=1.19.9&new-version=1.19.10)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
Co-authored-by: Twisha Bansal <twishabansal07@gmail.com>
2026-03-06 13:14:14 +05:30
dependabot[bot]
129958ef39 chore(deps): bump hono from 4.12.2 to 4.12.5 in /docs/en/getting-started/quickstart/js/adk (#2630)
Bumps [hono](https://github.com/honojs/hono) from 4.12.2 to 4.12.5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/honojs/hono/releases">hono's
releases</a>.</em></p>
<blockquote>
<h2>v4.12.5</h2>
<h2>What's Changed</h2>
<ul>
<li>fix(request): return <code>string | undefined</code> from param()
when path type is any by <a
href="https://github.com/andrewdamelio"><code>@​andrewdamelio</code></a>
in <a
href="https://redirect.github.com/honojs/hono/pull/4723">honojs/hono#4723</a></li>
<li>fix(jwt): validate token format in decode and decodeHeader functions
by <a
href="https://github.com/otoneko1102"><code>@​otoneko1102</code></a> in
<a
href="https://redirect.github.com/honojs/hono/pull/4752">honojs/hono#4752</a></li>
<li>fix(jsx): Fix &quot;Invalid state: Controller is already
closed&quot; by <a
href="https://github.com/gaearon"><code>@​gaearon</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4770">honojs/hono#4770</a></li>
<li>chore(eslint): upgrade <code>@hono/eslint-config</code> by <a
href="https://github.com/BarryThePenguin"><code>@​BarryThePenguin</code></a>
in <a
href="https://redirect.github.com/honojs/hono/pull/4781">honojs/hono#4781</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/andrewdamelio"><code>@​andrewdamelio</code></a>
made their first contribution in <a
href="https://redirect.github.com/honojs/hono/pull/4723">honojs/hono#4723</a></li>
<li><a
href="https://github.com/otoneko1102"><code>@​otoneko1102</code></a>
made their first contribution in <a
href="https://redirect.github.com/honojs/hono/pull/4752">honojs/hono#4752</a></li>
<li><a href="https://github.com/gaearon"><code>@​gaearon</code></a> made
their first contribution in <a
href="https://redirect.github.com/honojs/hono/pull/4770">honojs/hono#4770</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/honojs/hono/compare/v4.12.4...v4.12.5">https://github.com/honojs/hono/compare/v4.12.4...v4.12.5</a></p>
<h2>v4.12.4</h2>
<h2>Security fixes</h2>
<p>This release includes fixes for the following security issues:</p>
<h3>SSE Control Field Injection</h3>
<p>Affects: <code>streamSSE()</code> in Streaming Helper. Fixes
injection of unintended SSE fields by rejecting CR/LF characters in
<code>event</code>, <code>id</code>, and <code>retry</code>. <a
href="https://github.com/honojs/hono/security/advisories/GHSA-p6xx-57qc-3wxr">https://github.com/honojs/hono/security/advisories/GHSA-p6xx-57qc-3wxr</a></p>
<h3>Cookie Attribute Injection in <code>setCookie()</code></h3>
<p>Affects: <code>setCookie()</code> from <code>hono/cookie</code>.
Fixes cookie attribute manipulation by rejecting <code>;</code>,
<code>\r</code>, and <code>\n</code> in <code>domain</code> and
<code>path</code> options. <a
href="https://github.com/honojs/hono/security/advisories/GHSA-5pq2-9x2x-5p6w">https://github.com/honojs/hono/security/advisories/GHSA-5pq2-9x2x-5p6w</a></p>
<h3>Middleware Bypass in Serve Static</h3>
<p>Affects: Serve Static middleware. Fixes inconsistent URL decoding
that could allow protected static resources to be accessed without
triggering route-based middleware. <a
href="https://github.com/honojs/hono/security/advisories/GHSA-q5qw-h33p-qvwr">https://github.com/honojs/hono/security/advisories/GHSA-q5qw-h33p-qvwr</a></p>
<p>Users who uses Strreaming Helper, Cookie utility, and Serve Static
are strongly encouraged to upgrade to this version.</p>
<hr />
<h2>Other changes</h2>
<ul>
<li>fix(client): preserve route schema in ApplyGlobalResponse by <a
href="https://github.com/agumy"><code>@​agumy</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4777">honojs/hono#4777</a></li>
<li>fix(utils/url): specify the return type of <code>tryDecodeURI</code>
by <a href="https://github.com/yusukebe"><code>@​yusukebe</code></a> in
<a
href="https://redirect.github.com/honojs/hono/pull/4779">honojs/hono#4779</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/agumy"><code>@​agumy</code></a> made
their first contribution in <a
href="https://redirect.github.com/honojs/hono/pull/4777">honojs/hono#4777</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/honojs/hono/compare/v4.12.3...v4.12.4">https://github.com/honojs/hono/compare/v4.12.3...v4.12.4</a></p>
<h2>v4.12.3</h2>
<h2>What's Changed</h2>
<ul>
<li>fix(validator): prevent type diff bug in form data parsing by <a
href="https://github.com/EdamAme-x"><code>@​EdamAme-x</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4753">honojs/hono#4753</a></li>
<li>fix(jwt): use <code>Math.floor</code> instead of bitwise OR for safe
timestamp by <a
href="https://github.com/EdamAme-x"><code>@​EdamAme-x</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4754">honojs/hono#4754</a></li>
<li>fix(jwt): fix <code>JwtVariables</code> for
<code>ContextVariableMap</code> by <a
href="https://github.com/yusukebe"><code>@​yusukebe</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4764">honojs/hono#4764</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="18cc595fc2"><code>18cc595</code></a>
4.12.5</li>
<li><a
href="5d59ac770b"><code>5d59ac7</code></a>
chore(eslint): upgrade <code>@hono/eslint-config</code> (<a
href="https://redirect.github.com/honojs/hono/issues/4781">#4781</a>)</li>
<li><a
href="b8cff18905"><code>b8cff18</code></a>
fix(jsx): Fix &quot;Invalid state: Controller is already closed&quot;
(<a
href="https://redirect.github.com/honojs/hono/issues/4770">#4770</a>)</li>
<li><a
href="8c4d7f3d2f"><code>8c4d7f3</code></a>
fix(jwt): validate token format in decode and decodeHeader functions (<a
href="https://redirect.github.com/honojs/hono/issues/4752">#4752</a>)</li>
<li><a
href="0f499152ee"><code>0f49915</code></a>
fix(request): return <code>string | undefined</code> from param() when
path type is any ...</li>
<li><a
href="19d20d23a2"><code>19d20d2</code></a>
4.12.4</li>
<li><a
href="44ae0c8cc4"><code>44ae0c8</code></a>
Merge commit from fork</li>
<li><a
href="f4123ed9ea"><code>f4123ed</code></a>
Merge commit from fork</li>
<li><a
href="80a9837904"><code>80a9837</code></a>
fix(utils/url): specify the return type of <code>tryDecodeURI</code> (<a
href="https://redirect.github.com/honojs/hono/issues/4779">#4779</a>)</li>
<li><a
href="6a0607a929"><code>6a0607a</code></a>
Merge commit from fork</li>
<li>Additional commits viewable in <a
href="https://github.com/honojs/hono/compare/v4.12.2...v4.12.5">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=hono&package-manager=npm_and_yarn&previous-version=4.12.2&new-version=4.12.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-03-06 11:06:29 +05:30
Mend Renovate
056912a5fa chore(deps): update actions/setup-node digest to 53b8394 (#2628)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/setup-node](https://redirect.github.com/actions/setup-node)
([changelog](6044e13b5d..53b83947a5))
| action | digest | `6044e13` → `53b8394` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4xIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
2026-03-06 10:50:36 +05:30
Mend Renovate
f109d729a6 chore(deps): update github actions (#2563)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/setup-go](https://redirect.github.com/actions/setup-go) |
action | minor | `v6.2.0` → `v6.3.0` |
|
[lycheeverse/lychee-action](https://redirect.github.com/lycheeverse/lychee-action)
([changelog](a8c4c7cb88..8646ba3053))
| action | digest | `a8c4c7c` → `8646ba3` |

---

### Release Notes

<details>
<summary>actions/setup-go (actions/setup-go)</summary>

###
[`v6.3.0`](https://redirect.github.com/actions/setup-go/compare/v6.2.0...v6.3.0)

[Compare
Source](https://redirect.github.com/actions/setup-go/compare/v6.2.0...v6.3.0)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4zMi4wIiwidXBkYXRlZEluVmVyIjoiNDMuNDMuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-03-04 19:50:40 +00:00
Bryan Thompson
b7a5f80b42 feat: Add tool annotations to MongoDB tools for improved LLM understanding (#2219)
## Summary

Adds MCP tool annotations (`readOnlyHint`, `destructiveHint`) to all 9
MongoDB tools to help LLMs better understand tool behavior and make
safer decisions.

## Changes

| Tool | Annotation |
|------|------------|
| mongodb-find | `readOnlyHint: true` |
| mongodb-find-one | `readOnlyHint: true` |
| mongodb-aggregate | `readOnlyHint: true` |
| mongodb-insert-one | `destructiveHint: true` |
| mongodb-insert-many | `destructiveHint: true` |
| mongodb-update-one | `destructiveHint: true` |
| mongodb-update-many | `destructiveHint: true` |
| mongodb-delete-one | `destructiveHint: true` |
| mongodb-delete-many | `destructiveHint: true` |

## Implementation

Each tool now:
1. Has an `Annotations` field in its Config struct for YAML
configurability
2. Provides default annotations if not explicitly configured
3. Passes annotations to `GetMcpManifest()` instead of `nil`

This follows the exact pattern established by the Looker tools (e.g.,
`lookergetconnectionschemas`, `lookerupdateprojectfile`).

## Why This Matters

- **Semantic metadata**: Annotations provide information beyond just the
tool description
- **Safety signals**: `readOnlyHint` tells LLMs a tool is safe to call
without side effects
- **Destructive awareness**: `destructiveHint` signals LLMs should be
more careful before executing
- **Better tool selection**: LLMs can prioritize read-only tools for
information gathering
- **MCP compliance**: Follows the [MCP tool annotations
specification](https://modelcontextprotocol.io/specification/2025-06-18/schema#toolannotations)

## Testing

- [ ] CI builds successfully
- [ ] `tools/list` returns annotations in MCP response

## Files Changed

- `internal/tools/mongodb/mongodbfind/mongodbfind.go`
- `internal/tools/mongodb/mongodbfindone/mongodbfindone.go`
- `internal/tools/mongodb/mongodbaggregate/mongodbaggregate.go`
- `internal/tools/mongodb/mongodbinsertone/mongodbinsertone.go`
- `internal/tools/mongodb/mongodbinsertmany/mongodbinsertmany.go`
- `internal/tools/mongodb/mongodbupdateone/mongodbupdateone.go`
- `internal/tools/mongodb/mongodbupdatemany/mongodbupdatemany.go`
- `internal/tools/mongodb/mongodbdeleteone/mongodbdeleteone.go`
- `internal/tools/mongodb/mongodbdeletemany/mongodbdeletemany.go`

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: triepod-ai <199543909+triepod-ai@users.noreply.github.com>
Co-authored-by: bryankthompson <199543909+bryankthompson@users.noreply.github.com>
Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2026-03-04 12:42:43 -05:00
Dave Borowitz
a554298535 feat(serverless-spark): add list/get sessions commands (#2576)
## Description

Adds commands for Serverless Spark sessions analogous to existing
list/get commands for batches.

Unlike batches, we don't plan to add create session commands, as these
are generally only created via the Jupyter protocol. Agents will need to
have other ways to create sessions, for example by interacting directly
with an IDE like Jupyter Lab or VS Code, but those won't be part of MCP
Toolbox.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Part of #2405

Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2026-03-04 03:12:57 +00:00
Dave Borowitz
a8edb7911e test(serverless-spark): run tests sequentially for CI (#2603)
Running tests in parallel consumes more GCE CPU quota, and we're
occasionally getting flakes due to exceeding the default. This still may
be the right tradeoff for speed of interactive development, but these
aren't (yet) the slowest integration tests, so running sequentially will
preserve quota without increasing CI walltime.

## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-03-03 17:23:21 -05:00
dependabot[bot]
99b2a8305c chore(deps): bump filippo.io/edwards25519 from 1.1.0 to 1.1.1 (#2516)
Bumps
[filippo.io/edwards25519](https://github.com/FiloSottile/edwards25519)
from 1.1.0 to 1.1.1.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d1c650afb9"><code>d1c650a</code></a>
extra: initialize receiver in MultiScalarMult</li>
<li>See full diff in <a
href="https://github.com/FiloSottile/edwards25519/compare/v1.1.0...v1.1.1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=filippo.io/edwards25519&package-manager=go_modules&previous-version=1.1.0&new-version=1.1.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-03-03 19:20:03 +00:00
Marlon Barreto
c88a62dcf4 fix(server/mcp): scope defer span.End inside loop iteration (#2558)
## Description

In `readInputStream()`, `defer span.End()` is called inside a `for`
loop. Since `defer` schedules execution when the enclosing **function**
returns (not the current loop iteration), all spans created per message
accumulate without ever being ended for the lifetime of the stdio
session.

For a long-lived stdio server, this means:
- **Memory leak**: span objects accumulate indefinitely
- **Incorrect traces**: spans are never properly closed, producing
misleading telemetry data

## Changes

Wrap the per-message processing logic in an immediately invoked function
expression (IIFE), so `defer span.End()` correctly fires at the end of
each iteration. This follows the same pattern already used in
`InitializeConfigs` (`server.go` lines 85-98) for scoping spans inside
loops.

## Test

All existing tests pass. The `TestStdioSession` test exercises
`readLine` and `write` on the stdio session. The `readInputStream` loop
is covered by the existing MCP endpoint tests that exercise the full
message processing pipeline.

Fixes #2549
2026-03-03 00:47:10 +00:00
release-please[bot]
81253a0bd7 chore(main): release 0.28.0 (#2472)
🤖 I have created a release *beep* *boop*
---


##
[0.28.0](https://github.com/googleapis/genai-toolbox/compare/v0.27.0...v0.28.0)
(2026-03-02)


### Features

* Add polling system to dynamic reloading
([#2466](https://github.com/googleapis/genai-toolbox/issues/2466))
([fcaac9b](fcaac9bb95))
* Added basic template for sdks doc migrate
([#1961](https://github.com/googleapis/genai-toolbox/issues/1961))
([87f2eaf](87f2eaf79c))
* **dataproc:** Add dataproc source and list/get clusters/jobs tools
([#2407](https://github.com/googleapis/genai-toolbox/issues/2407))
([cc05e57](cc05e5745d))
* **sources/postgres:** Add configurable pgx query execution mode
([#2477](https://github.com/googleapis/genai-toolbox/issues/2477))
([57b77bc](57b77bca09))
* **sources/redis:** Add TLS support for Redis connections
([#2432](https://github.com/googleapis/genai-toolbox/issues/2432))
([d6af290](d6af2907fd))
* **tools/looker:** Enable Get All Lookml Tests, Run LookML Tests, and
Create View From Table tools for Looker
([#2522](https://github.com/googleapis/genai-toolbox/issues/2522))
([e01139a](e01139a902))
* **tools/looker:** Tools to list/create/delete directories
([#2488](https://github.com/googleapis/genai-toolbox/issues/2488))
([0036d8c](0036d8c358))
* **ui:** Make tool list panel resizable
([#2253](https://github.com/googleapis/genai-toolbox/issues/2253))
([276cf60](276cf604a2))


### Bug Fixes

* **ci:** Add path for forked PR unit test runs
([#2540](https://github.com/googleapis/genai-toolbox/issues/2540))
([04dd2a7](04dd2a7760))
* Deflake alloydb omni
([#2431](https://github.com/googleapis/genai-toolbox/issues/2431))
([62b8309](62b830987d))
* **docs/adk:** Resolve dependency duplication
([#2418](https://github.com/googleapis/genai-toolbox/issues/2418))
([4d44abb](4d44abb463))
* **docs/langchain:** Fix core at 0.3.0 and align compatible
dependencies
([#2426](https://github.com/googleapis/genai-toolbox/issues/2426))
([36edfd3](36edfd3d50))
* Enforce required validation for explicit null parameter values
([#2519](https://github.com/googleapis/genai-toolbox/issues/2519))
([d5e9512](d5e9512a23))
* **oracle:** Enable DML operations and resolve incorrect array type
error ([#2323](https://github.com/googleapis/genai-toolbox/issues/2323))
([72146a4](72146a4b16))
* **server/mcp:** Guard nil dereference in sseManager.get
([#2557](https://github.com/googleapis/genai-toolbox/issues/2557))
([e534196](e534196303)),
closes [#2548](https://github.com/googleapis/genai-toolbox/issues/2548)
* **tests/postgres:** Implement uuid-based isolation and reliable
resource cleanup
([#2377](https://github.com/googleapis/genai-toolbox/issues/2377))
([8a96fb1](8a96fb1a88))
* **tests/postgres:** Restore list_schemas test and implement dynamic
owner ([#2521](https://github.com/googleapis/genai-toolbox/issues/2521))
([7041e79](7041e79734))
* **tests:** Resolve LlamaIndex dependency conflict in JS quickstart
([#2597](https://github.com/googleapis/genai-toolbox/issues/2597))
([ac11f5a](ac11f5af9c))

---
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>
Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2026-03-02 23:36:26 +00:00
Wenxin Du
a60bb95d57 ci(cloudhealthcare): fix Cloud Healthcare integration tests (#2602)
- Make the DICOM stores test self-contained and not using prepopulated
test data
- Make sure the responses from list DICOM tool are status OK but do not
check for specific result due to pagination not supported. The list
result is limited to the first 100 items, so the wanted entry is not
guaranteed to be in the returned result.
2026-03-02 22:30:14 +00:00
Mend Renovate
9d140e7116 chore(deps): update dependency llamaindex to v0.12.1 (#2599)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [llamaindex](https://redirect.github.com/run-llama/LlamaIndexTS)
([source](https://redirect.github.com/run-llama/LlamaIndexTS/tree/HEAD/packages/llamaindex))
| [`0.12.0` →
`0.12.1`](https://renovatebot.com/diffs/npm/llamaindex/0.12.0/0.12.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/llamaindex/0.12.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/llamaindex/0.12.0/0.12.1?slim=true)
|

---

### Release Notes

<details>
<summary>run-llama/LlamaIndexTS (llamaindex)</summary>

###
[`v0.12.1`](https://redirect.github.com/run-llama/LlamaIndexTS/blob/HEAD/packages/llamaindex/CHANGELOG.md#0121)

[Compare
Source](https://redirect.github.com/run-llama/LlamaIndexTS/compare/llamaindex@0.12.0...llamaindex@0.12.1)

##### Patch Changes

-
[`3af5617`](https://redirect.github.com/run-llama/LlamaIndexTS/commit/3af5617):
fix undefined values in querytool

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40My4yIiwidXBkYXRlZEluVmVyIjoiNDMuNDMuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
2026-03-02 14:58:05 +05:30
Mend Renovate
5a77a187ee chore(deps): update node (#2214)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@google/adk](https://redirect.github.com/google/adk-js) | [`^0.2.0` →
`^0.4.0`](https://renovatebot.com/diffs/npm/@google%2fadk/0.2.5/0.4.0) |
![age](https://developer.mend.io/api/mc/badges/age/npm/@google%2fadk/0.4.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@google%2fadk/0.2.5/0.4.0?slim=true)
|
| [@google/adk](https://redirect.github.com/google/adk-js) | [`^0.2.5` →
`^0.4.0`](https://renovatebot.com/diffs/npm/@google%2fadk/0.2.5/0.4.0) |
![age](https://developer.mend.io/api/mc/badges/age/npm/@google%2fadk/0.4.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@google%2fadk/0.2.5/0.4.0?slim=true)
|
|
[@llamaindex/google](https://redirect.github.com/run-llama/LlamaIndexTS)
([source](https://redirect.github.com/run-llama/LlamaIndexTS/tree/HEAD/packages/providers/google))
| [`^0.3.20` →
`^0.4.0`](https://renovatebot.com/diffs/npm/@llamaindex%2fgoogle/0.3.20/0.4.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@llamaindex%2fgoogle/0.4.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@llamaindex%2fgoogle/0.3.20/0.4.0?slim=true)
|
|
[@toolbox-sdk/core](https://redirect.github.com/googleapis/mcp-toolbox-sdk-js/blob/main/packages/toolbox-core)
([source](https://redirect.github.com/googleapis/mcp-toolbox-sdk-js)) |
[`^0.1.2` →
`^0.2.0`](https://renovatebot.com/diffs/npm/@toolbox-sdk%2fcore/0.1.2/0.2.1)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@toolbox-sdk%2fcore/0.2.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@toolbox-sdk%2fcore/0.1.2/0.2.1?slim=true)
|

---

### Release Notes

<details>
<summary>google/adk-js (@&#8203;google/adk)</summary>

###
[`v0.4.0`](6aebd70acf...e95ecb4128)

[Compare
Source](6aebd70acf...e95ecb4128)

###
[`v0.3.0`](785b2dbaf6...6aebd70acf)

[Compare
Source](785b2dbaf6...6aebd70acf)

</details>

<details>
<summary>run-llama/LlamaIndexTS (@&#8203;llamaindex/google)</summary>

###
[`v0.4.0`](https://redirect.github.com/run-llama/LlamaIndexTS/blob/HEAD/packages/providers/google/CHANGELOG.md#040)

##### Minor Changes

-
[`020928c`](https://redirect.github.com/run-llama/LlamaIndexTS/commit/020928c):
respect Gemini's requests-per-minute rate limit with waits

###
[`v0.3.22`](https://redirect.github.com/run-llama/LlamaIndexTS/blob/HEAD/packages/providers/google/CHANGELOG.md#0322)

##### Patch Changes

- Updated dependencies
\[[`06f884a`](https://redirect.github.com/run-llama/LlamaIndexTS/commit/06f884a)]
-
[@&#8203;llamaindex/core](https://redirect.github.com/llamaindex/core)@&#8203;0.6.22

###
[`v0.3.21`](https://redirect.github.com/run-llama/LlamaIndexTS/blob/HEAD/packages/providers/google/CHANGELOG.md#0321)

[Compare
Source](https://redirect.github.com/run-llama/LlamaIndexTS/compare/@llamaindex/google@0.3.20...@llamaindex/google@0.3.21)

##### Patch Changes

-
[`c40adaf`](https://redirect.github.com/run-llama/LlamaIndexTS/commit/c40adaf):
Add latest google models to lib
- Updated dependencies
\[[`5da1cda`](https://redirect.github.com/run-llama/LlamaIndexTS/commit/5da1cda)]
-
[@&#8203;llamaindex/core](https://redirect.github.com/llamaindex/core)@&#8203;0.6.21

</details>

<details>
<summary>googleapis/mcp-toolbox-sdk-js
(@&#8203;toolbox-sdk/core)</summary>

###
[`v0.2.1`](6a2c11a40b...2638438b8c)

[Compare
Source](6a2c11a40b...2638438b8c)

###
[`v0.2.0`](b8028eb6d9...6a2c11a40b)

[Compare
Source](b8028eb6d9...6a2c11a40b)

###
[`v0.1.5`](c62c5a76c1...b8028eb6d9)

[Compare
Source](c62c5a76c1...b8028eb6d9)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi41OS4wIiwidXBkYXRlZEluVmVyIjoiNDMuNDMuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

---------

Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
Co-authored-by: Twisha Bansal <twishabansal07@gmail.com>
2026-03-02 14:35:29 +05:30
Twisha Bansal
ac11f5af9c fix(tests): resolve LlamaIndex dependency conflict in JS quickstart (#2597)
## Description

This PR fixes a failing quickstart-test-js presubmit (#2214) by
explicitly aligning the LlamaIndex ecosystem dependencies. The previous
configuration caused an ERESOLVE error because `@llamaindex/google`
required a specific version of `@llamaindex/core` that was conflicting
with the top-level resolution.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: Mend Renovate <bot@renovateapp.com>
2026-03-02 14:16:28 +05:30
dependabot[bot]
9d7bbea264 chore(deps): bump ajv from 8.17.1 to 8.18.0 in /docs/en/samples/pre_post_processing/js/adk (#2537)
Bumps [ajv](https://github.com/ajv-validator/ajv) from 8.17.1 to 8.18.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ajv-validator/ajv/releases">ajv's
releases</a>.</em></p>
<blockquote>
<h2>v8.18.0</h2>
<h2>What's Changed</h2>
<ul>
<li>feat: allow tree-shaking by adding <code>&quot;sideEffects&quot;:
false</code> to <code>package.json</code> by <a
href="https://github.com/josdejong"><code>@​josdejong</code></a> in <a
href="https://redirect.github.com/ajv-validator/ajv/pull/2480">ajv-validator/ajv#2480</a></li>
<li>fix: <a
href="https://redirect.github.com/ajv-validator/ajv/issues/2482">#2482</a>
Infinity and NaN serialise to null by <a
href="https://github.com/jasoniangreen"><code>@​jasoniangreen</code></a>
in <a
href="https://redirect.github.com/ajv-validator/ajv/pull/2487">ajv-validator/ajv#2487</a></li>
<li>fix: small grammatical error in managing-schemas.md by <a
href="https://github.com/monteiro-renato"><code>@​monteiro-renato</code></a>
in <a
href="https://redirect.github.com/ajv-validator/ajv/pull/2508">ajv-validator/ajv#2508</a></li>
<li>fix: typos in schema-language.md by <a
href="https://github.com/monteiro-renato"><code>@​monteiro-renato</code></a>
in <a
href="https://redirect.github.com/ajv-validator/ajv/pull/2507">ajv-validator/ajv#2507</a></li>
<li>fix(pattern): use configured RegExp engine with $data keyword to
mitigate ReDoS attacks (CVE-2025-69873) by <a
href="https://github.com/epoberezkin"><code>@​epoberezkin</code></a> in
<a
href="https://redirect.github.com/ajv-validator/ajv/pull/2586">ajv-validator/ajv#2586</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/josdejong"><code>@​josdejong</code></a>
made their first contribution in <a
href="https://redirect.github.com/ajv-validator/ajv/pull/2480">ajv-validator/ajv#2480</a></li>
<li><a
href="https://github.com/monteiro-renato"><code>@​monteiro-renato</code></a>
made their first contribution in <a
href="https://redirect.github.com/ajv-validator/ajv/pull/2508">ajv-validator/ajv#2508</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/ajv-validator/ajv/compare/v8.17.1...v8.18.0">https://github.com/ajv-validator/ajv/compare/v8.17.1...v8.18.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="142ce84b80"><code>142ce84</code></a>
8.18.0</li>
<li><a
href="720a23fa45"><code>720a23f</code></a>
fix(pattern): use configured RegExp engine with $data keyword to
mitigate ReD...</li>
<li><a
href="82735a1582"><code>82735a1</code></a>
fix: typos in schema-language.md (<a
href="https://redirect.github.com/ajv-validator/ajv/issues/2507">#2507</a>)</li>
<li><a
href="b17ec32cd9"><code>b17ec32</code></a>
fix: small grammatical error in managing-schemas.md (<a
href="https://redirect.github.com/ajv-validator/ajv/issues/2508">#2508</a>)</li>
<li><a
href="69568d0856"><code>69568d0</code></a>
fix: <a
href="https://redirect.github.com/ajv-validator/ajv/issues/2482">#2482</a>
Infinity and NaN serialise to null (<a
href="https://redirect.github.com/ajv-validator/ajv/issues/2487">#2487</a>)</li>
<li><a
href="f06766f33e"><code>f06766f</code></a>
feat: allow tree-shaking by adding ``&quot;sideEffects&quot;:
false<code>to</code>package.json` ...</li>
<li>See full diff in <a
href="https://github.com/ajv-validator/ajv/compare/v8.17.1...v8.18.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ajv&package-manager=npm_and_yarn&previous-version=8.17.1&new-version=8.18.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-03-02 13:10:26 +05:30
dependabot[bot]
a65f0614c8 chore(deps): bump qs from 6.14.1 to 6.15.0 in /docs/en/samples/pre_post_processing/js/adk (#2536)
Bumps [qs](https://github.com/ljharb/qs) from 6.14.1 to 6.15.0.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/ljharb/qs/blob/main/CHANGELOG.md">qs's
changelog</a>.</em></p>
<blockquote>
<h2><strong>6.15.0</strong></h2>
<ul>
<li>[New] <code>parse</code>: add <code>strictMerge</code> option to
wrap object/primitive conflicts in an array (<a
href="https://redirect.github.com/ljharb/qs/issues/425">#425</a>, <a
href="https://redirect.github.com/ljharb/qs/issues/122">#122</a>)</li>
<li>[Fix] <code>duplicates</code> option should not apply to bracket
notation keys (<a
href="https://redirect.github.com/ljharb/qs/issues/514">#514</a>)</li>
</ul>
<h2><strong>6.14.2</strong></h2>
<ul>
<li>[Fix] <code>parse</code>: mark overflow objects for indexed notation
exceeding <code>arrayLimit</code> (<a
href="https://redirect.github.com/ljharb/qs/issues/546">#546</a>)</li>
<li>[Fix] <code>arrayLimit</code> means max count, not max index, in
<code>combine</code>/<code>merge</code>/<code>parseArrayValue</code></li>
<li>[Fix] <code>parse</code>: throw on <code>arrayLimit</code> exceeded
with indexed notation when <code>throwOnLimitExceeded</code> is true (<a
href="https://redirect.github.com/ljharb/qs/issues/529">#529</a>)</li>
<li>[Fix] <code>parse</code>: enforce <code>arrayLimit</code> on
<code>comma</code>-parsed values</li>
<li>[Fix] <code>parse</code>: fix error message to reflect arrayLimit as
max index; remove extraneous comments (<a
href="https://redirect.github.com/ljharb/qs/issues/545">#545</a>)</li>
<li>[Robustness] avoid <code>.push</code>, use <code>void</code></li>
<li>[readme] document that <code>addQueryPrefix</code> does not add
<code>?</code> to empty output (<a
href="https://redirect.github.com/ljharb/qs/issues/418">#418</a>)</li>
<li>[readme] clarify <code>parseArrays</code> and
<code>arrayLimit</code> documentation (<a
href="https://redirect.github.com/ljharb/qs/issues/543">#543</a>)</li>
<li>[readme] replace runkit CI badge with shields.io check-runs
badge</li>
<li>[meta] fix changelog typo (<code>arrayLength</code> →
<code>arrayLimit</code>)</li>
<li>[actions] fix rebase workflow permissions</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d9b4c66303"><code>d9b4c66</code></a>
v6.15.0</li>
<li><a
href="cb41a545a3"><code>cb41a54</code></a>
[New] <code>parse</code>: add <code>strictMerge</code> option to wrap
object/primitive conflicts in...</li>
<li><a
href="88e15636da"><code>88e1563</code></a>
[Fix] <code>duplicates</code> option should not apply to bracket
notation keys</li>
<li><a
href="9d441d2704"><code>9d441d2</code></a>
Merge backport release tags v6.0.6–v6.13.3 into main</li>
<li><a
href="85cc8cac6b"><code>85cc8ca</code></a>
v6.12.5</li>
<li><a
href="ffc12aa710"><code>ffc12aa</code></a>
v6.11.4</li>
<li><a
href="0506b11e45"><code>0506b11</code></a>
[actions] update reusable workflows</li>
<li><a
href="6a37fafc75"><code>6a37faf</code></a>
[actions] update reusable workflows</li>
<li><a
href="8e8df5a3b1"><code>8e8df5a</code></a>
[Fix] fix regressions from robustness refactor</li>
<li><a
href="d60bab35a4"><code>d60bab3</code></a>
v6.10.7</li>
<li>Additional commits viewable in <a
href="https://github.com/ljharb/qs/compare/v6.14.1...v6.15.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=qs&package-manager=npm_and_yarn&previous-version=6.14.1&new-version=6.15.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-03-02 12:14:37 +05:30
dependabot[bot]
d212fee911 chore(deps): bump go.opentelemetry.io/otel/sdk from 1.39.0 to 1.40.0 in /docs/en/getting-started/quickstart/go/genkit (#2589)
Bumps
[go.opentelemetry.io/otel/sdk](https://github.com/open-telemetry/opentelemetry-go)
from 1.39.0 to 1.40.0.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md">go.opentelemetry.io/otel/sdk's
changelog</a>.</em></p>
<blockquote>
<h2>[1.40.0/0.62.0/0.16.0] 2026-02-02</h2>
<h3>Added</h3>
<ul>
<li>Add <code>AlwaysRecord</code> sampler in
<code>go.opentelemetry.io/otel/sdk/trace</code>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7724">#7724</a>)</li>
<li>Add <code>Enabled</code> method to all synchronous instrument
interfaces (<code>Float64Counter</code>,
<code>Float64UpDownCounter</code>, <code>Float64Histogram</code>,
<code>Float64Gauge</code>, <code>Int64Counter</code>,
<code>Int64UpDownCounter</code>, <code>Int64Histogram</code>,
<code>Int64Gauge</code>,) in
<code>go.opentelemetry.io/otel/metric</code>.
This stabilizes the synchronous instrument enabled feature, allowing
users to check if an instrument will process measurements before
performing computationally expensive operations. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7763">#7763</a>)</li>
<li>Add <code>go.opentelemetry.io/otel/semconv/v1.39.0</code> package.
The package contains semantic conventions from the <code>v1.39.0</code>
version of the OpenTelemetry Semantic Conventions.
See the <a
href="https://github.com/open-telemetry/opentelemetry-go/blob/main/semconv/v1.39.0/MIGRATION.md">migration
documentation</a> for information on how to upgrade from
<code>go.opentelemetry.io/otel/semconv/v1.38.0.</code> (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7783">#7783</a>,
<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7789">#7789</a>)</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Improve the concurrent performance of
<code>HistogramReservoir</code> in
<code>go.opentelemetry.io/otel/sdk/metric/exemplar</code> by 4x. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7443">#7443</a>)</li>
<li>Improve the concurrent performance of
<code>FixedSizeReservoir</code> in
<code>go.opentelemetry.io/otel/sdk/metric/exemplar</code>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7447">#7447</a>)</li>
<li>Improve performance of concurrent histogram measurements in
<code>go.opentelemetry.io/otel/sdk/metric</code>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7474">#7474</a>)</li>
<li>Improve performance of concurrent synchronous gauge measurements in
<code>go.opentelemetry.io/otel/sdk/metric</code>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7478">#7478</a>)</li>
<li>Add experimental observability metrics in
<code>go.opentelemetry.io/otel/exporters/stdout/stdoutmetric</code>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7492">#7492</a>)</li>
<li><code>Exporter</code> in
<code>go.opentelemetry.io/otel/exporters/prometheus</code> ignores
metrics with the scope
<code>go.opentelemetry.io/contrib/bridges/prometheus</code>.
This prevents scrape failures when the Prometheus exporter is
misconfigured to get data from the Prometheus bridge. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7688">#7688</a>)</li>
<li>Improve performance of concurrent exponential histogram measurements
in <code>go.opentelemetry.io/otel/sdk/metric</code>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7702">#7702</a>)</li>
<li>The <code>rpc.grpc.status_code</code> attribute in the experimental
metrics emitted from
<code>go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc</code>
is replaced with the <code>rpc.response.status_code</code> attribute to
align with the semantic conventions. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7854">#7854</a>)</li>
<li>The <code>rpc.grpc.status_code</code> attribute in the experimental
metrics emitted from
<code>go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc</code>
is replaced with the <code>rpc.response.status_code</code> attribute to
align with the semantic conventions. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7854">#7854</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix bad log message when key-value pairs are dropped because of key
duplication in <code>go.opentelemetry.io/otel/sdk/log</code>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7662">#7662</a>)</li>
<li>Fix <code>DroppedAttributes</code> on <code>Record</code> in
<code>go.opentelemetry.io/otel/sdk/log</code> to not count the
non-attribute key-value pairs dropped because of key duplication. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7662">#7662</a>)</li>
<li>Fix <code>SetAttributes</code> on <code>Record</code> in
<code>go.opentelemetry.io/otel/sdk/log</code> to not log that attributes
are dropped when they are actually not dropped. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7662">#7662</a>)</li>
<li>Fix missing <code>request.GetBody</code> in
<code>go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp</code>
to correctly handle HTTP/2 <code>GOAWAY</code> frame. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7794">#7794</a>)</li>
<li><code>WithHostID</code> detector in
<code>go.opentelemetry.io/otel/sdk/resource</code> to use full path for
<code>ioreg</code> command on Darwin (macOS). (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7818">#7818</a>)</li>
</ul>
<h3>Deprecated</h3>
<ul>
<li>Deprecate <code>go.opentelemetry.io/otel/exporters/zipkin</code>.
For more information, see the <a
href="https://opentelemetry.io/blog/2025/deprecating-zipkin-exporters/">OTel
blog post deprecating the Zipkin exporter</a>. (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7670">#7670</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a3a5317c5c"><code>a3a5317</code></a>
Release v1.40.0 (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7859">#7859</a>)</li>
<li><a
href="77785da545"><code>77785da</code></a>
chore(deps): update github/codeql-action action to v4.32.1 (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7858">#7858</a>)</li>
<li><a
href="56fa1c297b"><code>56fa1c2</code></a>
chore(deps): update module github.com/clipperhouse/uax29/v2 to v2.5.0
(<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7857">#7857</a>)</li>
<li><a
href="298cbedf25"><code>298cbed</code></a>
Upgrade semconv use to v1.39.0 (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7854">#7854</a>)</li>
<li><a
href="3264bf171b"><code>3264bf1</code></a>
refactor: modernize code (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7850">#7850</a>)</li>
<li><a
href="fd5d030c0a"><code>fd5d030</code></a>
chore(deps): update module github.com/grpc-ecosystem/grpc-gateway/v2 to
v2.27...</li>
<li><a
href="8d3b4cb250"><code>8d3b4cb</code></a>
chore(deps): update actions/cache action to v5.0.3 (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7847">#7847</a>)</li>
<li><a
href="91f7cadfca"><code>91f7cad</code></a>
chore(deps): update github.com/timakin/bodyclose digest to 73d1f95 (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7845">#7845</a>)</li>
<li><a
href="fdad1eb7f3"><code>fdad1eb</code></a>
chore(deps): update module github.com/grpc-ecosystem/grpc-gateway/v2 to
v2.27...</li>
<li><a
href="c46d3bac18"><code>c46d3ba</code></a>
chore(deps): update golang.org/x/telemetry digest to fcf36f6 (<a
href="https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7843">#7843</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/open-telemetry/opentelemetry-go/compare/v1.39.0...v1.40.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=go.opentelemetry.io/otel/sdk&package-manager=go_modules&previous-version=1.39.0&new-version=1.40.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-03-02 12:08:54 +05:30
dependabot[bot]
ced0f369b8 chore(deps): bump axios from 1.12.2 to 1.13.5 in /docs/en/getting-started/quickstart/js/genAI (#2514)
Bumps [axios](https://github.com/axios/axios) from 1.12.2 to 1.13.5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/axios/axios/releases">axios's
releases</a>.</em></p>
<blockquote>
<h2>v1.13.5</h2>
<h2>Release 1.13.5</h2>
<h3>Highlights</h3>
<ul>
<li><strong>Security:</strong> Fixed a potential <strong>Denial of
Service</strong> issue involving the <code>__proto__</code> key in
<code>mergeConfig</code>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7369">#7369</a>)</li>
<li><strong>Bug fix:</strong> Resolved an issue where
<code>AxiosError</code> could be missing the <code>status</code> field
on and after <strong>v1.13.3</strong>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7368">#7368</a>)</li>
</ul>
<h3>Changes</h3>
<h4>Security</h4>
<ul>
<li>Fix Denial of Service via <code>__proto__</code> key in
<code>mergeConfig</code>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7369">#7369</a>)</li>
</ul>
<h4>Fixes</h4>
<ul>
<li>Fix/5657. (PR <a
href="https://redirect.github.com/axios/axios/pull/7313">#7313</a>)</li>
<li>Ensure <code>status</code> is present in <code>AxiosError</code> on
and after v1.13.3. (PR <a
href="https://redirect.github.com/axios/axios/pull/7368">#7368</a>)</li>
</ul>
<h4>Features / Improvements</h4>
<ul>
<li>Add input validation to <code>isAbsoluteURL</code>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7326">#7326</a>)</li>
<li>Refactor: bump minor package versions. (PR <a
href="https://redirect.github.com/axios/axios/pull/7356">#7356</a>)</li>
</ul>
<h4>Documentation</h4>
<ul>
<li>Clarify object-check comment. (PR <a
href="https://redirect.github.com/axios/axios/pull/7323">#7323</a>)</li>
<li>Fix deprecated <code>Buffer</code> constructor usage and README
formatting. (PR <a
href="https://redirect.github.com/axios/axios/pull/7371">#7371</a>)</li>
</ul>
<h4>CI / Maintenance</h4>
<ul>
<li>Chore: fix issues with YAML. (PR <a
href="https://redirect.github.com/axios/axios/pull/7355">#7355</a>)</li>
<li>CI: update workflow YAMLs. (PR <a
href="https://redirect.github.com/axios/axios/pull/7372">#7372</a>)</li>
<li>CI: fix run condition. (PR <a
href="https://redirect.github.com/axios/axios/pull/7373">#7373</a>)</li>
<li>Dev deps: bump <code>karma-sourcemap-loader</code> from 0.3.8 to
0.4.0. (PR <a
href="https://redirect.github.com/axios/axios/pull/7360">#7360</a>)</li>
<li>Chore(release): prepare release 1.13.5. (PR <a
href="https://redirect.github.com/axios/axios/pull/7379">#7379</a>)</li>
</ul>
<h3>New Contributors</h3>
<ul>
<li><a
href="https://github.com/sachin11063"><code>@​sachin11063</code></a>
(first contribution — PR <a
href="https://redirect.github.com/axios/axios/pull/7323">#7323</a>)</li>
<li><a
href="https://github.com/asmitha-16"><code>@​asmitha-16</code></a>
(first contribution — PR <a
href="https://redirect.github.com/axios/axios/pull/7326">#7326</a>)</li>
</ul>
<p><strong>Full Changelog:</strong> <a
href="https://github.com/axios/axios/compare/v1.13.4...v1.13.5">https://github.com/axios/axios/compare/v1.13.4...v1.13.5</a></p>
<h2>v1.13.4</h2>
<h2>Overview</h2>
<p>The release addresses issues discovered in v1.13.3 and includes
significant CI/CD improvements.</p>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/axios/axios/compare/v1.13.3...v1.13.4">v1.13.3...v1.13.4</a></p>
<h2>What's New in v1.13.4</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>fix: issues with version 1.13.3</strong> (<a
href="https://redirect.github.com/axios/axios/issues/7352">#7352</a>)
(<a
href="ee90dfc28a">ee90dfc</a>)
<ul>
<li>Fixed issues discovered in v1.13.3 release</li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/axios/axios/blob/v1.x/CHANGELOG.md">axios's
changelog</a>.</em></p>
<blockquote>
<h1>Changelog</h1>
<h2><a
href="https://github.com/axios/axios/compare/v1.13.2...v1.13.3">1.13.3</a>
(2026-01-20)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>http2:</strong> Use port 443 for HTTPS connections by
default. (<a
href="https://redirect.github.com/axios/axios/issues/7256">#7256</a>)
(<a
href="d7e6065346">d7e6065</a>)</li>
<li><strong>interceptor:</strong> handle the error in the same
interceptor (<a
href="https://redirect.github.com/axios/axios/issues/6269">#6269</a>)
(<a
href="5945e40bb1">5945e40</a>)</li>
<li>main field in package.json should correspond to cjs artifacts (<a
href="https://redirect.github.com/axios/axios/issues/5756">#5756</a>)
(<a
href="7373fbff24">7373fbf</a>)</li>
<li><strong>package.json:</strong> add 'bun' package.json 'exports'
condition. Load the Node.js build in Bun instead of the browser build
(<a
href="https://redirect.github.com/axios/axios/issues/5754">#5754</a>)
(<a
href="b89217e3e9">b89217e</a>)</li>
<li>silentJSONParsing=false should throw on invalid JSON (<a
href="https://redirect.github.com/axios/axios/issues/7253">#7253</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/7257">#7257</a>)
(<a
href="7d19335e43">7d19335</a>)</li>
<li>turn AxiosError into a native error (<a
href="https://redirect.github.com/axios/axios/issues/5394">#5394</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/5558">#5558</a>)
(<a
href="1c6a86dd2c">1c6a86d</a>)</li>
<li><strong>types:</strong> add handlers to AxiosInterceptorManager
interface (<a
href="https://redirect.github.com/axios/axios/issues/5551">#5551</a>)
(<a
href="8d1271b49f">8d1271b</a>)</li>
<li><strong>types:</strong> restore AxiosError.cause type from unknown
to Error (<a
href="https://redirect.github.com/axios/axios/issues/7327">#7327</a>)
(<a
href="d8233d9e8e">d8233d9</a>)</li>
<li>unclear error message is thrown when specifying an empty proxy
authorization (<a
href="https://redirect.github.com/axios/axios/issues/6314">#6314</a>)
(<a
href="6ef867e684">6ef867e</a>)</li>
</ul>
<h3>Features</h3>
<ul>
<li>add <code>undefined</code> as a value in AxiosRequestConfig (<a
href="https://redirect.github.com/axios/axios/issues/5560">#5560</a>)
(<a
href="095033c626">095033c</a>)</li>
<li>add automatic minor and patch upgrades to dependabot (<a
href="https://redirect.github.com/axios/axios/issues/6053">#6053</a>)
(<a
href="65a7584eda">65a7584</a>)</li>
<li>add Node.js coverage script using c8 (closes <a
href="https://redirect.github.com/axios/axios/issues/7289">#7289</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/7294">#7294</a>)
(<a
href="ec9d94e9f8">ec9d94e</a>)</li>
<li>added copilot instructions (<a
href="3f83143bfe">3f83143</a>)</li>
<li>compatibility with frozen prototypes (<a
href="https://redirect.github.com/axios/axios/issues/6265">#6265</a>)
(<a
href="860e03396a">860e033</a>)</li>
<li>enhance pipeFileToResponse with error handling (<a
href="https://redirect.github.com/axios/axios/issues/7169">#7169</a>)
(<a
href="88d7884254">88d7884</a>)</li>
<li><strong>types:</strong> Intellisense for string literals in a
widened union (<a
href="https://redirect.github.com/axios/axios/issues/6134">#6134</a>)
(<a
href="f73474d02c">f73474d</a>),
closes <a
href="https://redirect.github.com//redirect.github.com/microsoft/TypeScript/issues/33471/issues/issuecomment-1376364329">microsoft/TypeScript#33471</a></li>
</ul>
<h3>Reverts</h3>
<ul>
<li>Revert &quot;fix: silentJSONParsing=false should throw on invalid
JSON (<a
href="https://redirect.github.com/axios/axios/issues/7253">#7253</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/7">#7</a>…&quot;
(<a
href="https://redirect.github.com/axios/axios/issues/7298">#7298</a>)
(<a
href="a4230f5581">a4230f5</a>),
closes <a
href="https://redirect.github.com/axios/axios/issues/7253">#7253</a> <a
href="https://redirect.github.com/axios/axios/issues/7">#7</a> <a
href="https://redirect.github.com/axios/axios/issues/7298">#7298</a></li>
<li><strong>deps:</strong> bump peter-evans/create-pull-request from 7
to 8 in the github-actions group (<a
href="https://redirect.github.com/axios/axios/issues/7334">#7334</a>)
(<a
href="2d6ad5e48b">2d6ad5e</a>)</li>
</ul>
<h3>Contributors to this release</h3>
<ul>
<li><!-- raw HTML omitted --> <a href="https://github.com/ashvin2005"
title="+1752/-4 ([#7218](https://github.com/axios/axios/issues/7218)
[#7218](https://github.com/axios/axios/issues/7218) )">Ashvin
Tiwari</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/mochinikunj"
title="+940/-12 ([#7294](https://github.com/axios/axios/issues/7294)
[#7294](https://github.com/axios/axios/issues/7294) )">Nikunj
Mochi</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/imanchalsingh"
title="+544/-102 ([#7169](https://github.com/axios/axios/issues/7169)
[#7185](https://github.com/axios/axios/issues/7185) )">Anchal
Singh</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/jasonsaayman"
title="+317/-73 ([#7334](https://github.com/axios/axios/issues/7334)
[#7298](https://github.com/axios/axios/issues/7298)
)">jasonsaayman</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/brodo"
title="+99/-120 ([#5558](https://github.com/axios/axios/issues/5558)
)">Julian Dax</a></li>
<li><!-- raw HTML omitted --> <a
href="https://github.com/AKASHDHARDUBEY" title="+167/-0
([#7287](https://github.com/axios/axios/issues/7287)
[#7288](https://github.com/axios/axios/issues/7288) )">Akash Dhar
Dubey</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/madhumitaaa"
title="+20/-68 ([#7198](https://github.com/axios/axios/issues/7198)
)">Madhumita</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/Tackoil"
title="+80/-2 ([#6269](https://github.com/axios/axios/issues/6269)
)">Tackoil</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/justindhillon"
title="+41/-41 ([#6324](https://github.com/axios/axios/issues/6324)
[#6315](https://github.com/axios/axios/issues/6315) )">Justin
Dhillon</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/Rudrxxx"
title="+71/-2 ([#7257](https://github.com/axios/axios/issues/7257)
)">Rudransh</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/WuMingDao"
title="+36/-36 ([#7215](https://github.com/axios/axios/issues/7215)
)">WuMingDao</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/codenomnom"
title="+70/-0 ([#7201](https://github.com/axios/axios/issues/7201)
[#7201](https://github.com/axios/axios/issues/7201)
)">codenomnom</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/Nandann018-ux"
title="+60/-10 ([#7272](https://github.com/axios/axios/issues/7272)
)">Nandan Acharya</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/KernelDeimos"
title="+22/-40 ([#7042](https://github.com/axios/axios/issues/7042)
)">Eric Dubé</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/tiborpilz"
title="+40/-4 ([#5551](https://github.com/axios/axios/issues/5551)
)">Tibor Pilz</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/joaoGabriel55"
title="+31/-4 ([#6314](https://github.com/axios/axios/issues/6314)
)">Gabriel Quaresma</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/turadg"
title="+23/-6 ([#6265](https://github.com/axios/axios/issues/6265)
)">Turadg Aleahmad</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="29f75425f0"><code>29f7542</code></a>
chore(release): prepare release 1.13.5 (<a
href="https://redirect.github.com/axios/axios/issues/7379">#7379</a>)</li>
<li><a
href="431c3a3614"><code>431c3a3</code></a>
ci: fix run condition (<a
href="https://redirect.github.com/axios/axios/issues/7373">#7373</a>)</li>
<li><a
href="9ff3a78ad7"><code>9ff3a78</code></a>
ci: update ymls (<a
href="https://redirect.github.com/axios/axios/issues/7372">#7372</a>)</li>
<li><a
href="265b71234c"><code>265b712</code></a>
docs: fix deprecated Buffer constructor and formatting issues in README
(<a
href="https://redirect.github.com/axios/axios/issues/7371">#7371</a>)</li>
<li><a
href="475e75a260"><code>475e75a</code></a>
feat: add input validation to isAbsoluteURL (<a
href="https://redirect.github.com/axios/axios/issues/7326">#7326</a>)</li>
<li><a
href="28c721588c"><code>28c7215</code></a>
fix: Denial of Service via <strong>proto</strong> Key in mergeConfig (<a
href="https://redirect.github.com/axios/axios/issues/7369">#7369</a>)</li>
<li><a
href="04cf01969e"><code>04cf019</code></a>
docs: clarify object check comment (<a
href="https://redirect.github.com/axios/axios/issues/7323">#7323</a>)</li>
<li><a
href="696fa753c5"><code>696fa75</code></a>
fix: status is missing in AxiosError on and after v1.13.3 (<a
href="https://redirect.github.com/axios/axios/issues/7368">#7368</a>)</li>
<li><a
href="569f028a58"><code>569f028</code></a>
fix: added a option to choose between legacy and the new
request/response int...</li>
<li><a
href="44b7c9f0c4"><code>44b7c9f</code></a>
chore(deps-dev): bump karma-sourcemap-loader (<a
href="https://redirect.github.com/axios/axios/issues/7360">#7360</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/axios/axios/compare/v1.12.2...v1.13.5">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by [GitHub Actions](<a
href="https://www.npmjs.com/~GitHub">https://www.npmjs.com/~GitHub</a>
Actions), a new releaser for axios since your current version.</p>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=axios&package-manager=npm_and_yarn&previous-version=1.12.2&new-version=1.13.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Averi Kitsch <akitsch@google.com>
Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-03-02 12:02:36 +05:30
dependabot[bot]
1edbbe1a4f chore(deps): bump axios from 1.13.4 to 1.13.5 in /docs/en/samples/pre_post_processing/js/adk (#2539)
Bumps [axios](https://github.com/axios/axios) from 1.13.4 to 1.13.5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/axios/axios/releases">axios's
releases</a>.</em></p>
<blockquote>
<h2>v1.13.5</h2>
<h2>Release 1.13.5</h2>
<h3>Highlights</h3>
<ul>
<li><strong>Security:</strong> Fixed a potential <strong>Denial of
Service</strong> issue involving the <code>__proto__</code> key in
<code>mergeConfig</code>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7369">#7369</a>)</li>
<li><strong>Bug fix:</strong> Resolved an issue where
<code>AxiosError</code> could be missing the <code>status</code> field
on and after <strong>v1.13.3</strong>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7368">#7368</a>)</li>
</ul>
<h3>Changes</h3>
<h4>Security</h4>
<ul>
<li>Fix Denial of Service via <code>__proto__</code> key in
<code>mergeConfig</code>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7369">#7369</a>)</li>
</ul>
<h4>Fixes</h4>
<ul>
<li>Fix/5657. (PR <a
href="https://redirect.github.com/axios/axios/pull/7313">#7313</a>)</li>
<li>Ensure <code>status</code> is present in <code>AxiosError</code> on
and after v1.13.3. (PR <a
href="https://redirect.github.com/axios/axios/pull/7368">#7368</a>)</li>
</ul>
<h4>Features / Improvements</h4>
<ul>
<li>Add input validation to <code>isAbsoluteURL</code>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7326">#7326</a>)</li>
<li>Refactor: bump minor package versions. (PR <a
href="https://redirect.github.com/axios/axios/pull/7356">#7356</a>)</li>
</ul>
<h4>Documentation</h4>
<ul>
<li>Clarify object-check comment. (PR <a
href="https://redirect.github.com/axios/axios/pull/7323">#7323</a>)</li>
<li>Fix deprecated <code>Buffer</code> constructor usage and README
formatting. (PR <a
href="https://redirect.github.com/axios/axios/pull/7371">#7371</a>)</li>
</ul>
<h4>CI / Maintenance</h4>
<ul>
<li>Chore: fix issues with YAML. (PR <a
href="https://redirect.github.com/axios/axios/pull/7355">#7355</a>)</li>
<li>CI: update workflow YAMLs. (PR <a
href="https://redirect.github.com/axios/axios/pull/7372">#7372</a>)</li>
<li>CI: fix run condition. (PR <a
href="https://redirect.github.com/axios/axios/pull/7373">#7373</a>)</li>
<li>Dev deps: bump <code>karma-sourcemap-loader</code> from 0.3.8 to
0.4.0. (PR <a
href="https://redirect.github.com/axios/axios/pull/7360">#7360</a>)</li>
<li>Chore(release): prepare release 1.13.5. (PR <a
href="https://redirect.github.com/axios/axios/pull/7379">#7379</a>)</li>
</ul>
<h3>New Contributors</h3>
<ul>
<li><a
href="https://github.com/sachin11063"><code>@​sachin11063</code></a>
(first contribution — PR <a
href="https://redirect.github.com/axios/axios/pull/7323">#7323</a>)</li>
<li><a
href="https://github.com/asmitha-16"><code>@​asmitha-16</code></a>
(first contribution — PR <a
href="https://redirect.github.com/axios/axios/pull/7326">#7326</a>)</li>
</ul>
<p><strong>Full Changelog:</strong> <a
href="https://github.com/axios/axios/compare/v1.13.4...v1.13.5">https://github.com/axios/axios/compare/v1.13.4...v1.13.5</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="29f75425f0"><code>29f7542</code></a>
chore(release): prepare release 1.13.5 (<a
href="https://redirect.github.com/axios/axios/issues/7379">#7379</a>)</li>
<li><a
href="431c3a3614"><code>431c3a3</code></a>
ci: fix run condition (<a
href="https://redirect.github.com/axios/axios/issues/7373">#7373</a>)</li>
<li><a
href="9ff3a78ad7"><code>9ff3a78</code></a>
ci: update ymls (<a
href="https://redirect.github.com/axios/axios/issues/7372">#7372</a>)</li>
<li><a
href="265b71234c"><code>265b712</code></a>
docs: fix deprecated Buffer constructor and formatting issues in README
(<a
href="https://redirect.github.com/axios/axios/issues/7371">#7371</a>)</li>
<li><a
href="475e75a260"><code>475e75a</code></a>
feat: add input validation to isAbsoluteURL (<a
href="https://redirect.github.com/axios/axios/issues/7326">#7326</a>)</li>
<li><a
href="28c721588c"><code>28c7215</code></a>
fix: Denial of Service via <strong>proto</strong> Key in mergeConfig (<a
href="https://redirect.github.com/axios/axios/issues/7369">#7369</a>)</li>
<li><a
href="04cf01969e"><code>04cf019</code></a>
docs: clarify object check comment (<a
href="https://redirect.github.com/axios/axios/issues/7323">#7323</a>)</li>
<li><a
href="696fa753c5"><code>696fa75</code></a>
fix: status is missing in AxiosError on and after v1.13.3 (<a
href="https://redirect.github.com/axios/axios/issues/7368">#7368</a>)</li>
<li><a
href="569f028a58"><code>569f028</code></a>
fix: added a option to choose between legacy and the new
request/response int...</li>
<li><a
href="44b7c9f0c4"><code>44b7c9f</code></a>
chore(deps-dev): bump karma-sourcemap-loader (<a
href="https://redirect.github.com/axios/axios/issues/7360">#7360</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/axios/axios/compare/v1.13.4...v1.13.5">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=axios&package-manager=npm_and_yarn&previous-version=1.13.4&new-version=1.13.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-03-02 11:57:56 +05:30
dependabot[bot]
2b26a824e1 chore(deps): bump hono from 4.12.0 to 4.12.2 in /docs/en/samples/pre_post_processing/js/adk (#2565)
Bumps [hono](https://github.com/honojs/hono) from 4.12.0 to 4.12.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/honojs/hono/releases">hono's
releases</a>.</em></p>
<blockquote>
<h2>v4.12.2</h2>
<h2>Security fix</h2>
<p>Fixed incorrect handling of <code>X-Forwarded-For</code> in the AWS
Lambda adapter behind ALB that could allow IP-based access control
bypass. The detail: <a
href="https://github.com/honojs/hono/security/advisories/GHSA-xh87-mx6m-69f3">https://github.com/honojs/hono/security/advisories/GHSA-xh87-mx6m-69f3</a></p>
<p>Thanks <a
href="https://github.com/EdamAme-x"><code>@​EdamAme-x</code></a></p>
<h2>What's Changed</h2>
<ul>
<li>fix(context): revert PR <a
href="https://redirect.github.com/honojs/hono/issues/4707">#4707</a> by
<a href="https://github.com/yusukebe"><code>@​yusukebe</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/4757">honojs/hono#4757</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/honojs/hono/compare/v4.12.1...v4.12.2">https://github.com/honojs/hono/compare/v4.12.1...v4.12.2</a></p>
<h2>v4.12.1</h2>
<h2>What's Changed</h2>
<ul>
<li>fix(client): export <code>ApplyGlobalResponse</code> from
<code>hono/client</code> by <a
href="https://github.com/sushichan044"><code>@​sushichan044</code></a>
in <a
href="https://redirect.github.com/honojs/hono/pull/4743">honojs/hono#4743</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/honojs/hono/compare/v4.12.0...v4.12.1">https://github.com/honojs/hono/compare/v4.12.0...v4.12.1</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="df97e5f497"><code>df97e5f</code></a>
4.12.2</li>
<li><a
href="212c64f2c2"><code>212c64f</code></a>
fix(context): revert PR <a
href="https://redirect.github.com/honojs/hono/issues/4707">#4707</a> (<a
href="https://redirect.github.com/honojs/hono/issues/4757">#4757</a>)</li>
<li><a
href="5cc8f8f79e"><code>5cc8f8f</code></a>
ci: apply automated fixes</li>
<li><a
href="41adbf56e2"><code>41adbf5</code></a>
Merge commit from fork</li>
<li><a
href="2de30d7c2a"><code>2de30d7</code></a>
4.12.1</li>
<li><a
href="91ef235f9f"><code>91ef235</code></a>
fix(client): export <code>ApplyGlobalResponse</code> from
<code>hono/client</code> (<a
href="https://redirect.github.com/honojs/hono/issues/4743">#4743</a>)</li>
<li>See full diff in <a
href="https://github.com/honojs/hono/compare/v4.12.0...v4.12.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=hono&package-manager=npm_and_yarn&previous-version=4.12.0&new-version=4.12.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-03-02 11:52:08 +05:30
Niraj Nandre
4d44abb463 fix(docs/adk): Resolve dependency duplication (#2418)
## Description
This pull request addresses and resolves dependency issues within the
quickstart documentation for both the ADK and LlamaIndex JavaScript
samples. The changes involve updating package versions to their latest
compatible releases, ensuring that developers following these guides
encounter a stable and functional environment. The updates span across
direct and transitive dependencies, reflecting a comprehensive refresh
of the project's dependency tree.

## Changes
- **Dependency Duplication Fix**: Added an `overrides` block to
`package.json` to enforce a single version of `@google/adk`. This
prevents the "singleton" instance conflict that causes the `getTools`
error when loading toolsets from `@toolbox-sdk/adk`.
- **Node.js 18+ Compatibility**: Refactored `quickstart.js` to use a
`for await...of` loop for stream consumption, replacing
`Array.fromAsync` which requires experimental flags in Node 18.
- **Dependency Bumps**: Updated `@google/adk` to `^0.3.0` and
`@toolbox-sdk/adk` to `^0.2.0`.


- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change
2026-03-02 06:12:51 +00:00
dependabot[bot]
99604aab1d chore(deps): bump minimatch from 9.0.5 to 9.0.9 in /docs/en/getting-started/quickstart/js/adk (#2595)
Bumps [minimatch](https://github.com/isaacs/minimatch) from 9.0.5 to
9.0.9.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="8a10e473e2"><code>8a10e47</code></a>
9.0.9</li>
<li><a
href="c6f180636c"><code>c6f1806</code></a>
brace-expansion@2</li>
<li><a
href="446cfa3e2a"><code>446cfa3</code></a>
9.0.8</li>
<li><a
href="8fa151ab95"><code>8fa151a</code></a>
docs: add warning about ReDoS</li>
<li><a
href="71b78a2a4c"><code>71b78a2</code></a>
fix partial matching of globstar patterns</li>
<li><a
href="2de496f6d9"><code>2de496f</code></a>
9.0.7</li>
<li><a
href="0d4616de91"><code>0d4616d</code></a>
limit nested extglob recursion, flatten extglobs</li>
<li><a
href="7117ef381e"><code>7117ef3</code></a>
9.0.6</li>
<li><a
href="2418458b7f"><code>2418458</code></a>
update deps, do not checkin dist</li>
<li><a
href="1d1f531009"><code>1d1f531</code></a>
update deps</li>
<li>Additional commits viewable in <a
href="https://github.com/isaacs/minimatch/compare/v9.0.5...v9.0.9">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=minimatch&package-manager=npm_and_yarn&previous-version=9.0.5&new-version=9.0.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-03-02 11:40:46 +05:30
dependabot[bot]
2a3433acec chore(deps): bump fast-xml-parser from 4.5.3 to 4.5.4 in /docs/en/getting-started/quickstart/js/genkit (#2587)
Bumps
[fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser)
from 4.5.3 to 4.5.4.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/releases">fast-xml-parser's
releases</a>.</em></p>
<blockquote>
<h2>Summary update on all the previous releases from v4.2.4</h2>
<ul>
<li>Multiple minor fixes provided in the validator and parser</li>
<li>v6 is added for experimental use.</li>
<li>ignoreAttributes support function, and array of string or regex</li>
<li>Add support for parsing HTML numeric entities</li>
<li>v5 of the application is ESM module now. However, JS is also
supported</li>
</ul>
<p><strong>Note</strong>: Release section in not updated frequently.
Please check <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md">CHANGELOG</a>
or <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/tags">Tags</a>
for latest release information.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md">fast-xml-parser's
changelog</a>.</em></p>
<blockquote>
<p><!-- raw HTML omitted -->Note: If you find missing information about
particular minor version, that version must have been changed without
any functional change in this library.<!-- raw HTML omitted --></p>
<p>Note: Due to some last quick changes on v4, detail of v4.5.3 &amp;
v4.5.4 are not updated here. v4.5.4x is the last tag of v4 in github
repository. I'm extremely sorry for the confusion</p>
<p><strong>5.4.1  / 2026-02-25</strong></p>
<ul>
<li>fix (<a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/issues/785">#785</a>)
unpairedTag node should not have tag content</li>
</ul>
<p><strong>5.4.0  / 2026-02-25</strong></p>
<ul>
<li>migrate to fast-xml-builder</li>
</ul>
<p><strong>5.3.9 / 2026-02-25</strong></p>
<ul>
<li>support strictReservedNames</li>
</ul>
<p><strong>5.3.8 / 2026-02-25</strong></p>
<ul>
<li>support maxNestedTags</li>
<li>handle non-array input for XML builder when preserveOrder is true
(By <a href="https://github.com/Angelopvtac">Angelo Coetzee</a>)</li>
<li>save use of js properies</li>
</ul>
<p><strong>5.3.7 / 2026-02-20</strong></p>
<ul>
<li>fix typings for CJS (By <a
href="https://github.com/Drarig29">Corentin Girard</a>)</li>
</ul>
<p><strong>5.3.6 / 2026-02-14</strong></p>
<ul>
<li>Improve security and performance of entity processing
<ul>
<li>new options <code>maxEntitySize</code>,
<code>maxExpansionDepth</code>, <code>maxTotalExpansions</code>,
<code>maxExpandedLength</code>,
<code>allowedTags</code>,<code>tagFilter</code></li>
<li>fast return when no edtity is present</li>
<li>improvement replacement logic to reduce number of calls</li>
</ul>
</li>
</ul>
<p><strong>5.3.5 / 2026-02-08</strong></p>
<ul>
<li>fix: Escape regex char in entity name</li>
<li>update strnum to 2.1.2</li>
<li>add missing exports in CJS typings</li>
</ul>
<p><strong>5.3.4 / 2026-01-30</strong></p>
<ul>
<li>fix: handle HTML numeric and hex entities when out of range</li>
</ul>
<p><strong>5.3.3 / 2025-12-12</strong></p>
<ul>
<li>fix <a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/issues/775">#775</a>:
transformTagName with allowBooleanAttributes adds an unnecessary
attribute</li>
</ul>
<p><strong>5.3.2 / 2025-11-14</strong></p>
<ul>
<li>fix for import statement for v6</li>
</ul>
<p><strong>5.3.1 / 2025-11-03</strong></p>
<ul>
<li>Performance improvement for stopNodes (By <a
href="https://github.com/macieklamberski">Maciek Lamberski</a>)</li>
</ul>
<p><strong>5.3.0 / 2025-10-03</strong></p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f8d4d427a3"><code>f8d4d42</code></a>
update strnum to fix parsing issues of 0 when skiplike is used</li>
<li><a
href="2ae1f6240d"><code>2ae1f62</code></a>
fix: return type for <code>tagValueProcessor</code> &amp;
<code>attributeValueProcessor</code> (<a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/issues/582">#582</a>)</li>
<li>See full diff in <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v4.5.3...v4.5.4">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=fast-xml-parser&package-manager=npm_and_yarn&previous-version=4.5.3&new-version=4.5.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-03-02 11:32:36 +05:30
dependabot[bot]
5cb785ac70 chore(deps): bump minimatch from 9.0.5 to 9.0.9 in /docs/en/samples/pre_post_processing/js/langchain (#2594)
Bumps [minimatch](https://github.com/isaacs/minimatch) from 9.0.5 to
9.0.9.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="8a10e473e2"><code>8a10e47</code></a>
9.0.9</li>
<li><a
href="c6f180636c"><code>c6f1806</code></a>
brace-expansion@2</li>
<li><a
href="446cfa3e2a"><code>446cfa3</code></a>
9.0.8</li>
<li><a
href="8fa151ab95"><code>8fa151a</code></a>
docs: add warning about ReDoS</li>
<li><a
href="71b78a2a4c"><code>71b78a2</code></a>
fix partial matching of globstar patterns</li>
<li><a
href="2de496f6d9"><code>2de496f</code></a>
9.0.7</li>
<li><a
href="0d4616de91"><code>0d4616d</code></a>
limit nested extglob recursion, flatten extglobs</li>
<li><a
href="7117ef381e"><code>7117ef3</code></a>
9.0.6</li>
<li><a
href="2418458b7f"><code>2418458</code></a>
update deps, do not checkin dist</li>
<li><a
href="1d1f531009"><code>1d1f531</code></a>
update deps</li>
<li>Additional commits viewable in <a
href="https://github.com/isaacs/minimatch/compare/v9.0.5...v9.0.9">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=minimatch&package-manager=npm_and_yarn&previous-version=9.0.5&new-version=9.0.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-02 11:26:22 +05:30
dependabot[bot]
2228875472 chore(deps): bump minimatch from 9.0.5 to 9.0.9 in /docs/en/samples/pre_post_processing/js/adk (#2574)
Bumps [minimatch](https://github.com/isaacs/minimatch) from 9.0.5 to
9.0.9.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="8a10e473e2"><code>8a10e47</code></a>
9.0.9</li>
<li><a
href="c6f180636c"><code>c6f1806</code></a>
brace-expansion@2</li>
<li><a
href="446cfa3e2a"><code>446cfa3</code></a>
9.0.8</li>
<li><a
href="8fa151ab95"><code>8fa151a</code></a>
docs: add warning about ReDoS</li>
<li><a
href="71b78a2a4c"><code>71b78a2</code></a>
fix partial matching of globstar patterns</li>
<li><a
href="2de496f6d9"><code>2de496f</code></a>
9.0.7</li>
<li><a
href="0d4616de91"><code>0d4616d</code></a>
limit nested extglob recursion, flatten extglobs</li>
<li><a
href="7117ef381e"><code>7117ef3</code></a>
9.0.6</li>
<li><a
href="2418458b7f"><code>2418458</code></a>
update deps, do not checkin dist</li>
<li><a
href="1d1f531009"><code>1d1f531</code></a>
update deps</li>
<li>Additional commits viewable in <a
href="https://github.com/isaacs/minimatch/compare/v9.0.5...v9.0.9">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=minimatch&package-manager=npm_and_yarn&previous-version=9.0.5&new-version=9.0.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-03-02 11:13:27 +05:30
dependabot[bot]
5d5a0db5cd chore(deps): bump fast-xml-parser and @google-cloud/storage in /docs/en/samples/pre_post_processing/js/adk (#2573)
Bumps
[fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser)
and
[@google-cloud/storage](https://github.com/googleapis/nodejs-storage).
These dependencies needed to be updated together.
Updates `fast-xml-parser` from 4.5.3 to 5.4.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/releases">fast-xml-parser's
releases</a>.</em></p>
<blockquote>
<h2>Separate Builder</h2>
<p>XML Builder was the part of <a
href="https://github.com/NaturalIntelligence/fast-xml-builder">fast-xml-parser</a>
for years. But considering that any bug in builder may false-alarm the
users who are only using parser and vice-versa, we have decided to split
it into a separate package.</p>
<h2>Migration</h2>
<p>To migrate to fast-xml-builder;</p>
<p>From</p>
<pre lang="js"><code>import { XMLBuilder } from
&quot;fast-xml-parser&quot;;
</code></pre>
<p>To</p>
<pre lang="js"><code>import XMLBuilder from
&quot;fast-xml-builder&quot;;
</code></pre>
<p>XMLBuilder will be removed from current package in any next major
version of this library. So better to migrate.</p>
<h2>support strictReservedNames</h2>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.9...v5.3.9">https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.9...v5.3.9</a></p>
<h2>handle non-array input for XML builder &amp;&amp; support
maxNestedTags</h2>
<ul>
<li>support maxNestedTags</li>
<li>handle non-array input for XML builder when preserveOrder is true
(By <a href="https://github.com/Angelopvtac">Angelo Coetzee</a>)</li>
<li>save use of js properies
<strong>Full Changelog</strong>: <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.7...v5.3.8">https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.7...v5.3.8</a></li>
</ul>
<h2>CJS typing fix</h2>
<h2>What's Changed</h2>
<ul>
<li>Unexport <code>X2jOptions</code> at declaration site by <a
href="https://github.com/Drarig29"><code>@​Drarig29</code></a> in <a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/pull/787">NaturalIntelligence/fast-xml-parser#787</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/Drarig29"><code>@​Drarig29</code></a>
made their first contribution in <a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/pull/787">NaturalIntelligence/fast-xml-parser#787</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.6...v5.3.7">https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.6...v5.3.7</a></p>
<h2>Entity security and performance</h2>
<ul>
<li>Improve security and performance of entity processing
<ul>
<li>new options <code>maxEntitySize</code>,
<code>maxExpansionDepth</code>, <code>maxTotalExpansions</code>,
<code>maxExpandedLength</code>,
<code>allowedTags</code>,<code>tagFilter</code></li>
<li>fast return when no edtity is present</li>
<li>improvement replacement logic to reduce number of calls</li>
<li></li>
</ul>
</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.5...v5.3.6">https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.5...v5.3.6</a></p>
<h2>v5.3.5</h2>
<h2>What's Changed</h2>
<ul>
<li>Add missing exports to fxp commonjs types by <a
href="https://github.com/jeremymeng"><code>@​jeremymeng</code></a> in <a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/pull/782">NaturalIntelligence/fast-xml-parser#782</a></li>
<li>fix: Escape regex char in entity name</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md">fast-xml-parser's
changelog</a>.</em></p>
<blockquote>
<p><!-- raw HTML omitted -->Note: If you find missing information about
particular minor version, that version must have been changed without
any functional change in this library.<!-- raw HTML omitted --></p>
<p>Note: Due to some last quick changes on v4, detail of v4.5.3 &amp;
v4.5.4 are not updated here. v4.5.4x is the last tag of v4 in github
repository. I'm extremely sorry for the confusion</p>
<p><strong>5.4.1  / 2026-02-25</strong></p>
<ul>
<li>fix (<a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/issues/785">#785</a>)
unpairedTag node should not have tag content</li>
</ul>
<p><strong>5.4.0  / 2026-02-25</strong></p>
<ul>
<li>migrate to fast-xml-builder</li>
</ul>
<p><strong>5.3.9 / 2026-02-25</strong></p>
<ul>
<li>support strictReservedNames</li>
</ul>
<p><strong>5.3.8 / 2026-02-25</strong></p>
<ul>
<li>support maxNestedTags</li>
<li>handle non-array input for XML builder when preserveOrder is true
(By <a href="https://github.com/Angelopvtac">Angelo Coetzee</a>)</li>
<li>save use of js properies</li>
</ul>
<p><strong>5.3.7 / 2026-02-20</strong></p>
<ul>
<li>fix typings for CJS (By <a
href="https://github.com/Drarig29">Corentin Girard</a>)</li>
</ul>
<p><strong>5.3.6 / 2026-02-14</strong></p>
<ul>
<li>Improve security and performance of entity processing
<ul>
<li>new options <code>maxEntitySize</code>,
<code>maxExpansionDepth</code>, <code>maxTotalExpansions</code>,
<code>maxExpandedLength</code>,
<code>allowedTags</code>,<code>tagFilter</code></li>
<li>fast return when no edtity is present</li>
<li>improvement replacement logic to reduce number of calls</li>
</ul>
</li>
</ul>
<p><strong>5.3.5 / 2026-02-08</strong></p>
<ul>
<li>fix: Escape regex char in entity name</li>
<li>update strnum to 2.1.2</li>
<li>add missing exports in CJS typings</li>
</ul>
<p><strong>5.3.4 / 2026-01-30</strong></p>
<ul>
<li>fix: handle HTML numeric and hex entities when out of range</li>
</ul>
<p><strong>5.3.3 / 2025-12-12</strong></p>
<ul>
<li>fix <a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/issues/775">#775</a>:
transformTagName with allowBooleanAttributes adds an unnecessary
attribute</li>
</ul>
<p><strong>5.3.2 / 2025-11-14</strong></p>
<ul>
<li>fix for import statement for v6</li>
</ul>
<p><strong>5.3.1 / 2025-11-03</strong></p>
<ul>
<li>Performance improvement for stopNodes (By <a
href="https://github.com/macieklamberski">Maciek Lamberski</a>)</li>
</ul>
<p><strong>5.3.0 / 2025-10-03</strong></p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4e7ca80e78"><code>4e7ca80</code></a>
update release info</li>
<li><a
href="36023b4963"><code>36023b4</code></a>
fix (<a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/issues/785">#785</a>)
unpairedTag node should not have tag content</li>
<li><a
href="b3660266f5"><code>b366026</code></a>
separate builder</li>
<li><a
href="6f333a8569"><code>6f333a8</code></a>
update release info</li>
<li><a
href="c3ffbab9e5"><code>c3ffbab</code></a>
support strictReservedNames</li>
<li><a
href="c692040f6b"><code>c692040</code></a>
update release info</li>
<li><a
href="107e34c046"><code>107e34c</code></a>
avoid <code>{}</code> to create an empty object</li>
<li><a
href="60835a4c72"><code>60835a4</code></a>
support maxNestedTags</li>
<li><a
href="f55657c2b1"><code>f55657c</code></a>
avoid direct call to hasOwnProperty</li>
<li><a
href="c13a961910"><code>c13a961</code></a>
handle non-array input for XML builder when preserveOrder is true</li>
<li>Additional commits viewable in <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v4.5.3...v5.4.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `@google-cloud/storage` from 7.18.0 to 7.19.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/nodejs-storage/releases"><code>@​google-cloud/storage</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v7.19.0</h2>
<h2><a
href="https://github.com/googleapis/nodejs-storage/compare/v7.18.0...v7.19.0">7.19.0</a>
(2026-02-05)</h2>
<h3>Features</h3>
<ul>
<li>Enable full object checksum validation on JSON path (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2687">#2687</a>)
(<a
href="08a896240e">08a8962</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>deps:</strong> Update dependency fast-xml-parser to v5
[security] (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2713">#2713</a>)
(<a
href="420935a033">420935a</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/nodejs-storage/blob/main/CHANGELOG.md"><code>@​google-cloud/storage</code>'s
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/googleapis/nodejs-storage/compare/v7.18.0...v7.19.0">7.19.0</a>
(2026-02-05)</h2>
<h3>Features</h3>
<ul>
<li>Enable full object checksum validation on JSON path (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2687">#2687</a>)
(<a
href="08a896240e">08a8962</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>deps:</strong> Update dependency fast-xml-parser to v5
[security] (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2713">#2713</a>)
(<a
href="420935a033">420935a</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="95a2af4cc8"><code>95a2af4</code></a>
chore(main): release 7.19.0 (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2694">#2694</a>)</li>
<li><a
href="420935a033"><code>420935a</code></a>
fix(deps): update dependency fast-xml-parser to v5 [security] (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2713">#2713</a>)</li>
<li><a
href="4e3c328ccf"><code>4e3c328</code></a>
test: skip system tests requiring public access (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2717">#2717</a>)</li>
<li><a
href="30522654c5"><code>3052265</code></a>
chore: fix lint failures (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2685">#2685</a>)</li>
<li><a
href="08a896240e"><code>08a8962</code></a>
feat: Enable full object checksum validation on JSON path (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2687">#2687</a>)</li>
<li><a
href="3dcda1b715"><code>3dcda1b</code></a>
chore: lint failures (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2681">#2681</a>)</li>
<li>See full diff in <a
href="https://github.com/googleapis/nodejs-storage/compare/v7.18.0...v7.19.0">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-03-02 10:58:49 +05:30
Marlon Barreto
e534196303 fix(server/mcp): guard nil dereference in sseManager.get (#2557)
## Description

`sseManager.get()` unconditionally accesses `session.lastActive` after a
map lookup, even when the session ID doesn't exist. Since the zero value
for a `*sseSession` pointer is `nil`, this causes a nil pointer
dereference panic at runtime.

This can happen when a client sends a request with a stale or invalid
`sessionId` query parameter — for example, after a network reconnection
or if a session was cleaned up by `cleanupRoutine`.

## Changes

Add an `ok` guard before accessing `session.lastActive`:

```go
session, ok := m.sseSessions[id]
if ok {
    session.lastActive = time.Now()
}
```

## Test

Added `TestSseManagerGetNonExistentSession` that calls `get()` with a
non-existent ID and verifies it returns `nil, false` without panicking.

Fixes #2548

Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2026-03-02 02:59:48 +00:00
Yuan Teoh
fcaac9bb95 feat: add polling system to dynamic reloading (#2466)
Support polling system to existing Toolbox dynamic reloading feature. 
| flag | description | default |
| --- | --- | --- |
| `--poll-interval` | Specifies the polling frequency (seconds) for
configuration file updates. | `0` |

With `--poll-interval` = 0, it will not run the polling system at all. 

When polling is active, Toolbox checks for configuration file updates at
every specified interval (in seconds).


Fixes #2346

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2026-02-28 01:39:01 +00:00
Dr. Strangelove
f479475508 feat!(tools/looker): Factor Looker LookML development tools into their own prebuilt config (#2559)
## Description

In order to reduce the bloat of tools, users who do not need LookML
development tools can use `--prebuilt looker`, while users that need the
full suite of tools can use `--prebuilt looker,looker-dev`

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [x] Make sure to add `!` if this involve a breaking change
2026-02-27 21:59:46 +00:00
Kurtis Van Gent
bc049c1aaa docs: add agent context files (#2471)
Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-02-27 21:19:51 +00:00
Kurtis Van Gent
0d062d6137 docs: add description of custom vs prebuilt (#2579) 2026-02-27 13:57:32 -07:00
Dave Borowitz
cc05e5745d feat(dataproc): Add dataproc source and list/get clusters/jobs tools (#2407)
## Description

Add a new source for Dataproc, which is closely related to Serverless
Spark. Similar to get/list batches, we have get/list clusters and jobs,
with minor API differences.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Part of #2405
2026-02-27 17:27:33 +00:00
Jerin John
e01139a902 feat(tools/looker): Enable Get All Lookml Tests, Run LookML Tests, and Create View From Table tools for Looker (#2522)
## Description

Adds a new MCP tool to fetch all available LookML tests for a project
that can be executed for validation of changes via the toolbox.

Invokes the Looker
[API](https://docs.cloud.google.com/looker/docs/reference/looker-api/latest/methods/Project/all_lookml_tests)
Get All LookML Tests (AllLookmlTests sdk method), which can fetch all
defined tests and use the project_id and file_id parameters to narrow
the scope as required.

Adds a new MCP tool to run a LookML test for a project.

Adds a new MCP tool to create a new view from a table.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [x] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #2447, #2448, #2450

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Mike DeAngelo <drstrangelove@google.com>
Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2026-02-27 11:34:19 -05:00
Twisha Bansal
d5e9512a23 fix: enforce required validation for explicit null parameter values (#2519)
## Description
Fixes https://github.com/googleapis/genai-toolbox/issues/2518

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-02-27 11:08:53 -05:00
Averi Kitsch
86de4da586 chore: Update CODEOWNERS (#2575)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-02-27 10:40:55 -05:00
Wenxin Du
8d05b4e35d chore: add v0.28.0 versioned doc (#2570)
Release v0.28.0
2026-02-27 01:03:23 +00:00
Juexin Wang
3729556191 refactor: update GDA source and tool to use Cloud Go SDK (#2313)
## Description

Refactor GDA source and tool to use Cloud Go SDK to simplify the
implementation, given the SDK has included the recent changes.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [x] Make sure to add `!` if this involve a breaking change
2026-02-27 00:22:43 +00:00
Wenxin Du
a54a0785a7 ci(postgres): temporarily disable flakey integration test (#2571)
A temporary fix to
https://github.com/googleapis/genai-toolbox/issues/2562 that disables
flakey test to unblock release.
2026-02-26 23:26:12 +00:00
Huan Chen
664f72c7cc chore(bigquery): refactor conversational analytics handlers and fix tests (#2567)
## Description
BigQuery Conversational Analytics tests have been failing, and it
appears the cause is a recent change in the API's response format and
streaming behavior. This PR refactors the handlers to aggregate response
fields correctly.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-02-26 23:02:51 +00:00
Wenxin Du
941d18d802 ci: update Github Actions to use step outputs (#2553)
Update GitHub workflow security to align with [Google Open Source
security
requirements](https://opensource.google/documentation/reference/github/security).
2026-02-26 14:59:35 -05:00
Twisha Bansal
0158206540 docs: add pre/post processing docs for ADK Python (#2534)
## Description

Created again on accidental deletion of
https://github.com/googleapis/genai-toolbox/pull/2433

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-02-26 19:35:58 +05:30
Niraj Nandre
36edfd3d50 fix(docs/langchain): fix core at 0.3.0 and align compatible dependencies (#2426)
## Description

This pull request addresses and resolves dependency issues within the
quickstart documentation for `Langchain` samples. The changes involve
updating package versions to their latest compatible releases, ensuring
that developers following these guides encounter a stable and functional
environment.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change
2026-02-26 14:13:25 +05:30
Anubhav Dhawan
182d63c7a0 doc: Fix ADK quickstart rendering with shortcodes (#2541)
## Description

Previously the code blocks nested under tab panes were not rendering
properly. The code included with `regionInclude` shortcode was rendering
with weird characters while that included with `include` shortcode
rendered with extra blank lines.

This PR fixes both the issues.

### Before
<img width="1628" height="828" alt="image"
src="https://github.com/user-attachments/assets/be34dbbd-6b7f-4153-8439-8df25d4c0eb5"
/>

### After
<img width="1552" height="562" alt="image"
src="https://github.com/user-attachments/assets/43e2cc33-8eea-4007-9e8a-1d436f1def0f"
/>

> [!NOTE]
> This PR also removes the license header from the Go sample code for
pre/post processing, since no other language sample code (not even the
Go sample code in quickstarts) were having license headers. Adjusted the
header checker config for the same.
2026-02-25 17:44:46 +05:30
ishatilwani1301
72146a4b16 fix(oracle): enable DML operations and resolve incorrect array type error (#2323)
This pull request resolves an issue where executing DML statements
(UPDATE, INSERT, DELETE) caused "incorrect array type" errors.
Previously, the Oracle source forced all operations to use QueryContext,
expecting rows to be returned. This caused failures when running write
operations that do not return rows.

**Changes Implemented:**
The modification updates the Oracle source and tool definitions to
distinguish between Read-Only (SELECT) and Action (DML) operations.

- **internal/sources/oracle/oracle.go:**

1. Updated RunSQL signature to accept a readOnly boolean.
2. Added conditional logic: If readOnly is false, it now uses
ExecContext and returns rows_affected instead of attempting to scan
non-existent rows.

- **internal/tools/oracle/oraclesql/oraclesql.go:**

1. Added a readonly field to the tool configuration (YAML).
2. Updated the Invoke method to pass this flag to the source. Defaults
to true (Read-Only) for backward compatibility.


🛠️ Fixes #2026

---------

Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2026-02-25 14:47:33 +05:30
dependabot[bot]
00c6b2ccf4 chore(deps): bump hono from 4.11.7 to 4.12.0 in /docs/en/samples/pre_post_processing/js/adk (#2538)
Bumps [hono](https://github.com/honojs/hono) from 4.11.7 to 4.12.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/honojs/hono/releases">hono's
releases</a>.</em></p>
<blockquote>
<h2>v4.12.0</h2>
<h1>Release Notes</h1>
<p>Hono v4.12.0 is now available!</p>
<p>This release includes new features for the Hono client, middleware
improvements, adapter enhancements, and significant performance
improvements to the router and context.</p>
<h2><code>$path</code> for Hono Client</h2>
<p>The Hono client now has a <code>$path()</code> method that returns
the path string instead of a full URL. This is useful when you need just
the path portion for routing or key-based operations:</p>
<pre lang="ts"><code>const client = hc&lt;typeof
app&gt;('http://localhost:8787')
<p>// Get the path string
const path = client.api.posts.$path()
// =&gt; '/api/posts'</p>
<p>// With path parameters
const postPath = client.api.posts[':id'].$path({
param: { id: '123' },
})
// =&gt; '/api/posts/123'</p>
<p>// With query parameters
const searchPath = client.api.posts.$path({
query: { filter: 'test' },
})
// =&gt; '/api/posts?filter=test'
</code></pre></p>
<p>Unlike <code>$url()</code> which returns a <code>URL</code> object,
<code>$path()</code> returns a plain path string, making it convenient
for use with routers or as cache keys.</p>
<p>Thanks <a
href="https://github.com/ShaMan123"><code>@​ShaMan123</code></a>!</p>
<h2><code>ApplyGlobalResponse</code> Type Helper for RPC Client</h2>
<p>The new <code>ApplyGlobalResponse</code> type helper allows you to
add global error response types to all routes in the RPC client. This is
useful for typing common error responses from <code>app.onError()</code>
or global middlewares:</p>
<pre lang="ts"><code>const app = new Hono()
  .get('/api/users', (c) =&gt; c.json({ users: ['alice', 'bob'] }, 200))
  .onError((err, c) =&gt; c.json({ error: err.message }, 500))
<p>type AppWithErrors = ApplyGlobalResponse&lt;
typeof app,
{
401: { json: { error: string; message: string } }
500: { json: { error: string; message: string } }
}
&lt;/tr&gt;&lt;/table&gt;
</code></pre></p>
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d2ed2e9c96"><code>d2ed2e9</code></a>
4.12.0</li>
<li><a
href="01e78adc63"><code>01e78ad</code></a>
Merge pull request <a
href="https://redirect.github.com/honojs/hono/issues/4735">#4735</a>
from honojs/next</li>
<li><a
href="a340a25fc6"><code>a340a25</code></a>
perf(context): use <code>createResponseInstance</code> for new Response
(<a
href="https://redirect.github.com/honojs/hono/issues/4733">#4733</a>)</li>
<li><a
href="bd26c3129f"><code>bd26c31</code></a>
perf(trie-router): improve performance (1.5x ~ 2.0x) (<a
href="https://redirect.github.com/honojs/hono/issues/4724">#4724</a>)</li>
<li><a
href="b85c1e0328"><code>b85c1e0</code></a>
feat(types): Add exports field to ExecutionContext (<a
href="https://redirect.github.com/honojs/hono/issues/4719">#4719</a>)</li>
<li><a
href="02346c6d94"><code>02346c6</code></a>
feat(language): add progressive locale code truncation to
normalizeLanguage (...</li>
<li><a
href="7438ab9355"><code>7438ab9</code></a>
perf(context): add fast path to c.json() matching c.text() optimization
(<a
href="https://redirect.github.com/honojs/hono/issues/4707">#4707</a>)</li>
<li><a
href="034223f1bf"><code>034223f</code></a>
feat(trailing-slash): add <code>alwaysRedirect</code> option to support
wildcard routes ...</li>
<li><a
href="16321afd47"><code>16321af</code></a>
feat(adapter): add getConnInfo for AWS Lambda, Cloudflare Pages, and
Netlify ...</li>
<li><a
href="bf37828d6d"><code>bf37828</code></a>
feat(basic-auth): add context key and callback options (<a
href="https://redirect.github.com/honojs/hono/issues/4645">#4645</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/honojs/hono/compare/v4.11.7...v4.12.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=hono&package-manager=npm_and_yarn&previous-version=4.11.7&new-version=4.12.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-02-24 13:05:28 -08:00
Mend Renovate
ed3441cebc chore(deps): update peter-evans/create-issue-from-file action to v6 (#2530)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[peter-evans/create-issue-from-file](https://redirect.github.com/peter-evans/create-issue-from-file)
| action | major | `v5` → `v6` |

---

### Release Notes

<details>
<summary>peter-evans/create-issue-from-file
(peter-evans/create-issue-from-file)</summary>

###
[`v6`](https://redirect.github.com/peter-evans/create-issue-from-file/compare/v5...v6)

[Compare
Source](https://redirect.github.com/peter-evans/create-issue-from-file/compare/v5...v6)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNS4xMSIsInVwZGF0ZWRJblZlciI6IjQzLjI1LjExIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-02-24 11:40:21 -08:00
Averi Kitsch
45aa16fa46 chore: clean up project documentation (#2525)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-02-24 10:54:35 -08:00
nester-neo4j
0eab966fbd chore(deps): update neo4j-go-driver to v6 (#2390)
## Summary
Updates `github.com/neo4j/neo4j-go-driver/v5` to v6 across the codebase.

## Changes
- **go.mod / go.sum**: Bump dependency to `neo4j-go-driver/v6 v6.0.0`
- **Imports**: Replace `v5` with `v6` in:
  - `internal/sources/neo4j/neo4j.go`
  - `internal/tools/neo4j/neo4jschema/neo4jschema.go`
  - `internal/tools/neo4j/neo4jschema/helpers/helpers.go`
  - `internal/tools/neo4j/neo4jschema/helpers/helpers_test.go`
  - `tests/neo4j/neo4j_integration_test.go`

No API changes required; v6 retains the types and functions we use
(including deprecated aliases).

## Testing
- Unit tests: `go test ./internal/sources/neo4j/...
./internal/tools/neo4j/...` — pass
- Integration tests: `go test ./tests/neo4j/...` (with NEO4J_* env) —
pass
- Build: `go build ./...` — succeeds

Fixes #2334

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: nester-neo4j <nester-neo4j@users.noreply.github.com>
Co-authored-by: Binh Tran <ankel@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
Co-authored-by: Dennis Geurts <dennisg@dennisg.nl>
Co-authored-by: Yuan Teoh <yuanteoh@google.com>
Co-authored-by: Haoyu Wang <whaoyu@google.com>
Co-authored-by: Averi Kitsch <akitsch@google.com>
Co-authored-by: Dr. Strangelove <drstrangelove@google.com>
Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: manuka rahul <96047526+rahulpinto19@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Anubhav Dhawan <anubhavdhawan@google.com>
Co-authored-by: Virag Tripathi <15679776+viragtripathi@users.noreply.github.com>
Co-authored-by: duwenxin99 <duwenxin@google.com>
Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
Co-authored-by: Huan Chen <142538604+Genesis929@users.noreply.github.com>
Co-authored-by: Parth Ajmera <ajmeraparth132@gmail.com>
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Co-authored-by: dishaprakash <57954147+dishaprakash@users.noreply.github.com>
Co-authored-by: Niraj Nandre <nirajnandre11@gmail.com>
2026-02-24 18:08:45 +00:00
Twisha Bansal
64468c28d6 ci: skip lint presubmit on non-code changes (#2506)
## Description

Optimizes CI usage by skipping `lint` workflows for changes unrelated to
source code, such as documentation updates (`docs/**`, `**.md`) or other
GitHub configurations (`.github/**`).

To satisfy GitHub's **Required Status Checks**, "fallback" workflows
have been added. These workflows trigger *only* when the main workflows
are skipped and instantly report success, ensuring PRs don't get stuck
in a pending state.

**Note:** Direct edits to the workflow files themselves are explicitly
included in triggers to allow for self-testing.


## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-02-24 12:20:22 +05:30
Niraj Nandre
7041e79734 fix(tests/postgres): restore list_schemas test and implement dynamic owner (#2521)
## Description

This PR resolves the race conditions identified in Issue 2463 by fully
implementing per-test resource isolation and dynamic metadata validation
for` PostgreSQL` databases.

### Key Changes:
**UUID-Based Isolation:** Prefixes schema names with a `uniqueID` to
ensure that concurrent test runs in Cloud Build do not interfere with or
accidentally delete each other's resources.
**Dynamic Owner**: Replaced the hardcoded `postgres` owner with dynamic
environment variables (e.g., PostgresUser, etc), ensuring tests pass in
environments with non-default database users.
**Restored Integration Test:** Un-commented the
`invoke_list_schemas_with_owner_name` test case to verify the tool's
filtering functionality and confirm the effectiveness of the isolation
logic.
**Error Log Correction**: Fixed a string formatting bug that produced
`%!s(float64=0)` by updating the failure reporting verb to `%+v ` for
structured map data.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #2463
2026-02-24 06:09:15 +00:00
Tomo Suzuki
61d0ea47c7 chore: replace old partner teams with new ones (Wave 2) (#2545)
Replacing old partner teams with new ones as part of Wave 2 migration.
b/478003109

Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-02-23 09:47:23 -08:00
Harsh Jha
87f2eaf79c feat: added basic template for sdks doc migrate (#1961)
Docs Migration across Sdk  repo (py, js & go) to genai-toolbox repo

This is a parent branch for all the sdks 
py - https://github.com/googleapis/genai-toolbox/pull/2164
js - https://github.com/googleapis/genai-toolbox/pull/2329
go - https://github.com/googleapis/genai-toolbox/pull/2292



This pr will also solve
[Issue](https://github.com/googleapis/genai-toolbox/issues/1182)

---------

Co-authored-by: Anmol Shukla <shuklaanmol@google.com>
Co-authored-by: Anubhav Dhawan <anubhavdhawan@google.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-02-23 22:25:18 +05:30
Dr. Strangelove
0036d8c358 feat(tools/looker): tools to list/create/delete directories (#2488)
within a LookML project. These tools only work on Looker 26.2 and later.
2026-02-20 14:19:03 +00:00
Twisha Bansal
78286a9d94 docs: fix query for langchain pre and post processing docs (#2533)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-02-20 16:08:45 +05:30
Twisha Bansal
04dd2a7760 fix(ci): add path for forked PR unit test runs (#2540)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-02-20 08:23:51 +00:00
Twisha Bansal
243e10c46c docs: add pre/post processing docs for ADK JS (#2424)
## Description

Tested on local changes. Latest successful run:
https://pantheon.corp.google.com/cloud-build/builds;region=global/740d6aca-271b-4c0b-8584-40cae58950c8?e=13802955&mods=-autopush_coliseum&project=toolbox-testing-438616

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-02-20 07:24:05 +00:00
Twisha Bansal
fe35e55e86 ci: Skip unit tests on documentation and config changes (#2503)
## Description

Updates the unit tests workflow to prevent unnecessary CI runs. 

The `unit tests` job will now be skipped when changes are limited to:
- Documentation (`docs/**`, `**.md`)
- Other GitHub configuration files (`.github/**`)

**Note:** Changes to the test workflow file itself remain an exception
and *will* trigger the tests, ensuring we can validate workflow
modifications.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-02-20 12:46:15 +05:30
Mend Renovate
908b350d21 chore(deps): pin peter-evans/create-issue-from-file action to e8ef132 (#2529)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[peter-evans/create-issue-from-file](https://redirect.github.com/peter-evans/create-issue-from-file)
| action | pinDigest | → `e8ef132` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNS4xMSIsInVwZGF0ZWRJblZlciI6IjQzLjI1LjExIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
2026-02-20 05:34:29 +00:00
manuka rahul
ed6bd31500 docs: add link check weekly report (#2458)
This workflow runs weekly to check link health across the entire
repository, as the standard workflow only checks changed files.

---------

Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-02-20 10:36:32 +05:30
dependabot[bot]
9f52615a79 chore(deps): bump axios from 1.13.1 to 1.13.5 in /docs/en/getting-started/quickstart/js/langchain (#2483)
Bumps [axios](https://github.com/axios/axios) from 1.13.1 to 1.13.5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/axios/axios/releases">axios's
releases</a>.</em></p>
<blockquote>
<h2>v1.13.5</h2>
<h2>Release 1.13.5</h2>
<h3>Highlights</h3>
<ul>
<li><strong>Security:</strong> Fixed a potential <strong>Denial of
Service</strong> issue involving the <code>__proto__</code> key in
<code>mergeConfig</code>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7369">#7369</a>)</li>
<li><strong>Bug fix:</strong> Resolved an issue where
<code>AxiosError</code> could be missing the <code>status</code> field
on and after <strong>v1.13.3</strong>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7368">#7368</a>)</li>
</ul>
<h3>Changes</h3>
<h4>Security</h4>
<ul>
<li>Fix Denial of Service via <code>__proto__</code> key in
<code>mergeConfig</code>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7369">#7369</a>)</li>
</ul>
<h4>Fixes</h4>
<ul>
<li>Fix/5657. (PR <a
href="https://redirect.github.com/axios/axios/pull/7313">#7313</a>)</li>
<li>Ensure <code>status</code> is present in <code>AxiosError</code> on
and after v1.13.3. (PR <a
href="https://redirect.github.com/axios/axios/pull/7368">#7368</a>)</li>
</ul>
<h4>Features / Improvements</h4>
<ul>
<li>Add input validation to <code>isAbsoluteURL</code>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7326">#7326</a>)</li>
<li>Refactor: bump minor package versions. (PR <a
href="https://redirect.github.com/axios/axios/pull/7356">#7356</a>)</li>
</ul>
<h4>Documentation</h4>
<ul>
<li>Clarify object-check comment. (PR <a
href="https://redirect.github.com/axios/axios/pull/7323">#7323</a>)</li>
<li>Fix deprecated <code>Buffer</code> constructor usage and README
formatting. (PR <a
href="https://redirect.github.com/axios/axios/pull/7371">#7371</a>)</li>
</ul>
<h4>CI / Maintenance</h4>
<ul>
<li>Chore: fix issues with YAML. (PR <a
href="https://redirect.github.com/axios/axios/pull/7355">#7355</a>)</li>
<li>CI: update workflow YAMLs. (PR <a
href="https://redirect.github.com/axios/axios/pull/7372">#7372</a>)</li>
<li>CI: fix run condition. (PR <a
href="https://redirect.github.com/axios/axios/pull/7373">#7373</a>)</li>
<li>Dev deps: bump <code>karma-sourcemap-loader</code> from 0.3.8 to
0.4.0. (PR <a
href="https://redirect.github.com/axios/axios/pull/7360">#7360</a>)</li>
<li>Chore(release): prepare release 1.13.5. (PR <a
href="https://redirect.github.com/axios/axios/pull/7379">#7379</a>)</li>
</ul>
<h3>New Contributors</h3>
<ul>
<li><a
href="https://github.com/sachin11063"><code>@​sachin11063</code></a>
(first contribution — PR <a
href="https://redirect.github.com/axios/axios/pull/7323">#7323</a>)</li>
<li><a
href="https://github.com/asmitha-16"><code>@​asmitha-16</code></a>
(first contribution — PR <a
href="https://redirect.github.com/axios/axios/pull/7326">#7326</a>)</li>
</ul>
<p><strong>Full Changelog:</strong> <a
href="https://github.com/axios/axios/compare/v1.13.4...v1.13.5">https://github.com/axios/axios/compare/v1.13.4...v1.13.5</a></p>
<h2>v1.13.4</h2>
<h2>Overview</h2>
<p>The release addresses issues discovered in v1.13.3 and includes
significant CI/CD improvements.</p>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/axios/axios/compare/v1.13.3...v1.13.4">v1.13.3...v1.13.4</a></p>
<h2>What's New in v1.13.4</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>fix: issues with version 1.13.3</strong> (<a
href="https://redirect.github.com/axios/axios/issues/7352">#7352</a>)
(<a
href="ee90dfc28a">ee90dfc</a>)
<ul>
<li>Fixed issues discovered in v1.13.3 release</li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/axios/axios/blob/v1.x/CHANGELOG.md">axios's
changelog</a>.</em></p>
<blockquote>
<h1>Changelog</h1>
<h2><a
href="https://github.com/axios/axios/compare/v1.13.2...v1.13.3">1.13.3</a>
(2026-01-20)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>http2:</strong> Use port 443 for HTTPS connections by
default. (<a
href="https://redirect.github.com/axios/axios/issues/7256">#7256</a>)
(<a
href="d7e6065346">d7e6065</a>)</li>
<li><strong>interceptor:</strong> handle the error in the same
interceptor (<a
href="https://redirect.github.com/axios/axios/issues/6269">#6269</a>)
(<a
href="5945e40bb1">5945e40</a>)</li>
<li>main field in package.json should correspond to cjs artifacts (<a
href="https://redirect.github.com/axios/axios/issues/5756">#5756</a>)
(<a
href="7373fbff24">7373fbf</a>)</li>
<li><strong>package.json:</strong> add 'bun' package.json 'exports'
condition. Load the Node.js build in Bun instead of the browser build
(<a
href="https://redirect.github.com/axios/axios/issues/5754">#5754</a>)
(<a
href="b89217e3e9">b89217e</a>)</li>
<li>silentJSONParsing=false should throw on invalid JSON (<a
href="https://redirect.github.com/axios/axios/issues/7253">#7253</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/7257">#7257</a>)
(<a
href="7d19335e43">7d19335</a>)</li>
<li>turn AxiosError into a native error (<a
href="https://redirect.github.com/axios/axios/issues/5394">#5394</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/5558">#5558</a>)
(<a
href="1c6a86dd2c">1c6a86d</a>)</li>
<li><strong>types:</strong> add handlers to AxiosInterceptorManager
interface (<a
href="https://redirect.github.com/axios/axios/issues/5551">#5551</a>)
(<a
href="8d1271b49f">8d1271b</a>)</li>
<li><strong>types:</strong> restore AxiosError.cause type from unknown
to Error (<a
href="https://redirect.github.com/axios/axios/issues/7327">#7327</a>)
(<a
href="d8233d9e8e">d8233d9</a>)</li>
<li>unclear error message is thrown when specifying an empty proxy
authorization (<a
href="https://redirect.github.com/axios/axios/issues/6314">#6314</a>)
(<a
href="6ef867e684">6ef867e</a>)</li>
</ul>
<h3>Features</h3>
<ul>
<li>add <code>undefined</code> as a value in AxiosRequestConfig (<a
href="https://redirect.github.com/axios/axios/issues/5560">#5560</a>)
(<a
href="095033c626">095033c</a>)</li>
<li>add automatic minor and patch upgrades to dependabot (<a
href="https://redirect.github.com/axios/axios/issues/6053">#6053</a>)
(<a
href="65a7584eda">65a7584</a>)</li>
<li>add Node.js coverage script using c8 (closes <a
href="https://redirect.github.com/axios/axios/issues/7289">#7289</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/7294">#7294</a>)
(<a
href="ec9d94e9f8">ec9d94e</a>)</li>
<li>added copilot instructions (<a
href="3f83143bfe">3f83143</a>)</li>
<li>compatibility with frozen prototypes (<a
href="https://redirect.github.com/axios/axios/issues/6265">#6265</a>)
(<a
href="860e03396a">860e033</a>)</li>
<li>enhance pipeFileToResponse with error handling (<a
href="https://redirect.github.com/axios/axios/issues/7169">#7169</a>)
(<a
href="88d7884254">88d7884</a>)</li>
<li><strong>types:</strong> Intellisense for string literals in a
widened union (<a
href="https://redirect.github.com/axios/axios/issues/6134">#6134</a>)
(<a
href="f73474d02c">f73474d</a>),
closes <a
href="https://redirect.github.com//redirect.github.com/microsoft/TypeScript/issues/33471/issues/issuecomment-1376364329">microsoft/TypeScript#33471</a></li>
</ul>
<h3>Reverts</h3>
<ul>
<li>Revert &quot;fix: silentJSONParsing=false should throw on invalid
JSON (<a
href="https://redirect.github.com/axios/axios/issues/7253">#7253</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/7">#7</a>…&quot;
(<a
href="https://redirect.github.com/axios/axios/issues/7298">#7298</a>)
(<a
href="a4230f5581">a4230f5</a>),
closes <a
href="https://redirect.github.com/axios/axios/issues/7253">#7253</a> <a
href="https://redirect.github.com/axios/axios/issues/7">#7</a> <a
href="https://redirect.github.com/axios/axios/issues/7298">#7298</a></li>
<li><strong>deps:</strong> bump peter-evans/create-pull-request from 7
to 8 in the github-actions group (<a
href="https://redirect.github.com/axios/axios/issues/7334">#7334</a>)
(<a
href="2d6ad5e48b">2d6ad5e</a>)</li>
</ul>
<h3>Contributors to this release</h3>
<ul>
<li><!-- raw HTML omitted --> <a href="https://github.com/ashvin2005"
title="+1752/-4 ([#7218](https://github.com/axios/axios/issues/7218)
[#7218](https://github.com/axios/axios/issues/7218) )">Ashvin
Tiwari</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/mochinikunj"
title="+940/-12 ([#7294](https://github.com/axios/axios/issues/7294)
[#7294](https://github.com/axios/axios/issues/7294) )">Nikunj
Mochi</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/imanchalsingh"
title="+544/-102 ([#7169](https://github.com/axios/axios/issues/7169)
[#7185](https://github.com/axios/axios/issues/7185) )">Anchal
Singh</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/jasonsaayman"
title="+317/-73 ([#7334](https://github.com/axios/axios/issues/7334)
[#7298](https://github.com/axios/axios/issues/7298)
)">jasonsaayman</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/brodo"
title="+99/-120 ([#5558](https://github.com/axios/axios/issues/5558)
)">Julian Dax</a></li>
<li><!-- raw HTML omitted --> <a
href="https://github.com/AKASHDHARDUBEY" title="+167/-0
([#7287](https://github.com/axios/axios/issues/7287)
[#7288](https://github.com/axios/axios/issues/7288) )">Akash Dhar
Dubey</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/madhumitaaa"
title="+20/-68 ([#7198](https://github.com/axios/axios/issues/7198)
)">Madhumita</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/Tackoil"
title="+80/-2 ([#6269](https://github.com/axios/axios/issues/6269)
)">Tackoil</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/justindhillon"
title="+41/-41 ([#6324](https://github.com/axios/axios/issues/6324)
[#6315](https://github.com/axios/axios/issues/6315) )">Justin
Dhillon</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/Rudrxxx"
title="+71/-2 ([#7257](https://github.com/axios/axios/issues/7257)
)">Rudransh</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/WuMingDao"
title="+36/-36 ([#7215](https://github.com/axios/axios/issues/7215)
)">WuMingDao</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/codenomnom"
title="+70/-0 ([#7201](https://github.com/axios/axios/issues/7201)
[#7201](https://github.com/axios/axios/issues/7201)
)">codenomnom</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/Nandann018-ux"
title="+60/-10 ([#7272](https://github.com/axios/axios/issues/7272)
)">Nandan Acharya</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/KernelDeimos"
title="+22/-40 ([#7042](https://github.com/axios/axios/issues/7042)
)">Eric Dubé</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/tiborpilz"
title="+40/-4 ([#5551](https://github.com/axios/axios/issues/5551)
)">Tibor Pilz</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/joaoGabriel55"
title="+31/-4 ([#6314](https://github.com/axios/axios/issues/6314)
)">Gabriel Quaresma</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/turadg"
title="+23/-6 ([#6265](https://github.com/axios/axios/issues/6265)
)">Turadg Aleahmad</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="29f75425f0"><code>29f7542</code></a>
chore(release): prepare release 1.13.5 (<a
href="https://redirect.github.com/axios/axios/issues/7379">#7379</a>)</li>
<li><a
href="431c3a3614"><code>431c3a3</code></a>
ci: fix run condition (<a
href="https://redirect.github.com/axios/axios/issues/7373">#7373</a>)</li>
<li><a
href="9ff3a78ad7"><code>9ff3a78</code></a>
ci: update ymls (<a
href="https://redirect.github.com/axios/axios/issues/7372">#7372</a>)</li>
<li><a
href="265b71234c"><code>265b712</code></a>
docs: fix deprecated Buffer constructor and formatting issues in README
(<a
href="https://redirect.github.com/axios/axios/issues/7371">#7371</a>)</li>
<li><a
href="475e75a260"><code>475e75a</code></a>
feat: add input validation to isAbsoluteURL (<a
href="https://redirect.github.com/axios/axios/issues/7326">#7326</a>)</li>
<li><a
href="28c721588c"><code>28c7215</code></a>
fix: Denial of Service via <strong>proto</strong> Key in mergeConfig (<a
href="https://redirect.github.com/axios/axios/issues/7369">#7369</a>)</li>
<li><a
href="04cf01969e"><code>04cf019</code></a>
docs: clarify object check comment (<a
href="https://redirect.github.com/axios/axios/issues/7323">#7323</a>)</li>
<li><a
href="696fa753c5"><code>696fa75</code></a>
fix: status is missing in AxiosError on and after v1.13.3 (<a
href="https://redirect.github.com/axios/axios/issues/7368">#7368</a>)</li>
<li><a
href="569f028a58"><code>569f028</code></a>
fix: added a option to choose between legacy and the new
request/response int...</li>
<li><a
href="44b7c9f0c4"><code>44b7c9f</code></a>
chore(deps-dev): bump karma-sourcemap-loader (<a
href="https://redirect.github.com/axios/axios/issues/7360">#7360</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/axios/axios/compare/v1.13.1...v1.13.5">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by [GitHub Actions](<a
href="https://www.npmjs.com/~GitHub">https://www.npmjs.com/~GitHub</a>
Actions), a new releaser for axios since your current version.</p>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=axios&package-manager=npm_and_yarn&previous-version=1.13.1&new-version=1.13.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-02-20 02:52:36 +00:00
dependabot[bot]
c0b4d1e379 chore(deps): bump qs from 6.14.1 to 6.14.2 in /docs/en/getting-started/quickstart/js/adk (#2475)
Bumps [qs](https://github.com/ljharb/qs) from 6.14.1 to 6.14.2.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/ljharb/qs/blob/main/CHANGELOG.md">qs's
changelog</a>.</em></p>
<blockquote>
<h2><strong>6.14.2</strong></h2>
<ul>
<li>[Fix] <code>parse</code>: mark overflow objects for indexed notation
exceeding <code>arrayLimit</code> (<a
href="https://redirect.github.com/ljharb/qs/issues/546">#546</a>)</li>
<li>[Fix] <code>arrayLimit</code> means max count, not max index, in
<code>combine</code>/<code>merge</code>/<code>parseArrayValue</code></li>
<li>[Fix] <code>parse</code>: throw on <code>arrayLimit</code> exceeded
with indexed notation when <code>throwOnLimitExceeded</code> is true (<a
href="https://redirect.github.com/ljharb/qs/issues/529">#529</a>)</li>
<li>[Fix] <code>parse</code>: enforce <code>arrayLimit</code> on
<code>comma</code>-parsed values</li>
<li>[Fix] <code>parse</code>: fix error message to reflect arrayLimit as
max index; remove extraneous comments (<a
href="https://redirect.github.com/ljharb/qs/issues/545">#545</a>)</li>
<li>[Robustness] avoid <code>.push</code>, use <code>void</code></li>
<li>[readme] document that <code>addQueryPrefix</code> does not add
<code>?</code> to empty output (<a
href="https://redirect.github.com/ljharb/qs/issues/418">#418</a>)</li>
<li>[readme] clarify <code>parseArrays</code> and
<code>arrayLimit</code> documentation (<a
href="https://redirect.github.com/ljharb/qs/issues/543">#543</a>)</li>
<li>[readme] replace runkit CI badge with shields.io check-runs
badge</li>
<li>[meta] fix changelog typo (<code>arrayLength</code> →
<code>arrayLimit</code>)</li>
<li>[actions] fix rebase workflow permissions</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="bdcf0c7f82"><code>bdcf0c7</code></a>
v6.14.2</li>
<li><a
href="294db90c81"><code>294db90</code></a>
[readme] document that <code>addQueryPrefix</code> does not add
<code>?</code> to empty output</li>
<li><a
href="5c308e5516"><code>5c308e5</code></a>
[readme] clarify <code>parseArrays</code> and <code>arrayLimit</code>
documentation</li>
<li><a
href="6addf8cf73"><code>6addf8c</code></a>
[Fix] <code>parse</code>: mark overflow objects for indexed notation
exceeding <code>arrayLimit</code></li>
<li><a
href="cfc108f662"><code>cfc108f</code></a>
[Fix] <code>arrayLimit</code> means max count, not max index, in
<code>combine</code>/<code>merge</code>/`pars...</li>
<li><a
href="febb64442a"><code>febb644</code></a>
[Fix] <code>parse</code>: throw on <code>arrayLimit</code> exceeded with
indexed notation when `thr...</li>
<li><a
href="f6a7abff1f"><code>f6a7abf</code></a>
[Fix] <code>parse</code>: enforce <code>arrayLimit</code> on
<code>comma</code>-parsed values</li>
<li><a
href="fbc5206c25"><code>fbc5206</code></a>
[Fix] <code>parse</code>: fix error message to reflect arrayLimit as max
index; remove e...</li>
<li><a
href="1b9a8b4e78"><code>1b9a8b4</code></a>
[actions] fix rebase workflow permissions</li>
<li><a
href="2a35775614"><code>2a35775</code></a>
[meta] fix changelog typo (<code>arrayLength</code> →
<code>arrayLimit</code>)</li>
<li>Additional commits viewable in <a
href="https://github.com/ljharb/qs/compare/v6.14.1...v6.14.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=qs&package-manager=npm_and_yarn&previous-version=6.14.1&new-version=6.14.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-02-20 02:28:38 +00:00
dependabot[bot]
9ef30777ce chore(deps): bump qs from 6.14.1 to 6.14.2 in /docs/en/getting-started/quickstart/js/genkit (#2474)
Bumps [qs](https://github.com/ljharb/qs) from 6.14.1 to 6.14.2.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/ljharb/qs/blob/main/CHANGELOG.md">qs's
changelog</a>.</em></p>
<blockquote>
<h2><strong>6.14.2</strong></h2>
<ul>
<li>[Fix] <code>parse</code>: mark overflow objects for indexed notation
exceeding <code>arrayLimit</code> (<a
href="https://redirect.github.com/ljharb/qs/issues/546">#546</a>)</li>
<li>[Fix] <code>arrayLimit</code> means max count, not max index, in
<code>combine</code>/<code>merge</code>/<code>parseArrayValue</code></li>
<li>[Fix] <code>parse</code>: throw on <code>arrayLimit</code> exceeded
with indexed notation when <code>throwOnLimitExceeded</code> is true (<a
href="https://redirect.github.com/ljharb/qs/issues/529">#529</a>)</li>
<li>[Fix] <code>parse</code>: enforce <code>arrayLimit</code> on
<code>comma</code>-parsed values</li>
<li>[Fix] <code>parse</code>: fix error message to reflect arrayLimit as
max index; remove extraneous comments (<a
href="https://redirect.github.com/ljharb/qs/issues/545">#545</a>)</li>
<li>[Robustness] avoid <code>.push</code>, use <code>void</code></li>
<li>[readme] document that <code>addQueryPrefix</code> does not add
<code>?</code> to empty output (<a
href="https://redirect.github.com/ljharb/qs/issues/418">#418</a>)</li>
<li>[readme] clarify <code>parseArrays</code> and
<code>arrayLimit</code> documentation (<a
href="https://redirect.github.com/ljharb/qs/issues/543">#543</a>)</li>
<li>[readme] replace runkit CI badge with shields.io check-runs
badge</li>
<li>[meta] fix changelog typo (<code>arrayLength</code> →
<code>arrayLimit</code>)</li>
<li>[actions] fix rebase workflow permissions</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="bdcf0c7f82"><code>bdcf0c7</code></a>
v6.14.2</li>
<li><a
href="294db90c81"><code>294db90</code></a>
[readme] document that <code>addQueryPrefix</code> does not add
<code>?</code> to empty output</li>
<li><a
href="5c308e5516"><code>5c308e5</code></a>
[readme] clarify <code>parseArrays</code> and <code>arrayLimit</code>
documentation</li>
<li><a
href="6addf8cf73"><code>6addf8c</code></a>
[Fix] <code>parse</code>: mark overflow objects for indexed notation
exceeding <code>arrayLimit</code></li>
<li><a
href="cfc108f662"><code>cfc108f</code></a>
[Fix] <code>arrayLimit</code> means max count, not max index, in
<code>combine</code>/<code>merge</code>/`pars...</li>
<li><a
href="febb64442a"><code>febb644</code></a>
[Fix] <code>parse</code>: throw on <code>arrayLimit</code> exceeded with
indexed notation when `thr...</li>
<li><a
href="f6a7abff1f"><code>f6a7abf</code></a>
[Fix] <code>parse</code>: enforce <code>arrayLimit</code> on
<code>comma</code>-parsed values</li>
<li><a
href="fbc5206c25"><code>fbc5206</code></a>
[Fix] <code>parse</code>: fix error message to reflect arrayLimit as max
index; remove e...</li>
<li><a
href="1b9a8b4e78"><code>1b9a8b4</code></a>
[actions] fix rebase workflow permissions</li>
<li><a
href="2a35775614"><code>2a35775</code></a>
[meta] fix changelog typo (<code>arrayLength</code> →
<code>arrayLimit</code>)</li>
<li>Additional commits viewable in <a
href="https://github.com/ljharb/qs/compare/v6.14.1...v6.14.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=qs&package-manager=npm_and_yarn&previous-version=6.14.1&new-version=6.14.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-02-19 23:35:57 +00:00
dependabot[bot]
1a1b69d867 chore(deps): bump axios from 1.12.2 to 1.13.5 in /docs/en/getting-started/quickstart/js/llamaindex (#2460)
Bumps [axios](https://github.com/axios/axios) from 1.12.2 to 1.13.5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/axios/axios/releases">axios's
releases</a>.</em></p>
<blockquote>
<h2>v1.13.5</h2>
<h2>Release 1.13.5</h2>
<h3>Highlights</h3>
<ul>
<li><strong>Security:</strong> Fixed a potential <strong>Denial of
Service</strong> issue involving the <code>__proto__</code> key in
<code>mergeConfig</code>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7369">#7369</a>)</li>
<li><strong>Bug fix:</strong> Resolved an issue where
<code>AxiosError</code> could be missing the <code>status</code> field
on and after <strong>v1.13.3</strong>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7368">#7368</a>)</li>
</ul>
<h3>Changes</h3>
<h4>Security</h4>
<ul>
<li>Fix Denial of Service via <code>__proto__</code> key in
<code>mergeConfig</code>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7369">#7369</a>)</li>
</ul>
<h4>Fixes</h4>
<ul>
<li>Fix/5657. (PR <a
href="https://redirect.github.com/axios/axios/pull/7313">#7313</a>)</li>
<li>Ensure <code>status</code> is present in <code>AxiosError</code> on
and after v1.13.3. (PR <a
href="https://redirect.github.com/axios/axios/pull/7368">#7368</a>)</li>
</ul>
<h4>Features / Improvements</h4>
<ul>
<li>Add input validation to <code>isAbsoluteURL</code>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7326">#7326</a>)</li>
<li>Refactor: bump minor package versions. (PR <a
href="https://redirect.github.com/axios/axios/pull/7356">#7356</a>)</li>
</ul>
<h4>Documentation</h4>
<ul>
<li>Clarify object-check comment. (PR <a
href="https://redirect.github.com/axios/axios/pull/7323">#7323</a>)</li>
<li>Fix deprecated <code>Buffer</code> constructor usage and README
formatting. (PR <a
href="https://redirect.github.com/axios/axios/pull/7371">#7371</a>)</li>
</ul>
<h4>CI / Maintenance</h4>
<ul>
<li>Chore: fix issues with YAML. (PR <a
href="https://redirect.github.com/axios/axios/pull/7355">#7355</a>)</li>
<li>CI: update workflow YAMLs. (PR <a
href="https://redirect.github.com/axios/axios/pull/7372">#7372</a>)</li>
<li>CI: fix run condition. (PR <a
href="https://redirect.github.com/axios/axios/pull/7373">#7373</a>)</li>
<li>Dev deps: bump <code>karma-sourcemap-loader</code> from 0.3.8 to
0.4.0. (PR <a
href="https://redirect.github.com/axios/axios/pull/7360">#7360</a>)</li>
<li>Chore(release): prepare release 1.13.5. (PR <a
href="https://redirect.github.com/axios/axios/pull/7379">#7379</a>)</li>
</ul>
<h3>New Contributors</h3>
<ul>
<li><a
href="https://github.com/sachin11063"><code>@​sachin11063</code></a>
(first contribution — PR <a
href="https://redirect.github.com/axios/axios/pull/7323">#7323</a>)</li>
<li><a
href="https://github.com/asmitha-16"><code>@​asmitha-16</code></a>
(first contribution — PR <a
href="https://redirect.github.com/axios/axios/pull/7326">#7326</a>)</li>
</ul>
<p><strong>Full Changelog:</strong> <a
href="https://github.com/axios/axios/compare/v1.13.4...v1.13.5">https://github.com/axios/axios/compare/v1.13.4...v1.13.5</a></p>
<h2>v1.13.4</h2>
<h2>Overview</h2>
<p>The release addresses issues discovered in v1.13.3 and includes
significant CI/CD improvements.</p>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/axios/axios/compare/v1.13.3...v1.13.4">v1.13.3...v1.13.4</a></p>
<h2>What's New in v1.13.4</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>fix: issues with version 1.13.3</strong> (<a
href="https://redirect.github.com/axios/axios/issues/7352">#7352</a>)
(<a
href="ee90dfc28a">ee90dfc</a>)
<ul>
<li>Fixed issues discovered in v1.13.3 release</li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/axios/axios/blob/v1.x/CHANGELOG.md">axios's
changelog</a>.</em></p>
<blockquote>
<h1>Changelog</h1>
<h2><a
href="https://github.com/axios/axios/compare/v1.13.2...v1.13.3">1.13.3</a>
(2026-01-20)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>http2:</strong> Use port 443 for HTTPS connections by
default. (<a
href="https://redirect.github.com/axios/axios/issues/7256">#7256</a>)
(<a
href="d7e6065346">d7e6065</a>)</li>
<li><strong>interceptor:</strong> handle the error in the same
interceptor (<a
href="https://redirect.github.com/axios/axios/issues/6269">#6269</a>)
(<a
href="5945e40bb1">5945e40</a>)</li>
<li>main field in package.json should correspond to cjs artifacts (<a
href="https://redirect.github.com/axios/axios/issues/5756">#5756</a>)
(<a
href="7373fbff24">7373fbf</a>)</li>
<li><strong>package.json:</strong> add 'bun' package.json 'exports'
condition. Load the Node.js build in Bun instead of the browser build
(<a
href="https://redirect.github.com/axios/axios/issues/5754">#5754</a>)
(<a
href="b89217e3e9">b89217e</a>)</li>
<li>silentJSONParsing=false should throw on invalid JSON (<a
href="https://redirect.github.com/axios/axios/issues/7253">#7253</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/7257">#7257</a>)
(<a
href="7d19335e43">7d19335</a>)</li>
<li>turn AxiosError into a native error (<a
href="https://redirect.github.com/axios/axios/issues/5394">#5394</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/5558">#5558</a>)
(<a
href="1c6a86dd2c">1c6a86d</a>)</li>
<li><strong>types:</strong> add handlers to AxiosInterceptorManager
interface (<a
href="https://redirect.github.com/axios/axios/issues/5551">#5551</a>)
(<a
href="8d1271b49f">8d1271b</a>)</li>
<li><strong>types:</strong> restore AxiosError.cause type from unknown
to Error (<a
href="https://redirect.github.com/axios/axios/issues/7327">#7327</a>)
(<a
href="d8233d9e8e">d8233d9</a>)</li>
<li>unclear error message is thrown when specifying an empty proxy
authorization (<a
href="https://redirect.github.com/axios/axios/issues/6314">#6314</a>)
(<a
href="6ef867e684">6ef867e</a>)</li>
</ul>
<h3>Features</h3>
<ul>
<li>add <code>undefined</code> as a value in AxiosRequestConfig (<a
href="https://redirect.github.com/axios/axios/issues/5560">#5560</a>)
(<a
href="095033c626">095033c</a>)</li>
<li>add automatic minor and patch upgrades to dependabot (<a
href="https://redirect.github.com/axios/axios/issues/6053">#6053</a>)
(<a
href="65a7584eda">65a7584</a>)</li>
<li>add Node.js coverage script using c8 (closes <a
href="https://redirect.github.com/axios/axios/issues/7289">#7289</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/7294">#7294</a>)
(<a
href="ec9d94e9f8">ec9d94e</a>)</li>
<li>added copilot instructions (<a
href="3f83143bfe">3f83143</a>)</li>
<li>compatibility with frozen prototypes (<a
href="https://redirect.github.com/axios/axios/issues/6265">#6265</a>)
(<a
href="860e03396a">860e033</a>)</li>
<li>enhance pipeFileToResponse with error handling (<a
href="https://redirect.github.com/axios/axios/issues/7169">#7169</a>)
(<a
href="88d7884254">88d7884</a>)</li>
<li><strong>types:</strong> Intellisense for string literals in a
widened union (<a
href="https://redirect.github.com/axios/axios/issues/6134">#6134</a>)
(<a
href="f73474d02c">f73474d</a>),
closes <a
href="https://redirect.github.com//redirect.github.com/microsoft/TypeScript/issues/33471/issues/issuecomment-1376364329">microsoft/TypeScript#33471</a></li>
</ul>
<h3>Reverts</h3>
<ul>
<li>Revert &quot;fix: silentJSONParsing=false should throw on invalid
JSON (<a
href="https://redirect.github.com/axios/axios/issues/7253">#7253</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/7">#7</a>…&quot;
(<a
href="https://redirect.github.com/axios/axios/issues/7298">#7298</a>)
(<a
href="a4230f5581">a4230f5</a>),
closes <a
href="https://redirect.github.com/axios/axios/issues/7253">#7253</a> <a
href="https://redirect.github.com/axios/axios/issues/7">#7</a> <a
href="https://redirect.github.com/axios/axios/issues/7298">#7298</a></li>
<li><strong>deps:</strong> bump peter-evans/create-pull-request from 7
to 8 in the github-actions group (<a
href="https://redirect.github.com/axios/axios/issues/7334">#7334</a>)
(<a
href="2d6ad5e48b">2d6ad5e</a>)</li>
</ul>
<h3>Contributors to this release</h3>
<ul>
<li><!-- raw HTML omitted --> <a href="https://github.com/ashvin2005"
title="+1752/-4 ([#7218](https://github.com/axios/axios/issues/7218)
[#7218](https://github.com/axios/axios/issues/7218) )">Ashvin
Tiwari</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/mochinikunj"
title="+940/-12 ([#7294](https://github.com/axios/axios/issues/7294)
[#7294](https://github.com/axios/axios/issues/7294) )">Nikunj
Mochi</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/imanchalsingh"
title="+544/-102 ([#7169](https://github.com/axios/axios/issues/7169)
[#7185](https://github.com/axios/axios/issues/7185) )">Anchal
Singh</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/jasonsaayman"
title="+317/-73 ([#7334](https://github.com/axios/axios/issues/7334)
[#7298](https://github.com/axios/axios/issues/7298)
)">jasonsaayman</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/brodo"
title="+99/-120 ([#5558](https://github.com/axios/axios/issues/5558)
)">Julian Dax</a></li>
<li><!-- raw HTML omitted --> <a
href="https://github.com/AKASHDHARDUBEY" title="+167/-0
([#7287](https://github.com/axios/axios/issues/7287)
[#7288](https://github.com/axios/axios/issues/7288) )">Akash Dhar
Dubey</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/madhumitaaa"
title="+20/-68 ([#7198](https://github.com/axios/axios/issues/7198)
)">Madhumita</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/Tackoil"
title="+80/-2 ([#6269](https://github.com/axios/axios/issues/6269)
)">Tackoil</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/justindhillon"
title="+41/-41 ([#6324](https://github.com/axios/axios/issues/6324)
[#6315](https://github.com/axios/axios/issues/6315) )">Justin
Dhillon</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/Rudrxxx"
title="+71/-2 ([#7257](https://github.com/axios/axios/issues/7257)
)">Rudransh</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/WuMingDao"
title="+36/-36 ([#7215](https://github.com/axios/axios/issues/7215)
)">WuMingDao</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/codenomnom"
title="+70/-0 ([#7201](https://github.com/axios/axios/issues/7201)
[#7201](https://github.com/axios/axios/issues/7201)
)">codenomnom</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/Nandann018-ux"
title="+60/-10 ([#7272](https://github.com/axios/axios/issues/7272)
)">Nandan Acharya</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/KernelDeimos"
title="+22/-40 ([#7042](https://github.com/axios/axios/issues/7042)
)">Eric Dubé</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/tiborpilz"
title="+40/-4 ([#5551](https://github.com/axios/axios/issues/5551)
)">Tibor Pilz</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/joaoGabriel55"
title="+31/-4 ([#6314](https://github.com/axios/axios/issues/6314)
)">Gabriel Quaresma</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/turadg"
title="+23/-6 ([#6265](https://github.com/axios/axios/issues/6265)
)">Turadg Aleahmad</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="29f75425f0"><code>29f7542</code></a>
chore(release): prepare release 1.13.5 (<a
href="https://redirect.github.com/axios/axios/issues/7379">#7379</a>)</li>
<li><a
href="431c3a3614"><code>431c3a3</code></a>
ci: fix run condition (<a
href="https://redirect.github.com/axios/axios/issues/7373">#7373</a>)</li>
<li><a
href="9ff3a78ad7"><code>9ff3a78</code></a>
ci: update ymls (<a
href="https://redirect.github.com/axios/axios/issues/7372">#7372</a>)</li>
<li><a
href="265b71234c"><code>265b712</code></a>
docs: fix deprecated Buffer constructor and formatting issues in README
(<a
href="https://redirect.github.com/axios/axios/issues/7371">#7371</a>)</li>
<li><a
href="475e75a260"><code>475e75a</code></a>
feat: add input validation to isAbsoluteURL (<a
href="https://redirect.github.com/axios/axios/issues/7326">#7326</a>)</li>
<li><a
href="28c721588c"><code>28c7215</code></a>
fix: Denial of Service via <strong>proto</strong> Key in mergeConfig (<a
href="https://redirect.github.com/axios/axios/issues/7369">#7369</a>)</li>
<li><a
href="04cf01969e"><code>04cf019</code></a>
docs: clarify object check comment (<a
href="https://redirect.github.com/axios/axios/issues/7323">#7323</a>)</li>
<li><a
href="696fa753c5"><code>696fa75</code></a>
fix: status is missing in AxiosError on and after v1.13.3 (<a
href="https://redirect.github.com/axios/axios/issues/7368">#7368</a>)</li>
<li><a
href="569f028a58"><code>569f028</code></a>
fix: added a option to choose between legacy and the new
request/response int...</li>
<li><a
href="44b7c9f0c4"><code>44b7c9f</code></a>
chore(deps-dev): bump karma-sourcemap-loader (<a
href="https://redirect.github.com/axios/axios/issues/7360">#7360</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/axios/axios/compare/v1.12.2...v1.13.5">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by [GitHub Actions](<a
href="https://www.npmjs.com/~GitHub">https://www.npmjs.com/~GitHub</a>
Actions), a new releaser for axios since your current version.</p>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=axios&package-manager=npm_and_yarn&previous-version=1.12.2&new-version=1.13.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-02-19 15:07:39 -08:00
Google Admin
6ad1f1fd9a ci: Refactor Github Action per b/485167538 (#2512)
This is a http://go/LSC run by http://go/ghss to automatically refactor
your Github Actions per http://b/485167538.

This is a PR to help you upgrade to the latest standards in Github
Actions.

Please merge this PR to accept the changes. NOTE: if you do not accept
this PR, it may be force merged by the GHSS team. See http://b/485167538
for more details.

Co-authored-by: Ben Knutson <benknutson@google.com>
Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-02-19 18:38:56 +00:00
Yaroslav
d6af2907fd feat(sources/redis): add TLS support for Redis connections (#2432)
## Summary
- Add `tlsEnabled` config field to Redis source for enabling TLS on
connections
- Apply TLS config to both cluster and standalone Redis clients
- Add test case for TLS config parsing and update docs

This is needed for cloud-managed Redis services like AWS ElastiCache
(Redis OSS) that require TLS for secure connections.

## Example config (tools.yaml)
```yaml
sources:
  leadsforge-redis:
    kind: redis
    address:
      - ${REDIS_HOST}
    clusterEnabled: true
    tls:
      enabled: true
      insecureSkipVerify: true
```

---------

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-02-18 16:11:05 -08:00
dependabot[bot]
3684efd512 chore(deps): bump ajv from 8.17.1 to 8.18.0 in /docs/en/getting-started/quickstart/js/genkit (#2487)
Bumps [ajv](https://github.com/ajv-validator/ajv) from 8.17.1 to 8.18.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ajv-validator/ajv/releases">ajv's
releases</a>.</em></p>
<blockquote>
<h2>v8.18.0</h2>
<h2>What's Changed</h2>
<ul>
<li>feat: allow tree-shaking by adding <code>&quot;sideEffects&quot;:
false</code> to <code>package.json</code> by <a
href="https://github.com/josdejong"><code>@​josdejong</code></a> in <a
href="https://redirect.github.com/ajv-validator/ajv/pull/2480">ajv-validator/ajv#2480</a></li>
<li>fix: <a
href="https://redirect.github.com/ajv-validator/ajv/issues/2482">#2482</a>
Infinity and NaN serialise to null by <a
href="https://github.com/jasoniangreen"><code>@​jasoniangreen</code></a>
in <a
href="https://redirect.github.com/ajv-validator/ajv/pull/2487">ajv-validator/ajv#2487</a></li>
<li>fix: small grammatical error in managing-schemas.md by <a
href="https://github.com/monteiro-renato"><code>@​monteiro-renato</code></a>
in <a
href="https://redirect.github.com/ajv-validator/ajv/pull/2508">ajv-validator/ajv#2508</a></li>
<li>fix: typos in schema-language.md by <a
href="https://github.com/monteiro-renato"><code>@​monteiro-renato</code></a>
in <a
href="https://redirect.github.com/ajv-validator/ajv/pull/2507">ajv-validator/ajv#2507</a></li>
<li>fix(pattern): use configured RegExp engine with $data keyword to
mitigate ReDoS attacks (CVE-2025-69873) by <a
href="https://github.com/epoberezkin"><code>@​epoberezkin</code></a> in
<a
href="https://redirect.github.com/ajv-validator/ajv/pull/2586">ajv-validator/ajv#2586</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/josdejong"><code>@​josdejong</code></a>
made their first contribution in <a
href="https://redirect.github.com/ajv-validator/ajv/pull/2480">ajv-validator/ajv#2480</a></li>
<li><a
href="https://github.com/monteiro-renato"><code>@​monteiro-renato</code></a>
made their first contribution in <a
href="https://redirect.github.com/ajv-validator/ajv/pull/2508">ajv-validator/ajv#2508</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/ajv-validator/ajv/compare/v8.17.1...v8.18.0">https://github.com/ajv-validator/ajv/compare/v8.17.1...v8.18.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="142ce84b80"><code>142ce84</code></a>
8.18.0</li>
<li><a
href="720a23fa45"><code>720a23f</code></a>
fix(pattern): use configured RegExp engine with $data keyword to
mitigate ReD...</li>
<li><a
href="82735a1582"><code>82735a1</code></a>
fix: typos in schema-language.md (<a
href="https://redirect.github.com/ajv-validator/ajv/issues/2507">#2507</a>)</li>
<li><a
href="b17ec32cd9"><code>b17ec32</code></a>
fix: small grammatical error in managing-schemas.md (<a
href="https://redirect.github.com/ajv-validator/ajv/issues/2508">#2508</a>)</li>
<li><a
href="69568d0856"><code>69568d0</code></a>
fix: <a
href="https://redirect.github.com/ajv-validator/ajv/issues/2482">#2482</a>
Infinity and NaN serialise to null (<a
href="https://redirect.github.com/ajv-validator/ajv/issues/2487">#2487</a>)</li>
<li><a
href="f06766f33e"><code>f06766f</code></a>
feat: allow tree-shaking by adding ``&quot;sideEffects&quot;:
false<code>to</code>package.json` ...</li>
<li>See full diff in <a
href="https://github.com/ajv-validator/ajv/compare/v8.17.1...v8.18.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ajv&package-manager=npm_and_yarn&previous-version=8.17.1&new-version=8.18.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-02-18 15:41:29 -08:00
Mend Renovate
7a6d0c12e9 chore(deps): update peter-evans/create-or-update-comment action to v5 (#2500)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[peter-evans/create-or-update-comment](https://redirect.github.com/peter-evans/create-or-update-comment)
| action | major | `v4` → `v5` |

---

### Release Notes

<details>
<summary>peter-evans/create-or-update-comment
(peter-evans/create-or-update-comment)</summary>

###
[`v5`](https://redirect.github.com/peter-evans/create-or-update-comment/compare/v4...v5)

[Compare
Source](https://redirect.github.com/peter-evans/create-or-update-comment/compare/v4...v5)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yMi4wIiwidXBkYXRlZEluVmVyIjoiNDMuMjIuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-02-18 21:31:15 +00:00
Mark L
57b77bca09 feat(sources/postgres): add configurable pgx query execution mode (#2477)
Adds optional `queryExecMode` to postgres source config, allowing users
to set pgx `DefaultQueryExecMode` for compatibility with external
connection poolers (e.g. transaction pooling).

Supported values:
- cache_statement (default)
- cache_describe
- describe_exec
- exec
- simple_protocol

Implementation details:
- parse DSN with `pgxpool.ParseConfig`
- map `queryExecMode` to `pgx.QueryExecMode*`
- create pool via `pgxpool.NewWithConfig`
- validate config using `oneof` tag
- document new field in postgres source docs
- add parser/validation tests

Tests run:
`go test -v ./internal/sources/postgres -count=1 -vet=off`

Refs #2385

---------

Co-authored-by: Molt (OpenClaw) <noreply@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
Co-authored-by: Yuan Teoh <yuanteoh@google.com>
2026-02-18 20:35:44 +00:00
Benny Magid
276cf604a2 feat(ui): make tool list panel resizable (#2253)
## Description

Add draggable resize handle to tool list panel with min/max width
constraints, visual feedback, and localStorage persistence.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #1729

---------

Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2026-02-18 15:07:40 -05:00
dependabot[bot]
e8f3b9c8f2 chore(deps): bump axios from 1.13.4 to 1.13.5 in /docs/en/samples/pre_post_processing/js/langchain (#2510)
Bumps [axios](https://github.com/axios/axios) from 1.13.4 to 1.13.5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/axios/axios/releases">axios's
releases</a>.</em></p>
<blockquote>
<h2>v1.13.5</h2>
<h2>Release 1.13.5</h2>
<h3>Highlights</h3>
<ul>
<li><strong>Security:</strong> Fixed a potential <strong>Denial of
Service</strong> issue involving the <code>__proto__</code> key in
<code>mergeConfig</code>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7369">#7369</a>)</li>
<li><strong>Bug fix:</strong> Resolved an issue where
<code>AxiosError</code> could be missing the <code>status</code> field
on and after <strong>v1.13.3</strong>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7368">#7368</a>)</li>
</ul>
<h3>Changes</h3>
<h4>Security</h4>
<ul>
<li>Fix Denial of Service via <code>__proto__</code> key in
<code>mergeConfig</code>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7369">#7369</a>)</li>
</ul>
<h4>Fixes</h4>
<ul>
<li>Fix/5657. (PR <a
href="https://redirect.github.com/axios/axios/pull/7313">#7313</a>)</li>
<li>Ensure <code>status</code> is present in <code>AxiosError</code> on
and after v1.13.3. (PR <a
href="https://redirect.github.com/axios/axios/pull/7368">#7368</a>)</li>
</ul>
<h4>Features / Improvements</h4>
<ul>
<li>Add input validation to <code>isAbsoluteURL</code>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7326">#7326</a>)</li>
<li>Refactor: bump minor package versions. (PR <a
href="https://redirect.github.com/axios/axios/pull/7356">#7356</a>)</li>
</ul>
<h4>Documentation</h4>
<ul>
<li>Clarify object-check comment. (PR <a
href="https://redirect.github.com/axios/axios/pull/7323">#7323</a>)</li>
<li>Fix deprecated <code>Buffer</code> constructor usage and README
formatting. (PR <a
href="https://redirect.github.com/axios/axios/pull/7371">#7371</a>)</li>
</ul>
<h4>CI / Maintenance</h4>
<ul>
<li>Chore: fix issues with YAML. (PR <a
href="https://redirect.github.com/axios/axios/pull/7355">#7355</a>)</li>
<li>CI: update workflow YAMLs. (PR <a
href="https://redirect.github.com/axios/axios/pull/7372">#7372</a>)</li>
<li>CI: fix run condition. (PR <a
href="https://redirect.github.com/axios/axios/pull/7373">#7373</a>)</li>
<li>Dev deps: bump <code>karma-sourcemap-loader</code> from 0.3.8 to
0.4.0. (PR <a
href="https://redirect.github.com/axios/axios/pull/7360">#7360</a>)</li>
<li>Chore(release): prepare release 1.13.5. (PR <a
href="https://redirect.github.com/axios/axios/pull/7379">#7379</a>)</li>
</ul>
<h3>New Contributors</h3>
<ul>
<li><a
href="https://github.com/sachin11063"><code>@​sachin11063</code></a>
(first contribution — PR <a
href="https://redirect.github.com/axios/axios/pull/7323">#7323</a>)</li>
<li><a
href="https://github.com/asmitha-16"><code>@​asmitha-16</code></a>
(first contribution — PR <a
href="https://redirect.github.com/axios/axios/pull/7326">#7326</a>)</li>
</ul>
<p><strong>Full Changelog:</strong> <a
href="https://github.com/axios/axios/compare/v1.13.4...v1.13.5">https://github.com/axios/axios/compare/v1.13.4...v1.13.5</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="29f75425f0"><code>29f7542</code></a>
chore(release): prepare release 1.13.5 (<a
href="https://redirect.github.com/axios/axios/issues/7379">#7379</a>)</li>
<li><a
href="431c3a3614"><code>431c3a3</code></a>
ci: fix run condition (<a
href="https://redirect.github.com/axios/axios/issues/7373">#7373</a>)</li>
<li><a
href="9ff3a78ad7"><code>9ff3a78</code></a>
ci: update ymls (<a
href="https://redirect.github.com/axios/axios/issues/7372">#7372</a>)</li>
<li><a
href="265b71234c"><code>265b712</code></a>
docs: fix deprecated Buffer constructor and formatting issues in README
(<a
href="https://redirect.github.com/axios/axios/issues/7371">#7371</a>)</li>
<li><a
href="475e75a260"><code>475e75a</code></a>
feat: add input validation to isAbsoluteURL (<a
href="https://redirect.github.com/axios/axios/issues/7326">#7326</a>)</li>
<li><a
href="28c721588c"><code>28c7215</code></a>
fix: Denial of Service via <strong>proto</strong> Key in mergeConfig (<a
href="https://redirect.github.com/axios/axios/issues/7369">#7369</a>)</li>
<li><a
href="04cf01969e"><code>04cf019</code></a>
docs: clarify object check comment (<a
href="https://redirect.github.com/axios/axios/issues/7323">#7323</a>)</li>
<li><a
href="696fa753c5"><code>696fa75</code></a>
fix: status is missing in AxiosError on and after v1.13.3 (<a
href="https://redirect.github.com/axios/axios/issues/7368">#7368</a>)</li>
<li><a
href="569f028a58"><code>569f028</code></a>
fix: added a option to choose between legacy and the new
request/response int...</li>
<li><a
href="44b7c9f0c4"><code>44b7c9f</code></a>
chore(deps-dev): bump karma-sourcemap-loader (<a
href="https://redirect.github.com/axios/axios/issues/7360">#7360</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/axios/axios/compare/v1.13.4...v1.13.5">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=axios&package-manager=npm_and_yarn&previous-version=1.13.4&new-version=1.13.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-18 11:12:10 -08:00
Twisha Bansal
77f7990a03 docs: add pre/post processing docs for langchain JS (#2421)
## Description

Trigger has been tested corresponding to local changes. Latest
successful run:
https://pantheon.corp.google.com/cloud-build/builds;region=global/0e7720f6-451c-4a89-8a43-a35131ec90a5;step=0?project=toolbox-testing-438616

Note: After merging, update JS pre and post processing sample testing
trigger.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Anubhav Dhawan <anubhavdhawan@google.com>
2026-02-18 17:15:15 +05:30
Twisha Bansal
90ba07dfe0 chore: fix license (#2455)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-02-18 10:21:57 +00:00
Twisha Bansal
e84a51b660 docs: make branding consistent across quickstart docs (#2498)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-02-18 09:58:52 +00:00
manuka rahul
3e7d9b243d docs: link check only on .md files (#2501)
Previously, the link checker ran on all changed files; it has now been
restricted to changed .md files only.

---------

Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-02-18 15:06:00 +05:30
Mend Renovate
5a1559e1c8 chore(deps): pin dependencies (#2499)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[peter-evans/create-or-update-comment](https://redirect.github.com/peter-evans/create-or-update-comment)
| action | pinDigest | → `71345be` |
|
[peter-evans/find-comment](https://redirect.github.com/peter-evans/find-comment)
| action | pinDigest | → `b30e6a3` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yMi4wIiwidXBkYXRlZEluVmVyIjoiNDMuMjIuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
2026-02-18 08:56:22 +00:00
Twisha Bansal
5b107c53f3 docs: make processing docs consistent across languages (#2497)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-02-18 08:30:17 +00:00
manuka rahul
4d51c2a61e docs: optimize link checker (#2482)
Previous Functionality
The original workflow was designed to execute the link checker across
every file in the repository during each run.

Planned Enhancements
To improve efficiency, the process will be bifurcated into three
distinct components:

- Presubmit Check: The link checker will only target files that have
been modified.
- Improved Reporting: Broken links are now reported via a single,
automated comment in the PR conversation (which updates automatically on
subsequent pushes).

<img width="1478" height="1300" alt="Screenshot 2026-02-17 3 47 52 PM"
src="https://github.com/user-attachments/assets/9f52c4d3-43a5-4b3a-96f5-09ba0e49b402"
/>



- Cleaner Logs: Suppressed non-critical redirect warnings and PR comment
now focuses strictly on broken URLs to make debugging faster.

---------

Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-02-18 08:06:02 +00:00
Twisha Bansal
3ceec96f8a docs: add pre/post processing docs for ADK Go (#2441)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-02-18 13:11:19 +05:30
Twisha Bansal
06e01aecd1 docs: add pre/post processing best practices (#2435)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-02-18 07:16:43 +00:00
Google Admin
af146cfb8a refactor: refactor Github Action per b/485167538 (#2491)
This is a http://go/LSC run by http://go/ghss to automatically refactor
your Github Actions per http://b/485167538.

This is a PR to help you upgrade to the latest standards in Github
Actions.

Please merge this PR to accept the changes. NOTE: if you do not accept
this PR, it may be force merged by the GHSS team. See http://b/485167538
for more details.

Co-authored-by: Ben Knutson <benknutson@google.com>
2026-02-18 01:30:23 +00:00
Yuan Teoh
417806d84d chore(deps): update httplog to v3 (#2445)
Update httplog from
[v2](https://pkg.go.dev/github.com/go-chi/httplog#section-readme) to
[v3](https://pkg.go.dev/github.com/go-chi/httplog/v3).

`httplog` now runs with `slog.Logger` instead of zerolog, so we can use
our build-in logs instead of having to create neew httplogger. However,
the request logger only takes a single logger instance; wherease in
Toolbox, we separate each log instance into `outLogger` and `errLogger`.
A new `SplitHandler` is added to helps route the separate Logger into a
single `*slog.Logger` instance.

#2336

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-02-17 19:02:51 +00:00
Yuan Teoh
5efd435c23 chore: resolve golangci-lint QF1012 (#2486)
Latest golangci-lint version had included
[QF1012](https://go.dev/gopls/analyzers#qf1012-use-fmtfprintfx--instead-of-xwritefmtsprintf)
into static check.
2026-02-17 10:07:12 -08:00
Niraj Nandre
8a96fb1a88 fix(tests/postgres): implement uuid-based isolation and reliable resource cleanup (#2377)
…atements

## Description

This PR resolves integration test resource leaks and memory exhaustion
by implementing per-test isolation and reliable teardown logic.

**Files Updated:**

- **tests/common.go**: Refactored CleanupPostgresTables to target
specific uniqueID resources.
- **tests/alloydbpg/alloydb_pg_integration_test.go**: Integrated
t.Cleanup and unique ID logging.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<2463>
2026-02-17 13:39:53 +00:00
dishaprakash
d4ff6bebe9 docs(Go SDK): Update documentation for the refactored Go SDK (#2479)
## Description

This PR updates the documentation after the refactor of the Go SDK into
a multi-module structure

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-02-17 00:39:11 +05:30
Anubhav Dhawan
41afeafaae refactor: remove explicit Protocol import and argument from ToolboxClient initialization example in deployment documentation (#2480)
We now use `Protocol.MCP` as default and would be deprecating
`Protocol.TOOLBOX` going forward. This PR makes the guide simpler and
more future-proof by removing passing `Protocol.TOOLBOX`.
2026-02-16 16:49:11 +05:30
Twisha Bansal
598b56f478 refactor: remove golden file from quickstart tests (#2456)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-02-16 13:15:19 +05:30
Averi Kitsch
a678886ee3 docs: update prebuilt tools ref (#2459)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-02-13 18:57:55 +00:00
Averi Kitsch
6602abd059 docs: update diagram (#2461)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-02-13 10:25:34 -08:00
Binh Tran
62b830987d fix: Deflake alloydb omni (#2431)
## Description

Improve logic to check that database is up.

**IMPORTANT** DO NOT MERGE until I have reverted
f7d7d9e708

## PR Checklist

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] https://github.com/googleapis/genai-toolbox/issues/2422
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #2422

Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-02-13 09:55:53 -08:00
Yuan Teoh
195767bdcd refactor: refactor subcommands and move tests to its own package (#2439)
This PR refactors the command structure to decouple subcommands from the
root command, improving modularity and testability.

**Key Changes:**
- Move `internal/cli` to `cmd/internal`. Being in a `internal` folder,
other packages outside of `cmd` will not be able to import them.
- Encapsulated I/O: Introduced a new IOStreams struct to standardize in,
out, and errOut handling.
- Shared Dependencies: Extracted shared fields (including IOStreams,
Logger, ServerConfig, and various Tools paths) from the root `Command`
into a new `ToolboxOptions` struct. This also includes moving
`cmd/options.go` to be part of `ToolboxOptions`.
- Logic Migration: Moved setup logic, such as `Setup()` and
`LoadConfig()`, into `ToolboxOptions`. Removing the need to import
`rootCmd` to subcommands.
- Package Reorganization:
- Relocated PersistentFlag and ToolsFiles to the cli package to remove
base command dependencies. This removes dependencies on the base
command, allowing subcommands to consume these utilities independently.
- Moved all side-effect registration to the `cmd/internal` package,
enabling other packages to import it safely for unit tests.

**Testing Improvements:**
- Subcommand packages can now be tested in isolation without relying on
the base command package.
- Added `TestSubcommandWiring()` to the base command tests to verify
proper subcommand registration.
2026-02-13 02:28:58 +00:00
release-please[bot]
c5524d32f5 chore(main): release 0.27.0 (#2363)
🤖 I have created a release *beep* *boop*
---


##
[0.27.0](https://github.com/googleapis/genai-toolbox/compare/v0.26.0...v0.27.0)
(2026-02-12)


### ⚠ BREAKING CHANGES

* Update configuration file v2
([#2369](293c1d6889))
* Update/add detailed telemetry for mcp endpoint compliant with OTEL
semantic convention
([#1987](https://github.com/googleapis/genai-toolbox/issues/1987))
([478a0bd](478a0bdb59))

### Features

* **cli/invoke:** Add support for direct tool invocation from CLI
([#2353](https://github.com/googleapis/genai-toolbox/issues/2353))
([6e49ba4](6e49ba436e))
* **cli/skills:** Add support for generating agent skills from toolset
([#2392](https://github.com/googleapis/genai-toolbox/issues/2392))
([80ef346](80ef346214))
* **cloud-logging-admin:** Add source, tools, integration test and docs
([#2137](https://github.com/googleapis/genai-toolbox/issues/2137))
([252fc30](252fc3091a))
* **cockroachdb:** Add CockroachDB integration with cockroach-go
([#2006](https://github.com/googleapis/genai-toolbox/issues/2006))
([1fdd99a](1fdd99a9b6))
* **prebuiltconfigs/alloydb-omni:** Implement Alloydb omni dataplane
tools ([#2340](https://github.com/googleapis/genai-toolbox/issues/2340))
([e995349](e995349ea0))
* **server:** Add Tool call error categories
([#2387](https://github.com/googleapis/genai-toolbox/issues/2387))
([32cb4db](32cb4db712))
* **tools/looker:** support `looker-validate-project` tool
([#2430](https://github.com/googleapis/genai-toolbox/issues/2430))
([a15a128](a15a12873f))



### Bug Fixes

* **dataplex:** Capture GCP HTTP errors in MCP Toolbox
([#2347](https://github.com/googleapis/genai-toolbox/issues/2347))
([1d7c498](1d7c498116))
* **sources/cockroachdb:** Update kind to type
([#2465](https://github.com/googleapis/genai-toolbox/issues/2465))
([2d341ac](2d341acaa6))
* Surface Dataplex API errors in MCP results
([#2347](1d7c498116))


---
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>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-02-12 18:03:05 -08:00
Yuan Teoh
e1739abd81 chore: release 0.27.0 (#2467)
Release-As: 0.27.0
2026-02-13 01:16:23 +00:00
Parth Ajmera
478a0bdb59 feat: update/add detailed telemetry for stdio and http mcp transports (#1987)
## Description

This PR adds consistent and actionable telemetry for MCP sessions across
HTTP and STDIO transports, enabling quick visibility into toolset
discovery and tool invocation activity with minimal setup.

## PR Checklist

- [x] Make sure you reviewed
[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Make sure to open an issue as a
[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
before writing your code! That way we can discuss the change, evaluate
designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

---------

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-02-13 00:29:53 +00:00
Yuan Teoh
2d341acaa6 fix(sources/cockroachdb): update kind to type (#2465)
Fix failing integration test, clean up source code from `kind` to
`type`.
2026-02-12 23:59:55 +00:00
Huan Chen
f032389a07 chore(tools/bigquery&looker-conversational-analytics): add X-Goog-API-Client header (#2462)
## Description

Add X-Goog-API-Client header.

Change entry point to v1beta.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-02-12 12:55:12 -08:00
Wenxin Du
32610d71a3 refactor(server): standardize tool error handling and status code mapping (#2402)
- Detect errors and return error codes accordingly in the tool call
handler functions.
- Replace the old `util.ErrUnauthorized` with the new Toolbox error
type.
2026-02-12 11:42:27 -05:00
Wenxin Du
32cb4db712 feat(server): add Tool call error categories (#2387)
Create Agent vs Server error types to distinguish between the two types.

---------

Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-02-12 13:34:28 +00:00
Virag Tripathi
1fdd99a9b6 feat(cockroachdb): add CockroachDB integration with cockroach-go (#2006)
Add support for CockroachDB v25.4.0+ using the official cockroach-go/v2
library for automatic transaction retry.

- Add CockroachDB source with ExecuteTxWithRetry using crdbpgx.ExecuteTx
- Implement 4 tools: execute-sql, sql, list-tables, list-schemas
- Use UUID primary keys (CockroachDB best practice)
- Add unit tests for source and all tools
- Add integration tests with retry verification
- Update Cloud Build configuration for CI

Fixes #2005

## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: duwenxin99 <duwenxin@google.com>
Co-authored-by: Wenxin Du <117315983+duwenxin99@users.noreply.github.com>
2026-02-11 17:05:03 -05:00
Anubhav Dhawan
1f8019c50a docs(adk): align quickstart script with other orchestrations (#2423)
This brings the ADK Python quickstart sample up to par with the other
orchestrations in the guidance, removing the need for special test
handling.
2026-02-11 00:15:00 +05:30
dependabot[bot]
6e8255476a chore(deps): bump langsmith from 0.4.3 to 0.5.0 in /docs/en/getting-started/quickstart/js/langchain (#2438)
Bumps [langsmith](https://github.com/langchain-ai/langsmith-sdk) from
0.4.3 to 0.5.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/langchain-ai/langsmith-sdk/releases">langsmith's
releases</a>.</em></p>
<blockquote>
<h2>v0.5.0</h2>
<h2>What's Changed</h2>
<ul>
<li>feat(py,js): Python 0.5, JS 0.4 by <a
href="https://github.com/jacoblee93"><code>@​jacoblee93</code></a> in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2182">langchain-ai/langsmith-sdk#2182</a></li>
<li>js: Ensures parent traceables always finish after children in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2094">langchain-ai/langsmith-sdk#2094</a></li>
<li>py: Make evaluator target function traces only trace inputs instead
of nested inputs outputs reference_outputs (BREAKING) in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2074">langchain-ai/langsmith-sdk#2074</a></li>
<li>py,js: Change default ingest to multipart instead of single run
(BREAKING) in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2206">langchain-ai/langsmith-sdk#2206</a></li>
<li>js: Omit raw HTTP info when tracing AI SDK runs (BREAKING) in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2207">langchain-ai/langsmith-sdk#2207</a></li>
<li>py,js: Remove legacy evaluators (BREAKING) in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2144">langchain-ai/langsmith-sdk#2144</a></li>
<li>js: Remove legacy AI SDK exporter and wrapAIModel (BREAKING) in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2210">langchain-ai/langsmith-sdk#2210</a></li>
<li>js: Make traceables that receive iterables as inputs use a single
POST instead of the typical POST + PATCH flow in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2209">langchain-ai/langsmith-sdk#2209</a></li>
<li>release(js): 0.4.0 by <a
href="https://github.com/jacoblee93"><code>@​jacoblee93</code></a> in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2216">langchain-ai/langsmith-sdk#2216</a></li>
<li>release(py): 0.5.0 by <a
href="https://github.com/jacoblee93"><code>@​jacoblee93</code></a> in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2217">langchain-ai/langsmith-sdk#2217</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/langchain-ai/langsmith-sdk/compare/v0.4.60...v0.5.0">https://github.com/langchain-ai/langsmith-sdk/compare/v0.4.60...v0.5.0</a></p>
<h2>v0.4.60</h2>
<h2>What's Changed</h2>
<ul>
<li>feat(js): Wrap additional OpenAI methods in wrapOpenAI by <a
href="https://github.com/jacoblee93"><code>@​jacoblee93</code></a> in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2198">langchain-ai/langsmith-sdk#2198</a></li>
<li>fix(js): Fix traceable typing for async iterables and runnable
config by <a
href="https://github.com/jacoblee93"><code>@​jacoblee93</code></a> in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2199">langchain-ai/langsmith-sdk#2199</a></li>
<li>release(js): 0.3.86 by <a
href="https://github.com/jacoblee93"><code>@​jacoblee93</code></a> in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2202">langchain-ai/langsmith-sdk#2202</a></li>
<li>fix(py): add missing imports during TYPE_CHECKING by <a
href="https://github.com/mkaoudis"><code>@​mkaoudis</code></a> in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2201">langchain-ai/langsmith-sdk#2201</a></li>
<li>fix(js): Use one generic param for async iterable in traceable types
by <a href="https://github.com/jacoblee93"><code>@​jacoblee93</code></a>
in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2203">langchain-ai/langsmith-sdk#2203</a></li>
<li>release(js): 0.3.87 by <a
href="https://github.com/jacoblee93"><code>@​jacoblee93</code></a> in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2204">langchain-ai/langsmith-sdk#2204</a></li>
<li>feat: automatically infer attachments by <a
href="https://github.com/hinthornw"><code>@​hinthornw</code></a> in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2200">langchain-ai/langsmith-sdk#2200</a></li>
<li>fix(openai agents sdk): Merge invocation params into run extra by <a
href="https://github.com/angus-langchain"><code>@​angus-langchain</code></a>
in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2214">langchain-ai/langsmith-sdk#2214</a></li>
<li>bump(py): 0.4.60 by <a
href="https://github.com/angus-langchain"><code>@​angus-langchain</code></a>
in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2215">langchain-ai/langsmith-sdk#2215</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/mkaoudis"><code>@​mkaoudis</code></a>
made their first contribution in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2201">langchain-ai/langsmith-sdk#2201</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/langchain-ai/langsmith-sdk/compare/v0.4.59...v0.4.60">https://github.com/langchain-ai/langsmith-sdk/compare/v0.4.59...v0.4.60</a></p>
<h2>v0.4.59</h2>
<h2>What's Changed</h2>
<ul>
<li>feat(py,js): Add prop to omit traced runtime info by <a
href="https://github.com/jacoblee93"><code>@​jacoblee93</code></a> in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2195">langchain-ai/langsmith-sdk#2195</a></li>
<li>release(js): 0.3.85 by <a
href="https://github.com/jacoblee93"><code>@​jacoblee93</code></a> in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2196">langchain-ai/langsmith-sdk#2196</a></li>
<li>release(py): 0.4.59 by <a
href="https://github.com/jacoblee93"><code>@​jacoblee93</code></a> in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2197">langchain-ai/langsmith-sdk#2197</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/langchain-ai/langsmith-sdk/compare/v0.4.58...v0.4.59">https://github.com/langchain-ai/langsmith-sdk/compare/v0.4.58...v0.4.59</a></p>
<h2>v0.4.58</h2>
<h2>What's Changed</h2>
<ul>
<li>feat(py,js): Add batch example deletion method, hard delete for
Python by <a
href="https://github.com/jacoblee93"><code>@​jacoblee93</code></a> in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2190">langchain-ai/langsmith-sdk#2190</a></li>
<li>release(js): 0.3.84 by <a
href="https://github.com/jacoblee93"><code>@​jacoblee93</code></a> in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2191">langchain-ai/langsmith-sdk#2191</a></li>
<li>release(py): 0.4.58 by <a
href="https://github.com/jacoblee93"><code>@​jacoblee93</code></a> in <a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2192">langchain-ai/langsmith-sdk#2192</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/langchain-ai/langsmith-sdk/compare/v0.4.57...v0.4.58">https://github.com/langchain-ai/langsmith-sdk/compare/v0.4.57...v0.4.58</a></p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a3edbcd681"><code>a3edbcd</code></a>
release(py): 0.5.0 (<a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2217">#2217</a>)</li>
<li><a
href="750c47117b"><code>750c471</code></a>
release(js): 0.4.0 (<a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2216">#2216</a>)</li>
<li><a
href="9edd9e503c"><code>9edd9e5</code></a>
feat(py,js): Python 0.5, JS 0.4 (<a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2182">#2182</a>)</li>
<li><a
href="55f64b012a"><code>55f64b0</code></a>
bump(py): 0.4.60 (<a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2215">#2215</a>)</li>
<li><a
href="bcc7457107"><code>bcc7457</code></a>
fix(openai agents sdk): Merge invocation params into run extra (<a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2214">#2214</a>)</li>
<li><a
href="c45bf95e53"><code>c45bf95</code></a>
feat: automatically infer attachments (<a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2200">#2200</a>)</li>
<li><a
href="5932480852"><code>5932480</code></a>
release(js): 0.3.87 (<a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2204">#2204</a>)</li>
<li><a
href="d7f7866677"><code>d7f7866</code></a>
fix(js): Use one generic param for async iterable in traceable types (<a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2203">#2203</a>)</li>
<li><a
href="28d89bc5bf"><code>28d89bc</code></a>
fix(py): add missing imports during TYPE_CHECKING (<a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2201">#2201</a>)</li>
<li><a
href="6545031be5"><code>6545031</code></a>
release(js): 0.3.86 (<a
href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2202">#2202</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/langchain-ai/langsmith-sdk/compare/v0.4.3...v0.5.0">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by [GitHub Actions](<a
href="https://www.npmjs.com/~GitHub">https://www.npmjs.com/~GitHub</a>
Actions), a new releaser for langsmith since your current version.</p>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=langsmith&package-manager=npm_and_yarn&previous-version=0.4.3&new-version=0.5.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-10 09:43:28 -08:00
dependabot[bot]
4fb5b34a5a chore(deps): bump axios from 1.12.2 to 1.13.5 in /docs/en/getting-started/quickstart/js/genkit (#2442)
Bumps [axios](https://github.com/axios/axios) from 1.12.2 to 1.13.5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/axios/axios/releases">axios's
releases</a>.</em></p>
<blockquote>
<h2>v1.13.5</h2>
<h2>Release 1.13.5</h2>
<h3>Highlights</h3>
<ul>
<li><strong>Security:</strong> Fixed a potential <strong>Denial of
Service</strong> issue involving the <code>__proto__</code> key in
<code>mergeConfig</code>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7369">#7369</a>)</li>
<li><strong>Bug fix:</strong> Resolved an issue where
<code>AxiosError</code> could be missing the <code>status</code> field
on and after <strong>v1.13.3</strong>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7368">#7368</a>)</li>
</ul>
<h3>Changes</h3>
<h4>Security</h4>
<ul>
<li>Fix Denial of Service via <code>__proto__</code> key in
<code>mergeConfig</code>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7369">#7369</a>)</li>
</ul>
<h4>Fixes</h4>
<ul>
<li>Fix/5657. (PR <a
href="https://redirect.github.com/axios/axios/pull/7313">#7313</a>)</li>
<li>Ensure <code>status</code> is present in <code>AxiosError</code> on
and after v1.13.3. (PR <a
href="https://redirect.github.com/axios/axios/pull/7368">#7368</a>)</li>
</ul>
<h4>Features / Improvements</h4>
<ul>
<li>Add input validation to <code>isAbsoluteURL</code>. (PR <a
href="https://redirect.github.com/axios/axios/pull/7326">#7326</a>)</li>
<li>Refactor: bump minor package versions. (PR <a
href="https://redirect.github.com/axios/axios/pull/7356">#7356</a>)</li>
</ul>
<h4>Documentation</h4>
<ul>
<li>Clarify object-check comment. (PR <a
href="https://redirect.github.com/axios/axios/pull/7323">#7323</a>)</li>
<li>Fix deprecated <code>Buffer</code> constructor usage and README
formatting. (PR <a
href="https://redirect.github.com/axios/axios/pull/7371">#7371</a>)</li>
</ul>
<h4>CI / Maintenance</h4>
<ul>
<li>Chore: fix issues with YAML. (PR <a
href="https://redirect.github.com/axios/axios/pull/7355">#7355</a>)</li>
<li>CI: update workflow YAMLs. (PR <a
href="https://redirect.github.com/axios/axios/pull/7372">#7372</a>)</li>
<li>CI: fix run condition. (PR <a
href="https://redirect.github.com/axios/axios/pull/7373">#7373</a>)</li>
<li>Dev deps: bump <code>karma-sourcemap-loader</code> from 0.3.8 to
0.4.0. (PR <a
href="https://redirect.github.com/axios/axios/pull/7360">#7360</a>)</li>
<li>Chore(release): prepare release 1.13.5. (PR <a
href="https://redirect.github.com/axios/axios/pull/7379">#7379</a>)</li>
</ul>
<h3>New Contributors</h3>
<ul>
<li><a
href="https://github.com/sachin11063"><code>@​sachin11063</code></a>
(first contribution — PR <a
href="https://redirect.github.com/axios/axios/pull/7323">#7323</a>)</li>
<li><a
href="https://github.com/asmitha-16"><code>@​asmitha-16</code></a>
(first contribution — PR <a
href="https://redirect.github.com/axios/axios/pull/7326">#7326</a>)</li>
</ul>
<p><strong>Full Changelog:</strong> <a
href="https://github.com/axios/axios/compare/v1.13.4...v1.13.5">https://github.com/axios/axios/compare/v1.13.4...v1.13.5</a></p>
<h2>v1.13.4</h2>
<h2>Overview</h2>
<p>The release addresses issues discovered in v1.13.3 and includes
significant CI/CD improvements.</p>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/axios/axios/compare/v1.13.3...v1.13.4">v1.13.3...v1.13.4</a></p>
<h2>What's New in v1.13.4</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>fix: issues with version 1.13.3</strong> (<a
href="https://redirect.github.com/axios/axios/issues/7352">#7352</a>)
(<a
href="ee90dfc28a">ee90dfc</a>)
<ul>
<li>Fixed issues discovered in v1.13.3 release</li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/axios/axios/blob/v1.x/CHANGELOG.md">axios's
changelog</a>.</em></p>
<blockquote>
<h1>Changelog</h1>
<h2><a
href="https://github.com/axios/axios/compare/v1.13.2...v1.13.3">1.13.3</a>
(2026-01-20)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>http2:</strong> Use port 443 for HTTPS connections by
default. (<a
href="https://redirect.github.com/axios/axios/issues/7256">#7256</a>)
(<a
href="d7e6065346">d7e6065</a>)</li>
<li><strong>interceptor:</strong> handle the error in the same
interceptor (<a
href="https://redirect.github.com/axios/axios/issues/6269">#6269</a>)
(<a
href="5945e40bb1">5945e40</a>)</li>
<li>main field in package.json should correspond to cjs artifacts (<a
href="https://redirect.github.com/axios/axios/issues/5756">#5756</a>)
(<a
href="7373fbff24">7373fbf</a>)</li>
<li><strong>package.json:</strong> add 'bun' package.json 'exports'
condition. Load the Node.js build in Bun instead of the browser build
(<a
href="https://redirect.github.com/axios/axios/issues/5754">#5754</a>)
(<a
href="b89217e3e9">b89217e</a>)</li>
<li>silentJSONParsing=false should throw on invalid JSON (<a
href="https://redirect.github.com/axios/axios/issues/7253">#7253</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/7257">#7257</a>)
(<a
href="7d19335e43">7d19335</a>)</li>
<li>turn AxiosError into a native error (<a
href="https://redirect.github.com/axios/axios/issues/5394">#5394</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/5558">#5558</a>)
(<a
href="1c6a86dd2c">1c6a86d</a>)</li>
<li><strong>types:</strong> add handlers to AxiosInterceptorManager
interface (<a
href="https://redirect.github.com/axios/axios/issues/5551">#5551</a>)
(<a
href="8d1271b49f">8d1271b</a>)</li>
<li><strong>types:</strong> restore AxiosError.cause type from unknown
to Error (<a
href="https://redirect.github.com/axios/axios/issues/7327">#7327</a>)
(<a
href="d8233d9e8e">d8233d9</a>)</li>
<li>unclear error message is thrown when specifying an empty proxy
authorization (<a
href="https://redirect.github.com/axios/axios/issues/6314">#6314</a>)
(<a
href="6ef867e684">6ef867e</a>)</li>
</ul>
<h3>Features</h3>
<ul>
<li>add <code>undefined</code> as a value in AxiosRequestConfig (<a
href="https://redirect.github.com/axios/axios/issues/5560">#5560</a>)
(<a
href="095033c626">095033c</a>)</li>
<li>add automatic minor and patch upgrades to dependabot (<a
href="https://redirect.github.com/axios/axios/issues/6053">#6053</a>)
(<a
href="65a7584eda">65a7584</a>)</li>
<li>add Node.js coverage script using c8 (closes <a
href="https://redirect.github.com/axios/axios/issues/7289">#7289</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/7294">#7294</a>)
(<a
href="ec9d94e9f8">ec9d94e</a>)</li>
<li>added copilot instructions (<a
href="3f83143bfe">3f83143</a>)</li>
<li>compatibility with frozen prototypes (<a
href="https://redirect.github.com/axios/axios/issues/6265">#6265</a>)
(<a
href="860e03396a">860e033</a>)</li>
<li>enhance pipeFileToResponse with error handling (<a
href="https://redirect.github.com/axios/axios/issues/7169">#7169</a>)
(<a
href="88d7884254">88d7884</a>)</li>
<li><strong>types:</strong> Intellisense for string literals in a
widened union (<a
href="https://redirect.github.com/axios/axios/issues/6134">#6134</a>)
(<a
href="f73474d02c">f73474d</a>),
closes <a
href="https://redirect.github.com//redirect.github.com/microsoft/TypeScript/issues/33471/issues/issuecomment-1376364329">microsoft/TypeScript#33471</a></li>
</ul>
<h3>Reverts</h3>
<ul>
<li>Revert &quot;fix: silentJSONParsing=false should throw on invalid
JSON (<a
href="https://redirect.github.com/axios/axios/issues/7253">#7253</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/7">#7</a>…&quot;
(<a
href="https://redirect.github.com/axios/axios/issues/7298">#7298</a>)
(<a
href="a4230f5581">a4230f5</a>),
closes <a
href="https://redirect.github.com/axios/axios/issues/7253">#7253</a> <a
href="https://redirect.github.com/axios/axios/issues/7">#7</a> <a
href="https://redirect.github.com/axios/axios/issues/7298">#7298</a></li>
<li><strong>deps:</strong> bump peter-evans/create-pull-request from 7
to 8 in the github-actions group (<a
href="https://redirect.github.com/axios/axios/issues/7334">#7334</a>)
(<a
href="2d6ad5e48b">2d6ad5e</a>)</li>
</ul>
<h3>Contributors to this release</h3>
<ul>
<li><!-- raw HTML omitted --> <a href="https://github.com/ashvin2005"
title="+1752/-4 ([#7218](https://github.com/axios/axios/issues/7218)
[#7218](https://github.com/axios/axios/issues/7218) )">Ashvin
Tiwari</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/mochinikunj"
title="+940/-12 ([#7294](https://github.com/axios/axios/issues/7294)
[#7294](https://github.com/axios/axios/issues/7294) )">Nikunj
Mochi</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/imanchalsingh"
title="+544/-102 ([#7169](https://github.com/axios/axios/issues/7169)
[#7185](https://github.com/axios/axios/issues/7185) )">Anchal
Singh</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/jasonsaayman"
title="+317/-73 ([#7334](https://github.com/axios/axios/issues/7334)
[#7298](https://github.com/axios/axios/issues/7298)
)">jasonsaayman</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/brodo"
title="+99/-120 ([#5558](https://github.com/axios/axios/issues/5558)
)">Julian Dax</a></li>
<li><!-- raw HTML omitted --> <a
href="https://github.com/AKASHDHARDUBEY" title="+167/-0
([#7287](https://github.com/axios/axios/issues/7287)
[#7288](https://github.com/axios/axios/issues/7288) )">Akash Dhar
Dubey</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/madhumitaaa"
title="+20/-68 ([#7198](https://github.com/axios/axios/issues/7198)
)">Madhumita</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/Tackoil"
title="+80/-2 ([#6269](https://github.com/axios/axios/issues/6269)
)">Tackoil</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/justindhillon"
title="+41/-41 ([#6324](https://github.com/axios/axios/issues/6324)
[#6315](https://github.com/axios/axios/issues/6315) )">Justin
Dhillon</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/Rudrxxx"
title="+71/-2 ([#7257](https://github.com/axios/axios/issues/7257)
)">Rudransh</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/WuMingDao"
title="+36/-36 ([#7215](https://github.com/axios/axios/issues/7215)
)">WuMingDao</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/codenomnom"
title="+70/-0 ([#7201](https://github.com/axios/axios/issues/7201)
[#7201](https://github.com/axios/axios/issues/7201)
)">codenomnom</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/Nandann018-ux"
title="+60/-10 ([#7272](https://github.com/axios/axios/issues/7272)
)">Nandan Acharya</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/KernelDeimos"
title="+22/-40 ([#7042](https://github.com/axios/axios/issues/7042)
)">Eric Dubé</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/tiborpilz"
title="+40/-4 ([#5551](https://github.com/axios/axios/issues/5551)
)">Tibor Pilz</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/joaoGabriel55"
title="+31/-4 ([#6314](https://github.com/axios/axios/issues/6314)
)">Gabriel Quaresma</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/turadg"
title="+23/-6 ([#6265](https://github.com/axios/axios/issues/6265)
)">Turadg Aleahmad</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="29f75425f0"><code>29f7542</code></a>
chore(release): prepare release 1.13.5 (<a
href="https://redirect.github.com/axios/axios/issues/7379">#7379</a>)</li>
<li><a
href="431c3a3614"><code>431c3a3</code></a>
ci: fix run condition (<a
href="https://redirect.github.com/axios/axios/issues/7373">#7373</a>)</li>
<li><a
href="9ff3a78ad7"><code>9ff3a78</code></a>
ci: update ymls (<a
href="https://redirect.github.com/axios/axios/issues/7372">#7372</a>)</li>
<li><a
href="265b71234c"><code>265b712</code></a>
docs: fix deprecated Buffer constructor and formatting issues in README
(<a
href="https://redirect.github.com/axios/axios/issues/7371">#7371</a>)</li>
<li><a
href="475e75a260"><code>475e75a</code></a>
feat: add input validation to isAbsoluteURL (<a
href="https://redirect.github.com/axios/axios/issues/7326">#7326</a>)</li>
<li><a
href="28c721588c"><code>28c7215</code></a>
fix: Denial of Service via <strong>proto</strong> Key in mergeConfig (<a
href="https://redirect.github.com/axios/axios/issues/7369">#7369</a>)</li>
<li><a
href="04cf01969e"><code>04cf019</code></a>
docs: clarify object check comment (<a
href="https://redirect.github.com/axios/axios/issues/7323">#7323</a>)</li>
<li><a
href="696fa753c5"><code>696fa75</code></a>
fix: status is missing in AxiosError on and after v1.13.3 (<a
href="https://redirect.github.com/axios/axios/issues/7368">#7368</a>)</li>
<li><a
href="569f028a58"><code>569f028</code></a>
fix: added a option to choose between legacy and the new
request/response int...</li>
<li><a
href="44b7c9f0c4"><code>44b7c9f</code></a>
chore(deps-dev): bump karma-sourcemap-loader (<a
href="https://redirect.github.com/axios/axios/issues/7360">#7360</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/axios/axios/compare/v1.12.2...v1.13.5">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by [GitHub Actions](<a
href="https://www.npmjs.com/~GitHub">https://www.npmjs.com/~GitHub</a>
Actions), a new releaser for axios since your current version.</p>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=axios&package-manager=npm_and_yarn&previous-version=1.12.2&new-version=1.13.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-10 17:04:04 +00:00
Twisha Bansal
1664a69dfd docs: add pre/post processing docs for langchain python (#2378)
## Description

Trigger has been tested corresponding to local changes. Latest
successful run:
https://pantheon.corp.google.com/cloud-build/builds;region=global/1c37031f-95f1-4c6c-9ef8-0452277599d5?e=13802955&mods=-autopush_coliseum&project=toolbox-testing-438616

Note: After merging, update python pre and post processing sample
testing trigger.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-02-10 16:41:02 +00:00
manuka rahul
7f88caa985 docs: fix broken links (#2440)
Fix broken links

---------

Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-02-10 19:04:22 +05:30
dependabot[bot]
3c9365dfd9 chore(deps): bump fast-xml-parser and @google-cloud/storage in /docs/en/getting-started/quickstart/js/adk (#2434)
Bumps
[fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser)
and
[@google-cloud/storage](https://github.com/googleapis/nodejs-storage).
These dependencies needed to be updated together.
Updates `fast-xml-parser` from 4.5.3 to 5.3.5
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/releases">fast-xml-parser's
releases</a>.</em></p>
<blockquote>
<h2>v5.3.5</h2>
<h2>What's Changed</h2>
<ul>
<li>Add missing exports to fxp commonjs types by <a
href="https://github.com/jeremymeng"><code>@​jeremymeng</code></a> in <a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/pull/782">NaturalIntelligence/fast-xml-parser#782</a></li>
<li>fix: Escape regex char in entity name</li>
<li>update strnum to 2.1.2</li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/jeremymeng"><code>@​jeremymeng</code></a> made
their first contribution in <a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/pull/782">NaturalIntelligence/fast-xml-parser#782</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.4...v5.3.5">https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.4...v5.3.5</a></p>
<h2>fix: handle HTML numeric and hex entities when out of range</h2>
<p>No release notes provided.</p>
<h2>bug fix and performance improvements</h2>
<ul>
<li>fix <a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/issues/775">#775</a>:
transformTagName with allowBooleanAttributes adds an unnecessary
attribute</li>
<li>Performance improvement for stopNodes (By <a
href="https://github.com/macieklamberski">Maciek Lamberski</a>)</li>
</ul>
<h2>Replace <code>Buffer</code> with <code>Uint8Array</code></h2>
<ul>
<li>Launched Separate CLI module</li>
<li>Replace <code>Buffer</code> with <code>Uint8Array</code></li>
</ul>
<h2>Support EMPTY and ANY with ELEMENT in DOCTYPE</h2>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.2.4...v5.2.4">https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.2.4...v5.2.4</a></p>
<h2>upgrade to ESM module and fixing value parsing issues</h2>
<ul>
<li>Support ESM modules</li>
<li>fix value parsing issues</li>
<li>a feature to access tag location is added (metadata)</li>
<li>fix to read DOCTYPE correctly</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md">https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md</a></p>
<h2>Summary update on all the previous releases from v4.2.4</h2>
<ul>
<li>Multiple minor fixes provided in the validator and parser</li>
<li>v6 is added for experimental use.</li>
<li>ignoreAttributes support function, and array of string or regex</li>
<li>Add support for parsing HTML numeric entities</li>
<li>v5 of the application is ESM module now. However, JS is also
supported</li>
</ul>
<p><strong>Note</strong>: Release section in not updated frequently.
Please check <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md">CHANGELOG</a>
or <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/tags">Tags</a>
for latest release information.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md">fast-xml-parser's
changelog</a>.</em></p>
<blockquote>
<p><!-- raw HTML omitted -->Note: If you find missing information about
particular minor version, that version must have been changed without
any functional change in this library.<!-- raw HTML omitted --></p>
<p><strong>5.3.5 / 2026-02-08</strong></p>
<ul>
<li>fix: Escape regex char in entity name</li>
<li>update strnum to 2.1.2</li>
<li>add missing exports in CJS typings</li>
</ul>
<p><strong>5.3.4 / 2026-01-30</strong></p>
<ul>
<li>fix: handle HTML numeric and hex entities when out of range</li>
</ul>
<p><strong>5.3.3 / 2025-12-12</strong></p>
<ul>
<li>fix <a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/issues/775">#775</a>:
transformTagName with allowBooleanAttributes adds an unnecessary
attribute</li>
</ul>
<p><strong>5.3.2 / 2025-11-14</strong></p>
<ul>
<li>fix for import statement for v6</li>
</ul>
<p><strong>5.3.1 / 2025-11-03</strong></p>
<ul>
<li>Performance improvement for stopNodes (By <a
href="https://github.com/macieklamberski">Maciek Lamberski</a>)</li>
</ul>
<p><strong>5.3.0 / 2025-10-03</strong></p>
<ul>
<li>Use <code>Uint8Array</code> in place of <code>Buffer</code> in
Parser</li>
</ul>
<p><strong>5.2.5 / 2025-06-08</strong></p>
<ul>
<li>Inform user to use <a
href="https://github.com/NaturalIntelligence/fxp-cli">fxp-cli</a>
instead of in-built CLI feature</li>
<li>Export typings  for direct use</li>
</ul>
<p><strong>5.2.4 / 2025-06-06</strong></p>
<ul>
<li>fix (<a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/issues/747">#747</a>):
fix EMPTY and ANY with ELEMENT in DOCTYPE</li>
</ul>
<p><strong>5.2.3 / 2025-05-11</strong></p>
<ul>
<li>fix (<a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/issues/747">#747</a>):
support EMPTY and ANY with ELEMENT in DOCTYPE</li>
</ul>
<p><strong>5.2.2 / 2025-05-05</strong></p>
<ul>
<li>fix (<a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/issues/746">#746</a>):
update strnum to fix parsing issues related to enotations</li>
</ul>
<p><strong>5.2.1 / 2025-04-22</strong></p>
<ul>
<li>fix: read DOCTYPE entity value correctly</li>
<li>read DOCTYPE NOTATION, ELEMENT exp but not using read values</li>
</ul>
<p><strong>5.2.0 / 2025-04-03</strong></p>
<ul>
<li>feat: support metadata on nodes (<a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/issues/593">#593</a>)
(By <a href="https://github.com/srl295">Steven R. Loomis</a>)</li>
</ul>
<p><strong>5.1.0 / 2025-04-02</strong></p>
<ul>
<li>feat: declare package as side-effect free (<a
href="https://redirect.github.com/NaturalIntelligence/fast-xml-parser/issues/738">#738</a>)
(By <a href="https://github.com/tbouffard">Thomas Bouffard</a>)</li>
<li>fix cjs build mode</li>
<li>fix builder return type to string</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/NaturalIntelligence/fast-xml-parser/commits/v5.3.5">compare
view</a></li>
</ul>
</details>
<br />

Updates `@google-cloud/storage` from 7.18.0 to 7.19.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/nodejs-storage/releases"><code>@​google-cloud/storage</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v7.19.0</h2>
<h2><a
href="https://github.com/googleapis/nodejs-storage/compare/v7.18.0...v7.19.0">7.19.0</a>
(2026-02-05)</h2>
<h3>Features</h3>
<ul>
<li>Enable full object checksum validation on JSON path (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2687">#2687</a>)
(<a
href="08a896240e">08a8962</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>deps:</strong> Update dependency fast-xml-parser to v5
[security] (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2713">#2713</a>)
(<a
href="420935a033">420935a</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/nodejs-storage/blob/main/CHANGELOG.md"><code>@​google-cloud/storage</code>'s
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/googleapis/nodejs-storage/compare/v7.18.0...v7.19.0">7.19.0</a>
(2026-02-05)</h2>
<h3>Features</h3>
<ul>
<li>Enable full object checksum validation on JSON path (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2687">#2687</a>)
(<a
href="08a896240e">08a8962</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>deps:</strong> Update dependency fast-xml-parser to v5
[security] (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2713">#2713</a>)
(<a
href="420935a033">420935a</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="95a2af4cc8"><code>95a2af4</code></a>
chore(main): release 7.19.0 (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2694">#2694</a>)</li>
<li><a
href="420935a033"><code>420935a</code></a>
fix(deps): update dependency fast-xml-parser to v5 [security] (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2713">#2713</a>)</li>
<li><a
href="4e3c328ccf"><code>4e3c328</code></a>
test: skip system tests requiring public access (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2717">#2717</a>)</li>
<li><a
href="30522654c5"><code>3052265</code></a>
chore: fix lint failures (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2685">#2685</a>)</li>
<li><a
href="08a896240e"><code>08a8962</code></a>
feat: Enable full object checksum validation on JSON path (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2687">#2687</a>)</li>
<li><a
href="3dcda1b715"><code>3dcda1b</code></a>
chore: lint failures (<a
href="https://redirect.github.com/googleapis/nodejs-storage/issues/2681">#2681</a>)</li>
<li>See full diff in <a
href="https://github.com/googleapis/nodejs-storage/compare/v7.18.0...v7.19.0">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/googleapis/genai-toolbox/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-09 06:23:39 +00:00
manuka rahul
7767e1e019 ci: optimize link checker workflow and failure reporting (#2411)
The current system streamlines troubleshooting by omitting passing links
from the output. Reporting now focuses solely on:

- Broken or failing links
- Redirecting links
- File paths (now prioritized at the top of the log for rapid
identification)

The link resolution notice is now presented first, followed by specific
errors to prevent developer distraction.

The .lycheeignore file has been updated to use regular expressions for
broader coverage of npm and SQL links, replacing the previous method of
listing individual URLs.

---------

Co-authored-by: Twisha Bansal <58483338+twishabansal@users.noreply.github.com>
2026-02-09 11:29:31 +05:30
Twisha Bansal
bb40cdf78c refactor: consolidate quickstart tests into universal runner (#2413)
## Description

Tested locally.
Last successful runs:
- Python:
https://pantheon.corp.google.com/cloud-build/builds;region=global/e86608d7-b9df-46b3-b8e6-60f0d6144b59;step=0?e=13802955&mods=-autopush_coliseum&project=toolbox-testing-438616
- JS:
https://pantheon.corp.google.com/cloud-build/builds;region=global/7d8803fb-3e4e-4d0b-8b60-44f0c7962132?e=13802955&mods=-autopush_coliseum&project=toolbox-testing-438616
- Go:
https://pantheon.corp.google.com/cloud-build/builds;region=global/a0d0d693-ec14-422f-aa62-b0ae664005ff?e=13802955&mods=-autopush_coliseum&project=toolbox-testing-438616

Note: After merging change path to cloud build yaml files for all these
triggers: quickstart-python, quickstart-python-test-on-merge and same
for JS and Go.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-02-09 11:05:29 +05:30
Dr. Strangelove
a15a12873f feat(tools/looker): Validate project tool (#2430)
## Description

Validate changes to a LookML project and report LookML errors.

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [x] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)
- [x] Make sure to add `!` if this involve a breaking change
2026-02-06 14:17:45 -08:00
Averi Kitsch
5e4f2a131f docs: add managed connection pooling to docs (#2425)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-02-06 10:01:58 -08:00
Haoyu Wang
80ef346214 feat(cli/skills): add support for generating agent skills from toolset (#2392)
## Description

This PR introduces a new skills-generate command that enables users to
generate standardized agent skills from their existing Toolbox tool
configurations. This facilitates the integration of Toolbox tools into
agentic workflows by automatically creating skill descriptions
(SKILL.md) and executable wrappers.
- New Subcommand: Implemented skills-generate, which automates the
creation of agent skill packages including metadata and executable
scripts.
- Skill Generation: Added logic to generate SKILL.md files with
parameter schemas and Node.js wrappers for cross-platform tool
execution.
- Toolset Integration: Supports selective generation of skills based on
defined toolsets, including support for both local files and prebuilt
configurations.
- Testing: Added unit tests for the generation logic and
integration tests for the CLI command.
- Documentation: Created a new "how-to" guide for generating skills and
updated the CLI reference documentation.
2026-02-04 15:51:14 -05:00
Mend Renovate
732eaed41d chore(deps): update github actions (#2386)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/cache](https://redirect.github.com/actions/cache)
([changelog](8b402f58fb..cdf6c1fa76))
| action | digest | `8b402f5` → `cdf6c1f` |
| [actions/checkout](https://redirect.github.com/actions/checkout)
([changelog](8e8c483db8..de0fac2e45))
| action | digest | `8e8c483` → `de0fac2` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/genai-toolbox).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45Mi4xIiwidXBkYXRlZEluVmVyIjoiNDIuOTUuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: Averi Kitsch <akitsch@google.com>
2026-02-04 02:40:22 +00:00
Yuan Teoh
a2097ba8eb docs: add index page for cloud logging admin tools (#2414)
Add _index page for cloud logging admin tools for drop down.

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-02-03 12:22:03 -08:00
Twisha Bansal
3f1908a822 docs: fix JS quickstart (#2406)
## Description

Response is being re-assigned

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-02-03 11:36:16 +05:30
Yuan Teoh
eef7a94977 docs: close notice shortcode (#2404)
fix notice shortcode closing brackets.
2026-02-02 17:38:15 -08:00
Averi Kitsch
4c96bb5c81 docs: fix dataplex tool names in reference (#2366)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [ ] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-02-02 19:13:55 +00:00
Twisha Bansal
e0245946ea docs: standardize installation note for antigravity plugins (#2373)
## Description

> Should include a concise description of the changes (bug or feature),
it's
> impact, along with a summary of the solution

## PR Checklist

> Thank you for opening a Pull Request! Before submitting your PR, there
are a
> few things you can do to make sure it goes smoothly:

- [x] Make sure you reviewed

[CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md)
- [ ] Make sure to open an issue as a

[bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose)
  before writing your code! That way we can discuss the change, evaluate
  designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involve a breaking change

🛠️ Fixes #<issue_number_goes_here>
2026-01-30 10:25:29 +05:30
Haoyu Wang
6e49ba436e feat(cli/invoke): add support for direct tool invocation from CLI (#2353)
## Description

This PR introduces a new subcommand, invoke, to the toolbox CLI. This
feature allows developers to execute tools defined in their
configuration directly from the command line.

- New Subcommand: Implemented invoke as subcommand, which handles tool
lookup, parameter unmarshaling from JSON, and invocation.
- Persistent Configuration Flags: Updated cmd/root.go to make flags like
--tools-file, --tools-folder, and --prebuilt persistent, allowing them
to be used with subcommands.
- Testing: Added unit tests for various scenarios
- Documentation: Created a new "how-to" guide for CLI tool testing and
updated the CLI reference documentation.
2026-01-29 19:46:21 -05:00
Dennis Geurts
4cff979491 chore(deps): mongodb driver version bump to v2 (#2349)
## Description

Update mongo-driver to v2, as requested by @duwenxin99  

🛠️ Fixes #2335

Co-authored-by: Yuan Teoh <yuanteoh@google.com>
2026-01-29 23:54:21 +00:00
Binh Tran
e995349ea0 feat(prebuiltconfigs/alloydb-omni): Implement Alloydb omni dataplane tools (#2340)
## Description

Implement Dataplane tools for alloydb omni using Postgres source and
postgres tools. I also add more omni-specific tool (columnar engine).

---------

Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
2026-01-29 22:47:49 +00:00
Wenxin Du
4c9765f1fb ci(oracle): fix Oracle integration test (#2388) 2026-01-29 20:14:55 +00:00
1418 changed files with 69836 additions and 21707 deletions

File diff suppressed because it is too large Load Diff

136
.ci/lint-docs-source-page.sh Executable file
View File

@@ -0,0 +1,136 @@
#!/bin/bash
set -e
python3 - << 'EOF'
"""
MCP TOOLBOX: SOURCE PAGE LINTER
===============================
This script enforces a standardized structure for integration Source pages
(source.md files). It ensures users can predictably find connection details
and configurations across all database integrations.
Note: The structural _index.md folder wrappers are intentionally ignored
by this script as they should only contain YAML frontmatter.
MAINTENANCE GUIDE:
------------------
1. TO ADD A NEW HEADING:
Add the exact heading text to the 'ALLOWED_ORDER' list in the desired
sequence.
2. TO MAKE A HEADING MANDATORY/OPTIONAL:
Add or remove the heading text in the 'REQUIRED' set.
3. TO IGNORE NEW CONTENT TYPES:
Update the regex in the 'clean_body' variable to strip out
Markdown before linting.
4. SCOPE:
This script only targets docs/en/integrations/**/source.md.
"""
import os
import re
import sys
from pathlib import Path
# --- CONFIGURATION ---
ALLOWED_ORDER = [
"About",
"Available Tools",
"Requirements",
"Example",
"Reference",
"Advanced Usage",
"Troubleshooting",
"Additional Resources"
]
REQUIRED = {"About", "Example", "Reference"}
# Regex to catch any variation of the list-tools shortcode
SHORTCODE_PATTERN = r"\{\{<\s*list-tools.*?>\}\}"
# ---------------------
integration_dir = Path("./docs/en/integrations")
if not integration_dir.exists():
print("Info: Directory './docs/en/integrations' not found. Skipping linting.")
sys.exit(0)
has_errors = False
source_pages_found = 0
# ONLY scan files specifically named "source.md"
for filepath in integration_dir.rglob("source.md"):
source_pages_found += 1
file_errors = False
if filepath.parent.parent != integration_dir:
continue
with open(filepath, "r", encoding="utf-8") as f:
content = f.read()
match = re.match(r'^\s*---\s*\n(.*?)\n---\s*(.*)', content, re.DOTALL)
if match:
frontmatter, body = match.group(1), match.group(2)
else:
print(f"[{filepath}] Error: Missing or invalid YAML frontmatter.")
has_errors = True
continue
# 1. Check for linkTitle: "Source" in frontmatter
link_title_match = re.search(r"^linkTitle:\s*[\"']?(.*?)[\"']?\s*$", frontmatter, re.MULTILINE)
if not link_title_match or link_title_match.group(1).strip() != "Source":
print(f"[{filepath}] Error: Frontmatter must contain exactly linkTitle: \"Source\".")
file_errors = True
# 2. Check for weight: 1 in frontmatter
weight_match = re.search(r"^weight:\s*[\"']?(\d+)[\"']?\s*$", frontmatter, re.MULTILINE)
if not weight_match or weight_match.group(1).strip() != "1":
print(f"[{filepath}] Error: Frontmatter must contain exactly weight: 1.")
file_errors = True
# 3. Check Shortcode Placement & Available Tools Section (Only if present)
tools_section_match = re.search(r"^##\s+Available Tools\s*(.*?)(?=^##\s|\Z)", body, re.MULTILINE | re.DOTALL)
if tools_section_match:
if not re.search(SHORTCODE_PATTERN, tools_section_match.group(1)):
print(f"[{filepath}] Error: The list-tools shortcode must be placed under the '## Available Tools' heading.")
file_errors = True
# Strip code blocks from body to avoid linting example markdown headings
clean_body = re.sub(r"```.*?```", "", body, flags=re.DOTALL)
if re.search(r"^#\s+\w+", clean_body, re.MULTILINE):
print(f"[{filepath}] Error: H1 (#) headings are forbidden in the body.")
file_errors = True
h2s = [h.strip() for h in re.findall(r"^##\s+(.*)", clean_body, re.MULTILINE)]
# Missing Required Headings
missing = REQUIRED - set(h2s)
if missing:
print(f"[{filepath}] Error: Missing required H2 headings: {missing}")
file_errors = True
if unauthorized := (set(h2s) - set(ALLOWED_ORDER)):
print(f"[{filepath}] Error: Unauthorized H2s found: {unauthorized}")
file_errors = True
# 5. Order Check
if [h for h in h2s if h in ALLOWED_ORDER] != [h for h in ALLOWED_ORDER if h in h2s]:
print(f"[{filepath}] Error: Headings out of order. Reference: {ALLOWED_ORDER}")
file_errors = True
if file_errors: has_errors = True
# Handle final output based on what was found
if source_pages_found == 0:
print("Info: No 'source.md' files found in integrations. Passing gracefully.")
sys.exit(0)
elif has_errors:
print(f"\nLinting failed. Please fix the structure errors in the {source_pages_found} 'source.md' file(s) above.")
sys.exit(1)
else:
print(f"Success: {source_pages_found} 'source.md' file(s) passed structure validation.")
EOF

155
.ci/lint-docs-tool-page.sh Executable file
View File

@@ -0,0 +1,155 @@
#!/bin/bash
set -e
python3 - << 'EOF'
"""
MCP TOOLBOX: TOOL PAGE LINTER
=============================
This script enforces a standardized structure for individual Tool pages
and their parent directory wrappers. It ensures LLM agents can parse
tool capabilities and parameter definitions reliably.
MAINTENANCE GUIDE:
------------------
1. TO ADD A NEW HEADING:
Add the exact heading text to the 'ALLOWED_ORDER' list in the desired
sequence.
2. TO MAKE A HEADING MANDATORY/OPTIONAL:
Add or remove the heading text in the 'REQUIRED' set.
3. TO UPDATE SHORTCODE LOGIC:
If the shortcode name changes, update the 'SHORTCODE_PATTERN' variable.
4. SCOPE & BEHAVIOR:
This script targets all .md files in docs/en/integrations/**/tools/.
- For `_index.md` files: It only validates the frontmatter (requiring
`title: "Tools"` and `weight: 2`) and ignores the body.
- For regular tool files: It validates H1/H2 hierarchy, checks for
required headings ("About", "Example"), and enforces that the
`{{< compatible-sources >}}` shortcode is paired with the
"## Compatible Sources" heading.
"""
import os
import re
import sys
from pathlib import Path
# --- CONFIGURATION ---
ALLOWED_ORDER = [
"About",
"Compatible Sources",
"Requirements",
"Parameters",
"Example",
"Output Format",
"Reference",
"Advanced Usage",
"Troubleshooting",
"Additional Resources"
]
REQUIRED = {"About", "Example"}
SHORTCODE_PATTERN = r"\{\{<\s*compatible-sources.*?>\}\}"
# ---------------------
integration_dir = Path("./docs/en/integrations")
if not integration_dir.exists():
print("Info: Directory './docs/en/integrations' not found. Skipping linting.")
sys.exit(0)
has_errors = False
tools_pages_found = 0
# Specifically target the tools directories
for filepath in integration_dir.rglob("tools/*.md"):
tools_pages_found += 1
with open(filepath, "r", encoding="utf-8") as f:
content = f.read()
# Separate YAML frontmatter from the markdown body
match = re.match(r'^\s*---\s*\n(.*?)\n---\s*(.*)', content, re.DOTALL)
if match:
frontmatter = match.group(1)
body = match.group(2)
else:
print(f"[{filepath}] Error: Missing or invalid YAML frontmatter.")
has_errors = True
continue
file_errors = False
# --- SPECIAL VALIDATION FOR tools/_index.md ---
if filepath.name == "_index.md":
title_match = re.search(r"^title:\s*[\"']?(.*?)[\"']?\s*$", frontmatter, re.MULTILINE)
if not title_match or title_match.group(1).strip() != "Tools":
print(f"[{filepath}] Error: tools/_index.md must have exactly title: \"Tools\"")
file_errors = True
weight_match = re.search(r"^weight:\s*(\d+)\s*$", frontmatter, re.MULTILINE)
if not weight_match or weight_match.group(1).strip() != "2":
print(f"[{filepath}] Error: tools/_index.md must have exactly weight: 2")
file_errors = True
if file_errors:
has_errors = True
continue # Skip the rest of the body linting for this structural file
# --- VALIDATION FOR REGULAR TOOL PAGES ---
# If the file has no markdown content (metadata placeholder only), skip it entirely
if not body.strip():
continue
# 1. Check Shortcode Placement
sources_section_match = re.search(r"^##\s+Compatible Sources\s*(.*?)(?=^##\s|\Z)", body, re.MULTILINE | re.DOTALL)
if sources_section_match:
if not re.search(SHORTCODE_PATTERN, sources_section_match.group(1)):
print(f"[{filepath}] Error: The compatible-sources shortcode must be placed under '## Compatible Sources'.")
file_errors = True
elif re.search(SHORTCODE_PATTERN, body):
print(f"[{filepath}] Error: Shortcode found, but '## Compatible Sources' heading is missing.")
file_errors = True
# 2. Strip code blocks from body to avoid linting example markdown headings
clean_body = re.sub(r"```.*?```", "", body, flags=re.DOTALL)
# 3. Check H1 Headings
if re.search(r"^#\s+\w+", clean_body, re.MULTILINE):
print(f"[{filepath}] Error: H1 headings (#) are forbidden in the body.")
file_errors = True
# 4. Check H2 Headings
h2s = re.findall(r"^##\s+(.*)", clean_body, re.MULTILINE)
h2s = [h2.strip() for h2 in h2s]
# Missing Required
if missing := (REQUIRED - set(h2s)):
print(f"[{filepath}] Error: Missing required H2 headings: {missing}")
file_errors = True
# Unauthorized Headings
if unauthorized := (set(h2s) - set(ALLOWED_ORDER)):
print(f"[{filepath}] Error: Unauthorized H2 headings found: {unauthorized}")
file_errors = True
# Strict Ordering
filtered_h2s = [h for h in h2s if h in ALLOWED_ORDER]
expected_order = [h for h in ALLOWED_ORDER if h in h2s]
if filtered_h2s != expected_order:
print(f"[{filepath}] Error: Headings are out of order.")
print(f" Expected: {expected_order}")
print(f" Found: {filtered_h2s}")
file_errors = True
if file_errors:
has_errors = True
if tools_pages_found == 0:
print("Info: No tool directories found. Passing gracefully.")
sys.exit(0)
elif has_errors:
print("Linting failed for Tool pages. Please fix the structure errors above.")
sys.exit(1)
else:
print(f"Success: All {tools_pages_found} Tool page(s) passed structure validation.")
EOF

View File

@@ -1,125 +0,0 @@
# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#!/bin/bash
set -e
TABLE_NAME="hotels_go"
QUICKSTART_GO_DIR="docs/en/getting-started/quickstart/go"
SQL_FILE=".ci/quickstart_test/setup_hotels_sample.sql"
PROXY_PID=""
TOOLBOX_PID=""
install_system_packages() {
apt-get update && apt-get install -y \
postgresql-client \
wget \
gettext-base \
netcat-openbsd
}
start_cloud_sql_proxy() {
wget "https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.10.0/cloud-sql-proxy.linux.amd64" -O /usr/local/bin/cloud-sql-proxy
chmod +x /usr/local/bin/cloud-sql-proxy
cloud-sql-proxy "${CLOUD_SQL_INSTANCE}" &
PROXY_PID=$!
for i in {1..30}; do
if nc -z 127.0.0.1 5432; then
echo "Cloud SQL Proxy is up and running."
return
fi
sleep 1
done
echo "Cloud SQL Proxy failed to start within the timeout period."
exit 1
}
setup_toolbox() {
TOOLBOX_YAML="/tools.yaml"
echo "${TOOLS_YAML_CONTENT}" > "$TOOLBOX_YAML"
if [ ! -f "$TOOLBOX_YAML" ]; then echo "Failed to create tools.yaml"; exit 1; fi
wget "https://storage.googleapis.com/genai-toolbox/v${VERSION}/linux/amd64/toolbox" -O "/toolbox"
chmod +x "/toolbox"
/toolbox --tools-file "$TOOLBOX_YAML" &
TOOLBOX_PID=$!
sleep 2
}
setup_orch_table() {
export TABLE_NAME
envsubst < "$SQL_FILE" | psql -h "$PGHOST" -p "$PGPORT" -U "$DB_USER" -d "$DATABASE_NAME"
}
run_orch_test() {
local orch_dir="$1"
local orch_name
orch_name=$(basename "$orch_dir")
if [ "$orch_name" == "openAI" ]; then
echo -e "\nSkipping framework '${orch_name}': Temporarily excluded."
return
fi
(
set -e
setup_orch_table
echo "--- Preparing module for $orch_name ---"
cd "$orch_dir"
if [ -f "go.mod" ]; then
go mod tidy
fi
cd ..
export ORCH_NAME="$orch_name"
echo "--- Running tests for $orch_name ---"
go test -v ./...
)
}
cleanup_all() {
echo "--- Final cleanup: Shutting down processes and dropping table ---"
if [ -n "$TOOLBOX_PID" ]; then
kill $TOOLBOX_PID || true
fi
if [ -n "$PROXY_PID" ]; then
kill $PROXY_PID || true
fi
}
trap cleanup_all EXIT
# Main script execution
install_system_packages
start_cloud_sql_proxy
export PGHOST=127.0.0.1
export PGPORT=5432
export PGPASSWORD="$DB_PASSWORD"
export GOOGLE_API_KEY="$GOOGLE_API_KEY"
setup_toolbox
for ORCH_DIR in "$QUICKSTART_GO_DIR"/*/; do
if [ ! -d "$ORCH_DIR" ]; then
continue
fi
run_orch_test "$ORCH_DIR"
done

View File

@@ -1,125 +0,0 @@
# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#!/bin/bash
set -e
TABLE_NAME="hotels_js"
QUICKSTART_JS_DIR="docs/en/getting-started/quickstart/js"
SQL_FILE=".ci/quickstart_test/setup_hotels_sample.sql"
# Initialize process IDs to empty at the top of the script
PROXY_PID=""
TOOLBOX_PID=""
install_system_packages() {
apt-get update && apt-get install -y \
postgresql-client \
wget \
gettext-base \
netcat-openbsd
}
start_cloud_sql_proxy() {
wget "https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.10.0/cloud-sql-proxy.linux.amd64" -O /usr/local/bin/cloud-sql-proxy
chmod +x /usr/local/bin/cloud-sql-proxy
cloud-sql-proxy "${CLOUD_SQL_INSTANCE}" &
PROXY_PID=$!
for i in {1..30}; do
if nc -z 127.0.0.1 5432; then
echo "Cloud SQL Proxy is up and running."
return
fi
sleep 1
done
echo "Cloud SQL Proxy failed to start within the timeout period."
exit 1
}
setup_toolbox() {
TOOLBOX_YAML="/tools.yaml"
echo "${TOOLS_YAML_CONTENT}" > "$TOOLBOX_YAML"
if [ ! -f "$TOOLBOX_YAML" ]; then echo "Failed to create tools.yaml"; exit 1; fi
wget "https://storage.googleapis.com/genai-toolbox/v${VERSION}/linux/amd64/toolbox" -O "/toolbox"
chmod +x "/toolbox"
/toolbox --tools-file "$TOOLBOX_YAML" &
TOOLBOX_PID=$!
sleep 2
}
setup_orch_table() {
export TABLE_NAME
envsubst < "$SQL_FILE" | psql -h "$PGHOST" -p "$PGPORT" -U "$DB_USER" -d "$DATABASE_NAME"
}
run_orch_test() {
local orch_dir="$1"
local orch_name
orch_name=$(basename "$orch_dir")
(
set -e
echo "--- Preparing environment for $orch_name ---"
setup_orch_table
cd "$orch_dir"
echo "Installing dependencies for $orch_name..."
if [ -f "package-lock.json" ]; then
npm ci
else
npm install
fi
cd ..
echo "--- Running tests for $orch_name ---"
export ORCH_NAME="$orch_name"
node --test quickstart.test.js
echo "--- Cleaning environment for $orch_name ---"
rm -rf "${orch_name}/node_modules"
)
}
cleanup_all() {
echo "--- Final cleanup: Shutting down processes and dropping table ---"
if [ -n "$TOOLBOX_PID" ]; then
kill $TOOLBOX_PID || true
fi
if [ -n "$PROXY_PID" ]; then
kill $PROXY_PID || true
fi
}
trap cleanup_all EXIT
# Main script execution
install_system_packages
start_cloud_sql_proxy
export PGHOST=127.0.0.1
export PGPORT=5432
export PGPASSWORD="$DB_PASSWORD"
export GOOGLE_API_KEY="$GOOGLE_API_KEY"
setup_toolbox
for ORCH_DIR in "$QUICKSTART_JS_DIR"/*/; do
if [ ! -d "$ORCH_DIR" ]; then
continue
fi
run_orch_test "$ORCH_DIR"
done

View File

@@ -1,115 +0,0 @@
# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#!/bin/bash
set -e
TABLE_NAME="hotels_python"
QUICKSTART_PYTHON_DIR="docs/en/getting-started/quickstart/python"
SQL_FILE=".ci/quickstart_test/setup_hotels_sample.sql"
PROXY_PID=""
TOOLBOX_PID=""
install_system_packages() {
apt-get update && apt-get install -y \
postgresql-client \
python3-venv \
wget \
gettext-base \
netcat-openbsd
}
start_cloud_sql_proxy() {
wget "https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.10.0/cloud-sql-proxy.linux.amd64" -O /usr/local/bin/cloud-sql-proxy
chmod +x /usr/local/bin/cloud-sql-proxy
cloud-sql-proxy "${CLOUD_SQL_INSTANCE}" &
PROXY_PID=$!
for i in {1..30}; do
if nc -z 127.0.0.1 5432; then
echo "Cloud SQL Proxy is up and running."
return
fi
sleep 1
done
echo "Cloud SQL Proxy failed to start within the timeout period."
exit 1
}
setup_toolbox() {
TOOLBOX_YAML="/tools.yaml"
echo "${TOOLS_YAML_CONTENT}" > "$TOOLBOX_YAML"
if [ ! -f "$TOOLBOX_YAML" ]; then echo "Failed to create tools.yaml"; exit 1; fi
wget "https://storage.googleapis.com/genai-toolbox/v${VERSION}/linux/amd64/toolbox" -O "/toolbox"
chmod +x "/toolbox"
/toolbox --tools-file "$TOOLBOX_YAML" &
TOOLBOX_PID=$!
sleep 2
}
setup_orch_table() {
export TABLE_NAME
envsubst < "$SQL_FILE" | psql -h "$PGHOST" -p "$PGPORT" -U "$DB_USER" -d "$DATABASE_NAME"
}
run_orch_test() {
local orch_dir="$1"
local orch_name
orch_name=$(basename "$orch_dir")
(
set -e
setup_orch_table
cd "$orch_dir"
local VENV_DIR=".venv"
python3 -m venv "$VENV_DIR"
source "$VENV_DIR/bin/activate"
pip install -r requirements.txt
echo "--- Running tests for $orch_name ---"
cd ..
ORCH_NAME="$orch_name" pytest
rm -rf "$VENV_DIR"
)
}
cleanup_all() {
echo "--- Final cleanup: Shutting down processes and dropping table ---"
if [ -n "$TOOLBOX_PID" ]; then
kill $TOOLBOX_PID || true
fi
if [ -n "$PROXY_PID" ]; then
kill $PROXY_PID || true
fi
}
trap cleanup_all EXIT
# Main script execution
install_system_packages
start_cloud_sql_proxy
export PGHOST=127.0.0.1
export PGPORT=5432
export PGPASSWORD="$DB_PASSWORD"
export GOOGLE_API_KEY="$GOOGLE_API_KEY"
setup_toolbox
for ORCH_DIR in "$QUICKSTART_PYTHON_DIR"/*/; do
if [ ! -d "$ORCH_DIR" ]; then
continue
fi
run_orch_test "$ORCH_DIR"
done

View File

@@ -0,0 +1,57 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
steps:
- name: "${_IMAGE}"
id: "go-pre-post-processing-test"
entrypoint: "bash"
args:
- -c
- |
set -ex
chmod +x .ci/sample_tests/run_tests.sh
.ci/sample_tests/run_tests.sh
env:
- "CLOUD_SQL_INSTANCE=${_CLOUD_SQL_INSTANCE}"
- "GCP_PROJECT=${_GCP_PROJECT}"
- "DATABASE_NAME=${_DATABASE_NAME}"
- "DB_USER=${_DB_USER}"
- "TARGET_ROOT=${_TARGET_ROOT}"
- "TARGET_LANG=${_TARGET_LANG}"
- "TABLE_NAME=${_TABLE_NAME}"
- "SQL_FILE=${_SQL_FILE}"
- "AGENT_FILE_PATTERN=${_AGENT_FILE_PATTERN}"
secretEnv: ["TOOLS_YAML_CONTENT", "GOOGLE_API_KEY", "DB_PASSWORD"]
availableSecrets:
secretManager:
- versionName: projects/${_GCP_PROJECT}/secrets/${_TOOLS_YAML_SECRET}/versions/8
env: "TOOLS_YAML_CONTENT"
- versionName: projects/${_GCP_PROJECT_NUMBER}/secrets/${_API_KEY_SECRET}/versions/latest
env: "GOOGLE_API_KEY"
- versionName: projects/${_GCP_PROJECT}/secrets/${_DB_PASS_SECRET}/versions/latest
env: "DB_PASSWORD"
timeout: 1200s
substitutions:
_TARGET_LANG: "go"
_IMAGE: "golang:1.25.7"
_TARGET_ROOT: "docs/en/documentation/configuration/pre-post-processing/go"
_TABLE_NAME: "hotels_go_pre_post_processing"
_SQL_FILE: ".ci/sample_tests/setup_hotels.sql"
_AGENT_FILE_PATTERN: "agent.go"
options:
logging: CLOUD_LOGGING_ONLY

View File

@@ -0,0 +1,57 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
steps:
- name: "${_IMAGE}"
id: "js-pre-post-processing-test"
entrypoint: "bash"
args:
- -c
- |
set -ex
chmod +x .ci/sample_tests/run_tests.sh
.ci/sample_tests/run_tests.sh
env:
- "CLOUD_SQL_INSTANCE=${_CLOUD_SQL_INSTANCE}"
- "GCP_PROJECT=${_GCP_PROJECT}"
- "DATABASE_NAME=${_DATABASE_NAME}"
- "DB_USER=${_DB_USER}"
- "TARGET_ROOT=${_TARGET_ROOT}"
- "TARGET_LANG=${_TARGET_LANG}"
- "TABLE_NAME=${_TABLE_NAME}"
- "SQL_FILE=${_SQL_FILE}"
- "AGENT_FILE_PATTERN=${_AGENT_FILE_PATTERN}"
secretEnv: ["TOOLS_YAML_CONTENT", "GOOGLE_API_KEY", "DB_PASSWORD"]
availableSecrets:
secretManager:
- versionName: projects/${_GCP_PROJECT}/secrets/${_TOOLS_YAML_SECRET}/versions/8
env: "TOOLS_YAML_CONTENT"
- versionName: projects/${_GCP_PROJECT_NUMBER}/secrets/${_API_KEY_SECRET}/versions/latest
env: "GOOGLE_API_KEY"
- versionName: projects/${_GCP_PROJECT}/secrets/${_DB_PASS_SECRET}/versions/latest
env: "DB_PASSWORD"
timeout: 1200s
substitutions:
_TARGET_LANG: "js"
_IMAGE: "node:22"
_TARGET_ROOT: "docs/en/documentation/configuration/pre-post-processing/js"
_TABLE_NAME: "hotels_js_pre_post_processing"
_SQL_FILE: ".ci/sample_tests/setup_hotels.sql"
_AGENT_FILE_PATTERN: "agent.js"
options:
logging: CLOUD_LOGGING_ONLY

View File

@@ -0,0 +1,57 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
steps:
- name: "${_IMAGE}"
id: "py-pre-post-processing-test"
entrypoint: "bash"
args:
- -c
- |
set -ex
chmod +x .ci/sample_tests/run_tests.sh
.ci/sample_tests/run_tests.sh
env:
- "CLOUD_SQL_INSTANCE=${_CLOUD_SQL_INSTANCE}"
- "GCP_PROJECT=${_GCP_PROJECT}"
- "DATABASE_NAME=${_DATABASE_NAME}"
- "DB_USER=${_DB_USER}"
- "TARGET_ROOT=${_TARGET_ROOT}"
- "TARGET_LANG=${_TARGET_LANG}"
- "TABLE_NAME=${_TABLE_NAME}"
- "SQL_FILE=${_SQL_FILE}"
- "AGENT_FILE_PATTERN=${_AGENT_FILE_PATTERN}"
secretEnv: ["TOOLS_YAML_CONTENT", "GOOGLE_API_KEY", "DB_PASSWORD"]
availableSecrets:
secretManager:
- versionName: projects/${_GCP_PROJECT}/secrets/${_TOOLS_YAML_SECRET}/versions/8
env: "TOOLS_YAML_CONTENT"
- versionName: projects/${_GCP_PROJECT_NUMBER}/secrets/${_API_KEY_SECRET}/versions/latest
env: "GOOGLE_API_KEY"
- versionName: projects/${_GCP_PROJECT}/secrets/${_DB_PASS_SECRET}/versions/latest
env: "DB_PASSWORD"
timeout: 1200s
substitutions:
_TARGET_LANG: "python"
_IMAGE: "gcr.io/google.com/cloudsdktool/cloud-sdk:537.0.0"
_TARGET_ROOT: "docs/en/documentation/configuration/pre-post-processing/python"
_TABLE_NAME: "hotels_py_pre_post_processing"
_SQL_FILE: ".ci/sample_tests/setup_hotels.sql"
_AGENT_FILE_PATTERN: "agent.py"
options:
logging: CLOUD_LOGGING_ONLY

View File

@@ -13,7 +13,7 @@
# limitations under the License.
steps:
- name: 'golang:1.25.1'
- name: 'golang:1.25.7'
id: 'go-quickstart-test'
entrypoint: 'bash'
args:
@@ -23,18 +23,23 @@ steps:
- |
set -ex
export VERSION=$(cat ./cmd/version.txt)
chmod +x .ci/quickstart_test/run_go_tests.sh
.ci/quickstart_test/run_go_tests.sh
chmod +x .ci/sample_tests/run_tests.sh
.ci/sample_tests/run_tests.sh
env:
- 'CLOUD_SQL_INSTANCE=${_CLOUD_SQL_INSTANCE}'
- 'GCP_PROJECT=${_GCP_PROJECT}'
- 'DATABASE_NAME=${_DATABASE_NAME}'
- 'DB_USER=${_DB_USER}'
- 'TARGET_ROOT=docs/en/documentation/getting-started/quickstart/go'
- 'TARGET_LANG=go'
- 'TABLE_NAME=hotels_go'
- 'SQL_FILE=.ci/sample_tests/setup_hotels.sql'
- 'AGENT_FILE_PATTERN=quickstart.go'
secretEnv: ['TOOLS_YAML_CONTENT', 'GOOGLE_API_KEY', 'DB_PASSWORD']
availableSecrets:
secretManager:
- versionName: projects/${_GCP_PROJECT}/secrets/${_TOOLS_YAML_SECRET}/versions/7
- versionName: projects/${_GCP_PROJECT}/secrets/${_TOOLS_YAML_SECRET}/versions/10
env: 'TOOLS_YAML_CONTENT'
- versionName: projects/${_GCP_PROJECT_NUMBER}/secrets/${_API_KEY_SECRET}/versions/latest
env: 'GOOGLE_API_KEY'
@@ -44,4 +49,4 @@ availableSecrets:
timeout: 1000s
options:
logging: CLOUD_LOGGING_ONLY
logging: CLOUD_LOGGING_ONLY

View File

@@ -23,18 +23,23 @@ steps:
- |
set -ex
export VERSION=$(cat ./cmd/version.txt)
chmod +x .ci/quickstart_test/run_js_tests.sh
.ci/quickstart_test/run_js_tests.sh
chmod +x .ci/sample_tests/run_tests.sh
.ci/sample_tests/run_tests.sh
env:
- 'CLOUD_SQL_INSTANCE=${_CLOUD_SQL_INSTANCE}'
- 'GCP_PROJECT=${_GCP_PROJECT}'
- 'DATABASE_NAME=${_DATABASE_NAME}'
- 'DB_USER=${_DB_USER}'
- 'TARGET_ROOT=docs/en/documentation/getting-started/quickstart/js'
- 'TARGET_LANG=js'
- 'TABLE_NAME=hotels_js'
- 'SQL_FILE=.ci/sample_tests/setup_hotels.sql'
- 'AGENT_FILE_PATTERN=quickstart.js'
secretEnv: ['TOOLS_YAML_CONTENT', 'GOOGLE_API_KEY', 'DB_PASSWORD']
availableSecrets:
secretManager:
- versionName: projects/${_GCP_PROJECT}/secrets/${_TOOLS_YAML_SECRET}/versions/6
- versionName: projects/${_GCP_PROJECT}/secrets/${_TOOLS_YAML_SECRET}/versions/9
env: 'TOOLS_YAML_CONTENT'
- versionName: projects/${_GCP_PROJECT_NUMBER}/secrets/${_API_KEY_SECRET}/versions/latest
env: 'GOOGLE_API_KEY'

View File

@@ -23,18 +23,23 @@ steps:
- |
set -ex
export VERSION=$(cat ./cmd/version.txt)
chmod +x .ci/quickstart_test/run_py_tests.sh
.ci/quickstart_test/run_py_tests.sh
chmod +x .ci/sample_tests/run_tests.sh
.ci/sample_tests/run_tests.sh
env:
- 'CLOUD_SQL_INSTANCE=${_CLOUD_SQL_INSTANCE}'
- 'GCP_PROJECT=${_GCP_PROJECT}'
- 'DATABASE_NAME=${_DATABASE_NAME}'
- 'DB_USER=${_DB_USER}'
- 'TARGET_ROOT=docs/en/documentation/getting-started/quickstart/python'
- 'TARGET_LANG=python'
- 'TABLE_NAME=hotels_python'
- 'SQL_FILE=.ci/sample_tests/setup_hotels.sql'
- 'AGENT_FILE_PATTERN=quickstart.py'
secretEnv: ['TOOLS_YAML_CONTENT', 'GOOGLE_API_KEY', 'DB_PASSWORD']
availableSecrets:
secretManager:
- versionName: projects/${_GCP_PROJECT}/secrets/${_TOOLS_YAML_SECRET}/versions/5
- versionName: projects/${_GCP_PROJECT}/secrets/${_TOOLS_YAML_SECRET}/versions/8
env: 'TOOLS_YAML_CONTENT'
- versionName: projects/${_GCP_PROJECT_NUMBER}/secrets/${_API_KEY_SECRET}/versions/latest
env: 'GOOGLE_API_KEY'

View File

@@ -0,0 +1,202 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -e
# --- Configuration (from Environment Variables) ---
# TARGET_ROOT: The directory to search for tests (e.g., docs/en/getting-started/quickstart/js)
# TARGET_LANG: python, js, go
# TABLE_NAME: Database table name to use
# SQL_FILE: Path to the SQL setup file
# AGENT_FILE_PATTERN: Filename to look for (e.g., quickstart.js or agent.py)
VERSION=$(cat ./cmd/version.txt)
# Process IDs & Logs
PROXY_PID=""
TOOLBOX_PID=""
PROXY_LOG="cloud_sql_proxy.log"
TOOLBOX_LOG="toolbox_server.log"
install_system_packages() {
echo "Installing system packages..."
apt-get update && apt-get install -y \
postgresql-client \
wget \
gettext-base \
netcat-openbsd
if [[ "$TARGET_LANG" == "python" ]]; then
apt-get install -y python3-venv
fi
}
start_cloud_sql_proxy() {
echo "Starting Cloud SQL Proxy..."
wget -q "https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.10.0/cloud-sql-proxy.linux.amd64" -O /usr/local/bin/cloud-sql-proxy
chmod +x /usr/local/bin/cloud-sql-proxy
cloud-sql-proxy "${CLOUD_SQL_INSTANCE}" > "$PROXY_LOG" 2>&1 &
PROXY_PID=$!
# Health Check
for i in {1..30}; do
if nc -z 127.0.0.1 5432; then
echo "Cloud SQL Proxy is up and running."
return
fi
sleep 1
done
echo "ERROR: Cloud SQL Proxy failed to start. Logs:"
cat "$PROXY_LOG"
exit 1
}
setup_toolbox() {
echo "Setting up Toolbox server..."
TOOLBOX_YAML="/tools.yaml"
echo "${TOOLS_YAML_CONTENT}" > "$TOOLBOX_YAML"
wget -q "https://storage.googleapis.com/genai-toolbox/v${VERSION}/linux/amd64/toolbox" -O "/toolbox"
chmod +x "/toolbox"
/toolbox --tools-file "$TOOLBOX_YAML" > "$TOOLBOX_LOG" 2>&1 &
TOOLBOX_PID=$!
# Health Check
for i in {1..15}; do
if nc -z 127.0.0.1 5000; then
echo "Toolbox server is up and running."
return
fi
sleep 1
done
echo "ERROR: Toolbox server failed to start. Logs:"
cat "$TOOLBOX_LOG"
exit 1
}
setup_db_table() {
echo "Setting up database table $TABLE_NAME using $SQL_FILE..."
export TABLE_NAME
envsubst < "$SQL_FILE" | psql -h 127.0.0.1 -p 5432 -U "$DB_USER" -d "$DATABASE_NAME"
}
run_python_test() {
local dir=$1
local name=$(basename "$dir")
echo "--- Running Python Test: $name ---"
(
cd "$dir"
python3 -m venv .venv
source .venv/bin/activate
pip install -q -r requirements.txt pytest
cd ..
local test_file=$(find . -maxdepth 1 -name "*test.py" | head -n 1)
if [ -n "$test_file" ]; then
echo "Found native test: $test_file. Running pytest..."
export ORCH_NAME="$name"
export PYTHONPATH="../"
pytest "$test_file"
else
echo "No native test found. running agent directly..."
export PYTHONPATH="../"
python3 "${name}/${AGENT_FILE_PATTERN}"
fi
rm -rf "${name}/.venv"
)
}
run_js_test() {
local dir=$1
local name=$(basename "$dir")
echo "--- Running JS Test: $name ---"
(
cd "$dir"
if [ -f "package-lock.json" ]; then npm ci -q; else npm install -q; fi
cd ..
# Looking for a JS test file in the parent directory
local test_file=$(find . -maxdepth 1 -name "*test.js" | head -n 1)
if [ -n "$test_file" ]; then
echo "Found native test: $test_file. Running node --test..."
export ORCH_NAME="$name"
node --test "$test_file"
else
echo "No native test found. running agent directly..."
node "${name}/${AGENT_FILE_PATTERN}"
fi
rm -rf "${name}/node_modules"
)
}
run_go_test() {
local dir=$1
local name=$(basename "$dir")
if [ "$name" == "openAI" ]; then
echo -e "\nSkipping framework '${name}': Temporarily excluded."
return
fi
echo "--- Running Go Test: $name ---"
(
cd "$dir"
if [ -f "go.mod" ]; then
go mod tidy
fi
cd ..
local test_file=$(find . -maxdepth 1 -name "*test.go" | head -n 1)
if [ -n "$test_file" ]; then
echo "Found native test: $test_file. Running go test..."
export ORCH_NAME="$name"
go test -v ./...
else
echo "No native test found. running agent directly..."
cd "$name"
go run "."
fi
)
}
cleanup() {
echo "Cleaning up background processes..."
[ -n "$TOOLBOX_PID" ] && kill "$TOOLBOX_PID" || true
[ -n "$PROXY_PID" ] && kill "$PROXY_PID" || true
}
trap cleanup EXIT
# --- Execution ---
install_system_packages
start_cloud_sql_proxy
export PGHOST=127.0.0.1
export PGPORT=5432
export PGPASSWORD="$DB_PASSWORD"
export GOOGLE_API_KEY="$GOOGLE_API_KEY"
setup_toolbox
setup_db_table
echo "Scanning $TARGET_ROOT for tests with pattern $AGENT_FILE_PATTERN..."
find "$TARGET_ROOT" -name "$AGENT_FILE_PATTERN" | while read -r agent_file; do
sample_dir=$(dirname "$agent_file")
if [[ "$TARGET_LANG" == "python" ]]; then
run_python_test "$sample_dir"
elif [[ "$TARGET_LANG" == "js" ]]; then
run_js_test "$sample_dir"
elif [[ "$TARGET_LANG" == "go" ]]; then
run_go_test "$sample_dir"
fi
done

View File

@@ -35,7 +35,7 @@ for tool_name in "${TOOL_PACKAGE_NAMES[@]}"; do
done
# Run integration test
if ! ./"${TEST_BINARY}" -test.v -test.coverprofile="${COVERAGE_FILE}"; then
if ! ./"${TEST_BINARY}" -test.v ${EXTRA_TEST_ARGS:-} -test.coverprofile="${COVERAGE_FILE}"; then
echo "Error: Tests for ${DISPLAY_NAME} failed. Exiting."
exit 1
fi

View File

@@ -17,14 +17,26 @@ steps:
waitFor: ['-']
script: |
#!/usr/bin/env bash
set -e
export VERSION=$(cat ./cmd/version.txt)
docker buildx create --name container-builder --driver docker-container --bootstrap --use
export TAGS="-t ${_DOCKER_URI}:$VERSION"
if [[ $_PUSH_LATEST == 'true' ]]; then
if [[ "$_PUSH_LATEST" == "true" ]]; then
export TAGS="$TAGS -t ${_DOCKER_URI}:latest"
fi
docker buildx build --platform linux/amd64,linux/arm64 --build-arg BUILD_TYPE=container.release --build-arg COMMIT_SHA=$(git rev-parse --short HEAD) $TAGS --push .
# Build and push
docker buildx build \
--platform linux/amd64,linux/arm64 \
--build-arg BUILD_TYPE=container.release \
--build-arg COMMIT_SHA=$(git rev-parse --short HEAD) \
$TAGS \
--push .
# Pull the image to ensure it's available for provenance generation.
docker pull ${_DOCKER_URI}:${VERSION}
docker tag ${_DOCKER_URI}:${VERSION} ${_DOCKER_URI}:latest
- id: "install-dependencies"
name: golang:1
@@ -339,7 +351,11 @@ steps:
export VERSION=v$(cat ./cmd/version.txt)
gcloud storage cp toolbox.geminicli.windows.amd64 gs://$_BUCKET_NAME/geminicli/$VERSION/windows/amd64/toolbox.exe
images:
- "${_DOCKER_URI}:latest"
options:
requestedVerifyOption: VERIFIED # This ensures provenance is generated
automapSubstitutions: true
dynamicSubstitutions: true
logging: CLOUD_LOGGING_ONLY # Necessary for custom service account

1
.gemini/styleguide.md Symbolic link
View File

@@ -0,0 +1 @@
../GEMINI.md

22
.github/CODEOWNERS vendored
View File

@@ -3,15 +3,15 @@
# For syntax help see:
# https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners#codeowners-syntax
* @googleapis/senseai-eco
* @googleapis/senseai-eco-team
# Code & Tests
**/alloydb*/ @googleapis/toolbox-alloydb
**/bigquery/ @googleapis/toolbox-bigquery
**/bigtable/ @googleapis/toolbox-bigtable
**/cloudsqlmssql/ @googleapis/toolbox-cloud-sql-mssql
**/cloudsqlmysql/ @googleapis/toolbox-cloud-sql-mysql
**/cloudsqlpg/ @googleapis/toolbox-cloud-sql-postgres
**/dataplex/ @googleapis/toolbox-dataplex
**/firestore/ @googleapis/toolbox-firestore
**/looker/ @googleapis/toolbox-looker
**/spanner/ @googleapis/toolbox-spanner
**/alloydb*/ @googleapis/toolbox-alloydb-team @googleapis/senseai-eco-team
**/bigquery/ @googleapis/toolbox-bigquery-team @googleapis/senseai-eco-team
**/bigtable/ @googleapis/toolbox-bigtable-team @googleapis/senseai-eco-team
**/cloudsqlmssql/ @googleapis/toolbox-cloud-sql-mssql-team @googleapis/senseai-eco-team
**/cloudsqlmysql/ @googleapis/toolbox-cloud-sql-mysql-team @googleapis/senseai-eco-team
**/cloudsqlpg/ @googleapis/toolbox-cloud-sql-postgres-team @googleapis/senseai-eco-team
**/dataplex/ @googleapis/toolbox-dataplex-team @googleapis/senseai-eco-team
**/firestore/ @googleapis/toolbox-firestore-team @googleapis/senseai-eco-team
**/looker/ @googleapis/toolbox-looker-team @googleapis/senseai-eco-team
**/spanner/ @googleapis/toolbox-spanner-team @googleapis/senseai-eco-team

View File

@@ -22,43 +22,43 @@ assign_issues_by:
- labels:
- 'product: alloydb'
to:
- 'googleapis/toolbox-alloydb'
- 'googleapis/toolbox-alloydb-team'
- labels:
- 'product: bigquery'
to:
- 'googleapis/toolbox-bigquery'
- 'googleapis/toolbox-bigquery-team'
- labels:
- 'product: bigtable'
to:
- 'googleapis/toolbox-bigtable'
- 'googleapis/toolbox-bigtable-team'
- labels:
- 'product: mssql'
to:
- 'googleapis/toolbox-cloud-sql-mssql'
- 'googleapis/toolbox-cloud-sql-mssql-team'
- labels:
- 'product: mysql'
to:
- 'googleapis/toolbox-cloud-sql-mysql'
- 'googleapis/toolbox-cloud-sql-mysql-team'
- labels:
- 'product: postgres'
to:
- 'googleapis/toolbox-cloud-sql-postgres'
- 'googleapis/toolbox-cloud-sql-postgres-team'
- labels:
- 'product: dataplex'
to:
- 'googleapis/toolbox-dataplex'
- 'googleapis/toolbox-dataplex-team'
- labels:
- 'product: firestore'
to:
- 'googleapis/toolbox-firestore'
- 'googleapis/toolbox-firestore-team'
- labels:
- 'product: looker'
to:
- 'googleapis/toolbox-looker'
- 'googleapis/toolbox-looker-team'
- labels:
- 'product: spanner'
to:
- 'googleapis/toolbox-spanner'
- 'googleapis/toolbox-spanner-team'
assign_prs:
- Yuan325
- duwenxin99
@@ -66,41 +66,41 @@ assign_prs_by:
- labels:
- 'product: alloydb'
to:
- 'googleapis/toolbox-alloydb'
- 'googleapis/toolbox-alloydb-team'
- labels:
- 'product: bigquery'
to:
- 'googleapis/toolbox-bigquery'
- 'googleapis/toolbox-bigquery-team'
- labels:
- 'product: bigtable'
to:
- 'googleapis/toolbox-bigtable'
- 'googleapis/toolbox-bigtable-team'
- labels:
- 'product: mssql'
to:
- 'googleapis/toolbox-cloud-sql-mssql'
- 'googleapis/toolbox-cloud-sql-mssql-team'
- labels:
- 'product: mysql'
to:
- 'googleapis/toolbox-cloud-sql-mysql'
- 'googleapis/toolbox-cloud-sql-mysql-team'
- labels:
- 'product: postgres'
to:
- 'googleapis/toolbox-cloud-sql-postgres'
- 'googleapis/toolbox-cloud-sql-postgres-team'
- labels:
- 'product: dataplex'
to:
- 'googleapis/toolbox-dataplex'
- 'googleapis/toolbox-dataplex-team'
- labels:
- 'product: firestore'
to:
- 'googleapis/toolbox-firestore'
- 'googleapis/toolbox-firestore-team'
- labels:
- 'product: looker'
to:
- 'googleapis/toolbox-looker'
- 'googleapis/toolbox-looker-team'
- labels:
- 'product: spanner'
to:
- 'googleapis/toolbox-spanner'
- 'googleapis/toolbox-spanner-team'

View File

@@ -22,6 +22,6 @@ sourceFileExtensions:
- 'yaml'
- 'yml'
ignoreFiles:
- 'docs/en/getting-started/quickstart/**'
- '**/*oracle*'
- 'docs/en/documentation/**/*.go'
- 'docs/en/samples/**/*'
- '**/*oracle*'

View File

@@ -18,25 +18,26 @@ releaseType: simple
versionFile: "cmd/version.txt"
extraFiles: [
"README.md",
"docs/en/getting-started/colab_quickstart.ipynb",
"docs/en/getting-started/introduction/_index.md",
"docs/en/getting-started/mcp_quickstart/_index.md",
"docs/en/getting-started/quickstart/shared/configure_toolbox.md",
"docs/en/samples/alloydb/_index.md",
"docs/en/samples/alloydb/mcp_quickstart.md",
"docs/en/samples/alloydb/ai-nl/alloydb_ai_nl.ipynb",
"docs/en/samples/bigquery/local_quickstart.md",
"docs/en/samples/bigquery/mcp_quickstart/_index.md",
"docs/en/samples/bigquery/colab_quickstart_bigquery.ipynb",
"docs/en/samples/looker/looker_gemini.md",
"docs/en/samples/looker/looker_gemini_oauth/_index.md",
"docs/en/samples/looker/looker_mcp_inspector/_index.md",
"docs/en/how-to/connect-ide/looker_mcp.md",
"docs/en/how-to/connect-ide/mysql_mcp.md",
"docs/en/how-to/connect-ide/mssql_mcp.md",
"docs/en/how-to/connect-ide/postgres_mcp.md",
"docs/en/how-to/connect-ide/neo4j_mcp.md",
"docs/en/how-to/connect-ide/sqlite_mcp.md",
"docs/en/documentation/getting-started/colab_quickstart.ipynb",
"docs/en/documentation/introduction/_index.md",
"docs/en/documentation/getting-started/mcp_quickstart/_index.md",
"docs/en/documentation/getting-started/quickstart/shared/configure_toolbox.md",
"docs/en/integrations/alloydb/_index.md",
"docs/en/integrations/alloydb/mcp_quickstart.md",
"docs/en/integrations/alloydb/ai-nl/alloydb_ai_nl.ipynb",
"docs/en/integrations/bigquery/local_quickstart.md",
"docs/en/integrations/bigquery/mcp_quickstart/_index.md",
"docs/en/integrations/bigquery/colab_quickstart_bigquery.ipynb",
"docs/en/integrations/looker/looker_gemini.md",
"docs/en/integrations/looker/looker_gemini_oauth/_index.md",
"docs/en/integrations/looker/looker_mcp_inspector/_index.md",
"docs/en/documentation/connect-to/ides/looker_mcp.md",
"docs/en/documentation/connect-to/ides/mysql_mcp.md",
"docs/en/documentation/connect-to/ides/mssql_mcp.md",
"docs/en/documentation/connect-to/ides/postgres_mcp.md",
"docs/en/documentation/connect-to/ides/neo4j_mcp.md",
"docs/en/documentation/connect-to/ides/sqlite_mcp.md",
"docs/en/documentation/connect-to/ides/oracle_mcp.md",
"gemini-extension.json",
{
"type": "json",

View File

@@ -8,15 +8,35 @@
':prHourlyLimitNone',
':preserveSemverRanges',
],
minimumReleaseAge: '3',
minimumReleaseAge: '3 days',
rebaseWhen: 'conflicted',
dependencyDashboardLabels: [
'type: process',
],
"postUpdateOptions": [
"gomodTidy"
postUpdateOptions: [
'gomodTidy',
],
customManagers: [
{
customType: 'regex',
managerFilePatterns: [
'/^\\.github/workflows/.*\\.ya?ml$/',
],
matchStrings: [
'hugo-version:\\s*["\']?(?<currentValue>\\d+\\.\\d+\\.\\d+)["\']?',
],
depNameTemplate: 'gohugoio/hugo',
datasourceTemplate: 'github-releases',
extractVersionTemplate: '^v?(?<version>.*)$',
},
],
packageRules: [
{
groupName: 'Hugo',
matchPackageNames: [
'gohugoio/hugo',
],
},
{
groupName: 'GitHub Actions',
matchManagers: [
@@ -29,6 +49,20 @@
matchManagers: [
'gomod',
],
ignorePaths: [
'docs/**',
'.hugo/**',
],
},
{
groupName: 'Go Samples',
matchManagers: [
'gomod',
],
matchFileNames: [
'docs/**',
'.hugo/**',
],
},
{
groupName: 'Node',

View File

@@ -1,44 +0,0 @@
# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Synchronize repository settings from a centralized config
# https://github.com/googleapis/repo-automation-bots/tree/main/packages/sync-repo-settings
# Install: https://github.com/apps/sync-repo-settings
# Disable merge commits
rebaseMergeAllowed: true
squashMergeAllowed: true
mergeCommitAllowed: false
# Enable branch protection
branchProtectionRules:
- pattern: main
isAdminEnforced: true
requiredStatusCheckContexts:
- "cla/google"
- "lint"
- "conventionalcommits.org"
- "header-check"
# - Add required status checks like presubmit tests
- "unit tests (ubuntu-latest)"
- "unit tests (windows-latest)"
- "unit tests (macos-latest)"
- "integration-test-pr (toolbox-testing-438616)"
requiredApprovingReviewCount: 1
requiresCodeOwnerReviews: true
requiresStrictStatusChecks: true
# Set team access
permissionRules:
- team: senseai-eco
permission: admin

45
.github/workflows/cloudflare_sync.yaml vendored Normal file
View File

@@ -0,0 +1,45 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: "Sync v1 docsite to Cloudflare"
permissions:
contents: read
concurrency:
group: cloudflare-sync
cancel-in-progress: true
on:
workflow_run:
workflows: ["CF: Deploy Dev Docs", "CF: Deploy Versioned Docs", "CF: Deploy Previous Version Docs"]
types: [completed]
jobs:
deploy:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
ref: 'cloudflare-pages'
- name: Cleanup
run: |
rm -rf .git
- name: Cloudflare Deploy
uses: cloudflare/wrangler-action@da0e0dfe58b7a431659754fdf3f186c529afbe65 # v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: pages deploy . --project-name=toolbox-docs --branch=main

View File

@@ -40,7 +40,7 @@ jobs:
group: docs-deployment
cancel-in-progress: false
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
@@ -51,12 +51,12 @@ jobs:
extended: true
- name: Setup Node
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: "22"
- name: Cache dependencies
uses: actions/cache@8b402f58fbc84540c8b491a91e594a4576fec3d7 # v5
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
@@ -69,6 +69,9 @@ jobs:
HUGO_BASEURL: https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/dev
HUGO_RELATIVEURLS: false
- name: Build Pagefind Search Index
run: npx pagefind --site public
- name: Create Staging Directory
run: |
mkdir staging

View File

@@ -0,0 +1,90 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: "CF: Deploy Dev Docs"
permissions:
contents: write
on:
push:
branches:
- main
paths:
- 'docs/**'
- '.github/workflows/docs*_cf.yaml'
- '.github/workflows/deploy*_cf.yaml'
- '.hugo/**'
# Allow triggering manually.
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-24.04
defaults:
run:
working-directory: .hugo
# This shared concurrency group ensures only one docs deployment runs at a time.
concurrency:
group: cf-docs-update
cancel-in-progress: true
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
fetch-depth: 0
submodules: recursive
- name: Setup Hugo
uses: peaceiris/actions-hugo@75d2e84710de30f6ff7268e08f310b60ef14033f # v3
with:
hugo-version: "0.145.0"
extended: true
- name: Setup Node
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: "22"
- name: Cache dependencies
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- run: npm ci
- run: hugo --minify --config hugo.cloudflare.toml
env:
HUGO_BASEURL: https://mcp-toolbox.dev/dev/
HUGO_RELATIVEURLS: false
- name: Build Pagefind Search Index
run: npx pagefind --site public
- name: Create Staging Directory
run: |
mkdir staging
mv public staging/dev
mv staging/dev/releases.releases staging/releases.releases
- name: Push to Cloudflare Branch
uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./.hugo/staging
publish_branch: cloudflare-pages
keep_files: true
commit_message: "deploy: ${{ github.event.head_commit.message }}"

View File

@@ -30,14 +30,14 @@ jobs:
steps:
- name: Checkout main branch (for latest templates and theme)
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
ref: 'main'
submodules: 'recursive'
fetch-depth: 0
- name: Checkout old content from tag into a temporary directory
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
ref: ${{ github.event.inputs.version_tag }}
path: 'old_version_source' # Checkout into a temp subdir
@@ -57,7 +57,7 @@ jobs:
with:
hugo-version: "0.145.0"
extended: true
- uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: "22"
@@ -71,6 +71,11 @@ jobs:
env:
HUGO_BASEURL: https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/${{ github.event.inputs.version_tag }}/
HUGO_RELATIVEURLS: false
HUGO_PARAMS_VERSION: ${{ github.event.inputs.version_tag }}
- name: Build Pagefind Index (Archived Version)
run: npx pagefind --site public
working-directory: .hugo
- name: Deploy to gh-pages
uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4
@@ -92,6 +97,11 @@ jobs:
env:
HUGO_BASEURL: https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/
HUGO_RELATIVEURLS: false
HUGO_PARAMS_VERSION: ${{ github.event.inputs.version_tag }}
- name: Build Pagefind Index (Root)
run: npx pagefind --site public
working-directory: .hugo
- name: Deploy to root
uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4
@@ -101,4 +111,4 @@ jobs:
publish_branch: versioned-gh-pages
keep_files: true
allow_empty_commit: true
commit_message: "deploy: docs to root for ${{ github.event.inputs.version_tag }}"
commit_message: "deploy: docs to root for ${{ github.event.inputs.version_tag }}"

View File

@@ -0,0 +1,137 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: "CF: Deploy Previous Version Docs"
on:
workflow_dispatch:
inputs:
version_tag:
description: 'The old version tag to build docs for (e.g., v0.15.0)'
required: true
type: string
jobs:
build_and_deploy:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout Tag (Code + Content)
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
ref: ${{ github.event.inputs.version_tag }}
submodules: 'recursive'
fetch-depth: 0
- name: Apply Backports and Fixes
run: |
# 1. Fetch main to get the compressed GIF
git fetch origin main
git show origin/main:docs/en/documentation/configuration/toolbox-ui/edit-headers.gif > docs/en/how-to/toolbox-ui/edit-headers.gif
sed -i 's|/genai-toolbox/|/|g' .hugo/layouts/partials/navbar-version-selector.html
sed -i 's|https://googleapis.github.io/genai-toolbox|https://mcp-toolbox.dev|g' .hugo/hugo.toml
git show origin/main:.hugo/hugo.cloudflare.toml > modern_config.toml
# Graft the future version list into the old config using Node.js!
node -e "
const fs = require('fs');
const modern = fs.readFileSync('modern_config.toml', 'utf8');
let old = fs.readFileSync('.hugo/hugo.toml', 'utf8');
// Convert any old GitHub URLs to Cloudflare in the rest of the config
old = old.replace(/https:\/\/googleapis\.github\.io\/genai-toolbox/g, 'https://mcp-toolbox.dev');
// Erase the outdated version list from the old config
old = old.replace(/\[\[params\.versions\]\][\s\S]*?(?=\n\[\[|\n\[|$)/g, '');
// Extract the fully updated version list from the modern config
const modernVersions = modern.match(/\[\[params\.versions\]\][\s\S]*?(?=\n\[\[|\n\[|$)/g);
// Inject the modern versions into the old config
if (modernVersions) {
fs.writeFileSync('.hugo/hugo.toml', old + '\n\n' + modernVersions.join('\n'));
} else {
fs.writeFileSync('.hugo/hugo.toml', old);
}
"
- name: Setup Hugo and Node
uses: peaceiris/actions-hugo@75d2e84710de30f6ff7268e08f310b60ef14033f # v3
with:
hugo-version: "0.145.0"
extended: true
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: "22"
- name: Install Dependencies
run: npm ci
working-directory: .hugo
- name: Build Hugo Site for Archived Version
run: |
hugo --minify
rm -f public/releases.releases
working-directory: .hugo
env:
HUGO_BASEURL: https://mcp-toolbox.dev/${{ github.event.inputs.version_tag }}/
HUGO_RELATIVEURLS: false
HUGO_PARAMS_VERSION: ${{ github.event.inputs.version_tag }}
- name: Build Pagefind Index (Archived Version)
run: npx pagefind --site public
working-directory: .hugo
- name: Deploy to cloudflare-pages
uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: .hugo/public
publish_branch: cloudflare-pages
destination_dir: ./${{ github.event.inputs.version_tag }}
keep_files: true
allow_empty_commit: true
commit_message: "docs(backport): deploy docs for ${{ github.event.inputs.version_tag }}"
- name: Clean Build Directory
run: rm -rf .hugo/public
- name: Build Hugo Site
run: hugo --minify
working-directory: .hugo
env:
HUGO_BASEURL: https://mcp-toolbox.dev/
HUGO_RELATIVEURLS: false
HUGO_PARAMS_VERSION: ${{ github.event.inputs.version_tag }}
- name: Build Pagefind Index (Root)
run: npx pagefind --site public
working-directory: .hugo
- name: Deploy to root
uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: .hugo/public
publish_branch: cloudflare-pages
keep_files: true
allow_empty_commit: true
commit_message: "deploy: docs to root for ${{ github.event.inputs.version_tag }}"

View File

@@ -30,12 +30,15 @@ jobs:
cancel-in-progress: false
steps:
- name: Checkout Code at Tag
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
ref: ${{ github.event.release.tag_name }}
- name: Get Version from Release Tag
run: echo "VERSION=${{ github.event.release.tag_name }}" >> $GITHUB_ENV
id: get_version
env:
RELEASE_TAG: ${{ github.event.release.tag_name }}
run: echo "VERSION=${RELEASE_TAG}" >> "$GITHUB_OUTPUT"
- name: Setup Hugo
uses: peaceiris/actions-hugo@75d2e84710de30f6ff7268e08f310b60ef14033f # v3
@@ -44,7 +47,7 @@ jobs:
extended: true
- name: Setup Node
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: "22"
@@ -56,8 +59,13 @@ jobs:
run: hugo --minify
working-directory: .hugo
env:
HUGO_BASEURL: https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/${{ env.VERSION }}/
HUGO_BASEURL: https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/${{ steps.get_version.outputs.VERSION }}/
HUGO_RELATIVEURLS: false
HUGO_PARAMS_VERSION: ${{ steps.get_version.outputs.VERSION }}
- name: Build Pagefind Index (Versioned)
run: npx pagefind --site public
working-directory: .hugo
- name: Deploy
uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4
@@ -65,9 +73,9 @@ jobs:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: .hugo/public
publish_branch: versioned-gh-pages
destination_dir: ./${{ env.VERSION }}
destination_dir: ./${{ steps.get_version.outputs.VERSION }}
keep_files: true
commit_message: "deploy: docs for ${{ env.VERSION }}"
commit_message: "deploy: docs for ${{ steps.get_version.outputs.VERSION }}"
- name: Clean Build Directory
run: rm -rf .hugo/public
@@ -78,6 +86,11 @@ jobs:
env:
HUGO_BASEURL: https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/
HUGO_RELATIVEURLS: false
HUGO_PARAMS_VERSION: ${{ steps.get_version.outputs.VERSION }}
- name: Build Pagefind Index (Root)
run: npx pagefind --site public
working-directory: .hugo
- name: Deploy to root
uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4
@@ -87,4 +100,4 @@ jobs:
publish_branch: versioned-gh-pages
keep_files: true
allow_empty_commit: true
commit_message: "deploy: docs to root for ${{ env.VERSION }}"
commit_message: "deploy: docs to root for ${{ steps.get_version.outputs.VERSION }}"

View File

@@ -0,0 +1,105 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: "CF: Deploy Versioned Docs"
permissions:
contents: write
on:
release:
types: [published]
jobs:
deploy:
runs-on: ubuntu-24.04
# This shared concurrency group ensures only one docs deployment runs at a time.
concurrency:
group: cf-docs-update
cancel-in-progress: false
steps:
- name: Checkout Code at Tag
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
ref: ${{ github.event.release.tag_name }}
- name: Get Version from Release Tag
id: get_version
env:
RELEASE_TAG: ${{ github.event.release.tag_name }}
run: echo "VERSION=${RELEASE_TAG}" >> "$GITHUB_OUTPUT"
- name: Setup Hugo
uses: peaceiris/actions-hugo@75d2e84710de30f6ff7268e08f310b60ef14033f # v3
with:
hugo-version: "0.145.0"
extended: true
- name: Setup Node
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: "22"
- name: Install Dependencies
run: npm ci
working-directory: .hugo
- name: Build Hugo Site
run: |
hugo --minify --config hugo.cloudflare.toml
rm -f public/releases.releases
working-directory: .hugo
env:
HUGO_BASEURL: https://mcp-toolbox.dev/${{ steps.get_version.outputs.VERSION }}/
HUGO_RELATIVEURLS: false
HUGO_PARAMS_VERSION: ${{ steps.get_version.outputs.VERSION }}
- name: Build Pagefind Index (Versioned)
run: npx pagefind --site public
working-directory: .hugo
- name: Deploy
uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: .hugo/public
publish_branch: cloudflare-pages
destination_dir: ./${{ steps.get_version.outputs.VERSION }}
keep_files: true
commit_message: "deploy: docs for ${{ steps.get_version.outputs.VERSION }}"
- name: Clean Build Directory
run: rm -rf .hugo/public
- name: Build Hugo Site
run: hugo --minify --config hugo.cloudflare.toml
working-directory: .hugo
env:
HUGO_BASEURL: https://mcp-toolbox.dev/
HUGO_RELATIVEURLS: false
HUGO_PARAMS_VERSION: ${{ steps.get_version.outputs.VERSION }}
- name: Build Pagefind Index (Root)
run: npx pagefind --site public
working-directory: .hugo
- name: Deploy to root
uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: .hugo/public
publish_branch: cloudflare-pages
keep_files: true
allow_empty_commit: true
commit_message: "deploy: docs to root for ${{ steps.get_version.outputs.VERSION }}"

56
.github/workflows/docs_lint.yaml vendored Normal file
View File

@@ -0,0 +1,56 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: Lint Documentation
permissions:
contents: read
on:
pull_request:
paths:
- 'docs/**'
- '.github/workflows/docs**'
- '.ci/lint-docs-*.sh'
jobs:
lint-source-pages:
name: Lint Documentation
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
with:
python-version: '3.x'
- name: Check for large files (>24MB)
run: |
LARGE_FILES=$(find docs/ -type f -size +24M)
if [ -n "$LARGE_FILES" ]; then
echo "Error: Files exceed 24MB limit: $LARGE_FILES"
exit 1
fi
- name: Make scripts executable
run: chmod +x .ci/lint-docs-*.sh
- name: Run Structure Linter for Source Pages
run: bash .ci/lint-docs-source-page.sh
- name: Run Structure Linter for Tool Pages
run: bash .ci/lint-docs-tool-page.sh

View File

@@ -0,0 +1,95 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: "Build Docs Preview"
on:
pull_request:
paths:
- 'docs/**'
- '.github/workflows/docs**'
- '.hugo/**'
# Read-only token for code execution
permissions: read-all
jobs:
build-preview:
runs-on: ubuntu-24.04
env:
PR_NUMBER: ${{ github.event.number }}
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
concurrency:
group: "preview-${{ github.event.number }}"
cancel-in-progress: true
defaults:
run:
working-directory: .hugo
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
# Checkout the PR's HEAD commit (supports forks).
ref: ${{ env.HEAD_SHA }}
fetch-depth: 0
- name: Setup Hugo
uses: peaceiris/actions-hugo@75d2e84710de30f6ff7268e08f310b60ef14033f # v3
with:
hugo-version: "0.145.0"
extended: true
- name: Setup Node
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: "22"
- name: Cache dependencies
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- run: npm ci --ignore-scripts
- run: hugo --minify
env:
HUGO_BASEURL: https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/previews/PR-${{ env.PR_NUMBER }}/
HUGO_ENVIRONMENT: preview
HUGO_RELATIVEURLS: false
- name: Build Pagefind Search Index
run: npx pagefind --site public
- name: Prepare Artifact Payload
run: |
mkdir -p ../artifact-payload
cp -r public ../artifact-payload/public
echo $PR_NUMBER > ../artifact-payload/pr_number.txt
- name: Upload Artifact
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
with:
name: docs-preview-data
path: artifact-payload/
- name: Deployment Link
run: |
DEPLOY_URL="https://github.com/${{ github.repository_owner }}/${{ github.event.repository.name }}/actions/workflows/docs_preview_deploy.yaml"
echo "### Build Complete" >> $GITHUB_STEP_SUMMARY
echo "The build for PR #${{ env.PR_NUMBER }} succeeded." >> $GITHUB_STEP_SUMMARY
echo "The deployment workflow is now starting in the background." >> $GITHUB_STEP_SUMMARY
echo "---" >> $GITHUB_STEP_SUMMARY
echo "#### [Track Deployment Progress]($DEPLOY_URL)" >> $GITHUB_STEP_SUMMARY

View File

@@ -0,0 +1,89 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: "CF: Build Docs Preview"
on:
pull_request:
paths:
- 'docs/**'
- '.github/workflows/docs*_cf.yaml'
- '.hugo/**'
permissions: read-all
jobs:
build-preview:
runs-on: ubuntu-24.04
env:
PR_NUMBER: ${{ github.event.number }}
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
concurrency:
group: "cf-preview-${{ github.event.number }}"
cancel-in-progress: true
defaults:
run:
working-directory: .hugo
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
ref: ${{ env.HEAD_SHA }}
fetch-depth: 0
- name: Setup Hugo
uses: peaceiris/actions-hugo@75d2e84710de30f6ff7268e08f310b60ef14033f # v3
with:
hugo-version: "0.145.0"
extended: true
- name: Setup Node
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: "22"
cache: 'npm'
cache-dependency-path: '.hugo/package-lock.json'
- run: npm ci --ignore-scripts
- run: hugo --minify --config hugo.cloudflare.toml
env:
HUGO_BASEURL: "/"
HUGO_ENVIRONMENT: preview
HUGO_RELATIVEURLS: false
- name: Build Pagefind Search Index
run: npx pagefind --site public
- name: Prepare Artifact Payload
run: |
mkdir -p ../artifact-payload
cp -r public ../artifact-payload/public
echo ${{ env.PR_NUMBER }} > ../artifact-payload/pr_number.txt
- name: Upload Artifact
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
with:
name: cf-preview-data
path: artifact-payload/
retention-days: 1
- name: Deployment Link
run: |
DEPLOY_URL="https://github.com/${{ github.repository_owner }}/${{ github.event.repository.name }}/actions/workflows/docs_deploy_cf.yaml"
echo "### Build Complete" >> $GITHUB_STEP_SUMMARY
echo "The build for PR #${{ env.PR_NUMBER }} succeeded." >> $GITHUB_STEP_SUMMARY
echo "The Cloudflare deployment workflow is now starting." >> $GITHUB_STEP_SUMMARY
echo "---" >> $GITHUB_STEP_SUMMARY
echo "#### [Track Deployment Progress]($DEPLOY_URL)" >> $GITHUB_STEP_SUMMARY

View File

@@ -34,7 +34,7 @@ jobs:
group: "preview-${{ github.event.number }}"
cancel-in-progress: true
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
ref: versioned-gh-pages

View File

@@ -0,0 +1,73 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: "CF: Cleanup PR Preview"
permissions:
pull-requests: write
# This Workflow depends on 'github.event.number',
# not compatible with branch or manual triggers.
on:
pull_request:
types:
- closed
jobs:
clean:
# Only run for PRs from the same repository to ensure secret access
if: "${{ github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name }}"
runs-on: ubuntu-24.04
concurrency:
# Shared concurrency group with preview staging.
group: "cf-preview-${{ github.event.number }}"
cancel-in-progress: true
steps:
- name: Delete Cloudflare Pages Deployments via API
env:
ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
PROJECT_NAME: toolbox-docs
BRANCH_NAME: pr-${{ github.event.number }}
run: |
echo "Fetching deployments for preview branch: $BRANCH_NAME"
# Fetch the most recent deployments from your Cloudflare project
RESPONSE=$(curl -s -X GET "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/pages/projects/$PROJECT_NAME/deployments" \
-H "Authorization: Bearer $API_TOKEN")
# Use 'jq' to extract all deployment IDs that match this specific PR branch alias
IDS=$(echo "$RESPONSE" | jq -r --arg branch "$BRANCH_NAME" '.result[] | select(.deployment_trigger.metadata.branch? == $branch) | .id')
if [ -z "$IDS" ]; then
echo "No preview deployments found to clean up."
else
for id in $IDS; do
echo "Deleting Cloudflare deployment ID: $id"
curl -s -X DELETE "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/pages/projects/$PROJECT_NAME/deployments/$id?force=true" \
-H "Authorization: Bearer $API_TOKEN"
done
echo "Successfully removed preview environment."
fi
- name: Comment
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
with:
script: |
github.rest.issues.createComment({
issue_number: context.payload.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: "🧨 **Preview deployments removed.**\n\nCloudflare Pages environments for `pr-${{ github.event.number }}` have been deleted."
})

View File

@@ -1,4 +1,4 @@
# Copyright 2025 Google LLC
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -12,91 +12,84 @@
# See the License for the specific language governing permissions and
# limitations under the License.
name: "docs"
name: "Deploy Docs Preview"
on:
workflow_run:
workflows: ["Build Docs Preview"]
types:
- completed
workflow_dispatch:
inputs:
pr_number:
description: 'PR Number to deploy (Manual override)'
required: true
type: string
build_run_id:
description: 'The Run ID from the successful "Build Docs Preview" workflow'
required: true
type: string
permissions:
contents: write
pull-requests: write
# This Workflow depends on 'github.event.number',
# not compatible with branch or manual triggers.
on:
pull_request:
# Sync with github_actions_preview_fallback.yml on.pull_request.paths-ignore
paths:
- 'docs/**'
- 'github/workflows/docs**'
- '.hugo/**'
pull_request_target:
types: [labeled]
paths:
- 'docs/**'
- 'github/workflows/docs**'
- '.hugo/**'
jobs:
preview:
# run job on proper workflow event triggers (skip job for pull_request event
# from forks and only run pull_request_target for "docs: deploy-preview"
# label)
if: "${{ (github.event.action != 'labeled' && github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name) || github.event.label.name == 'docs: deploy-preview' }}"
deploy-preview:
if: >
github.event_name == 'workflow_dispatch' ||
(github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success')
runs-on: ubuntu-24.04
defaults:
run:
working-directory: .hugo
concurrency:
# Shared concurrency group wih preview cleanup.
group: "preview-${{ github.event.number }}"
group: "deploy-${{ github.event.inputs.pr_number || github.event.workflow_run.pull_requests[0].number }}"
cancel-in-progress: true
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
with:
# Checkout the PR's HEAD commit (supports forks).
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
- name: Checkout base repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup Hugo
uses: peaceiris/actions-hugo@75d2e84710de30f6ff7268e08f310b60ef14033f # v3
- name: Download Artifact
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
with:
hugo-version: "0.145.0"
extended: true
name: docs-preview-data
github-token: ${{ secrets.GITHUB_TOKEN }}
run-id: ${{ github.event.inputs.build_run_id || github.event.workflow_run.id }}
path: downloaded-artifact
- name: Setup Node
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6
with:
node-version: "22"
- name: Read PR Number
id: get_pr
run: |
if [ -n "${{ github.event.inputs.pr_number }}" ]; then
PR_NUMBER="${{ github.event.inputs.pr_number }}"
else
PR_NUMBER=$(cat downloaded-artifact/pr_number.txt)
fi
if ! [[ "$PR_NUMBER" =~ ^[0-9]+$ ]]; then
echo "Error: PR number [$PR_NUMBER] is invalid."
exit 1
fi
echo "pr_number=$PR_NUMBER" >> "$GITHUB_OUTPUT"
- name: Cache dependencies
uses: actions/cache@8b402f58fbc84540c8b491a91e594a4576fec3d7 # v5
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- run: npm ci
- run: hugo --minify
env:
HUGO_BASEURL: https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/previews/PR-${{ github.event.number }}/
HUGO_ENVIRONMENT: preview
HUGO_RELATIVEURLS: false
- name: Deploy
uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: .hugo/public
publish_dir: downloaded-artifact/public
publish_branch: versioned-gh-pages
destination_dir: ./previews/PR-${{ github.event.number }}
commit_message: "stage: PR-${{ github.event.number }}: ${{ github.event.head_commit.message }}"
destination_dir: ./previews/PR-${{ steps.get_pr.outputs.pr_number }}
commit_message: "stage: PR-${{ steps.get_pr.outputs.pr_number }} preview"
- name: Comment
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
with:
script: |
github.rest.issues.createComment({
issue_number: context.payload.number,
const prNumber = parseInt('${{ steps.get_pr.outputs.pr_number }}', 10);
await github.rest.issues.createComment({
issue_number: prNumber,
owner: context.repo.owner,
repo: context.repo.repo,
body: "🔎 Preview at https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/previews/PR-${{ github.event.number }}/"
})
body: `🔎 Preview at https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/previews/PR-${prNumber}/`
});

View File

@@ -0,0 +1,110 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: "CF: Deploy Docs Preview"
on:
workflow_run:
workflows: ["CF: Build Docs Preview"]
types:
- completed
workflow_dispatch:
inputs:
pr_number:
description: 'PR Number to deploy (Manual override)'
required: true
type: string
build_run_id:
description: 'The Run ID from the successful "CF: Build Docs Preview" workflow'
required: true
type: string
permissions:
contents: read
pull-requests: write
jobs:
deploy-preview:
if: >
github.event_name == 'workflow_dispatch' ||
(github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success')
runs-on: ubuntu-24.04
concurrency:
group: "cf-deploy-${{ github.event.inputs.pr_number || github.event.workflow_run.pull_requests[0].number }}"
cancel-in-progress: true
steps:
- name: Checkout base repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Download Artifact
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
with:
name: cf-preview-data
github-token: ${{ secrets.GITHUB_TOKEN }}
run-id: ${{ github.event.inputs.build_run_id || github.event.workflow_run.id }}
path: downloaded-artifact
- name: Read PR Number
id: get_pr
run: |
if [ -n "${{ github.event.inputs.pr_number }}" ]; then
PR_NUMBER="${{ github.event.inputs.pr_number }}"
else
PR_NUMBER=$(cat downloaded-artifact/pr_number.txt)
fi
if ! [[ "$PR_NUMBER" =~ ^[0-9]+$ ]]; then
echo "Error: PR number [$PR_NUMBER] is invalid."
exit 1
fi
echo "pr_number=$PR_NUMBER" >> "$GITHUB_OUTPUT"
- name: Deploy to Cloudflare Pages
id: cf_deploy
uses: cloudflare/wrangler-action@da0e0dfe58b7a431659754fdf3f186c529afbe65 # v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: pages deploy downloaded-artifact/public --project-name toolbox-docs --branch pr-${{ steps.get_pr.outputs.pr_number }}
- name: Post Preview URL Comment
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
with:
script: |
const prNumber = parseInt('${{ steps.get_pr.outputs.pr_number }}', 10);
const deployUrl = '${{ steps.cf_deploy.outputs.pages-deployment-alias-url }}';
const marker = '<!-- cf-preview-comment-marker -->';
// Fetch all comments on the PR
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
});
// Look for the invisible HTML marker
const existingComment = comments.find(c => c.body.includes(marker));
// Exit early if we've already posted a comment for this PR to avoid duplicates
if (existingComment) {
console.log("Preview link already posted on this PR. Skipping.");
return;
}
// Create the comment since it's the first deployment for this PR
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
body: `${marker}\n🚀 **Cloudflare Preview Ready!**\n\n🔎 View Preview: ${deployUrl}\n\n*(Note: Subsequent pushes to this PR will automatically update the preview at this same URL)*`
});

104
.github/workflows/link_checker.yaml vendored Normal file
View File

@@ -0,0 +1,104 @@
# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: Link Checker
on:
pull_request:
permissions:
contents: read
jobs:
link-check:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
- name: Identify Changed Files
id: changed-files
shell: bash
run: |
git fetch origin main
CHANGED_FILES=$(git diff --name-only --diff-filter=ACMRT origin/main...HEAD -- '*.md')
if [ -z "$CHANGED_FILES" ]; then
echo "No markdown files changed. Skipping checks."
echo "HAS_CHANGES=false" >> "$GITHUB_OUTPUT"
else
echo "--- Changed Files to Scan ---"
echo "$CHANGED_FILES"
echo "-----------------------------"
FILES_QUOTED=$(echo "$CHANGED_FILES" | sed 's/^/"/;s/$/"/' | tr '\n' ' ')
# Use EOF to write multiline or long strings to GITHUB_OUTPUT
echo "HAS_CHANGES=true" >> "$GITHUB_OUTPUT"
echo "CHECK_FILES<<EOF" >> "$GITHUB_OUTPUT"
echo "$FILES_QUOTED" >> "$GITHUB_OUTPUT"
echo "EOF" >> "$GITHUB_OUTPUT"
fi
- name: Restore lychee cache
if: steps.changed-files.outputs.HAS_CHANGES == 'true'
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5
with:
path: .lycheecache
key: cache-lychee-${{ github.sha }}
restore-keys: cache-lychee-
- name: Link Checker
id: lychee-check
if: steps.changed-files.outputs.HAS_CHANGES == 'true'
uses: lycheeverse/lychee-action@8646ba30535128ac92d33dfc9133794bfdd9b411 # v2
continue-on-error: true
with:
args: >
--quiet
--no-progress
--cache
--max-cache-age 1d
--exclude '^neo4j\+.*' --exclude '^bolt://.*'
--max-retries 10
${{ steps.changed-files.outputs.CHECK_FILES }}
output: lychee-report.md
format: markdown
fail: true
jobSummary: false
debug: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Prepare Report
if: steps.changed-files.outputs.HAS_CHANGES == 'true' && steps.lychee-check.outcome == 'failure'
run: |
echo "## Link Resolution Note" > full-report.md
echo "Local links and directory changes work differently on GitHub than on the docsite. You must ensure fixes pass the **GitHub check** and also work with **\`hugo server\`**." >> full-report.md
echo "See [Link Checking and Fixing with Lychee](https://github.com/googleapis/genai-toolbox/blob/main/DEVELOPER.md#link-checking-and-fixing-with-lychee) for more details." >> full-report.md
echo "" >> full-report.md
sed -E '/(Redirect|Redirects per input)/d' lychee-report.md >> full-report.md
- name: Display Failure Report
# Run this ONLY if the link checker failed
if: steps.lychee-check.outcome == 'failure'
run: |
# We can now simply output the prepared file to the job summary
cat full-report.md >> $GITHUB_STEP_SUMMARY
# Fail the job
exit 1

View File

@@ -0,0 +1,74 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: Link Checks
on:
schedule:
- cron: '0 0 * * 1'
jobs:
linkChecker:
runs-on: ubuntu-latest
permissions:
issues: write
steps:
- name: Checkout Repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
fetch-depth: 0
- name: Link Checker
id: lychee-check
uses: lycheeverse/lychee-action@8646ba30535128ac92d33dfc9133794bfdd9b411 # v2
continue-on-error: true
with:
args: >
--quiet
--no-progress
--exclude '^neo4j\+.*' --exclude '^bolt://.*'
README.md
docs/
output: lychee-report.md
format: markdown
fail: true
jobSummary: false
debug: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Prepare Report
run: |
echo "## Link Resolution Note" > full-report.md
echo "Local links and directory changes work differently on GitHub than on the docsite.You must ensure fixes pass the **GitHub check** and also work with **\`hugo server\`**." >> full-report.md
echo "See [Link Checking and Fixing with Lychee](https://github.com/googleapis/genai-toolbox/blob/main/DEVELOPER.md#link-checking-and-fixing-with-lychee) for more details." >> full-report.md
echo "" >> full-report.md
sed -E '/(Redirect|Redirects per input)/d' lychee-report.md >> full-report.md
- name: Create Issue From File
if: steps.lychee-check.outcome == 'failure'
uses: peter-evans/create-issue-from-file@fca9117c27cdc29c6c4db3b86c48e4115a786710 # v6
with:
title: Link Checker Report
content-filepath: full-report.md
labels: |
priority: p2
type: process
- name: Display Failure Report
# Run this ONLY if the link checker failed
if: steps.lychee-check.outcome == 'failure'
run: |
# We can now simply output the prepared file to the job summary
cat full-report.md >> $GITHUB_STEP_SUMMARY
# Fail the job
exit 1

View File

@@ -1,60 +0,0 @@
# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: Link Checker
on:
pull_request:
jobs:
link-check:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
- name: Restore lychee cache
uses: actions/cache@8b402f58fbc84540c8b491a91e594a4576fec3d7 # v5
with:
path: .lycheecache
key: cache-lychee-${{ github.sha }}
restore-keys: cache-lychee-
- name: Link Checker
uses: lycheeverse/lychee-action@a8c4c7cb88f0c7386610c35eb25108e448569cb0 # v2
with:
args: >
--verbose
--no-progress
--cache
--max-cache-age 1d
--exclude '^neo4j\+.*' --exclude '^bolt://.*'
README.md
docs/
output: /tmp/foo.txt
fail: true
jobSummary: true
debug: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# This step only runs if the 'lychee_check' step fails, ensuring the
# context note only appears when the developer needs to troubleshoot.
- name: Display Link Context Note on Failure
if: ${{ failure() }}
run: |
echo "## Link Resolution Note" >> $GITHUB_STEP_SUMMARY
echo "Local links and directory changes work differently on GitHub than on the docsite." >> $GITHUB_STEP_SUMMARY
echo "You must ensure fixes pass the **GitHub check** and also work with **\`hugo server\`**." >> $GITHUB_STEP_SUMMARY
echo "---" >> $GITHUB_STEP_SUMMARY

View File

@@ -15,15 +15,18 @@
name: lint
on:
pull_request:
pull_request_target:
types: [labeled]
paths:
- "**"
- "!docs/**"
- "!**.md"
- "!.github/**"
- ".github/workflows/lint.yaml"
# Declare default permissions as read only.
permissions: read-all
jobs:
lint:
if: "${{ github.event.action != 'labeled' || github.event.label.name == 'tests: run' }}"
name: lint
runs-on: ubuntu-latest
concurrency:
@@ -31,40 +34,21 @@ jobs:
cancel-in-progress: true
permissions:
contents: 'read'
issues: 'write'
pull-requests: 'write'
steps:
- name: Remove PR Label
if: "${{ github.event.action == 'labeled' && github.event.label.name == 'tests: run' }}"
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
try {
await github.rest.issues.removeLabel({
name: 'tests: run',
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number
});
} catch (e) {
console.log('Failed to remove label. Another job may have already removed it!');
}
- name: Setup Go
uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: "1.25"
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
token: ${{ secrets.GITHUB_TOKEN }}
- name: >
Verify go mod tidy. If you're reading this and the check has
failed, run `goimports -w . && go mod tidy && golangci-lint run`
run: |
go mod tidy && git diff --exit-code
- name: golangci-lint
uses: golangci/golangci-lint-action@1e7e51e771db61008b38414a730f564565cf7c20 # v9.2.0
with:

41
.github/workflows/lint_fallback.yaml vendored Normal file
View File

@@ -0,0 +1,41 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: lint
on:
pull_request:
paths:
- "docs/**"
- "**.md"
- ".github/**"
- "!.github/workflows/lint.yaml"
pull_request_target:
paths:
- "docs/**"
- "**.md"
- ".github/**"
- "!.github/workflows/lint.yaml"
permissions: read-all
jobs:
lint:
name: lint
runs-on: ubuntu-latest
steps:
- name: Skip Lint
run: |
echo "Skipping lint for documentation/config-only changes."
echo "This job exists to satisfy the required status check."

View File

@@ -29,7 +29,7 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Wait for image in Artifact Registry
shell: bash

View File

@@ -17,17 +17,25 @@ on:
push:
branches:
- "main"
paths:
- "**"
- "!docs/**"
- "!**.md"
- "!.github/**"
- ".github/workflows/tests.yaml"
pull_request:
pull_request_target:
types: [labeled]
paths:
- "**"
- "!docs/**"
- "!**.md"
- "!.github/**"
- ".github/workflows/tests.yaml"
# Declare default permissions as read only.
permissions: read-all
jobs:
integration:
# run job on proper workflow event triggers (skip job for pull_request event from forks and only run pull_request_target for "tests: run" label)
if: "${{ (github.event.action != 'labeled' && github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name) || github.event.label.name == 'tests: run' }}"
name: unit tests
runs-on: ${{ matrix.os }}
strategy:
@@ -36,37 +44,14 @@ jobs:
fail-fast: false
permissions:
contents: "read"
issues: "write"
pull-requests: "write"
steps:
- name: Remove PR label
if: "${{ github.event.action == 'labeled' && github.event.label.name == 'tests: run' }}"
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
try {
await github.rest.issues.removeLabel({
name: 'tests: run',
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number
});
} catch (e) {
console.log('Failed to remove label. Another job may have already removed it!');
}
- name: Setup Go
uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with:
go-version: "1.24"
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Setup Go
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
token: ${{ secrets.GITHUB_TOKEN }}
go-version-file: 'go.mod'
- name: Install dependencies
run: go get .

53
.github/workflows/tests_fallback.yaml vendored Normal file
View File

@@ -0,0 +1,53 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: tests
on:
push:
branches:
- "main"
paths:
- "docs/**"
- "**.md"
- ".github/**"
- "!.github/workflows/tests.yaml"
pull_request:
paths:
- "docs/**"
- "**.md"
- ".github/**"
- "!.github/workflows/tests.yaml"
pull_request_target:
types: [labeled]
paths:
- "docs/**"
- "**.md"
- ".github/**"
- "!.github/workflows/tests.yaml"
permissions: read-all
jobs:
integration:
name: unit tests
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [macos-latest, windows-latest, ubuntu-latest]
steps:
- name: Skip Tests
run: |
echo "Skipping unit tests for documentation/config-only changes."
echo "This job exists to satisfy the required status check."

4
.gitignore vendored
View File

@@ -13,11 +13,15 @@ node_modules
# hugo
.hugo/public/
.hugo/resources/_gen
.hugo/static/pagefind/
.hugo_build.lock
# coverage
.coverage
# python
__pycache__/
# executable
genai-toolbox
toolbox

View File

@@ -1,3 +1,16 @@
/* ==========================================================================
PROJECT SCSS HUB
Custom theme overrides and UI components.
========================================================================== */
@import 'components/typography';
@import 'components/layout';
@import 'components/header';
@import 'components/sidebar';
@import 'components/callouts';
@import 'components/secondary_nav';
@import 'components/search';
@import 'td/code-dark';
// Make tabs scrollable horizontally instead of wrapping

View File

@@ -0,0 +1,26 @@
/* ==========================================================================
CALLOUTS & NOTICES
Styling for alerts, tips, and admonition blocks.
========================================================================== */
.td-content .alert code,
.td-content .notice code,
.td-content .admonition code {
background-color: #ffffff !important;
color: rgba(32, 33, 36, 0.95) !important;
padding: 0.2rem 0.4rem !important;
border-radius: 4px !important;
border: 1px solid rgba(0, 0, 0, 0.05) !important;
font-weight: 500 !important;
}
html[data-bs-theme="dark"] .td-content .alert code,
body.dark .td-content .alert code,
html[data-bs-theme="dark"] .td-content .notice code,
body.dark .td-content .notice code,
html[data-bs-theme="dark"] .td-content .admonition code,
body.dark .td-content .admonition code {
background-color: rgba(255, 255, 255, 0.15) !important;
color: #ffffff !important;
border-color: rgba(255, 255, 255, 0.1) !important;
}

View File

@@ -0,0 +1,213 @@
/* ==========================================================================
HEADER & NAVIGATION
Primary navbar, secondary tabbed nav, utilities, and mobile layouts.
========================================================================== */
/* Main Header Structure */
header { position: sticky !important; top: 0; z-index: 1060; width: 100%; background-color: var(--bs-body-bg, #ffffff); transform: translateZ(0); }
header, .td-navbar { z-index: 1060 !important; }
.td-navbar {
position: relative !important; width: 100% !important;
/* Header Utility Buttons */
.navbar-nav {
gap: 0.35rem; align-items: center;
li.td-light-dark-menu > button,
li.nav-item:has(a[href*="github"]) > a,
li.nav-item:has(a[href*="Releases"], .dropdown-toggle):not(.td-light-dark-menu) > a {
background-color: transparent !important; background-image: none !important; border: 1.5px solid transparent !important;
box-shadow: none !important; outline: none !important; color: rgba(255, 255, 255, 0.85) !important;
font-weight: 500 !important; font-size: 0.95rem !important; text-decoration: none !important; white-space: nowrap;
display: flex !important; align-items: center !important; justify-content: center !important;
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1) !important;
i, svg { font-size: 1.15rem !important; fill: rgba(255, 255, 255, 0.85) !important; transition: all 0.2s ease-in-out !important; }
&:hover {
background-color: #ffffff !important; color: $primary !important;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1), 0 0 0 2px rgba(255, 255, 255, 0.2) !important;
transform: translateY(-1px) !important; opacity: 1;
i, svg { fill: $primary !important; opacity: 1; }
}
&:active { transform: translateY(0px) !important; background-color: rgba(255, 255, 255, 0.15) !important; }
}
li.nav-item:has(a[href*="github"]) > a,
li.nav-item:has(a[href*="Releases"], .dropdown-toggle):not(.td-light-dark-menu) > a {
border-radius: 50px !important; padding: 0.35rem 1.1rem !important;
i, svg { margin-right: 0.4rem !important; }
}
li.nav-item:has(a[href*="Releases"], .dropdown-toggle):not(.td-light-dark-menu) > a.dropdown-toggle::after {
display: inline-block !important; margin-left: 0.5rem !important; vertical-align: middle !important;
border-top: 0.4em solid; border-right: 0.4em solid transparent; border-bottom: 0; border-left: 0.4em solid transparent;
transition: transform 0.2s ease;
}
li.nav-item.show > a.dropdown-toggle::after,
a.dropdown-toggle.show::after { transform: rotate(180deg); }
li.td-light-dark-menu > button {
width: 38px !important; height: 38px !important; padding: 0 !important; border-radius: 50% !important;
&::after { display: none !important; }
i, svg { margin: 0 !important; width: 1.15rem !important; height: 1.15rem !important; }
}
}
/* Universal Dropdowns */
.dropdown-menu {
z-index: 1065 !important; margin-top: 0.6rem !important; background-color: #ffffff !important;
border: 1px solid rgba(0, 0, 0, 0.08) !important; border-radius: 12px !important;
box-shadow: 0 12px 34px rgba(0, 0, 0, 0.15) !important; padding: 0.6rem !important;
min-width: 200px !important; max-height: 60vh !important; overflow-y: auto !important;
scrollbar-width: thin; scrollbar-color: rgba(0, 0, 0, 0.2) rgba(0, 0, 0, 0.05);
animation: dropdownFadeIn 0.25s cubic-bezier(0.16, 1, 0.3, 1) forwards !important; transform-origin: top right;
&::-webkit-scrollbar { width: 8px; display: block !important; }
&::-webkit-scrollbar-track { background: rgba(0, 0, 0, 0.05) !important; border-radius: 10px; margin: 5px; }
&::-webkit-scrollbar-thumb {
background: rgba(0, 0, 0, 0.2) !important; border-radius: 10px; border: 2px solid transparent; background-clip: content-box;
&:hover { background: rgba(0, 0, 0, 0.35) !important; background-clip: content-box; }
}
}
.dropdown-item {
border-radius: 8px !important; padding: 0.6rem 1rem !important; color: #495057 !important;
margin-bottom: 4px !important; transition: all 0.2s ease !important; display: flex !important;
align-items: center !important; font-weight: 500 !important;
i, svg { margin-right: 12px !important; width: 16px !important; text-align: center; }
&:hover, &:focus {
background-color: rgba(68, 132, 244, 0.08) !important; color: #4484f4 !important; transform: translateX(4px) !important;
}
&:not(.active-version):not(.active):not(:has(i)):not(:has(svg)) {
opacity: 0.75 !important; font-weight: 400 !important; transition: opacity 0.2s ease !important;
&:hover { opacity: 1 !important; }
}
&.active-version, &.active {
background-color: rgba(68, 132, 244, 0.08) !important; color: #4484f4 !important; font-weight: 600 !important;
position: relative; padding-left: 2rem !important; border-left: 4px solid #4484f4 !important;
&:hover { background-color: rgba(68, 132, 244, 0.12) !important; transform: translateX(4px) !important; }
}
}
}
/* Tabbed Secondary Navbar */
#secondary-nav {
position: fixed; top: 4rem; left: 0; right: 0; height: 52px; z-index: 1055 !important;
background: linear-gradient(rgba(0, 0, 0, 0.08), rgba(0, 0, 0, 0.08)), $primary;
box-shadow: inset 0 4px 12px rgba(0, 0, 0, 0.15); border-bottom: 1px solid rgba(0, 0, 0, 0.1);
display: flex; align-items: center; position: relative !important; top: 0 !important;
width: 100%; max-width: 100vw; box-sizing: border-box;
.container-fluid {
display: flex; align-items: center; width: 100%; height: 100%; overflow-x: auto !important; flex-wrap: nowrap !important;
scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch;
&::-webkit-scrollbar { display: none; }
}
.sec-nav-list {
display: flex; margin: 0; padding: 0 1.5rem; list-style: none; gap: 28px;
align-items: center; height: 100%; width: auto; flex-shrink: 0 !important; flex-wrap: nowrap; overflow: visible !important;
}
.sec-nav-icons { display: flex; gap: 1.5rem; list-style: none; margin: 0 0 0 auto; padding: 0 1.5rem 0 2rem; align-items: center; flex-shrink: 0 !important; }
li { height: 100%; display: flex; align-items: center; }
a {
color: rgba(255, 255, 255, 0.7) !important; font-weight: 500; text-decoration: none;
font-size: 14.5px; letter-spacing: 0.2px; height: 100%; display: flex; align-items: center;
padding: 0 2px; border-bottom: 2px solid transparent; margin-bottom: 0; transition: color 0.15s ease, border-color 0.15s ease; white-space: nowrap;
&:hover { color: #ffffff !important; }
&.active { color: #ffffff !important; font-weight: 600; border-bottom: 2px solid #ffffff; }
}
}
/* Dark Mode Overrides */
html[data-bs-theme="dark"], body.dark {
.td-navbar .navbar-nav {
li.td-light-dark-menu > button,
li.nav-item:has(a[href*="github"]) > a,
li.nav-item:has(a[href*="Releases"], .dropdown-toggle):not(.td-light-dark-menu) > a {
background-color: transparent !important; box-shadow: none !important; color: #e8eaed !important;
i, svg { fill: #e8eaed !important; }
&:hover {
background-color: #303134 !important; color: #f8f9fa !important; border-color: #8ab4f8 !important;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3), 0 0 0 2px rgba(138, 180, 248, 0.15) !important;
i, svg { fill: #f8f9fa !important; }
}
}
}
.td-navbar .dropdown-menu {
background-color: #202124 !important; border-color: rgba(255, 255, 255, 0.12) !important;
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.6) !important; scrollbar-color: rgba(255, 255, 255, 0.2) rgba(255, 255, 255, 0.05);
}
.td-navbar .dropdown-item {
color: #e8eaed !important;
&:hover, &:focus { background-color: rgba(138, 180, 248, 0.12) !important; color: #8ab4f8 !important; }
&.active-version, &.active {
background-color: rgba(138, 180, 248, 0.12) !important; color: #8ab4f8 !important; border-left-color: #8ab4f8 !important;
&::before { color: #8ab4f8; }
&:hover { background-color: rgba(138, 180, 248, 0.18) !important; }
}
}
#secondary-nav {
background: linear-gradient(rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.15)), $primary; box-shadow: inset 0 4px 15px rgba(0, 0, 0, 0.3); border-bottom: 1px solid rgba(255, 255, 255, 0.05);
a { color: rgba(255, 255, 255, 0.7) !important; &:hover { color: #ffffff !important; } &.active { color: #ffffff !important; border-bottom-color: #ffffff; } }
}
}
/* Desktop Adjustments */
@media (min-width: 992px) {
.td-navbar .custom-pagefind-wrapper {
position: relative !important; left: 50% !important; top: 50% !important; transform: translate(-50%, -50%) !important;
width: 100% !important; max-width: 500px !important; margin: 0 !important; z-index: 1060 !important;
transition: opacity 0.15s ease-out, transform 0.15s ease-out, box-shadow 0.15s ease-out !important;
}
.td-navbar .pagefind-ui__drawer { left: 0 !important; right: 0 !important; width: 100% !important; max-width: 100% !important; }
}
/* Mobile Layout & Scaling */
@media (max-width: 991.98px) {
header, .td-navbar { position: relative !important; }
.td-navbar { height: auto !important; padding-bottom: 0.5rem !important; flex-wrap: nowrap !important; justify-content: space-between !important; min-height: 4rem !important; }
header .navbar-toggler { display: inline-flex !important; z-index: 1080 !important; margin-left: auto !important; }
.td-navbar .container-fluid { display: flex !important; flex-wrap: wrap !important; justify-content: space-between !important; align-items: center !important; }
.td-navbar .navbar-nav, .td-navbar .navbar-toggler { flex-direction: row !important; order: 2 !important; width: auto !important; margin-left: auto !important; }
.td-navbar .custom-pagefind-wrapper { display: none !important; }
.td-navbar .dropdown-menu {
background-color: #ffffff !important; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15) !important; border: 1px solid rgba(0, 0, 0, 0.08) !important;
min-width: 180px !important; padding: 0.5rem !important; position: absolute !important; z-index: 1065 !important;
}
.td-navbar .navbar-nav .dropdown-menu { right: 0 !important; left: auto !important; margin-top: 0.5rem !important; }
.td-navbar .dropdown-item { padding: 0.6rem 1rem !important; font-size: 0.95rem !important; }
#secondary-nav { position: relative !important; top: 0 !important; margin-top: 0 !important; height: auto !important; min-height: 52px; padding: 10px 0 !important; z-index: 1050 !important; clear: both !important; }
#secondary-nav .container-fluid { padding: 0 15px !important; }
#secondary-nav .sec-nav-list { padding: 0 !important; gap: 12px !important; }
#secondary-nav .sec-nav-icons { margin-left: 20px !important; padding: 0 !important; }
#secondary-nav li { height: auto !important; }
#secondary-nav a { height: 34px !important; padding: 0 12px !important; background: rgba(0, 0, 0, 0.1); border-radius: 20px; border-bottom: none !important; }
#secondary-nav a.active { background: #ffffff !important; color: $primary !important; }
}
@media (max-width: 767.98px) {
.td-navbar .navbar-nav { gap: 0.25rem !important; }
.td-navbar .navbar-nav li.nav-item:has(a[href*="github"], a[href*="Releases"]) span { display: none !important; }
.td-navbar .navbar-nav li.nav-item:has(a[href*="github"]) > a,
.td-navbar .navbar-nav li.nav-item:has(a[href*="Releases"], .dropdown-toggle):not(.td-light-dark-menu) > a { padding: 0.25rem 0.6rem !important; font-size: 0.85rem !important; }
.td-navbar .navbar-nav li.nav-item:has(a[href*="github"]) > a i,
.td-navbar .navbar-nav li.nav-item:has(a[href*="github"]) > a svg,
.td-navbar .navbar-nav li.nav-item:has(a[href*="Releases"], .dropdown-toggle):not(.td-light-dark-menu) > a i,
.td-navbar .navbar-nav li.nav-item:has(a[href*="Releases"], .dropdown-toggle):not(.td-light-dark-menu) > a svg { font-size: 1rem !important; margin-right: 0 !important; }
.td-navbar .navbar-nav a.dropdown-toggle::after { display: none !important; }
.td-navbar .navbar-nav li.td-light-dark-menu > button { width: 32px !important; height: 32px !important; }
.td-navbar .navbar-nav li.td-light-dark-menu > button i,
.td-navbar .navbar-nav li.td-light-dark-menu > button svg { width: 1rem !important; height: 1rem !important; }
#secondary-nav a { font-size: 13px !important; padding: 0 10px !important; height: 30px !important; }
#secondary-nav .sec-nav-list { gap: 8px !important; }
}

View File

@@ -0,0 +1,27 @@
/* ==========================================================================
LAYOUT ALIGNMENT & STACKING CONTEXTS
Manages global spacing and z-index hierarchy.
========================================================================== */
/*Global Reset */
body {
padding-top: 0 !important;
}
/* Zero-Spacing Elements */
.td-main, .td-outer, .td-sidebar {
margin-top: 0 !important;
padding-top: 0 !important;
}
/* =Elements Requiring Top Padding */
main[role="main"], #td-section-nav, .td-sidebar-toc {
margin-top: 0 !important;
padding-top: 1.5rem !important;
}
/* Z-Index Hierarchy */
.td-main, .td-content, .td-sidebar-toc, .td-page-meta, .td-toc {
position: relative;
z-index: 10 !important;
}

View File

@@ -0,0 +1,245 @@
/* ==========================================================================
PAGEFIND SEARCH STYLES & MODAL
========================================================================== */
:root {
--pagefind-ui-scale: 0.9;
--pagefind-ui-primary: #0d6efd;
}
@keyframes simpleSlideDown {
from { opacity: 0; transform: translateY(-10px); }
to { opacity: 1; transform: translateY(0); }
}
/* Base Modal Backdrop & Body State */
#global-search-backdrop {
position: fixed; top: 0; left: 0; width: 100vw; height: 100vh;
background-color: rgba(0, 0, 0, 0.7);
backdrop-filter: blur(3px); -webkit-backdrop-filter: blur(3px);
z-index: 2147483646 !important; /* Max value minus 1 */
opacity: 0; pointer-events: none; transition: none;
transition: opacity 0.1s ease-in-out;
&.active { opacity: 1; pointer-events: auto; }
}
body.global-search-active {
/* Explicitly target Docsy's layout structure to avoid blurring injected modals */
header, main, footer, .td-main, .td-outer, .td-sidebar, .td-sidebar-toc {
filter: blur(6px) !important;
opacity: 0.4 !important;
pointer-events: none !important;
transition: none !important;
}
}
/* Main Component Scoping */
body {
.custom-pagefind-wrapper {
position: relative;
z-index: 9999 !important;
/* Modal Pop-out State */
&.active-modal {
position: fixed !important;
top: 12vh !important;
left: 50% !important;
transform: translateX(-50%) !important;
width: 90vw !important;
max-width: 650px !important;
z-index: 2147483647 !important; /* Absolute max value possible */
margin: 0 !important;
padding: 0 !important;
.pagefind-ui__drawer {
position: absolute !important;
top: 100% !important;
left: 0 !important;
right: 0 !important;
width: 100% !important;
max-width: 100% !important;
max-height: 70vh !important;
z-index: 999999 !important;
animation: simpleSlideDown 0.2s ease-out forwards !important;
overflow-y: auto !important;
overscroll-behavior: contain !important;
scrollbar-width: thin;
scrollbar-color: rgba(0, 0, 0, 0.2) transparent;
box-shadow: none !important;
&::-webkit-scrollbar { width: 6px; }
&::-webkit-scrollbar-track { background: transparent; }
&::-webkit-scrollbar-thumb { background: rgba(0, 0, 0, 0.2); border-radius: 10px; }
}
}
}
/* Pagefind Internal Element Overrides */
.pagefind-ui__form {
--pagefind-ui-text: #ffffff !important;
position: relative !important;
box-sizing: border-box !important;
&:focus-within { --pagefind-ui-text: #4484f4 !important; }
&::before {
top: 50% !important; transform: translateY(-50%) !important; margin-top: 0 !important;
width: 18px !important; height: 18px !important; left: 14px !important;
}
}
.pagefind-ui__search-input {
background-color: rgba(0, 0, 0, 0.1) !important;
border: 1.5px solid transparent !important;
box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.15) !important;
color: #ffffff !important; border-radius: 50px !important; font-weight: 400 !important;
transition: all 0.2s ease-in-out !important; height: 38px !important; font-size: 0.95rem !important;
padding-left: 40px !important; padding-right: 36px !important; box-sizing: border-box !important;
&::placeholder { color: #ffffff !important; opacity: 0.9 !important; }
&:focus {
background-color: #ffffff !important; border-color: #4484f4 !important; color: #212529 !important; outline: 0 !important;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1), 0 0 0 4px rgba(68, 132, 244, 0.15) !important;
&::placeholder { color: #6c757d !important; opacity: 1 !important; }
}
}
.pagefind-ui__search-clear {
position: absolute !important; top: 50% !important; transform: translateY(-50%) !important; right: 12px !important;
width: 24px !important; height: 24px !important; min-height: 24px !important; padding: 0 !important; margin: 0 !important;
background: transparent !important; border: none !important; outline: none !important; box-shadow: none !important;
font-size: 0 !important; color: transparent !important; display: flex !important; align-items: center !important;
justify-content: center !important; overflow: hidden !important; cursor: pointer !important; z-index: 99 !important;
&::after {
content: "\00d7" !important; font-size: 22px !important; font-weight: 300 !important;
line-height: 1 !important; color: var(--pagefind-ui-text) !important; display: block !important;
}
}
.pagefind-ui__drawer {
position: absolute !important; top: 100% !important; width: 500px !important;
max-width: calc(100vw - 2rem) !important; margin-top: 12px !important; z-index: 99999 !important;
background-color: #ffffff !important; border: 1px solid #dee2e6 !important; border-radius: 12px !important;
padding: 1.5rem !important;
max-height: 80vh !important; overflow-y: auto !important; overscroll-behavior: contain !important;
box-sizing: border-box !important;
overflow-y: auto !important;
overflow-x: hidden !important;
overflow-wrap: break-word !important;
word-wrap: break-word !important;
word-break: break-word !important;
white-space: normal !important;
mark {
background-color: rgba(68, 132, 244, 0.15) !important; color: #1a73e8 !important; padding: 0 3px !important;
border-radius: 3px !important; font-weight: 600 !important; box-shadow: none !important;
}
}
.pagefind-ui__result-title, .pagefind-ui__result-excerpt, .pagefind-ui__message {
color: #212529 !important;
}
.pagefind-ui__button { margin-top: 1rem !important; }
.pagefind-ui__hidden { display: none !important; }
}
/* =======================================================
RESPONSIVE LAYOUTS
======================================================= */
body {
// DESKTOP SEARCH BAR
@media (min-width: 992px) {
.td-navbar .custom-pagefind-wrapper:not(.active-modal) {
position: absolute !important;
left: 50% !important;
top: 50% !important;
transform: translate(-50%, -50%) !important;
width: 100% !important;
max-width: 500px !important;
margin: 0 !important;
z-index: 1060 !important;
}
.td-navbar .pagefind-ui__drawer { left: 0 !important; right: 0 !important; width: 100% !important; max-width: 100% !important; }
.td-sidebar .td-search, .td-sidebar .custom-pagefind-wrapper { display: none !important; }
}
// MOBILE NATIVE STACK
@media (max-width: 991.98px) {
.td-navbar .custom-pagefind-wrapper, .td-navbar .container-fluid > div.d-none.d-lg-block { display: none !important; }
.td-sidebar .td-search, .td-sidebar .custom-pagefind-wrapper:not(.active-modal) {
display: block !important; width: 100% !important; max-width: 100% !important; margin-top: 1rem !important; margin-bottom: 1rem !important;
}
}
// LEFT SIDEBAR TOGGLE ALIGNMENT & MOBILE MODAL RESIZING
@media (max-width: 767.98px) {
.td-sidebar__search {
display: flex !important; flex-direction: row !important; align-items: center !important; justify-content: space-between !important;
width: 100% !important; margin-top: 60px !important; margin-bottom: 1rem !important; padding: 0 15px !important; z-index: 10 !important;
.custom-pagefind-wrapper:not(.active-modal) { width: 75% !important; flex: 0 0 75% !important; margin: 0 !important; }
}
.custom-pagefind-wrapper.active-modal {
top: 15px !important;
width: calc(100vw - 30px) !important;
.pagefind-ui__drawer {
max-height: calc(100dvh - 100px) !important;
}
}
.td-sidebar__toggle {
display: flex !important; align-items: center !important; justify-content: flex-end !important; width: 20% !important;
height: auto !important; background-color: transparent !important; border: none !important; box-shadow: none !important;
color: inherit !important; font-size: 1rem !important; padding: 0 !important;
&::after { content: none !important; }
}
}
}
/* =======================================================
DARK MODE STYLING
======================================================= */
html[data-bs-theme="dark"], body.td-dark {
#global-search-backdrop { background-color: rgba(0, 0, 0, 0.8); }
.pagefind-ui__form { --pagefind-ui-text: #ffffff !important; &:focus-within { --pagefind-ui-text: #8ab4f8 !important; } }
.pagefind-ui__search-input {
background-color: rgba(0, 0, 0, 0.2) !important; border-color: transparent !important;
box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.3) !important; color: #ffffff !important;
&::placeholder { color: #ffffff !important; opacity: 0.9 !important; }
&:focus {
background-color: #303134 !important; border-color: #8ab4f8 !important; color: #f8f9fa !important;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3), 0 0 0 4px rgba(138, 180, 248, 0.15) !important;
&::placeholder { color: #e8eaed !important; opacity: 1 !important; }
}
}
.pagefind-ui__drawer {
background-color: #202124 !important; border-color: #3c4043 !important;
box-shadow: none !important;
mark { background-color: rgba(138, 180, 248, 0.2) !important; color: #8ab4f8 !important; }
}
.pagefind-ui__result-title, .pagefind-ui__result-excerpt, .pagefind-ui__message { color: #e8eaed !important; }
.pagefind-ui__button { color: #e8eaed !important; border-color: #5f6368 !important; background-color: #303134 !important; }
// Mobile sidebar toggle dark mode
@media (max-width: 767.98px) {
.td-sidebar__toggle { color: #e8eaed !important; background-color: transparent !important; border: none !important; &:hover { background-color: transparent !important; opacity: 0.8 !important; } }
}
}

View File

@@ -0,0 +1,43 @@
/* ==========================================================================
Secondary Navigation Header Styles
========================================================================== */
/* Base Layout */
.sec-nav-container { display: flex; align-items: center; height: 100%; width: 100%; overflow-x: auto; scrollbar-width: none; -ms-overflow-style: none; }
.sec-nav-container::-webkit-scrollbar { display: none; }
.sec-nav-list { display: flex; align-items: center; list-style: none; padding: 0; margin: 0; gap: 1.25rem; flex-shrink: 0; }
.sec-nav-icons { display: flex; gap: 1.5rem; list-style: none; margin: 0 0 0 auto; padding: 0 1rem 0 2rem; align-items: center; flex-shrink: 0; }
/* Typography & Links */
.sec-nav-item-left { display: flex; align-items: center; gap: 0.4rem; font-size: 0.95rem; font-weight: 500; color: rgba(255, 255, 255, 0.75) !important; text-decoration: none; transition: all 0.2s; white-space: nowrap; height: 100%; border-bottom: 2px solid transparent; padding-bottom: 2px; }
.sec-nav-item-right { display: flex; align-items: center; gap: 0.5rem; font-size: 0.95rem; font-weight: 700; color: rgba(255, 255, 255, 0.85) !important; text-decoration: none; transition: all 0.2s; white-space: nowrap; }
/* Active States */
.sec-nav-list a:hover, .sec-nav-list a.active { color: #ffffff !important; opacity: 1; }
.sec-nav-list a.active { font-weight: 600; border-bottom: 2px solid #ffffff !important; }
.sec-nav-icons a:hover { color: #ffffff !important; opacity: 1; }
/* Icons */
.pop-icon { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border-radius: 8px; font-size: 1rem; transition: opacity 0.2s ease; }
.pop-icon.fa-discord { background: #5865F2 !important; color: #ffffff !important; box-shadow: 0 4px 10px rgba(88, 101, 242, 0.35) !important; }
.pop-icon.fa-medium { background: #000000 !important; color: #ffffff !important; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.25) !important; }
.sec-nav-icons a:hover .pop-icon { opacity: 0.85 !important; }
/* Dark Mode Overrides */
html[data-bs-theme="dark"] .sec-nav-item-left { color: rgba(255, 255, 255, 0.75) !important; }
html[data-bs-theme="dark"] .sec-nav-item-right { color: rgba(255, 255, 255, 0.85) !important; }
html[data-bs-theme="dark"] .sec-nav-list a.active { color: #ffffff !important; background-color: transparent !important; border-bottom: 2px solid #ffffff !important; font-weight: 600 !important; }
html[data-bs-theme="dark"] .pop-icon.fa-discord { background: #5865F2 !important; color: #ffffff !important; box-shadow: 0 4px 10px rgba(88, 101, 242, 0.35) !important; }
html[data-bs-theme="dark"] .pop-icon.fa-medium { background: #f8f9fa !important; color: #202124 !important; box-shadow: 0 4px 10px rgba(255, 255, 255, 0.15) !important; }
html[data-bs-theme="dark"] .dropdown-item.active-version { color: #8ab4f8 !important; background-color: rgba(138, 180, 248, 0.15) !important; border-left-color: #8ab4f8 !important; }
/* Responsive Layout */
@media (max-width: 991.98px) {
.sec-nav-icons { margin-left: 0; padding-left: 1rem; }
.sec-nav-list { gap: 1rem; }
.sec-nav-item-left, .sec-nav-item-right { font-size: 0.9rem; }
html[data-bs-theme="dark"] #secondary-nav .sec-nav-list a.active,
body.dark #secondary-nav .sec-nav-list a.active {
color: #4484f4 !important; background-color: #ffffff !important; border-bottom: none !important;
}
}

View File

@@ -0,0 +1,164 @@
/* ==========================================================================
SIDEBARS (LEFT NAVIGATION & RIGHT TOC)
Handles positioning, tree navigation, and page metadata.
========================================================================== */
/* =================================================================
LAYOUT & SCROLLING
================================================================= */
@media (min-width: 768px) {
.td-sidebar, .td-sidebar-toc {
position: sticky !important;
top: calc(4rem + 52px) !important;
height: calc(100vh - 4rem - 52px) !important;
overflow-y: auto !important;
padding-bottom: 2rem !important;
scrollbar-width: none; -ms-overflow-style: none;
&::-webkit-scrollbar { display: none; }
}
.td-sidebar-toc .td-toc, .td-sidebar-toc .td-page-meta {
position: static !important; top: auto !important;
height: auto !important; overflow-y: visible !important;
}
}
/* =================================================================
LEFT SIDEBAR NAVIGATION
================================================================= */
.td-sidebar__search {
display: none !important; padding: 0 !important; margin: 0 !important;
height: 0 !important; border: none !important;
}
.td-sidebar-nav, #td-section-nav { margin-top: 1.5rem !important; padding-top: 0 !important; }
#td-section-nav {
.ul-1 > li:not(.active-path), > .ul-0 > li > a.tree-root { display: none !important; }
> .ul-0 > li > ul.ul-1 { margin-top: 0 !important; padding-top: 0 !important; padding-left: 0 !important; margin-left: -1rem !important; }
.ul-1 > li.active-path {
> a, > label, > input { display: none !important; }
> ul { padding-left: 0 !important; margin-top: 0 !important; margin-left: -1rem !important; }
> ul > li > a, > ul > li > label > a { padding-left: 0 !important; }
}
}
.td-sidebar .form-control {
font-family: var(--bs-font-sans-serif) !important; border: 1px solid transparent;
background-color: #f1f3f4; border-radius: 8px; padding: 0.5rem 1rem;
transition: all 0.2s ease; font-size: 0.9rem;
&:focus { background-color: #ffffff; border-color: #4484f4; box-shadow: 0 0 0 3px rgba(68, 132, 244, 0.2); }
}
.td-sidebar-nav {
li > label, li > a {
font-family: var(--bs-font-sans-serif) !important; font-size: 0.95rem !important; font-weight: 400 !important;
display: flex !important; align-items: center; justify-content: space-between; width: 100%;
padding: 0.45rem 0.75rem !important; margin-bottom: 2px; border-radius: 6px; color: #5f6368 !important;
transition: all 0.15s ease-in-out; cursor: pointer;
&:hover { background-color: #f1f3f4; color: #202124 !important; text-decoration: none; }
&.active { color: #4484f4 !important; background-color: transparent !important; font-weight: 600 !important; }
}
li.active-path > label, li.active-path > a:not(.active) {
color: #4484f4 !important; background-color: transparent !important; font-weight: 600 !important;
}
li > label > a { padding: 0 !important; margin: 0 !important; color: inherit !important; flex-grow: 1; }
.with-child > label::after { margin-left: 0.5rem; }
}
/* Left Sidebar Dark Mode */
html[data-bs-theme="dark"], body.dark {
.td-sidebar-nav li > label, .td-sidebar-nav li > a {
color: #9aa0a6 !important;
&:hover { background-color: rgba(255, 255, 255, 0.05); color: #e8eaed !important; }
&.active { color: #8ab4f8 !important; }
}
.td-sidebar-nav li.active-path > label, .td-sidebar-nav li.active-path > a:not(.active) { color: #8ab4f8 !important; }
.td-sidebar .form-control {
background-color: #303134; color: #e8eaed;
&:focus { background-color: #202124; border-color: #8ab4f8; box-shadow: 0 0 0 3px rgba(138, 180, 248, 0.2); }
}
}
/* =================================================================
INTEGRATIONS SIDEBAR LOCKS (Tools & Samples Roots Only)
================================================================= */
/* LOCK ALL sections inside the integrations directory */
a.td-sidebar-link__section[href*="/integrations/"] {
pointer-events: none !important;
cursor: default !important;
}
/* UNLOCK the top-level "/integrations/" root folder itself so it can be toggled */
a.td-sidebar-link__section[href$="/integrations/"] {
pointer-events: auto !important;
cursor: pointer !important;
}
/* UNLOCK any nested sub-folders inside tools or samples (if they exist) */
a.td-sidebar-link__section[href*="/integrations/"][href*="/tools/"],
a.td-sidebar-link__section[href*="/integrations/"][href*="/samples/"] {
pointer-events: auto !important;
cursor: pointer !important;
}
/* RE-LOCK exactly the "tools/" and "samples/" parent folders */
a.td-sidebar-link__section[href*="/integrations/"][href$="/tools/"],
a.td-sidebar-link__section[href*="/integrations/"][href$="/samples/"] {
pointer-events: none !important;
cursor: default !important;
}
/* =================================================================
RIGHT SIDEBAR (TABLE OF CONTENTS)
================================================================= */
.td-sidebar-toc, .td-page-meta {
&, a, li, span, #TableOfContents {
font-family: var(--bs-font-sans-serif) !important; font-weight: 400 !important; letter-spacing: -0.01em;
}
a {
font-size: 0.95rem !important; color: #5f6368 !important; text-decoration: none !important;
display: flex !important; align-items: center; padding: 0.45rem 0.75rem !important;
margin-bottom: 2px; border-radius: 6px; transition: all 0.15s ease-in-out;
i, svg { color: inherit !important; fill: currentColor !important; margin-right: 8px; }
&:hover { background-color: #f1f3f4; color: #202124 !important; }
&.active { color: #4484f4 !important; background-color: transparent !important; font-weight: 600 !important; }
}
}
.td-sidebar-toc #TableOfContents {
li a.active { font-weight: 600 !important; }
ul { padding-left: 0; list-style: none; margin: 0; }
ul ul { padding-left: 1rem; margin-left: 0.75rem; border-left: 1px solid rgba(0,0,0,0.05); }
}
.td-page-meta {
margin-bottom: 1.5rem !important; padding-bottom: 1rem; border-bottom: 1px solid rgba(0,0,0,0.05);
}
/* Right Sidebar Dark Mode */
html[data-bs-theme="dark"], body.dark {
.td-sidebar-toc a, .td-page-meta a {
color: #9aa0a6 !important;
&:hover { background-color: rgba(255, 255, 255, 0.05); color: #e8eaed !important; }
&.active { color: #8ab4f8 !important; }
}
.td-page-meta { border-bottom-color: rgba(255,255,255,0.1); }
.td-sidebar-toc #TableOfContents ul ul { border-left-color: rgba(255,255,255,0.1); }
}
/* =================================================================
HIDe ELEMENTS (Tags & Meta)
================================================================= */
.td-toc, .td-page-meta {
.taxonomy, .td-tags, [class*="taxonomy"], h5.taxonomy-tree-header, ul.taxonomy-terms {
display: none !important;
}
}

View File

@@ -0,0 +1,37 @@
/* ==========================================================================
GLOBAL TYPOGRAPHY & SCALING
Defines core fonts, root variables, and base element typography.
========================================================================== */
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&family=Readex+Pro:wght@400;500;600;700&display=swap');
html {
font-size: 16px !important;
scroll-behavior: smooth;
}
:root {
--bs-font-sans-serif: 'Readex Pro', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif !important;
--bs-body-font-family: var(--bs-font-sans-serif) !important;
--bs-font-monospace: 'JetBrains Mono', SFMono-Regular, Menlo, Monaco, Consolas, monospace !important;
--header-offset: 50px;
}
body {
font-family: var(--bs-font-sans-serif) !important;
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
.td-main, .td-sidebar, .navbar, .td-content {
font-family: var(--bs-font-sans-serif) !important;
}
code, pre, kbd, samp {
font-family: var(--bs-font-monospace) !important;
font-size: 0.9em;
}
h1[id], h2[id], h3[id], h4[id], h5[id], h6[id] {
scroll-margin-top: calc(var(--header-offset) + 10px) !important;
}

176
.hugo/hugo.cloudflare.toml Normal file
View File

@@ -0,0 +1,176 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
title = 'MCP Toolbox for Databases'
relativeURLs = false
languageCode = 'en-us'
defaultContentLanguage = "en"
defaultContentLanguageInSubdir = false
enableGitInfo = true
enableRobotsTXT = true
ignoreFiles = ["quickstart/shared", "quickstart/python", "quickstart/js", "quickstart/go"]
[languages]
[languages.en]
languageName ="English"
weight = 1
[module]
proxy = "direct"
[module.hugoVersion]
extended = true
min = "0.146.0"
[[module.mounts]]
source = "../docs/en"
target = 'content'
[[module.imports]]
path = "github.com/google/docsy"
disable = false
[[module.imports]]
path = "github.com/martignoni/hugo-notice"
[params]
description = "MCP Toolbox for Databases is an open source MCP server for databases. It enables you to develop tools easier, faster, and more securely by handling the complexities such as connection pooling, authentication, and more."
copyright = "Google LLC"
github_repo = "https://github.com/googleapis/genai-toolbox"
github_project_repo = "https://github.com/googleapis/genai-toolbox"
github_subdir = "docs"
offlineSearch = false
version_menu = "Releases"
disableMigrationBanner = true
releases_url = "/releases.releases"
global_logo_url = "/"
pagefind = true
version = "dev"
[params.ui]
ul_show = 100
showLightDarkModeMenu = true
breadcrumb_disable = false
sidebar_menu_foldable = true
sidebar_menu_compact = false
[params.ui.feedback]
enable = true
yes = 'Glad to hear it! Please <a href="https://github.com/googleapis/genai-toolbox/issues/new">tell us how we can improve</a>.'
no = 'Sorry to hear that. Please <a href="https://github.com/googleapis/genai-toolbox/issues/new">tell us how we can improve</a>.'
[params.ui.readingtime]
enable = true
[[params.versions]]
version = "dev"
url = "https://mcp-toolbox.dev/dev/"
# Add a new version block here before every release
# The order of versions in this file is mirrored into the dropdown
[[params.versions]]
version = "v0.31.0"
url = "https://mcp-toolbox.dev/v0.31.0/"
[[params.versions]]
version = "v0.30.0"
url = "https://mcp-toolbox.dev/v0.30.0/"
[[params.versions]]
version = "v0.29.0"
url = "https://mcp-toolbox.dev/v0.29.0/"
[[params.versions]]
version = "v0.28.0"
url = "https://mcp-toolbox.dev/v0.28.0/"
[[params.versions]]
version = "v0.27.0"
url = "https://mcp-toolbox.dev/v0.27.0/"
[[params.versions]]
version = "v0.26.0"
url = "https://mcp-toolbox.dev/v0.26.0/"
[[params.versions]]
version = "v0.25.0"
url = "https://mcp-toolbox.dev/v0.25.0/"
[[params.versions]]
version = "v0.24.0"
url = "https://mcp-toolbox.dev/v0.24.0/"
[[params.versions]]
version = "v0.23.0"
url = "https://mcp-toolbox.dev/v0.23.0/"
[[params.versions]]
version = "v0.22.0"
url = "https://mcp-toolbox.dev/v0.22.0/"
[[params.versions]]
version = "v0.21.0"
url = "https://mcp-toolbox.dev/v0.21.0/"
[[params.versions]]
version = "v0.20.0"
url = "https://mcp-toolbox.dev/v0.20.0/"
[[params.versions]]
version = "v0.19.1"
url = "https://mcp-toolbox.dev/v0.19.1/"
[[params.versions]]
version = "v0.18.0"
url = "https://mcp-toolbox.dev/v0.18.0/"
[[params.versions]]
version = "v0.17.0"
url = "https://mcp-toolbox.dev/v0.17.0/"
[[menu.main]]
name = "GitHub"
weight = 50
url = "https://github.com/googleapis/genai-toolbox"
pre = "<i class='fa-brands fa-github'></i>"
[markup.goldmark.renderer]
unsafe= true
[markup.highlight]
noClasses = false
style = "tango"
[outputFormats]
[outputFormats.LLMS]
mediaType = "text/plain"
baseName = "llms"
isPlainText = true
root = true
[outputFormats.LLMS-FULL]
mediaType = "text/plain"
baseName = "llms-full"
isPlainText = true
root = true
[outputFormats.releases]
baseName = 'releases'
isPlainText = true
mediaType = 'text/releases'
[mediaTypes."text/releases"]
suffixes = ["releases"]
[outputs]
home = ["HTML", "RSS", "LLMS", "LLMS-FULL", "releases"]
[services]
[services.googleAnalytics]
id = "G-GLSV9KD8BF"

View File

@@ -35,22 +35,52 @@ ignoreFiles = ["quickstart/shared", "quickstart/python", "quickstart/js", "quick
github_repo = "https://github.com/googleapis/genai-toolbox"
github_project_repo = "https://github.com/googleapis/genai-toolbox"
github_subdir = "docs"
offlineSearch = true
offlineSearch = false
version_menu = "Releases"
releases_url = "/genai-toolbox/releases.releases"
global_logo_url = "/genai-toolbox/"
version = "dev"
pagefind = true
[params.ui]
ul_show = 100
showLightDarkModeMenu = true
breadcrumb_disable = true
breadcrumb_disable = false
sidebar_menu_foldable = true
sidebar_menu_compact = false
[params.ui.feedback]
enable = true
yes = 'Glad to hear it! Please <a href="https://github.com/googleapis/genai-toolbox/issues/new">tell us how we can improve</a>.'
no = 'Sorry to hear that. Please <a href="https://github.com/googleapis/genai-toolbox/issues/new">tell us how we can improve</a>.'
[params.ui.readingtime]
enable = true
[[params.versions]]
version = "Dev"
version = "dev"
url = "https://googleapis.github.io/genai-toolbox/dev/"
# Add a new version block here before every release
# The order of versions in this file is mirrored into the dropdown
[[params.versions]]
version = "v0.31.0"
url = "https://googleapis.github.io/genai-toolbox/v0.31.0/"
[[params.versions]]
version = "v0.30.0"
url = "https://googleapis.github.io/genai-toolbox/v0.30.0/"
[[params.versions]]
version = "v0.29.0"
url = "https://googleapis.github.io/genai-toolbox/v0.29.0/"
[[params.versions]]
version = "v0.28.0"
url = "https://googleapis.github.io/genai-toolbox/v0.28.0/"
[[params.versions]]
version = "v0.27.0"
url = "https://googleapis.github.io/genai-toolbox/v0.27.0/"
[[params.versions]]
version = "v0.26.0"
url = "https://googleapis.github.io/genai-toolbox/v0.26.0/"
@@ -162,3 +192,8 @@ ignoreFiles = ["quickstart/shared", "quickstart/python", "quickstart/js", "quick
[outputs]
home = ["HTML", "RSS", "LLMS", "LLMS-FULL", "releases"]
# Google Analytics ID
[services]
[services.googleAnalytics]
id = "G-GLSV9KD8BF"

View File

@@ -1,3 +1,5 @@
<a class="dropdown-item" href="{{ .Site.Params.global_logo_url | default `/` }}">latest</a>
{{ if .Site.Params.versions -}}
{{ $path := "" -}}
{{ if .Site.Params.version_menu_pagelinks -}}

View File

@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<title>{{ .Title }}</title>
<link rel="canonical" href="{{ .Params.external_url }}"/>
<meta http-equiv="refresh" content="0;url={{ .Params.external_url }}"/>
</head>
<body>
<p>Redirecting you to <a href="{{ .Params.external_url }}">{{ .Params.external_url }}</a>...</p>
</body>
</html>

View File

@@ -0,0 +1,26 @@
{{ define "main" }}
<div class="td-content">
<h1>{{ .Title }}</h1>
{{ with .Params.description }}<div class="lead">{{ . | markdownify }}</div>{{ end }}
<header class="article-meta">
{{ partial "taxonomy_terms_article_wrapper.html" . }}
{{ if (and (not .Params.hide_readingtime) (.Site.Params.ui.readingtime.enable)) }}
{{ partial "reading-time.html" . }}
{{ end }}
</header>
{{ .Content }}
{{ partial "section-index.html" . }}
{{ partial "pager.html" . }}
{{ if (and (not .Params.hide_feedback) (.Site.Params.ui.feedback.enable) (.Site.Config.Services.GoogleAnalytics.ID)) }}
<hr class="mt-5 mb-4">
<div class="mt-4">
{{ partial "feedback.html" . }}
<br />
{{ end }}
{{ if (.Site.Params.DisqusShortname) }}
<br />
{{ partial "disqus-comment.html" . }}
{{ end }}
{{ partial "page-meta-lastmod.html" . }}
</div>
{{ end }}

View File

@@ -0,0 +1,26 @@
{{ define "main" }}
<div class="td-content">
<h1>{{ .Title }}</h1>
{{ with .Params.description }}<div class="lead">{{ . | markdownify }}</div>{{ end }}
<header class="article-meta">
{{ partial "taxonomy_terms_article_wrapper.html" . }}
{{ if (and (not .Params.hide_readingtime) (.Site.Params.ui.readingtime.enable)) }}
{{ partial "reading-time.html" . }}
{{ end }}
</header>
{{ .Content }}
{{ partial "section-index.html" . }}
{{ partial "pager.html" . }}
{{ if (and (not .Params.hide_feedback) (.Site.Params.ui.feedback.enable) (.Site.Config.Services.GoogleAnalytics.ID)) }}
<hr class="mt-5 mb-4">
<div class="mt-4">
{{ partial "feedback.html" . }}
<br />
{{ end }}
{{ if (.Site.Params.DisqusShortname) }}
<br />
{{ partial "disqus-comment.html" . }}
{{ end }}
{{ partial "page-meta-lastmod.html" . }}
</div>
{{ end }}

View File

@@ -1,14 +1,22 @@
{{ .Site.Params.description }}
{{- define "print_full_node" }}
{{ range .Site.Sections }}
# {{ .Title }}
{{ .Description }}
{{ range .Pages }}
# {{ .Title }}
{{ .Description }}
{{ .RawContent }}
{{ range .Pages }}
# {{ .Title }}
{{ .Description }}
{{ .RawContent }}
{{end }}{{ end }}{{ end }}
========================================================================
## {{ .page.Title }}
========================================================================
**Hierarchy:** {{ if .page.Parent }}{{ range .page.Ancestors.Reverse }}{{ .Title }} > {{ end }}{{ end }}{{ .page.Title }}
**URL:** {{ .page.Permalink }}
**Description:** {{ .page.Description | default "None" }}
{{ .page.RawContent }}
{{ if .page.Pages }}
{{- range .page.Pages.ByWeight }}
{{ template "print_full_node" (dict "page" .) }}
{{- end }}
{{- end }}
{{- end -}}
{{ partial "llms-header.html" (dict "Site" .Site "TitleSuffix" "Complete Documentation") }}
{{- range .Site.Sections.ByWeight }}
{{ template "print_full_node" (dict "page" .) }}
{{- end }}

View File

@@ -1,9 +1,17 @@
# {{ .Site.Title }}
{{- define "print_index_node" }}
{{ .indent }}- [{{ .page.Title }}]({{ .page.Permalink }}): {{ .page.Description | default "No description provided." }}
{{- $nextIndent := printf "%s " .indent }}
{{- if .page.Pages }}
{{- range .page.Pages.ByWeight }}
{{ template "print_index_node" (dict "page" . "indent" $nextIndent) }}
{{- end }}
{{- end }}
{{- end -}}
> {{ .Site.Params.description }}
{{ partial "llms-header.html" (dict "Site" .Site "TitleSuffix" "Documentation Index") }}
## Docs
{{ range .Site.Sections }}
### {{ .Title }}
## Documentation Map
{{ .Description }}{{ range .Pages }}- [{{ .Title }}]({{ .Permalink }}): {{ .Description }}{{ range .Pages }} - [{{ .Title }}]({{ .Permalink }}): {{ .Description }}{{end }}{{ end }}{{ end }}
{{ range .Site.Sections.ByWeight -}}
{{ template "print_index_node" (dict "page" . "indent" "") }}
{{- end }}

View File

@@ -0,0 +1,245 @@
{{- $navLinks := slice -}}
{{- $targetSections := slice -}}
{{- /* Resolve root navigation section */ -}}
{{- $docsRoot := site.GetPage "/docs" -}}
{{- if $docsRoot -}}
{{- $targetSections = $docsRoot.Sections.ByWeight -}}
{{- else -}}
{{- $targetSections = site.Home.Sections.ByWeight -}}
{{- end -}}
{{- /* Determine active top-level directory */ -}}
{{- if .FirstSection -}}
{{- $topLevelFolder := .FirstSection.Section -}}
{{- if or (findRE `^v[0-9]+` $topLevelFolder) (eq $topLevelFolder "dev") -}}
{{- $targetSections = .FirstSection.Sections.ByWeight -}}
{{- end -}}
{{- end -}}
{{- /* Construct navigation link dataset */ -}}
{{- range $targetSections -}}
{{- if .Title -}}
{{- $manualLink := .Params.manualLink | default "" -}}
{{- $icon := .Params.icon | default "" -}}
{{- $isRightSide := ne $manualLink "" -}}
{{- $navLinks = $navLinks | append (dict "name" .Title "url" .RelPermalink "redirect" $manualLink "icon" $icon "isRight" $isRightSide) -}}
{{- end -}}
{{- end -}}
{{- /* Compile shared tools data for sidebar injection */ -}}
{{- $dynamicLinks := dict -}}
{{- range .Site.Pages -}}
{{- if .Params.shared_tools -}}
{{- $targetURL := .RelPermalink -}}
{{- $targetData := slice -}}
{{- range .Params.shared_tools -}}
{{- $sourceSection := site.GetPage .source -}}
{{- if $sourceSection -}}
{{- $links := slice -}}
{{- range $sourceSection.Pages -}}
{{- $links = $links | append (dict "title" .Title "url" .RelPermalink) -}}
{{- end -}}
{{- $targetData = $targetData | append (dict "header" .header "links" $links) -}}
{{- end -}}
{{- end -}}
{{- if gt (len $targetData) 0 -}}
{{- $dynamicLinks = merge $dynamicLinks (dict $targetURL $targetData) -}}
{{- end -}}
{{- end -}}
{{- end -}}
<div id="nav-data-container" data-nav="{{ $navLinks | jsonify }}" style="display: none;"></div>
<script>
window.dynamicSidebarLinks = {{ $dynamicLinks | jsonify | safeJS }};
</script>
<script>
document.addEventListener("DOMContentLoaded", function() {
// Add links to GitHub issues for documentation feedback and feature requests
const docIssueLink = document.querySelector('.td-page-meta__issue');
if (docIssueLink) {
const url = new URL(docIssueLink.href);
url.searchParams.set('template', 'feature_request.yml');
docIssueLink.href = url.toString();
}
const projIssueLink = document.querySelector('.td-page-meta__project-issue');
if (projIssueLink) {
const url = new URL(projIssueLink.href);
url.searchParams.set('template', 'bug_report.yml');
projIssueLink.href = url.toString();
}
const container = document.getElementById('nav-data-container');
const currentPath = window.location.pathname;
const header = document.querySelector('header');
if (!container || !header || document.getElementById('secondary-nav')) return;
let links = [];
try {
links = JSON.parse(container.dataset.nav);
} catch (e) {
console.error("Failed to parse nav data", e);
return;
}
// Configure brand logo routing
const logoLink = document.querySelector('.navbar-brand');
if (logoLink) {
logoLink.href = "{{ site.Params.global_logo_url | default `/` }}";
}
// Sidebar link centering logic
const sidebar = document.querySelector('#td-section-nav') || document.querySelector('.td-sidebar-nav') || document.querySelector('.td-sidebar');
if (sidebar) {
const activeLink = sidebar.querySelector('.active');
if (activeLink) {
const sidebarRect = sidebar.getBoundingClientRect();
const activeRect = activeLink.getBoundingClientRect();
sidebar.scrollTop = activeRect.top - sidebarRect.top + sidebar.scrollTop - (sidebar.clientHeight / 2) + (activeRect.height / 2);
}
}
// Build secondary navigation UI
let leftNavItems = '';
let rightNavItems = '';
const versionMatch = currentPath.match(/^\/(v\d+\.\d+\.\d+|dev)\//);
const activePrefix = versionMatch ? versionMatch[0] : '/';
links.forEach(link => {
if (!link.name || !link.url) return;
let rawUrl = link.isRight ? link.redirect : link.url;
// Only strip double slashes if it is an internal relative link
let finalUrl = rawUrl.startsWith('http') ? rawUrl : rawUrl.replace(/\/+/g, '/');
// Apply active version prefix mapping
if (!link.isRight && activePrefix !== '/' && !finalUrl.startsWith(activePrefix)) {
finalUrl = activePrefix + finalUrl.replace(/^\//, '');
}
const iconHtml = link.icon ? `<i class="${link.icon}${link.isRight ? ' pop-icon' : ''}" ${!link.isRight ? 'style="font-size: 1.05rem;"' : ''}></i> ` : '';
if (link.isRight) {
rightNavItems += `
<li>
<a href="${finalUrl}" target="_blank" rel="noopener noreferrer" class="sec-nav-item-right">
${iconHtml}<span class="sec-nav-text">${link.name}</span>
</a>
</li>`;
} else {
const isActive = currentPath.startsWith(finalUrl) ? ' active' : '';
leftNavItems += `
<li>
<a class="sec-nav-item-left${isActive}" href="${finalUrl}">
${iconHtml}<span>${link.name}</span>
</a>
</li>`;
}
});
header.insertAdjacentHTML('beforeend', `
<div id="secondary-nav">
<div class="container-fluid sec-nav-container">
<ul class="sec-nav-list">${leftNavItems}</ul>
<ul class="sec-nav-icons">${rightNavItems}</ul>
</div>
</div>
`);
// ======================================================================
// Configure release version button labeling & Active Highlight
// ======================================================================
try {
const relBtn = Array.from(document.querySelectorAll('.td-navbar a.dropdown-toggle'))
.find(el => el.textContent.includes('Releases') || el.textContent.match(/v\d+\./) || el.textContent.includes('dev'));
if (relBtn) {
let label = currentPath.includes('/dev/') ? "dev" : (versionMatch ? versionMatch[1].replace(/\//g, '') : "Releases");
// Update the text on the dropdown button itself
for (let n of relBtn.childNodes) {
if (n.nodeType === 3 && n.textContent.trim().length > 1) {
n.textContent = ' ' + label;
break;
}
}
if (label !== "Releases") {
const waitForLinks = setInterval(() => {
const dropdownItems = document.querySelectorAll('.dropdown-menu .dropdown-item');
if (dropdownItems.length > 0) {
clearInterval(waitForLinks);
dropdownItems.forEach(item => {
const href = item.getAttribute('href');
if (href && (href.includes(`/${label}/`) || href.endsWith(`/${label}`))) {
item.classList.add('active-version');
}
});
}
}, 50); // Check every 50 milliseconds
// Safety fallback: Stop checking after 3 seconds so it doesn't run forever
setTimeout(() => clearInterval(waitForLinks), 3000);
}
}
} catch (e) { console.warn("Releases Labeler skipped.", e); }
// Inject shared tools into sidebar DOM
const sidebarData = window.dynamicSidebarLinks;
if (sidebarData && Object.keys(sidebarData).length > 0) {
Object.keys(sidebarData).forEach(targetUrl => {
const targetLink = document.querySelector(`.td-sidebar-nav a[href="${targetUrl}"]`) ||
document.querySelector(`.td-sidebar-nav a[href="${targetUrl.replace(/\/$/, '')}"]`);
if (!targetLink) return;
const parentLi = targetLink.closest('li');
if (!parentLi) return;
let innerUl = parentLi.querySelector('ul');
if (!innerUl) {
innerUl = document.createElement('ul');
innerUl.className = "ul-2 list-unstyled pb-2 pl-3";
innerUl.style.marginLeft = "1rem";
parentLi.appendChild(innerUl);
parentLi.classList.add('with-child');
}
sidebarData[targetUrl].forEach(group => {
const groupLi = document.createElement('li');
groupLi.className = "with-child";
const isGroupActive = group.links.some(link => currentPath === link.url);
const subUl = document.createElement('ul');
subUl.className = "ul-3 list-unstyled pb-2 pl-3";
subUl.style.marginLeft = "1rem";
subUl.style.display = isGroupActive ? "block" : "none";
if (group.header) {
const headerLabel = document.createElement('label');
headerLabel.style.cursor = "pointer";
headerLabel.innerHTML = `<span style="font-weight: 600; text-transform: uppercase; font-size: 0.85rem; letter-spacing: 0.5px;">${group.header}</span>`;
headerLabel.addEventListener('click', function(e) {
e.preventDefault();
subUl.style.display = subUl.style.display === "none" ? "block" : "none";
});
groupLi.appendChild(headerLabel);
}
group.links.forEach(link => {
const linkLi = document.createElement('li');
linkLi.innerHTML = `<a href="${link.url}" class="td-sidebar-link${currentPath === link.url ? ' active' : ''}" title="${link.title}">${link.title}</a>`;
subUl.appendChild(linkLi);
});
groupLi.appendChild(subUl);
innerUl.appendChild(groupLi);
});
});
}
});
</script>

View File

@@ -1 +1,4 @@
<script src='{{ .Site.BaseURL }}js/w3.js' type="application/x-javascript"></script>
<script src='{{ "js/w3.js" | relURL }}'></script>
{{ if not .Site.Params.disableMigrationBanner }}
<script src="{{ "js/custom-layout.js" | relURL }}"></script>
{{ end }}

View File

@@ -0,0 +1,58 @@
# {{ .Site.Title }} - {{ .TitleSuffix }}
> {{ .Site.Params.description }}
**DOCUMENTATION VERSION:** {{ .Site.Params.version | default "Latest" }}
**BASE URL:** {{ .Site.BaseURL }}
**GENERATED ON:** {{ now.Format "2006-01-02T15:04:05Z07:00" }}
---
### System Directives for AI Models
**Role:** You are an expert Developer Advocate and Integration Engineer for the **MCP (Model Context Protocol) Toolbox for Databases**.
**Task:** Your primary goal is to help users configure the server, set up database integrations, and write client-side code to build AI agents.
**Strict Guidelines:**
1. **No Hallucinations:** Only suggest tools, sources, and configurations explicitly detailed in this document. Do not invent arbitrary REST endpoints.
2. **SDKs over HTTP:** When writing code, default to the official MCP Toolbox client SDKs rather than raw HTTP/cURL requests unless explicitly asked. Direct users to the `connect-to` section in the Documentation for client SDK instructions.
3. **Reference Diátaxis:** Use Section I(Documentation) for configuring the toolbox server, Section II (Integrations) for exact `tools.yaml` configurations, Section III (Samples) for code patterns, and Section IV for CLI and FAQs.
### Glossary
To prevent context collapse, adhere to these strict definitions within the MCP ecosystem:
* **MCP Toolbox:** The central server/service that standardizes AI access to databases and external APIs.
* **Source:** A configured backend connection to an external system (e.g., PostgreSQL, BigQuery, HTTP).
* **Tool:** A single, atomic capability exposed to the LLM (e.g., `bigquery-sql-query`), executed against a Source.
* **Toolset:** A logical, grouped collection of Tools.
* **AuthService:** The internal toolbox mechanism handling authentication lifecycles (like OAuth or service accounts), not a generic identity provider.
* **Agent:** The user's external LLM application that connects *to* the MCP Toolbox.
### Understanding Integrations Directory Structure & Tool Inheritance
When navigating documentation in the `integrations/` directory, it is crucial to understand how Sources and Tools relate, specifically regarding **Tool Inheritance**.
* **Source Pages (`source.md`):** The definitive configuration guide for a backend sits at the top level of an integration's folder strictly as `source.md` (e.g., `integrations/alloydb/source.md`). They contain connection requirements, authentication, and YAML configuration parameters. *(Note: `_index.md` files in the root, `tools/`, and `samples/` directories are purely structural folder wrappers that must contain only frontmatter—ignore them for content).*
* **Native Tools:** Specific capabilities built directly for a Source. If a Source has native tools, they are located in a `tools/` sub-directory (e.g., `integrations/alloydb/tools/alloydb-sql.md`).
* **Inherited Tools (Shared Tools):** Managed or compatible databases (e.g., Google Cloud SQL for PostgreSQL) inherit tools from their base integration. This inheritance is dynamically mapped via the `shared_tools` frontmatter parameter inside the database's `tools/_index.md` file (which contains no body content). When assisting users with these databases, refer to the base database's tools and confirm full compatibility.
### Global Environment & Prerequisites
* **Configuration:** `tools.yaml` is the ultimate source of truth for server configuration.
* **Database:** PostgreSQL 16+ and the `psql` client.
* **Language Requirements:**
{{- with .Site.GetPage "/documentation/getting-started/local_quickstart" }}
{{- $match := findRE "(?i)Python\\s+\\(\\d+\\.\\d+\\s+or\\s+higher\\)" .RawContent 1 }}
* Python: {{ if $match }}{{ index $match 0 | replaceRE "[\\[\\]]" "" }}{{ else }}Refer to Python Quickstart{{ end }}
{{- end }}
{{- with .Site.GetPage "/documentation/getting-started/local_quickstart_js" }}
{{- $match := findRE "(?i)Node\\.js \\(v\\d+ or higher\\)" .RawContent 1 }}
* JavaScript/Node: {{ if $match }}{{ index $match 0 }}{{ else }}Refer to JS Quickstart{{ end }}
{{- end }}
{{- with .Site.GetPage "/documentation/getting-started/local_quickstart_go" }}
{{- $match := findRE "(?i)Go \\(v\\d+\\.\\d+\\.\\d+ or higher\\)" .RawContent 1 }}
* Go: {{ if $match }}{{ index $match 0 }}{{ else }}Refer to Go Quickstart{{ end }}
{{- end }}
### The Diátaxis Narrative Framework
This documentation is structured following the Diátaxis framework to assist in clear navigation and understanding:
* **Section I: Documentation:** (Explanation) Theoretical context, high-level understanding, and universal How-To Guides.
* **Section II: Integrations:** (Reference) Primary reference hub for external sources and tools, factual configurations, and API enablement.
* **Section III: Samples:** (Tutorials) Code patterns and examples. **Note for AI:** Sample code is distributed across three main areas:
1. **Quickstarts:** Located in `documentation/getting-started/`.
2. **Integration-Specific Samples:** Nested within their respective `integrations/<source_name>/samples/` directories.
3. **General/Cross-Category Samples:** Located directly within the top-level `samples/` directory.
* **Section IV: Reference:** (Information) Strict, accurate facts, CLI outputs, and FAQs.
---

View File

@@ -2,11 +2,66 @@
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
{{ .Site.Params.version_menu }}
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<div w3-include-html="/genai-toolbox/releases.releases" w3-include-html-default='<a class="dropdown-item" href="/genai-toolbox/dev/">Dev</a>'></div>
<div class="dropdown-menu" id="version-dropdown-menu" aria-labelledby="navbarDropdown">
<div w3-include-html="{{ .Site.Params.releases_url }}" w3-include-html-default='<a class="dropdown-item" href="{{ .Site.Params.global_logo_url }}dev/">dev</a>'></div>
<script>
// This must run after the w3.js script has loaded.
w3.includeHTML();
w3.includeHTML(function() {
const basePath = "{{ site.BaseURL | relURL }}";
function stripBase(path) {
if (path.startsWith(basePath)) return path.substring(basePath.length);
if (basePath === "/" && path.startsWith("/")) return path.substring(1);
return path.replace(/^\//, '');
}
document.getElementById('version-dropdown-menu').addEventListener('click', function(e) {
const link = e.target.closest('a.dropdown-item');
if (!link) return;
e.preventDefault();
let targetPath = link.pathname;
if (!targetPath.endsWith('/')) targetPath += '/';
let cleanCurrentPath = stripBase(window.location.pathname);
const allLinks = document.querySelectorAll('#version-dropdown-menu a.dropdown-item');
let currentVersionPrefix = "";
allLinks.forEach(a => {
let cleanVPath = stripBase(a.pathname);
if (!cleanVPath.endsWith('/')) cleanVPath += '/';
if (cleanVPath !== "" && cleanVPath !== "/" && cleanCurrentPath.startsWith(cleanVPath)) {
if (cleanVPath.length > currentVersionPrefix.length) {
currentVersionPrefix = cleanVPath;
}
}
});
let deepPath = cleanCurrentPath;
if (currentVersionPrefix !== "") {
deepPath = cleanCurrentPath.substring(currentVersionPrefix.length);
}
deepPath = deepPath.replace(/^\//, '');
const fullTargetPath = targetPath + deepPath;
// Perform a HEAD request to check if the deep route exists
fetch(fullTargetPath, { method: 'HEAD' })
.then(response => {
if (response.ok) {
// Page exists! Redirect to deep path
window.location.href = fullTargetPath;
} else {
// 404 or other error: Fallback to the version root
window.location.href = targetPath;
}
})
.catch(() => {
// If the fetch fails entirely, fallback to root
window.location.href = targetPath;
});
});
});
</script>
</div>
{{ end -}}

View File

@@ -0,0 +1,187 @@
{{ $curr := . }}
{{ $next := "" }}
{{ $prev := "" }}
{{ $max_skip_attempts := 5 }}
{{/* 1. Calculate Previous Page */}}
{{ if .Parent }}
{{ $siblings := .Parent.Pages.ByWeight }}
{{ $currIndex := -1 }}
{{ range $index, $page := $siblings }}
{{ if eq $page.RelPermalink $curr.RelPermalink }}
{{ $currIndex = $index }}
{{ end }}
{{ end }}
{{ if gt $currIndex 0 }}
{{ $prev = index $siblings (sub $currIndex 1) }}
{{ else }}
{{ if ne .Parent.Type "home" }}
{{ $prev = .Parent }}
{{ end }}
{{ end }}
{{ end }}
{{/* 2. Calculate Next Page */}}
{{ if and .IsNode (gt (len .Pages) 0) }}
{{ $next = index .Pages.ByWeight 0 }}
{{ else }}
{{ if .Parent }}
{{ $siblings := .Parent.Pages.ByWeight }}
{{ $currIndex := -1 }}
{{ range $index, $page := $siblings }}
{{ if eq $page.RelPermalink $curr.RelPermalink }}
{{ $currIndex = $index }}
{{ end }}
{{ end }}
{{ if lt $currIndex (sub (len $siblings) 1) }}
{{ $next = index $siblings (add $currIndex 1) }}
{{ else }}
{{ $p := .Parent }}
{{ $foundNext := false }}
{{ range seq 3 }}
{{ if and (not $foundNext) $p }}
{{ if $p.Parent }}
{{ $pSiblings := $p.Parent.Pages.ByWeight }}
{{ $pIndex := -1 }}
{{ range $index, $page := $pSiblings }}
{{ if eq $page.RelPermalink $p.RelPermalink }}
{{ $pIndex = $index }}
{{ end }}
{{ end }}
{{ if and (ge $pIndex 0) (lt $pIndex (sub (len $pSiblings) 1)) }}
{{ $next = index $pSiblings (add $pIndex 1) }}
{{ $foundNext = true }}
{{ else }}
{{ $p = $p.Parent }}
{{ end }}
{{ else }}
{{ $p = false }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{/* 3. Apply Integration Directory Filters */}}
{{ range seq $max_skip_attempts }}
{{ if $prev }}
{{ $isLockedPrev := false }}
{{ if and $prev.IsNode (in $prev.RelPermalink "/integrations/") }}
{{ if or (strings.HasSuffix $prev.RelPermalink "/tools/") (strings.HasSuffix $prev.RelPermalink "/samples/") (and $prev.Parent (strings.HasSuffix $prev.Parent.RelPermalink "/integrations/")) }}
{{ $isLockedPrev = true }}
{{ end }}
{{ end }}
{{ if $isLockedPrev }}
{{ $steppingOut := strings.HasPrefix $curr.RelPermalink $prev.RelPermalink }}
{{ if and (not $steppingOut) (gt (len $prev.Pages) 0) }}
{{ $prev = index $prev.Pages.ByWeight (sub (len $prev.Pages) 1) }}
{{ else }}
{{ if $prev.Parent }}
{{ if eq $prev.Parent.RelPermalink "/integrations/" }}
{{ $prev = $prev.Parent }}
{{ else }}
{{ $sibs := $prev.Parent.Pages.ByWeight }}
{{ $idx := -1 }}
{{ range $i, $p := $sibs }}{{ if eq $p.RelPermalink $prev.RelPermalink }}{{ $idx = $i }}{{ end }}{{ end }}
{{ if gt $idx 0 }}
{{ $prev = index $sibs (sub $idx 1) }}
{{ else }}
{{ $prev = $prev.Parent }}
{{ end }}
{{ end }}
{{ else }}
{{ $prev = "" }}
{{ end }}
{{ end }}
{{ else }}
{{ break }}
{{ end }}
{{ end }}
{{ end }}
{{ range seq $max_skip_attempts }}
{{ if $next }}
{{ $isLockedNext := false }}
{{ if and $next.IsNode (in $next.RelPermalink "/integrations/") }}
{{ if or (strings.HasSuffix $next.RelPermalink "/tools/") (strings.HasSuffix $next.RelPermalink "/samples/") (and $next.Parent (strings.HasSuffix $next.Parent.RelPermalink "/integrations/")) }}
{{ $isLockedNext = true }}
{{ end }}
{{ end }}
{{ if $isLockedNext }}
{{ if gt (len $next.Pages) 0 }}
{{ $next = index $next.Pages.ByWeight 0 }}
{{ else }}
{{ $sibs := $next.Parent.Pages.ByWeight }}
{{ $idx := -1 }}
{{ range $i, $p := $sibs }}{{ if eq $p.RelPermalink $next.RelPermalink }}{{ $idx = $i }}{{ end }}{{ end }}
{{ if lt $idx (sub (len $sibs) 1) }}
{{ $next = index $sibs (add $idx 1) }}
{{ else }}
{{ $p := $next.Parent }}
{{ $foundNextSibling := false }}
{{ range seq 3 }}
{{ if and (not $foundNextSibling) $p }}
{{ if $p.Parent }}
{{ $pSibs := $p.Parent.Pages.ByWeight }}
{{ $pIdx := -1 }}
{{ range $index, $page := $pSibs }}{{ if eq $page.RelPermalink $p.RelPermalink }}{{ $pIdx = $index }}{{ end }}{{ end }}
{{ if and (ge $pIdx 0) (lt $pIdx (sub (len $pSibs) 1)) }}
{{ $next = index $pSibs (add $pIdx 1) }}
{{ $foundNextSibling = true }}
{{ else }}
{{ $p = $p.Parent }}
{{ end }}
{{ else }}
{{ $p = false }}
{{ end }}
{{ end }}
{{ end }}
{{ if not $foundNextSibling }}{{ $next = "" }}{{ end }}
{{ end }}
{{ end }}
{{ else }}
{{ break }}
{{ end }}
{{ end }}
{{ end }}
{{/* 4. Render Navigation */}}
{{ if or $prev $next }}
<nav class="mt-5 pt-4 border-top d-flex justify-content-between" aria-label="Page navigation">
<div>
{{ with $prev }}
<a href="{{ .RelPermalink }}" class="text-decoration-none">
<small class="text-muted d-block mb-1">&laquo; Previous</small>
<span class="text-body">{{ .Title }}</span>
</a>
{{ end }}
</div>
<div class="text-end">
{{ with $next }}
<a href="{{ .RelPermalink }}" class="text-decoration-none">
<small class="text-muted d-block mb-1">Next &raquo;</small>
<span class="text-body">{{ .Title }}</span>
</a>
{{ end }}
</div>
</nav>
{{ end }}

View File

@@ -0,0 +1,137 @@
{{ .Scratch.Set "docsy-search" 0 }}
{{ if .Site.Params.pagefind }}
{{ .Scratch.Add "docsy-search" 1 }}
<div class="td-search custom-pagefind-wrapper">
<div class="pagefind-search-container"></div>
</div>
<link href="{{ relURL "pagefind/pagefind-ui.css" }}" rel="stylesheet">
<script src="{{ relURL "pagefind/pagefind-ui.js" }}"></script>
<script>
if (!window.pagefindScriptLoaded) {
window.pagefindScriptLoaded = true;
window.addEventListener('DOMContentLoaded', () => {
/* Initialize Pagefind UI */
document.querySelectorAll('.pagefind-search-container').forEach(el => {
new PagefindUI({
element: el,
showSubResults: true,
showImages: false,
resetStyles: false,
debounceTimeoutMs: 300,
bundlePath: "{{ relURL "pagefind/" }}",
processResult: function (result) {
const ignoredSegments = ["en", "docs", "dev", "genai-toolbox"];
let path = result.url.replace(/^https?:\/\/[^\/]+/, "").split('#')[0].replace(/\/$/, "");
let parts = path.split("/").filter(p => p && !ignoredSegments.includes(p));
parts.pop();
if (parts.length > 0) {
let breadcrumb = parts.map(part => part.replace(/[-_]/g, ' ').replace(/\b\w/g, l => l.toUpperCase())).join(' ');
if (!result.rawTitle) result.rawTitle = result.meta.title;
result.meta.title = breadcrumb + ' ' + result.rawTitle;
}
return result;
}
});
});
/* Modal Behavior Logic */
setTimeout(() => {
let backdrop = document.getElementById('global-search-backdrop');
if (!backdrop) {
backdrop = document.createElement('div');
backdrop.id = 'global-search-backdrop';
document.body.appendChild(backdrop);
}
let isClosing = false;
let activeWrapper = null;
let placeholder = document.createElement('div');
placeholder.style.display = 'none';
function openModal(input) {
if (activeWrapper || isClosing) return;
const wrapper = input.closest('.custom-pagefind-wrapper');
if (!wrapper) return;
activeWrapper = wrapper;
wrapper.parentNode.insertBefore(placeholder, wrapper);
document.body.appendChild(wrapper);
backdrop.classList.add('active');
document.body.classList.add('global-search-active');
wrapper.classList.add('active-modal');
setTimeout(() => {
input.focus();
const len = input.value.length;
input.setSelectionRange(len, len);
}, 10);
}
function closeModal(keepFocus = false) {
if (!activeWrapper) return;
isClosing = true;
backdrop.classList.remove('active');
document.body.classList.remove('global-search-active');
activeWrapper.classList.remove('active-modal');
if (placeholder.parentNode) {
placeholder.parentNode.insertBefore(activeWrapper, placeholder);
}
const input = activeWrapper.querySelector('.pagefind-ui__search-input');
if (!keepFocus) {
const clearBtn = activeWrapper.querySelector('.pagefind-ui__search-clear');
if (clearBtn) clearBtn.click();
if (input) input.blur();
} else {
if (input) setTimeout(() => input.focus(), 10);
}
activeWrapper = null;
setTimeout(() => { isClosing = false; }, 50);
}
/* Event Listeners */
document.addEventListener('input', (e) => {
if (e.target.classList.contains('pagefind-ui__search-input')) {
e.target.value.trim() !== '' ? openModal(e.target) : closeModal(true);
}
});
backdrop.addEventListener('click', () => closeModal(false));
document.addEventListener('mousedown', (e) => {
if (!activeWrapper) return;
const clickedX = e.target.closest('.pagefind-ui__search-clear');
const clickedResult = e.target.closest('.pagefind-ui__result-link');
const isClickInside = activeWrapper.contains(e.target);
if (clickedResult) return;
if (clickedX || (!isClickInside && e.target !== backdrop)) closeModal(false);
});
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') closeModal(false);
});
}, 500);
});
}
</script>
{{ else if .Site.Params.offlineSearch }}
{{ .Scratch.Set "docsy-search" 1 }}
<div class="td-search custom-pagefind-wrapper flex-grow-1 order-last order-lg-1 w-100 mt-3 mt-lg-0">
<div class="pagefind-search-container w-100"></div>
</div>
{{ end }}

View File

@@ -0,0 +1,41 @@
{{/* Automatically identify the "Native" source (Grandparent _index.md, since this is strictly used inside tools/) */}}
{{ $nativeSource := .Page.Parent.Parent }}
<div class="compatibility-section">
<p>This tool can be used with the following database sources:</p>
<table>
<thead>
<tr>
<th>Source Name</th>
</tr>
</thead>
<tbody>
{{/* Display the Native Source automatically */}}
{{ if $nativeSource }}
<tr>
<td><a href="{{ $nativeSource.RelPermalink }}">{{ $nativeSource.Title }}</a></td>
</tr>
{{ end }}
{{/* Process additional sources passed via the "others" parameter */}}
{{ $others := .Get "others" }}
{{ if $others }}
{{ range split $others "," }}
{{ $path := trim . " " }}
{{ $remotePage := site.GetPage $path }}
{{ if $remotePage }}
<tr>
<td><a href="{{ $remotePage.RelPermalink }}">{{ $remotePage.Title }}</a></td>
</tr>
{{ else }}
<tr>
<td style="color: red;">⚠️ Source not found at path: {{ $path }}</td>
</tr>
{{ end }}
{{ end }}
{{ end }}
</tbody>
</table>
</div>

View File

@@ -1,2 +1,13 @@
{{ $file := .Get 0 }}
{{ (printf "%s%s" .Page.File.Dir $file) | readFile | replaceRE "^---[\\s\\S]+?---" "" | safeHTML }}
{{ $lang := .Get 1 }}
{{ $content := (printf "%s%s" .Page.File.Dir $file) | readFile | replaceRE "^---[\\s\\S]+?---" "" | replaceRE "\r\n"
"\n" | strings.TrimRight "\n" }}
{{ if $lang }}
```{{ $lang }}
{{ $content | safeHTML }}
```
{{ else }}
{{ $content | safeHTML }}
{{ end }}

View File

@@ -0,0 +1,98 @@
<div class="db-index-list">
{{/* Loop through all sub-folders, sorted alphabetically */}}
{{ range .Page.Pages.ByTitle }}
{{ $displayTitle := .Title }}
{{ $targetLink := .RelPermalink }}
{{ $displayDesc := .Description }}
{{ with .GetPage "source.md" }}
{{ $targetLink = .RelPermalink }}
{{ $displayDesc = .Description }}
{{ end }}
<a href="{{ $targetLink }}" class="db-index-row">
<div class="db-index-content">
<div class="db-index-header">
<span class="db-index-title">{{ $displayTitle }}</span>
<svg class="db-index-arrow" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<line x1="5" y1="12" x2="19" y2="12"></line>
<polyline points="12 5 19 12 12 19"></polyline>
</svg>
</div>
<div class="db-index-desc">{{ $displayDesc | default "Explore this integration." | plainify | truncate 120 }}</div>
</div>
</a>
{{ end }}
</div>
<style>
.db-index-list {
display: flex;
flex-direction: column;
margin-top: 2rem;
margin-bottom: 3rem;
border-top: 1px solid rgba(0, 0, 0, 0.08); /* Top bounding line */
}
.db-index-row {
padding: 1.25rem 0;
border-bottom: 1px solid rgba(0, 0, 0, 0.08);
text-decoration: none !important;
display: block;
background: transparent;
transition: all 0.2s ease;
}
.db-index-row:hover .db-index-title {
color: #4484f4;
}
.db-index-row:hover .db-index-arrow {
opacity: 1;
transform: translateX(0);
color: #4484f4;
}
.db-index-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0.3rem;
}
.db-index-title {
font-size: 1.1rem;
font-weight: 600;
color: #202124;
transition: color 0.2s ease;
}
.db-index-arrow {
opacity: 0;
transform: translateX(-10px);
color: #5f6368;
transition: all 0.25s cubic-bezier(0.25, 0.8, 0.25, 1);
}
.db-index-desc {
font-size: 0.95rem;
color: #5f6368;
line-height: 1.5;
padding-right: 2rem;
}
/* Dark Mode Adjustments */
html[data-bs-theme="dark"] .db-index-list,
body.dark .db-index-list { border-top-color: rgba(255, 255, 255, 0.1); }
html[data-bs-theme="dark"] .db-index-row,
body.dark .db-index-row { border-bottom-color: rgba(255, 255, 255, 0.1); }
html[data-bs-theme="dark"] .db-index-title,
body.dark .db-index-title { color: #e8eaed; }
html[data-bs-theme="dark"] .db-index-desc,
body.dark .db-index-desc { color: #9aa0a6; }
html[data-bs-theme="dark"] .db-index-row:hover .db-index-title,
html[data-bs-theme="dark"] .db-index-row:hover .db-index-arrow { color: #8ab4f8; }
</style>

View File

@@ -0,0 +1,100 @@
{{ $integrations := site.GetPage "section" "integrations" }}
<div class="db-index-list">
{{/*Loop through all database folders alphabetically */}}
{{ range $integrations.Pages.ByTitle }}
{{ $db := . }}
{{/* Only render a row if this database has a 'prebuilt-configs' folder */}}
{{ with $db.GetPage "prebuilt-configs" }}
{{ $displayTitle := $db.Title }}
{{ $targetLink := .RelPermalink }}
{{ $displayDesc := .Description | default (printf "Explore prebuilt configurations for %s." $db.Title) }}
<a href="{{ $targetLink }}" class="db-index-row">
<div class="db-index-content">
<div class="db-index-header">
<span class="db-index-title">{{ $displayTitle }}</span>
<svg class="db-index-arrow" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<line x1="5" y1="12" x2="19" y2="12"></line>
<polyline points="12 5 19 12 12 19"></polyline>
</svg>
</div>
<div class="db-index-desc">{{ $displayDesc | plainify | truncate 120 }}</div>
</div>
</a>
{{ end }}
{{ end }}
</div>
<style>
.db-index-list {
display: flex;
flex-direction: column;
margin-top: 2rem;
margin-bottom: 3rem;
border-top: 1px solid rgba(0, 0, 0, 0.08);
}
.db-index-row {
padding: 1.25rem 0;
border-bottom: 1px solid rgba(0, 0, 0, 0.08);
text-decoration: none !important;
display: block;
background: transparent;
transition: all 0.2s ease;
}
.db-index-row:hover .db-index-title {
color: #4484f4;
}
.db-index-row:hover .db-index-arrow {
opacity: 1;
transform: translateX(0);
color: #4484f4;
}
.db-index-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0.3rem;
}
.db-index-title {
font-size: 1.1rem;
font-weight: 600;
color: #202124;
transition: color 0.2s ease;
}
.db-index-arrow {
opacity: 0;
transform: translateX(-10px);
color: #5f6368;
transition: all 0.25s cubic-bezier(0.25, 0.8, 0.25, 1);
}
.db-index-desc {
font-size: 0.95rem;
color: #5f6368;
line-height: 1.5;
padding-right: 2rem;
}
/* Dark Mode Adjustments */
html[data-bs-theme="dark"] .db-index-list,
body.dark .db-index-list { border-top-color: rgba(255, 255, 255, 0.1); }
html[data-bs-theme="dark"] .db-index-row,
body.dark .db-index-row { border-bottom-color: rgba(255, 255, 255, 0.1); }
html[data-bs-theme="dark"] .db-index-title,
body.dark .db-index-title { color: #e8eaed; }
html[data-bs-theme="dark"] .db-index-desc,
body.dark .db-index-desc { color: #9aa0a6; }
html[data-bs-theme="dark"] .db-index-row:hover .db-index-title,
html[data-bs-theme="dark"] .db-index-row:hover .db-index-arrow { color: #8ab4f8; }
</style>

View File

@@ -0,0 +1,99 @@
{{/* Set Database Title */}}
{{ $dbTitle := .Page.Title }}
{{/* Gather & Pre-filter Native Tools (from the local "tools" sub-folder) */}}
{{ $validNativeTools := slice }}
{{ $localTools := .Page.GetPage "tools" }}
{{ if $localTools }}
{{ range $localTools.RegularPages }}
{{ if not .Params.is_wrapper }}
{{ $validNativeTools = $validNativeTools | append . }}
{{ end }}
{{ end }}
{{ end }}
{{/* Track if we've printed the main H3 header yet */}}
{{ $headerPrinted := false }}
{{/* Display Native Tools ONLY if valid ones exist */}}
{{ if gt (len $validNativeTools) 0 }}
<h3>{{ $dbTitle }} Tools</h3>
{{ $headerPrinted = true }}
<table>
<thead>
<tr>
<th>Tool Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
{{ range $validNativeTools }}
<tr>
<td><a href="{{ .RelPermalink }}"><strong>{{ .Title }}</strong></a></td>
<td>{{ .Description | default "No description provided." }}</td>
</tr>
{{ end }}
</tbody>
</table>
{{ end }}
{{/* Gather & Display Inherited Tools */}}
{{ $dirsParam := .Get "dirs" }}
{{ if $dirsParam }}
{{ range split $dirsParam "," }}
{{ $dirPath := trim . " " }}
{{ $targetDir := site.GetPage $dirPath }}
{{ if $targetDir }}
{{/* Since $targetDir is the "tools" folder, the DB name is simply its parent */}}
{{ $remoteDbTitle := $targetDir.Parent.Title }}
{{/* Pre-filter Inherited Tools */}}
{{ $validExternalTools := slice }}
{{ range $targetDir.RegularPages }}
{{ if not .Params.is_wrapper }}
{{ $validExternalTools = $validExternalTools | append . }}
{{ end }}
{{ end }}
{{ if gt (len $validExternalTools) 0 }}
{{/* Print the main H3 if the native tools block didn't already print it */}}
{{ if not $headerPrinted }}
<h3>{{ $dbTitle }} Tools</h3>
{{ $headerPrinted = true }}
{{ end }}
<p><em><strong>{{ $dbTitle }}</strong> maintains full compatibility with <strong>{{ $remoteDbTitle }}</strong>, allowing you to use the following tools with this connection:</em></p>
<table>
<thead>
<tr>
<th>Tool Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
{{ range $validExternalTools }}
<tr>
<td><a href="{{ .RelPermalink }}"><strong>{{ .Title }}</strong></a></td>
<td>{{ .Description | default "No description provided." }}</td>
</tr>
{{ end }}
</tbody>
</table>
{{ end }}
{{ else }}
<p style="color: red;"><em>Warning: Tool directory '{{ $dirPath }}' not found.</em></p>
{{ end }}
{{ end }}
{{ end }}
{{/* Fallback if absolutely NO tools exist anywhere */}}
{{ if and (not $headerPrinted) (not $dirsParam) }}
<p><em>No tools found to display.</em></p>
{{ end }}

View File

@@ -0,0 +1,19 @@
<div class="td-sidebar-link td-sidebar-link__page alert alert-warning shadow-sm" role="alert">
<h4 class="alert-heading">⚠️ Production Security Warning</h4>
<p><strong>Secure your deployment:</strong> By default, Toolbox allows all hosts (<code>--allowed-hosts</code>) and all origins (<code>--allowed-origins</code>). While convenient for local development, this is <strong>insecure for production</strong>.</p>
<hr>
<ul class="mb-0">
<li class="mb-2">
<strong>Prevent DNS Rebinding:</strong> Use the <code>--allowed-hosts</code> flag to specify a list of hosts for validation.
<div class="mt-1"><small><em>Example:</em></small> <code>command: ["--config", "/config/tools.yaml", "--address", "0.0.0.0", "--allowed-hosts", "localhost:5000"]</code></div>
</li>
<li>
<strong>Implement CORS:</strong> Use the <code>--allowed-origins</code> flag to specify a list of origins permitted to access the server.
<div class="mt-1"><small><em>Example:</em></small> <code>command: ["--config", "/config/tools.yaml", "--address", "0.0.0.0", "--allowed-origins", "https://foo.bar"]</code></div>
</li>
</ul>
<p class="mt-3 mb-0 small opacity-75">Note: The server issues a warning in the logs if these are set to the wildcard <code>*</code>.</p>
</div>

View File

@@ -20,24 +20,26 @@
{{ errorf "File %q not found (referenced in %s)" $path .Page.File.Path }}
{{ end }}
{{ $content := readFile $path }}
{{ $content := readFile $path | replaceRE "\r\n" "\n" }}
{{ $start_tag := printf "[START %s]" $region }}
{{ $end_tag := printf "[END %s]" $region }}
{{ $snippet := "" }}
{{ $lines := slice }}
{{ $in_snippet := false }}
{{ range split $content "\n" }}
{{ if $in_snippet }}
{{ if in . $end_tag }}
{{ $in_snippet = false }}
{{ else }}
{{ $snippet = printf "%s%s\n" $snippet . }}
{{ $lines = $lines | append . }}
{{ end }}
{{ else if in . $start_tag }}
{{ $in_snippet = true }}
{{ end }}
{{ end }}
{{ $snippet := delimit $lines "\n" }}
{{ if eq (trim $snippet "") "" }}
{{ errorf "Region %q not found or empty in file %s (referenced in %s)" $region $file .Page.File.Path }}
{{ end }}
@@ -45,5 +47,7 @@
{{ if eq $lang "text" }}
{{ $snippet | markdownify }}
{{ else }}
{{ highlight (trim $snippet "\n") $lang "" }}
```{{ $lang }}
{{ $snippet | safeHTML }}
```
{{ end }}

View File

@@ -0,0 +1,274 @@
{{- /* Fetch and sort samples */ -}}
{{- $samples := (where .Site.Pages "Params.is_sample" true).ByTitle -}}
{{- /* Extract unique filters */ -}}
{{- $allFilters := slice -}}
{{- range $samples -}}
{{- if .Params.sample_filters -}}
{{- range .Params.sample_filters -}}
{{- $allFilters = $allFilters | append . -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- $uniqueFilters := $allFilters | uniq | sort -}}
{{- /* Render UI */ -}}
<div class="samples-wrapper">
<!-- Search -->
<div class="samples-search-wrapper">
<svg class="search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"></circle>
<line x1="21" y1="21" x2="16.65" y2="16.65"></line>
</svg>
<input type="text" id="sampleSearchInput" placeholder="Search tutorials, integrations, or keywords...">
</div>
<!-- Filters -->
<div class="samples-sample-filters-wrapper" id="sampleTagFilters">
<button class="sample-tag-btn active" data-tag="all">All</button>
{{- range $uniqueFilters }}
<button class="sample-tag-btn" data-tag="{{ . | lower }}">{{ . }}</button>
{{- end }}
</div>
<!-- Grid -->
<div class="samples-grid" id="samplesGrid">
{{- range $samples }}
{{- $pageFilters := default slice .Params.sample_filters }}
<div class="sample-card visible"
data-title="{{ .Title | lower }}"
data-desc="{{ .Description | default "" | plainify | lower }}"
data-sample-filters="{{ delimit $pageFilters `,` | lower }}">
<div class="card-accent"></div>
<div class="card-content">
<h4><a href="{{ .RelPermalink }}" class="card-title-link">{{ .Title }}</a></h4>
<div class="card-desc">{{ .Description | default "Learn how to build this integration." | markdownify }}</div>
</div>
<div class="sample-card-sample-filters">
{{- range $pageFilters }}
<span class="badge">{{ . }}</span>
{{- end }}
</div>
</div>
{{- end }}
</div>
<!-- Empty State -->
<div id="samplesEmptyState" class="samples-empty-state" style="display: none;">
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="empty-icon">
<circle cx="11" cy="11" r="8"></circle>
<line x1="21" y1="21" x2="16.65" y2="16.65"></line>
</svg>
<h3>No samples found</h3>
<p>Try adjusting your search or filters.</p>
</div>
</div>
<style>
/* Scoped Variables */
.samples-wrapper {
--sh-primary: #4484f4;
--sh-primary-hover: #3367d6;
--sh-bg: #ffffff;
--sh-card-bg: #ffffff;
--sh-border: rgba(0, 0, 0, 0.08);
--sh-border-hover: rgba(68, 132, 244, 0.3);
--sh-text-main: #202124;
--sh-text-muted: #5f6368;
--sh-tag-bg: #f1f3f4;
--sh-tag-text: #3c4043;
--sh-shadow-sm: 0 2px 6px rgba(0,0,0,0.04);
--sh-shadow-lg: 0 12px 24px rgba(0,0,0,0.08);
margin-top: 2rem;
margin-bottom: 5rem;
font-family: inherit;
}
/* Dark Mode */
html[data-bs-theme="dark"] .samples-wrapper,
body.dark .samples-wrapper {
--sh-bg: #121212;
--sh-card-bg: #1e1e1e;
--sh-border: rgba(255, 255, 255, 0.1);
--sh-border-hover: rgba(138, 180, 248, 0.5);
--sh-text-main: #e8eaed;
--sh-text-muted: #9aa0a6;
--sh-tag-bg: rgba(255, 255, 255, 0.05);
--sh-tag-text: #e8eaed;
--sh-primary: #8ab4f8;
--sh-shadow-sm: 0 4px 12px rgba(0,0,0,0.2);
--sh-shadow-lg: 0 12px 30px rgba(0,0,0,0.4);
}
/* Search */
.samples-search-wrapper { position: relative; margin: 0 auto 2rem auto; max-width: 600px; }
.search-icon {
position: absolute; left: 1.25rem; top: 50%; transform: translateY(-50%);
width: 20px; height: 20px; color: var(--sh-text-muted); transition: color 0.3s ease;
}
.samples-search-wrapper input {
width: 100%; padding: 1rem 1rem 1rem 3.25rem; border: 1px solid var(--sh-border);
border-radius: 16px; font-size: 1.05rem; background: var(--sh-card-bg);
color: var(--sh-text-main); box-shadow: var(--sh-shadow-sm);
transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); outline: none;
}
.samples-search-wrapper input:focus { border-color: var(--sh-primary); box-shadow: 0 0 0 4px rgba(68, 132, 244, 0.15); }
.samples-search-wrapper input:focus + .search-icon,
.samples-search-wrapper input:not(:placeholder-shown) ~ .search-icon {
color: var(--sh-primary);
}
/* Filters */
.samples-sample-filters-wrapper { display: flex; flex-wrap: wrap; gap: 0.6rem; margin-bottom: 2.5rem; }
.sample-tag-btn {
padding: 0.5rem 1.2rem; border: 1px solid var(--sh-border); background: var(--sh-card-bg);
color: var(--sh-text-muted); border-radius: 30px; cursor: pointer; font-size: 0.9rem;
font-weight: 500; transition: all 0.25s ease; box-shadow: var(--sh-shadow-sm);
}
.sample-tag-btn:hover { border-color: var(--sh-primary); color: var(--sh-primary); transform: translateY(-1px); }
.sample-tag-btn.active {
background: var(--sh-primary); border-color: var(--sh-primary); color: #ffffff !important;
box-shadow: 0 4px 12px rgba(68, 132, 244, 0.3);
}
/* Grid */
.samples-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: 1.75rem; }
.sample-card {
position: absolute;
display: flex; flex-direction: column; background: var(--sh-card-bg);
border: 1px solid var(--sh-border); border-radius: 16px; padding: 1.75rem;
overflow: hidden; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
box-shadow: var(--sh-shadow-sm); opacity: 0; transform: scale(0.95);
pointer-events: none; visibility: hidden;
}
/* Visibility Toggle */
.sample-card.visible { opacity: 1; transform: scale(1); pointer-events: auto; position: relative; visibility: visible; }
.sample-card:hover { transform: translateY(-6px); box-shadow: var(--sh-shadow-lg); border-color: var(--sh-border-hover); }
/* Card Accent */
.card-accent {
position: absolute; top: 0; left: 0; right: 0; height: 4px;
background: linear-gradient(90deg, #4484f4, #80a7e9); opacity: 0.7; transition: opacity 0.3s ease;
}
.sample-card:hover .card-accent { opacity: 1; }
/* Card Content */
.card-content { flex-grow: 1; display: flex; flex-direction: column; }
.sample-card h4 { margin-top: 0.5rem; margin-bottom: 0.75rem; font-size: 1.25rem; font-weight: 600; line-height: 1.4; color: var(--sh-text-main); }
/* Card Click Overlay */
.card-title-link { text-decoration: none; color: inherit; }
.card-title-link::after { content: ''; position: absolute; inset: 0; z-index: 1; }
.card-desc { font-size: 0.95rem; color: var(--sh-text-muted); margin-bottom: 1.5rem; line-height: 1.6; position: relative; z-index: 2; }
.card-desc a { color: var(--sh-primary); text-decoration: none; font-weight: 500; }
.card-desc a:hover { text-decoration: underline; }
.card-desc p { margin-bottom: 0; }
/* Card Tags */
.sample-card-sample-filters { display: flex; flex-wrap: wrap; gap: 0.5rem; position: relative; z-index: 2; margin-top: auto; }
.sample-card-sample-filters .badge {
background: var(--sh-tag-bg); color: var(--sh-tag-text); padding: 0.35rem 0.75rem;
border-radius: 6px; font-size: 0.75rem; font-weight: 600; letter-spacing: 0.3px;
border: 1px solid var(--sh-border);
}
/* Empty State */
.samples-empty-state { text-align: center; padding: 4rem 1rem; color: var(--sh-text-muted); animation: fadeIn 0.4s ease forwards; }
.empty-icon { color: var(--sh-border); margin-bottom: 1rem; width: 64px; height: 64px; }
.samples-empty-state h3 { color: var(--sh-text-main); margin-bottom: 0.5rem; }
@keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
</style>
<script>
document.addEventListener("DOMContentLoaded", () => {
const searchInput = document.getElementById('sampleSearchInput');
const tagButtons = document.querySelectorAll('.sample-tag-btn');
const cards = document.querySelectorAll('.sample-card');
const emptyState = document.getElementById('samplesEmptyState');
const btnAll = document.querySelector('.sample-tag-btn[data-tag="all"]');
const activeTags = new Set();
const filterSamples = () => {
const query = searchInput ? searchInput.value.toLowerCase().trim() : "";
let visibleCount = 0;
cards.forEach(card => {
const title = card.getAttribute('data-title') || "";
const desc = card.getAttribute('data-desc') || "";
const sampleFilters = card.getAttribute('data-sample-filters') || "";
const cardTagsArray = sampleFilters ? sampleFilters.split(',') : [];
const matchesSearch = title.includes(query) || desc.includes(query) || sampleFilters.includes(query);
// Match all selected tags (AND logic)
const matchesTag = activeTags.size === 0 || Array.from(activeTags).every(tag => cardTagsArray.includes(tag));
if (matchesSearch && matchesTag) {
card.classList.add('visible');
visibleCount++;
} else {
card.classList.remove('visible');
}
});
emptyState.style.display = visibleCount === 0 ? 'block' : 'none';
};
// Bind search
if (searchInput) {
searchInput.addEventListener('input', filterSamples);
}
// Bind tag toggles
tagButtons.forEach(btn => {
btn.addEventListener('click', (e) => {
const selectedTag = e.currentTarget.getAttribute('data-tag');
if (selectedTag === 'all') {
// Reset filters
activeTags.clear();
tagButtons.forEach(b => b.classList.remove('active'));
e.currentTarget.classList.add('active');
} else {
// Toggle individual tag
if (activeTags.has(selectedTag)) {
activeTags.delete(selectedTag);
e.currentTarget.classList.remove('active');
} else {
activeTags.add(selectedTag);
e.currentTarget.classList.add('active');
}
// Update 'All' button state
if (btnAll) {
if (activeTags.size === 0) {
btnAll.classList.add('active');
} else {
btnAll.classList.remove('active');
}
}
}
filterSamples();
});
});
});
</script>

View File

@@ -0,0 +1,155 @@
/**
* Custom Layout Interactivity
* Handles dynamic offsets, DOM repositioning, and UI enhancements.
*/
document.addEventListener('DOMContentLoaded', function() {
// ==========================================================================
// DYNAMIC STYLES INJECTION
// ==========================================================================
var styleTag = document.createElement('style');
styleTag.innerHTML = `
.td-navbar .dropdown-menu {
z-index: 9999 !important;
}
.theme-banner-wrapper {
position: sticky;
z-index: 20;
padding-top: 15px;
padding-bottom: 5px;
margin-bottom: 2rem;
background-color: var(--bs-body-bg, #ffffff);
}
.theme-migration-banner {
background-color: #ebf3fc;
border: 1px solid #80a7e9;
color: #1c3a6b;
border-radius: 4px;
padding: 15px;
text-align: center;
width: 100%;
box-shadow: 0 4px 6px rgba(0,0,0,0.05);
}
.theme-migration-banner a {
color: #4484f4;
text-decoration: underline;
font-weight: bold;
}
/* DARK MODE STYLING */
html[data-bs-theme="dark"] .theme-banner-wrapper,
body.dark .theme-banner-wrapper,
html.dark-mode .theme-banner-wrapper {
background-color: var(--bs-body-bg, #20252b);
}
html[data-bs-theme="dark"] .theme-migration-banner,
body.dark .theme-migration-banner,
html.dark-mode .theme-migration-banner {
background-color: #1a273b;
color: #e6efff;
box-shadow: 0 4px 6px rgba(0,0,0,0.3);
}
html[data-bs-theme="dark"] .theme-migration-banner a,
body.dark .theme-migration-banner a,
html.dark-mode .theme-migration-banner a {
color: #80a7e9;
}
@media (prefers-color-scheme: dark) {
html:not([data-bs-theme="light"]):not(.light) .theme-banner-wrapper {
background-color: var(--bs-body-bg, #20252b);
}
html:not([data-bs-theme="light"]):not(.light) .theme-migration-banner {
background-color: #1a273b;
color: #e6efff;
box-shadow: 0 4px 6px rgba(0,0,0,0.3);
}
html:not([data-bs-theme="light"]):not(.light) .theme-migration-banner a {
color: #80a7e9;
}
}
/* Disable Sticky Banner on Mobile */
@media (max-width: 991.98px) {
.theme-banner-wrapper {
position: relative !important;
top: auto !important;
z-index: 1;
}
}
`;
document.head.appendChild(styleTag);
// ==========================================================================
// MIGRATION BANNER & HEADER OFFSET CALCULATOR
// ==========================================================================
function updateHeaderOffset() {
var mainNav = document.querySelector('.td-navbar');
var secondaryNav = document.getElementById('secondary-nav');
var migrationWrapper = document.getElementById('migration-banner-wrapper');
var h1 = mainNav ? mainNav.offsetHeight : 0;
var h2 = secondaryNav ? secondaryNav.offsetHeight : 0;
var totalHeight = h1 + h2;
document.documentElement.style.setProperty('--header-offset', totalHeight + 'px');
if (migrationWrapper) {
migrationWrapper.style.top = totalHeight + 'px';
}
}
// Create the Wrapper
var wrapper = document.createElement('div');
wrapper.id = 'migration-banner-wrapper';
wrapper.className = 'theme-banner-wrapper';
// Create the Banner
var banner = document.createElement('div');
banner.className = 'theme-migration-banner';
banner.innerHTML = '⚠️ <strong>Archived Docs:</strong> Visit <a href="https://mcp-toolbox.dev/">mcp-toolbox.dev</a> for the latest version.';
wrapper.appendChild(banner);
// Inject the wrapper into the center information column
var contentArea = document.querySelector('.td-content') || document.querySelector('main');
if (contentArea) {
contentArea.prepend(wrapper);
} else {
console.warn("Could not find the main content column to inject the banner.");
}
// Initialize the dynamic offset
updateHeaderOffset();
// Re-calculate on window resize
window.addEventListener('resize', updateHeaderOffset);
// Use ResizeObserver to detect header height changes
if (window.ResizeObserver) {
const ro = new ResizeObserver(updateHeaderOffset);
const navToWatch = document.querySelector('.td-navbar');
const secNavToWatch = document.getElementById('secondary-nav');
if (navToWatch) ro.observe(navToWatch);
if (secNavToWatch) ro.observe(secNavToWatch);
}
// ==========================================================================
// BREADCRUMBS REPOSITIONING
// ==========================================================================
var breadcrumbs = document.querySelector('.td-breadcrumbs') || document.querySelector('nav[aria-label="breadcrumb"]');
var pageTitle = document.querySelector('.td-content h1');
if (breadcrumbs && pageTitle) {
pageTitle.parentNode.insertBefore(breadcrumbs, pageTitle);
breadcrumbs.style.marginTop = "1rem";
breadcrumbs.style.marginBottom = "2rem";
}
});

View File

@@ -0,0 +1,98 @@
document.addEventListener('DOMContentLoaded', function() {
// Setup CSS for the wrapper and the banner
var styleTag = document.createElement('style');
styleTag.innerHTML = `
.td-navbar .dropdown-menu {
z-index: 9999 !important;
}
.theme-banner-wrapper {
position: sticky;
z-index: 20;
padding-top: 15px; /* This is your gap! */
padding-bottom: 5px; /* Breathing room below the banner */
/* Uses Bootstrap's native body background variable, with white as fallback */
background-color: var(--bs-body-bg, #ffffff);
}
.theme-migration-banner {
background-color: #ebf3fc;
border: 1px solid #80a7e9;
color: #1c3a6b;
border-radius: 4px;
padding: 15px;
text-align: center;
width: 100%;
box-shadow: 0 4px 6px rgba(0,0,0,0.05);
}
.theme-migration-banner a {
color: #4484f4;
text-decoration: underline;
font-weight: bold;
}
/* DARK MODE STYLING */
html[data-bs-theme="dark"] .theme-banner-wrapper,
body.dark .theme-banner-wrapper,
html.dark-mode .theme-banner-wrapper {
/* Uses Docsy's dark mode background fallback if var fails */
background-color: var(--bs-body-bg, #20252b);
}
html[data-bs-theme="dark"] .theme-migration-banner,
body.dark .theme-migration-banner,
html.dark-mode .theme-migration-banner {
background-color: #1a273b;
color: #e6efff;
box-shadow: 0 4px 6px rgba(0,0,0,0.3);
}
html[data-bs-theme="dark"] .theme-migration-banner a,
body.dark .theme-migration-banner a,
html.dark-mode .theme-migration-banner a {
color: #80a7e9;
}
/* Fallback for OS-level dark mode */
@media (prefers-color-scheme: dark) {
html:not([data-bs-theme="light"]):not(.light) .theme-banner-wrapper {
background-color: var(--bs-body-bg, #20252b);
}
html:not([data-bs-theme="light"]):not(.light) .theme-migration-banner {
background-color: #1a273b;
color: #e6efff;
box-shadow: 0 4px 6px rgba(0,0,0,0.3);
}
html:not([data-bs-theme="light"]):not(.light) .theme-migration-banner a {
color: #80a7e9;
}
}
`;
document.head.appendChild(styleTag);
// Create the Wrapper
var wrapper = document.createElement('div');
wrapper.id = 'migration-banner-wrapper';
wrapper.className = 'theme-banner-wrapper';
// Create the Banner
var banner = document.createElement('div');
banner.className = 'theme-migration-banner';
banner.innerHTML = '⚠️ <strong>Archived Docs:</strong> Visit <a href="https://mcp-toolbox.dev/">mcp-toolbox.dev</a> for the latest version.';
wrapper.appendChild(banner);
// Inject the wrapper into the center information column
var contentArea = document.querySelector('.td-content') || document.querySelector('main');
if (contentArea) {
contentArea.prepend(wrapper);
} else {
console.warn("Could not find the main content column to inject the banner.");
}
// Calculate navbar height synchronously to correctly offset the sticky wrapper
var navbar = document.querySelector('.td-navbar');
var navbarHeight = navbar ? navbar.offsetHeight : 64;
wrapper.style.top = navbarHeight + 'px';
});

View File

@@ -21,25 +21,26 @@ https://cloud-run-url.app/
https://xxx.cloud.dgraph.io/
https://cloud.dgraph.io/login
https://dgraph.io/docs
https://play.dgraph.io/
# MySQL Community downloads and main site (often protected by bot mitigation)
https://dev.mysql.com/downloads/installer/
https://www.mysql.com/
^https?://(.*\.)?mysql\.com/.*
# Claude desktop download link
https://claude.ai/download
# Google Cloud Run product page
https://cloud.google.com/run
https://cloud.google.com/run/*
https://console.cloud.google.com/*
# These specific deep links are known to cause redirect loops or 403s in automated scrapers
https://dev.mysql.com/doc/refman/8.4/en/sql-prepared-statements.html
https://dev.mysql.com/doc/refman/8.4/en/user-names.html
# npmjs links can occasionally trigger rate limiting during high-frequency CI builds
https://www.npmjs.com/package/@toolbox-sdk/core
https://www.npmjs.com/package/@toolbox-sdk/adk
^https?://(www\.)?npmjs\.com/.*
https://www.oceanbase.com/
# Ignore social media and blog profiles to reduce external request overhead
https://medium.com/@mcp_toolbox
https://medium.com/@mcp_toolbox

1
AGENTS.md Symbolic link
View File

@@ -0,0 +1 @@
GEMINI.md

View File

@@ -1,5 +1,165 @@
# Changelog
## [0.31.0](https://github.com/googleapis/genai-toolbox/compare/v0.30.0...v0.31.0) (2026-03-26)
### ⚠ BREAKING CHANGES
* release upgraded docsite ([#2831](https://github.com/googleapis/genai-toolbox/issues/2831))
* **http:** sanitize non-2xx error output ([#2654](https://github.com/googleapis/genai-toolbox/issues/2654))
* add a new `enable-api` flag ([#2846](https://github.com/googleapis/genai-toolbox/issues/2846))
* remove deprecations and update tools-file flag ([#2806](https://github.com/googleapis/genai-toolbox/issues/2806))
### Features
* Add a new `enable-api` flag ([#2846](https://github.com/googleapis/genai-toolbox/issues/2846)) ([7a070da](https://github.com/googleapis/genai-toolbox/commit/7a070dae4f1833671649ea605f36659675d402a9))
* **auth:** Add generic `authService` type for MCP ([#2619](https://github.com/googleapis/genai-toolbox/issues/2619)) ([f6678f8](https://github.com/googleapis/genai-toolbox/commit/f6678f8e29aa3346f4f73ce33cec37b4753d6947))
* **auth:** Add Protected Resource Metadata endpoint ([#2698](https://github.com/googleapis/genai-toolbox/issues/2698)) ([b53dcf2](https://github.com/googleapis/genai-toolbox/commit/b53dcf20694599f8b961c501a532bd122630b6f4))
* **auth:** Support manual PRM override ([#2717](https://github.com/googleapis/genai-toolbox/issues/2717)) ([283e4e3](https://github.com/googleapis/genai-toolbox/commit/283e4e33172571e4b20fa6a3ea0cfc632a565e6a))
* **dataplex:** Add support for lookup context tool. ([#2744](https://github.com/googleapis/genai-toolbox/issues/2744)) ([facb69d](https://github.com/googleapis/genai-toolbox/commit/facb69d01fe0c7ff9e2e1c40804dd00762e508a6))
* Remove deprecations and update tools-file flag ([#2806](https://github.com/googleapis/genai-toolbox/issues/2806)) ([ab64c95](https://github.com/googleapis/genai-toolbox/commit/ab64c9514a467d92a4547eda5a4ecdd08f86b0c9))
### Bug Fixes
* **ci:** Remove search index generation from preview deployment workflow ([#2859](https://github.com/googleapis/genai-toolbox/issues/2859)) ([f8891b8](https://github.com/googleapis/genai-toolbox/commit/f8891b82fcaaef240e1031cd9f784749d91d4210))
* **docs:** Skip empty folders in pagination & reduce PR comment noise ([#2853](https://github.com/googleapis/genai-toolbox/issues/2853)) ([9ebd93a](https://github.com/googleapis/genai-toolbox/commit/9ebd93a8ecb9bae673aa77a859803629fc7a4e1d))
* **http:** Sanitize non-2xx error output ([#2654](https://github.com/googleapis/genai-toolbox/issues/2654)) ([5bef954](https://github.com/googleapis/genai-toolbox/commit/5bef954507c8e23b6c9b0eb2551265e4be32b452))
* **skills:** Fix integer parameter parsing through agent skills ([#2847](https://github.com/googleapis/genai-toolbox/issues/2847)) ([4564efe](https://github.com/googleapis/genai-toolbox/commit/4564efe75436b4081d9f3d1f7c912bc64c13f850))
### Documentation
* Release upgraded docsite ([#2831](https://github.com/googleapis/genai-toolbox/issues/2831)) ([5b25ce0](https://github.com/googleapis/genai-toolbox/commit/5b25ce081235b21c884e27057cd4a2fa4d0d7c0e))
## [0.30.0](https://github.com/googleapis/genai-toolbox/compare/v0.29.0...v0.30.0) (2026-03-20)
### Features
* **cli:** Add migrate subcommand ([#2679](https://github.com/googleapis/genai-toolbox/issues/2679)) ([12171f7](https://github.com/googleapis/genai-toolbox/commit/12171f7a02bcd34ce647db10abdb79bb2dac7ace))
* **cli:** Add serve subcommand ([#2550](https://github.com/googleapis/genai-toolbox/issues/2550)) ([1e2c7c7](https://github.com/googleapis/genai-toolbox/commit/1e2c7c7804c67bebf5e2ee9b67c6feb6f05292fd))
* **skill:** One skill per toolset ([#2733](https://github.com/googleapis/genai-toolbox/issues/2733)) ([5b85c65](https://github.com/googleapis/genai-toolbox/commit/5b85c65960dba9bfaf4cadca6d44532a153976e1))
* **source/oracledb:** Add Oracle DB for MCP tools and configurations, updated tools and documentation ([#2625](https://github.com/googleapis/genai-toolbox/issues/2625)) ([e350fc7](https://github.com/googleapis/genai-toolbox/commit/e350fc7879182aaf592a70c3509ed061164b3913))
* **tools/looker:** Support git_branch tools for looker. ([#2718](https://github.com/googleapis/genai-toolbox/issues/2718)) ([70ed8a0](https://github.com/googleapis/genai-toolbox/commit/70ed8a0dcb8e654b748a6e3e1c5ef283c26006da))
* **tools/dataplex-search-entries:** Add `scope` support to search_entries tool ([#2740](https://github.com/googleapis/genai-toolbox/issues/2740)) ([10af468](https://github.com/googleapis/genai-toolbox/commit/10af4682ccd51070463604124293968944d05017))
### Bug Fixes
* **cloudloggingadmin:** Increase log injesting time and add auth test ([#2772](https://github.com/googleapis/genai-toolbox/issues/2772)) ([50b4457](https://github.com/googleapis/genai-toolbox/commit/50b4457095ec4ac881b3b12719da24d35141f65d))
* **oracle:** Normalize encoded proxy usernames in go-ora DSN ([#2469](https://github.com/googleapis/genai-toolbox/issues/2469)) ([b1333cd](https://github.com/googleapis/genai-toolbox/commit/b1333cd27117655f8ab09f222721e14bea74b487))
* **postgres:** Update execute-sql tool to avoid multi-statements parameter ([#2707](https://github.com/googleapis/genai-toolbox/issues/2707)) ([58bc772](https://github.com/googleapis/genai-toolbox/commit/58bc772f882f0d9e00f403e73fbec812dd8a03ac))
* **skills:** Improve flag validation and silence unit test output ([#2759](https://github.com/googleapis/genai-toolbox/issues/2759)) ([f3da6aa](https://github.com/googleapis/genai-toolbox/commit/f3da6aa5e23b609a1ac9ecc098bccea02f2388ab))
* **test:** Address flaky healthcare integration test run ([#2742](https://github.com/googleapis/genai-toolbox/issues/2742)) ([9590821](https://github.com/googleapis/genai-toolbox/commit/9590821bc7d86c5cbacd29b21d4f85b427a87db4))
### Reverts
* **ci:** Implement conditional sharding logic in integration tests ([#2763](https://github.com/googleapis/genai-toolbox/issues/2763)) ([1528d7c](https://github.com/googleapis/genai-toolbox/commit/1528d7c38dfaa30bdecbe59c79ba926fa6d18356))
## [0.29.0](https://github.com/googleapis/genai-toolbox/compare/v0.28.0...v0.29.0) (2026-03-13)
### ⚠ BREAKING CHANGES
* **source/alloydb:** restructure prebuilt toolsets ([#2639](https://github.com/googleapis/genai-toolbox/issues/2639))
* **source/spanner:** restructure prebuilt toolsets ([#2641](https://github.com/googleapis/genai-toolbox/issues/2641))
* **source/dataplex:** restructure prebuilt toolsets ([#2640](https://github.com/googleapis/genai-toolbox/issues/2640))
* **source/oss-db:** restructure prebuilt toolsets ([#2638](https://github.com/googleapis/genai-toolbox/issues/2638))
* **source/cloudsql:** restructure prebuilt toolsets ([#2635](https://github.com/googleapis/genai-toolbox/issues/2635))
* **source/bigquery:** restructure prebuilt toolsets ([#2637](https://github.com/googleapis/genai-toolbox/issues/2637))
* **source/firestore:** restructure prebuilt toolsets ([#2636](https://github.com/googleapis/genai-toolbox/issues/2636))
* telemetry metrics updates as per semantic convention ([#2566](https://github.com/googleapis/genai-toolbox/issues/2566))
### Features
* Add user agent to embeddings generation ([#2572](https://github.com/googleapis/genai-toolbox/issues/2572)) ([287251a](https://github.com/googleapis/genai-toolbox/commit/287251a0cfed4d24617e5d0d957026a94f65d820))
* **skill:** Attach user agent metadata for generated skill ([#2697](https://github.com/googleapis/genai-toolbox/issues/2697)) ([9598a6a](https://github.com/googleapis/genai-toolbox/commit/9598a6a32597b9c9abdb0f20c06d86a01b0d011f))
* **skills:** Add additional-notes flag to generate skills command ([#2696](https://github.com/googleapis/genai-toolbox/issues/2696)) ([73bf962](https://github.com/googleapis/genai-toolbox/commit/73bf962459b76872f748248bb5e289be232a30b6))
* **skill:** Update skill generation logic ([#2646](https://github.com/googleapis/genai-toolbox/issues/2646)) ([c233eee](https://github.com/googleapis/genai-toolbox/commit/c233eee98cd9621526cb286245f3874f5bd6e7da))
* **source/alloydb:** Restructure prebuilt toolsets ([#2639](https://github.com/googleapis/genai-toolbox/issues/2639)) ([5f3f063](https://github.com/googleapis/genai-toolbox/commit/5f3f063fc7335e47e35fa1a4f93616abbd7959d5))
* **source/bigquery:** Restructure prebuilt toolsets ([#2637](https://github.com/googleapis/genai-toolbox/issues/2637)) ([dc984ba](https://github.com/googleapis/genai-toolbox/commit/dc984badd79f54ff423713a763648c6a6880a640))
* **sources/bigquery:** Support custom oauth header name ([#2564](https://github.com/googleapis/genai-toolbox/issues/2564)) ([d3baf77](https://github.com/googleapis/genai-toolbox/commit/d3baf77d61ab30d97edc93587e6f0365b8523fee))
* **source/cloudsql:** Restructure prebuilt toolsets ([#2635](https://github.com/googleapis/genai-toolbox/issues/2635)) ([99613dc](https://github.com/googleapis/genai-toolbox/commit/99613dcc7a06bd3a2324d20e1ef41404cf6fd9d5))
* **source/dataplex:** Restructure prebuilt toolsets ([#2640](https://github.com/googleapis/genai-toolbox/issues/2640)) ([acb9a80](https://github.com/googleapis/genai-toolbox/commit/acb9a80cf2438e04c76cf10267b1c9ca9227da0b))
* **source/firestore:** Restructure prebuilt toolsets ([#2636](https://github.com/googleapis/genai-toolbox/issues/2636)) ([22ab7b9](https://github.com/googleapis/genai-toolbox/commit/22ab7b9365eab21bfa04da64574fadbd0746f669))
* **source/oss-db:** Restructure prebuilt toolsets ([#2638](https://github.com/googleapis/genai-toolbox/issues/2638)) ([5196c6a](https://github.com/googleapis/genai-toolbox/commit/5196c6a78eb256ec83d847385c69bfebece48c87))
* **source/spanner:** Restructure prebuilt toolsets ([#2641](https://github.com/googleapis/genai-toolbox/issues/2641)) ([ea2b698](https://github.com/googleapis/genai-toolbox/commit/ea2b698b03517c400bbaef27f56c4d3abead8b2c))
* Telemetry metrics updates as per semantic convention ([#2566](https://github.com/googleapis/genai-toolbox/issues/2566)) ([131d764](https://github.com/googleapis/genai-toolbox/commit/131d764f895c14908e29914b3c0c273d91a2654f))
* **tools/mongodb:** Add tool annotations to MongoDB tools for improved LLM understanding ([#2219](https://github.com/googleapis/genai-toolbox/issues/2219)) ([b7a5f80](https://github.com/googleapis/genai-toolbox/commit/b7a5f80b42b3c1564870e2868aeab87d82a85d39))
* **tools/serverless-spark:** Add get_session_template tool ([#2308](https://github.com/googleapis/genai-toolbox/issues/2308)) ([a136e16](https://github.com/googleapis/genai-toolbox/commit/a136e169b3551a14b081624d7f50e1c32f0fb857))
* **tools/serverless-spark:** Add list/get sessions tools ([#2576](https://github.com/googleapis/genai-toolbox/issues/2576)) ([a554298](https://github.com/googleapis/genai-toolbox/commit/a554298535444671228fc08f6e3139d199a8b6b4))
### Bug Fixes
* Improve list locks integration test for postgres ([#2279](https://github.com/googleapis/genai-toolbox/issues/2279)) ([d9ebe5d](https://github.com/googleapis/genai-toolbox/commit/d9ebe5d4bf1b7ca04cae47386b36c38ca5b77b8a))
* **mcp:** Guard nil SSE session lookup and return 400 for missing session ([#2681](https://github.com/googleapis/genai-toolbox/issues/2681)) ([f66189f](https://github.com/googleapis/genai-toolbox/commit/f66189fe43cb711da3a041fa31edbacd7bbc7153))
* **oracle:** Update oracle-execute-sql tool interface to match source signature ([#2627](https://github.com/googleapis/genai-toolbox/issues/2627)) ([81699a3](https://github.com/googleapis/genai-toolbox/commit/81699a375b7e5af37945f4124aa4c5f2a1a9f7a6))
* Return AllParams for GetParameter() for tools with templateParameter([#2734](https://github.com/googleapis/genai-toolbox/issues/2734)) ([bfd7ba6](https://github.com/googleapis/genai-toolbox/commit/bfd7ba601a52294fa71623d88af71bd0288bf887))
* **server/mcp:** Scope defer span.End inside loop iteration ([#2558](https://github.com/googleapis/genai-toolbox/issues/2558)) ([c88a62d](https://github.com/googleapis/genai-toolbox/commit/c88a62dcf4c16118ae706cc43d18cad827e7496d)), closes [#2549](https://github.com/googleapis/genai-toolbox/issues/2549)
* **skill:** Fix env variable propagation ([#2645](https://github.com/googleapis/genai-toolbox/issues/2645)) ([5271368](https://github.com/googleapis/genai-toolbox/commit/52713687208994c423da64333cb0a04fb483f794))
* **sources/looker:** Looker and looker-dev prebuilt tools should share one source definition. ([#2620](https://github.com/googleapis/genai-toolbox/issues/2620)) ([df7f2fd](https://github.com/googleapis/genai-toolbox/commit/df7f2fd7d5b75211dbbbd471c84f0ec5097ca7ad))
* **telemetry:** Histogram buckets from OTel standard to MCP standards ([#2729](https://github.com/googleapis/genai-toolbox/issues/2729)) ([87cd4a0](https://github.com/googleapis/genai-toolbox/commit/87cd4a0bf48605225ef25ca554cc787def976d11))
* **ui:** Remove module from script ([#2703](https://github.com/googleapis/genai-toolbox/issues/2703)) ([6943ab6](https://github.com/googleapis/genai-toolbox/commit/6943ab6839d21da7b6a4241700c7891c6f4a9b2c))
* Update toolset attributes naming ([#2554](https://github.com/googleapis/genai-toolbox/issues/2554)) ([3d6ae4e](https://github.com/googleapis/genai-toolbox/commit/3d6ae4eeaf5acfbde83374a244573edd8fc9012b))
## [0.28.0](https://github.com/googleapis/genai-toolbox/compare/v0.27.0...v0.28.0) (2026-03-02)
### Features
* Add polling system to dynamic reloading ([#2466](https://github.com/googleapis/genai-toolbox/issues/2466)) ([fcaac9b](https://github.com/googleapis/genai-toolbox/commit/fcaac9bb957226ee3db1baea24330f337ba88ab7))
* Added basic template for sdks doc migrate ([#1961](https://github.com/googleapis/genai-toolbox/issues/1961)) ([87f2eaf](https://github.com/googleapis/genai-toolbox/commit/87f2eaf79cdecca7b939151e1543eccf2f812a69))
* **dataproc:** Add dataproc source and list/get clusters/jobs tools ([#2407](https://github.com/googleapis/genai-toolbox/issues/2407)) ([cc05e57](https://github.com/googleapis/genai-toolbox/commit/cc05e5745d1c25a6088702b827cd098250164b7e))
* **sources/postgres:** Add configurable pgx query execution mode ([#2477](https://github.com/googleapis/genai-toolbox/issues/2477)) ([57b77bc](https://github.com/googleapis/genai-toolbox/commit/57b77bca09ce6ee260bd64af9be5fcef593e9acb))
* **sources/redis:** Add TLS support for Redis connections ([#2432](https://github.com/googleapis/genai-toolbox/issues/2432)) ([d6af290](https://github.com/googleapis/genai-toolbox/commit/d6af2907fd2dca5a6751d7d42090dd7ebb8ccd48))
* **tools/looker:** Enable Get All Lookml Tests, Run LookML Tests, and Create View From Table tools for Looker ([#2522](https://github.com/googleapis/genai-toolbox/issues/2522)) ([e01139a](https://github.com/googleapis/genai-toolbox/commit/e01139a90268f8587b9823be1157259c1bcbfd66))
* **tools/looker:** Tools to list/create/delete directories ([#2488](https://github.com/googleapis/genai-toolbox/issues/2488)) ([0036d8c](https://github.com/googleapis/genai-toolbox/commit/0036d8c35844c3de2079cb5b2479781e8938525b))
* **ui:** Make tool list panel resizable ([#2253](https://github.com/googleapis/genai-toolbox/issues/2253)) ([276cf60](https://github.com/googleapis/genai-toolbox/commit/276cf604a2bb41861639ed6881557e38dd97a614))
### Bug Fixes
* **ci:** Add path for forked PR unit test runs ([#2540](https://github.com/googleapis/genai-toolbox/issues/2540)) ([04dd2a7](https://github.com/googleapis/genai-toolbox/commit/04dd2a77603c7babf01da724dfb77808e3f25fe5))
* Deflake alloydb omni ([#2431](https://github.com/googleapis/genai-toolbox/issues/2431)) ([62b8309](https://github.com/googleapis/genai-toolbox/commit/62b830987d65c3573214d04e50742476097ee9e9))
* **docs/adk:** Resolve dependency duplication ([#2418](https://github.com/googleapis/genai-toolbox/issues/2418)) ([4d44abb](https://github.com/googleapis/genai-toolbox/commit/4d44abb4638926ca50b0fa4dcf10a03e7fab657f))
* **docs/langchain:** Fix core at 0.3.0 and align compatible dependencies ([#2426](https://github.com/googleapis/genai-toolbox/issues/2426)) ([36edfd3](https://github.com/googleapis/genai-toolbox/commit/36edfd3d506e839c092d04cbca1799b5ebc38160))
* Enforce required validation for explicit null parameter values ([#2519](https://github.com/googleapis/genai-toolbox/issues/2519)) ([d5e9512](https://github.com/googleapis/genai-toolbox/commit/d5e9512a237e658f9b9127fdd8c174ec023c3310))
* **oracle:** Enable DML operations and resolve incorrect array type error ([#2323](https://github.com/googleapis/genai-toolbox/issues/2323)) ([72146a4](https://github.com/googleapis/genai-toolbox/commit/72146a4b1605bcdd3e1038106bfb1f899e677e39))
* **server/mcp:** Guard nil dereference in sseManager.get ([#2557](https://github.com/googleapis/genai-toolbox/issues/2557)) ([e534196](https://github.com/googleapis/genai-toolbox/commit/e534196303c2b8d9b6e599ac25add337e6fc9b8f)), closes [#2548](https://github.com/googleapis/genai-toolbox/issues/2548)
* **tests/postgres:** Implement uuid-based isolation and reliable resource cleanup ([#2377](https://github.com/googleapis/genai-toolbox/issues/2377)) ([8a96fb1](https://github.com/googleapis/genai-toolbox/commit/8a96fb1a8874baa3688e566f3dea8a0912fcf2df))
* **tests/postgres:** Restore list_schemas test and implement dynamic owner ([#2521](https://github.com/googleapis/genai-toolbox/issues/2521)) ([7041e79](https://github.com/googleapis/genai-toolbox/commit/7041e797347f337d6f7f44ca051ae31acd58babe))
* **tests:** Resolve LlamaIndex dependency conflict in JS quickstart ([#2597](https://github.com/googleapis/genai-toolbox/issues/2597)) ([ac11f5a](https://github.com/googleapis/genai-toolbox/commit/ac11f5af9c7bcf228d667e1b8e08b5dc49ad91a0))
## [0.27.0](https://github.com/googleapis/genai-toolbox/compare/v0.26.0...v0.27.0) (2026-02-12)
### ⚠ BREAKING CHANGES
* Update configuration file v2 ([#2369](https://github.com/googleapis/genai-toolbox/issues/2369))([293c1d6](https://github.com/googleapis/genai-toolbox/commit/293c1d6889c39807855ba5e01d4c13ba2a4c50ce))
* Update/add detailed telemetry for mcp endpoint compliant with OTEL semantic convention ([#1987](https://github.com/googleapis/genai-toolbox/issues/1987)) ([478a0bd](https://github.com/googleapis/genai-toolbox/commit/478a0bdb59288c1213f83862f95a698b4c2c0aab))
### Features
* **cli/invoke:** Add support for direct tool invocation from CLI ([#2353](https://github.com/googleapis/genai-toolbox/issues/2353)) ([6e49ba4](https://github.com/googleapis/genai-toolbox/commit/6e49ba436ef2390c13feaf902b29f5907acffb57))
* **cli/skills:** Add support for generating agent skills from toolset ([#2392](https://github.com/googleapis/genai-toolbox/issues/2392)) ([80ef346](https://github.com/googleapis/genai-toolbox/commit/80ef34621453b77bdf6a6016c354f102a17ada04))
* **cloud-logging-admin:** Add source, tools, integration test and docs ([#2137](https://github.com/googleapis/genai-toolbox/issues/2137)) ([252fc30](https://github.com/googleapis/genai-toolbox/commit/252fc3091af10d25d8d7af7e047b5ac87a5dd041))
* **cockroachdb:** Add CockroachDB integration with cockroach-go ([#2006](https://github.com/googleapis/genai-toolbox/issues/2006)) ([1fdd99a](https://github.com/googleapis/genai-toolbox/commit/1fdd99a9b609a5e906acce414226ff44d75d5975))
* **prebuiltconfigs/alloydb-omni:** Implement Alloydb omni dataplane tools ([#2340](https://github.com/googleapis/genai-toolbox/issues/2340)) ([e995349](https://github.com/googleapis/genai-toolbox/commit/e995349ea0756c700d188b8f04e9459121219f0c))
* **server:** Add Tool call error categories ([#2387](https://github.com/googleapis/genai-toolbox/issues/2387)) ([32cb4db](https://github.com/googleapis/genai-toolbox/commit/32cb4db712d27579c1bf29e61cbd0bed02286c28))
* **tools/looker:** support `looker-validate-project` tool ([#2430](https://github.com/googleapis/genai-toolbox/issues/2430)) ([a15a128](https://github.com/googleapis/genai-toolbox/commit/a15a12873f936b0102aeb9500cc3bcd71bb38c34))
### Bug Fixes
* **dataplex:** Capture GCP HTTP errors in MCP Toolbox ([#2347](https://github.com/googleapis/genai-toolbox/issues/2347)) ([1d7c498](https://github.com/googleapis/genai-toolbox/commit/1d7c4981164c34b4d7bc8edecfd449f57ad11e15))
* **sources/cockroachdb:** Update kind to type ([#2465](https://github.com/googleapis/genai-toolbox/issues/2465)) ([2d341ac](https://github.com/googleapis/genai-toolbox/commit/2d341acaa61c3c1fe908fceee8afbd90fb646d3a))
* Surface Dataplex API errors in MCP results ([#2347](https://github.com/googleapis/genai-toolbox/pull/2347))([1d7c498](https://github.com/googleapis/genai-toolbox/commit/1d7c4981164c34b4d7bc8edecfd449f57ad11e15))
## [0.26.0](https://github.com/googleapis/genai-toolbox/compare/v0.25.0...v0.26.0) (2026-01-22)

1
CLAUDE.md Symbolic link
View File

@@ -0,0 +1 @@
GEMINI.md

View File

@@ -66,153 +66,16 @@ You can manually trigger the bot by commenting on your Pull Request:
1. Provide a good PR description as a record of what change is being made and why it was made. Link to a GitHub issue if it exists.
1. Make sure your code is thoroughly tested with unit tests and integration tests. Remember to clean up the test instances properly in your code to avoid memory leaks.
## Adding a New Database Source or Tool
## Implementation Guides
Please create an
[issue](https://github.com/googleapis/genai-toolbox/issues) before
implementation to ensure we can accept the contribution and no duplicated work.
This issue should include an overview of the API design. If you have any
questions, reach out on our [Discord](https://discord.gg/Dmm69peqjh) to chat
directly with the team.
For technical details on how to implement new features, please refer to the
[Developer Documentation](./DEVELOPER.md).
> [!NOTE]
> New tools can be added for [pre-existing data
> sources](https://github.com/googleapis/genai-toolbox/tree/main/internal/sources).
> However, any new database source should also include at least one new tool
> type.
### Adding a New Database Source
We recommend looking at an [example source
implementation](https://github.com/googleapis/genai-toolbox/blob/main/internal/sources/postgres/postgres.go).
* **Create a new directory** under `internal/sources` for your database type
(e.g., `internal/sources/newdb`).
* **Define a configuration struct** for your data source in a file named
`newdb.go`. Create a `Config` struct to include all the necessary parameters
for connecting to the database (e.g., host, port, username, password, database
name) and a `Source` struct to store necessary parameters for tools (e.g.,
Name, Type, connection object, additional config).
* **Implement the
[`SourceConfig`](https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/internal/sources/sources.go#L57)
interface**. This interface requires two methods:
* `SourceConfigType() string`: Returns a unique string identifier for your
data source (e.g., `"newdb"`).
* `Initialize(ctx context.Context, tracer trace.Tracer) (Source, error)`:
Creates a new instance of your data source and establishes a connection to
the database.
* **Implement the
[`Source`](https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/internal/sources/sources.go#L63)
interface**. This interface requires one method:
* `SourceType() string`: Returns the same string identifier as `SourceConfigType()`.
* **Implement `init()`** to register the new Source.
* **Implement Unit Tests** in a file named `newdb_test.go`.
### Adding a New Tool
> [!NOTE]
> Please follow the tool naming convention detailed
> [here](./DEVELOPER.md#tool-naming-conventions).
We recommend looking at an [example tool
implementation](https://github.com/googleapis/genai-toolbox/tree/main/internal/tools/postgres/postgressql).
Remember to keep your PRs small. For example, if you are contributing a new Source, only include one or two core Tools within the same PR, the rest of the Tools can come in subsequent PRs.
* **Create a new directory** under `internal/tools` for your tool type (e.g., `internal/tools/newdb/newdbtool`).
* **Define a configuration struct** for your tool in a file named `newdbtool.go`.
Create a `Config` struct and a `Tool` struct to store necessary parameters for
tools.
* **Implement the
[`ToolConfig`](https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/internal/tools/tools.go#L61)
interface**. This interface requires one method:
* `ToolConfigType() string`: Returns a unique string identifier for your tool
(e.g., `"newdb-tool"`).
* `Initialize(sources map[string]Source) (Tool, error)`: Creates a new
instance of your tool and validates that it can connect to the specified
data source.
* **Implement the `Tool` interface**. This interface requires the following
methods:
* `Invoke(ctx context.Context, params map[string]any) ([]any, error)`:
Executes the operation on the database using the provided parameters.
* `ParseParams(data map[string]any, claims map[string]map[string]any)
(ParamValues, error)`: Parses and validates the input parameters.
* `Manifest() Manifest`: Returns a manifest describing the tool's capabilities
and parameters.
* `McpManifest() McpManifest`: Returns an MCP manifest describing the tool for
use with the Model Context Protocol.
* `Authorized(services []string) bool`: Checks if the tool is authorized to
run based on the provided authentication services.
* **Implement `init()`** to register the new Tool.
* **Implement Unit Tests** in a file named `newdbtool_test.go`.
### Adding Integration Tests
* **Add a test file** under a new directory `tests/newdb`.
* **Add pre-defined integration test suites** in the
`/tests/newdb/newdb_integration_test.go` that are **required** to be run as
long as your code contains related features. Please check each test suites for
the config defaults, if your source require test suites config updates, please
refer to [config option](./tests/option.go):
1. [RunToolGetTest][tool-get]: tests for the `GET` endpoint that returns the
tool's manifest.
2. [RunToolInvokeTest][tool-call]: tests for tool calling through the native
Toolbox endpoints.
3. [RunMCPToolCallMethod][mcp-call]: tests tool calling through the MCP
endpoints.
4. (Optional) [RunExecuteSqlToolInvokeTest][execute-sql]: tests an
`execute-sql` tool for any source. Only run this test if you are adding an
`execute-sql` tool.
5. (Optional) [RunToolInvokeWithTemplateParameters][temp-param]: tests for [template
parameters][temp-param-doc]. Only run this test if template
parameters apply to your tool.
* **Add additional tests** for the tools that are not covered by the predefined tests. Every tool must be tested!
* **Add the new database to the integration test workflow** in
[integration.cloudbuild.yaml](.ci/integration.cloudbuild.yaml).
[tool-get]:
https://github.com/googleapis/genai-toolbox/blob/v0.23.0/tests/tool.go#L41
[tool-call]:
https://github.com/googleapis/genai-toolbox/blob/v0.23.0/tests/tool.go#L229
[mcp-call]:
https://github.com/googleapis/genai-toolbox/blob/v0.23.0/tests/tool.go#L789
[execute-sql]:
https://github.com/googleapis/genai-toolbox/blob/v0.23.0/tests/tool.go#L609
[temp-param]:
https://github.com/googleapis/genai-toolbox/blob/v0.23.0/tests/tool.go#L454
[temp-param-doc]:
https://googleapis.github.io/genai-toolbox/resources/tools/#template-parameters
### Adding Documentation
* **Update the documentation** to include information about your new data source
and tool. This includes:
* Adding a new page to the `docs/en/resources/sources` directory for your data
source.
* Adding a new page to the `docs/en/resources/tools` directory for your tool.
* **(Optional) Add samples** to the `docs/en/samples/<newdb>` directory.
### (Optional) Adding Prebuilt Tools
You can provide developers with a set of "build-time" tools to aid common
software development user journeys like viewing and creating tables/collections
and data.
* **Create a set of prebuilt tools** by defining a new `tools.yaml` and adding
it to `internal/tools`. Make sure the file name matches the source (i.e. for
source "alloydb-postgres" create a file named "alloydb-postgres.yaml").
* **Update `cmd/root.go`** to add new source to the `prebuilt` flag.
* **Add tests** in
[internal/prebuiltconfigs/prebuiltconfigs_test.go](internal/prebuiltconfigs/prebuiltconfigs_test.go)
and [cmd/root_test.go](cmd/root_test.go).
* [Adding a New Database Source](./DEVELOPER.md#adding-a-new-database-source)
* [Adding a New Tool](./DEVELOPER.md#adding-a-new-tool)
* [Adding Integration Tests](./DEVELOPER.md#adding-integration-tests)
* [Adding Documentation](./DEVELOPER.md#adding-documentation)
* [Adding Prebuilt Tools](./DEVELOPER.md#adding-prebuilt-tools)
## Submitting a Pull Request

View File

@@ -50,7 +50,7 @@ This section details the purpose and conventions for MCP Toolbox's tools naming
properties, **tool name** and **tool type**.
```
kind: tools
kind: tool
name: cancel_hotel <- tool name
type: postgres-sql <- tool type
source: my_pg_source
@@ -89,6 +89,207 @@ The following guidelines apply to tool types:
`list-collections`).
* Changes to tool type are breaking changes and should be avoided.
### Tool Invocation & Error Handling
To align with the Model Context Protocol (MCP) and ensure robust agentic workflows, Toolbox distinguishes between errors the agent can fix and errors that require developer intervention.
#### Error Categorization
When implementing `Invoke()` or `ParseParams()`, you must return the appropriate error type from `internal/util/errors.go`. This allows the LLM to attempt a "self-correct" for Agent Errors while signaling a hard stop for Server Errors.
| Category | Description | HTTP Status | MCP Result |
|---|---|---|---|
| **Agent Error** (`AgentError`) | Input/Execution logic errors (e.g., SQL syntax, missing records, invalid params). The agent can fix this. | 200 OK | `isError: true` |
| **Server Error** (`ClientServerError`) | Infrastructure failures (e.g., DB down, auth failure, network failure). The agent cannot fix this. | 500 Internal Error | JSON-RPC Error |
#### Implementation Guidelines
**Use Typed Errors**: Refactor or implement the `Tool` interface methods to return `util.ToolboxError`.
**In `Invoke()`:**
* **Agent Error**: Wrap database driver errors (syntax, constraint violations) in `AgentError`.
* **Server Error**: Wrap connection failures or internal logic crashes in `ClientServerError`.
**In `ParseParams()`:**
* Return `ToolboxError` for missing required parameters or wrong types.
* Return `ClientServerError` for failures in resolving authenticated parameters (e.g., invalid tokens).
**Example:**
func (t *MyTool) Invoke(ctx context.Context, sp tools.SourceProvider, params parameters.ParamValues, token tools.AccessToken) (any, util.ToolboxError) {
res, err := t.db.Exec(ctx, params.SQL)
if err != nil {
// Driver error is likely a syntax issue the LLM can fix
return nil, util.NewAgentError("error executing SQL query", err)
}
return res, nil
}
## Implementation Guides
### Adding a New Database Source or Tool
Please create an
[issue](https://github.com/googleapis/genai-toolbox/issues) before
implementation to ensure we can accept the contribution and no duplicated work.
This issue should include an overview of the API design. If you have any
questions, reach out on our [Discord](https://discord.gg/Dmm69peqjh) to chat
directly with the team.
> [!NOTE]
> New tools can be added for [pre-existing data
> sources](https://github.com/googleapis/genai-toolbox/tree/main/internal/sources).
> However, any new database source should also include at least one new tool
> type.
#### Adding a New Database Source
We recommend looking at an [example source
implementation](https://github.com/googleapis/genai-toolbox/blob/main/internal/sources/postgres/postgres.go).
* **Create a new directory** under `internal/sources` for your database type
(e.g., `internal/sources/newdb`).
* **Define a configuration struct** for your data source in a file named
`newdb.go`. Create a `Config` struct to include all the necessary parameters
for connecting to the database (e.g., host, port, username, password, database
name) and a `Source` struct to store necessary parameters for tools (e.g.,
Name, Type, connection object, additional config).
* **Implement the
[`SourceConfig`](https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/internal/sources/sources.go#L57)
interface**. This interface requires two methods:
* `SourceConfigType() string`: Returns a unique string identifier for your
data source (e.g., `"newdb"`).
* `Initialize(ctx context.Context, tracer trace.Tracer) (Source, error)`:
Creates a new instance of your data source and establishes a connection to
the database.
* **Implement the
[`Source`](https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/internal/sources/sources.go#L63)
interface**. This interface requires one method:
* `SourceType() string`: Returns the same string identifier as `SourceConfigType()`.
* **Implement `init()`** to register the new Source.
* **Implement Unit Tests** in a file named `newdb_test.go`.
#### Adding a New Tool
> [!NOTE]
> Please follow the tool naming convention detailed
> [here](#tool-naming-conventions).
We recommend looking at an [example tool
implementation](https://github.com/googleapis/genai-toolbox/tree/main/internal/tools/postgres/postgressql).
Remember to keep your PRs small. For example, if you are contributing a new Source, only include one or two core Tools within the same PR, the rest of the Tools can come in subsequent PRs.
* **Create a new directory** under `internal/tools` for your tool type (e.g., `internal/tools/newdb/newdbtool`).
* **Define a configuration struct** for your tool in a file named `newdbtool.go`.
Create a `Config` struct and a `Tool` struct to store necessary parameters for
tools.
* **Implement the
[`ToolConfig`](https://github.com/googleapis/genai-toolbox/blob/fd300dc606d88bf9f7bba689e2cee4e3565537dd/internal/tools/tools.go#L61)
interface**. This interface requires one method:
* `ToolConfigType() string`: Returns a unique string identifier for your tool
(e.g., `"newdb-tool"`).
* `Initialize(sources map[string]Source) (Tool, error)`: Creates a new
instance of your tool and validates that it can connect to the specified
data source.
* **Implement the `Tool` interface**. This interface requires the following
methods:
* `Invoke(ctx context.Context, params map[string]any) ([]any, error)`:
Executes the operation on the database using the provided parameters.
* `ParseParams(data map[string]any, claims map[string]map[string]any)
(ParamValues, error)`: Parses and validates the input parameters.
* `Manifest() Manifest`: Returns a manifest describing the tool's capabilities
and parameters.
* `McpManifest() McpManifest`: Returns an MCP manifest describing the tool for
use with the Model Context Protocol.
* `Authorized(services []string) bool`: Checks if the tool is authorized to
run based on the provided authentication services.
* **Implement `init()`** to register the new Tool.
* **Implement Unit Tests** in a file named `newdbtool_test.go`.
#### Adding Integration Tests
* **Add a test file** under a new directory `tests/newdb`.
* **Add pre-defined integration test suites** in the
`/tests/newdb/newdb_integration_test.go` that are **required** to be run as
long as your code contains related features. Please check each test suites for
the config defaults, if your source require test suites config updates, please
refer to [config option](./tests/option.go):
1. [RunToolGetTest][tool-get]: tests for the `GET` endpoint that returns the
tool's manifest.
2. [RunToolInvokeTest][tool-call]: tests for tool calling through the native
Toolbox endpoints.
3. [RunMCPToolCallMethod][mcp-call]: tests tool calling through the MCP
endpoints.
4. (Optional) [RunExecuteSqlToolInvokeTest][execute-sql]: tests an
`execute-sql` tool for any source. Only run this test if you are adding an
`execute-sql` tool.
5. (Optional) [RunToolInvokeWithTemplateParameters][temp-param]: tests for [template
parameters][temp-param-doc]. Only run this test if template
parameters apply to your tool.
* **Add additional tests** for the tools that are not covered by the predefined tests. Every tool must be tested!
* **Add the new database to the integration test workflow** in
[integration.cloudbuild.yaml](.ci/integration.cloudbuild.yaml).
[tool-get]:
https://github.com/googleapis/genai-toolbox/blob/v0.23.0/tests/tool.go#L41
[tool-call]:
https://github.com/googleapis/genai-toolbox/blob/v0.23.0/tests/tool.go#L229
[mcp-call]:
https://github.com/googleapis/genai-toolbox/blob/v0.23.0/tests/tool.go#L789
[execute-sql]:
https://github.com/googleapis/genai-toolbox/blob/v0.23.0/tests/tool.go#L609
[temp-param]:
https://github.com/googleapis/genai-toolbox/blob/v0.23.0/tests/tool.go#L454
[temp-param-doc]:
https://googleapis.github.io/genai-toolbox/resources/tools/#template-parameters
#### Adding Documentation
When updating documentation, you must adhere to the structural constraints enforced by our Diátaxis-based layout and internal linters:
* **Adding a New Data Source:**
* Create a new folder for your integration in the `docs/en/integrations/` directory (e.g., `docs/en/integrations/newdb/`).
* Create an empty `_index.md` file. This acts purely as a structural folder wrapper for Hugo. Do not add body content here.
* Create a `source.md` file. **This is the definitive guide.** Add all connection details, authentication, and YAML configurations here. Ensure you include the `{{< list-tools >}}` shortcode to dynamically display tools.
* **Adding a New Native Tool:**
* Create a nested `tools/` directory inside your source (e.g., `docs/en/integrations/newdb/tools/`).
* Create an empty `_index.md` file inside the `tools/` directory. **It must contain only frontmatter** and absolutely no markdown body text.
* Add the tool details in a `<tool_name>.md` file in this new `tools/` folder. Ensure you include the `{{< compatible-sources >}}` shortcode.
* **Adding Inherited/Shared Tools (e.g., Managed Databases):**
* If a new database inherits tools from a base integration (like Cloud SQL inheriting Postgres tools), create the `tools/` directory with an `_index.md` file.
* Map the inherited tools dynamically by adding the `shared_tools` YAML array to the frontmatter of this `tools/_index.md` file. **This file must strictly contain only frontmatter.**
* **Adding Samples:**
* **Physical Location:**
1. **Quickstarts:** `docs/en/documentation/getting-started/quickstart/`.
2. **Integration-Specific:** `docs/en/integrations/<db>/samples/`. Must include an `_index.md` with strictly only frontmatter.
3. **General:** `docs/en/samples/`.
* **Frontmatter Requirements (Maintenance):** To ensure samples appear correctly in the Samples Section, you must provide the following tags:
* `is_sample: true` - Required for indexing.
* `sample_filters:` - A YAML array used for UI filtering (e.g., `[postgres, go, sql]`).
* **Adding Top-Level Sections:** If you add a completely new top-level documentation directory (e.g., a new section alongside `integrations`, `documentation`), you **must** update the AI documentation layout files located at `.hugo/layouts/index.llms.txt` and `.hugo/layouts/index.llms-full.txt`. Specifically, update the "Diátaxis Narrative Framework" preamble so AI models understand the purpose of your new section.
#### Adding Prebuilt Tools
You can provide developers with a set of "build-time" tools to aid common
software development user journeys like viewing and creating tables/collections
and data.
* **Create a set of prebuilt tools** by defining a new `tools.yaml` and adding
it to `internal/tools`. Make sure the file name matches the source (i.e. for
source "alloydb-postgres" create a file named "alloydb-postgres.yaml").
* **Update `cmd/root.go`** to add new source to the `prebuilt` flag.
* **Add tests** in
[internal/prebuiltconfigs/prebuiltconfigs_test.go](internal/prebuiltconfigs/prebuiltconfigs_test.go)
and [cmd/root_test.go](cmd/root_test.go).
## Testing
### Infrastructure
@@ -99,12 +300,34 @@ project "toolbox-testing-438616".
### Linting
### Code Linting
Run the lint check to ensure code quality:
```bash
golangci-lint run --fix
```
### Documentation Structure Linting
To ensure consistency, we enforce a standardized structure for integration `Source` and `Tool` pages.
Before pushing changes to integration pages:
Run the **source page** linter to validate:
```bash
# From the repository root
./.ci/lint-docs-source-page.sh
```
Run the **tool page** linter to validate:
```bash
# From the repository root
./.ci/lint-docs-tool-page.sh
```
### Unit Tests
Execute unit tests locally:
@@ -248,6 +471,51 @@ We use **[lychee](https://github.com/lycheeverse/lychee-action)** for repository
## Developing Documentation
### Documentation Standards & CI Checks
To maintain consistency and prevent repository bloat, all pull requests must pass the automated documentation linters.
#### Source Page Structure (`integrations/**/source.md`)
When adding or updating a Source page, your markdown file must strictly adhere to the following architectural rules:
* **File Name:** The configuration guide must be named `source.md`. *(Note: `_index.md` files are purely structural folder wrappers. Do not add body content to them).*
* **LinkTitle:** The linkTitle has to be set to the string `Source` always.
* **Frontmatter:** The `title` field must end with the word "Source" (e.g., `title: "Firestore Source"`).
* **No H1 Headings:** Do not use H1 (`#`) tags in the markdown body. The page title is automatically generated from the frontmatter.
* **H2 Heading Hierarchy:** You must use H2 (`##`) headings in a strict, specific order.
* **Required Headings:** `About`, `Example`, `Reference`
* **Allowed Optional Headings:** `Available Tools`, `Requirements`, `Advanced Usage`, `Troubleshooting`, `Additional Resources`
* **Available Tools Shortcode:** If you include the `## Available Tools` heading, you must place the list-tools shortcode (e.g., `{{< list-tools >}}`) directly beneath it.
#### Tool Page Structure (`integrations/**/tools/*.md`)
When adding or updating a Tool page, your markdown file must strictly adhere to the following architectural rules:
* **Location:** Native tools must be placed inside a nested `tools/` directory.
* **Frontmatter:** The `title` field must end with the word "Tool" (e.g., `title: "execute-sql Tool"`).
* **No H1 Headings:** Do not use H1 (`#`) tags in the markdown body. The page title is automatically generated from the frontmatter.
* **H2 Heading Hierarchy:** You must use H2 (`##`) headings in a strict, specific order.
* **Required Headings:** `About`, `Example`
* **Allowed Optional Headings:** `Compatible Sources`, `Requirements`, `Parameters`, `Output Format`, `Reference`, `Advanced Usage`, `Troubleshooting`, `Additional Resources`
* **Compatible Sources Shortcode:** If you include the `## Compatible Sources` heading, you must place the compatible-sources shortcode (e.g., `{{< compatible-sources >}}`) directly beneath it.
#### Prebuilt Configuration Structure (`integrations/**/prebuilt-configs/*.md`)
To ensure new prebuilt configurations are automatically indexed by the `{{< list-prebuilt-configs >}}` shortcode on the main Prebuilt Configs page, follow these rules:
* **Location:** Always place documentation for prebuilt configurations in a nested directory named `prebuilt-configs/` inside the database folder (e.g., `docs/en/integrations/alloydb/prebuilt-configs/`).
* **Index Wrapper:** Every `prebuilt-configs/` directory must contain an `_index.md` file. This file acts as the anchor for the directory and must contain the `title` and `description` used in the automated lists.
* **Architecture-Based Mapping:** Map configurations to database folders based on the `kind` defined in the tool's YAML file (in `internal/prebuiltconfigs/tools/`). For example, any tool using the `postgres` kind should live in the `postgres/` integration directory.
#### Frontend Assets & Layouts
If you need to modify the visual appearance, navigation, or behavior of the documentation website itself, all frontend assets are isolated within the `.hugo/` directory.
#### Repository Asset Limits
* **Max File Size:** No individual file within the `docs/` directory may exceed 24MB. This prevents repository bloat and ensures fast clone times. If you need to include large assets (like high-resolution videos or massive PDFs), host them externally and link to them in the markdown.
### Running a Local Hugo Server
Follow these steps to preview documentation changes locally using a Hugo server:
@@ -267,19 +535,31 @@ Follow these steps to preview documentation changes locally using a Hugo server:
npm ci
```
1. **Start the Server:**
1. **Generate Search Index & Start the Server:** Because the Pagefind search engine requires physical files to build its index, `hugo server` (which runs purely in memory) will not display search results by default. To test the search bar locally, build the physical site once (using the development environment to avoid triggering production analytics), generate the index into the static folder, and then start the server:
```bash
hugo --environment development
npx pagefind --site public --output-path static/pagefind
hugo server
```
*(Note: The `static/pagefind/` directory is git-ignored to prevent committing local search indexes).*
### Previewing Documentation on Pull Requests
Documentation preview links are automatically generated and commented on your pull request when working from a branch within the main repository.
**For external contributors (forks):**
For security reasons, automated deployment previews are disabled for pull requests originating from external forks for the cloudflare deployments. To review your documentation changes, please follow the [Running a Local Hugo Server](#running-a-local-hugo-server) instructions to build and view the site on your local machine before requesting a review.
### Document Versioning Setup
There are 3 GHA workflows we use to achieve document versioning:
The documentation uses a dynamic versioning system that outputs standard HTML sites alongside AI-optimized plain text files (`llms.txt` and `llms-full.txt`).
1. **Deploy In-development docs:**
**Search Indexing:** All deployment workflows automatically execute `npx pagefind --site public` to generate a version-scoped search index specific to that deployment's base URL.
There are 6 GHA workflows we use to achieve document versioning (each deployment scenario has one workflow for GitHub Pages and one for Cloudflare Pages):
1. **Deploy In-development docs:**
This workflow is run on every commit merged into the main branch. It deploys
the built site to the `/dev/` subdirectory for the in-development
documentation.
@@ -314,6 +594,44 @@ preview link will be automatically added as a comment to your PR.
1. **Deploy Preview:** Apply the `docs: deploy-preview` label to the PR to
deploy a documentation preview.
### Shortcodes
This repository includes custom shortcodes to help with documentation consistency and maintenance.
For more information on how they work, see the [Hugo Shortcodes](https://gohugo.io/content-management/shortcodes/) documentation and the guide to [creating custom shortcodes](https://gohugo.io/templates/shortcode/).
#### `include` Shortcode
The `include` shortcode reads a file and optionally fences it with a language.
**Syntax:**
`{{< include "path/to/file" "language" >}}`
**Example:**
`{{< include "static/headers/license_header.txt" >}}`
`{{< include "samples/program.js" "javascript" >}}`
**Source:** [.hugo/layouts/shortcodes/include.html](.hugo/layouts/shortcodes/include.html)
#### `regionInclude` Shortcode
The `regionInclude` shortcode reads a file, extracts content between `[START region_name]` and `[END region_name]`, and optionally fences it.
**Syntax:**
`{{< regionInclude "path/to/file" "region_name" "language" >}}`
**Example Markdown:**
`{{< regionInclude "samples/program.js" "program_setup" "javascript" >}}`
**Example Code Snippet (`samples/program.js`):**
```javascript
// [START program_setup]
import { Toolbox } from '@googleapis/genai-toolbox';
const toolbox = new Toolbox();
// [END program_setup]
```
**Source:** [.hugo/layouts/shortcodes/regionInclude.html](.hugo/layouts/shortcodes/regionInclude.html)
## Building Toolbox
### Building the Binary
@@ -374,12 +692,6 @@ this team from MDB Group, `senseai-eco`. Additionally, database-specific GitHub
teams (e.g., `@googleapis/toolbox-alloydb`) have been created from MDB groups to
manage code ownership and review for individual database products.
Team `@googleapis/toolbox-contributors` has write access to this repo. They
can create branches and approve test runs. But they do not have the ability
to approve PRs for main. TeamSync is used to create this team from the MDB
Group `toolbox-contributors`. Googlers who are developing for MCP-Toolbox
but aren't part of the core team should join this group.
### Issue/PR Triage and SLO
After an issue is created, maintainers will assign the following labels:
* `Priority` (defaulted to P0)
@@ -501,3 +813,4 @@ Trigger pull request tests for external contributors by:
* (Suspended) .github/sync-repo-settings.yaml - configure repo settings
* .github/release-please.yml - Creates GitHub releases
* .github/ISSUE_TEMPLATE - templates for GitHub issues

243
GEMINI.md Normal file
View File

@@ -0,0 +1,243 @@
# MCP Toolbox Context & Style Guide
This file (symlinked as `CLAUDE.md`, `AGENTS.md`, and `.gemini/styleguide.md`) provides context and guidelines for AI agents working on the MCP Toolbox for Databases project. It summarizes key information from `CONTRIBUTING.md` and `DEVELOPER.md`.
## Project Overview
**MCP Toolbox for Databases** is a Go-based project designed to provide Model Context Protocol (MCP) tools for various data sources and services. It allows Large Language Models (LLMs) to interact with databases and other tools safely and efficiently.
## Tech Stack
- **Language:** Go (1.23+)
- **Documentation:** Hugo (Extended Edition v0.146.0+)
- **Containerization:** Docker
- **CI/CD:** GitHub Actions, Google Cloud Build
- **Linting:** `golangci-lint`
## Key Directories
- `cmd/`: Application entry points.
- `internal/sources/`: Implementations of database sources (e.g., Postgres, BigQuery).
- `internal/tools/`: Implementations of specific tools for each source.
- `tests/`: Integration tests.
- `docs/en`: Project documentation. Separated logically into:
- `documentation/`: Documentation and concepts (Section I).
- `integrations/`: Reference architectures for DB connectivity and tools (Section II).
- `samples/`: Tutorials and code samples (Section III).
- `reference/`: CLI info and FAQs (Section IV).
## Development Workflow
### Prerequisites
- Go 1.23 or later.
- Docker (for building container images and running some tests).
- Access to necessary Google Cloud resources for integration testing (if applicable).
### Building and Running
1. **Build Binary:** `go build -o toolbox`
2. **Run Server:** `go run .` (Listens on port 5000 by default)
3. **Run with Help:** `go run . --help`
4. **Test Endpoint:** `curl http://127.0.0.1:5000`
### Testing
- **Unit Tests:** `go test -race -v ./cmd/... ./internal/...`
- **Integration Tests:**
- Run specific source tests: `go test -race -v ./tests/<source_dir>`
- Example: `go test -race -v ./tests/alloydbpg`
- Add new sources to `.ci/integration.cloudbuild.yaml`
- **Linting:** `golangci-lint run --fix`
## Developing Documentation
### Prerequisites
- Hugo (Extended Edition v0.146.0+)
- Node.js (for `npm ci`)
### Running Local Server
1. Navigate to `.hugo` directory: `cd .hugo`
2. Install dependencies: `npm ci`
3. **Generate Search Index:** Because Pagefind requires physical files, `hugo server` alone will not populate the search bar. Build the local index first (using the development environment to block analytics) by running:
`hugo --environment development && npx pagefind --site public --output-path static/pagefind`
4. Start server: `hugo server`
### Versioning Workflows
Documentation builds automatically generate standard HTML alongside AI-friendly text files (`llms.txt` and `llms-full.txt`).
There are 6 workflows in total, handling parallel deployments to both GitHub Pages and Cloudflare Pages. **All deployment workflows automatically execute `npx pagefind --site public` to generate version-scoped search indexes.**
1. **Deploy In-development docs**: Commits merged to `main` deploy to the `/dev/` path. Automatically defaults to version `Dev`.
2. **Deploy Versioned Docs**: New GitHub releases deploy to `/<version>/` and the root path. The release tag is automatically injected into the build as the documentation version. *(Note: Developers must manually add the new version to the `[[params.versions]]` dropdown array in `hugo.toml` prior to merging a release PR).*
3. **Deploy Previous Version Docs**: A manual workflow to rebuild older versions by explicitly passing the target tag via the GitHub Actions UI.
## Coding Conventions
### Tool Naming
- **Tool Name:** `snake_case` (e.g., `list_collections`, `run_query`).
- Do *not* include the product name (e.g., avoid `firestore_list_collections`).
- **Tool Type:** `kebab-case` (e.g., `firestore-list-collections`).
- *Must* include the product name.
### Branching and Commits
- **Branch Naming:** `feat/`, `fix/`, `docs/`, `chore/` (e.g., `feat/add-gemini-md`).
- **Commit Messages:** [Conventional Commits](https://www.conventionalcommits.org/) format.
- Format: `<type>(<scope>): <description>`
- Example: `feat(source/postgres): add new connection option`
- Types: `feat`, `fix`, `docs`, `chore`, `test`, `ci`, `refactor`, `revert`, `style`.
### PR Title Format
Format: `<type>[optional scope]: <description>`
- **Example:** `feat(source/postgres): add support for "new-field" field`
- **Example (Breaking Change):** `fix(tool/sql)!: change default parameter value`
#### Types
| Type | Description | Version change affected |
| :--- | :--- | :--- |
| **BREAKING CHANGE** | Anything with this type or a `!` after the type/scope introduces a breaking API change. E.g. `fix!: description` or `feat!: description`. | major |
| **feat** | Adding a new feature to the codebase. | minor |
| **fix** | Fixing a bug or typo in the codebase. | patch |
| **ci** | Changes made to the continuous integration configuration files or scripts (usually the yml and other configuration files). | n/a |
| **docs** | Documentations-related PRs, including fixes on docs. | n/a |
| **chore** | Other small tasks or updates that don't fall into any of the types above. | n/a |
| **perf** | changed src code, with improvement of performance metrics. | n/a |
| **refactor** | Change src code but unlike feat, there are no tests broken and no lines lost coverage. | n/a |
| **revert** | Revert changes made in another commit. | n/a |
| **style** | updated src code, with only formatting and whitespace updates. In other words, this includes anything a code formatter or linter changes. | n/a |
| **test** | Changes made to test files. | n/a |
| **build** | Changes related to build of the projects and dependency. | n/a |
#### Scopes
PRs addressing a specific source or tool should **always** add the source or tool name as scope.
The scope is formatted as `<type>/<kind>`. Common scopes include:
- `source/postgres`, `source/cloudsql-mysql`
- `tool/mssql-sql`, `tool/list-tables`
- `auth/google`
**Multiple Scopes:**
- If the PR covers multiple scopes of the same kind, separate them with a comma: `feat(source/postgres,source/alloydbpg): ...`.
- If the PR covers multiple scope types (e.g., adding a new database source and tool), disregard the scope type prefix: `feat(new-db): adding support for new-db source and tool`.
#### PR Description
Every PR must include a description that follows the repository's template:
**1. Description**
A concise description of the changes (bug or feature), its impact, and a summary of the solution.
**2. PR Checklist**
- [ ] Make sure to open an issue as a bug/issue before writing your code!
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)
- [ ] Make sure to add `!` if this involves a breaking change
**3. Issue Reference**
Use the format: `Fixes #<issue_number> 🦕`
## Adding New Features
### Adding a New Data Source
1. Create a new directory: `internal/sources/<newdb>`.
2. Define `Config` and `Source` structs in `internal/sources/<newdb>/<newdb>.go`.
3. Implement `SourceConfig` interface (`SourceConfigType`, `Initialize`).
4. Implement `Source` interface (`SourceType`).
5. Implement `init()` to register the source.
6. Add unit tests in `internal/sources/<newdb>/<newdb>_test.go`.
### Adding a New Tool
1. Create a new directory: `internal/tools/<newdb>/<toolname>`.
2. Define `Config` and `Tool` structs.
3. Implement `ToolConfig` interface (`ToolConfigType`, `Initialize`).
4. Implement `Tool` interface (`Invoke`, `ParseParams`, `Manifest`, `McpManifest`, `Authorized`).
5. Implement `init()` to register the tool.
6. Add unit tests.
### Adding Documentation
- **For a new source:** Add source documentation to `docs/en/integrations/<source_name>/source.md`. Ensure the root `_index.md` file contains **strictly only frontmatter** and no markdown body text.
- **For a new native tool:** Add tool documentation to `docs/en/integrations/<source_name>/tools/<tool_name>.md`. Ensure the `tools/_index.md` file contains **strictly only frontmatter**.
- **Adding Integration Samples:** Add integration-specific samples to `docs/en/integrations/<source_name>/samples/`. Ensure the `samples/_index.md` file contains **strictly only frontmatter**.
- **Tool Inheritance (Shared Tools):** Managed databases (e.g., Cloud SQL Postgres) that use the tools of their underlying engine (e.g., Postgres) map their inherited tools by utilizing the `shared_tools` frontmatter parameter inside their `tools/_index.md` file. This file must contain only frontmatter.
- **New Top-Level Directories:** If adding a completely new top-level section to the documentation site, you must update the "Diátaxis Narrative Framework" section inside both `.hugo/layouts/index.llms.txt` and `.hugo/layouts/index.llms-full.txt` to keep the AI context synced with the site structure.
#### Integration Documentation Rules
When generating or editing documentation for this repository, you must strictly adhere to the following CI-enforced rules. Failure to do so will break the build.
##### Source Page Constraints (`integrations/**/source.md`)
1. **File Naming:** The primary connection guide for a source must be named `source.md`. Use `_index.md` solely as an empty structural folder wrapper containing **only YAML frontmatter**.
2. **LinkTitle:** The linkTitle has to be set to the string `Source` always.
3. **Title Convention:** The YAML frontmatter `title` must always end with "Source" (e.g., `title: "Postgres Source"`).
4. **No H1 Tags:** Never generate H1 (`#`) headings in the markdown body.
5. **Strict H2 Ordering:** You must use the following H2 (`##`) headings in this exact sequence.
* `## About` (Required)
* `## Available Tools` (Optional)
* `## Requirements` (Optional)
* `## Example` (Required)
* `## Reference` (Required)
* `## Advanced Usage` (Optional)
* `## Troubleshooting` (Optional)
* `## Additional Resources` (Optional)
6. **Shortcode Placement:** If you generate the `## Available Tools` section, you must include the `{{< list-tools >}}` shortcode beneath it.
##### Tool Page Constraints (`integrations/**/tools/*.md`)
1. **Location:** All native tools must reside inside a nested `tools/` subdirectory. The `tools/` directory must contain an `_index.md` file consisting **strictly of frontmatter**.
2. **Title Convention:** The YAML frontmatter `title` must always end with "Tool" (e.g., `title: "Execute SQL Tool"`).
3. **No H1 Tags:** Never generate H1 (`#`) headings in the markdown body.
4. **Strict H2 Ordering:** You must use the following H2 (`##`) headings in this exact sequence.
* `## About` (Required)
* `## Compatible Sources` (Optional)
* `## Requirements` (Optional)
* `## Parameters` (Optional)
* `## Example` (Required)
* `## Output Format` (Optional)
* `## Reference` (Optional)
* `## Advanced Usage` (Optional)
* `## Troubleshooting` (Optional)
* `## Additional Resources` (Optional)
5. **Shortcode Placement:** If you generate the `## Compatible Sources` section, you must include the `{{< compatible-sources >}}` shortcode beneath it.
##### Samples Architecture Constraints
Sample code is aggregated visually in the UI via the Samples section, but the physical markdown files are distributed logically based on their scope.
1. **Quickstarts:** `docs/en/documentation/getting-started/`
2. **Integration-Specific Samples:** `docs/en/integrations/<source_name>/samples/`. (The `samples/_index.md` wrapper must contain **strictly only frontmatter**).
3. **General/Cross-Category Samples:** `docs/en/samples/`
##### Samples Maintenance Rules
1. **Filtering:** Always include `sample_filters` in the frontmatter. Use specific tags for:
* Data Source (e.g., `bigquery`, `alloydb`)
* Language (e.g., `python`, `js`, `go`)
* Tool Type (e.g., `mcp`, `sdk`)
2. **Metadata:** Ensure `is_sample: true` is present to prevent the sample from being excluded from the Samples Gallery.
##### Prebuilt Config Constraints (`integrations/**/prebuilt-configs/*.md`)
1. **Naming & Path:** All prebuilt config docs must reside in `prebuilt-configs/`.
2. **Shortcode Requirement:** The main `documentation/configuration/prebuilt-configs/_index.md` page uses the `{{< list-prebuilt-configs >}}` shortcode, which only detects directories named exactly `prebuilt-configs`.
3. **YAML Mapping:** Always verify the `kind` of the data source in `internal/prebuiltconfigs/tools/` before choosing the integration folder.
##### Asset Constraints (`docs/`)
1. **File Size Limits:** Never add files larger than 24MB to the `docs/` directory.

558
README.md
View File

@@ -1,128 +1,222 @@
<div align="center">
![logo](./logo.png)
# MCP Toolbox for Databases
<a href="https://trendshift.io/repositories/13019" target="_blank"><img src="https://trendshift.io/api/badge/repositories/13019" alt="googleapis%2Fgenai-toolbox | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
[![Docs](https://img.shields.io/badge/docs-MCP_Toolbox-blue)](https://googleapis.github.io/genai-toolbox/)
[![Go Report Card](https://goreportcard.com/badge/github.com/googleapis/genai-toolbox)](https://goreportcard.com/report/github.com/googleapis/genai-toolbox)
[![License: Apache
2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
[![Docs](https://img.shields.io/badge/Docs-MCP_Toolbox-blue)](https://googleapis.github.io/genai-toolbox/)
[![Discord](https://img.shields.io/badge/Discord-%235865F2.svg?style=flat&logo=discord&logoColor=white)](https://discord.gg/Dmm69peqjh)
[![Medium](https://img.shields.io/badge/Medium-12100E?style=flat&logo=medium&logoColor=white)](https://medium.com/@mcp_toolbox)
[![Go Report Card](https://goreportcard.com/badge/github.com/googleapis/genai-toolbox)](https://goreportcard.com/report/github.com/googleapis/genai-toolbox)
[![Python SDK](https://img.shields.io/pypi/v/toolbox-core?logo=python&logoColor=white&label=Python%20SDK)](https://pypi.org/project/toolbox-core/)
[![JS/TS SDK](https://img.shields.io/npm/v/@toolbox-sdk/core?logo=javascript&logoColor=white&label=JS%20SDK)](https://www.npmjs.com/package/@toolbox-sdk/core)
[![Go SDK](https://img.shields.io/github/v/release/googleapis/mcp-toolbox-sdk-go?logo=go&logoColor=white&label=Go%20SDK)](https://pkg.go.dev/github.com/googleapis/mcp-toolbox-sdk-go)
[![Java SDK](https://img.shields.io/maven-central/v/com.google.cloud.mcp/mcp-toolbox-sdk-java?logo=apache-maven&logoColor=white&label=Java%20SDK)](https://mvnrepository.com/artifact/com.google.cloud.mcp/mcp-toolbox-sdk-java)
</div>
MCP Toolbox for Databases is an open source Model Context Protocol (MCP) server that connects your AI agents, IDEs, and applications directly to your enterprise databases.
<p align="center">
<img src="docs/en/documentation/introduction/architecture.png" alt="architecture" width="50%"/>
</p>
It serves a **dual purpose**:
1. **Ready-to-use MCP Server (Build-Time):** Instantly connect Gemini CLI, Google Antigravity, Claude Code, Codex, or other MCP clients to your databases using our *prebuilt generic tools*. Talk to your data, explore schemas, and generate code without writing boilerplate.
2. **Custom Tools Framework (Run-Time):** A robust framework to build specialized, highly secure AI tools for your production agents. Define structured queries, semantic search, and NL2SQL capabilities safely and easily.
This README provides a brief overview. For comprehensive details, see the [full documentation](https://googleapis.github.io/genai-toolbox/).
> [!NOTE]
> MCP Toolbox for Databases is currently in beta, and may see breaking
> changes until the first stable release (v1.0).
MCP Toolbox for Databases is an open source MCP server for databases. It enables
you to develop tools easier, faster, and more securely by handling the complexities
such as connection pooling, authentication, and more.
This README provides a brief overview. For comprehensive details, see the [full
documentation](https://googleapis.github.io/genai-toolbox/).
> [!NOTE]
> This solution was originally named “Gen AI Toolbox for Databases” as
> its initial development predated MCP, but was renamed to align with recently
> added MCP compatibility.
> This solution was originally named “Gen AI Toolbox for Databases” (github.com/googleapis/genai-toolbox) as its initial development predated MCP, but was renamed to align with the MCP compatibility.
<!-- TOC ignore:true -->
## Table of Contents
<!-- TOC -->
- [Why Toolbox?](#why-toolbox)
- [General Architecture](#general-architecture)
- [Getting Started](#getting-started)
- [Installing the server](#installing-the-server)
- [Running the server](#running-the-server)
- [Integrating your application](#integrating-your-application)
- [Using Toolbox with Gemini CLI Extensions](#using-toolbox-with-gemini-cli-extensions)
- [Configuration](#configuration)
- [Sources](#sources)
- [Tools](#tools)
- [Toolsets](#toolsets)
- [Prompts](#prompts)
- [Why MCP Toolbox?](#why-mcp-toolbox)
- [Quick Start: Prebuilt Tools](#quick-start-prebuilt-tools)
- [Quick Start: Custom Tools](#quick-start-custom-tools)
- [Install & Run the Toolbox server](#install--run-the-toolbox-server)
- [Connect to Toolbox](#connect-to-toolbox)
- [MCP Client](#mcp-client)
- [Toolbox SDKs: Integrate with your Application](#toolbox-sdks-integrate-with-your-application)
- [Additional Features](#additional-features)
- [Versioning](#versioning)
- [Pre-1.0.0 Versioning](#pre-100-versioning)
- [Post-1.0.0 Versioning](#post-100-versioning)
- [Contributing](#contributing)
- [Community](#community)
<!-- /TOC -->
---
## Why Toolbox?
## Why MCP Toolbox?
Toolbox helps you build Gen AI tools that let your agents access data in your
database. Toolbox provides:
- **Out-of-the-Box Database Access:** Prebuilt generic tools for instant data exploration (e.g., `list_tables`, `execute_sql`) directly from your IDE or CLI.
- **Custom Tools Framework:** Build production-ready tools with your own predefined logic, ensuring safety through Restricted Access, Structured Queries, and Semantic Search.
- **Simplified Development:** Integrate tools into your Agent Development Kit (ADK), LangChain, LlamaIndex, or custom agents in less than 10 lines of code.
- **Better Performance:** Handles connection pooling, integrated auth (IAM), and end-to-end observability (OpenTelemetry) out of the box.
- **Enhanced Security**: Integrated authentication for more secure access to your data.
- **End-to-end Observability**: Out of the box metrics and tracing with built-in support for OpenTelemetry.
- **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.
---
**⚡ Supercharge Your Workflow with an AI Database Assistant ⚡**
## Quick Start: Prebuilt Tools
Stop context-switching and let your AI assistant become a true co-developer. By
[connecting your IDE to your databases with MCP Toolbox][connect-ide], you can
delegate complex and time-consuming database tasks, allowing you to build faster
and focus on what matters. This isn't just about code completion; it's about
giving your AI the context it needs to handle the entire development lifecycle.
Stop context-switching and let your AI assistant become a true co-developer. By connecting your IDE to your databases with MCP Toolbox, you can query your data in plain English, automate schema discovery and management, and generate database-aware code.
Heres how it will save you time:
You can use the Toolbox in any MCP-compatible IDE or client (e.g., Gemini CLI, Google Antigravity, Claude Code, Codex, etc.) by configuring the MCP server.
- **Query in Plain English**: Interact with your data using natural language
right from your IDE. Ask complex questions like, *"How many orders were
delivered in 2024, and what items were in them?"* without writing any SQL.
- **Automate Database Management**: Simply describe your data needs, and let the
AI assistant manage your database for you. It can handle generating queries,
creating tables, adding indexes, and more.
- **Generate Context-Aware Code**: Empower your AI assistant to generate
application code and tests with a deep understanding of your real-time
database schema. This accelerates the development cycle by ensuring the
generated code is directly usable.
- **Slash Development Overhead**: Radically reduce the time spent on manual
setup and boilerplate. MCP Toolbox helps streamline lengthy database
configurations, repetitive code, and error-prone schema migrations.
**Prebuilt tools are also conveniently available via the [Google Antigravity MCP Store](https://antigravity.google/docs/mcp) with a simple click-to-install experience.**
Learn [how to connect your AI tools (IDEs) to Toolbox using MCP][connect-ide].
1. Add the following to your client's MCP configuration file (usually `mcp.json` or `claude_desktop_config.json`):
[connect-ide]: https://googleapis.github.io/genai-toolbox/how-to/connect-ide/
```json
{
"mcpServers": {
"toolbox-postgres": {
"command": "npx",
"args": [
"-y",
"@toolbox-sdk/server",
"--prebuilt=postgres"
]
}
}
}
```
## General Architecture
2. Set the appropriate environment variables to connect, see the [Prebuilt Tools Reference](https://googleapis.github.io/genai-toolbox/reference/prebuilt-tools/).
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.
When you run Toolbox with a `--prebuilt=<database>` flag, you instantly get access to standard tools to interact with that database.
<p align="center">
<img src="./docs/en/getting-started/introduction/architecture.png" alt="architecture" width="50%"/>
</p>
Supported databases currently include:
- **Google Cloud:** AlloyDB, BigQuery, Cloud SQL (PostgreSQL, MySQL, SQL Server), Spanner, Firestore, Dataplex
- **Other Databases:** PostgreSQL, MySQL, SQL Server, Oracle, MongoDB, Redis, Elasticsearch, CockroachDB, ClickHouse, Couchbase, Neo4j, Snowflake, Trino, and more.
## Getting Started
For a full list of available tools and their capabilities across all supported databases, see the [Prebuilt Tools Reference](https://googleapis.github.io/genai-toolbox/reference/prebuilt-tools/).
### Quickstart: Running Toolbox using NPX
*See the [Install & Run the Toolbox server](#install--run-the-toolbox-server) section for different execution methods like Docker or binaries.*
You can run Toolbox directly with a [configuration file](#configuration):
```sh
npx @toolbox-sdk/server --tools-file tools.yaml
> [!TIP]
> For users looking for a managed solution, [Google Cloud MCP Servers](https://cloud.google.com/blog/products/databases/managed-mcp-servers-for-google-cloud-databases)
> provide a managed MCP experience with prebuilt tools; you can [learn more about the differences here](https://mcp-toolbox.dev/dev/reference/faq/).
---
## Quick Start: Custom Tools
Toolbox can also be used as a framework for customized tools.
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 `--config
tools.yaml` flag.
You can find more detailed reference documentation to all resource types in the
[Resources](https://googleapis.github.io/genai-toolbox/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
kind: source
name: my-pg-source
type: postgres
host: 127.0.0.1
port: 5432
database: toolbox_db
user: toolbox_user
password: my-password
```
This runs the latest version of the toolbox server with your configuration file.
For more details on configuring different types of sources, see the
[Sources](https://googleapis.github.io/genai-toolbox/resources/sources).
### Tools
The `tools` section of a `tools.yaml` define the actions an agent can take: what
type of tool it is, which source(s) it affects, what parameters it uses, etc.
```yaml
kind: tool
name: search-hotels-by-name
type: 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](https://googleapis.github.io/genai-toolbox/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 groups based on agent or application.
```yaml
kind: toolset
name: my_first_toolset
tools:
- my_first_tool
- my_second_tool
---
kind: toolset
name: my_second_toolset
tools:
- my_second_tool
- my_third_tool
```
### Prompts
The `prompts` section of a `tools.yaml` defines prompts that can be used for
interactions with LLMs.
```yaml
kind: prompt
name: code_review
description: "Asks the LLM to analyze code quality and suggest improvements."
messages:
- content: >
Please review the following code for quality, correctness,
and potential improvements: \n\n{{.code}}
arguments:
- name: "code"
description: "The code to review"
```
For more details on configuring prompts, see the
[Prompts](https://googleapis.github.io/genai-toolbox/resources/prompts).
---
## Install & Run the Toolbox server
You can run Toolbox directly with a [configuration file](#quick-start-custom-tools):
```sh
npx @toolbox-sdk/server --config tools.yaml
```
This runs the latest version of the Toolbox server with your configuration file.
> [!NOTE]
> This method should only be used for non-production use cases such as
> experimentation. For any production use-cases, please consider [Installing the
> server](#installing-the-server) and then [running it](#running-the-server).
> This method is optimized for convenience rather than performance.
> For a more standard and reliable installation, please use the binary
> or container image as described in [Install & Run the Toolbox server](#install--run-the-toolbox-server).
### Installing the server
### Install Toolbox
For the latest version, check the [releases page][releases] and use the
following instructions for your OS and CPU architecture.
@@ -142,7 +236,7 @@ To install Toolbox as a binary:
>
> ```sh
> # see releases page for other versions
> export VERSION=0.26.0
> export VERSION=0.31.0
> curl -L -o toolbox https://storage.googleapis.com/genai-toolbox/v$VERSION/linux/amd64/toolbox
> chmod +x toolbox
> ```
@@ -155,7 +249,7 @@ To install Toolbox as a binary:
>
> ```sh
> # see releases page for other versions
> export VERSION=0.26.0
> export VERSION=0.31.0
> curl -L -o toolbox https://storage.googleapis.com/genai-toolbox/v$VERSION/darwin/arm64/toolbox
> chmod +x toolbox
> ```
@@ -168,7 +262,7 @@ To install Toolbox as a binary:
>
> ```sh
> # see releases page for other versions
> export VERSION=0.26.0
> export VERSION=0.31.0
> curl -L -o toolbox https://storage.googleapis.com/genai-toolbox/v$VERSION/darwin/amd64/toolbox
> chmod +x toolbox
> ```
@@ -181,7 +275,7 @@ To install Toolbox as a binary:
>
> ```cmd
> :: see releases page for other versions
> set VERSION=0.26.0
> set VERSION=0.31.0
> curl -o toolbox.exe "https://storage.googleapis.com/genai-toolbox/v%VERSION%/windows/amd64/toolbox.exe"
> ```
>
@@ -193,7 +287,7 @@ To install Toolbox as a binary:
>
> ```powershell
> # see releases page for other versions
> $VERSION = "0.26.0"
> $VERSION = "0.31.0"
> curl.exe -o toolbox.exe "https://storage.googleapis.com/genai-toolbox/v$VERSION/windows/amd64/toolbox.exe"
> ```
>
@@ -206,7 +300,7 @@ You can also install Toolbox as a container:
```sh
# see releases page for other versions
export VERSION=0.26.0
export VERSION=0.31.0
docker pull us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:$VERSION
```
@@ -230,26 +324,36 @@ 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.26.0
go install github.com/googleapis/genai-toolbox@v0.31.0
```
<!-- {x-release-please-end} -->
</details>
<details>
<summary>Gemini CLI Extensions</summary>
To install Gemini CLI Extensions for MCP Toolbox, run the following command:
<summary>Gemini CLI</summary>
Check out the [Gemini CLI extensions](https://geminicli.com/extensions/) to install prebuilt tools for specific databases like AlloyDB, BigQuery, and Cloud SQL directly into Gemini CLI.
```sh
gemini extensions install https://github.com/gemini-cli-extensions/mcp-toolbox
# Install Gemini CLI
npm install -g @google/gemini-cli
# Install the extension
gemini extensions install https://github.com/gemini-cli-extensions/cloud-sql-postgres
# Run Gemini CLI
gemini
```
Interact with your custom tools using natural language through the Gemini CLI.
```sh
# Install the extension
gemini extensions install https://github.com/gemini-cli-extensions/mcp-toolbox
```
</details>
### Running the server
[Configure](#configuration) a `tools.yaml` to define your tools, and then
### Run Toolbox
[Configure](#quick-start-custom-tools) a `tools.yaml` to define your tools, and then
execute `toolbox` to start the server:
<details open>
@@ -258,7 +362,7 @@ execute `toolbox` to start the server:
To run Toolbox from binary:
```sh
./toolbox --tools-file "tools.yaml"
./toolbox --config "tools.yaml"
```
> ⓘ Note
@@ -271,14 +375,14 @@ To run Toolbox from binary:
<summary>Container image</summary>
To run the server after pulling the [container image](#installing-the-server):
To run the server after pulling the [container image](#install-toolbox):
```sh
export VERSION=0.24.0 # Use the version you pulled
docker run -p 5000:5000 \
-v $(pwd)/tools.yaml:/app/tools.yaml \
us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:$VERSION \
--tools-file "/app/tools.yaml"
--config "/app/tools.yaml"
```
> ⓘ Note
@@ -315,7 +419,7 @@ binary is available in your system path. You can start the server with the same
command:
```sh
toolbox --tools-file "tools.yaml"
toolbox --config "tools.yaml"
```
</details>
@@ -325,20 +429,26 @@ toolbox --tools-file "tools.yaml"
To run Toolbox directly without manually downloading the binary (requires Node.js):
```sh
npx @toolbox-sdk/server --tools-file tools.yaml
npx @toolbox-sdk/server --config tools.yaml
```
</details>
<details>
<summary>Gemini CLI</summary>
After installing a [Gemini CLI extensions](https://geminicli.com/extensions/), the prebuilt tools will be available during use.
```sh
# Run Gemini CLI
gemini
# List extensions
/exttensions list
# List MCP servers
/mcp list
```
</details>
<details>
<summary>Gemini CLI</summary>
Interact with your custom tools using natural language. Check
[gemini-cli-extensions/mcp-toolbox](https://github.com/gemini-cli-extensions/mcp-toolbox)
for more information.
</details>
You can use `toolbox help` for a full list of flags! To stop the server, send a
terminate signal (`ctrl+c` on most platforms).
@@ -347,10 +457,34 @@ For more detailed documentation on deploying to different environments, check
out the resources in the [How-to
section](https://googleapis.github.io/genai-toolbox/how-to/)
### 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:
## Connect to Toolbox
Once your Toolbox server is up and running, you can load tools into your MCP-compatible client or
application.
### MCP Client
Add the following configuration to your MCP client configuration:
```json
{
"mcpServers": {
"toolbox": {
"type": "http",
"url": "http://127.0.0.1:5000/mcp",
}
}
}
```
If you would like to connect to a specific toolset, replace url with "http://127.0.0.1:5000/mcp/{toolset_name}".
### Toolbox SDKs: Integrate with your Application
Toolbox Client SDKs provide the easy-to-use building blocks and advanced features for connecting your custom applications to the MCP Toolbox server. See below the list of Client SDKs for using various frameworks:
<details open>
<summary>Python (<a href="https://github.com/googleapis/mcp-toolbox-sdk-python">Github</a>)</summary>
@@ -879,183 +1013,71 @@ For more detailed instructions on using the Toolbox Core SDK, see the
</blockquote>
</details>
### Using Toolbox with Gemini CLI Extensions
---
[Gemini CLI extensions][gemini-cli-extensions] provide tools to interact
directly with your data sources from command line. Below is a list of Gemini CLI
extensions that are built on top of **Toolbox**. They allow you to interact with
your data sources through pre-defined or custom tools with natural language.
Click into the link to see detailed instructions on their usage.
## Additional Features
To use **custom** tools with Gemini CLI:
### Test tools with the Toolbox UI
- [MCP Toolbox](https://github.com/gemini-cli-extensions/mcp-toolbox)
To launch Toolbox's interactive UI, use the `--ui` flag. This allows you to test
tools and toolsets with features such as authorized parameters. To learn more,
visit [Toolbox UI](https://googleapis.github.io/genai-toolbox/how-to/toolbox-ui/).
To use [prebuilt tools][prebuilt] with Gemini CLI:
- [AlloyDB for PostgreSQL](https://github.com/gemini-cli-extensions/alloydb)
- [AlloyDB for PostgreSQL
Observability](https://github.com/gemini-cli-extensions/alloydb-observability)
- [BigQuery Data
Analytics](https://github.com/gemini-cli-extensions/bigquery-data-analytics)
- [BigQuery Conversational
Analytics](https://github.com/gemini-cli-extensions/bigquery-conversational-analytics)
- [Cloud SQL for
MySQL](https://github.com/gemini-cli-extensions/cloud-sql-mysql)
- [Cloud SQL for MySQL
Observability](https://github.com/gemini-cli-extensions/cloud-sql-mysql-observability)
- [Cloud SQL for
PostgreSQL](https://github.com/gemini-cli-extensions/cloud-sql-postgresql)
- [Cloud SQL for PostgreSQL
Observability](https://github.com/gemini-cli-extensions/cloud-sql-postgresql-observability)
- [Cloud SQL for SQL
Server](https://github.com/gemini-cli-extensions/cloud-sql-sqlserver)
- [Cloud SQL for SQL Server
Observability](https://github.com/gemini-cli-extensions/cloud-sql-sqlserver-observability)
- [Looker](https://github.com/gemini-cli-extensions/looker)
- [Dataplex](https://github.com/gemini-cli-extensions/dataplex)
- [MySQL](https://github.com/gemini-cli-extensions/mysql)
- [PostgreSQL](https://github.com/gemini-cli-extensions/postgres)
- [Spanner](https://github.com/gemini-cli-extensions/spanner)
- [Firestore](https://github.com/gemini-cli-extensions/firestore-native)
- [SQL Server](https://github.com/gemini-cli-extensions/sql-server)
[prebuilt]: https://googleapis.github.io/genai-toolbox/reference/prebuilt-tools/
[gemini-cli-extensions]:
https://github.com/google-gemini/gemini-cli/blob/main/docs/extensions/index.md
## Configuration
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://googleapis.github.io/genai-toolbox/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
kind: sources
name: my-pg-source
type: postgres
host: 127.0.0.1
port: 5432
database: toolbox_db
user: toolbox_user
password: my-password
```sh
./toolbox --ui
```
For more details on configuring different types of sources, see the
[Sources](https://googleapis.github.io/genai-toolbox/resources/sources).
### Telemetry
### Tools
Toolbox emits traces and metrics via OpenTelemetry. Use `--telemetry-otlp=<endpoint>`
to export to any OTLP-compatible backend like Google Cloud Monitoring, Agnost AI, or
others. See the [telemetry docs](https://googleapis.github.io/genai-toolbox/how-to/export_telemetry/) for details.
The `tools` section of a `tools.yaml` define the actions an agent can take: what
type of tool it is, which source(s) it affects, what parameters it uses, etc.
### Generate Agent Skills
```yaml
kind: tools
name: search-hotels-by-name
type: 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 || '%';
The `skills-generate` command allows you to convert a **toolset** into an **Agent Skill** compatible with the [Agent Skill specification](https://agentskills.io/specification). This is useful for distributing tools as portable skill packages.
```bash
toolbox --config tools.yaml skills-generate \
--name "my-skill" \
--toolset "my_toolset" \
--description "A skill containing multiple tools"
```
For more details on configuring different types of tools, see the
[Tools](https://googleapis.github.io/genai-toolbox/resources/tools).
Once generated, you can install the skill into the Gemini CLI:
### 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 groups based on agent or application.
```yaml
toolsets:
my_first_toolset:
- my_first_tool
- my_second_tool
my_second_toolset:
- my_second_tool
- my_third_tool
```bash
gemini skills install ./skills/my-skill
```
You can load toolsets by name:
For more details, see the [Generate Agent Skills guide](https://googleapis.github.io/genai-toolbox/how-to/generate_skill/).
```python
# This will load all tools
all_tools = client.load_toolset()
# This will only load the tools listed in 'my_second_toolset'
my_second_toolset = client.load_toolset("my_second_toolset")
```
### Prompts
The `prompts` section of a `tools.yaml` defines prompts that can be used for
interactions with LLMs.
```yaml
prompts:
code_review:
description: "Asks the LLM to analyze code quality and suggest improvements."
messages:
- content: "Please review the following code for quality, correctness, and potential improvements: \n\n{{.code}}"
arguments:
- name: "code"
description: "The code to review"
```
For more details on configuring prompts, see the
[Prompts](https://googleapis.github.io/genai-toolbox/resources/prompts).
---
## Versioning
This project uses [semantic versioning](https://semver.org/) (`MAJOR.MINOR.PATCH`).
Since the project is in a pre-release stage (version `0.x.y`), we follow the
standard conventions for initial development:
MCP Toolbox for Databases follows [Semantic Versioning](https://semver.org/).
### Pre-1.0.0 Versioning
The Public API includes the Toolbox Server (CLI, configuration manifests, and pre-built toolsets) and the Client SDKs.
While the major version is `0`, the public API should be considered unstable.
The version will be incremented as follows:
- **Major versions** are incremented for breaking changes, such as incompatible CLI or manifest changes.
- **Minor versions** are incremented for new features, including modifications to pre-built toolsets or beta features.
- **Patch versions** are incremented for backward-compatible bug fixes.
- **`0.MINOR.PATCH`**: The **MINOR** version is incremented when we add
new functionality or make breaking, incompatible API changes.
- **`0.MINOR.PATCH`**: The **PATCH** version is incremented for
backward-compatible bug fixes.
For more details, see our [Full Versioning Policy](https://googleapis.github.io/genai-toolbox/about/versioning/).
### Post-1.0.0 Versioning
Once the project reaches a stable `1.0.0` release, the version number
**`MAJOR.MINOR.PATCH`** will follow the more common convention:
- **`MAJOR`**: Incremented for incompatible API changes.
- **`MINOR`**: Incremented for new, backward-compatible functionality.
- **`PATCH`**: Incremented for backward-compatible bug fixes.
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
Contributions are welcome. Please, see the [CONTRIBUTING](CONTRIBUTING.md)
to get started.
Contributions are welcome. Please, see the [CONTRIBUTING](CONTRIBUTING.md) guide to get started.
Please note that this project is released with a Contributor Code of Conduct.
By participating in this project you agree to abide by its terms. See
[Contributor Code of Conduct](CODE_OF_CONDUCT.md) for more information.
For technical details on setting up a environment for developing on Toolbox itself, see the [DEVELOPER](DEVELOPER.md) guide.
Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms. See [Contributor Code of Conduct](CODE_OF_CONDUCT.md) for more information.
---
## Community
Join our [discord community](https://discord.gg/GQrFB3Ec3W) to connect with our developers!
Join our [Discord community](https://discord.gg/GQrFB3Ec3W) to connect with our developers!

6
SECURITY.md Normal file
View File

@@ -0,0 +1,6 @@
# Security Policy
To report a security issue, please email toolbox-security@google.com with a
description of the issue, the steps you took to create the issue, affected
versions, and, if known, mitigations for the issue. Our vulnerability management
team will respond within 3 working days of your email.

113
UPGRADING.md Normal file
View File

@@ -0,0 +1,113 @@
# Upgrading to MCP Toolbox for Databases v1.0.0
Welcome to the v1.0.0 release of the MCP Toolbox for Databases!
This release stabilizes our core APIs and standardizes our protocol alignments.
As part of this milestone, we have introduced several breaking changes and
deprecations that require updates to your configuration and code.
**📖 New Versioning Policy**
We have officially published our [Versioning Policy](https://googleapis.github.io/genai-toolbox/dev/about/versioning/). Moving forward, we follow standard versioning conventions to classify updates:
* **Major (vX.0.0):** Breaking changes requiring manual updates.
* **Minor (v1.X.0):** New, backward-compatible features and deprecation notices.
* **Patch (v1.0.X):** Backward-compatible bug fixes and security patches.
This guide outlines what has changed and the steps you need to take to upgrade.
## 🚨 Breaking Changes (Action Required)
### 1. Endpoint Transition: `/api` disabled by default
The legacy `/api` endpoint for the native Toolbox protocol is now disabled by default. All official SDKs have been updated to use the `/mcp` endpoint, which aligns with the standard Model Context Protocol (MCP) specification.
If you still require the legacy `/api` endpoint, you must explicitly activate it using a new command-line flag.
* **Usage:** `./toolbox --enable-api`
* **Migration:** You must update all custom implementations to use the `/mcp`
endpoint exclusively, as the `/api` endpoint is now deprecated. If your workflow
relied on a non-standard feature that is missing from the new implementation, please submit a
feature request on our [GitHub Issues page](https://github.com/googleapis/genai-toolbox/issues).
* **UI Dependency:** Until the UI is officially migrated, it still requires the API to function. You must run the toolbox with both flags: `./toolbox --ui --enable-api`.
### 2. Strict Tool Naming Validation (SEP986)
Tool names are now strictly validated against [ModelContextProtocol SEP986 guidelines](https://github.com/alexhancock/modelcontextprotocol/blob/main/docs/specification/draft/server/tools.mdx#tool-names) prior to MCP initialization.
* **Migration:** Ensure all your tool names **only** contain alphanumeric characters, hyphens (`-`), underscores (`_`), and periods (`.`). Any other special characters will cause initialization to fail.
### 3. Removed CLI Flags
The legacy snake_case flag `--tools_file` has been completely removed.
* **Migration:** Update your deployment scripts to use `--config` instead.
### 4. Singular `kind` Values in Configuration
_(This step applies only if you are currently using the new flat format.)_
All primitive kind fields in configuration files have been updated to use singular nouns instead of plural. For example, `kind: sources` is now `kind: source`, and `kind: tools` is now `kind: tool`.
* **Migration:** Update your configuration files to use the singular form for all `kind`
values. _(Note: If you transitioned to the flat format using the `./toolbox migrate` command, this step was handled automatically.)_
### 5. Configuration Schema: `authSources` renamed
The `authSources` field is no longer supported in configuration files.
* **Migration:** Rename all instances of `authSources` to `authService` in your
configuration files.
### 6. CloudSQL for SQL Server: `ipAddress` removed
The `ipAddress` field for the CloudSQL for SQL Server source was redundant and has been removed.
* **Migration:** Remove the `ipAddress` field from your CloudSQL for SQL Server configurations.
## ⚠️ Deprecations & Modernization
### 1. Flat Configuration Format Introduced
We have introduced a new, streamlined "flat" format for configuration files. While the older nested format is still supported for now, **all new features will only be added to the flat format.**
**Schema Restructuring (`kind` vs. `type`):**
Along with the flat format, the configuration schema has been reorganized. The
old `kind` field (which specified the specific primitive types, like
`alloydb-postgres`) has been renamed to `type`. The `kind` field is now strictly
used to declare the core primitive of the block (e.g., `source` or `tool`).
**Example of the new flat format:**
```yaml
kind: source
name: my-source
type: alloydb-postgres
project: my-project
region: my-region
instance: my-instance
---
kind: tool
name: my-simple-tool
type: postgres-execute-sql
source: my-source
description: this is a tool that executes the sql provided.
```
**Migration:**
You can automatically migrate your existing nested configurations to the new flat format using the CLI. Run the following command:
```Bash
./toolbox migrate --config <path-to-your-config>
```
_Note: You can also use the `--configs` or `--config-folder` flags with this command._
### 2. Deprecated CLI Flags
The following CLI flags are deprecated and will be removed in a future release. Please update your scripts:
* `--tools-file` ➡️ Use `--config`
* `--tools-files` ➡️ Use `--configs`
* `--tools-folder` ➡️ Use `--config-folder`
## 💡 Other Notable Updates
* **Enhanced Error Handling:** Errors are now strictly categorized between Agent Errors (allowing the LLM to self-correct) and Client/Server Errors (which signal a hard stop).
* **Telemetry Updates:** The /mcp endpoint telemetry has been revised to fully comply with the [OpenTelemetry semantic conventions for MCP](https://opentelemetry.io/docs/specs/semconv/gen-ai/mcp/).
* **MCP Authorization Support:** The Model Context Protocol's [authorization specification](https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization) is now fully supported.
* **Database Name Validation:** Removed the "required field" validation for the database name in CloudSQL for MySQL and generic MySQL sources.
* **Prebuilt Tools:** Toolsets have been resized for better performance.
## 📚 Documentation Moved
Our official documentation has a new home! Please update your bookmarks to [mcp-toolbox.dev](http://mcp-toolbox.dev).

386
cmd/internal/config.go Normal file
View File

@@ -0,0 +1,386 @@
// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package internal
import (
"bytes"
"context"
"fmt"
"io"
"os"
"path/filepath"
"regexp"
"slices"
"strings"
"github.com/goccy/go-yaml"
"github.com/google/go-cmp/cmp"
"github.com/googleapis/genai-toolbox/internal/auth/generic"
"github.com/googleapis/genai-toolbox/internal/server"
)
type Config struct {
Sources server.SourceConfigs `yaml:"sources"`
AuthServices server.AuthServiceConfigs `yaml:"authServices"`
EmbeddingModels server.EmbeddingModelConfigs `yaml:"embeddingModels"`
Tools server.ToolConfigs `yaml:"tools"`
Toolsets server.ToolsetConfigs `yaml:"toolsets"`
Prompts server.PromptConfigs `yaml:"prompts"`
}
type ConfigParser struct {
EnvVars map[string]string
}
// parseEnv replaces environment variables ${ENV_NAME} with their values.
// also support ${ENV_NAME:default_value}.
func (p *ConfigParser) parseEnv(input string) (string, error) {
re := regexp.MustCompile(`\$\{(\w+)(:([^}]*))?\}`)
if p.EnvVars == nil {
p.EnvVars = make(map[string]string)
}
var err error
output := re.ReplaceAllStringFunc(input, func(match string) string {
parts := re.FindStringSubmatch(match)
// extract the variable name
variableName := parts[1]
if value, found := os.LookupEnv(variableName); found {
p.EnvVars[variableName] = value
return value
}
if len(parts) >= 4 && parts[2] != "" {
value := parts[3]
p.EnvVars[variableName] = value
return value
}
err = fmt.Errorf("environment variable not found: %q", variableName)
return ""
})
return output, err
}
// ParseConfig parses the provided yaml into appropriate configs.
func (p *ConfigParser) ParseConfig(ctx context.Context, raw []byte) (Config, error) {
var config Config
// Replace environment variables if found
output, err := p.parseEnv(string(raw))
if err != nil {
return config, fmt.Errorf("error parsing environment variables: %s", err)
}
raw = []byte(output)
raw, err = ConvertConfig(raw)
if err != nil {
return config, fmt.Errorf("error converting config file: %s", err)
}
// Parse contents
config.Sources, config.AuthServices, config.EmbeddingModels, config.Tools, config.Toolsets, config.Prompts, err = server.UnmarshalResourceConfig(ctx, raw)
if err != nil {
return config, err
}
return config, nil
}
// ConvertConfig converts configuration file to flat format.
func ConvertConfig(raw []byte) ([]byte, error) {
var input yaml.MapSlice
decoder := yaml.NewDecoder(bytes.NewReader(raw), yaml.UseOrderedMap())
// convert to config file v2
var buf bytes.Buffer
encoder := yaml.NewEncoder(&buf)
v1keys := []string{"sources", "authServices", "embeddingModels", "tools", "toolsets", "prompts"}
for {
if err := decoder.Decode(&input); err != nil {
if err == io.EOF {
break
}
return nil, err
}
for _, item := range input {
key, ok := item.Key.(string)
if !ok {
return nil, fmt.Errorf("unexpected non-string key in input: %v", item.Key)
}
// check if the key is config file v1's key
if slices.Contains(v1keys, key) {
// check if value conversion to yaml.MapSlice successfully
// fields such as "tools" in toolsets might pass the first check but
// fail to convert to MapSlice
if slice, ok := item.Value.(yaml.MapSlice); ok {
// Deprecated: convert authSources to authServices
switch key {
case "authSources", "authServices":
key = "authService"
case "sources":
key = "source"
case "embeddingModels":
key = "embeddingModel"
case "tools":
key = "tool"
case "toolsets":
key = "toolset"
case "prompts":
key = "prompt"
}
transformed, err := transformDocs(key, slice)
if err != nil {
return nil, err
}
// encode per-doc
for _, doc := range transformed {
if err := encoder.Encode(doc); err != nil {
return nil, err
}
}
} else {
// invalid input will be ignored
// we don't want to throw error here since the config could
// be valid but with a different order such as:
// ---
// tools:
// - tool_a
// kind: toolset
// ---
continue
}
} else {
// this doc is already v2, encode to buf
if err := encoder.Encode(input); err != nil {
return nil, err
}
break
}
}
}
return buf.Bytes(), nil
}
// transformDocs transforms the configuration file from v1 format to v2
// yaml.MapSlice will preserve the order in a map
func transformDocs(kind string, input yaml.MapSlice) ([]yaml.MapSlice, error) {
var transformed []yaml.MapSlice
for _, entry := range input {
entryName, ok := entry.Key.(string)
if !ok {
return nil, fmt.Errorf("unexpected non-string key for entry in '%s': %v", kind, entry.Key)
}
entryBody := processValue(entry.Value, kind == "toolset")
currentTransformed := yaml.MapSlice{
{Key: "kind", Value: kind},
{Key: "name", Value: entryName},
}
// Merge the transformed body into our result
if bodySlice, ok := entryBody.(yaml.MapSlice); ok {
currentTransformed = append(currentTransformed, bodySlice...)
} else {
return nil, fmt.Errorf("unable to convert entryBody to MapSlice")
}
transformed = append(transformed, currentTransformed)
}
return transformed, nil
}
// processValue recursively looks for MapSlices to rename 'kind' -> 'type'
func processValue(v any, isToolset bool) any {
switch val := v.(type) {
case yaml.MapSlice:
// creating a new MapSlice is safer for recursive transformation
newVal := make(yaml.MapSlice, len(val))
for i, item := range val {
// Perform renaming
if item.Key == "kind" {
item.Key = "type"
}
// Recursive call for nested values (e.g., nested objects or lists)
item.Value = processValue(item.Value, false)
newVal[i] = item
}
return newVal
case []any:
// Process lists: If it's a toolset top-level list, wrap it.
if isToolset {
return yaml.MapSlice{{Key: "tools", Value: val}}
}
// Otherwise, recurse into list items (to catch nested objects)
newVal := make([]any, len(val))
for i := range val {
newVal[i] = processValue(val[i], false)
}
return newVal
default:
return val
}
}
// mergeConfigs merges multiple Config structs into one.
// Detects and raises errors for resource conflicts in sources, authServices, tools, and toolsets.
// All resource names (sources, authServices, tools, toolsets) must be unique across all files.
func mergeConfigs(files ...Config) (Config, error) {
merged := Config{
Sources: make(server.SourceConfigs),
AuthServices: make(server.AuthServiceConfigs),
EmbeddingModels: make(server.EmbeddingModelConfigs),
Tools: make(server.ToolConfigs),
Toolsets: make(server.ToolsetConfigs),
Prompts: make(server.PromptConfigs),
}
var conflicts []string
for fileIndex, file := range files {
// Check for conflicts and merge sources
for name, source := range file.Sources {
if mergedSource, exists := merged.Sources[name]; exists {
if !cmp.Equal(mergedSource, source) {
conflicts = append(conflicts, fmt.Sprintf("source '%s' (file #%d)", name, fileIndex+1))
}
} else {
merged.Sources[name] = source
}
}
// Check for conflicts and merge authServices
for name, authService := range file.AuthServices {
if _, exists := merged.AuthServices[name]; exists {
conflicts = append(conflicts, fmt.Sprintf("authService '%s' (file #%d)", name, fileIndex+1))
} else {
merged.AuthServices[name] = authService
}
}
// Check for conflicts and merge embeddingModels
for name, em := range file.EmbeddingModels {
if _, exists := merged.EmbeddingModels[name]; exists {
conflicts = append(conflicts, fmt.Sprintf("embedding model '%s' (file #%d)", name, fileIndex+1))
} else {
merged.EmbeddingModels[name] = em
}
}
// Check for conflicts and merge tools
for name, tool := range file.Tools {
if _, exists := merged.Tools[name]; exists {
conflicts = append(conflicts, fmt.Sprintf("tool '%s' (file #%d)", name, fileIndex+1))
} else {
merged.Tools[name] = tool
}
}
// Check for conflicts and merge toolsets
for name, toolset := range file.Toolsets {
if _, exists := merged.Toolsets[name]; exists {
conflicts = append(conflicts, fmt.Sprintf("toolset '%s' (file #%d)", name, fileIndex+1))
} else {
merged.Toolsets[name] = toolset
}
}
// Check for conflicts and merge prompts
for name, prompt := range file.Prompts {
if _, exists := merged.Prompts[name]; exists {
conflicts = append(conflicts, fmt.Sprintf("prompt '%s' (file #%d)", name, fileIndex+1))
} else {
merged.Prompts[name] = prompt
}
}
}
// If conflicts were detected, return an error
if len(conflicts) > 0 {
return Config{}, fmt.Errorf("resource conflicts detected:\n - %s\n\nPlease ensure each source, authService, tool, toolset and prompt has a unique name across all files", strings.Join(conflicts, "\n - "))
}
// Ensure only one authService has mcpEnabled = true
var mcpEnabledAuthServers []string
for name, authService := range merged.AuthServices {
// Only generic type has McpEnabled right now
if genericService, ok := authService.(generic.Config); ok && genericService.McpEnabled {
mcpEnabledAuthServers = append(mcpEnabledAuthServers, name)
}
}
if len(mcpEnabledAuthServers) > 1 {
return Config{}, fmt.Errorf("multiple authServices with mcpEnabled=true detected: %s. Only one MCP authorization server is currently supported", strings.Join(mcpEnabledAuthServers, ", "))
}
return merged, nil
}
// LoadAndMergeConfigs loads multiple YAML files and merges them
func (p *ConfigParser) LoadAndMergeConfigs(ctx context.Context, filePaths []string) (Config, error) {
var configs []Config
for _, filePath := range filePaths {
buf, err := os.ReadFile(filePath)
if err != nil {
return Config{}, fmt.Errorf("unable to read config file at %q: %w", filePath, err)
}
config, err := p.ParseConfig(ctx, buf)
if err != nil {
return Config{}, fmt.Errorf("unable to parse config file at %q: %w", filePath, err)
}
configs = append(configs, config)
}
if len(configs) == 0 {
return Config{}, fmt.Errorf("no YAML files found")
}
if len(configs) > 1 {
mergedFile, err := mergeConfigs(configs...)
if err != nil {
return Config{}, fmt.Errorf("unable to merge config files: %w", err)
}
return mergedFile, nil
}
return configs[0], nil
}
// GetPathsFromConfigFolder loads all YAML files from a directory and merges them
func GetPathsFromConfigFolder(ctx context.Context, folderPath string) ([]string, error) {
// Check if directory exists
info, err := os.Stat(folderPath)
if err != nil {
return nil, fmt.Errorf("unable to access config folder at %q: %w", folderPath, err)
}
if !info.IsDir() {
return nil, fmt.Errorf("path %q is not a directory", folderPath)
}
// Find all YAML files in the directory
pattern := filepath.Join(folderPath, "*.yaml")
yamlFiles, err := filepath.Glob(pattern)
if err != nil {
return nil, fmt.Errorf("error finding YAML files in %q: %w", folderPath, err)
}
// Also find .yml files
ymlPattern := filepath.Join(folderPath, "*.yml")
ymlFiles, err := filepath.Glob(ymlPattern)
if err != nil {
return nil, fmt.Errorf("error finding YML files in %q: %w", folderPath, err)
}
// Combine both file lists
allFiles := append(yamlFiles, ymlFiles...)
return allFiles, nil
}

2249
cmd/internal/config_test.go Normal file

File diff suppressed because it is too large Load Diff

71
cmd/internal/flags.go Normal file
View File

@@ -0,0 +1,71 @@
// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package internal
import (
"fmt"
"strings"
"github.com/googleapis/genai-toolbox/internal/prebuiltconfigs"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
)
// PersistentFlags sets up flags that are available for all commands and
// subcommands
// It is also used to set up persistent flags during subcommand unit tests
func PersistentFlags(parentCmd *cobra.Command, opts *ToolboxOptions) {
persistentFlags := parentCmd.PersistentFlags()
persistentFlags.Var(&opts.Cfg.LogLevel, "log-level", "Specify the minimum level logged. Allowed: 'DEBUG', 'INFO', 'WARN', 'ERROR'.")
persistentFlags.Var(&opts.Cfg.LoggingFormat, "logging-format", "Specify logging format to use. Allowed: 'standard' or 'JSON'.")
persistentFlags.BoolVar(&opts.Cfg.TelemetryGCP, "telemetry-gcp", false, "Enable exporting directly to Google Cloud Monitoring.")
persistentFlags.StringVar(&opts.Cfg.TelemetryOTLP, "telemetry-otlp", "", "Enable exporting using OpenTelemetry Protocol (OTLP) to the specified endpoint (e.g. 'http://127.0.0.1:4318')")
persistentFlags.StringVar(&opts.Cfg.TelemetryServiceName, "telemetry-service-name", "toolbox", "Sets the value of the service.name resource attribute for telemetry data.")
persistentFlags.StringSliceVar(&opts.Cfg.UserAgentMetadata, "user-agent-metadata", []string{}, "Appends additional metadata to the User-Agent.")
}
// ConfigFileFlags defines flags related to the configuration file.
// It should be applied to any command that requires configuration loading.
func ConfigFileFlags(flags *pflag.FlagSet, opts *ToolboxOptions) {
flags.StringVar(&opts.Config, "config", "", "File path specifying the tool configuration. Cannot be used with --configs, or --config-folder.")
flags.StringVar(&opts.Config, "tools-file", "", "File path specifying the tool configuration. Cannot be used with --tools-files, or --tools-folder.")
_ = flags.MarkDeprecated("tools-file", "please use --config instead") // DEPRECATED
flags.StringSliceVar(&opts.Configs, "configs", []string{}, "Multiple file paths specifying tool configurations. Files will be merged. Cannot be used with --config, or --config-folder.")
flags.StringSliceVar(&opts.Configs, "tools-files", []string{}, "Multiple file paths specifying tool configurations. Files will be merged. Cannot be used with --tools-file, or --tools-folder.")
_ = flags.MarkDeprecated("tools-files", "please use --configs instead") // DEPRECATED
flags.StringVar(&opts.ConfigFolder, "config-folder", "", "Directory path containing YAML tool configuration files. All .yaml and .yml files in the directory will be loaded and merged. Cannot be used with --config, or --configs.")
flags.StringVar(&opts.ConfigFolder, "tools-folder", "", "Directory path containing YAML tool configuration files. All .yaml and .yml files in the directory will be loaded and merged. Cannot be used with --tools-file, or --tools-files.")
_ = flags.MarkDeprecated("tools-folder", "please use --config-folder instead") // DEPRECATED
// Fetch prebuilt tools sources to customize the help description
prebuiltHelp := fmt.Sprintf(
"Use a prebuilt tool configuration by source type. Allowed: '%s'. Can be specified multiple times.",
strings.Join(prebuiltconfigs.GetPrebuiltSources(), "', '"),
)
flags.StringSliceVar(&opts.PrebuiltConfigs, "prebuilt", []string{}, prebuiltHelp)
}
// ServeFlags defines flags for starting and configuring the server.
func ServeFlags(flags *pflag.FlagSet, opts *ToolboxOptions) {
flags.StringVarP(&opts.Cfg.Address, "address", "a", "127.0.0.1", "Address of the interface the server will listen on.")
flags.IntVarP(&opts.Cfg.Port, "port", "p", 5000, "Port the server will listen on.")
flags.BoolVar(&opts.Cfg.Stdio, "stdio", false, "Listens via MCP STDIO instead of acting as a remote HTTP server.")
flags.BoolVar(&opts.Cfg.UI, "ui", false, "Launches the Toolbox UI web server.")
flags.BoolVar(&opts.Cfg.EnableAPI, "enable-api", false, "Enable the /api endpoint.")
flags.StringVar(&opts.Cfg.ToolboxUrl, "toolbox-url", "", "Specifies the Toolbox URL. Used as the resource field in the MCP PRM file when MCP Auth is enabled. Falls back to TOOLBOX_URL environment variable.")
flags.StringVar(&opts.Cfg.McpPrmFile, "mcp-prm-file", "", "Path to a manual Protected Resource Metadata (PRM) JSON file. If provided, overrides auto-generation.")
flags.StringSliceVar(&opts.Cfg.AllowedOrigins, "allowed-origins", []string{"*"}, "Specifies a list of origins permitted to access this server. Defaults to '*'.")
flags.StringSliceVar(&opts.Cfg.AllowedHosts, "allowed-hosts", []string{"*"}, "Specifies a list of hosts permitted to access this server. Defaults to '*'.")
}

273
cmd/internal/imports.go Normal file
View File

@@ -0,0 +1,273 @@
// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package internal
import (
// Import prompt packages for side effect of registration
_ "github.com/googleapis/genai-toolbox/internal/prompts/custom"
// Import tool packages for side effect of registration
_ "github.com/googleapis/genai-toolbox/internal/tools/alloydb/alloydbcreatecluster"
_ "github.com/googleapis/genai-toolbox/internal/tools/alloydb/alloydbcreateinstance"
_ "github.com/googleapis/genai-toolbox/internal/tools/alloydb/alloydbcreateuser"
_ "github.com/googleapis/genai-toolbox/internal/tools/alloydb/alloydbgetcluster"
_ "github.com/googleapis/genai-toolbox/internal/tools/alloydb/alloydbgetinstance"
_ "github.com/googleapis/genai-toolbox/internal/tools/alloydb/alloydbgetuser"
_ "github.com/googleapis/genai-toolbox/internal/tools/alloydb/alloydblistclusters"
_ "github.com/googleapis/genai-toolbox/internal/tools/alloydb/alloydblistinstances"
_ "github.com/googleapis/genai-toolbox/internal/tools/alloydb/alloydblistusers"
_ "github.com/googleapis/genai-toolbox/internal/tools/alloydb/alloydbwaitforoperation"
_ "github.com/googleapis/genai-toolbox/internal/tools/alloydbainl"
_ "github.com/googleapis/genai-toolbox/internal/tools/bigquery/bigqueryanalyzecontribution"
_ "github.com/googleapis/genai-toolbox/internal/tools/bigquery/bigqueryconversationalanalytics"
_ "github.com/googleapis/genai-toolbox/internal/tools/bigquery/bigqueryexecutesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/bigquery/bigqueryforecast"
_ "github.com/googleapis/genai-toolbox/internal/tools/bigquery/bigquerygetdatasetinfo"
_ "github.com/googleapis/genai-toolbox/internal/tools/bigquery/bigquerygettableinfo"
_ "github.com/googleapis/genai-toolbox/internal/tools/bigquery/bigquerylistdatasetids"
_ "github.com/googleapis/genai-toolbox/internal/tools/bigquery/bigquerylisttableids"
_ "github.com/googleapis/genai-toolbox/internal/tools/bigquery/bigquerysearchcatalog"
_ "github.com/googleapis/genai-toolbox/internal/tools/bigquery/bigquerysql"
_ "github.com/googleapis/genai-toolbox/internal/tools/bigtable"
_ "github.com/googleapis/genai-toolbox/internal/tools/cassandra/cassandracql"
_ "github.com/googleapis/genai-toolbox/internal/tools/clickhouse/clickhouseexecutesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/clickhouse/clickhouselistdatabases"
_ "github.com/googleapis/genai-toolbox/internal/tools/clickhouse/clickhouselisttables"
_ "github.com/googleapis/genai-toolbox/internal/tools/clickhouse/clickhousesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudgda"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudhealthcare/cloudhealthcarefhirfetchpage"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudhealthcare/cloudhealthcarefhirpatienteverything"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudhealthcare/cloudhealthcarefhirpatientsearch"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudhealthcare/cloudhealthcaregetdataset"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudhealthcare/cloudhealthcaregetdicomstore"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudhealthcare/cloudhealthcaregetdicomstoremetrics"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudhealthcare/cloudhealthcaregetfhirresource"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudhealthcare/cloudhealthcaregetfhirstore"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudhealthcare/cloudhealthcaregetfhirstoremetrics"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudhealthcare/cloudhealthcarelistdicomstores"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudhealthcare/cloudhealthcarelistfhirstores"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudhealthcare/cloudhealthcareretrieverendereddicominstance"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudhealthcare/cloudhealthcaresearchdicominstances"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudhealthcare/cloudhealthcaresearchdicomseries"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudhealthcare/cloudhealthcaresearchdicomstudies"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudloggingadmin/cloudloggingadminlistlognames"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudloggingadmin/cloudloggingadminlistresourcetypes"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudloggingadmin/cloudloggingadminquerylogs"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudmonitoring"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudsql/cloudsqlcloneinstance"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudsql/cloudsqlcreatebackup"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudsql/cloudsqlcreatedatabase"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudsql/cloudsqlcreateusers"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudsql/cloudsqlgetinstances"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudsql/cloudsqllistdatabases"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudsql/cloudsqllistinstances"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudsql/cloudsqlrestorebackup"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudsql/cloudsqlwaitforoperation"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudsqlmssql/cloudsqlmssqlcreateinstance"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudsqlmysql/cloudsqlmysqlcreateinstance"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudsqlpg/cloudsqlpgcreateinstances"
_ "github.com/googleapis/genai-toolbox/internal/tools/cloudsqlpg/cloudsqlpgupgradeprecheck"
_ "github.com/googleapis/genai-toolbox/internal/tools/cockroachdb/cockroachdbexecutesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/cockroachdb/cockroachdblistschemas"
_ "github.com/googleapis/genai-toolbox/internal/tools/cockroachdb/cockroachdblisttables"
_ "github.com/googleapis/genai-toolbox/internal/tools/cockroachdb/cockroachdbsql"
_ "github.com/googleapis/genai-toolbox/internal/tools/couchbase"
_ "github.com/googleapis/genai-toolbox/internal/tools/dataform/dataformcompilelocal"
_ "github.com/googleapis/genai-toolbox/internal/tools/dataplex/dataplexlookupcontext"
_ "github.com/googleapis/genai-toolbox/internal/tools/dataplex/dataplexlookupentry"
_ "github.com/googleapis/genai-toolbox/internal/tools/dataplex/dataplexsearchaspecttypes"
_ "github.com/googleapis/genai-toolbox/internal/tools/dataplex/dataplexsearchentries"
_ "github.com/googleapis/genai-toolbox/internal/tools/dataproc/dataprocgetcluster"
_ "github.com/googleapis/genai-toolbox/internal/tools/dataproc/dataprocgetjob"
_ "github.com/googleapis/genai-toolbox/internal/tools/dataproc/dataproclistclusters"
_ "github.com/googleapis/genai-toolbox/internal/tools/dataproc/dataproclistjobs"
_ "github.com/googleapis/genai-toolbox/internal/tools/dgraph"
_ "github.com/googleapis/genai-toolbox/internal/tools/elasticsearch/elasticsearchesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/firebird/firebirdexecutesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/firebird/firebirdsql"
_ "github.com/googleapis/genai-toolbox/internal/tools/firestore/firestoreadddocuments"
_ "github.com/googleapis/genai-toolbox/internal/tools/firestore/firestoredeletedocuments"
_ "github.com/googleapis/genai-toolbox/internal/tools/firestore/firestoregetdocuments"
_ "github.com/googleapis/genai-toolbox/internal/tools/firestore/firestoregetrules"
_ "github.com/googleapis/genai-toolbox/internal/tools/firestore/firestorelistcollections"
_ "github.com/googleapis/genai-toolbox/internal/tools/firestore/firestorequery"
_ "github.com/googleapis/genai-toolbox/internal/tools/firestore/firestorequerycollection"
_ "github.com/googleapis/genai-toolbox/internal/tools/firestore/firestoreupdatedocument"
_ "github.com/googleapis/genai-toolbox/internal/tools/firestore/firestorevalidaterules"
_ "github.com/googleapis/genai-toolbox/internal/tools/http"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookeradddashboardelement"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookeradddashboardfilter"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookerconversationalanalytics"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookercreateprojectdirectory"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookercreateprojectfile"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookercreateviewfromtable"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookerdeleteprojectdirectory"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookerdeleteprojectfile"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookerdevmode"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergenerateembedurl"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergetconnectiondatabases"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergetconnections"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergetconnectionschemas"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergetconnectiontablecolumns"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergetconnectiontables"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergetdashboards"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergetdimensions"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergetexplores"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergetfilters"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergetlookmltests"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergetlooks"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergetmeasures"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergetmodels"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergetparameters"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergetprojectdirectories"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergetprojectfile"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergetprojectfiles"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergetprojects"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookergitbranch"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookerhealthanalyze"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookerhealthpulse"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookerhealthvacuum"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookermakedashboard"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookermakelook"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookerquery"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookerquerysql"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookerqueryurl"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookerrundashboard"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookerrunlook"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookerrunlookmltests"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookerupdateprojectfile"
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookervalidateproject"
_ "github.com/googleapis/genai-toolbox/internal/tools/mindsdb/mindsdbexecutesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/mindsdb/mindsdbsql"
_ "github.com/googleapis/genai-toolbox/internal/tools/mongodb/mongodbaggregate"
_ "github.com/googleapis/genai-toolbox/internal/tools/mongodb/mongodbdeletemany"
_ "github.com/googleapis/genai-toolbox/internal/tools/mongodb/mongodbdeleteone"
_ "github.com/googleapis/genai-toolbox/internal/tools/mongodb/mongodbfind"
_ "github.com/googleapis/genai-toolbox/internal/tools/mongodb/mongodbfindone"
_ "github.com/googleapis/genai-toolbox/internal/tools/mongodb/mongodbinsertmany"
_ "github.com/googleapis/genai-toolbox/internal/tools/mongodb/mongodbinsertone"
_ "github.com/googleapis/genai-toolbox/internal/tools/mongodb/mongodbupdatemany"
_ "github.com/googleapis/genai-toolbox/internal/tools/mongodb/mongodbupdateone"
_ "github.com/googleapis/genai-toolbox/internal/tools/mssql/mssqlexecutesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/mssql/mssqllisttables"
_ "github.com/googleapis/genai-toolbox/internal/tools/mssql/mssqlsql"
_ "github.com/googleapis/genai-toolbox/internal/tools/mysql/mysqlexecutesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/mysql/mysqlgetqueryplan"
_ "github.com/googleapis/genai-toolbox/internal/tools/mysql/mysqllistactivequeries"
_ "github.com/googleapis/genai-toolbox/internal/tools/mysql/mysqllisttablefragmentation"
_ "github.com/googleapis/genai-toolbox/internal/tools/mysql/mysqllisttables"
_ "github.com/googleapis/genai-toolbox/internal/tools/mysql/mysqllisttablesmissinguniqueindexes"
_ "github.com/googleapis/genai-toolbox/internal/tools/mysql/mysqlsql"
_ "github.com/googleapis/genai-toolbox/internal/tools/neo4j/neo4jcypher"
_ "github.com/googleapis/genai-toolbox/internal/tools/neo4j/neo4jexecutecypher"
_ "github.com/googleapis/genai-toolbox/internal/tools/neo4j/neo4jschema"
_ "github.com/googleapis/genai-toolbox/internal/tools/oceanbase/oceanbaseexecutesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/oceanbase/oceanbasesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/oracle/oracleexecutesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/oracle/oraclesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgresdatabaseoverview"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgresexecutesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgresgetcolumncardinality"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgreslistactivequeries"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgreslistavailableextensions"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgreslistdatabasestats"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgreslistindexes"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgreslistinstalledextensions"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgreslistlocks"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgreslistpgsettings"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgreslistpublicationtables"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgreslistquerystats"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgreslistroles"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgreslistschemas"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgreslistsequences"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgresliststoredprocedure"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgreslisttables"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgreslisttablespaces"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgreslisttablestats"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgreslisttriggers"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgreslistviews"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgreslongrunningtransactions"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgresreplicationstats"
_ "github.com/googleapis/genai-toolbox/internal/tools/postgres/postgressql"
_ "github.com/googleapis/genai-toolbox/internal/tools/redis"
_ "github.com/googleapis/genai-toolbox/internal/tools/serverlessspark/serverlesssparkcancelbatch"
_ "github.com/googleapis/genai-toolbox/internal/tools/serverlessspark/serverlesssparkcreatepysparkbatch"
_ "github.com/googleapis/genai-toolbox/internal/tools/serverlessspark/serverlesssparkcreatesparkbatch"
_ "github.com/googleapis/genai-toolbox/internal/tools/serverlessspark/serverlesssparkgetbatch"
_ "github.com/googleapis/genai-toolbox/internal/tools/serverlessspark/serverlesssparkgetsession"
_ "github.com/googleapis/genai-toolbox/internal/tools/serverlessspark/serverlesssparkgetsessiontemplate"
_ "github.com/googleapis/genai-toolbox/internal/tools/serverlessspark/serverlesssparklistbatches"
_ "github.com/googleapis/genai-toolbox/internal/tools/serverlessspark/serverlesssparklistsessions"
_ "github.com/googleapis/genai-toolbox/internal/tools/singlestore/singlestoreexecutesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/singlestore/singlestoresql"
_ "github.com/googleapis/genai-toolbox/internal/tools/snowflake/snowflakeexecutesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/snowflake/snowflakesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/spanner/spannerexecutesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/spanner/spannerlistgraphs"
_ "github.com/googleapis/genai-toolbox/internal/tools/spanner/spannerlisttables"
_ "github.com/googleapis/genai-toolbox/internal/tools/spanner/spannersql"
_ "github.com/googleapis/genai-toolbox/internal/tools/sqlite/sqliteexecutesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/sqlite/sqlitesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/tidb/tidbexecutesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/tidb/tidbsql"
_ "github.com/googleapis/genai-toolbox/internal/tools/trino/trinoexecutesql"
_ "github.com/googleapis/genai-toolbox/internal/tools/trino/trinosql"
_ "github.com/googleapis/genai-toolbox/internal/tools/utility/wait"
_ "github.com/googleapis/genai-toolbox/internal/tools/valkey"
_ "github.com/googleapis/genai-toolbox/internal/tools/yugabytedbsql"
_ "github.com/googleapis/genai-toolbox/internal/sources/alloydbadmin"
_ "github.com/googleapis/genai-toolbox/internal/sources/alloydbpg"
_ "github.com/googleapis/genai-toolbox/internal/sources/bigquery"
_ "github.com/googleapis/genai-toolbox/internal/sources/bigtable"
_ "github.com/googleapis/genai-toolbox/internal/sources/cassandra"
_ "github.com/googleapis/genai-toolbox/internal/sources/clickhouse"
_ "github.com/googleapis/genai-toolbox/internal/sources/cloudgda"
_ "github.com/googleapis/genai-toolbox/internal/sources/cloudhealthcare"
_ "github.com/googleapis/genai-toolbox/internal/sources/cloudloggingadmin"
_ "github.com/googleapis/genai-toolbox/internal/sources/cloudmonitoring"
_ "github.com/googleapis/genai-toolbox/internal/sources/cloudsqladmin"
_ "github.com/googleapis/genai-toolbox/internal/sources/cloudsqlmssql"
_ "github.com/googleapis/genai-toolbox/internal/sources/cloudsqlmysql"
_ "github.com/googleapis/genai-toolbox/internal/sources/cloudsqlpg"
_ "github.com/googleapis/genai-toolbox/internal/sources/cockroachdb"
_ "github.com/googleapis/genai-toolbox/internal/sources/couchbase"
_ "github.com/googleapis/genai-toolbox/internal/sources/dataplex"
_ "github.com/googleapis/genai-toolbox/internal/sources/dataproc"
_ "github.com/googleapis/genai-toolbox/internal/sources/dgraph"
_ "github.com/googleapis/genai-toolbox/internal/sources/elasticsearch"
_ "github.com/googleapis/genai-toolbox/internal/sources/firebird"
_ "github.com/googleapis/genai-toolbox/internal/sources/firestore"
_ "github.com/googleapis/genai-toolbox/internal/sources/http"
_ "github.com/googleapis/genai-toolbox/internal/sources/looker"
_ "github.com/googleapis/genai-toolbox/internal/sources/mindsdb"
_ "github.com/googleapis/genai-toolbox/internal/sources/mongodb"
_ "github.com/googleapis/genai-toolbox/internal/sources/mssql"
_ "github.com/googleapis/genai-toolbox/internal/sources/mysql"
_ "github.com/googleapis/genai-toolbox/internal/sources/neo4j"
_ "github.com/googleapis/genai-toolbox/internal/sources/oceanbase"
_ "github.com/googleapis/genai-toolbox/internal/sources/oracle"
_ "github.com/googleapis/genai-toolbox/internal/sources/postgres"
_ "github.com/googleapis/genai-toolbox/internal/sources/redis"
_ "github.com/googleapis/genai-toolbox/internal/sources/serverlessspark"
_ "github.com/googleapis/genai-toolbox/internal/sources/singlestore"
_ "github.com/googleapis/genai-toolbox/internal/sources/snowflake"
_ "github.com/googleapis/genai-toolbox/internal/sources/spanner"
_ "github.com/googleapis/genai-toolbox/internal/sources/sqlite"
_ "github.com/googleapis/genai-toolbox/internal/sources/tidb"
_ "github.com/googleapis/genai-toolbox/internal/sources/trino"
_ "github.com/googleapis/genai-toolbox/internal/sources/valkey"
_ "github.com/googleapis/genai-toolbox/internal/sources/yugabytedb"
)

View File

@@ -0,0 +1,143 @@
// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package invoke
import (
"context"
"encoding/json"
"fmt"
"strings"
"github.com/googleapis/genai-toolbox/cmd/internal"
"github.com/googleapis/genai-toolbox/internal/server"
"github.com/googleapis/genai-toolbox/internal/server/resources"
"github.com/googleapis/genai-toolbox/internal/util"
"github.com/googleapis/genai-toolbox/internal/util/parameters"
"github.com/spf13/cobra"
)
func NewCommand(opts *internal.ToolboxOptions) *cobra.Command {
cmd := &cobra.Command{
Use: "invoke <tool-name> [params]",
Short: "Execute a tool directly",
Long: `Execute a tool directly with parameters.
Params must be a JSON string.
Example:
toolbox invoke my-tool '{"param1": "value1"}'`,
Args: cobra.MinimumNArgs(1),
RunE: func(c *cobra.Command, args []string) error {
return runInvoke(c, args, opts)
},
}
flags := cmd.Flags()
internal.ConfigFileFlags(flags, opts)
return cmd
}
func runInvoke(cmd *cobra.Command, args []string, opts *internal.ToolboxOptions) error {
ctx, cancel := context.WithCancel(cmd.Context())
defer cancel()
ctx, shutdown, err := opts.Setup(ctx)
if err != nil {
return err
}
defer func() {
_ = shutdown(ctx)
}()
_, err = opts.LoadConfig(ctx, &internal.ConfigParser{})
if err != nil {
return err
}
// Initialize Resources
sourcesMap, authServicesMap, embeddingModelsMap, toolsMap, toolsetsMap, promptsMap, promptsetsMap, err := server.InitializeConfigs(ctx, opts.Cfg)
if err != nil {
errMsg := fmt.Errorf("failed to initialize resources: %w", err)
opts.Logger.ErrorContext(ctx, errMsg.Error())
return errMsg
}
resourceMgr := resources.NewResourceManager(sourcesMap, authServicesMap, embeddingModelsMap, toolsMap, toolsetsMap, promptsMap, promptsetsMap)
// Execute Tool
toolName := args[0]
tool, ok := resourceMgr.GetTool(toolName)
if !ok {
errMsg := fmt.Errorf("tool %q not found", toolName)
opts.Logger.ErrorContext(ctx, errMsg.Error())
return errMsg
}
var paramsInput string
if len(args) > 1 {
paramsInput = args[1]
}
params := make(map[string]any)
if paramsInput != "" {
if err := util.DecodeJSON(strings.NewReader(paramsInput), &params); err != nil {
errMsg := fmt.Errorf("params must be a valid JSON string: %w", err)
opts.Logger.ErrorContext(ctx, errMsg.Error())
return errMsg
}
}
parsedParams, err := parameters.ParseParams(tool.GetParameters(), params, nil)
if err != nil {
errMsg := fmt.Errorf("invalid parameters: %w", err)
opts.Logger.ErrorContext(ctx, errMsg.Error())
return errMsg
}
parsedParams, err = tool.EmbedParams(ctx, parsedParams, resourceMgr.GetEmbeddingModelMap())
if err != nil {
errMsg := fmt.Errorf("error embedding parameters: %w", err)
opts.Logger.ErrorContext(ctx, errMsg.Error())
return errMsg
}
// Client Auth not supported for ephemeral CLI call
requiresAuth, err := tool.RequiresClientAuthorization(resourceMgr)
if err != nil {
errMsg := fmt.Errorf("failed to check auth requirements: %w", err)
opts.Logger.ErrorContext(ctx, errMsg.Error())
return errMsg
}
if requiresAuth {
errMsg := fmt.Errorf("client authorization is not supported")
opts.Logger.ErrorContext(ctx, errMsg.Error())
return errMsg
}
result, err := tool.Invoke(ctx, resourceMgr, parsedParams, "")
if err != nil {
errMsg := fmt.Errorf("tool execution failed: %w", err)
opts.Logger.ErrorContext(ctx, errMsg.Error())
return errMsg
}
// Print Result
output, err := json.MarshalIndent(result, "", " ")
if err != nil {
errMsg := fmt.Errorf("failed to marshal result: %w", err)
opts.Logger.ErrorContext(ctx, errMsg.Error())
return errMsg
}
fmt.Fprintln(opts.IOStreams.Out, string(output))
return nil
}

View File

@@ -0,0 +1,167 @@
// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package invoke
import (
"bytes"
"os"
"path/filepath"
"strings"
"testing"
"github.com/googleapis/genai-toolbox/cmd/internal"
_ "github.com/googleapis/genai-toolbox/internal/sources/bigquery"
_ "github.com/googleapis/genai-toolbox/internal/sources/sqlite"
_ "github.com/googleapis/genai-toolbox/internal/tools/bigquery/bigquerysql"
_ "github.com/googleapis/genai-toolbox/internal/tools/sqlite/sqlitesql"
"github.com/spf13/cobra"
)
func invokeCommand(args []string) (string, error) {
parentCmd := &cobra.Command{Use: "toolbox"}
buf := new(bytes.Buffer)
opts := internal.NewToolboxOptions(internal.WithIOStreams(buf, buf))
internal.PersistentFlags(parentCmd, opts)
cmd := NewCommand(opts)
parentCmd.AddCommand(cmd)
parentCmd.SetArgs(args)
err := parentCmd.Execute()
return buf.String(), err
}
func TestInvokeTool(t *testing.T) {
// Create a temporary config
tmpDir := t.TempDir()
toolsFileContent := `
sources:
my-sqlite:
kind: sqlite
database: test.db
tools:
hello-sqlite:
kind: sqlite-sql
source: my-sqlite
description: "hello tool"
statement: "SELECT 'hello' as greeting"
echo-tool:
kind: sqlite-sql
source: my-sqlite
description: "echo tool"
statement: "SELECT ? as msg"
parameters:
- name: message
type: string
description: message to echo
int-tool:
kind: sqlite-sql
source: my-sqlite
description: "int tool"
statement: "SELECT ? as val"
parameters:
- name: value
type: integer
description: int value
`
toolsFilePath := filepath.Join(tmpDir, "tools.yaml")
if err := os.WriteFile(toolsFilePath, []byte(toolsFileContent), 0644); err != nil {
t.Fatalf("failed to write config: %v", err)
}
tcs := []struct {
desc string
args []string
want string
wantErr bool
errStr string
}{
{
desc: "success - basic tool call",
args: []string{"invoke", "hello-sqlite", "--config", toolsFilePath},
want: `"greeting": "hello"`,
},
{
desc: "success - tool call with parameters",
args: []string{"invoke", "echo-tool", `{"message": "world"}`, "--config", toolsFilePath},
want: `"msg": "world"`,
},
{
desc: "success - tool call with integer parameters",
args: []string{"invoke", "int-tool", `{"value": 42}`, "--tools-file", toolsFilePath},
want: `"val": 42`,
},
{
desc: "error - tool not found",
args: []string{"invoke", "non-existent", "--config", toolsFilePath},
wantErr: true,
errStr: `tool "non-existent" not found`,
},
{
desc: "error - invalid JSON params",
args: []string{"invoke", "echo-tool", `invalid-json`, "--config", toolsFilePath},
wantErr: true,
errStr: `params must be a valid JSON string`,
},
}
for _, tc := range tcs {
t.Run(tc.desc, func(t *testing.T) {
got, err := invokeCommand(tc.args)
if (err != nil) != tc.wantErr {
t.Fatalf("got error %v, wantErr %v", err, tc.wantErr)
}
if tc.wantErr && !strings.Contains(err.Error(), tc.errStr) {
t.Fatalf("got error %v, want error containing %q", err, tc.errStr)
}
if !tc.wantErr && !strings.Contains(got, tc.want) {
t.Fatalf("got %q, want it to contain %q", got, tc.want)
}
})
}
}
func TestInvokeTool_AuthUnsupported(t *testing.T) {
tmpDir := t.TempDir()
toolsFileContent := `
sources:
my-bq:
kind: bigquery
project: my-project
useClientOAuth: true
tools:
bq-tool:
kind: bigquery-sql
source: my-bq
description: "bq tool"
statement: "SELECT 1"
`
toolsFilePath := filepath.Join(tmpDir, "auth_tools.yaml")
if err := os.WriteFile(toolsFilePath, []byte(toolsFileContent), 0644); err != nil {
t.Fatalf("failed to write config: %v", err)
}
args := []string{"invoke", "bq-tool", "--config", toolsFilePath}
_, err := invokeCommand(args)
if err == nil {
t.Fatal("expected error for tool requiring client auth, but got nil")
}
if !strings.Contains(err.Error(), "client authorization is not supported") {
t.Fatalf("unexpected error message: %v", err)
}
}

View File

@@ -0,0 +1,133 @@
// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package migrate
import (
"context"
"errors"
"fmt"
"os"
"github.com/google/go-cmp/cmp"
"github.com/googleapis/genai-toolbox/cmd/internal"
"github.com/spf13/cobra"
)
// migrateCmd is the command for migrating configuration files.
type migrateCmd struct {
*cobra.Command
dryRun bool
}
func NewCommand(opts *internal.ToolboxOptions) *cobra.Command {
cmd := &migrateCmd{}
cmd.Command = &cobra.Command{
Use: "migrate",
Short: "Migrate all configuration files to flat format",
Long: "Migrate all configuration files provided to the flat format, updating deprecated fields and ensuring compatibility.",
}
flags := cmd.Flags()
internal.ConfigFileFlags(flags, opts)
flags.BoolVar(&cmd.dryRun, "dry-run", false, "Preview the converted format without applying actual changes.")
cmd.RunE = func(*cobra.Command, []string) error { return runMigrate(cmd, opts) }
return cmd.Command
}
func runMigrate(cmd *migrateCmd, opts *internal.ToolboxOptions) error {
ctx, cancel := context.WithCancel(cmd.Context())
defer cancel()
ctx, shutdown, err := opts.Setup(ctx)
if err != nil {
return err
}
defer func() {
_ = shutdown(ctx)
}()
logger := opts.Logger
filePaths, _, err := opts.GetCustomConfigFiles(ctx)
if err != nil {
errMsg := fmt.Errorf("error retrieving configuration file: %w", err)
logger.ErrorContext(ctx, errMsg.Error())
return errMsg
}
logger.InfoContext(ctx, "migration process will start; any comments present in the original configuration files will not be preserved in the migrated files")
var errs []error
// process each files independently.
for _, filePath := range filePaths {
buf, err := os.ReadFile(filePath)
if err != nil {
errMsg := fmt.Errorf("unable to read tool file at %q: %w", filePath, err)
logger.ErrorContext(ctx, errMsg.Error())
errs = append(errs, errMsg)
continue
}
newBuf, err := internal.ConvertConfig(buf)
if err != nil {
logger.ErrorContext(ctx, err.Error())
errs = append(errs, err)
continue
}
if cmp.Equal(buf, newBuf) {
continue
}
if cmd.dryRun {
logger.DebugContext(ctx, fmt.Sprintf("printing migration to output for file: %s", filePath))
fmt.Fprintln(opts.IOStreams.Out, string(newBuf))
} else {
info, err := os.Stat(filePath)
if err != nil {
errMsg := fmt.Errorf("failed to stat file: %w", err)
logger.ErrorContext(ctx, errMsg.Error())
errs = append(errs, errMsg)
continue
}
backupFile := filePath + ".bak"
err = os.Rename(filePath, backupFile)
if err != nil {
errMsg := fmt.Errorf("failed to rename file: %w", err)
logger.ErrorContext(ctx, errMsg.Error())
errs = append(errs, errMsg)
continue
}
logger.DebugContext(ctx, fmt.Sprintf("successfully renamed %s to %s", filePath, backupFile))
// set the permission to the original file's permission.
err = os.WriteFile(filePath, newBuf, info.Mode().Perm())
if err != nil {
errMsg := fmt.Errorf("failed to write to file: %w", err)
// restoring original file
if removeErr := os.Remove(filePath); removeErr != nil { // Attempt to remove the possibly partial file to ensure Rename succeeds.
errMsg = errors.Join(errMsg, removeErr)
}
if restoreErr := os.Rename(backupFile, filePath); restoreErr != nil {
fullRestoreErr := fmt.Errorf("failed to restore original file: %w", restoreErr)
errMsg = errors.Join(errMsg, fullRestoreErr)
}
logger.ErrorContext(ctx, errMsg.Error())
errs = append(errs, errMsg)
continue
}
logger.DebugContext(ctx, fmt.Sprintf("migration completed for file: %s", filePath))
}
}
logger.InfoContext(ctx, "migration completed!")
// If errs is empty, errors.Join returns nil
return errors.Join(errs...)
}

View File

@@ -0,0 +1,423 @@
// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package migrate
import (
"bytes"
"os"
"path/filepath"
"strings"
"testing"
"github.com/googleapis/genai-toolbox/cmd/internal"
"github.com/spf13/cobra"
)
func invokeCommand(args []string) (string, error) {
parentCmd := &cobra.Command{Use: "toolbox"}
buf := new(bytes.Buffer)
opts := internal.NewToolboxOptions(internal.WithIOStreams(buf, buf))
internal.PersistentFlags(parentCmd, opts)
cmd := NewCommand(opts)
parentCmd.AddCommand(cmd)
parentCmd.SetArgs(args)
err := parentCmd.Execute()
return buf.String(), err
}
func TestMigrate(t *testing.T) {
toolsFileContent := `
sources:
my-pg-instance:
kind: cloud-sql-postgres
project: my-project
region: my-region
instance: my-instance
database: my_db
user: my_user
password: my_pass`
toolsFileContentNew := `kind: source
name: my-pg-instance
type: cloud-sql-postgres
project: my-project
region: my-region
instance: my-instance
database: my_db
user: my_user
password: my_pass
`
toolsFileContent2 := `
tools:
example_tool2:
kind: postgres-sql
source: my-pg-instance
description: some description
statement: SELECT * FROM SQL_STATEMENT;
parameters:
- name: country
type: string
description: some description`
toolsFileContent2New := `kind: tool
name: example_tool2
type: postgres-sql
source: my-pg-instance
description: some description
statement: SELECT * FROM SQL_STATEMENT;
parameters:
- name: country
type: string
description: some description
`
t.Run("migrate tools file", func(t *testing.T) {
tmpDir := t.TempDir()
toolsFilePath := filepath.Join(tmpDir, "foo.yaml")
if err := os.WriteFile(toolsFilePath, []byte(toolsFileContent), 0644); err != nil {
t.Fatalf("failed to write tools file: %v", err)
}
args := []string{"migrate", "--tools-file", toolsFilePath}
got, err := invokeCommand(args)
if err != nil {
t.Fatalf("command failed: %v\nOutput: %s", err, got)
}
// verify backup file
backupFile := toolsFilePath + ".bak"
_, err = os.Stat(backupFile)
if err != nil {
t.Fatalf("error verifying backup file: %v", err)
}
actualContent, err := os.ReadFile(backupFile)
if err != nil {
t.Fatalf("failed to read backup file: %v", err)
}
if !bytes.Equal(actualContent, []byte(toolsFileContent)) {
t.Fatalf("file content mismatch!\nExpected: %q\nGot: %q", toolsFileContent, actualContent)
}
// check content of new file
actualContent, err = os.ReadFile(toolsFilePath)
if err != nil {
t.Fatalf("failed to read backup file: %v", err)
}
if !bytes.Equal(actualContent, []byte(toolsFileContentNew)) {
t.Fatalf("file content mismatch!\nExpected: %q\nGot: %q", toolsFileContentNew, actualContent)
}
})
t.Run("migrate tools files", func(t *testing.T) {
tmpDir := t.TempDir()
toolsFilePath1 := filepath.Join(tmpDir, "foo.yaml")
if err := os.WriteFile(toolsFilePath1, []byte(toolsFileContent), 0644); err != nil {
t.Fatalf("failed to write tools file: %v", err)
}
toolsFilePath2 := filepath.Join(tmpDir, "foo2.yaml")
if err := os.WriteFile(toolsFilePath2, []byte(toolsFileContent2), 0644); err != nil {
t.Fatalf("failed to write tools file: %v", err)
}
toolsFiles := toolsFilePath1 + "," + toolsFilePath2
args := []string{"migrate", "--tools-files", toolsFiles}
got, err := invokeCommand(args)
if err != nil {
t.Fatalf("command failed: %v\nOutput: %s", err, got)
}
// verify backup file1
backupFile := toolsFilePath1 + ".bak"
_, err = os.Stat(backupFile)
if err != nil {
t.Fatalf("error verifying backup file: %v", err)
}
actualContent, err := os.ReadFile(backupFile)
if err != nil {
t.Fatalf("failed to read backup file: %v", err)
}
if !bytes.Equal(actualContent, []byte(toolsFileContent)) {
t.Fatalf("file content mismatch!\nExpected: %q\nGot: %q", toolsFileContent, actualContent)
}
// verify backup file2
backupFile = toolsFilePath2 + ".bak"
_, err = os.Stat(backupFile)
if err != nil {
t.Fatalf("error verifying backup file: %v", err)
}
actualContent, err = os.ReadFile(backupFile)
if err != nil {
t.Fatalf("failed to read backup file: %v", err)
}
if !bytes.Equal(actualContent, []byte(toolsFileContent2)) {
t.Fatalf("file content mismatch!\nExpected: %q\nGot: %q", toolsFileContent2, actualContent)
}
// check content of new file1
actualContent, err = os.ReadFile(toolsFilePath1)
if err != nil {
t.Fatalf("failed to read backup file: %v", err)
}
if !bytes.Equal(actualContent, []byte(toolsFileContentNew)) {
t.Fatalf("file content mismatch!\nExpected: %q\nGot: %q", toolsFileContentNew, actualContent)
}
// check content of new file2
actualContent, err = os.ReadFile(toolsFilePath2)
if err != nil {
t.Fatalf("failed to read backup file: %v", err)
}
if !bytes.Equal(actualContent, []byte(toolsFileContent2New)) {
t.Fatalf("file content mismatch!\nExpected: %q\nGot: %q", toolsFileContent2New, actualContent)
}
})
t.Run("migrate tools folder", func(t *testing.T) {
tmpDir := t.TempDir()
toolsFilePath1 := filepath.Join(tmpDir, "foo.yaml")
if err := os.WriteFile(toolsFilePath1, []byte(toolsFileContent), 0644); err != nil {
t.Fatalf("failed to write tools file: %v", err)
}
toolsFilePath2 := filepath.Join(tmpDir, "foo2.yaml")
if err := os.WriteFile(toolsFilePath2, []byte(toolsFileContent2), 0644); err != nil {
t.Fatalf("failed to write tools file: %v", err)
}
args := []string{"migrate", "--tools-folder", tmpDir}
got, err := invokeCommand(args)
if err != nil {
t.Fatalf("command failed: %v\nOutput: %s", err, got)
}
// verify backup file1
backupFile := toolsFilePath1 + ".bak"
_, err = os.Stat(backupFile)
if err != nil {
t.Fatalf("error verifying backup file: %v", err)
}
actualContent, err := os.ReadFile(backupFile)
if err != nil {
t.Fatalf("failed to read backup file: %v", err)
}
if !bytes.Equal(actualContent, []byte(toolsFileContent)) {
t.Fatalf("file content mismatch!\nExpected: %q\nGot: %q", toolsFileContent, actualContent)
}
// verify backup file2
backupFile = toolsFilePath2 + ".bak"
_, err = os.Stat(backupFile)
if err != nil {
t.Fatalf("error verifying backup file: %v", err)
}
actualContent, err = os.ReadFile(backupFile)
if err != nil {
t.Fatalf("failed to read backup file: %v", err)
}
if !bytes.Equal(actualContent, []byte(toolsFileContent2)) {
t.Fatalf("file content mismatch!\nExpected: %q\nGot: %q", toolsFileContent2, actualContent)
}
// check content of new file1
actualContent, err = os.ReadFile(toolsFilePath1)
if err != nil {
t.Fatalf("failed to read backup file: %v", err)
}
if !bytes.Equal(actualContent, []byte(toolsFileContentNew)) {
t.Fatalf("file content mismatch!\nExpected: %q\nGot: %q", toolsFileContentNew, actualContent)
}
// check content of new file2
actualContent, err = os.ReadFile(toolsFilePath2)
if err != nil {
t.Fatalf("failed to read backup file: %v", err)
}
if !bytes.Equal(actualContent, []byte(toolsFileContent2New)) {
t.Fatalf("file content mismatch!\nExpected: %q\nGot: %q", toolsFileContent2New, actualContent)
}
})
}
func TestMigrateDryRun(t *testing.T) {
toolsFileContent := `
sources:
my-pg-instance:
kind: cloud-sql-postgres
project: my-project
region: my-region
instance: my-instance
database: my_db
user: my_user
password: my_pass
`
toolsFileContentNew := `kind: source
name: my-pg-instance
type: cloud-sql-postgres
project: my-project
region: my-region
instance: my-instance
database: my_db
user: my_user
password: my_pass
`
toolsFileContent2 := `
tools:
example_tool2:
kind: postgres-sql
source: my-pg-instance
description: some description
statement: SELECT * FROM SQL_STATEMENT;
parameters:
- name: country
type: string
description: some description`
toolsFileContent2New := `kind: tool
name: example_tool2
type: postgres-sql
source: my-pg-instance
description: some description
statement: SELECT * FROM SQL_STATEMENT;
parameters:
- name: country
type: string
description: some description
`
t.Run("migrate tools file", func(t *testing.T) {
tmpDir := t.TempDir()
toolsFilePath := filepath.Join(tmpDir, "foo.yaml")
if err := os.WriteFile(toolsFilePath, []byte(toolsFileContent), 0644); err != nil {
t.Fatalf("failed to write tools file: %v", err)
}
args := []string{"migrate", "--tools-file", toolsFilePath, "--dry-run"}
got, err := invokeCommand(args)
if err != nil {
t.Fatalf("command failed: %v\nOutput: %s", err, got)
}
// verify original file
actualContent, err := os.ReadFile(toolsFilePath)
if err != nil {
t.Fatalf("failed to read backup file: %v", err)
}
if !bytes.Equal(actualContent, []byte(toolsFileContent)) {
t.Fatalf("file content mismatch!\nExpected: %q\nGot: %q", toolsFileContent, actualContent)
}
// check output
if !strings.Contains(got, toolsFileContentNew) {
t.Fatalf("expected output not found!\nExpected: %q\nGot: %q", toolsFileContentNew, got)
}
})
t.Run("migrate tools files", func(t *testing.T) {
tmpDir := t.TempDir()
toolsFilePath1 := filepath.Join(tmpDir, "foo.yaml")
if err := os.WriteFile(toolsFilePath1, []byte(toolsFileContent), 0644); err != nil {
t.Fatalf("failed to write tools file: %v", err)
}
toolsFilePath2 := filepath.Join(tmpDir, "foo2.yaml")
if err := os.WriteFile(toolsFilePath2, []byte(toolsFileContent2), 0644); err != nil {
t.Fatalf("failed to write tools file: %v", err)
}
toolsFiles := toolsFilePath1 + "," + toolsFilePath2
args := []string{"migrate", "--tools-files", toolsFiles, "--dry-run"}
got, err := invokeCommand(args)
if err != nil {
t.Fatalf("command failed: %v\nOutput: %s", err, got)
}
// verify original file1
actualContent, err := os.ReadFile(toolsFilePath1)
if err != nil {
t.Fatalf("failed to read backup file: %v", err)
}
if !bytes.Equal(actualContent, []byte(toolsFileContent)) {
t.Fatalf("file content mismatch!\nExpected: %q\nGot: %q", toolsFileContent, actualContent)
}
// verify original file2
actualContent, err = os.ReadFile(toolsFilePath2)
if err != nil {
t.Fatalf("failed to read backup file: %v", err)
}
if !bytes.Equal(actualContent, []byte(toolsFileContent2)) {
t.Fatalf("file content mismatch!\nExpected: %q\nGot: %q", toolsFileContent2, actualContent)
}
// check output
if !strings.Contains(got, toolsFileContentNew) {
t.Fatalf("expected output not found!\nExpected: %q\nGot: %q", toolsFileContentNew, got)
}
if !strings.Contains(got, toolsFileContent2New) {
t.Fatalf("expected output not found!\nExpected: %q\nGot: %q", toolsFileContent2New, got)
}
})
t.Run("migrate tools folder", func(t *testing.T) {
tmpDir := t.TempDir()
toolsFilePath1 := filepath.Join(tmpDir, "foo.yaml")
if err := os.WriteFile(toolsFilePath1, []byte(toolsFileContent), 0644); err != nil {
t.Fatalf("failed to write tools file: %v", err)
}
toolsFilePath2 := filepath.Join(tmpDir, "foo2.yaml")
if err := os.WriteFile(toolsFilePath2, []byte(toolsFileContent2), 0644); err != nil {
t.Fatalf("failed to write tools file: %v", err)
}
args := []string{"migrate", "--tools-folder", tmpDir, "--dry-run"}
got, err := invokeCommand(args)
if err != nil {
t.Fatalf("command failed: %v\nOutput: %s", err, got)
}
// verify original file1
actualContent, err := os.ReadFile(toolsFilePath1)
if err != nil {
t.Fatalf("failed to read backup file: %v", err)
}
if !bytes.Equal(actualContent, []byte(toolsFileContent)) {
t.Fatalf("file content mismatch!\nExpected: %q\nGot: %q", toolsFileContent, actualContent)
}
// verify original file2
actualContent, err = os.ReadFile(toolsFilePath2)
if err != nil {
t.Fatalf("failed to read backup file: %v", err)
}
if !bytes.Equal(actualContent, []byte(toolsFileContent2)) {
t.Fatalf("file content mismatch!\nExpected: %q\nGot: %q", toolsFileContent2, actualContent)
}
// check output
if !strings.Contains(got, toolsFileContentNew) {
t.Fatalf("expected output not found!\nExpected: %q\nGot: %q", toolsFileContentNew, got)
}
if !strings.Contains(got, toolsFileContent2New) {
t.Fatalf("expected output not found!\nExpected: %q\nGot: %q", toolsFileContent2New, got)
}
})
}

259
cmd/internal/options.go Normal file
View File

@@ -0,0 +1,259 @@
// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package internal
import (
"context"
"fmt"
"io"
"os"
"slices"
"strings"
"github.com/googleapis/genai-toolbox/internal/log"
"github.com/googleapis/genai-toolbox/internal/prebuiltconfigs"
"github.com/googleapis/genai-toolbox/internal/server"
"github.com/googleapis/genai-toolbox/internal/telemetry"
"github.com/googleapis/genai-toolbox/internal/util"
)
type IOStreams struct {
In io.Reader
Out io.Writer
ErrOut io.Writer
}
// ToolboxOptions holds dependencies shared by all commands.
type ToolboxOptions struct {
IOStreams IOStreams
Logger log.Logger
Cfg server.ServerConfig
Config string
Configs []string
ConfigFolder string
PrebuiltConfigs []string
}
// Option defines a function that modifies the ToolboxOptions struct.
type Option func(*ToolboxOptions)
// NewToolboxOptions creates a new instance with defaults, then applies any
// provided options.
func NewToolboxOptions(opts ...Option) *ToolboxOptions {
o := &ToolboxOptions{
IOStreams: IOStreams{
In: os.Stdin,
Out: os.Stdout,
ErrOut: os.Stderr,
},
}
for _, opt := range opts {
opt(o)
}
return o
}
// Apply allows you to update an EXISTING ToolboxOptions instance.
// This is useful for "late binding".
func (o *ToolboxOptions) Apply(opts ...Option) {
for _, opt := range opts {
opt(o)
}
}
// WithIOStreams updates the IO streams.
func WithIOStreams(out, err io.Writer) Option {
return func(o *ToolboxOptions) {
o.IOStreams.Out = out
o.IOStreams.ErrOut = err
}
}
// Setup create logger and telemetry instrumentations.
func (opts *ToolboxOptions) Setup(ctx context.Context) (context.Context, func(context.Context) error, error) {
// If stdio, set logger's out stream (usually DEBUG and INFO logs) to
// errStream
loggerOut := opts.IOStreams.Out
if opts.Cfg.Stdio {
loggerOut = opts.IOStreams.ErrOut
}
// Handle logger separately from config
logger, err := log.NewLogger(opts.Cfg.LoggingFormat.String(), opts.Cfg.LogLevel.String(), loggerOut, opts.IOStreams.ErrOut)
if err != nil {
return ctx, nil, fmt.Errorf("unable to initialize logger: %w", err)
}
ctx = util.WithLogger(ctx, logger)
opts.Logger = logger
// Set up OpenTelemetry
otelShutdown, err := telemetry.SetupOTel(ctx, opts.Cfg.Version, opts.Cfg.TelemetryOTLP, opts.Cfg.TelemetryGCP, opts.Cfg.TelemetryServiceName)
if err != nil {
errMsg := fmt.Errorf("error setting up OpenTelemetry: %w", err)
logger.ErrorContext(ctx, errMsg.Error())
return ctx, nil, errMsg
}
shutdownFunc := func(ctx context.Context) error {
err := otelShutdown(ctx)
if err != nil {
errMsg := fmt.Errorf("error shutting down OpenTelemetry: %w", err)
logger.ErrorContext(ctx, errMsg.Error())
return err
}
return nil
}
instrumentation, err := telemetry.CreateTelemetryInstrumentation(opts.Cfg.Version)
if err != nil {
errMsg := fmt.Errorf("unable to create telemetry instrumentation: %w", err)
logger.ErrorContext(ctx, errMsg.Error())
return ctx, shutdownFunc, errMsg
}
ctx = util.WithInstrumentation(ctx, instrumentation)
return ctx, shutdownFunc, nil
}
// GetCustomConfigFiles retrieves the list of custom config file paths
func (opts *ToolboxOptions) GetCustomConfigFiles(ctx context.Context) ([]string, bool, error) {
// Determine if Custom Files should be loaded
// Check for explicit custom flags
isCustomConfigured := opts.Config != "" || len(opts.Configs) > 0 || opts.ConfigFolder != ""
logger, err := util.LoggerFromContext(ctx)
if err != nil {
return nil, isCustomConfigured, err
}
// Load Custom Configurations
if isCustomConfigured {
// Enforce exclusivity among custom flags (tools-file vs tools-files vs tools-folder)
if (opts.Config != "" && len(opts.Configs) > 0) ||
(opts.Config != "" && opts.ConfigFolder != "") ||
(len(opts.Configs) > 0 && opts.ConfigFolder != "") {
errMsg := fmt.Errorf("--config/--tools-file, --configs/--tools-files, and --config-folder/--tools-folder flags cannot be used simultaneously")
logger.ErrorContext(ctx, errMsg.Error())
return nil, isCustomConfigured, errMsg
}
if len(opts.Configs) > 0 {
// Use tools-files
logger.InfoContext(ctx, fmt.Sprintf("retrieving %d tool configuration files", len(opts.Configs)))
return opts.Configs, isCustomConfigured, nil
} else if opts.ConfigFolder != "" {
// Use tools-folder
allFiles, err := GetPathsFromConfigFolder(ctx, opts.ConfigFolder)
return allFiles, isCustomConfigured, err
} else {
// use tools-file
return []string{opts.Config}, isCustomConfigured, nil
}
}
// Determine if default 'tools.yaml' should be used (No prebuilt AND No custom flags)
useDefaultConfig := len(opts.PrebuiltConfigs) == 0
if useDefaultConfig {
// else we will add the default path regardless
return []string{"tools.yaml"}, true, nil
}
// no custom config files are found
// server are likely using prebuilt configs
return []string{}, false, nil
}
// LoadConfig checks and merge files that should be loaded into the server
func (opts *ToolboxOptions) LoadConfig(ctx context.Context, parser *ConfigParser) (bool, error) {
// get all the file paths for custom config file
filesPaths, isCustomConfigured, err := opts.GetCustomConfigFiles(ctx)
if err != nil {
return isCustomConfigured, err
}
logger, err := util.LoggerFromContext(ctx)
if err != nil {
return isCustomConfigured, err
}
var allConfigs []Config
// Load Prebuilt Configuration
if len(opts.PrebuiltConfigs) > 0 {
slices.Sort(opts.PrebuiltConfigs)
sourcesList := strings.Join(opts.PrebuiltConfigs, ", ")
logMsg := fmt.Sprintf("Using prebuilt tool configurations for: %s", sourcesList)
logger.InfoContext(ctx, logMsg)
for _, configName := range opts.PrebuiltConfigs {
buf, err := prebuiltconfigs.Get(configName)
if err != nil {
logger.ErrorContext(ctx, err.Error())
return isCustomConfigured, err
}
// Parse into Config struct
parsed, err := parser.ParseConfig(ctx, buf)
if err != nil {
errMsg := fmt.Errorf("unable to parse prebuilt tool configuration for '%s': %w", configName, err)
logger.ErrorContext(ctx, errMsg.Error())
return isCustomConfigured, errMsg
}
allConfigs = append(allConfigs, parsed)
}
}
// Load Custom Configurations
if isCustomConfigured {
customTools, err := parser.LoadAndMergeConfigs(ctx, filesPaths)
if err != nil {
logger.ErrorContext(ctx, err.Error())
return isCustomConfigured, err
}
allConfigs = append(allConfigs, customTools)
}
// Modify version string based on loaded configurations
if len(opts.PrebuiltConfigs) > 0 {
tag := "prebuilt"
if isCustomConfigured {
tag = "custom"
}
// prebuiltConfigs is already sorted above
for _, configName := range opts.PrebuiltConfigs {
opts.Cfg.Version += fmt.Sprintf("+%s.%s", tag, configName)
}
}
// Merge Everything
// This will error if custom tools collide with prebuilt tools
finalConfig, err := mergeConfigs(allConfigs...)
if err != nil {
logger.ErrorContext(ctx, err.Error())
return isCustomConfigured, err
}
opts.Cfg.SourceConfigs = finalConfig.Sources
opts.Cfg.AuthServiceConfigs = finalConfig.AuthServices
opts.Cfg.EmbeddingModelConfigs = finalConfig.EmbeddingModels
opts.Cfg.ToolConfigs = finalConfig.Tools
opts.Cfg.ToolsetConfigs = finalConfig.Toolsets
opts.Cfg.PromptConfigs = finalConfig.Prompts
return isCustomConfigured, nil
}

View File

@@ -12,57 +12,38 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package cmd
package internal
import (
"errors"
"io"
"testing"
"github.com/spf13/cobra"
)
func TestCommandOptions(t *testing.T) {
func TestToolboxOptions(t *testing.T) {
w := io.Discard
tcs := []struct {
desc string
isValid func(*Command) error
isValid func(*ToolboxOptions) error
option Option
}{
{
desc: "with logger",
isValid: func(c *Command) error {
if c.outStream != w || c.errStream != w {
isValid: func(o *ToolboxOptions) error {
if o.IOStreams.Out != w || o.IOStreams.ErrOut != w {
return errors.New("loggers do not match")
}
return nil
},
option: WithStreams(w, w),
option: WithIOStreams(w, w),
},
}
for _, tc := range tcs {
t.Run(tc.desc, func(t *testing.T) {
got, err := invokeProxyWithOption(tc.option)
if err != nil {
t.Fatal(err)
}
got := NewToolboxOptions(tc.option)
if err := tc.isValid(got); err != nil {
t.Errorf("option did not initialize command correctly: %v", err)
}
})
}
}
func invokeProxyWithOption(o Option) (*Command, error) {
c := NewCommand(o)
// Keep the test output quiet
c.SilenceUsage = true
c.SilenceErrors = true
// Disable execute behavior
c.RunE = func(*cobra.Command, []string) error {
return nil
}
err := c.Execute()
return c, err
}

View File

@@ -0,0 +1,132 @@
// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package serve
import (
"context"
"fmt"
"os"
"os/signal"
"syscall"
"time"
"github.com/googleapis/genai-toolbox/cmd/internal"
"github.com/googleapis/genai-toolbox/internal/server"
"github.com/spf13/cobra"
)
func NewCommand(opts *internal.ToolboxOptions) *cobra.Command {
cmd := &cobra.Command{
Use: "serve",
Short: "Deploy the toolbox server",
Long: "Deploy the toolbox server",
}
flags := cmd.Flags()
internal.ServeFlags(flags, opts)
cmd.RunE = func(*cobra.Command, []string) error { return runServe(cmd, opts) }
return cmd
}
func runServe(cmd *cobra.Command, opts *internal.ToolboxOptions) error {
ctx, cancel := context.WithCancel(cmd.Context())
defer cancel()
// watch for sigterm / sigint signals
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGTERM, syscall.SIGINT)
go func(sCtx context.Context) {
var s os.Signal
select {
case <-sCtx.Done():
// this should only happen when the context supplied when testing is canceled
return
case s = <-signals:
}
switch s {
case syscall.SIGINT:
opts.Logger.DebugContext(sCtx, "Received SIGINT signal to shutdown.")
case syscall.SIGTERM:
opts.Logger.DebugContext(sCtx, "Received SIGTERM signal to shutdown.")
}
cancel()
}(ctx)
ctx, shutdown, err := opts.Setup(ctx)
if err != nil {
return err
}
defer func() {
_ = shutdown(ctx)
}()
// start server
s, err := server.NewServer(ctx, opts.Cfg)
if err != nil {
errMsg := fmt.Errorf("toolbox failed to initialize: %w", err)
opts.Logger.ErrorContext(ctx, errMsg.Error())
return errMsg
}
// run server in background
srvErr := make(chan error, 1)
if opts.Cfg.Stdio {
go func() {
defer close(srvErr)
err = s.ServeStdio(ctx, opts.IOStreams.In, opts.IOStreams.Out)
if err != nil {
srvErr <- err
}
}()
} else {
err = s.Listen(ctx)
if err != nil {
errMsg := fmt.Errorf("toolbox failed to start listener: %w", err)
opts.Logger.ErrorContext(ctx, errMsg.Error())
return errMsg
}
opts.Logger.InfoContext(ctx, "Server ready to serve!")
if opts.Cfg.UI {
opts.Logger.InfoContext(ctx, fmt.Sprintf("Toolbox UI is up and running at: http://%s:%d/ui", opts.Cfg.Address, opts.Cfg.Port))
}
go func() {
defer close(srvErr)
err = s.Serve(ctx)
if err != nil {
srvErr <- err
}
}()
}
// wait for either the server to error out or the command's context to be canceled
select {
case err := <-srvErr:
if err != nil {
errMsg := fmt.Errorf("toolbox crashed with the following error: %w", err)
opts.Logger.ErrorContext(ctx, errMsg.Error())
return errMsg
}
case <-ctx.Done():
shutdownContext, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
opts.Logger.WarnContext(shutdownContext, "Shutting down gracefully...")
err := s.Shutdown(shutdownContext)
if err == context.DeadlineExceeded {
return fmt.Errorf("graceful shutdown timed out... forcing exit")
}
}
return nil
}

View File

@@ -0,0 +1,63 @@
// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package serve
import (
"bytes"
"context"
"strings"
"testing"
"time"
"github.com/googleapis/genai-toolbox/cmd/internal"
"github.com/spf13/cobra"
)
func serveCommand(ctx context.Context, args []string) (string, error) {
parentCmd := &cobra.Command{Use: "toolbox"}
buf := new(bytes.Buffer)
opts := internal.NewToolboxOptions(internal.WithIOStreams(buf, buf))
internal.PersistentFlags(parentCmd, opts)
cmd := NewCommand(opts)
parentCmd.AddCommand(cmd)
parentCmd.SetArgs(args)
// Inject the context into the Cobra command
parentCmd.SetContext(ctx)
err := parentCmd.Execute()
return buf.String(), err
}
func TestServe(t *testing.T) {
// context will automatically shutdown in 1 second.
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()
args := []string{"serve", "--port", "0"}
output, err := serveCommand(ctx, args)
if err != nil {
t.Fatalf("expected graceful shutdown without error, got: %v", err)
}
if !strings.Contains(output, "Server ready to serve!") {
t.Errorf("expected to find server ready message in output, got: %s", output)
}
if !strings.Contains(output, "Shutting down gracefully...") {
t.Errorf("expected to find graceful shutdown message in output, got: %s", output)
}
}

Some files were not shown because too many files have changed in this diff Show More