Repository navigation
Add SandboxAQ, AQCat, and AQPotency catalog agents - #193
Merged
Merged
Conversation
Two defects in the initial SandboxAQ agent:
1. The toolId placeholder was `{{SANDBOAQ_MODEL_TOOL_ID}}` -- misspelled and
not in the catalog's `{{<toolName>ToolId}}` camelCase convention, so it
would not resolve at provisioning time. Now `{{sandboxaqModelToolId}}`.
2. The tool declared an `actions:` entry whose command interpolated the
user's prompt into a shell string (`--prompt '{{prompt}}'`). Because the
runtime substitutes textually, any prompt containing an apostrophe was
mangled -- and no quoting style fixes this in general: single quotes break
on `'`, double quotes break on `"` and expand `$(...)`.
Switch the tool to the `code_environments` pattern used by the majority of
the catalog. The agent now writes a Python script that imports
`sandboxaq_utils` and calls `invoke_model(...)`, so prompt text travels as a
Python string literal and never reaches a shell.
- run_action.py -> sandboxaq_utils.py, an importable module exposing
`invoke_model()` and `save_json()` instead of an argparse entrypoint.
- Dockerfile ships the module to /app on PYTHONPATH, creates /input /output
/workdir, and drops the ENTRYPOINT in favour of the code environment.
- tool.yaml replaces `actions:` with a `python3` code environment.
- agent.yaml instructions document the script template and the installed
package set.
- Normalize language to `python3` (required for Foundry agent binding).
Verified: prompts containing apostrophes, double quotes, `$(whoami)`, and
newlines now reach the endpoint byte-identically; the documented script
template executes as written; the image builds and the module imports from
PYTHONPATH inside the container.
Addresses all 7 findings from the pr-review bot (SCH-037, DOC-003,
DOC-004, DOC-005, DOC-102, DOC-104, DOC-105) plus conformance gaps found
by comparing against the other 46 catalog agents.
tool.yaml:
- infra[].image.acr uses the deployer placeholder form
`{name}.azurecr.io/sandboxaq-model:latest`. The bare `{name}/...` form
renders without a registry domain (SCH-037); 39/44 catalog tools use
the .azurecr.io form, and the 4 exceptions are all `actions:`-based
EDA tools.
- Add `recommended_sku: Standard_D4s_v6` -- this was the only tool of 44
without one.
- Match the compute profile shared by all 11 API-calling peer tools
(chembl, pubchem, zinc, pubmed, clinical-trials, ...): ram 4Gi->8Gi and
storage 8Gi->32Gi, plus `infiniband: false`.
agent.yaml:
- Add `topP: 0` to model.options; 35/47 agents set it and the deploy path
reads model.options.topP.
README.md:
- Restructure to the section layout shared by 46/47 agents: Overview,
Prerequisites, Build Docker Image, File Structure, Key Configuration
Details, Usage, Architecture, Configuration, Support, Tools, Known
Limitations, Contributing. It was previously the shortest README in the
catalog and was missing six required sections.
Verified with .github/scripts/validate_pr.py (the script CI runs) against
the current schemas: all checks pass. Confirmed the validator is live via
a negative control (an invalid publisher.party is correctly rejected).
Both agents reach the SandboxAQ AI Simulation Platform MCP server as a Foundry-native tool (kind: mcp), scoped with allowed_tools so each agent sees only its own product's tools plus the shared job-management tools. No container images or tool definitions are contributed; all computation runs on SandboxAQ infrastructure. Credentials are supplied through a connection reference resolved in the deploying customer's Foundry project, so no secret-bearing value appears in the published catalog metadata. The server URL remains a deploy-time parameter. Instructions are grounded in observed platform behaviour: submissions are asynchronous jobs reporting pending until completion, so both agents submit, poll, and fetch rather than expecting inline results. AQCat reports convergence with the residual force against its threshold, the resolved bulk identifier, the spin treatment, and every placement tried, and declines to name a unique binding site when placements are near-degenerate. AQPotency reports one-sigma uncertainty and ligand similarity alongside every value, treating a wide sigma band with low similarity as an absence of information rather than weak activity. Jobs consume metered capacity, so humanInTheLoop is enabled and both agents state the resolved plan and estimated cost for approval before submitting. Deployment against Foundry is not yet verified; the MCP tool option and connection shapes need a live deploy to confirm.
Readers browsing the catalog see sandboxaq, aqcat, and aqpotency side by side with no guidance on which applies to them. Each README now points at the other two and states what access each one requires: a Foundry model subscription for sandboxaq, an AI Simulation Platform tenant for the other two.
❌ Automated Check Results — 18 issue(s) foundAll issues are listed below. Please address all of them before requesting human review.
Once all issues are resolved, push a new commit to re-trigger this check.
|
✅ Automated Check Results — All checks passedAll structural, schema, content, documentation, and secret scan checks passed. This PR is ready for human review. The maintainers have been automatically requested.
|
sandboxaq-model tool: - Add FOUNDRY_API_STYLE (azure-openai default, or serverless with Bearer auth and /chat/completions) and fall back to the default api-version when FOUNDRY_API_VERSION is empty. - Raise RuntimeError without the endpoint URL on HTTP and transport errors, so reporting errors verbatim cannot leak the endpoint. - Tolerate null message/content and return finish_reason. - Document supplying credentials as deploy-time environment variables, matching the PubMed agent. aqcat: - Use the platform's `aqcat` tool; drop aqcat_compare and run one job per surface with identical settings for comparisons. - State the 5-placement cap and the 1 RU per bulk-facet-adsorbate cost. aqpotency: - Describe the real upload flow (upload_files session, user upload, check_upload_session, upload_session_id) and drop upload tools the agent cannot use. - Resolve the conflicting value/similarity reporting order. Both MCP agents check job status once per user request instead of polling with waits they cannot perform, and the READMEs state that pre-submission approval is enforced by instructions, not the platform.
Verified against the SandboxAQ AI Simulation Platform MCP server's tool schemas. aqcat: - Restore AQCat and aqcat_compare; the lowercase name is only a list_jobs filter value. - Describe the real comparison flow: one AQCat job per surface, then aqcat_compare on the completed job IDs (no compute, optional baseline). - Propose the 1,1,1 facet as a stated assumption when none is given. - Drop spin treatment from the plan; AQCat takes no spin input. aqpotency: - Remove AqpotencyScreen and the upload tools. upload_files needs an interactive iframe and upload_local_files needs a shell, so a Foundry agent cannot upload a library. Document running screens from Claude Desktop or claude.ai and retrieving results here. - Name the three AqpotencyScan panels and require choosing one. - Update catalog description and tags to match. Allow get_credit_balance in both agents.
Live AqpotencyPotency results return structured fields (potency_mean, potency_sigma, ligand_similarity, ic50_display and range, sigma_band, confidence_tier), not a prose summary. Quote the IC50 and range from those fields instead of recomputing them. A test prediction returned confidence_tier "high" with sigma_band "wide", so require the tier to be reported alongside the uncertainty and judge reliability by uncertainty and ligand similarity when they disagree.
A live run of six concurrent AQCat jobs took about 4.8 minutes each, so tell users to expect a few minutes, longer when several jobs run together, instead of a minute or two.
This was referenced Oct 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds three third-party (
party: 3p) SandboxAQ agents to the catalog. This picks up the work from #134, including the fixes made after that PR closed.sandboxaqsandboxaq-modelaqcataqpotencyEach agent's README links to the other two.
What's included
agents/sandboxaq/:agent.yaml,metadata.yaml,README.md, andtools/sandboxaq-model/(Dockerfile onmcr.microsoft.com/azurelinux/base/python:3.12,tool.yaml,sandboxaq_utils.py)agents/aqcat/:agent.yaml,metadata.yaml,README.mdagents/aqpotency/:agent.yaml,metadata.yaml,README.mdConfiguration
No secrets are committed.
sandboxaq: the tool reads these runtime environment variables:FOUNDRY_ENDPOINT/openaiAPI baseFOUNDRY_API_KEYFOUNDRY_DEPLOYMENTFOUNDRY_API_VERSION2024-10-21aqcat/aqpotency: these use a Foundry-nativekind: mcptool with aremoteconnection (authenticationMode: apiKey) and two deploy-time placeholders:{{AQ_MCP_SERVER_URL}}: the tenant's SandboxAQ MCP server URL (tenant-specific, so it can't be fixed in the catalog){{AQ_MCP_CONNECTION}}: the name of the connection in the deploying customer's Foundry project that holds the header credential. The credential never appears in the catalog.Reviewer notes
synthesize-bioagent:serverName,serverDescription, aremoteconnection,approvalMode: never, and a tool-levelallowedToolslist scoping each agent to its own tools on the shared platform server.aqcatandaqpotencyhave not been deployed end to end yet. We don't have a Microsoft Discovery preview workspace to deploy into.deploy-discovery-agent.ps1 aqcat -WhatIfPlansucceeds. Note that the deployer only substitutes{{CHAT-MODEL}}and tool IDs. The twoAQ_MCP_*placeholders have to be filled in manually at deploy time.sandboxaqagent's instructions forbid exposing endpoint URLs, API keys, or authorization headers. They also include data-handling guidance: no inference of protected attributes, no employment decisions, and flag responses that need human review.