diff --git a/agent/Dockerfile b/agent/Dockerfile index cc280daf1..ff66faed0 100644 --- a/agent/Dockerfile +++ b/agent/Dockerfile @@ -73,10 +73,13 @@ RUN corepack enable && corepack prepare yarn@stable --activate || corepack enabl # Install Claude Code CLI (the Python SDK requires this binary) # Then update known vulnerable transitive packages where fixed versions exist. -# Pinned 2.1.191 to match the CLI bundled by claude-agent-sdk 0.2.110 (see +# Pinned 2.1.301 to match the CLI bundled by claude-agent-sdk 0.2.168 (see # agent/pyproject.toml) — the SDK and the on-PATH CLI must agree on the control -# protocol. This version also has the awsCredentialExport behavior #215 needs: -# returned creds are cached until 5 min before the JSON's `Expiration`, so an +# protocol. The Claude 5.5 models the platform defaults to (#953) are rejected +# by CLI builds older than 2.1.280 ("does not support this model"), so this pin +# is also what makes the default model invocable at all. It also keeps the +# awsCredentialExport behavior #215 needs (present since 2.1.176): returned +# creds are cached until 5 min before the JSON's `Expiration`, so an # 8 h task re-assumes the 1 h-capped SessionRole before expiry. Older builds # only refreshed hourly on a timer, racing the role-chaining cap. # claude-code@2.1.x ships an error-shim at bin/claude.exe that its postinstall @@ -87,7 +90,7 @@ RUN corepack enable && corepack prepare yarn@stable --activate || corepack enabl # after the install so the native binary is placed at build time, and hard-verify # it exec's (``claude --version`` fails the build if the shim is still on PATH). RUN npm install -g npm@latest && \ - npm install -g @anthropic-ai/claude-code@2.1.191 && \ + npm install -g @anthropic-ai/claude-code@2.1.301 && \ CLAUDE_NPM_ROOT="$(npm root -g)/@anthropic-ai/claude-code" && \ npm --prefix "${CLAUDE_NPM_ROOT}" update tar minimatch glob cross-spawn picomatch && \ node "${CLAUDE_NPM_ROOT}/install.cjs" && \ diff --git a/agent/README.md b/agent/README.md index 46fbb04d1..9386a46e7 100644 --- a/agent/README.md +++ b/agent/README.md @@ -119,11 +119,11 @@ The `run.sh` script overrides the container's default CMD to run `python /app/sr | `AWS_SECRET_ACCESS_KEY` | Conditional† | | Explicit keys, if you are not using CLI-based resolution | | `AWS_SESSION_TOKEN` | No | | For temporary credentials | | `AWS_PROFILE` | No | | Profile for `aws configure export-credentials` in `run.sh`, or default profile when using the `~/.aws` mount fallback | -| `ANTHROPIC_MODEL` | No | `global.anthropic.claude-opus-5` | Bedrock **inference profile** ID for `InvokeModel` (see [inference profiles](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-use.html)). Must be a geo-prefixed profile ID matching the deployment's `bedrockGeoRegion`, not a bare foundation-model ID — see [Model configuration](../docs/guides/DEVELOPER_GUIDE.md#model-configuration) | +| `ANTHROPIC_MODEL` | No | `global.anthropic.claude-opus-5-5` | Bedrock **inference profile** ID for `InvokeModel` (see [inference profiles](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-use.html)). Must be a geo-prefixed profile ID matching the deployment's `bedrockGeoRegion`, not a bare foundation-model ID — see [Model configuration](../docs/guides/DEVELOPER_GUIDE.md#model-configuration) | | `MAX_TURNS` | No | `100` | Max agent turns before stopping | | `MAX_BUDGET_USD` | No | | **Local batch only** (shell env when running `entrypoint.py` directly). Range 0.01–100; agent stops when the budget is reached. For deployed AgentCore **server** mode and production tasks, set **`max_budget_usd`** on task creation (REST API, CLI `--max-budget`, or Blueprint default); the orchestrator sends it in the `/invocations` JSON body — server mode does not read `MAX_BUDGET_USD` from the environment. | | `DRY_RUN` | No | | Set to `1` to validate config and print the prompt without running the agent | -| `ANTHROPIC_DEFAULT_HAIKU_MODEL` | No | `global.anthropic.claude-haiku-4-5-20251001-v1:0` | Bedrock **inference profile** ID for the small/fast auxiliary model — the pre-flight safety check and WebFetch summarization (see below). Set by the CDK stack (`cdk/src/stacks/agent.ts` (the runtime environment block)), which derives the prefix from `bedrockGeoRegion` — a geo prefix is required | +| `ANTHROPIC_DEFAULT_HAIKU_MODEL` | No | `global.anthropic.claude-haiku-5-5` | Bedrock **inference profile** ID for the small/fast auxiliary model — the pre-flight safety check and WebFetch summarization (see below). Set by the CDK stack (`cdk/src/stacks/agent.ts` (the runtime environment block)), which derives the prefix from `bedrockGeoRegion` — a geo prefix is required | | `NUDGES_TABLE_NAME` | No | | **Phase 2.** DynamoDB table for mid-task user nudges (`` XML blocks injected between turns). If unset, the agent runs without nudge support — `nudge_reader.read_pending()` returns `[]` and logs a WARN once. Set automatically by the CDK stack on both AgentCore runtimes. | | `JIRA_APP_ACTOR_PROXY_URL` | No | | Resolved per-task from the Jira tenant secret. Forge v2 web-trigger URL used for app-authored Jira comments and transitions. | | `JIRA_APP_ACTOR_SHARED_SECRET` | No | | Resolved per-task from the Jira tenant secret. HMAC key for the Forge proxy; redacted from agent diagnostics. | @@ -133,7 +133,7 @@ The `run.sh` script overrides the container's default CMD to run `python /app/sr including non-Jira tasks, so a warm AgentCore process cannot expose one tenant's OAuth or Forge credential to the next task. -**Bedrock model access (main model):** Configuring `ANTHROPIC_MODEL` and IAM credentials is not enough. Your AWS account must be able to **invoke** that model in Amazon Bedrock: follow [Request access to models](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html) (Marketplace permissions on first use, Anthropic first-time use where required, valid payment method for Marketplace-backed models). Always use an inference profile ID such as `global.anthropic.claude-opus-5`: a bare foundation-model ID cannot be invoked with on-demand throughput and Bedrock rejects it with `ValidationException`. IAM must also grant the model — see [Model configuration](../docs/guides/DEVELOPER_GUIDE.md#model-configuration) for the full layering. If the CLI stops with a message that the model is not available on your Bedrock deployment, fix model access in the console or switch `ANTHROPIC_MODEL` to an entitled profile, then retry. +**Bedrock model access (main model):** Configuring `ANTHROPIC_MODEL` and IAM credentials is not enough. Your AWS account must be able to **invoke** that model in Amazon Bedrock: follow [Request access to models](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html) (Marketplace permissions on first use, Anthropic first-time use where required, valid payment method for Marketplace-backed models). Always use an inference profile ID such as `global.anthropic.claude-opus-5-5`: a bare foundation-model ID cannot be invoked with on-demand throughput and Bedrock rejects it with `ValidationException`. IAM must also grant the model — see [Model configuration](../docs/guides/DEVELOPER_GUIDE.md#model-configuration) for the full layering. If the CLI stops with a message that the model is not available on your Bedrock deployment, fix model access in the console or switch `ANTHROPIC_MODEL` to an entitled profile, then retry. **Pre-flight check model**: Claude Code runs a quick safety verification using a small Haiku model before executing each tool command. On Bedrock, the default Haiku model ID may not be enabled in your account, causing the check to time out with *"Pre-flight check is taking longer than expected"* warnings. The agent sets `ANTHROPIC_DEFAULT_HAIKU_MODEL` to a known-available Bedrock Haiku model ID to avoid this. If you see pre-flight timeout warnings, verify that this model is enabled in your Bedrock model access settings. @@ -145,7 +145,7 @@ tenant's OAuth or Forge credential to the next task. # Dry run — validate config, fetch issue, print assembled prompt, then exit DRY_RUN=1 ./agent/run.sh "owner/repo" 42 -# Run with a specific model (overrides the global.anthropic.claude-opus-5 default). +# Run with a specific model (overrides the global.anthropic.claude-opus-5-5 default). # Must be a geo-prefixed inference profile that IAM grants — see Model configuration. ANTHROPIC_MODEL="us.anthropic.claude-sonnet-4-6" ./agent/run.sh "owner/repo" 42 diff --git a/agent/pyproject.toml b/agent/pyproject.toml index 40894cb5b..4f3741b03 100644 --- a/agent/pyproject.toml +++ b/agent/pyproject.toml @@ -16,12 +16,12 @@ dependencies = [ # would degrade gracefully — but for now we keep the dep to # preserve the clean code path. "bedrock-agentcore==1.18.1", #https://pypi.org/project/bedrock-agentcore/ - "claude-agent-sdk==0.2.110", #https://github.com/anthropics/claude-agent-sdk-python/releases/tag/v0.2.110 (bundles claude CLI 2.1.191; kept in lockstep with the npm CLI pin in the Dockerfile, #215) + "claude-agent-sdk==0.2.168", #https://github.com/anthropics/claude-agent-sdk-python/releases/tag/v0.2.168 (bundles claude CLI 2.1.301; kept in lockstep with the npm CLI pin in the Dockerfile, #215. Claude 5.5 models need CLI >= 2.1.280, #953) "requests==2.34.2", #https://pypi.org/project/requests/ "fastapi==0.139.0", #https://pypi.org/project/fastapi/ "uvicorn==0.50.0", #https://pypi.org/project/uvicorn/ "aws-opentelemetry-distro==0.18.0", #https://pypi.org/project/aws-opentelemetry-distro/ - "mcp==1.28.1", #https://pypi.org/project/mcp/ + "mcp==1.30.0", #https://pypi.org/project/mcp/ (1.30.0 clears GHSA-84m7-p3x7-pcfv) # CEDAR ENGINE PARITY — DO NOT BUMP IN ISOLATION. # cedarpy (Python, agent runtime) and @cedar-policy/cedar-wasm (TypeScript, # CDK Lambdas) are two language bindings over the same Cedar Rust core. diff --git a/agent/scripts/diagnostics/test_sdk_smoke.py b/agent/scripts/diagnostics/test_sdk_smoke.py index b3e905a0f..0a9328f10 100644 --- a/agent/scripts/diagnostics/test_sdk_smoke.py +++ b/agent/scripts/diagnostics/test_sdk_smoke.py @@ -39,7 +39,7 @@ async def smoke_test(): if not model: print( "ERROR: ANTHROPIC_MODEL not set. Pass the geo-prefixed inference-profile " - "id the deployment uses, e.g. ANTHROPIC_MODEL=global.anthropic.claude-opus-5", + "id the deployment uses, e.g. ANTHROPIC_MODEL=global.anthropic.claude-opus-5-5", file=sys.stderr, ) sys.exit(1) diff --git a/agent/src/config.py b/agent/src/config.py index 3e1c635e1..8cbc79cae 100644 --- a/agent/src/config.py +++ b/agent/src/config.py @@ -694,7 +694,7 @@ def build_config( resolved_github_token = github_token or resolve_github_token() resolved_aws_region = aws_region or os.environ.get("AWS_REGION", "") resolved_anthropic_model = anthropic_model or os.environ.get( - "ANTHROPIC_MODEL", "global.anthropic.claude-opus-5" + "ANTHROPIC_MODEL", "global.anthropic.claude-opus-5-5" ) # Small/fast auxiliary model (WebFetch summarization etc.). Falls back to the # deployed ANTHROPIC_DEFAULT_HAIKU_MODEL env, then the platform default. Must @@ -705,7 +705,7 @@ def build_config( # env set at all reaches this literal, so the two must be moved together or a # local run silently uses a different geography than a deployed one. resolved_haiku_model = haiku_model or os.environ.get( - "ANTHROPIC_DEFAULT_HAIKU_MODEL", "global.anthropic.claude-haiku-4-5-20251001-v1:0" + "ANTHROPIC_DEFAULT_HAIKU_MODEL", "global.anthropic.claude-haiku-5-5" ) # Resolve the workflow id (the create-task boundary already pinned it; local diff --git a/agent/src/models.py b/agent/src/models.py index 8c170f97c..393fcb749 100644 --- a/agent/src/models.py +++ b/agent/src/models.py @@ -154,7 +154,7 @@ class TaskConfig(BaseModel): task_description: str = "" github_token: str = "" aws_region: str - anthropic_model: str = "global.anthropic.claude-opus-5" + anthropic_model: str = "global.anthropic.claude-opus-5-5" # The "small/fast" model Claude Code uses for auxiliary work (e.g. WebFetch # page summarization). Must be a cross-region INFERENCE-PROFILE id (geo # prefix), not a bare foundation-model id — Claude 4.x cannot be invoked @@ -164,7 +164,7 @@ class TaskConfig(BaseModel): # vars from its resolved bedrockGeoRegion. It applies to direct construction # (tests, local runs), so it must name the same geography as the deployment or # those paths silently exercise a different one. - haiku_model: str = "global.anthropic.claude-haiku-4-5-20251001-v1:0" + haiku_model: str = "global.anthropic.claude-haiku-5-5" dry_run: bool = False max_turns: int = 10 max_budget_usd: float | None = None diff --git a/agent/tests/test_config.py b/agent/tests/test_config.py index 12b42233c..662eb9fcc 100644 --- a/agent/tests/test_config.py +++ b/agent/tests/test_config.py @@ -63,7 +63,7 @@ def test_haiku_model_defaults_to_inference_profile(self, monkeypatch): github_token="ghp_test123", aws_region="us-east-1", ) - assert config.haiku_model == "global.anthropic.claude-haiku-4-5-20251001-v1:0" + assert config.haiku_model == "global.anthropic.claude-haiku-5-5" def test_haiku_model_resolves_from_env(self, monkeypatch): # The deployed ANTHROPIC_DEFAULT_HAIKU_MODEL (set by agent.ts) flows diff --git a/agent/uv.lock b/agent/uv.lock index 82c9f9414..0e9849726 100644 --- a/agent/uv.lock +++ b/agent/uv.lock @@ -171,10 +171,10 @@ requires-dist = [ { name = "bedrock-agentcore", specifier = "==1.18.1" }, { name = "boto3", specifier = "==1.43.78" }, { name = "cedarpy", specifier = "==4.8.4" }, - { name = "claude-agent-sdk", specifier = "==0.2.110" }, + { name = "claude-agent-sdk", specifier = "==0.2.168" }, { name = "fastapi", specifier = "==0.139.0" }, { name = "jsonschema", specifier = "==4.26.0" }, - { name = "mcp", specifier = "==1.28.1" }, + { name = "mcp", specifier = "==1.30.0" }, { name = "pyyaml", specifier = "==6.0.3" }, { name = "requests", specifier = "==2.34.2" }, { name = "uvicorn", specifier = "==0.50.0" }, @@ -399,20 +399,21 @@ wheels = [ [[package]] name = "claude-agent-sdk" -version = "0.2.110" +version = "0.2.168" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, + { name = "jsonschema" }, { name = "mcp" }, { name = "sniffio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/98/8fdab35ed9e1a36bc7afab4d390cc5002094a4950996c079da9aa4541cc4/claude_agent_sdk-0.2.110.tar.gz", hash = "sha256:538b548bac07a22f65686abab063a902ac76ba35989d0f073c942f96248e9fa3", size = 255632, upload-time = "2026-06-24T22:11:52.342Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/ee/31e159daf956f0c5503eac67d02743da692c0999fef046cdde3cc52702b9/claude_agent_sdk-0.2.168.tar.gz", hash = "sha256:80388054a09c137d76fc29caa6e46bc90d2ae2ef09fac5ee1c38fc36d2762fda", size = 371591, upload-time = "2026-10-15T20:20:43.683Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/aa/93/29d4fdaa13e69034faf8d3503df915b07c820e2c08e3d6a7515149cde5bb/claude_agent_sdk-0.2.110-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fed0e0f4804d9f9cff80ab7d1b44142ebd1046cdd29ca74caef4c92c35fff8d8", size = 64924533, upload-time = "2026-06-24T22:11:55.612Z" }, - { url = "https://files.pythonhosted.org/packages/aa/03/b40bb673cd93cdc3928262c1be75fde34a7bed4bf2c2c20e04218e2005ea/claude_agent_sdk-0.2.110-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:62b23869d46cef6f6ff1d00ceaa5e846e2f1d297478421c835efb8fe99369d4f", size = 69704449, upload-time = "2026-06-24T22:11:59.149Z" }, - { url = "https://files.pythonhosted.org/packages/f9/18/ab67cb5ce641333385bed55ed8e9665c00f7d30d1f6ab12f8463ddb7695f/claude_agent_sdk-0.2.110-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:324e49553c6303d6b267217dc2912652b97af2bc96503efd12095ae915b46b83", size = 74879555, upload-time = "2026-06-24T22:12:03.25Z" }, - { url = "https://files.pythonhosted.org/packages/91/88/3627d7d14310cfec66977551263e219365244a906fc7ca1209fb0c3a6cec/claude_agent_sdk-0.2.110-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:56371dd7a2c66c0bd497dc0b3cab4193a228b196f600676393d69c0ecee37cfb", size = 75924237, upload-time = "2026-06-24T22:12:07.183Z" }, - { url = "https://files.pythonhosted.org/packages/49/79/c9066c5c387d42c19a4b675ec1ff5219f8920cfda8ff8b527119fd69b774/claude_agent_sdk-0.2.110-py3-none-win_amd64.whl", hash = "sha256:4235d4de6d685a189c12612095ab192b759280ede1f3aed0c3e784d52c3555f9", size = 75448209, upload-time = "2026-06-24T22:12:11.283Z" }, + { url = "https://files.pythonhosted.org/packages/15/31/9a205fc0b7ae1b66d5964774bb534ab378047c9bf87578f443bd1fb2205e/claude_agent_sdk-0.2.168-py3-none-macosx_11_0_arm64.whl", hash = "sha256:2ef1e7fc442c5abdc1e698027bf1b5faa8ea2130134a14364e2ae3c53bf31fdd", size = 104355641, upload-time = "2026-10-15T20:20:48.105Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ba/12bbe92d5e9145c7aaa94aa349a0859b77a9b58ccc40ae9e69cf7f078e5b/claude_agent_sdk-0.2.168-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:653fc7bbe56630e6ddd9601a7cfe50586667e74102da3fb90571456c63655a62", size = 109438860, upload-time = "2026-10-15T20:20:52.274Z" }, + { url = "https://files.pythonhosted.org/packages/ad/5a/26e587846f14f67f3353f96811b86931263a9c7e264d17a691d9577e4da5/claude_agent_sdk-0.2.168-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:77ae66b10edfd07b6ea3dec2af106ad47a9d616f8eb52d4f9b385e1b00bb2a27", size = 114030032, upload-time = "2026-10-15T20:20:56.813Z" }, + { url = "https://files.pythonhosted.org/packages/00/03/09d347dcddbbab4becd41fef3a811967eddf24135b2d62dac9e321c81537/claude_agent_sdk-0.2.168-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:be197be92549909ec62a2cee04c27f4b0a38c80f723735538a3efc352507f81d", size = 114443626, upload-time = "2026-10-15T20:21:01.794Z" }, + { url = "https://files.pythonhosted.org/packages/48/93/520a18ab853b688afcc31d504344e541a7dc68bc2b515ea8a5fef1c868a1/claude_agent_sdk-0.2.168-py3-none-win_amd64.whl", hash = "sha256:ed1814b0dd1c113bdaf3e51e6a67aa5b96b8f5c5839a43aeb6ae1e6ed23a5b35", size = 117292475, upload-time = "2026-10-15T20:21:07.053Z" }, ] [[package]] @@ -701,7 +702,7 @@ wheels = [ [[package]] name = "mcp" -version = "1.28.1" +version = "1.30.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -719,9 +720,9 @@ dependencies = [ { name = "typing-inspection" }, { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6e/77/9450b8f251a13affb6281997d0523c4615f8a8b35d0b21ff30db3a5aac9d/mcp-1.28.1.tar.gz", hash = "sha256:d51e36a5f5644faea4f85ea649bfffa6bc6c26770d42798ad6a3de3d2ba69683", size = 638501, upload-time = "2026-06-26T12:57:29.093Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/93/0142dc84a666daf8ad51a34268f34c12fd6fda4f3810c4be2504eecc8212/mcp-1.30.0.tar.gz", hash = "sha256:445414625fce5c295faa505bb11bacece661ab6f4028d57c935db57820b7a3e4", size = 680511, upload-time = "2026-09-07T14:34:15.845Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/5e/d118fce19f87a2e7d8101c35c8ae0ec289098a4df0ff244cec23e415aca0/mcp-1.28.1-py3-none-any.whl", hash = "sha256:2726bca5e7193f61c5dde8b12500a6de2d9acf6d1a1c0be9e8c2e706437991df", size = 222620, upload-time = "2026-06-26T12:57:27.218Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f4/e58bc33317c92a0203664daaf00bf6f41166cc0149e5d6870a03f7cd004a/mcp-1.30.0-py3-none-any.whl", hash = "sha256:666edb5009503e1047c9d60346a756f94b261f05cc2625f23d41c728ffc484d0", size = 234581, upload-time = "2026-09-07T14:34:14.266Z" }, ] [[package]] diff --git a/cdk/src/handlers/shared/bedrock-model-constants.ts b/cdk/src/handlers/shared/bedrock-model-constants.ts index 36b6ca990..f2a323fe9 100644 --- a/cdk/src/handlers/shared/bedrock-model-constants.ts +++ b/cdk/src/handlers/shared/bedrock-model-constants.ts @@ -60,7 +60,7 @@ * that list means the granted model and the delivered model id cannot drift — a * mismatch would AccessDenied every Haiku call at run time while synth stayed green. */ -export const DEFAULT_HAIKU_MODEL_ID = 'anthropic.claude-haiku-4-5-20251001-v1:0'; +export const DEFAULT_HAIKU_MODEL_ID = 'anthropic.claude-haiku-5-5'; /** * Single source of truth for the Bedrock **foundation-model IDs** the agent runtime @@ -81,16 +81,23 @@ export const DEFAULT_HAIKU_MODEL_ID = 'anthropic.claude-haiku-4-5-20251001-v1:0' * and was removed; `bgagent platform doctor` now checks the whole set for it. */ export const DEFAULT_BEDROCK_MODEL_IDS: readonly string[] = [ + // Previous-generation models stay granted after a default bump (#744, #953): + // blueprints may pin any of them per-repo, so removing one would fail those + // repos at turn 0. Retiring a model is a separate, announced change — never a + // side effect of adding a newer one. 'anthropic.claude-sonnet-4-6', - // Claude Opus 4.8. Blueprints may pin it per-repo, so removing it would fail those - // repos at turn 0. 'anthropic.claude-opus-4-8', - // Claude Opus 5 — the platform default. Bare ID by contract: Bedrock refuses the - // bare ID for on-demand invocation ("ValidationException: … isn't supported. Retry - // your request with the ID or ARN of an inference profile"), and the grant sites - // derive the geo-prefixed inference-profile ARN — the invocable one — from this - // entry plus `bedrockGeoRegion`. 'anthropic.claude-opus-5', + 'anthropic.claude-haiku-4-5-20251001-v1:0', + // Claude Opus 5.5 (platform default) and Haiku 5.5 (auxiliary default), #953. + // Bare IDs by contract: Bedrock refuses the bare ID for on-demand invocation + // ("ValidationException: … isn't supported. Retry your request with the ID or + // ARN of an inference profile"), and the grant sites derive the geo-prefixed + // inference-profile ARN — the invocable one — from each entry plus + // `bedrockGeoRegion`. Sonnet 5.5 is deliberately NOT here: it has no `jp.` + // profile (verified 2026-10-16), so granting it would recreate the + // granted-but-uninvocable state described above for one geography. + 'anthropic.claude-opus-5-5', DEFAULT_HAIKU_MODEL_ID, ]; @@ -106,7 +113,7 @@ export const DEFAULT_BEDROCK_MODEL_IDS: readonly string[] = [ * The auxiliary default is an ALIAS of {@link DEFAULT_HAIKU_MODEL_ID}, not a second * copy of the string: they must name the same model, and two literals could drift. */ -export const PLATFORM_DEFAULT_MODEL_ID = 'anthropic.claude-opus-5'; +export const PLATFORM_DEFAULT_MODEL_ID = 'anthropic.claude-opus-5-5'; export const PLATFORM_DEFAULT_AUX_MODEL_ID = DEFAULT_HAIKU_MODEL_ID; /** diff --git a/cdk/test/constructs/ecs-agent-cluster.test.ts b/cdk/test/constructs/ecs-agent-cluster.test.ts index 3c5a95688..98eafdf89 100644 --- a/cdk/test/constructs/ecs-agent-cluster.test.ts +++ b/cdk/test/constructs/ecs-agent-cluster.test.ts @@ -435,8 +435,16 @@ describe('EcsAgentCluster construct', () => { // on-demand invocable, so the `us.` profile is the one actually called. expect(serialized).toContain('foundation-model/anthropic.claude-opus-5'); expect(serialized).toContain('inference-profile/us.anthropic.claude-opus-5'); - // REGRESSION (#744): Opus 4.8 stays granted alongside Opus 5 — blueprints may - // pin it per-repo, so dropping it would fail those repos at turn 0. + // Claude 5.5 family (#953) — the platform default (Opus 5.5) and auxiliary + // default (Haiku 5.5). Both ARNs each: the bare id is not on-demand invocable, + // so the `us.`-prefixed inference profile is the one actually called. + expect(serialized).toContain('foundation-model/anthropic.claude-opus-5-5'); + expect(serialized).toContain('inference-profile/us.anthropic.claude-opus-5-5'); + expect(serialized).toContain('foundation-model/anthropic.claude-haiku-5-5'); + expect(serialized).toContain('inference-profile/us.anthropic.claude-haiku-5-5'); + // REGRESSION (#744, #953): previous defaults stay granted after a bump. + // Blueprints may pin any of them per-repo; dropping one would fail those repos + // at turn 0. expect(serialized).toContain('foundation-model/anthropic.claude-opus-4-8'); expect(serialized).toContain('inference-profile/us.anthropic.claude-opus-4-8'); }); @@ -456,15 +464,26 @@ describe('EcsAgentCluster construct', () => { test('default-context Bedrock grants are the exact expected set, nothing wider', () => { const EXPECTED_BEDROCK_RESOURCE_NAMES = [ 'foundation-model/anthropic.claude-haiku-4-5-20251001-v1:0', + 'foundation-model/anthropic.claude-haiku-5-5', 'foundation-model/anthropic.claude-opus-4-8', 'foundation-model/anthropic.claude-opus-5', + 'foundation-model/anthropic.claude-opus-5-5', 'foundation-model/anthropic.claude-sonnet-4-6', 'inference-profile/us.anthropic.claude-haiku-4-5-20251001-v1:0', + 'inference-profile/us.anthropic.claude-haiku-5-5', 'inference-profile/us.anthropic.claude-opus-4-8', 'inference-profile/us.anthropic.claude-opus-5', + 'inference-profile/us.anthropic.claude-opus-5-5', 'inference-profile/us.anthropic.claude-sonnet-4-6', ]; - const serialized = JSON.stringify(baseTemplate.findResources('AWS::IAM::Policy')); + // Inline AND managed-policy overflow, matching the AgentCore half: CDK splits a + // role's default policy into managed-policy chunks past the IAM size limit, and + // a grant that spilled over must still count here rather than vanish from view. + const policies = { + ...baseTemplate.findResources('AWS::IAM::Policy'), + ...baseTemplate.findResources('AWS::IAM::ManagedPolicy'), + }; + const serialized = JSON.stringify(Object.values(policies).map(policy => policy.Properties.PolicyDocument)); const found = [...new Set( serialized.match(/(?:foundation-model|inference-profile)\/[^"]+/g) ?? [], )].sort(); @@ -497,9 +516,9 @@ describe('EcsAgentCluster construct', () => { expect(containers.length).toBeGreaterThan(0); for (const c of containers) { const env = Object.fromEntries((c.Environment ?? []).map((e) => [e.Name, e.Value])); - expect(env.ANTHROPIC_MODEL).toBe(`${geo}.anthropic.claude-opus-5`); + expect(env.ANTHROPIC_MODEL).toBe(`${geo}.anthropic.claude-opus-5-5`); expect(env.ANTHROPIC_DEFAULT_HAIKU_MODEL) - .toBe(`${geo}.anthropic.claude-haiku-4-5-20251001-v1:0`); + .toBe(`${geo}.anthropic.claude-haiku-5-5`); } } }); diff --git a/cdk/test/stacks/agent.test.ts b/cdk/test/stacks/agent.test.ts index dedd325e0..6b55bc154 100644 --- a/cdk/test/stacks/agent.test.ts +++ b/cdk/test/stacks/agent.test.ts @@ -266,7 +266,7 @@ describe('AgentStack', () => { const envVars = (rt as { Properties?: { EnvironmentVariables?: Record } }) .Properties?.EnvironmentVariables ?? {}; expect(envVars.ANTHROPIC_DEFAULT_HAIKU_MODEL) - .toBe(`${DEFAULT_BEDROCK_GEO_REGION}.anthropic.claude-haiku-4-5-20251001-v1:0`); + .toBe(`${DEFAULT_BEDROCK_GEO_REGION}.anthropic.claude-haiku-5-5`); } }); @@ -387,9 +387,16 @@ describe('AgentStack', () => { // must be present or the agent gets AccessDenied at turn 0. expect(serialized).toContain('foundation-model/anthropic.claude-opus-5'); expect(serialized).toContain('inference-profile/us.anthropic.claude-opus-5'); - // REGRESSION (#744): Opus 4.8 stays granted alongside Opus 5. Blueprints may - // pin 4.8 per-repo; dropping it would fail those repos at turn 0. Retiring - // 4.8 is a separate, announced change — not a side effect of adding 5. + // Claude 5.5 family (#953) — the platform default (Opus 5.5) and auxiliary + // default (Haiku 5.5). Both ARNs each: the bare id is not on-demand invocable, + // so the `us.`-prefixed inference profile is the one actually called. + expect(serialized).toContain('foundation-model/anthropic.claude-opus-5-5'); + expect(serialized).toContain('inference-profile/us.anthropic.claude-opus-5-5'); + expect(serialized).toContain('foundation-model/anthropic.claude-haiku-5-5'); + expect(serialized).toContain('inference-profile/us.anthropic.claude-haiku-5-5'); + // REGRESSION (#744, #953): previous defaults stay granted after a bump. + // Blueprints may pin any of them per-repo; dropping one would fail those repos + // at turn 0. Retiring a model is a separate, announced change. expect(serialized).toContain('foundation-model/anthropic.claude-opus-4-8'); expect(serialized).toContain('inference-profile/us.anthropic.claude-opus-4-8'); }); @@ -407,8 +414,8 @@ describe('AgentStack', () => { context: { bedrockModels: [ 'anthropic.claude-opus-4-8', - 'anthropic.claude-opus-5', - 'anthropic.claude-haiku-4-5-20251001-v1:0', + 'anthropic.claude-opus-5-5', + 'anthropic.claude-haiku-5-5', ], }, }); @@ -496,12 +503,16 @@ describe('AgentStack', () => { // added, dropped, or re-prefixed without failing here. const EXPECTED_BEDROCK_RESOURCE_NAMES = [ 'foundation-model/anthropic.claude-haiku-4-5-20251001-v1:0', + 'foundation-model/anthropic.claude-haiku-5-5', 'foundation-model/anthropic.claude-opus-4-8', 'foundation-model/anthropic.claude-opus-5', + 'foundation-model/anthropic.claude-opus-5-5', 'foundation-model/anthropic.claude-sonnet-4-6', 'inference-profile/us.anthropic.claude-haiku-4-5-20251001-v1:0', + 'inference-profile/us.anthropic.claude-haiku-5-5', 'inference-profile/us.anthropic.claude-opus-4-8', 'inference-profile/us.anthropic.claude-opus-5', + 'inference-profile/us.anthropic.claude-opus-5-5', 'inference-profile/us.anthropic.claude-sonnet-4-6', ]; @@ -528,7 +539,7 @@ describe('AgentStack', () => { Properties?: { EnvironmentVariables?: Record }; }).Properties?.EnvironmentVariables ?? {}; expect(envVars.ANTHROPIC_DEFAULT_HAIKU_MODEL) - .toBe('us.anthropic.claude-haiku-4-5-20251001-v1:0'); + .toBe('us.anthropic.claude-haiku-5-5'); expect(DEFAULT_BEDROCK_GEO_REGION).toBe('us'); }); @@ -566,9 +577,9 @@ describe('AgentStack', () => { ); expect(envs.length).toBeGreaterThan(0); for (const env of envs) { - expect(env.ANTHROPIC_MODEL).toBe(`${geo}.anthropic.claude-opus-5`); + expect(env.ANTHROPIC_MODEL).toBe(`${geo}.anthropic.claude-opus-5-5`); expect(env.ANTHROPIC_DEFAULT_HAIKU_MODEL) - .toBe(`${geo}.anthropic.claude-haiku-4-5-20251001-v1:0`); + .toBe(`${geo}.anthropic.claude-haiku-5-5`); } }); @@ -611,7 +622,7 @@ describe('AgentStack', () => { const envVars = (rt as { Properties?: { EnvironmentVariables?: Record } }) .Properties?.EnvironmentVariables ?? {}; expect(envVars.ANTHROPIC_DEFAULT_HAIKU_MODEL) - .toBe(`${geo}.anthropic.claude-haiku-4-5-20251001-v1:0`); + .toBe(`${geo}.anthropic.claude-haiku-5-5`); } }); }); @@ -1094,7 +1105,7 @@ describe('AgentStack', () => { * independent of `bedrockModels`, so a narrowing override made the two disagree with * nothing to catch it. Verified before fixing: `-c * bedrockModels='["anthropic.claude-sonnet-4-6"]'` synthesized clean while granting only - * Sonnet and injecting `global.anthropic.claude-opus-5`. + * Sonnet and injecting `global.anthropic.claude-opus-5-5`. */ describe('AgentStack platform-default / grant-list coherence', () => { const synth = (bedrockModels?: string[]) => () => { @@ -1109,8 +1120,8 @@ describe('AgentStack platform-default / grant-list coherence', () => { const t = synth(['anthropic.claude-sonnet-4-6']); expect(t).toThrow(/omits the platform default model/); // Names every missing default, not just the first one found. - expect(t).toThrow(/anthropic\.claude-opus-5/); - expect(t).toThrow(/claude-haiku-4-5/); + expect(t).toThrow(/anthropic\.claude-opus-5-5/); + expect(t).toThrow(/claude-haiku-5-5/); // And says WHY, because the override looks self-consistent on its own. expect(t).toThrow(/told to invoke them regardless/); }); @@ -1118,14 +1129,14 @@ describe('AgentStack platform-default / grant-list coherence', () => { test('fails when only the AUXILIARY default is omitted', () => { // The easy one to miss: adding a model while dropping Haiku breaks only the // auxiliary path (WebFetch summarisation), which no task-level failure names. - expect(synth(['anthropic.claude-opus-5', 'anthropic.claude-sonnet-4-6'])) - .toThrow(/claude-haiku-4-5/); + expect(synth(['anthropic.claude-opus-5-5', 'anthropic.claude-sonnet-4-6'])) + .toThrow(/claude-haiku-5-5/); }); test('accepts an override that keeps both defaults', () => { expect(synth([ - 'anthropic.claude-opus-5', - 'anthropic.claude-haiku-4-5-20251001-v1:0', + 'anthropic.claude-opus-5-5', + 'anthropic.claude-haiku-5-5', 'anthropic.claude-sonnet-4-6', ])).not.toThrow(); }); diff --git a/cdk/test/stacks/compute-selection.test.ts b/cdk/test/stacks/compute-selection.test.ts index 1237110fb..a7182bb0f 100644 --- a/cdk/test/stacks/compute-selection.test.ts +++ b/cdk/test/stacks/compute-selection.test.ts @@ -121,7 +121,14 @@ describe.each(['agentcore', 'ecs', 'lambda-microvm'])('exclusive %s deployment', expect(trust.includes('LambdaMicrovmComputeExecutionRole')).toBe(backend === 'lambda-microvm'); expect(trust).toContain('sts:TagSession'); const prefix = backend === 'agentcore' ? 'RuntimeExecutionRole' : backend === 'ecs' ? 'EcsAgentClusterTaskRole' : 'LambdaMicrovmComputeExecutionRole'; - const policies = JSON.stringify(Object.entries(template.findResources('AWS::IAM::Policy')).filter(([id]) => id.startsWith(prefix))); + // Audit the role's inline policy AND its managed-policy overflow. CDK splits a + // role's default policy into `AWS::IAM::ManagedPolicy` chunks once the inline + // document exceeds the IAM size limit; the Bedrock grant list (#953) pushed the + // AgentCore runtime role past it, so a statement can legitimately live in either. + const policies = JSON.stringify([ + ...Object.entries(template.findResources('AWS::IAM::Policy')), + ...Object.entries(template.findResources('AWS::IAM::ManagedPolicy')), + ].filter(([id]) => id.startsWith(prefix))); expect(policies).toContain('bedrock-agentcore:InvokeGateway'); expect(policies).toContain('bedrock-agentcore:GetResourceOauth2Token'); }); diff --git a/cli/src/model-id.ts b/cli/src/model-id.ts index 72925cd2a..652e98f91 100644 --- a/cli/src/model-id.ts +++ b/cli/src/model-id.ts @@ -106,7 +106,7 @@ export function assertModelIdUsable(args: { if (!bare) { throw new CliError( `--model '${modelId}' is a geography prefix with no model after it. Use ` - + `'${geo}.', e.g. '${geo}.anthropic.claude-opus-5'.`, + + `'${geo}.', e.g. '${geo}.anthropic.claude-opus-5-5'.`, ); } // A second geo prefix on the bare half means the operator prefixed twice; the diff --git a/cli/src/repo-display.ts b/cli/src/repo-display.ts index 768656ab8..629953991 100644 --- a/cli/src/repo-display.ts +++ b/cli/src/repo-display.ts @@ -52,7 +52,7 @@ export const PLATFORM_REPO_DEFAULTS = { * if it names a different model than the runtime invokes, doctor can report a * healthy stack while every task fails at turn 0 with AccessDenied. */ - model_id: 'global.anthropic.claude-opus-5', + model_id: 'global.anthropic.claude-opus-5-5', max_turns: 200, poll_interval_ms: 30_000, approval_gate_cap: 50, diff --git a/cli/test/platform-doctor.test.ts b/cli/test/platform-doctor.test.ts index 3956cf98b..2bb18b10d 100644 --- a/cli/test/platform-doctor.test.ts +++ b/cli/test/platform-doctor.test.ts @@ -500,14 +500,14 @@ describe('doctor Bedrock inference-profile check', () => { const send = jest.fn().mockResolvedValue({}); const check = await profileCheck('global', send); expect(check.status).toBe('pass'); - expect(check.label).toContain('global.anthropic.claude-opus-5'); + expect(check.label).toContain('global.anthropic.claude-opus-5-5'); // The queried identifier is the geo-prefixed profile, not the bare model id. const queried = send.mock.calls .map(([c]) => (c as { _type?: string; input?: { inferenceProfileIdentifier?: string } })) .filter((c) => c._type === 'GetInferenceProfile') .map((c) => c.input?.inferenceProfileIdentifier); - expect(queried).toContain('global.anthropic.claude-opus-5'); + expect(queried).toContain('global.anthropic.claude-opus-5-5'); }); it('uses the geography the stack reports, not a hardcoded one', async () => { @@ -515,7 +515,7 @@ describe('doctor Bedrock inference-profile check', () => { // `us` and must be checked against `us.`, not against the current default. const send = jest.fn().mockResolvedValue({}); const check = await profileCheck('us', send); - expect(check.label).toContain('us.anthropic.claude-opus-5'); + expect(check.label).toContain('us.anthropic.claude-opus-5-5'); expect(check.label).not.toContain('global.'); }); diff --git a/docs/abca-plugin/skills/onboard-repo/SKILL.md b/docs/abca-plugin/skills/onboard-repo/SKILL.md index 3333025cb..26162f08d 100644 --- a/docs/abca-plugin/skills/onboard-repo/SKILL.md +++ b/docs/abca-plugin/skills/onboard-repo/SKILL.md @@ -40,9 +40,9 @@ Use AskUserQuestion to collect (only the repository is required — the rest fal - **Repository** — GitHub `owner/repo`. Must match exactly what's passed to `bgagent submit --repo` later. - **Compute type** — `agentcore` (default) or `ecs`. -- **Model** — default is the platform model (Opus 5). The geo prefix in the examples +- **Model** — default is the platform model (Opus 5.5). The geo prefix in the examples below (`global.`) must match the deployment's `bedrockGeoRegion`; `bgagent repo - onboard` rejects a mismatch at the CLI rather than letting the task fail at turn 0. If overriding, it must be a model **already granted to the runtime** (see "Model not yet wired into the runtime"), specified as a cross-Region **inference-profile ID** (e.g. `global.anthropic.claude-opus-5`), not a raw `anthropic.*` foundation-model ID. + onboard` rejects a mismatch at the CLI rather than letting the task fail at turn 0. If overriding, it must be a model **already granted to the runtime** (see "Model not yet wired into the runtime"), specified as a cross-Region **inference-profile ID** (e.g. `global.anthropic.claude-opus-5-5`), not a raw `anthropic.*` foundation-model ID. - **Max turns** — default 100 (range 1–500). - **Per-repo GitHub token** — only if this repo needs a different token than the platform default (provide its Secrets Manager ARN). @@ -59,7 +59,7 @@ no `cdk deploy`.** ```bash bgagent repo onboard # common overrides: -# --model e.g. global.anthropic.claude-opus-5 (must be runtime-granted) +# --model e.g. global.anthropic.claude-opus-5-5 (must be runtime-granted) # --compute-type # --max-turns per-repo default turn limit # --token-secret-arn per-repo GitHub token (else platform default) @@ -79,7 +79,7 @@ That's it — the repo is onboarded. Submit a task with the `submit-task` skill. **Pick a model that is already wired into the runtime.** With no `--model`, the repo uses the platform default — read it from the stack's `BedrockGeoRegion` + `BedrockModelIds` outputs rather than a literal here. If you pass `--model`, use a cross-Region -**inference profile ID** (e.g. `global.anthropic.claude-opus-5`), not a raw +**inference profile ID** (e.g. `global.anthropic.claude-opus-5-5`), not a raw `anthropic.*` foundation-model ID. Only models the stack has granted the runtime can be invoked — see "Model not yet wired into the runtime" before choosing a model the deployment doesn't already support. @@ -100,7 +100,7 @@ editing the stack and redeploying. repoTable: repoTable.table, // Optional overrides: // computeType: 'agentcore', - // modelId: 'global.anthropic.claude-opus-5', + // modelId: 'global.anthropic.claude-opus-5-5', // maxTurns: 100, // maxBudgetUsd: 50, // githubTokenSecretArn: 'arn:aws:secretsmanager:...', @@ -118,8 +118,8 @@ editing the stack and redeploying. A repo can only use a model the **runtime IAM role has `grantInvoke` for**. The granted set is `DEFAULT_BEDROCK_MODEL_IDS` in -`cdk/src/handlers/shared/bedrock-model-constants.ts` — Sonnet 4.6, -Opus 4.8, Opus 5, and Haiku 4.5 — and a deployed stack publishes it as the +`cdk/src/handlers/shared/bedrock-model-constants.ts` — Opus 5.5 and Haiku 5.5 (the +defaults) plus Sonnet 4.6, Opus 4.8, Opus 5, and Haiku 4.5 — and a deployed stack publishes it as the `BedrockModelIds` output, so read that rather than trusting this list to stay current: ```bash @@ -138,20 +138,20 @@ ids for on-demand invocation, and the IAM grant is scoped to one geography's pro Granting a **new** model is a deploy-time change, not a construct edit: the list is overridable via CDK context, either on the command line or in `cdk.json`. Both forms behave identically — the resolver JSON-parses the string `-c` delivers. ```bash -cdk deploy -c bedrockModels='["anthropic.claude-opus-5","anthropic.claude-haiku-4-5-20251001-v1:0","anthropic.claude-sonnet-4-6"]' +cdk deploy -c bedrockModels='["anthropic.claude-opus-5-5","anthropic.claude-haiku-5-5","anthropic.claude-sonnet-4-6"]' ``` -The override **REPLACES** the default list rather than adding to it, so it must include the two models the stack injects as `ANTHROPIC_MODEL` and `ANTHROPIC_DEFAULT_HAIKU_MODEL` — Opus 5 and Haiku 4.5. Omitting either fails at synth, naming the missing model, because every substrate is told to invoke them regardless of this list. (`--context-file` does not work for this: it is accepted and silently ignored.) +The override **REPLACES** the default list rather than adding to it, so it must include the two models the stack injects as `ANTHROPIC_MODEL` and `ANTHROPIC_DEFAULT_HAIKU_MODEL` — Opus 5.5 and Haiku 5.5. Omitting either fails at synth, naming the missing model, because every substrate is told to invoke them regardless of this list. (`--context-file` does not work for this: it is accepted and silently ignored.) For a persistent setting, put the same array in the `context` block of `cdk.json`: ```jsonc // cdk.json — this REPLACES the default list, so include the platform defaults -// (Opus 5 + Haiku 4.5) or the stack's own defaults are ungranted +// (Opus 5.5 + Haiku 5.5) or the stack's own defaults are ungranted "context": { "bedrockModels": [ - "anthropic.claude-opus-5", - "anthropic.claude-haiku-4-5-20251001-v1:0", + "anthropic.claude-opus-5-5", + "anthropic.claude-haiku-5-5", "anthropic.claude-sonnet-4-6" ] } @@ -186,7 +186,7 @@ platform default, and treat "add model X" as a separate, later change. |---------|---------|---------| | `compute_type` | Execution strategy | `agentcore` | | `runtime_arn` | AgentCore runtime override | Platform default | -| `model_id` | AI model for tasks (inference profile ID) | Platform default (Opus 5, as `.anthropic.claude-opus-5`) | +| `model_id` | AI model for tasks (inference profile ID) | Platform default (Opus 5.5, as `.anthropic.claude-opus-5-5`) | | `max_turns` | Turn limit per task | 100 | | `max_budget_usd` | Cost ceiling per task | Unlimited | | `system_prompt_overrides` | Custom system instructions | None | @@ -199,6 +199,6 @@ Task-level parameters override per-repo defaults; if neither specifies a value, - **`REPO_NOT_ONBOARDED` / 422** — the repo isn't registered. Run `bgagent repo onboard ` (Path A). Confirm the `owner/repo` matches exactly what you pass to `bgagent submit --repo`. - **Preflight failure after onboarding** — the GitHub PAT lacks access to the new repo. Ensure the token has Contents (read/write) + Pull requests (read/write) on it, or onboard with a repo-specific `--token-secret-arn`. -- **400 "Invocation with on-demand throughput isn't supported"** — `model_id` is a raw foundation-model ID; use the inference-profile ID (e.g. `global.anthropic.claude-opus-5`). +- **400 "Invocation with on-demand throughput isn't supported"** — `model_id` is a raw foundation-model ID; use the inference-profile ID (e.g. `global.anthropic.claude-opus-5-5`). - **403 "not authorized to perform bedrock:InvokeModelWithResponseStream"** — the repo's model isn't wired into the runtime. See "Model not yet wired into the runtime." - **Model not available / "not available on your Bedrock deployment"** — account-level Bedrock access isn't enabled for that model/Region (separate from IAM); complete [model access](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html), then use an enabled inference-profile ID. diff --git a/docs/abca-plugin/skills/troubleshoot/SKILL.md b/docs/abca-plugin/skills/troubleshoot/SKILL.md index 7a6d3805e..ef96c3d17 100644 --- a/docs/abca-plugin/skills/troubleshoot/SKILL.md +++ b/docs/abca-plugin/skills/troubleshoot/SKILL.md @@ -111,13 +111,13 @@ node cli/lib/bin/bgagent.js events --output json - Common: repo build/test commands not documented in CLAUDE.md **403 "not authorized to perform bedrock:InvokeModelWithResponseStream":** -- The repo's `model_id` is a model the runtime IAM role wasn't granted. The runtime only has `grantInvoke` for the models in the stack's configured set — read it from the `BedrockModelIds` stack output rather than a list here (Sonnet 4.6, Opus 4.8, Opus 5, Haiku 4.5 by default). -- **Quick fix:** point the repo at an already-granted model — `bgagent repo onboard --model global.anthropic.claude-opus-5` (no redeploy). -- **To add a new model to the runtime:** grant it in the stack and redeploy. The model set is the shared list in `cdk/src/constructs/bedrock-models.ts` — add the model via the `bedrockModels` CDK context (`cdk.json`) so both the AgentCore and ECS backends grant it (#433). Adding a model also requires **account-level Bedrock access** for it (separate from IAM — see the next row). +- The repo's `model_id` is a model the runtime IAM role wasn't granted. The runtime only has `grantInvoke` for the models in the stack's configured set — read it from the `BedrockModelIds` stack output rather than a list here (Opus 5.5, Haiku 5.5, Sonnet 4.6, Opus 4.8, Opus 5, Haiku 4.5 by default). +- **Quick fix:** point the repo at an already-granted model — `bgagent repo onboard --model global.anthropic.claude-opus-5-5` (no redeploy). +- **To add a new model to the runtime:** grant it in the stack and redeploy. The model set is `DEFAULT_BEDROCK_MODEL_IDS` in `cdk/src/handlers/shared/bedrock-model-constants.ts` — add the model via the `bedrockModels` CDK context (`cdk.json`) so both the AgentCore and ECS backends grant it (#433). Adding a model also requires **account-level Bedrock access** for it (separate from IAM — see the next row). **Model not enabled / "not available on your Bedrock deployment" (often immediate failure, few turns, zero or near-zero tokens):** - **IAM is necessary but not sufficient.** The AgentCore role may already have `bedrock:InvokeModel*`, but the **account** must also satisfy [Amazon Bedrock model access](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html): Marketplace subscription flow on first serverless use (with `aws-marketplace:Subscribe` / `ViewSubscriptions` where needed), Anthropic **first-time use** details (`PutUseCaseForModelAccess` or the console model catalog), and a valid payment method for Marketplace-backed models. -- **Use an inference profile ID** in the Blueprint / DynamoDB `model_id` when Bedrock requires it for on-demand invocation (for example `global.anthropic.claude-opus-5` for global Opus 5). See [Use an inference profile in model invocation](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-use.html). Raw `anthropic.*` IDs often hit "on-demand not supported" or wrong routing — see the **400** row below. +- **Use an inference profile ID** in the Blueprint / DynamoDB `model_id` when Bedrock requires it for on-demand invocation (for example `global.anthropic.claude-opus-5-5` for global Opus 5.5). See [Use an inference profile in model invocation](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-use.html). Raw `anthropic.*` IDs often hit "on-demand not supported" or wrong routing — see the **400** row below. - **Cross-Region profiles** route across Regions in a geography; ensure IAM and any SCPs allow Bedrock in **all destination Regions** for that profile. See [Supported Regions and models for inference profiles](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-support.html). - **Task status:** When the Claude CLI reports a terminal error via `ResultMessage.is_error`, the agent marks the task **FAILED** (not COMPLETED) and persists `error_message` in DynamoDB. diff --git a/docs/design/ARCHITECTURE.md b/docs/design/ARCHITECTURE.md index f73387750..b046b0c3d 100644 --- a/docs/design/ARCHITECTURE.md +++ b/docs/design/ARCHITECTURE.md @@ -62,8 +62,8 @@ Different tasks and repos may benefit from different models. The `model_id` fiel |---|---|---|---| | `coding/new-task-v1` | Claude Sonnet 4 | `anthropic.claude-sonnet-4-6` | Good balance of quality and cost | | `coding/pr-iteration-v1` | Claude Sonnet 4 | `anthropic.claude-sonnet-4-6` | Needs to understand review feedback and make code changes | -| `coding/pr-review-v1` | Claude Haiku | `anthropic.claude-haiku-4-5-20251001-v1:0` | Fast and cheap - review is read-only analysis | -| Complex/critical repos | Claude Opus 4.8 | `anthropic.claude-opus-4-8` | Highest quality, opt-in per repo | +| `coding/pr-review-v1` | Claude Haiku 5.5 | `anthropic.claude-haiku-5-5` | Fast and cheap - review is read-only analysis | +| Complex/critical repos | Claude Opus 5.5 | `anthropic.claude-opus-5-5` | Highest quality; also the platform default when a repo pins nothing | ## Cost model diff --git a/docs/design/BEDROCK_COST_ATTRIBUTION.md b/docs/design/BEDROCK_COST_ATTRIBUTION.md index 1358461e8..a161f1c97 100644 --- a/docs/design/BEDROCK_COST_ATTRIBUTION.md +++ b/docs/design/BEDROCK_COST_ATTRIBUTION.md @@ -86,7 +86,7 @@ Set via the process env (not project settings) so the untrusted repo can't alter ## Version alignment -The agent runs Claude Code two ways that must agree on the control protocol: the `claude-agent-sdk` Python wheel **bundles** a CLI, and the Dockerfile also installs the CLI via npm. Both are pinned in lockstep — `claude-agent-sdk==0.2.110` (bundles CLI 2.1.191) and npm `@anthropic-ai/claude-code@2.1.191`. 2.1.191 also satisfies the ≥2.1.176 `awsCredentialExport`-with-`Expiration` requirement. +The agent runs Claude Code two ways that must agree on the control protocol: the `claude-agent-sdk` Python wheel **bundles** a CLI, and the Dockerfile also installs the CLI via npm. Both are pinned in lockstep — `claude-agent-sdk==0.2.168` (bundles CLI 2.1.301) and npm `@anthropic-ai/claude-code@2.1.301`. 2.1.301 also satisfies the ≥2.1.176 `awsCredentialExport`-with-`Expiration` requirement and the ≥2.1.280 floor the Claude 5.5 default models need. ## Track 3 — operator documentation diff --git a/docs/design/INTERACTIVE_AGENTS.md b/docs/design/INTERACTIVE_AGENTS.md index c17955d97..cb09255c1 100644 --- a/docs/design/INTERACTIVE_AGENTS.md +++ b/docs/design/INTERACTIVE_AGENTS.md @@ -766,12 +766,12 @@ Opt-in per task: 4 KB previews + full trajectory to S3 with TTL. ## Appendix A — Claude Agent SDK reference -Pinned version: `claude-agent-sdk==0.2.110` (Python; see `agent/pyproject.toml`). +Pinned version: `claude-agent-sdk==0.2.168` (Python; see `agent/pyproject.toml`). > **Caution — re-verify against 0.2.x.** The hook-surface details in this > appendix (the `HookEvent` enum members, `PostToolUseFailure`, the Stop-hook > return-value contract, etc.) were originally written against -> `claude-agent-sdk==0.1.53`. The pin has since advanced to `0.2.110`, and the +> `claude-agent-sdk==0.1.53`. The pin has since advanced to `0.2.168`, and the > SDK's hook API may have changed across that range. Before relying on any > specific enum member or hook signature below, verify it against the installed > 0.2.x SDK and the actual usage in `agent/src/hooks.py`. diff --git a/docs/design/REPO_ONBOARDING.md b/docs/design/REPO_ONBOARDING.md index 3a2ca7ab2..7bbc3855a 100644 --- a/docs/design/REPO_ONBOARDING.md +++ b/docs/design/REPO_ONBOARDING.md @@ -120,7 +120,7 @@ From lowest to highest priority: |---|---|---| | `compute_type` | First deployed backend (`agentcore` with legacy context) | Ordered `DEPLOYED_COMPUTE_TYPE` list on the orchestrator; `ComputeTypes`, `ComputeSubstrate` and `ComputeDeploymentMode` outputs for CLI discovery | | `runtime_arn` | Stack-level env var | CDK stack props | -| `model_id` | `global.anthropic.claude-opus-5` | injected by the stack as `ANTHROPIC_MODEL` from `bedrockGeoRegion`; `agent/src/config.py` holds the no-env fallback — see [Model configuration](../guides/DEVELOPER_GUIDE.md#model-configuration) | +| `model_id` | `global.anthropic.claude-opus-5-5` | injected by the stack as `ANTHROPIC_MODEL` from `bedrockGeoRegion`; `agent/src/config.py` holds the no-env fallback — see [Model configuration](../guides/DEVELOPER_GUIDE.md#model-configuration) | | `max_turns` | 100 | Platform constant | | `max_budget_usd` | None (unlimited) | No platform default by design — a global ceiling would kill long tasks mid-change. Set a per-repo default with Blueprint `agent.maxBudgetUsd` (`0.01`–`100`, validated at synth) or per task with `--max-budget` / `max_budget_usd`. See [Per-repo overrides](../guides/USER_GUIDE.md#per-repo-overrides) for the complete list of surfaces a budget can come from | | `memory_token_budget` | 2000 | Platform constant | diff --git a/docs/guides/DEPLOYMENT_GUIDE.md b/docs/guides/DEPLOYMENT_GUIDE.md index e2f4997dc..4bd7c31fb 100644 --- a/docs/guides/DEPLOYMENT_GUIDE.md +++ b/docs/guides/DEPLOYMENT_GUIDE.md @@ -213,7 +213,7 @@ At public US East (N. Virginia) first-tier list rates verified in August 2026, t | Service | Used By | Scales to Zero | |---------|---------|---------------| -| Bedrock (Claude Sonnet 4.6, Opus 4.8, Opus 5, Haiku 4.5) | Agent reasoning, cross-region inference profiles | Yes | +| Bedrock (Claude Opus 5.5, Haiku 5.5, plus Sonnet 4.6, Opus 4.8, Opus 5, Haiku 4.5 for pinned repos) | Agent reasoning, cross-region inference profiles | Yes | | Bedrock Guardrails | Prompt injection detection on task input | Yes | | Bedrock AgentCore Memory | Semantic + episodic extraction strategies | Yes | | AWS Agent Registry (preview, default-on) | Versioned agent asset catalog and governance | N/A (managed preview service) | diff --git a/docs/guides/DEVELOPER_GUIDE.md b/docs/guides/DEVELOPER_GUIDE.md index 10cbce3cd..d977aadfa 100644 --- a/docs/guides/DEVELOPER_GUIDE.md +++ b/docs/guides/DEVELOPER_GUIDE.md @@ -76,7 +76,7 @@ definitions.push({ repo: 'acme/my-service', compute: { runtimeArn: '...' }, // override the default runtime ARN agent: { - modelId: 'global.anthropic.claude-opus-5', // foundation model override + modelId: 'global.anthropic.claude-opus-5-5', // foundation model override maxTurns: 150, // default turn limit for this repo systemPromptOverrides: 'Extra instructions...', // appended to the platform prompt }, @@ -160,7 +160,7 @@ See the [Cedar policy guide](./CEDAR_POLICY_GUIDE.md) for the full authoring ref per-task payload model_id (layer 5) > blueprint agent.modelId (layer 4, arrives as stack env ANTHROPIC_MODEL) > stack env ANTHROPIC_MODEL (layer 3-adjacent / local shell) - > agent/src/config.py fallback (layer 2 — global.anthropic.claude-opus-5) + > agent/src/config.py fallback (layer 2 — global.anthropic.claude-opus-5-5) ``` Every one of those is gated by the **IAM invoke allowlist** (layer 1), which is itself gated by **account-level Bedrock model access**. Both gates are silent until invocation: a model that resolves fine through precedence still fails at turn 0 with `AccessDenied` if it is not in the grant list, and fails again if your account has not completed [Bedrock model access](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html) for it. @@ -178,7 +178,7 @@ throughput isn't supported. Retry your request with the ID or ARN of an inferenc profile that contains this model. ``` -So: `bedrockModels` context → `anthropic.claude-opus-5`. Everywhere else → `global.anthropic.claude-opus-5` (or whatever geo you have configured — see below). +So: `bedrockModels` context → `anthropic.claude-opus-5-5`. Everywhere else → `global.anthropic.claude-opus-5-5` (or whatever geo you have configured — see below). ### Choosing the inference-profile geography @@ -209,6 +209,7 @@ Changing the geography requires a **redeploy**, because the IAM grants are scope 4. Update the **prefixed** ID in `agent/src/config.py` and `agent/src/models.py` too. These are the fallback a run with no env reaches (a local batch run), and the doc-drift test compares against them. 5. **Verify the SDK price table recognizes the model.** The `max_budget_usd` guardrail is computed from a price table bundled into the Claude Agent SDK at build time, so an unrecognized model silently degrades budget enforcement. Run `agent/scripts/diagnostics/test_sdk_smoke.py` with `ANTHROPIC_MODEL` set to the new ID, divide the reported cost by the input-token count, and confirm the implied rate matches [published Bedrock pricing](https://aws.amazon.com/bedrock/pricing/). A `$0.00` or wildly-off result means the table does not know the model and budgets cannot be trusted. 6. The doc-drift test (`cdk/test/contracts/model-default-docs-parity.test.ts`) fails until the documented defaults here and in `agent/README.md` match `config.py`. That failure is the reminder, not a nuisance — update both. +7. **Tell operators who override `bedrockModels`.** The override REPLACES the default list, and synth fails ("omits the platform default model") if it lacks either new default. A deployment carrying `-c bedrockModels=[...]` or a `cdk.json` `context` entry must add the new bare IDs before pulling the bump — call this out in the release notes. ### Cost and model selection @@ -378,7 +379,7 @@ The `--local-events` flag connects the agent container to DynamoDB Local on the | Variable | Default | Description | |---|---|---| -| `ANTHROPIC_MODEL` | `global.anthropic.claude-opus-5` | Bedrock inference-profile ID for the main coding model | +| `ANTHROPIC_MODEL` | `global.anthropic.claude-opus-5-5` | Bedrock inference-profile ID for the main coding model | | `MAX_TURNS` | `100` | Max agent turns before stopping | | `MAX_BUDGET_USD` | | Cost ceiling for local batch runs only (production uses the API field) | | `DRY_RUN` | | Set to `1` to validate and print prompt without running the agent | diff --git a/docs/guides/USER_GUIDE.md b/docs/guides/USER_GUIDE.md index 7d55b39e5..ea6e2b8c6 100644 --- a/docs/guides/USER_GUIDE.md +++ b/docs/guides/USER_GUIDE.md @@ -229,7 +229,7 @@ Blueprints can configure per-repository settings that override platform defaults |---|---|---| | `compute_type` | Compute strategy (`agentcore`, `ecs`, or `lambda-microvm`) | `agentcore` | | `runtime_arn` | AgentCore runtime ARN override | Platform default | -| `model_id` | Bedrock inference-profile ID (geo-prefixed, matching the deployment's `bedrockGeoRegion`) | `global.anthropic.claude-opus-5` | +| `model_id` | Bedrock inference-profile ID (geo-prefixed, matching the deployment's `bedrockGeoRegion`) | `global.anthropic.claude-opus-5-5` | | `max_turns` | Default turn limit for tasks | 100 | | `max_budget_usd` | Default cost budget in USD per task, `0.01`–`100` (Blueprint `agent.maxBudgetUsd`) | None (unlimited) | | `system_prompt_overrides` | Additional system prompt instructions | None | diff --git a/docs/src/content/docs/architecture/Architecture.md b/docs/src/content/docs/architecture/Architecture.md index 88a176092..7928b8e51 100644 --- a/docs/src/content/docs/architecture/Architecture.md +++ b/docs/src/content/docs/architecture/Architecture.md @@ -66,8 +66,8 @@ Different tasks and repos may benefit from different models. The `model_id` fiel |---|---|---|---| | `coding/new-task-v1` | Claude Sonnet 4 | `anthropic.claude-sonnet-4-6` | Good balance of quality and cost | | `coding/pr-iteration-v1` | Claude Sonnet 4 | `anthropic.claude-sonnet-4-6` | Needs to understand review feedback and make code changes | -| `coding/pr-review-v1` | Claude Haiku | `anthropic.claude-haiku-4-5-20251001-v1:0` | Fast and cheap - review is read-only analysis | -| Complex/critical repos | Claude Opus 4.8 | `anthropic.claude-opus-4-8` | Highest quality, opt-in per repo | +| `coding/pr-review-v1` | Claude Haiku 5.5 | `anthropic.claude-haiku-5-5` | Fast and cheap - review is read-only analysis | +| Complex/critical repos | Claude Opus 5.5 | `anthropic.claude-opus-5-5` | Highest quality; also the platform default when a repo pins nothing | ## Cost model diff --git a/docs/src/content/docs/architecture/Bedrock-cost-attribution.md b/docs/src/content/docs/architecture/Bedrock-cost-attribution.md index dbd3a7121..294ff3017 100644 --- a/docs/src/content/docs/architecture/Bedrock-cost-attribution.md +++ b/docs/src/content/docs/architecture/Bedrock-cost-attribution.md @@ -90,7 +90,7 @@ Set via the process env (not project settings) so the untrusted repo can't alter ## Version alignment -The agent runs Claude Code two ways that must agree on the control protocol: the `claude-agent-sdk` Python wheel **bundles** a CLI, and the Dockerfile also installs the CLI via npm. Both are pinned in lockstep — `claude-agent-sdk==0.2.110` (bundles CLI 2.1.191) and npm `@anthropic-ai/claude-code@2.1.191`. 2.1.191 also satisfies the ≥2.1.176 `awsCredentialExport`-with-`Expiration` requirement. +The agent runs Claude Code two ways that must agree on the control protocol: the `claude-agent-sdk` Python wheel **bundles** a CLI, and the Dockerfile also installs the CLI via npm. Both are pinned in lockstep — `claude-agent-sdk==0.2.168` (bundles CLI 2.1.301) and npm `@anthropic-ai/claude-code@2.1.301`. 2.1.301 also satisfies the ≥2.1.176 `awsCredentialExport`-with-`Expiration` requirement and the ≥2.1.280 floor the Claude 5.5 default models need. ## Track 3 — operator documentation diff --git a/docs/src/content/docs/architecture/Interactive-agents.md b/docs/src/content/docs/architecture/Interactive-agents.md index f968bc830..3978af2cc 100644 --- a/docs/src/content/docs/architecture/Interactive-agents.md +++ b/docs/src/content/docs/architecture/Interactive-agents.md @@ -770,12 +770,12 @@ Opt-in per task: 4 KB previews + full trajectory to S3 with TTL. ## Appendix A — Claude Agent SDK reference -Pinned version: `claude-agent-sdk==0.2.110` (Python; see `agent/pyproject.toml`). +Pinned version: `claude-agent-sdk==0.2.168` (Python; see `agent/pyproject.toml`). > **Caution — re-verify against 0.2.x.** The hook-surface details in this > appendix (the `HookEvent` enum members, `PostToolUseFailure`, the Stop-hook > return-value contract, etc.) were originally written against -> `claude-agent-sdk==0.1.53`. The pin has since advanced to `0.2.110`, and the +> `claude-agent-sdk==0.1.53`. The pin has since advanced to `0.2.168`, and the > SDK's hook API may have changed across that range. Before relying on any > specific enum member or hook signature below, verify it against the installed > 0.2.x SDK and the actual usage in `agent/src/hooks.py`. diff --git a/docs/src/content/docs/architecture/Repo-onboarding.md b/docs/src/content/docs/architecture/Repo-onboarding.md index 80ef5373c..d9c3c6233 100644 --- a/docs/src/content/docs/architecture/Repo-onboarding.md +++ b/docs/src/content/docs/architecture/Repo-onboarding.md @@ -124,7 +124,7 @@ From lowest to highest priority: |---|---|---| | `compute_type` | First deployed backend (`agentcore` with legacy context) | Ordered `DEPLOYED_COMPUTE_TYPE` list on the orchestrator; `ComputeTypes`, `ComputeSubstrate` and `ComputeDeploymentMode` outputs for CLI discovery | | `runtime_arn` | Stack-level env var | CDK stack props | -| `model_id` | `global.anthropic.claude-opus-5` | injected by the stack as `ANTHROPIC_MODEL` from `bedrockGeoRegion`; `agent/src/config.py` holds the no-env fallback — see [Model configuration](/sample-autonomous-cloud-coding-agents/developer-guide/model-configuration) | +| `model_id` | `global.anthropic.claude-opus-5-5` | injected by the stack as `ANTHROPIC_MODEL` from `bedrockGeoRegion`; `agent/src/config.py` holds the no-env fallback — see [Model configuration](/sample-autonomous-cloud-coding-agents/developer-guide/model-configuration) | | `max_turns` | 100 | Platform constant | | `max_budget_usd` | None (unlimited) | No platform default by design — a global ceiling would kill long tasks mid-change. Set a per-repo default with Blueprint `agent.maxBudgetUsd` (`0.01`–`100`, validated at synth) or per task with `--max-budget` / `max_budget_usd`. See [Per-repo overrides](/sample-autonomous-cloud-coding-agents/customizing/per-repo-overrides) for the complete list of surfaces a budget can come from | | `memory_token_budget` | 2000 | Platform constant | diff --git a/docs/src/content/docs/customizing/Per-repo-overrides.md b/docs/src/content/docs/customizing/Per-repo-overrides.md index a2efae5af..cb18a168a 100644 --- a/docs/src/content/docs/customizing/Per-repo-overrides.md +++ b/docs/src/content/docs/customizing/Per-repo-overrides.md @@ -8,7 +8,7 @@ Blueprints can configure per-repository settings that override platform defaults |---|---|---| | `compute_type` | Compute strategy (`agentcore`, `ecs`, or `lambda-microvm`) | `agentcore` | | `runtime_arn` | AgentCore runtime ARN override | Platform default | -| `model_id` | Bedrock inference-profile ID (geo-prefixed, matching the deployment's `bedrockGeoRegion`) | `global.anthropic.claude-opus-5` | +| `model_id` | Bedrock inference-profile ID (geo-prefixed, matching the deployment's `bedrockGeoRegion`) | `global.anthropic.claude-opus-5-5` | | `max_turns` | Default turn limit for tasks | 100 | | `max_budget_usd` | Default cost budget in USD per task, `0.01`–`100` (Blueprint `agent.maxBudgetUsd`) | None (unlimited) | | `system_prompt_overrides` | Additional system prompt instructions | None | diff --git a/docs/src/content/docs/developer-guide/Installation.md b/docs/src/content/docs/developer-guide/Installation.md index 5a01813c6..e0c6579e3 100644 --- a/docs/src/content/docs/developer-guide/Installation.md +++ b/docs/src/content/docs/developer-guide/Installation.md @@ -133,7 +133,7 @@ The `--local-events` flag connects the agent container to DynamoDB Local on the | Variable | Default | Description | |---|---|---| -| `ANTHROPIC_MODEL` | `global.anthropic.claude-opus-5` | Bedrock inference-profile ID for the main coding model | +| `ANTHROPIC_MODEL` | `global.anthropic.claude-opus-5-5` | Bedrock inference-profile ID for the main coding model | | `MAX_TURNS` | `100` | Max agent turns before stopping | | `MAX_BUDGET_USD` | | Cost ceiling for local batch runs only (production uses the API field) | | `DRY_RUN` | | Set to `1` to validate and print prompt without running the agent | diff --git a/docs/src/content/docs/developer-guide/Model-configuration.md b/docs/src/content/docs/developer-guide/Model-configuration.md index 92454140a..48058fd4a 100644 --- a/docs/src/content/docs/developer-guide/Model-configuration.md +++ b/docs/src/content/docs/developer-guide/Model-configuration.md @@ -28,7 +28,7 @@ title: Model configuration per-task payload model_id (layer 5) > blueprint agent.modelId (layer 4, arrives as stack env ANTHROPIC_MODEL) > stack env ANTHROPIC_MODEL (layer 3-adjacent / local shell) - > agent/src/config.py fallback (layer 2 — global.anthropic.claude-opus-5) + > agent/src/config.py fallback (layer 2 — global.anthropic.claude-opus-5-5) ``` Every one of those is gated by the **IAM invoke allowlist** (layer 1), which is itself gated by **account-level Bedrock model access**. Both gates are silent until invocation: a model that resolves fine through precedence still fails at turn 0 with `AccessDenied` if it is not in the grant list, and fails again if your account has not completed [Bedrock model access](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html) for it. @@ -46,7 +46,7 @@ throughput isn't supported. Retry your request with the ID or ARN of an inferenc profile that contains this model. ``` -So: `bedrockModels` context → `anthropic.claude-opus-5`. Everywhere else → `global.anthropic.claude-opus-5` (or whatever geo you have configured — see below). +So: `bedrockModels` context → `anthropic.claude-opus-5-5`. Everywhere else → `global.anthropic.claude-opus-5-5` (or whatever geo you have configured — see below). ### Choosing the inference-profile geography @@ -77,6 +77,7 @@ Changing the geography requires a **redeploy**, because the IAM grants are scope 4. Update the **prefixed** ID in `agent/src/config.py` and `agent/src/models.py` too. These are the fallback a run with no env reaches (a local batch run), and the doc-drift test compares against them. 5. **Verify the SDK price table recognizes the model.** The `max_budget_usd` guardrail is computed from a price table bundled into the Claude Agent SDK at build time, so an unrecognized model silently degrades budget enforcement. Run `agent/scripts/diagnostics/test_sdk_smoke.py` with `ANTHROPIC_MODEL` set to the new ID, divide the reported cost by the input-token count, and confirm the implied rate matches [published Bedrock pricing](https://aws.amazon.com/bedrock/pricing/). A `$0.00` or wildly-off result means the table does not know the model and budgets cannot be trusted. 6. The doc-drift test (`cdk/test/contracts/model-default-docs-parity.test.ts`) fails until the documented defaults here and in `agent/README.md` match `config.py`. That failure is the reminder, not a nuisance — update both. +7. **Tell operators who override `bedrockModels`.** The override REPLACES the default list, and synth fails ("omits the platform default model") if it lacks either new default. A deployment carrying `-c bedrockModels=[...]` or a `cdk.json` `context` entry must add the new bare IDs before pulling the bump — call this out in the release notes. ### Cost and model selection diff --git a/docs/src/content/docs/developer-guide/Repository-preparation.md b/docs/src/content/docs/developer-guide/Repository-preparation.md index 9190be278..0cfea27ae 100644 --- a/docs/src/content/docs/developer-guide/Repository-preparation.md +++ b/docs/src/content/docs/developer-guide/Repository-preparation.md @@ -48,7 +48,7 @@ definitions.push({ repo: 'acme/my-service', compute: { runtimeArn: '...' }, // override the default runtime ARN agent: { - modelId: 'global.anthropic.claude-opus-5', // foundation model override + modelId: 'global.anthropic.claude-opus-5-5', // foundation model override maxTurns: 150, // default turn limit for this repo systemPromptOverrides: 'Extra instructions...', // appended to the platform prompt }, diff --git a/docs/src/content/docs/getting-started/Deployment-guide.md b/docs/src/content/docs/getting-started/Deployment-guide.md index 832b21d0a..53488f40e 100644 --- a/docs/src/content/docs/getting-started/Deployment-guide.md +++ b/docs/src/content/docs/getting-started/Deployment-guide.md @@ -217,7 +217,7 @@ At public US East (N. Virginia) first-tier list rates verified in August 2026, t | Service | Used By | Scales to Zero | |---------|---------|---------------| -| Bedrock (Claude Sonnet 4.6, Opus 4.8, Opus 5, Haiku 4.5) | Agent reasoning, cross-region inference profiles | Yes | +| Bedrock (Claude Opus 5.5, Haiku 5.5, plus Sonnet 4.6, Opus 4.8, Opus 5, Haiku 4.5 for pinned repos) | Agent reasoning, cross-region inference profiles | Yes | | Bedrock Guardrails | Prompt injection detection on task input | Yes | | Bedrock AgentCore Memory | Semantic + episodic extraction strategies | Yes | | AWS Agent Registry (preview, default-on) | Versioned agent asset catalog and governance | N/A (managed preview service) |