Commit Graph
91418 Commits
Author SHA1 Message Date
Nicola Soranzo 40ea930a76 Check response status of TRS API requests 2026-05-06 10:48:00 +01:00
Nicola Soranzo 85ae996666 Raise RequestParameterInvalidException if workflow version is not an int 2026-05-06 05:34:55 +01:00
Nicola Soranzo a91368ddc9 Improve type annotation of workflow management methods 2026-05-06 05:31:43 +01:00
Nicola Soranzo 2ebe39dfe7 Fix mypy exclude config 2026-05-06 05:31:43 +01:00
John Chilton 29b46065ae Merge pull request #22642 from nsoranzo/wf_syntax_gxformat_0.26.0
Update test workflows to respect gxformat2 0.26.0 syntax
2026-05-05 20:21:10 -04:00
Nicola Soranzo a7d122afd9 Update test workflows to respect gxformat2 0.26.0 syntax 2026-05-05 20:44:35 +01:00
Marius van den Beek 801969dce8 Merge pull request #22629 from mvdbeek/improve-sse-reconnect-handling
Manage SSE reconnect on transient 5xx/429 outages
2026-05-05 17:19:37 +02:00
Ahmed Hamid Awan 058702d195 Merge pull request #21921 from ahmedhamidawan/add_stop_job_button
Add a stop job button that allows users to stop jobs
2026-05-05 08:53:39 -04:00
David López 44913175b9 Merge pull request #22570 from mvdbeek/worktree-webdav-template-migration
Restore WebDAV template v0; add v1 for url -> base_url rename
2026-05-05 13:56:53 +02:00
Nicola Soranzo 1af99bdbf0 Merge pull request #22636 from galaxyproject/dependabot/github_actions/slackapi/slack-github-action-3.0.3
Bump slackapi/slack-github-action from 3.0.2 to 3.0.3
2026-05-05 01:06:44 +01:00
dependabot[bot] e9f18bc92f Bump slackapi/slack-github-action from 3.0.2 to 3.0.3
Bumps [slackapi/slack-github-action](https://github.com/slackapi/slack-github-action) from 3.0.2 to 3.0.3.
- [Release notes](https://github.com/slackapi/slack-github-action/releases)
- [Changelog](https://github.com/slackapi/slack-github-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/slackapi/slack-github-action/compare/v3.0.2...v3.0.3)

---
updated-dependencies:
- dependency-name: slackapi/slack-github-action
  dependency-version: 3.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-04 20:58:42 +00:00
Marius van den Beek 3e7b3eddaa Merge pull request #22625 from dannon/agent-ops-udt-parity
Add user-defined-tool operations to the agent-operations layer
2026-05-04 16:05:51 +02:00
Marius van den Beek 0fddeb9d2e Merge pull request #22630 from dannon/agent-max-tokens-default
Bump default max_tokens for AI agents
2026-05-04 15:38:54 +02:00
David López bf43c74dae Merge pull request #22621 from mvdbeek/fix-export-card
Fix long title squashing in g-card
2026-05-04 14:45:22 +02:00
Dannon Baker c1d9c8acb0 Per-agent max_tokens defaults via DEFAULT_MAX_TOKENS class attribute
Promote the max_tokens fallback in BaseGalaxyAgent from a hardcoded
literal to a class attribute (DEFAULT_MAX_TOKENS = 8192) so individual
agents can declare their own ceiling without overriding the whole
_get_max_tokens method. The history, orchestrator, and custom_tool
agents now bump theirs to 16384 -- those are the ones that produce
long structured output (history listings, multi-step plans, full
UserToolSource JSON schemas) and were the most likely to silently
truncate. Router, tool recommendation, and error_analysis stay on the
8k default; their typical responses sit comfortably under that.
inference_services.<agent>.max_tokens config still wins over the
class default.

Also refreshed the example configs in doc/source/admin/ai_agents.md
so they no longer show 2000 as a representative override value, and
added a parenthetical to the param description noting the new
defaults.
2026-05-03 09:20:15 -04:00
Dannon Baker ab2d233277 Bump default max_tokens for AI agents from 2000 to 8192
The 2000-token default in _get_max_tokens() was causing the history
agent to fail with "Model token limit (2000) exceeded before any
response was generated" on histories with more than a handful of
datasets. The cap was an artifact of an earlier era -- every backend
we currently support (Maverick / Llama-3.3-70B at 131k context, Qwen3
at 32k, gpt-oss-120b at ~128k, plus the Anthropic and OpenAI
providers) handles 8k output comfortably with plenty of headroom for
the prompt. 8k is high enough that the common agents (history,
error_analysis, orchestrator) don't truncate mid-answer, but still
well under the smallest window we point at (Qwen3's 32k) so a runaway
response can't blow up the total context. Per-agent overrides via
inference_services.<agent>.max_tokens still work the same way; this
only changes the fallback when nothing is configured.
2026-05-03 08:52:31 -04:00
mvdbeek 27d69f9927 Manage SSE reconnect on transient 5xx/429 outages
The browser's native EventSource auto-retry gives up once readyState flips to
CLOSED — typical for a 4xx/5xx response with no text/event-stream body — and
the previous onerror handler did not detect that, leaving the client stranded
on the polling fallback for the rest of the session.

Take ownership of the reconnect loop on the client: close the source on
onerror+CLOSED, schedule a reopen with full-jitter exponential backoff capped
at 30 s, and reset the counter on a successful onopen. The replay-on-open
viewer-subscription path is unchanged.

Tested with a Playwright-only integration_selenium test that fails the first
SSE request with a 503 via page.route() and asserts the client reconnects and
delivers a subsequently-pushed notification.
2026-05-03 13:48:42 +02:00
Dannon Baker 2cb7189482 Move workflow/invocation index payloads into central schema
WorkflowIndexPayload and InvocationIndexPayload were defined in the
webapps service layer, which forced operations.py (in galaxy-app) to
reach across the package boundary into galaxy-webapps just to
construct them. They're plain Pydantic models that extend a base
already living in galaxy.schema.schema, so move them next to their
parents. Services keep the same names via re-export so external
consumers don't break, and operations.py can now import them at
module level alongside the rest of the galaxy.schema imports.
2026-05-02 19:12:18 -04:00
Dannon Baker efbf5e1629 Hoist agent-operations local imports to module level
Per Marius' review on PR 22625 -- Galaxy only uses local imports when
there's a real reason (circular dep, optional dep). None of these had
one, so they belong at the top of the file alongside the rest.
2026-05-02 15:06:27 -04:00
Dannon Baker bec6b06813 Tighten UDT smoke tests for user binding and deactivation
test_mcp_run_user_tool was building its history and input dataset with
the default test interactor, while the MCP-side run authenticated as a
freshly-provisioned UDT user -- so the MCP call was reaching for
resources owned by a different user. Switch to
DatasetPopulator(self._get_interactor(api_key=api_key)) so populator-
side and MCP-side calls share an identity. Also assert on the run-tool
response shape (jobs[].tool_id, outputs[].output_name) in addition to
the end-to-end content check.

test_mcp_delete_user_tool now also tries to run the UDT after
deletion and asserts the call errors with "deactivated" -- regression
test for the deactivation guard in run_user_tool.
2026-05-02 13:27:05 -04:00
Dannon Baker 3c02ff707c Guard run_user_tool against deactivated user-defined tools
deactivate_unprivileged_tool deliberately only flips the per-user
UserDynamicToolAssociation.active flag, leaving DynamicTool.active
intact so other users with associations to the same DynamicTool aren't
affected (the model schema permits many-to-many, even though the
current create path is 1:1). That means a user who deactivates "their"
UDT can still resolve it by UUID through the toolbox -- and run it via
tools_service._create -- because get_unprivileged_tool_by_uuid doesn't
filter by association.active either.

Add a runtime preflight in run_user_tool that fails the call when
either the underlying tool or the calling user's association is
inactive. Also surfaces unauthenticated and unowned errors as clean
ValueErrors before reaching the deeper service layer.

Tightening the chokepoint (DynamicToolManager.get_unprivileged_tool_by_uuid)
to filter by association.active would close this across all entry points
but is a meaningful behavior change for the existing UnprivilegedToolsApi
endpoints; leaving that for a separate review.
2026-05-02 13:26:54 -04:00
Dannon Baker 92eddddc94 Add run_user_tool agent operation and MCP wrapper
Mirrors run_tool but passes tool_uuid in the payload, which
tools_service._create routes to the toolbox's unprivileged-tool
resolver. Closes UDT parity with the standalone galaxy-mcp server.
2026-05-02 13:12:00 -04:00
Dannon Baker cf32938b20 Add delete_user_tool agent operation and MCP wrapper
Looks up the UDT by UUID, then deactivates it via
DynamicToolManager.deactivate_unprivileged_tool. Mirrors DELETE
/api/unprivileged_tools/{uuid}.
2026-05-02 13:12:00 -04:00
Dannon Baker 08f7dfa9e3 Add create_user_tool agent operation and MCP wrapper
Validates the representation through DynamicUnprivilegedToolCreatePayload
and delegates to DynamicToolManager.create_unprivileged_tool, mirroring
the POST /api/unprivileged_tools endpoint. The MCP wrapper carries the
full GalaxyUserTool schema in its docstring (required fields, the
common container-as-string mistake, a worked example) so agents can
construct valid representations without round-tripping.
2026-05-02 13:12:00 -04:00
Dannon Baker 524130eaea Add list_user_tools agent operation and MCP wrapper
Wraps DynamicToolManager.list_unprivileged_tools so the in-process MCP
server can enumerate a user's user-defined tools, matching the parity
gap with the standalone galaxy-mcp server. Also wires up the lazy
DynamicToolManager property on AgentOperationsManager and a
_setup_udt_user helper on the smoke test class for the rest of the UDT
work.
2026-05-02 13:12:00 -04:00
Marius van den Beek 2e70707ab1 Merge pull request #21932 from guerler/graph.000 2026-05-02 16:21:46 +02:00
guerler 606aa19635 Use DataItemSourceType, fix linting 2026-05-02 14:06:12 +03:00
guerler 6e23e9d3e4 Add shim to ensure that manager itself is not reinstantiated, align with existing manager pattern 2026-05-02 13:57:53 +03:00
mvdbeek 6cbd548e63 Declare cards-list container on RecentDownloads
GCard's responsive width rules use `@container cards-list (max-width: ...)`
to drop cards from 1/3 width to 1/2 / full width on narrow viewports.
RecentDownloads.vue had no `container: cards-list / inline-size`
declaration anywhere up the tree, so those queries never fired and
cards stayed at `calc(100% / 3)` regardless of viewport width — which,
combined with the recently fixed title squashing, was producing
per-syllable title wrapping in the export card on narrow screens.

Match the idiom used by WorkflowCardList and HistoryCardList.
2026-05-02 11:28:20 +02:00
Dannon Baker 2921182a3b Ensure card titles get at least 50% width
Add responsive layout to GCard header that prevents badges from
squashing the title. Title section now has min-width of 50% and
badges wrap to next line when needed.
2026-05-02 11:25:52 +02:00
mvdbeek d1e450a5c1 Merge branch 'release_26.0' into dev 2026-05-02 10:14:57 +02:00
guerler 0834a34bed Fix expected error code in test 2026-05-02 09:37:59 +03:00
guerlerandClaude Opus 4.7 10a0b8a556 Clean up history graph builder test suite
- Replace global _user_counter with uuid4().hex[:8] for xdist safety
- Drop test_determinism_identical_requests (duplicate of test_deterministic_ordering)
- Lift inline imports (sqlalchemy event, HistoryGraphBuilder) to top
- Lower scale defaults (500/100/10/50 -> 250/60/5/20)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 23:06:08 +03:00
guerlerandClaude Opus 4.7 00e9721d56 Tighten graph endpoint typing and pin 404 in API tests
- direction: Literal["backward","forward","both"] in service and manager
- HistoriesService.graph annotated -> HistoryGraphResponse
- Pin 404 for missing seed_scope and missing history (was loose 4xx)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 23:06:08 +03:00
guerler 748fef123b Fix typing use AbstractToolBox 2026-05-01 23:06:08 +03:00
guerler 3ce0edd617 Move remaining validation to service layer 2026-05-01 23:06:08 +03:00
guerler 55b7e61047 Access toolbox directly, no need for get attribute 2026-05-01 23:06:08 +03:00
guerler ea9f27b4aa Move import to top-level 2026-05-01 23:06:08 +03:00
guerler e36d726cd0 Move test helpers to populator 2026-05-01 23:06:08 +03:00
guerler 68fb22e3b9 Add tests 2026-05-01 23:06:08 +03:00
guerler 6cbc941242 Validate seed on api level 2026-05-01 23:06:08 +03:00
guerler 4fd1cbee4f Remove hid window interface from api 2026-05-01 23:06:08 +03:00
guerler 87fe6be8c1 Deduplication set for edges is unnecessary 2026-05-01 23:06:08 +03:00
guerler e625f0f4a3 Drop chunking mechanism 2026-05-01 23:06:07 +03:00
guerler 296d82d7f8 Linting 2026-05-01 23:06:07 +03:00
guerler 6fd6d66759 Reuse filtering, improve comments 2026-05-01 23:06:07 +03:00
guerler efae7c6dab Add edge filter 2026-05-01 23:06:07 +03:00
guerler ee0b1a01c3 Use boltons.iterutils in tool input walker 2026-05-01 23:06:07 +03:00
guerler 8e283000d5 Update comments 2026-05-01 23:06:07 +03:00
guerler 91a5978e77 Update tests, apply lint 2026-05-01 23:06:07 +03:00