Skip to content

Instantly share code, notes, and snippets.

@simonw

simonw/tools.md Secret

Created September 21, 2025 00:20
Show Gist options
  • Select an option

  • Save simonw/43c56203887dd0d07351443a2ba18f29 to your computer and use it in GitHub Desktop.

Select an option

Save simonw/43c56203887dd0d07351443a2ba18f29 to your computer and use it in GitHub Desktop.

2025-09-21T00:19:51 conversation: 01k5mt8b4dwmvwk3e8wppm47r0 id: 01k5mt8b4gqnt5evb6px9gpx0e

Model: openrouter/x-ai/grok-4-fast:free

Prompt

Count available plugins

Tools

  • Datasette_query: 1aa6d35df9b225d03daee33201eab3ae539b67157f3a8ec544b0b5d8eaeeeeb9
    Execute provided SQLite SQL query - read-only, only use SELECT
    Arguments: {"sqlite_sql": {"type": "string"}}
  • Datasette_schema: 24ec61558e67e01fe6927f059ab376bad38b8dfd815851e9f3846371ef35d246
    View the SQLite schema of the attached database
    Arguments: {}

Response

Tool calls

  • Datasette_schema: call_89917654
    Arguments: {}

Token usage

343 input, 273 output, {"completion_tokens_details": {"reasoning_tokens": 257}, "prompt_tokens_details": {"cached_tokens": 109}}

2025-09-21T00:19:54

Prompt

-- none --

Tools

  • Datasette_query: 1aa6d35df9b225d03daee33201eab3ae539b67157f3a8ec544b0b5d8eaeeeeb9
    Execute provided SQLite SQL query - read-only, only use SELECT
    Arguments: {"sqlite_sql": {"type": "string"}}
  • Datasette_schema: 24ec61558e67e01fe6927f059ab376bad38b8dfd815851e9f3846371ef35d246
    View the SQLite schema of the attached database
    Arguments: {}

