Commit Graph
92729 Commits
Author SHA1 Message Date
Marius van den Beek 1cf3cb78d1 Merge pull request #23108 from mvdbeek/upgrade-pulsar-client
[26.1] Update pulsar-galaxy-client dependency to 0.15.15
2026-07-13 20:59:06 +02:00
mvdbeek 962d9f7378 Bump minimum pulsar-galaxy-lib version to 0.15.15 2026-07-13 19:03:47 +02:00
mvdbeek 77b6aa3881 Update pulsar-galaxy-client dependdency to 0.15.15 2026-07-13 18:01:31 +02:00
Marius van den Beek 57e24c2123 Merge pull request #22981 from mvdbeek/custom-tool-container-agent
[26.1] Custom-tool agent: verified container resolution + authoring safeguards (with a reusable mulled-recommend CLI)
2026-07-13 10:22:38 +02:00
Marius van den Beek 9a0947948e Merge pull request #23089 from mvdbeek/fix-h5grove-unounded
[26.1] Bound memory use in h5grove structured content endpoint
2026-07-10 13:22:14 +02:00
David López 3de9187062 Merge pull request #23087 from nilchia/release_26.1
[26.1] update spatialdata datatype
2026-07-10 10:50:51 +02:00
mvdbeek 60d8290842 Bound memory use in h5grove structured content endpoint
Any request to GET /api/datasets/{id}/content/{content_type} could read
an entire HDF5 dataset into memory: h5grove's DatasetContent.data() with
no selection executes dataset[()], selections are unbounded, data_stats
reads everything, attributes() reads all attribute values and group
metadata grows with child count.

Cap in-memory reads at 1 MB:
- data (format=bin/npy/csv) and stats now stream/accumulate in <= 1 MB
  slabs, so datasets of any size remain fully usable (h5web requests
  numeric data as format=bin)
- data (format=json/tiff), attr and group meta reject oversized requests
  with a 400 suggesting the selection parameter, computed pre-read from
  shape, dtype itemsize and the parsed selection
- variable-length dtypes cannot be pre-sized (h5py exposes no
  H5Dvlen_get_buf_size), so they are capped at ~1000 elements
- invalid selection strings now return 400 instead of 500
2026-07-09 19:17:31 +02:00
Amirhossein Naghsh Nilchi aa741d4977 update spatialdata datatype 2026-07-09 11:29:22 +02:00
David López cc838e5174 Merge pull request #23066 from bernt-matthias/sshfs-local-keys
[26.1] ssh filesource: do nopt use local keys / agent
2026-07-09 11:25:06 +02:00
Marius van den Beek 9da7a8b066 Merge pull request #22977 from ahmedhamidawan/fix_pages_sharing_route
[26.1] Fix page published view sharing routes
2026-07-07 16:41:45 +02:00
mvdbeek dd9bd5c80d Expose a recommend_biocontainer tool on the MCP server
MCP clients can already create user tools via create_user_tool, but with no container
verification -- its docstring even suggests bare images like python:3.12-slim, reproducing the
hallucinated/non-biocontainer problem the custom-tool agent now guards against. Add a
recommend_biocontainer MCP tool that wraps recommend_container + biocontainer_tag_built (pure
library functions, no app dependency) so a client can resolve and verify a real
quay.io/biocontainers image -- returning image/found/match_quality/source/notes/verified -- and
use it as the container for create_user_tool. The parse+shape logic is a module-level helper with
injectable collaborators so it is unit-testable offline; auth via the existing api-key path.
2026-07-07 16:39:18 +02:00
mvdbeek 806d7c22ec Strip the provider prefix when building the eval judge model
--judge-model values are provider-qualified (e.g. `openai:gpt-5`), but the OpenAI API
expects the bare model id. build_judge_model passed the qualified name straight to
OpenAIChatModel, so any judge model failed. Strip the `provider:` prefix the same way the
agents under test already do.
2026-07-07 16:39:18 +02:00
mvdbeek 8829aa8cc2 Return a string from YamlToolSource.parse_profile
parse_profile is annotated -> str but returned the raw root_dict value, which is a
number for YAML/JSON tool sources (and UserToolSource) that carry a numeric `profile`
(e.g. 24.2). The linters compare it with `Version(profile)`, which raises
"TypeError: expected string or bytes-like object, got 'float'" -- crashing
lint_user_tool_source on any such tool (notably user tools authored by the custom-tool
agent). Coerce to str so the annotation holds and all six Version(profile) call sites work.
2026-07-07 16:39:18 +02:00
mvdbeek b7a9bb05f9 Add custom-tool eval cases for configfile/multi-input tools
Three configfile + multiple-input + real-biocontainer cases (R/ggplot2 scatter,
pandas group-summary, Biopython FASTA filter) to broaden the signal for the
container-resolution / script-materialization / required-inputs comparison.
2026-07-07 16:39:18 +02:00
mvdbeek fa84dda488 Verify the custom-tool eval's container is a real biocontainer, not a made-up tag
ToolYamlContains can confirm the container is in the quay.io/biocontainers
namespace, but a substring match can't distinguish a real image from a hallucinated
tag (an invented build suffix). Adds a ContainerVerified evaluator that checks the
produced tool's container against quay.io via biocontainer_tag_built:

- verified-present biocontainer -> 1.0
- verifiably-absent tag (made up) -> 0.0
- not a biocontainers ref, or a transient lookup failure -> 1.0 (no false failure)

Wired into build_custom_tool, so every custom_tool case is scored. Touches the
network like the recommender; degrades to 1.0 when outbound calls aren't available.
2026-07-07 16:39:18 +02:00
mvdbeek 87f0cbc83e Enable container recommendation in the custom-tool eval deps
make_deps now sets, on the inference_services.custom_tool block:

- container_recommendation_enabled: so the custom_tool eval exercises the full
  container-resolution path (dedicated container critic + quay.io recommender +
  deterministic override) rather than only the model's raw container choice.
- max_tokens (16384, mirroring the agent's DEFAULT_MAX_TOKENS): the producer emits
  a full tool definition (inputs/outputs/configfiles) that overruns the 4000-token
  default block and would otherwise fail with a token-limit error before any
  response is generated.

Config resolves per-key, so model/api still come from the default block. This adds
an extra model call plus outbound quay.io lookups to custom_tool cases.
2026-07-07 16:39:17 +02:00
mvdbeek 01b43065f5 Add custom-tool eval case for a ggplot2 boxplot with a configfile
Exercises the agent on "use ggplot2 to make a boxplot, let the user pick the
grouping and numeric columns, put the script in a configfile" -- the request
class that previously produced a dropped configfile (Rscript run by name with no
file to create it) and a non-biocontainer image (rocker/tidyverse).

The case asserts, deterministically (ToolYamlContains) and via the LLM-judge
rubric: the R script lives in a configfile (not dropped, not inlined), the
container is an existing quay.io/biocontainers R+ggplot2 image, and the grouping
and numeric columns are user-selectable inputs rather than hardcoded.
2026-07-07 16:39:17 +02:00
mvdbeek aadd2c7010 Add container resolution and authoring safeguards to the custom tool agent
The custom tool authoring agent (galaxy.agents.custom_tool) gains container
resolution and producer-output safeguards. It consumes the mulled recommender
(galaxy.tool_util.deps.mulled.recommend):

- Container resolution: a dedicated container critic infers the conda packages
  from the tool's shell_command/configfiles, the recommender resolves a verified
  quay.io image, and a deterministic gate applies it -- overriding an
  exact-version match, a verifiably-absent biocontainer tag, or a non-biocontainer
  image, while leaving a present pinned biocontainer alone. Runs independently of
  the quality critic.
- Producer reliability: inputs/outputs are required in the LLM authoring view so
  grammar-constrained models can't drop them; UserToolSource stays lenient for the
  API and stored tools.
- The quality critic supplies deterministic field edits (labels/help/...) applied
  in place, falling back to a full re-roll only for structural changes.
- Reject a shell_command that runs a script by name with no configfile to create
  it, driving a producer retry.
- Render saved tool YAML with exclude_defaults so it carries only authored fields.

Admin config docs (config_schema.yml / galaxy.yml.sample) describe the
quality_critic_enabled and container_recommendation_enabled flags.

Tests cover the authoring-view required fields, container override paths,
deterministic critic edits, and the script check.
2026-07-07 16:39:17 +02:00
mvdbeek 5589ec98e8 Add a mulled biocontainer recommender with the mulled-recommend CLI
A reusable resolver (galaxy.tool_util.deps.mulled.recommend) that picks the best
quay.io/biocontainers image for a set of conda packages, verified against quay.io
rather than guessed:

- recommend_container() resolves single-package and mulled-v2 (multi-package)
  images, distinguishing an exact-version hit from a name-only fallback and
  resolving unpinned versions against tags that are actually built.
- biocontainer_tag_built() verifies whether a specific image tag exists.
- Shared lookup helpers move into mulled/util.py and are reused by the existing
  container resolver (container_resolvers/mulled.py) to avoid duplication.

Exposed as the mulled-recommend console script:

    mulled-recommend samtools=1.17
    mulled-recommend bwa,samtools
    mulled-recommend --json "samtools=1.3.1,bedtools=2.26.0"

Missing containers and transient network errors degrade gracefully (no exception).
Documented under admin special topics (mulled containers).
2026-07-07 16:39:16 +02:00
Marius van den Beek 81986f830d Merge pull request #22980 from davelopez/26.1_fix_tus_uploads_for_client-dev-server
[26.1] Rewrite proxy redirect headers to dev origin
2026-07-07 16:38:00 +02:00
Marius van den Beek bc3ce9e7cc Merge pull request #22972 from jmchilton/ts_cors
[26.1] Enable CORS on ToolShed read-only metadata endpoints
2026-07-07 16:21:42 +02:00
Marius van den Beek 6ac29efa7f Merge pull request #23075 from itisAliRH/fix/my-tools-recent-tools-default-panel
[26.1] Fix recent tools for My Tools default panel
2026-07-07 13:03:13 +02:00
Alireza Heidari bd81afbb74 test: cover My Tools header section source 2026-07-07 11:52:41 +02:00
Alireza Heidari 7edfc58f43 fix: align My Tools header section source 2026-07-07 11:52:23 +02:00
mvdbeek a3750b0326 Merge branch 'release_26.0' into release_26.1 2026-07-06 15:49:42 +02:00
mvdbeek 628435167d Merge branch 'release_25.1' into release_26.0 2026-07-06 15:46:41 +02:00
mvdbeek c51a0fde1f Merge branch 'release_25.0' into release_25.1 2026-07-06 15:27:18 +02:00
John Chilton f59c00b2df Merge pull request #23062 from mvdbeek/section-by-tool-instance-state
[26.0] Fix ToolPanelElements._section_by_tool being class-level shared state
2026-07-06 09:03:45 -04:00
Nicola Soranzo 91d3968c4e Merge pull request #23073 from mvdbeek/issue-23071-planemo-lint-runs-rst-validation-on-help-even-when-format-ma
[26.1] Skip RST help linting when help format is not restructuredtext
2026-07-06 12:56:28 +01:00
Alireza Heidari f9d4f70f03 test: cover My Tools default section preload 2026-07-06 13:54:29 +02:00
Alireza Heidari 402b5b8dd8 fix: preload default sections for My Tools 2026-07-06 13:54:17 +02:00
Alireza Heidari f3c31af44e test: cover My Tools default count 2026-07-06 13:23:59 +02:00
Alireza Heidari 13341c2d55 fix: deduplicate toolbox count fallback 2026-07-06 13:23:55 +02:00
Alireza Heidari 4949d66c4a fix: deduplicate tool panel count fallback 2026-07-06 13:23:50 +02:00
Alireza Heidari c11a284d6f test: cover versioned tool count fallback 2026-07-06 13:23:45 +02:00
Alireza Heidari 72f76f0b6d fix: deduplicate tool count fallback 2026-07-06 13:23:39 +02:00
mvdbeek 25bf77842d toolbox panel: make _section_by_tool per-instance state
ToolPanelElements._section_by_tool was a class-level mutable dict shared
by the tool panel, the integrated panel, every section's elems and every
rendered panel view. EDAM view rendering records ontology buckets through
the same dict the real panel's get_section_for_tool_id reads, and records
survived toolbox reloads. Scope it to the instance.
2026-07-06 11:38:23 +02:00
mvdbeek d2dd1ffd53 Skip RST help linting when help format is not restructuredtext
The HelpInvalidRST/HelpValidRST linters read the <help> text straight off
the XML tree and always validated it as reStructuredText. Markdown help
(and YAML tool sources, which default to Markdown) was therefore flagged
with spurious "Invalid reStructuredText" warnings.

Route both linters through a shared _help_rst() helper that uses
tool_source.parse_help() to obtain the help content and its declared
format, and skip RST validation unless the format is restructuredtext.

Fixes #23071
2026-07-06 10:57:48 +02:00
Marius van den Beek 3a0a64c244 Merge pull request #23070 from paperbenni/platform-arg-backport
[26.1] feat: Backport architecture-aware mulled builds
2026-07-05 14:50:22 +02:00
paperbenni cdf480f68d refactor: some renames 2026-07-04 11:46:05 +00:00
paperbenni 27a2ca2280 fix: fix python 3.8 2026-07-04 11:45:55 +00:00
benjamin 850ae9909d docs: comment singularity exception 2026-07-04 11:45:55 +00:00
benjamin 61cc1c8d6e tests: fix intentional error 2026-07-04 11:45:55 +00:00
benjamin f906dd08e9 refactor: make docker platform more typesafe 2026-07-04 11:45:55 +00:00
benjamin 1f52730c0a feat: add RISC V support for mulled 2026-07-04 11:45:55 +00:00
paperbenniandBjörn Grüning d7feedfe91 Update doc/source/admin/special_topics/mulled_containers.rst
Co-authored-by: Björn Grüning <bjoern@gruenings.eu>
2026-07-04 11:45:55 +00:00
paperbenniandBjörn Grüning 90d48a293b Update doc/source/admin/special_topics/mulled_containers.rst
Co-authored-by: Björn Grüning <bjoern@gruenings.eu>
2026-07-04 11:45:55 +00:00
paperbenniandBjörn Grüning 3ce2015029 Update doc/source/admin/special_topics/mulled_containers.rst
Co-authored-by: Björn Grüning <bjoern@gruenings.eu>
2026-07-04 11:45:55 +00:00
paperbenniandBjörn Grüning ef9e32d3e1 Update doc/source/admin/special_topics/mulled_containers.rst
Co-authored-by: Björn Grüning <bjoern@gruenings.eu>
2026-07-04 11:45:55 +00:00
benjamin 0b44167a1e refactor: single source of truth for architecture 2026-07-04 11:45:55 +00:00