Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
7fa7437
feat(tools/looker): Enable Get All Lookml Tests tool for Looker
Anthrino Jan 30, 2026
a68f60a
Fix optional query param file_id to use *string pointer
Anthrino Feb 19, 2026
f49c65e
Improve parameter descriptions as per AI review suggestions
Anthrino Feb 19, 2026
638cd93
Update copyright year for new file lookergetlookmltests.go
Anthrino Feb 20, 2026
469c745
Update copyright year for new file lookergetlookmltests_test.go
Anthrino Feb 20, 2026
b353c52
fixes for the return type of invoke, the import, and the prebuilt con…
drstrangelooker Feb 20, 2026
4110140
feat(tools/looker): Enable Run Lookml Tests tool for Looker
Anthrino Jan 29, 2026
e84d1ec
feat(tools/looker): Enable Lookml View creation from table in Looker
Anthrino Jan 29, 2026
a43fc92
chore: fix error return types, add proper imports.
drstrangelooker Feb 26, 2026
c669336
Fix looker prebuilt tools test
drstrangelooker Feb 26, 2026
f68c01a
Add documentation for 3 new tools and update missing integration tests
Anthrino Feb 26, 2026
941d18d
ci: update Github Actions to use step outputs (#2553)
duwenxin99 Feb 26, 2026
74a39fa
integration test fixes
drstrangelooker Feb 26, 2026
8129302
Merge branch 'main' into looker-get-all-tests
drstrangelooker Feb 26, 2026
56b3f5a
fx lint issue
drstrangelooker Feb 26, 2026
699037d
disable unsupported test
drstrangelooker Feb 26, 2026
664f72c
chore(bigquery): refactor conversational analytics handlers and fix t…
Genesis929 Feb 26, 2026
a54a078
ci(postgres): temporarily disable flakey integration test (#2571)
duwenxin99 Feb 26, 2026
3729556
refactor: update GDA source and tool to use Cloud Go SDK (#2313)
wangauone Feb 27, 2026
8d05b4e
chore: add v0.28.0 versioned doc (#2570)
duwenxin99 Feb 27, 2026
7aef485
Merge branch 'main' into looker-get-all-tests
drstrangelooker Feb 27, 2026
86de4da
chore: Update CODEOWNERS (#2575)
averikitsch Feb 27, 2026
d5e9512
fix: enforce required validation for explicit null parameter values (…
twishabansal Feb 27, 2026
c51b397
Merge branch 'main' into looker-get-all-tests
duwenxin99 Feb 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,7 @@
**/firestore/ @googleapis/toolbox-firestore-team
**/looker/ @googleapis/toolbox-looker-team
**/spanner/ @googleapis/toolbox-spanner-team

# Docs
/docs/ @googleapis/senseai-eco-team
/*.md @googleapis/senseai-eco-team
13 changes: 7 additions & 6 deletions .github/workflows/deploy_versioned_docs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,10 @@ jobs:
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:
GITHUB_EVENT_RELEASE_TAG_NAME: ${{ github.event.release.tag_name }}
RELEASE_TAG: ${{ github.event.release.tag_name }}
run: echo "VERSION=${RELEASE_TAG}" >> "$GITHUB_OUTPUT"

- name: Setup Hugo
uses: peaceiris/actions-hugo@75d2e84710de30f6ff7268e08f310b60ef14033f # v3
Expand All @@ -58,7 +59,7 @@ 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

- name: Deploy
Expand All @@ -67,9 +68,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
Expand All @@ -89,4 +90,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 }}"
31 changes: 14 additions & 17 deletions .github/workflows/link_checker.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ permissions:
pull-requests: write
issues: write


jobs:
link-check:
runs-on: ubuntu-latest
Expand All @@ -29,6 +28,7 @@ jobs:
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
fetch-depth: 0

- name: Identify Changed Files
id: changed-files
shell: bash
Expand All @@ -38,25 +38,23 @@ jobs:

if [ -z "$CHANGED_FILES" ]; then
echo "No markdown files changed. Skipping checks."
echo "HAS_CHANGES=false" >> $GITHUB_ENV
echo "HAS_CHANGES=false" >> "$GITHUB_OUTPUT"
else
echo "--- Changed Files to Scan ---"
echo "$CHANGED_FILES"
echo "-----------------------------"

# FIX: Wrap filenames in quotes to handle spaces
FILES_QUOTED=$(echo "$CHANGED_FILES" | sed 's/^/"/;s/$/"/' | tr '\n' ' ')

# Write to env using EOF pattern
echo "CHECK_FILES<<EOF" >> $GITHUB_ENV
echo "$FILES_QUOTED" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
echo "HAS_CHANGES=true" >> $GITHUB_ENV
# 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: env.HAS_CHANGES == 'true'
if: steps.changed-files.outputs.HAS_CHANGES == 'true'
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5
with:
path: .lycheecache
Expand All @@ -65,7 +63,7 @@ jobs:

- name: Link Checker
id: lychee-check
if: env.HAS_CHANGES == 'true'
if: steps.changed-files.outputs.HAS_CHANGES == 'true'
uses: lycheeverse/lychee-action@a8c4c7cb88f0c7386610c35eb25108e448569cb0 # v2
continue-on-error: true
with:
Expand All @@ -75,14 +73,15 @@ jobs:
--cache
--max-cache-age 1d
--exclude '^neo4j\+.*' --exclude '^bolt://.*'
${{ env.CHECK_FILES }}
${{ 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: Find comment
uses: peter-evans/find-comment@b30e6a3c0ed37e7c023ccd3f1db5c6c0b0c23aad # v4
id: find-comment
Expand All @@ -103,18 +102,16 @@ jobs:
STEPS_FIND_COMMENT_OUTPUTS_COMMENT_ID: ${{ steps.find-comment.outputs.comment-id }}

- name: Prepare Report
if: env.HAS_CHANGES == 'true' && steps.lychee-check.outcome == 'failure'
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 "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 PR Comment
if: env.HAS_CHANGES == 'true' && steps.lychee-check.outcome == 'failure'
if: steps.changed-files.outputs.HAS_CHANGES == 'true' && steps.lychee-check.outcome == 'failure'
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5
with:
comment-id: ${{ steps.find-comment.outputs.comment-id }}
Expand Down
4 changes: 4 additions & 0 deletions .hugo/hugo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ ignoreFiles = ["quickstart/shared", "quickstart/python", "quickstart/js", "quick
# 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.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/"
Expand Down
3 changes: 3 additions & 0 deletions cmd/internal/imports.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ import (
_ "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"
Expand All @@ -120,6 +121,7 @@ import (
_ "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"
Expand All @@ -138,6 +140,7 @@ import (
_ "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"
Expand Down
2 changes: 1 addition & 1 deletion cmd/internal/tools_file_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1778,7 +1778,7 @@ func TestPrebuiltTools(t *testing.T) {
wantToolset: server.ToolsetConfigs{
"looker_tools": tools.ToolsetConfig{
Name: "looker_tools",
ToolNames: []string{"get_models", "get_explores", "get_dimensions", "get_measures", "get_filters", "get_parameters", "query", "query_sql", "query_url", "get_looks", "run_look", "make_look", "get_dashboards", "run_dashboard", "make_dashboard", "add_dashboard_element", "add_dashboard_filter", "generate_embed_url", "health_pulse", "health_analyze", "health_vacuum", "dev_mode", "get_projects", "get_project_files", "get_project_file", "create_project_file", "update_project_file", "delete_project_file", "get_project_directories", "create_project_directory", "delete_project_directory", "validate_project", "get_connections", "get_connection_schemas", "get_connection_databases", "get_connection_tables", "get_connection_table_columns"},
ToolNames: []string{"get_models", "get_explores", "get_dimensions", "get_measures", "get_filters", "get_parameters", "query", "query_sql", "query_url", "get_looks", "run_look", "make_look", "get_dashboards", "run_dashboard", "make_dashboard", "add_dashboard_element", "add_dashboard_filter", "generate_embed_url", "health_pulse", "health_analyze", "health_vacuum", "dev_mode", "get_projects", "get_project_files", "get_project_file", "create_project_file", "update_project_file", "delete_project_file", "get_project_directories", "create_project_directory", "delete_project_directory", "validate_project", "get_connections", "get_connection_schemas", "get_connection_databases", "get_connection_tables", "get_connection_table_columns", "get_lookml_tests", "run_lookml_tests", "create_view_from_table"},
},
},
},
Expand Down
3 changes: 3 additions & 0 deletions docs/en/reference/prebuilt-tools.md
Original file line number Diff line number Diff line change
Expand Up @@ -552,6 +552,9 @@ See [Usage Examples](../reference/cli.md#examples).
* `get_connection_databases`: Get the available databases in a connection.
* `get_connection_tables`: Get the available tables in a connection.
* `get_connection_table_columns`: Get the available columns for a table.
* `get_lookml_tests`: Retrieves a list of available LookML tests for a project.
* `run_lookml_tests`: Executes specific LookML tests within a project.
* `create_view_from_table`: Generates boilerplate LookML views directly from the database schema.

## Looker Conversational Analytics

Expand Down
50 changes: 50 additions & 0 deletions docs/en/resources/tools/looker/looker-create-view-from-table.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
---
title: "looker-create-view-from-table"
type: docs
weight: 1
description: >
This tool generates boilerplate LookML views directly from the database schema.
aliases:
- /resources/tools/looker-create-view-from-table
---

## About

A "looker-create-view-from-table" tool triggers the automatic generation of LookML view files based on database tables.

It's compatible with the following sources:

- [looker](../../sources/looker.md)

`looker-create-view-from-table` accepts project_id, connection, tables, and folder_name parameters.

## Example

```yaml
tools:
create_view_from_table:
kind: looker-create-view-from-table
source: looker-source
description: |
This tool generates boilerplate LookML views directly from the database schema.
It does not create model or explore files, only view files in the specified folder.

Prerequisite: The Looker session must be in Development Mode. Use `dev_mode: true` first.

Parameters:
- project_id (required): The unique ID of the LookML project.
- connection (required): The database connection name.
- tables (required): A list of objects to generate views for. Each object must contain `schema` and `table_name` (note: table names are case-sensitive). Optional fields include `primary_key`, `base_view`, and `columns` (array of objects with `column_name`).
- folder_name (optional): The folder to place the view files in (defaults to 'views/').

Output:
A confirmation message upon successful view generation, or an error message if the operation fails.
```

## Reference

| **field** | **type** | **required** | **description** |
|-------------|:--------:|:------------:|----------------------------------------------------|
| kind | string | true | Must be "looker-create-view-from-table". |
| source | string | true | Name of the source Looker instance. |
| description | string | true | Description of the tool that is passed to the LLM. |
53 changes: 53 additions & 0 deletions docs/en/resources/tools/looker/looker-get-lookml-tests.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
---
title: "looker-get-lookml-tests"
type: docs
weight: 1
description: >
Returns a list of tests which can be run to validate a project's LookML code and/or the underlying data, optionally filtered by the file id.
aliases:
- /resources/tools/looker-get-lookml-tests
---

## About

A "looker-get-lookml-tests" tool retrieves a list of available LookML tests for a project.

It's compatible with the following sources:

- [looker](../../sources/looker.md)

`looker-get-lookml-tests` accepts project_id and file_id parameters.

## Example

```yaml
tools:
get_lookml_tests:
kind: looker-get-lookml-tests
source: looker-source
description: |
Returns a list of tests which can be run to validate a project's LookML code and/or the underlying data, optionally filtered by the file id.

Prerequisite: The Looker session must be in Development Mode. Use `dev_mode: true` first.

Parameters:
- project_id (required): The unique ID of the LookML project.
- file_id (optional): The ID of the file to filter tests by. This must be the complete file path from the project root (e.g., `models/my_model.model.lkml` or `views/my_view.view.lkml`).

Output:
A JSON array of LookML test objects, each containing:
- model_name: The name of the model.
- name: The name of the test.
- explore_name: The name of the explore being tested.
- query_url_params: The query parameters used for the test.
- file: The file path where the test is defined.
- line: The line number where the test is defined.
```

## Reference

| **field** | **type** | **required** | **description** |
|-------------|:--------:|:------------:|----------------------------------------------------|
| kind | string | true | Must be "looker-get-lookml-tests". |
| source | string | true | Name of the source Looker instance. |
| description | string | true | Description of the tool that is passed to the LLM. |
56 changes: 56 additions & 0 deletions docs/en/resources/tools/looker/looker-run-lookml-tests.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
---
title: "looker-run-lookml-tests"
type: docs
weight: 1
description: >
This tool runs LookML tests in the project, filtered by file, test, and/or model.
aliases:
- /resources/tools/looker-run-lookml-tests
---

## About

A "looker-run-lookml-tests" tool executes specific LookML tests within a project.

It's compatible with the following sources:

- [looker](../../sources/looker.md)

`looker-run-lookml-tests` accepts project_id, file_id, test, and model parameters.

## Example

```yaml
tools:
run_lookml_tests:
kind: looker-run-lookml-tests
source: looker-source
description: |
This tool runs LookML tests in the project, filtered by file, test, and/or model. These filters work in conjunction (logical AND).

Prerequisite: The Looker session must be in Development Mode. Use `dev_mode: true` first.

Parameters:
- project_id (required): The unique ID of the project to run LookML tests for.
- file_id (optional): The ID of the file to run tests for. This must be the complete file path from the project root (e.g., `models/my_model.model.lkml` or `views/my_view.view.lkml`).
- test (optional): The name of the test to run.
- model (optional): The name of the model to run tests for.

Output:
A JSON array containing the results of the executed tests, where each object includes:
- model_name: Name of the model tested.
- test_name: Name of the test.
- assertions_count: Total number of assertions in the test.
- assertions_failed: Number of assertions that failed.
- success: Boolean indicating if the test passed.
- errors: Array of error objects (if any), containing details like `message`, `file_path`, `line_number`, and `severity`.
- warnings: Array of warning messages (if any).
```

## Reference

| **field** | **type** | **required** | **description** |
|-------------|:--------:|:------------:|----------------------------------------------------|
| kind | string | true | Must be "looker-run-lookml-tests". |
| source | string | true | Name of the source Looker instance. |
| description | string | true | Description of the tool that is passed to the LLM. |
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ require (
cloud.google.com/go/dataplex v1.28.0
cloud.google.com/go/dataproc/v2 v2.15.0
cloud.google.com/go/firestore v1.20.0
cloud.google.com/go/geminidataanalytics v0.3.0
cloud.google.com/go/geminidataanalytics v0.5.0
cloud.google.com/go/logging v1.13.1
cloud.google.com/go/longrunning v0.7.0
cloud.google.com/go/spanner v1.86.1
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -311,8 +311,8 @@ cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2
cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w=
cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM=
cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0=
cloud.google.com/go/geminidataanalytics v0.3.0 h1:2Wi/kqFb5OLuEGH7q+/miE19VTqK1MYHjBEHENap9HI=
cloud.google.com/go/geminidataanalytics v0.3.0/go.mod h1:QRc0b6ywyc3Z7S3etFgslz7hippkW/jRvtops5rKqIg=
cloud.google.com/go/geminidataanalytics v0.5.0 h1:+1usY81Cb+hE8BokpqCM7EgJtRCKzUKx7FvrHbT5hCA=
cloud.google.com/go/geminidataanalytics v0.5.0/go.mod h1:QRc0b6ywyc3Z7S3etFgslz7hippkW/jRvtops5rKqIg=
cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60=
cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo=
cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg=
Expand Down
Loading
Loading