Tool results

  • Datasette_schema: call_89917654
    [{"group_concat(sql, ';')": "CREATE TABLE [uses] (\n [_id] TEXT PRIMARY KEY,\n [_path] TEXT,\n [text] TEXT,\n [html] TEXT,\n [title] TEXT,\n [summary] TEXT,\n [order] INTEGER\n);CREATE TABLE [datasette_repos] (\n [id] TEXT PRIMARY KEY,\n [nameWithOwner] TEXT,\n [createdAt] TEXT,\n [openGraphImageUrl] TEXT,\n [usesCustomOpenGraphImage] INTEGER,\n [openIssueCount] INTEGER,\n [closedIssueCount] INTEGER,\n [releaseCount] INTEGER,\n [topics] TEXT,\n [latest_commit] TEXT\n);CREATE TABLE [users] (\n [login] TEXT,\n [id] INTEGER PRIMARY KEY,\n [node_id] TEXT,\n [avatar_url] TEXT,\n [gravatar_id] TEXT,\n [html_url] TEXT,\n [type] TEXT,\n [user_view_type] TEXT,\n [site_admin] INTEGER,\n [name] TEXT\n);CREATE TABLE [licenses] (\n [key] TEXT PRIMARY KEY,\n [name] TEXT,\n [spdx_id] TEXT,\n [url] TEXT,\n [node_id] TEXT\n);CREATE TABLE [repos] (\n [id] INTEGER PRIMARY KEY,\n [node_id] TEXT,\n [name] TEXT,\n [full_name] TEXT,\n [private] INTEGER,\n [owner] INTEGER REFERENCES users,\n [html_url] TEXT,\n [description] TEXT,\n [fork] INTEGER,\n [created_at] TEXT,\n [updated_at] TEXT,\n [pushed_at] TEXT,\n [homepage] TEXT,\n [size] INTEGER,\n [stargazers_count] INTEGER,\n [watchers_count] INTEGER,\n [language] TEXT,\n [has_issues] INTEGER,\n [has_projects] INTEGER,\n [has_downloads] INTEGER,\n [has_wiki] INTEGER,\n [has_pages] INTEGER,\n [has_discussions] INTEGER,\n [forks_count] INTEGER,\n [archived] INTEGER,\n [disabled] INTEGER,\n [open_issues_count] INTEGER,\n [license] TEXT,\n [allow_forking] INTEGER,\n [is_template] INTEGER,\n [web_commit_signoff_required] INTEGER,\n [topics] TEXT,\n [visibility] TEXT,\n [forks] INTEGER,\n [open_issues] INTEGER,\n [watchers] INTEGER,\n [default_branch] TEXT,\n [permissions] TEXT,\n [template_repository] TEXT,\n [network_count] INTEGER,\n [subscribers_count] INTEGER,\n [organization] INTEGER REFERENCES users\n, [custom_properties] TEXT, [temp_clone_token] TEXT, [readme] TEXT, [readme_html] TEXT,\n FOREIGN KEY([license]) REFERENCES licenses\n);CREATE TABLE [releases] (\n [html_url] TEXT,\n [id] INTEGER PRIMARY KEY,\n [author] INTEGER REFERENCES users,\n [node_id] TEXT,\n [tag_name] TEXT,\n [target_commitish] TEXT,\n [name] TEXT,\n [draft] INTEGER,\n [prerelease] INTEGER,\n [created_at] TEXT,\n [published_at] TEXT,\n [body] TEXT,\n [repo] INTEGER REFERENCES repos\n, [reactions] TEXT, [mentions_count] INTEGER, [immutable] INTEGER, [updated_at] TEXT);CREATE TABLE [assets] (\n [url] TEXT,\n [id] INTEGER PRIMARY KEY,\n [node_id] TEXT,\n [name] TEXT,\n [label] TEXT,\n [uploader] INTEGER REFERENCES users,\n [content_type] TEXT,\n [state] TEXT,\n [size] INTEGER,\n [download_count] INTEGER,\n [created_at] TEXT,\n [updated_at] TEXT,\n [browser_download_url] TEXT,\n [release] INTEGER REFERENCES releases\n, [digest] TEXT);CREATE INDEX [idx_repos_license]\n ON [repos] ([license]);CREATE INDEX [idx_repos_organization]\n ON [repos] ([organization]);CREATE INDEX [idx_repos_owner]\n ON [repos] ([owner]);CREATE INDEX [idx_releases_repo]\n ON [releases] ([repo]);CREATE INDEX [idx_releases_author]\n ON [releases] ([author]);CREATE INDEX [idx_assets_release]\n ON [assets] ([release]);CREATE INDEX [idx_assets_uploader]\n ON [assets] ([uploader]);CREATE VIRTUAL TABLE [licenses_fts] USING FTS5 (\n [name],\n content=[licenses]\n);CREATE TABLE 'licenses_fts_data'(id INTEGER PRIMARY KEY, block BLOB);CREATE TABLE 'licenses_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;CREATE TABLE 'licenses_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);CREATE TABLE 'licenses_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;CREATE TRIGGER [licenses_ai] AFTER INSERT ON [licenses] BEGIN\n INSERT INTO [licenses_fts] (rowid, [name]) VALUES (new.rowid, new.[name]);\nEND;CREATE TRIGGER [licenses_ad] AFTER DELETE ON [licenses] BEGIN\n INSERT INTO [licenses_fts] ([licenses_fts], rowid, [name]) VALUES('delete', old.rowid, old.[name]);\nEND;CREATE TRIGGER [licenses_au] AFTER UPDATE ON [licenses] BEGIN\n INSERT INTO [licenses_fts] ([licenses_fts], rowid, [name]) VALUES('delete', old.rowid, old.[name]);\n INSERT INTO [licenses_fts] (rowid, [name]) VALUES (new.rowid, new.[name]);\nEND;CREATE VIRTUAL TABLE [releases_fts] USING FTS5 (\n [name], [body],\n content=[releases]\n);CREATE TABLE 'releases_fts_data'(id INTEGER PRIMARY KEY, block BLOB);CREATE TABLE 'releases_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;CREATE TABLE 'releases_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);CREATE TABLE 'releases_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;CREATE TRIGGER [releases_ai] AFTER INSERT ON [releases] BEGIN\n INSERT INTO [releases_fts] (rowid, [name], [body]) VALUES (new.rowid, new.[name], new.[body]);\nEND;CREATE TRIGGER [releases_ad] AFTER DELETE ON [releases] BEGIN\n INSERT INTO [releases_fts] ([releases_fts], rowid, [name], [body]) VALUES('delete', old.rowid, old.[name], old.[body]);\nEND;CREATE TRIGGER [releases_au] AFTER UPDATE ON [releases] BEGIN\n INSERT INTO [releases_fts] ([releases_fts], rowid, [name], [body]) VALUES('delete', old.rowid, old.[name], old.[body]);\n INSERT INTO [releases_fts] (rowid, [name], [body]) VALUES (new.rowid, new.[name], new.[body]);\nEND;CREATE VIRTUAL TABLE [repos_fts] USING FTS5 (\n [name], [description],\n content=[repos]\n);CREATE TABLE 'repos_fts_data'(id INTEGER PRIMARY KEY, block BLOB);CREATE TABLE 'repos_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;CREATE TABLE 'repos_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);CREATE TABLE 'repos_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;CREATE TRIGGER [repos_ai] AFTER INSERT ON [repos] BEGIN\n INSERT INTO [repos_fts] (rowid, [name], [description]) VALUES (new.rowid, new.[name], new.[description]);\nEND;CREATE TRIGGER [repos_ad] AFTER DELETE ON [repos] BEGIN\n INSERT INTO [repos_fts] ([repos_fts], rowid, [name], [description]) VALUES('delete', old.rowid, old.[name], old.[description]);\nEND;CREATE TRIGGER [repos_au] AFTER UPDATE ON [repos] BEGIN\n INSERT INTO [repos_fts] ([repos_fts], rowid, [name], [description]) VALUES('delete', old.rowid, old.[name], old.[description]);\n INSERT INTO [repos_fts] (rowid, [name], [description]) VALUES (new.rowid, new.[name], new.[description]);\nEND;CREATE VIRTUAL TABLE [users_fts] USING FTS5 (\n [login], [name],\n content=[users]\n);CREATE TABLE 'users_fts_data'(id INTEGER PRIMARY KEY, block BLOB);CREATE TABLE 'users_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;CREATE TABLE 'users_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);CREATE TABLE 'users_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;CREATE TRIGGER [users_ai] AFTER INSERT ON [users] BEGIN\n INSERT INTO [users_fts] (rowid, [login], [name]) VALUES (new.rowid, new.[login], new.[name]);\nEND;CREATE TRIGGER [users_ad] AFTER DELETE ON [users] BEGIN\n INSERT INTO [users_fts] ([users_fts], rowid, [login], [name]) VALUES('delete', old.rowid, old.[login], old.[name]);\nEND;CREATE TRIGGER [users_au] AFTER UPDATE ON [users] BEGIN\n INSERT INTO [users_fts] ([users_fts], rowid, [login], [name]) VALUES('delete', old.rowid, old.[login], old.[name]);\n INSERT INTO [users_fts] (rowid, [login], [name]) VALUES (new.rowid, new.[login], new.[name]);\nEND;CREATE VIEW recent_releases AS select\n repos.rowid as rowid,\n repos.html_url as repo,\n releases.html_url as release,\n substr(releases.published_at, 0, 11) as date,\n releases.body as body_markdown,\n releases.published_at,\n coalesce(repos.topics, '[]') as topics\nfrom\n releases\n join repos on repos.id = releases.repo\norder by\n releases.published_at desc;CREATE TABLE [pypi_packages] (\n [name] TEXT PRIMARY KEY,\n [summary] TEXT,\n [classifiers] TEXT,\n [description] TEXT,\n [author] TEXT,\n [author_email] TEXT,\n [description_content_type] TEXT,\n [dynamic] TEXT,\n [home_page] TEXT,\n [keywords] TEXT,\n [license] TEXT,\n [license_expression] TEXT,\n [license_files] TEXT,\n [maintainer] TEXT,\n [maintainer_email] TEXT,\n [package_url] TEXT,\n [platform] TEXT,\n [project_url] TEXT,\n [project_urls] TEXT,\n [provides_extra] TEXT,\n [release_url] TEXT,\n [requires_dist] TEXT,\n [requires_python] TEXT,\n [version] TEXT,\n [yanked] INTEGER,\n [yanked_reason] TEXT\n);CREATE TABLE [pypi_versions] (\n [id] TEXT PRIMARY KEY,\n [package] TEXT REFERENCES pypi_packages,\n [name] TEXT\n);CREATE TABLE [pypi_releases] (\n [md5_digest] TEXT PRIMARY KEY,\n [package] TEXT REFERENCES pypi_packages,\n [version] TEXT REFERENCES pypi_versions,\n [packagetype] TEXT,\n [filename] TEXT,\n [comment_text] TEXT,\n [digests] TEXT,\n [has_sig] INTEGER,\n [python_version] TEXT,\n [requires_python] TEXT,\n [size] INTEGER,\n [upload_time] TEXT,\n [upload_time_iso_8601] TEXT,\n [url] TEXT,\n [yanked] INTEGER,\n [yanked_reason] TEXT\n);CREATE TABLE [stats] (\n [package] TEXT,\n [date] TEXT,\n [downloads] INTEGER,\n PRIMARY KEY ([package], [date])\n);CREATE TABLE [tutorials] (\n [path] TEXT PRIMARY KEY,\n [title] TEXT,\n [body] TEXT\n);CREATE INDEX [idx_pypi_versions_package]\n ON [pypi_versions] ([package]);CREATE INDEX [idx_pypi_releases_version]\n ON [pypi_releases] ([version]);CREATE INDEX [idx_pypi_releases_package]\n ON [pypi_releases] ([package]);CREATE TABLE [news] (\n [date] TEXT,\n [body] TEXT\n);CREATE TABLE [example_csvs] (\n [url] TEXT,\n [name] TEXT,\n [table_name] TEXT,\n [source] TEXT,\n [source_url] TEXT,\n [about] TEXT,\n [about_url] TEXT,\n [description] TEXT\n);CREATE TABLE [plugin_repos] (\n [repo] TEXT,\n [tags] TEXT,\n [extra_search] TEXT\n);CREATE TABLE [tool_repos] (\n [repo] TEXT,\n [tags] TEXT,\n [extra_search] TEXT\n);CREATE VIEW plugins AS select\n repos.name as name,\n repos.full_name as full_name,\n users.login as owner,\n repos.description as description,\n plugin_repos.extra_search as extra_search,\n plugin_repos.tags as tags,\n repos.stargazers_count,\n pypi_versions.name as tag_name,\n max(pypi_releases.upload_time) as latest_release_at,\n repos.created_at as created_at,\n datasette_repos.openGraphImageUrl,\n datasette_repos.usesCustomOpenGraphImage,\n (\n select\n sum(downloads)\n from\n stats\n where\n stats.package = repos.name\n and stats.date > date('now', '-7 days')\n ) as downloads_this_week,\n (\n select\n count()\n from\n plugin_repos\n where\n repo = repos.full_name\n ) as is_plugin,\n (\n select\n count()\n from\n tool_repos\n where\n repo = repos.full_name\n ) as is_tool\nfrom\n datasette_repos\n join repos on datasette_repos.id = repos.node_id\n left join pypi_releases on (\n pypi_releases.package = repos.name or pypi_releases.package = 'datasette-' || repos.name\n )\n left join pypi_versions on pypi_releases.version = pypi_versions.id\n join users on users.id = repos.owner\n join plugin_repos on plugin_repos.repo = datasette_repos.nameWithOwner\ngroup by\n repos.id\norder by\n latest_release_at desc;CREATE VIEW tools AS select\n repos.name as name,\n repos.full_name as full_name,\n users.login as owner,\n repos.description as description,\n tool_repos.extra_search as extra_search,\n tool_repos.tags as tags,\n repos.stargazers_count,\n pypi_versions.name as tag_name,\n max(pypi_releases.upload_time) as latest_release_at,\n repos.created_at as created_at,\n datasette_repos.openGraphImageUrl,\n datasette_repos.usesCustomOpenGraphImage,\n (\n select\n sum(downloads)\n from\n stats\n where\n stats.package = repos.name\n and stats.date > date('now', '-7 days')\n ) as downloads_this_week,\n (\n select\n count()\n from\n plugin_repos\n where\n repo = repos.full_name\n ) as is_plugin,\n (\n select\n count()\n from\n tool_repos\n where\n repo = repos.full_name\n ) as is_tool\nfrom\n datasette_repos\n join repos on datasette_repos.id = repos.node_id\n left join pypi_releases on (\n pypi_releases.package = repos.name or pypi_releases.package = 'datasette-' || repos.name\n )\n left join pypi_versions on pypi_releases.version = pypi_versions.id\n join users on users.id = repos.owner\n join tool_repos on tool_repos.repo = datasette_repos.nameWithOwner\ngroup by\n repos.id\norder by\n latest_release_at desc"}]

Response

Tool calls

  • Datasette_query: call_95544106
    Arguments: {"sqlite_sql": "SELECT COUNT(*) FROM plugins;"}

Token usage

4,444 input, 109 output, {"completion_tokens_details": {"reasoning_tokens": 78}, "prompt_tokens_details": {"cached_tokens": 617}}

2025-09-21T00:19:56

Prompt

-- none --

Tools

  • Datasette_query: 1aa6d35df9b225d03daee33201eab3ae539b67157f3a8ec544b0b5d8eaeeeeb9
    Execute provided SQLite SQL query - read-only, only use SELECT
    Arguments: {"sqlite_sql": {"type": "string"}}
  • Datasette_schema: 24ec61558e67e01fe6927f059ab376bad38b8dfd815851e9f3846371ef35d246
    View the SQLite schema of the attached database
    Arguments: {}

Tool results

  • Datasette_query: call_95544106
    [{"COUNT(*)": 154}]

Response

There are 154 available plugins.

Token usage

4,570 input, 22 output, {"completion_tokens_details": {"reasoning_tokens": 15}, "prompt_tokens_details": {"cached_tokens": 4554}}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment