diff --git a/deploy/helm/README.md b/deploy/helm/README.md index 40636cb14..da6120f3d 100644 --- a/deploy/helm/README.md +++ b/deploy/helm/README.md @@ -363,6 +363,15 @@ helm upgrade --install aiq aiq2-web-2.0.0.tgz -n ns-aiq \ | `SERPER_API_KEY` | Serper API key for Google search | | `JINA_API_KEY` | Jina API key | | `WANDB_API_KEY` | Weights & Biases API key | +| `MODAL_TOKEN_ID` | Modal sandbox token ID | +| `MODAL_TOKEN_SECRET` | Modal sandbox token secret | +| `AIQ_ARTIFACT_BLOB_PROVIDER` | Artifact byte storage provider; unset or `sql` keeps bytes in SQL, `s3` uses S3-compatible storage | +| `AIQ_ARTIFACT_S3_BUCKET` | Required when `AIQ_ARTIFACT_BLOB_PROVIDER=s3` | +| `AIQ_ARTIFACT_S3_ENDPOINT_URL` | Unset for AWS S3; set for MinIO or compatible storage | +| `AIQ_ARTIFACT_S3_REGION` | Optional S3 region | +| `AIQ_ARTIFACT_S3_PREFIX` | Optional object-key prefix; defaults to `artifacts/v1` | +| `AWS_ACCESS_KEY_ID` | Optional S3 access key | +| `AWS_SECRET_ACCESS_KEY` | Optional S3 secret key | ### Updating secrets diff --git a/docs/source/examples/cli-with-local-nims.md b/docs/source/examples/cli-with-local-nims.md index 80b13e482..e2a01c5c9 100644 --- a/docs/source/examples/cli-with-local-nims.md +++ b/docs/source/examples/cli-with-local-nims.md @@ -202,7 +202,8 @@ The CLI script starts an interactive session. Type your research query and the s ## Tips for Local NIMs -- **GPU memory**: Monitor with `nvidia-smi`. The 30B model needs ~40 GB VRAM. +- **GPU memory**: Monitor with `nvidia-smi`. Size GPUs for the + `nvidia/nemotron-3-super-120b-a12b` NIM using the model card and support matrix. - **Startup time**: NIM containers take 2--5 minutes to load the model on first start. Wait until `/v1/models` returns a response. - **Multiple GPUs**: Use `--gpus '"device=0,1"'` to spread across GPUs, or run separate containers per GPU for different model roles. - **Networking**: If running inside Docker Compose, use container names instead of `localhost` for `base_url`. diff --git a/mcp/pyproject.toml b/mcp/pyproject.toml index 58defe01d..810ac7cf2 100644 --- a/mcp/pyproject.toml +++ b/mcp/pyproject.toml @@ -71,7 +71,7 @@ override-dependencies = [ "mako>=1.3.12,<2", "nltk>=3.10.0,<4", "pillow>=12.2.0,<13", - "pyasn1>=0.6.3,<0.7", + "pyasn1>=0.6.4,<0.7", "pygments>=2.20.0,<3", "pyopenssl>=26.0.0,<27", "tornado>=6.5.5", diff --git a/mcp/uv.lock b/mcp/uv.lock index d38df1001..de0fc366c 100644 --- a/mcp/uv.lock +++ b/mcp/uv.lock @@ -22,7 +22,7 @@ overrides = [ { name = "mako", specifier = ">=1.3.12,<2" }, { name = "nltk", specifier = ">=3.10.0,<4" }, { name = "pillow", specifier = ">=12.2.0,<13" }, - { name = "pyasn1", specifier = ">=0.6.3,<0.7" }, + { name = "pyasn1", specifier = ">=0.6.4,<0.7" }, { name = "pygments", specifier = ">=2.20.0,<3" }, { name = "pyopenssl", specifier = ">=26.0.0,<27" }, { name = "tornado", specifier = ">=6.5.5" }, @@ -4456,11 +4456,11 @@ wheels = [ [[package]] name = "pyasn1" -version = "0.6.3" +version = "0.6.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5c/5f/6583902b6f79b399c9c40674ac384fd9cd77805f9e6205075f828ef11fb2/pyasn1-0.6.3.tar.gz", hash = "sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf", size = 148685, upload-time = "2026-03-17T01:06:53.382Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/9a/23310166d960def5897e91fe20e5b724601b02a22e84ba1f94232c0b7f67/pyasn1-0.6.4.tar.gz", hash = "sha256:9c447d8431c947fe4c8febc4ed9e760bc29011a5b01e5c74b67025bd9fb8ce81", size = 151262, upload-time = "2026-07-09T01:12:33.988Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/a0/7d793dce3fa811fe047d6ae2431c672364b462850c6235ae306c0efd025f/pyasn1-0.6.3-py3-none-any.whl", hash = "sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde", size = 83997, upload-time = "2026-03-17T01:06:52.036Z" }, + { url = "https://files.pythonhosted.org/packages/9a/3b/6163796d69c3977d1e4287bea4a6979161cbbdd170ebb430511e8e1999ce/pyasn1-0.6.4-py3-none-any.whl", hash = "sha256:deda9277cfd454080ec40b207fb6df82206a3a2688735233cdcd8d3d565f088b", size = 84410, upload-time = "2026-07-09T01:12:32.920Z" }, ] [[package]] diff --git a/skills/aiq-deploy/SKILL.md b/skills/aiq-deploy/SKILL.md index b7f4ad490..1a2ed058a 100644 --- a/skills/aiq-deploy/SKILL.md +++ b/skills/aiq-deploy/SKILL.md @@ -24,7 +24,7 @@ allowed-tools: Read Bash # AIQ Deploy Skill -## Purpose +## When to Use This Skill Use this skill to get a local or self-hosted NVIDIA AI-Q Blueprint server running and verified for use by `aiq-research`. @@ -59,7 +59,7 @@ git check-ignore deploy/.env Expected output: `deploy/.env` or a matching ignore rule. If it is not ignored, stop and fix the ignore rule before placing credentials in the file. -## Instructions +## Workflow 1. Locate or clone the AI-Q repository. 2. Confirm the expected repository files exist. diff --git a/skills/aiq-deploy/evals/evals.json b/skills/aiq-deploy/evals/evals.json index 020d79840..9f2e7f580 100644 --- a/skills/aiq-deploy/evals/evals.json +++ b/skills/aiq-deploy/evals/evals.json @@ -27,5 +27,17 @@ "Runs basic validation", "Reports the verified AIQ_SERVER_URL" ] + }, + { + "id": "aiq-deploy-003-negative-research-request", + "question": "Use AI-Q to write a deep research report about GPU memory optimization.", + "expected_skill": null, + "expected_script": null, + "ground_truth": "The agent does not use aiq-deploy for a research request. It should use aiq-research if a backend is already available, or only route to deployment if no backend exists.", + "expected_behavior": [ + "Does not route to aiq-deploy as the primary skill", + "Does not ask for deployment mode immediately", + "Does not start services before checking whether an AI-Q backend is available" + ] } ] diff --git a/skills/aiq-research/SKILL.md b/skills/aiq-research/SKILL.md index 25bd10302..193be5327 100644 --- a/skills/aiq-research/SKILL.md +++ b/skills/aiq-research/SKILL.md @@ -32,7 +32,7 @@ allowed-tools: Read Bash # AIQ Research Skill -## Purpose +## When to Use This Skill Use this skill to call a locally running NVIDIA AI-Q Blueprint server through the helper script at `scripts/aiq.py`. @@ -64,7 +64,7 @@ Users need: The helper script has no third-party Python package dependencies; it uses Python standard-library HTTP modules. -## Instructions +## Workflow 1. Resolve the target backend URL. 2. Run `health` before sending research requests. diff --git a/skills/aiq-research/evals/evals.json b/skills/aiq-research/evals/evals.json index a8269dd26..4d01da6b8 100644 --- a/skills/aiq-research/evals/evals.json +++ b/skills/aiq-research/evals/evals.json @@ -42,5 +42,17 @@ "Returns a concise answer for Santa Clara, CA", "Does not force a deep_researcher job unless AI-Q returns an async job ID" ] + }, + { + "id": "aiq-research-004-negative-deployment-request", + "question": "Set up AI-Q locally with Docker Compose and verify the backend health endpoint.", + "expected_skill": null, + "expected_script": null, + "ground_truth": "The agent does not use aiq-research for deployment or health setup. It should use aiq-deploy.", + "expected_behavior": [ + "Does not route to aiq-research", + "Does not call scripts/aiq.py for the initial setup", + "Recognizes this as a deployment and validation request" + ] } ]