From 3e9cd0a8baa4c7cbad6f8ca3494b2e95f6029b2a Mon Sep 17 00:00:00 2001 From: Bharathi Srinivasan Date: Mon, 15 Jun 2026 18:10:49 -0700 Subject: [PATCH 01/17] Add failure insights sample (insights.py) and update README - Add insights.py: runs FailureAnalysis, UserIntent, and ExecutionSummary batch insight jobs on the HR Assistant agent. Supports --generate-traces to send curated failure-mode sessions, --online to create a recurring daily OnlineEvaluationConfig, and --insight to select individual insight types. Uses both aws/spans and the runtime log group as data sources. - Update README with a full Failure Insights section covering all three insight types, data source requirements, CLI examples, and how to chain insights into a system prompt recommendation. --- .../03-optimize/.gitignore | 7 +- .../03-optimize/README.md | 311 ++++++++++-- .../03-optimize/insights.py | 475 ++++++++++++++++++ .../03-optimize/requirements.txt | 10 + 4 files changed, 752 insertions(+), 51 deletions(-) create mode 100644 01-features/06-observe-evaluate-optimize-your-agent/03-optimize/insights.py diff --git a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/.gitignore b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/.gitignore index 3eb0d5e9d..a50df3d23 100644 --- a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/.gitignore +++ b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/.gitignore @@ -21,4 +21,9 @@ Thumbs.db # Temporary files *.tmp -*.temp \ No newline at end of file +*.temp + +# Generated state and output files (contain account-specific ARNs) +agent_state_*.json +optimize_state_*.json +insights_result.json \ No newline at end of file diff --git a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md index a86a98f57..da5a1135c 100644 --- a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md +++ b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md @@ -1,11 +1,12 @@ # AgentCore Optimization -End-to-end optimization workflow for an HR Assistant agent on Amazon Bedrock AgentCore runtime. Demonstrates how to measure baseline performance, generate AI-driven improvements, and validate them through A/B testing — without redeploying code. +End-to-end optimization workflow for an HR Assistant agent on Amazon Bedrock AgentCore runtime. Covers baseline evaluation, AI-generated prompt improvements, and A/B testing via configuration bundles and target-based routing. ### What You Will Learn | Stage | Concepts Covered | |-------|-----------------| +| **Failure Insights** | FailureAnalysis, UserIntent, ExecutionSummary: root cause clustering of agent failures | | **Baseline evaluation** | Batch evaluations on agent sessions | | **Recommendations** | System prompt optimization, tool description optimization from production traces | | **Configuration Bundles** | Versioned config containers, runtime config hooks, baggage-based injection | @@ -21,6 +22,8 @@ End-to-end optimization workflow for an HR Assistant agent on Amazon Bedrock Age | AgentCore runtime | `bedrock-agentcore-control` | Hosts the HR Assistant container | | Configuration Bundle | `bedrock-agentcore-control` | Versioned system prompt and tool description storage | | Batch evaluation | `bedrock-agentcore` (DP) | Off-line scoring of historical sessions | +| Batch insights | `bedrock-agentcore` (DP) | Root-cause failure clustering, user intent analysis, execution summaries | +| Online insights config | `bedrock-agentcore-control` (CP) | Recurring daily insights over live agent traffic | | Recommendation | `bedrock-agentcore` (DP) | AI-generated prompt/tool improvements | | gateway + Targets | `bedrock-agentcore-control` | Traffic routing for A/B tests | | Online Eval Config | `bedrock-agentcore-control` | Continuous automatic session scoring | @@ -40,7 +43,7 @@ End-to-end optimization workflow for an HR Assistant agent on Amazon Bedrock Age - Python 3.10+ - Access to Amazon Bedrock models (Nova Lite) in your region -> **Timing note:** CloudWatch ingestion takes 2–3 minutes after invoking the agent. Batch evaluations take 1–5 minutes. Recommendations take 2–5 minutes. Budget ~45 minutes for the full workflow. +> **Timing note:** CloudWatch ingestion takes 2-3 minutes after invoking the agent. Batch evaluations take 1-5 minutes. Recommendations take 2-5 minutes. Budget ~45 minutes for the full workflow. ## Quick Start @@ -53,6 +56,10 @@ python deploy.py --name HRAssistV1 # Invoke the deployed agent python invoke.py --name HRAssistV1 +# [Optional] Run failure insights: generate traces then analyze with all 3 insight types +# Requires preview SDK -- see "Failure Insights" section below for install instructions +python insights.py --name HRAssistV1 --generate-traces + # Run the full optimization workflow python optimize.py --name HRAssistV1 @@ -71,6 +78,93 @@ npm install -g @aws/agentcore agentcore --version # should print 0.13.0 or later ``` +### Step 0: Failure Insights (Optional -- Pre-Optimization Diagnostics) + +Run insights before the optimization loop to see which sessions are failing and why. The results let you focus prompt and tool description changes on real problems. + +```bash +# Install the preview SDK that adds insights API support (--force-reinstall upgrades botocore/boto3) +pip install /path/to/Boto3CliV1Artifacts-dp/botocore-1.43.30-py3-none-any.whl \ + /path/to/Boto3CliV1Artifacts-dp/boto3-1.43.30-py3-none-any.whl \ + --force-reinstall + +# Make sure the agent is deployed first (deploy.py --name HRInsights849 --region us-west-2) + +# Generate failure-mode traces and run all three insight types: +python insights.py --name HRInsights849 --generate-traces --region us-west-2 + +# Run insights on existing traces from the last 7 days: +python insights.py --name HRInsights849 --lookback-days 7 + +# Run only FailureAnalysis (faster): +python insights.py --name HRInsights849 --insight Builtin.Insight.FailureAnalysis + +# Run insights and create a recurring daily OnlineInsightsConfig: +python insights.py --name HRInsights849 --generate-traces --online +``` + +**Using agentcore-cli** (requires a LENS-authorized account; tested with v0.19.0): + +```bash +# Install the preview CLI: +npm install -g aws-agentcore-0.19.0-20260612171356.tgz # or later tarball + +# Prerequisites: +# 1. Deploy the agent and create a CLI project first (deploy.py creates the runtime): +python deploy.py --name HRInsightsCLI --region us-west-2 + +# 2. Create a CLI project and register the deployed runtime: +mkdir hr-insights-cli && cd hr-insights-cli +agentcore create --name HRInsightsCLI --defaults --no-agent +cd HRInsightsCLI +cp -r ../utils/hr_assistant_agent.py agentcore/../app/HRInsightsCLI/main.py # optional + +# [One-time] Add a recurring daily online-insights config (written to agentcore.json, +# deployed via CDK): +agentcore add online-insights \ + --name HROnlineInsights849 \ + --runtime HRInsightsCLI \ + --insights Builtin.Insight.FailureAnalysis \ + --insights Builtin.Insight.UserIntent \ + --insights Builtin.Insight.ExecutionSummary \ + --sampling-rate 100 \ + --clustering-frequency DAILY \ + --enable-on-create \ + --json +# Deploy to create the CloudFormation-managed online insights config: +# agentcore deploy -y --json + +# Run a one-shot insights job over the last 7 days of traces: +agentcore run insights \ + --runtime HRInsightsCLI \ + --insights Builtin.Insight.FailureAnalysis \ + --insights Builtin.Insight.UserIntent \ + --insights Builtin.Insight.ExecutionSummary \ + --lookback-days 7 \ + --wait \ + --json + +# List all insights jobs (history): +agentcore insights history --json + +# View results for a specific job: +agentcore insights results --id --json + +# Chain insights into a system prompt recommendation: +agentcore run recommendation \ + --from-insights \ + --type system-prompt \ + --evaluator Builtin.GoalSuccessRate \ + --inline "You are a helpful HR Assistant for Acme Corp..." \ + --json +``` + +> **Notes:** +> - `insights` and `evaluators` are mutually exclusive in a single batch job. Do not pass `--evaluator` to `agentcore run insights`. +> - Schema names must match `^[a-zA-Z][a-zA-Z0-9_]{0,47}$` (no hyphens). +> - LENS access must be enabled for your account. If you see `Account X is not authorized to use feature LENS`, contact your account admin. +> - `agentcore view insights` is not available in v0.19.0 -- use `agentcore insights history` and `agentcore insights results` instead. + ### Step 1: Deploy the HR Assistant ```bash @@ -141,7 +235,7 @@ agentcore cb versions --bundle HRControl --json agentcore cb versions --bundle HRTreatment --json ``` -### Step 5a: A/B Test — Config-Bundle Routing +### Step 5a: A/B Test -- Config-Bundle Routing ```bash # Create gateway @@ -181,13 +275,13 @@ agentcore deploy agentcore ab-test HRBundleABTest ``` -### Step 5b: A/B Test — Target-Based Routing (Phased Rollout) +### Step 5b: A/B Test -- Target-Based Routing (Phased Rollout) ```bash # Deploy v2 of the agent (with new code changes) agentcore create --name HRAssistantV2 --framework Strands --model-provider Bedrock --defaults cp utils/hr_assistant_agent.py app/HRAssistantV2/main.py -# (Apply v2 code changes to main.py — e.g. add escalate_to_hr_manager tool) +# (Apply v2 code changes to main.py -- e.g. add escalate_to_hr_manager tool) cd HRAssistantV2 && agentcore deploy # Add v2 gateway target @@ -241,6 +335,121 @@ agentcore remove agent --name HRAssistantV2 agentcore deploy -y ``` +## Failure Insights + +AgentCore Insights runs over historical agent traces and clusters sessions by failure type, user intent, and execution pattern. Run it before or alongside optimization to get specifics on what is going wrong, not just a score. + +### Three Insight Types + +| Insight | What It Produces | +|---------|-----------------| +| **FailureAnalysis** | Failure sessions clustered by category, subcategory, and root cause. Each root cause includes a fix recommendation and a list of affected session IDs. | +| **UserIntent** | Sessions grouped by what the user was trying to do (e.g., "PTO balance inquiry", "policy lookup"). Useful for finding gaps between what users ask and what the agent handles. | +| **ExecutionSummary** | Summary of how the agent executed across sessions: tool usage patterns, multi-turn flows, and common paths. Requires at least 3 sessions. | + +### Data Source + +Insights pull from the `aws/spans` CloudWatch log group, which receives OTel span documents from AgentCore Runtime via the `opentelemetry-instrument` entry point. Each session's tool calls, model calls, and errors are captured as spans and correlated by session ID. + +The runtime log group (`/aws/bedrock-agentcore/runtimes/...`) must also be included. Without it, the insights engine cannot resolve the log events that spans reference, which causes incomplete results. + +> `insights` and `evaluators` are mutually exclusive in the batch evaluation API. Use a separate batch job for each. + +### Running insights.py + +```bash +# Prerequisites: +# 1. Deploy the agent (creates agent_state_{name}.json): +python deploy.py --name HRInsights849 --region us-west-2 + +# 2. Install the preview SDK with insights API support: +pip install /path/to/Boto3CliV1Artifacts-dp/botocore-1.43.30-py3-none-any.whl \ + /path/to/Boto3CliV1Artifacts-dp/boto3-1.43.30-py3-none-any.whl \ + --force-reinstall + +# 3a. Generate failure traces then run all insight types: +python insights.py --name HRInsights849 --generate-traces + +# 3b. Run insights on existing traces from the last N days: +python insights.py --name HRInsights849 --lookback-days 14 + +# 3c. Run specific insights only: +python insights.py --name HRInsights849 --insight Builtin.Insight.FailureAnalysis + +# 3d. Run insights and also create a recurring daily config: +python insights.py --name HRInsights849 --generate-traces --online +``` + +The `--generate-traces` flag sends sessions across several failure categories: +- **Unknown employee IDs** (`EMP-999`, `EMP-003`) -> tool returns "not found" errors +- **Unsupported policy topics** (`sabbatical`, `floating_holiday`, `relocation`) -> tool returns error +- **Unknown benefit types** (`gym`, `commuter`, `wellness`) -> tool returns error +- **Unavailable pay periods** (`2019-12`, `2020-03`) -> tool returns "not found" error +- **Invalid date formats** in PTO requests -> agent confusion / multi-turn failure +- **Normal successful sessions** -> required for UserIntent and ExecutionSummary clustering + +### Reading the FailureAnalysis Output + +``` +FailureAnalysis (2 top-level categories) + + Category: Tool Execution Failures (sessions affected: 8) + Subcategory: Employee Lookup Failures + Root cause: Unknown Employee ID Errors (4 sessions) + Recommendation: Add input validation and a list of valid employee ID formats + to the system prompt. Return a helpful error message with + instructions to verify the employee ID. + Session IDs: ['3fa85f64-...', 'c3d4e5f6-...', ...] + + Subcategory: Data Not Found + Root cause: Pay Stub Period Unavailable (2 sessions) + Recommendation: Document available pay periods in the tool description + and add graceful handling when a period is not found. + + Category: Out-of-Scope Requests (sessions affected: 7) + Subcategory: Unsupported Policy Topics + Root cause: Missing Policy Coverage (4 sessions) + Recommendation: Expand the policy knowledge base or add a clear out-of-scope + message when a policy topic is not available. +``` + +### Online Insights Config + +The `--online` flag creates an `OnlineEvaluationConfig` of type `INSIGHTS` that runs on a daily schedule. View results with `get_online_evaluation_config` or the CLI: + +```bash +agentcore insights history --json +agentcore insights results --id --json +``` + +### Chaining Insights into Recommendations + +Pass the insights job ID to a recommendation to generate a system prompt that targets the identified failures: + +```bash +# CLI: +agentcore run recommendation \ + --from-insights \ + --type system-prompt \ + --inline "You are a helpful HR Assistant for Acme Corp..." \ + --json + +# Python (DP client): +dp.start_recommendation( + name="HRSpRecFromInsights", + type="SYSTEM_PROMPT_RECOMMENDATION", + recommendationConfig={ + "systemPromptRecommendationConfig": { + "systemPrompt": {"text": CURRENT_SYSTEM_PROMPT}, + "agentTraces": {"batchEvaluation": {"batchEvaluationArn": INSIGHTS_EVAL_ARN}}, + "evaluationConfig": { + "evaluators": [{"evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.GoalSuccessRate"}] + }, + } + }, +) +``` + ## How It Works ### Step 1: Deploy HR Assistant v1 (`deploy.py`) @@ -249,13 +458,13 @@ Creates an IAM execution role, packages `utils/hr_assistant_agent.py` with ARM64 State is saved to `agent_state_{name}.json` for use by subsequent scripts. -The `--version v2` flag builds an enhanced version that adds an `escalate_to_hr_manager` tool and a more detailed system prompt baked into the code — used in the target-based A/B test. +The `--version v2` flag builds an enhanced version that adds an `escalate_to_hr_manager` tool and a more detailed system prompt baked into the code. This is the version used in the target-based A/B test. ### Step 2: Configuration Bundles (`optimize.py`) -A **Configuration Bundle** is a versioned container for agent configuration keyed by runtime ARN. The agent reads the bundle at invocation time via `BedrockAgentCoreContext.get_config_bundle()` — changing the system prompt or tool descriptions requires no redeployment. +A **Configuration Bundle** is a versioned container for agent configuration keyed by runtime ARN. The agent reads the bundle at invocation time via `BedrockAgentCoreContext.get_config_bundle()`. Changing the system prompt or tool descriptions does not require redeployment. -Each bundle call returns a `bundleId` (stable) and a `versionId` (immutable snapshot). Pass `parentVersionIds` on updates to record lineage and prevent accidental overwrites. Use `commitMessage` on every create and update to document why the config changed — just like a Git commit. +Each bundle call returns a `bundleId` (stable) and a `versionId` (immutable snapshot). Pass `parentVersionIds` on updates to track lineage and prevent accidental overwrites. Use `commitMessage` on every create and update to document the change. #### Bundle lifecycle @@ -267,8 +476,8 @@ Each bundle call returns a `bundleId` (stable) and a `versionId` (immutable snap | Compare | `get_configuration_bundle_version` | Diff two versions; useful for audits and rollback decisions | **What we create:** -- **Control (C)** — original system prompt + original tool descriptions -- **Treatment (T1)** — recommended system prompt + recommended tool descriptions +- **Control (C)** -- original system prompt + original tool descriptions +- **Treatment (T1)** -- recommended system prompt + recommended tool descriptions ### Step 3: Batch evaluation @@ -286,51 +495,51 @@ AgentCore analyzes production traces and generates: - **System Prompt Recommendation**: rewrites your system prompt to improve a target metric - **Tool Description Recommendation**: improves tool descriptions so the agent selects tools more reliably -Recommendations are returned as text and can be applied immediately via configuration bundles — no code changes needed. +Recommendations are returned as text and can be applied immediately via configuration bundles. No code changes needed. ### Step 5: Config-Bundle A/B Test -Use configuration bundle routing when the change you are testing is purely configuration — a different system prompt, a different model ID, or different tool descriptions. Both variants run on the **same runtime** with different configuration bundle versions. +Use configuration bundle routing when the change is purely configuration: a different system prompt, model ID, or tool descriptions. Both variants run on the same runtime with different bundle versions. **Architecture:** ``` User Request - │ - ▼ -[gateway] ──50%──▶ [Control Bundle C] ──┐ - │ ├──▶ [HR runtime v1] ──▶ CloudWatch - └──50%──▶ [Treatment Bundle T1] ──────┘ │ - [Online Eval Config] ◀┘ - │ - [A/B Test Results] + | + v +[gateway] --50%--> [Control Bundle C] --| + | |--> [HR runtime v1] --> CloudWatch + +--50%--> [Treatment Bundle T1] -----| | + [Online Eval Config] <-+ + | + [A/B Test Results] ``` The gateway injects the correct bundle reference into each request via W3C baggage headers. The agent reads it at runtime via `BedrockAgentCoreContext.get_config_bundle()`. -**Session stickiness:** Once a session ID is assigned to a variant, all subsequent requests with that same session ID route to the same variant. This ensures a consistent experience within a session while distributing new sessions across variants according to your traffic weights. +**Session stickiness:** Once a session ID is assigned to a variant, all requests with that session ID go to the same variant. New sessions are distributed across variants by weight. -An **online evaluation config** automatically scores every session as it closes, without requiring explicit API calls per session. It monitors the agent's CloudWatch log group, detects when a session closes (after `sessionTimeoutMinutes` of inactivity), and runs the configured evaluators. +An **online evaluation config** scores sessions automatically as they close. It watches the agent's CloudWatch log group, detects session close (after `sessionTimeoutMinutes` of inactivity), and runs the configured evaluators. -**Results timeline:** Budget 10–15 minutes from your last request: session timeout (2 min) → evaluation (2–3 min) → aggregation (~5 min cycle). Poll until `analysisTimestamp` is populated. +**Results timeline:** Budget 10-15 minutes from your last request: session timeout (2 min) -> evaluation (2-3 min) -> aggregation (~5 min cycle). Poll until `analysisTimestamp` is populated. ### Step 6: Target-Based A/B Test -When code changes are involved (new tools, framework upgrade, or entirely different agent implementation), use target-based routing instead. It sends traffic to two **separate runtimes** — each registered as a different gateway target. Each variant has its own online evaluation config since they have different log groups. +When the change involves code (new tools, framework upgrade, different agent implementation), use target-based routing. Traffic splits between two separate runtimes, each registered as a gateway target. Each variant needs its own online evaluation config because they have different log groups. **Architecture:** ``` -User ──► [gateway] ──90%──► [Target HRAgentV1 → HR runtime v1 (stable)] ──► CloudWatch - │ │ - └──10%──► [Target HRAgentV2 → HR runtime v2 (canary)] ──► CloudWatch - │ - [Online Eval v1 + Online Eval v2] - │ +User --> [gateway] --90%--> [Target HRAgentV1 -> HR runtime v1 (stable)] --> CloudWatch + | | + +--10%--> [Target HRAgentV2 -> HR runtime v2 (canary)] --> CloudWatch + | + [Online Eval v1 + Online Eval v2] + | [A/B Test Results] ``` -**Phased rollout:** 10% canary → validate no regressions → 50% ramp → gather statistical significance → 100% cutover → decommission old runtime. +**Phased rollout:** 10% canary -> validate no regressions -> 50% ramp -> gather statistical significance -> 100% cutover -> decommission old runtime. -**`gatewayFilter.targetPaths`** scopes the A/B test routing rule to requests matching the control target's path, ensuring only traffic intended for this test is intercepted. +**`gatewayFilter.targetPaths`** restricts the A/B routing rule to requests matching the control target's path, so only traffic for this test is affected. ## Files @@ -338,7 +547,8 @@ User ──► [gateway] ──90%──► [Target HRAgentV1 → HR runtime v1 |:-----|:------------| | `deploy.py` | Deploys HR Assistant v1 or v2 to AgentCore runtime | | `invoke.py` | Invokes the deployed agent with sample HR queries | -| `optimize.py` | End-to-end optimization workflow (Steps 2–8) | +| `insights.py` | Runs FailureAnalysis, UserIntent, ExecutionSummary on agent traces | +| `optimize.py` | End-to-end optimization workflow (Steps 2-8) | | `cleanup.py` | Deletes all AWS resources created by this tutorial | | `requirements.txt` | Python dependencies | | `utils/hr_assistant_agent.py` | HR Assistant agent with Configuration Bundle hook | @@ -359,27 +569,27 @@ python invoke.py --name HRAssistV1 --prompt "How many vacation days do I get aft | | Config-Bundle Routing | Target-Based Routing | |---|---|---| | **What changes** | System prompt or config (no code change) | Agent code, tools, model, or framework | -| **Redeployment needed** | No — config applied at request time | Yes — new runtime required | +| **Redeployment needed** | No -- config applied at request time | Yes -- new runtime required | | **Runtimes needed** | One shared runtime | Two separate runtimes | | **Eval configs needed** | One shared online eval config | One per variant (different log groups) | | **Best for** | Prompt tuning, config experiments | Code releases, version upgrades | | **Traffic split** | Typically 50/50 | Typically 90/10 canary | -| **Rollback** | Instant — update bundle version | runtime still running; shift weights back | -| **Risk** | Very low | Higher — binary change | +| **Rollback** | Instant -- update bundle version | runtime still running; shift weights back | +| **Risk** | Very low | Higher -- binary change | ### Phased Rollout (Target-Based) ``` -10% canary → validate no regressions (errors, latency, quality drop) - ↓ -50% ramp → gather statistical significance - ↓ -100% promote → complete cutover; decommission old runtime +10% canary -> validate no regressions (errors, latency, quality drop) + | +50% ramp -> gather statistical significance + | +100% promote -> complete cutover; decommission old runtime ``` ### Configuration Bundle Hook -The agent reads its system prompt **and tool descriptions** from the bundle on every model call — enabling live prompt updates and A/B testing without redeployment: +The agent reads its system prompt and tool descriptions from the bundle on every model call. This supports live prompt updates and A/B testing without redeployment: ```python from bedrock_agentcore.runtime import BedrockAgentCoreContext @@ -402,24 +612,25 @@ def _config_bundle_hook(event: BeforeModelCallEvent) -> None: agent.hooks.add_callback(BeforeModelCallEvent, _config_bundle_hook) ``` -This pattern allows testing both prompt changes and tool description improvements in the same A/B experiment. +This supports testing both prompt changes and tool description improvements in the same A/B experiment. ## Next Steps -- **Add custom evaluators**: Lambda-based code evaluators for deterministic policy compliance checks +- **Add custom evaluators**: Lambda-based evaluators for deterministic policy checks - **Automate the loop**: Run batch evaluations in CI/CD to catch regressions before deployment -- **Use recommendations iteratively**: Re-run recommendations after each traffic batch to compound improvements -- **Multi-metric optimization**: Run separate recommendation jobs targeting different evaluators, then pick the best balance -- **Increase canary exposure**: Use `update_ab_test` to gradually raise treatment weight (10% → 25% → 50% → 100%) -- **Continuous monitoring**: Keep online eval configs enabled in production for zero-effort quality monitoring +- **Use recommendations iteratively**: Re-run after each traffic batch to compound improvements +- **Multi-metric optimization**: Run separate recommendation jobs for different evaluators, then pick the best result +- **Increase canary exposure**: Use `update_ab_test` to gradually raise treatment weight (10% -> 25% -> 50% -> 100%) +- **Continuous monitoring**: Leave online eval configs enabled in production ## Workflow Summary | Step | What you do | Key API | |------|-------------|---------| +| 0 | Run failure insights to understand root causes (optional pre-optimization) | `start_batch_evaluation` (insights), `get_batch_evaluation` | | 1 | Deploy HR Assistant to AgentCore runtime | `create_agent_runtime` | | 2 | Create baseline Configuration Bundle and send traffic | `create_configuration_bundle`, `invoke_agent_runtime` | -| 3 | Measure baseline performance with batch evaluation | `start_batch_evaluation` / `get_batch_evaluation` | +| 3 | Measure baseline performance with batch evaluation | `start_batch_evaluation` (evaluators), `get_batch_evaluation` | | 4a | Generate improved system prompt from production traces | `start_recommendation` (SYSTEM_PROMPT) | | 4b | Generate improved tool descriptions from production traces | `start_recommendation` (TOOL_DESCRIPTION) | | 5 | Package control and treatment configs into bundles | `create_configuration_bundle` / `update_configuration_bundle` | @@ -433,7 +644,7 @@ This pattern allows testing both prompt changes and tool description improvement | A/B Test Result | Action | |-----------------|--------| -| **Config-bundle T1 wins** | Promote treatment bundle (`update_configuration_bundle`) as new default — no code deployment | +| **Config-bundle T1 wins** | Promote treatment bundle (`update_configuration_bundle`) as new default -- no code deployment | | **Target-based v2 wins** | Ramp to 50%, then 100% cutover; delete v1 runtime | | **Regression detected** | Stop A/B test immediately (`update_ab_test(executionStatus="STOPPED")`), investigate | | **Inconclusive** | Continue sending traffic to accumulate sample size (p < 0.05 threshold) | diff --git a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/insights.py b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/insights.py new file mode 100644 index 000000000..e408c93fc --- /dev/null +++ b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/insights.py @@ -0,0 +1,475 @@ +""" +Run AgentCore Insights on the HR Assistant agent. + +Three insight types: + - Builtin.Insight.FailureAnalysis -- clusters failure sessions by root cause category + - Builtin.Insight.UserIntent -- groups sessions by what the user was trying to do + - Builtin.Insight.ExecutionSummary -- summarizes agent execution patterns across sessions + +With --generate-traces, the script first sends a set of failure-mode sessions to populate +CloudWatch, so FailureAnalysis has real patterns to work with: + - Unknown employee IDs that the agent cannot look up + - HR policy topics not in the system (sabbatical, floating holiday, relocation) + - Unknown benefit types (gym membership, commuter benefits, wellness) + - Pay stubs for unavailable periods or unknown employees + - Ambiguous prompts that cause multi-step confusion + +Usage: + # Generate failure traces then run all three insights: + python insights.py --name HRInsights849 --generate-traces [--region us-west-2] + + # Run insights on existing traces from the last N days: + python insights.py --name HRInsights849 [--lookback-days 7] + + # Also create an OnlineEvaluationConfig for recurring daily insights: + python insights.py --name HRInsights849 --generate-traces --online + + # Run FailureAnalysis only (skips UserIntent and ExecutionSummary): + python insights.py --name HRInsights849 --insight Builtin.Insight.FailureAnalysis + +Prerequisites: + 1. Deploy the HR Assistant agent: + python deploy.py --name HRInsights849 --region us-west-2 + + 2. Install the preview SDK (adds insights API support): + pip install \\ + /path/to/Boto3CliV1Artifacts-dp/botocore-1.43.30-py3-none-any.whl \\ + /path/to/Boto3CliV1Artifacts-dp/boto3-1.43.30-py3-none-any.whl \\ + --force-reinstall + + Typical path: ../../../../../../Evaluations/Evo/Boto3CliV1Artifacts-dp/ +""" + +import argparse +import json +import os +import time +import uuid +from datetime import datetime, timedelta, timezone +from pathlib import Path + +import boto3 + +# ── Parse arguments ─────────────────────────────────────────────────────── + +parser = argparse.ArgumentParser(description="AgentCore Insights (FailureAnalysis, UserIntent, ExecutionSummary)") +parser.add_argument("--name", required=True, help="Runtime name (matches agent_state_{name}.json)") +parser.add_argument("--region", default=os.environ.get("AWS_DEFAULT_REGION", "us-west-2")) +parser.add_argument( + "--generate-traces", + action="store_true", + help="Send failure-mode invocations to generate diverse traces before running insights", +) +parser.add_argument( + "--online", + action="store_true", + help="Also create an OnlineEvaluationConfig for recurring daily insights", +) +parser.add_argument( + "--lookback-days", + type=int, + default=7, + help="Number of days of traces to analyze (default: 7)", +) +parser.add_argument( + "--insight", + action="append", + default=None, + dest="insights", + metavar="INSIGHT_ID", + help=( + "Specific insight IDs to run. May be repeated. " + "Default: all three (FailureAnalysis, UserIntent, ExecutionSummary). " + "Example: --insight Builtin.Insight.FailureAnalysis" + ), +) +args = parser.parse_args() + +REGION = args.region +LOOKBACK_DAYS = args.lookback_days + +# ── Load agent state ─────────────────────────────────────────────────────── + +STATE_FILE = Path(f"agent_state_{args.name}.json") +if not STATE_FILE.exists(): + raise FileNotFoundError( + f"{STATE_FILE} not found. Run 'python deploy.py --name {args.name} --region {REGION}' first." + ) + +state = json.loads(STATE_FILE.read_text()) +AGENT_ARN = state["runtime_arn"] +LOG_GROUP = state["log_group"] +SERVICE_NAME = state["service_name"] +ROLE_ARN = state["role_arn"] +ACCOUNT_ID = state["account_id"] +SPANS_LOG_GROUP = "aws/spans" + +# Both log groups are required for reliable session coverage. +# aws/spans holds OTel span documents (used by all insight types). +# The runtime log group holds the log events that spans reference — without it, +# the evaluator engine sees incomplete spans (LogEventMissingException) even +# though the agent executed successfully. +LOG_GROUP_NAMES = [SPANS_LOG_GROUP, LOG_GROUP] + +# ── AWS clients ─────────────────────────────────────────────────────────── + +dp = boto3.client("bedrock-agentcore", region_name=REGION) +ctrl = boto3.client("bedrock-agentcore-control", region_name=REGION) + +print(f"Account : {ACCOUNT_ID}") +print(f"Region : {REGION}") +print(f"Runtime : {args.name}") +print(f"Agent ARN : {AGENT_ARN}") +print(f"Service Name: {SERVICE_NAME}") +print(f"Log Group : {LOG_GROUP}") + +# ── Insight selection ───────────────────────────────────────────────────── + +ALL_INSIGHTS = [ + "Builtin.Insight.FailureAnalysis", + "Builtin.Insight.UserIntent", + "Builtin.Insight.ExecutionSummary", +] + +SELECTED_INSIGHTS = args.insights if args.insights else ALL_INSIGHTS +print(f"\nInsights to run: {SELECTED_INSIGHTS}") + +# ── Step 1: Generate failure-mode traces (optional) ─────────────────────── +# +# These prompts exercise different failure paths in the HR Assistant so that +# FailureAnalysis has real patterns to cluster. Each category below maps to +# one or more tool errors or agent reasoning failures. +# +# Category: Tool Execution Failures +# - get_pto_balance(employee_id="EMP-999") -> "Employee EMP-999 not found" +# - get_pay_stub(employee_id="EMP-003", ...) -> "Pay stub not found" +# +# Category: Invalid Input / Bad Formatting +# - PTO request with non-date strings -> agent loops or declines +# +# Category: Out-of-Scope Requests +# - Policy topics not in the system: sabbatical, floating_holiday, relocation +# - Benefit types not in the system: gym, commuter, wellness +# +# Category: Ambiguous Requests +# - Vague prompts where the agent guesses incorrectly or asks for clarification + +FAILURE_PROMPTS = [ + # --- Tool failure: unknown employee IDs --- + ("EMP-999", "What is my current PTO balance?"), + ("EMP-999", "Please submit a PTO request for me from 2026-07-01 to 2026-07-05."), + ("EMP-003", "Can you pull up my January 2026 pay stub?"), + ("EMP-003", "How many PTO days do I have remaining?"), + # --- Tool failure: unavailable pay periods --- + ("EMP-001", "Get my pay stub for December 2019."), + ("EMP-001", "Show me my pay stub for March 2020."), + ("EMP-042", "I need my pay stub for period 2022-06."), + # --- Policy topics not in the system --- + ("EMP-001", "What is the sabbatical leave policy?"), + ("EMP-002", "Do we have a floating holiday policy?"), + ("EMP-042", "What is the relocation assistance policy?"), + ("EMP-001", "Explain the bereavement leave policy."), + # --- Benefit types not in the system --- + ("EMP-001", "What gym membership benefits does the company offer?"), + ("EMP-002", "Tell me about our commuter benefits — transit and parking."), + ("EMP-042", "What wellness program benefits are available?"), + ("EMP-001", "Do we have a childcare or dependent care FSA benefit?"), + # --- Invalid input formats --- + ("EMP-001", "Submit PTO for me starting yesterday through the end of next month."), + ("EMP-002", "Request time off from ASAP to whenever — for burnout recovery."), + # --- Multi-step failures: agent finds no data, user pushes further --- + ("EMP-999", "Check my PTO balance first, then submit a request for next week."), + ("EMP-001", "Can you give me the 2018 annual pay summary? I need it for a loan."), + # --- Successful sessions for user intent diversity --- + ("EMP-001", "What is my current PTO balance?"), + ("EMP-042", "Tell me about the 401k plan — how much does the company match?"), + ("EMP-001", "What are my health insurance options?"), + ("EMP-002", "What is the parental leave policy for primary caregivers?"), + ("EMP-001", "What is the remote work policy?"), + ("EMP-042", "Can you pull up my January 2026 pay stub?"), + ("EMP-001", "Submit a PTO request from 2026-08-11 to 2026-08-15 for a vacation."), + ("EMP-002", "How does the dental insurance work for major procedures?"), +] + +if args.generate_traces: + print("\n" + "=" * 60) + print("STEP 1: Generate Failure-Mode Traces") + print("=" * 60) + print(f"Sending {len(FAILURE_PROMPTS)} sessions (failure + success mix)...\n") + + session_ids = [] + success_count = 0 + error_count = 0 + + for i, (emp_id, prompt) in enumerate(FAILURE_PROMPTS): + session_id = str(uuid.uuid4()) + session_ids.append(session_id) + full_prompt = f"Employee ID: {emp_id}. {prompt}" if emp_id != "custom" else prompt + + try: + resp = dp.invoke_agent_runtime( + agentRuntimeArn=AGENT_ARN, + runtimeSessionId=session_id, + payload=json.dumps({"prompt": full_prompt}).encode(), + ) + resp["response"].read() + success_count += 1 + indicator = "OK " + except Exception as e: + error_count += 1 + indicator = "ERR" + + print(f" [{i + 1:2d}] {indicator} {session_id[:8]}... [{emp_id}] {prompt[:60]}") + + print(f"\nSent {success_count} OK, {error_count} errors (invoke errors; tool errors are expected)") + print("Waiting 3 minutes for traces to propagate to CloudWatch...") + + for remaining in range(180, 0, -30): + print(f" {remaining}s remaining...") + time.sleep(30) + + print("CloudWatch ingestion complete.") +else: + print("\n(Skipping trace generation — use --generate-traces to send failure-mode sessions first)") + +# ── Step 2: Run Batch Insights ───────────────────────────────────────────── +# +# Notes on dataSourceConfig for insights: +# - "aws/spans" holds OTel span documents and is required for session coverage +# - The runtime log group (/aws/bedrock-agentcore/runtimes/...) must also be +# included; without it the engine cannot resolve log events referenced by spans +# - insights and evaluators are mutually exclusive -- do not mix them + +print("\n" + "=" * 60) +print("STEP 2: Start Batch Insights") +print("=" * 60) + +now = datetime.now(timezone.utc) +start_time = now - timedelta(days=LOOKBACK_DAYS) + +EVAL_NAME = f"HRInsights{uuid.uuid4().hex[:8]}" + +print(f"Batch eval name : {EVAL_NAME}") +print(f"Time range : {start_time.strftime('%Y-%m-%dT%H:%M:%SZ')} to {now.strftime('%Y-%m-%dT%H:%M:%SZ')}") +print(f"Service name : {SERVICE_NAME}") +print(f"Log groups : {LOG_GROUP_NAMES}") + +insights_list = [{"insightId": iid} for iid in SELECTED_INSIGHTS] + +eval_resp = dp.start_batch_evaluation( + batchEvaluationName=EVAL_NAME, + insights=insights_list, + dataSourceConfig={ + "cloudWatchLogs": { + "serviceNames": [SERVICE_NAME], + "logGroupNames": LOG_GROUP_NAMES, + "filterConfig": { + "timeRange": { + "startTime": start_time.strftime("%Y-%m-%dT%H:%M:%SZ"), + "endTime": now.strftime("%Y-%m-%dT%H:%M:%SZ"), + } + }, + } + }, + clientToken=str(uuid.uuid4()), +) + +EVAL_ID = eval_resp["batchEvaluationId"] +EVAL_ARN = eval_resp.get("batchEvaluationArn", "") +print(f"\nStarted : {EVAL_ID}") +print(f"ARN : {EVAL_ARN}") + +# ── Step 3: Poll for completion ──────────────────────────────────────────── + +print("\n" + "=" * 60) +print("STEP 3: Poll for Completion") +print("=" * 60) + +TERMINAL = {"COMPLETED", "FAILED", "STOPPED", "COMPLETED_WITH_ERRORS"} +poll = 0 +result = {} + +while True: + poll += 1 + result = dp.get_batch_evaluation(batchEvaluationId=EVAL_ID) + status = result["status"] + processed = result.get("statistics", {}).get("processedSessionCount", "?") + failed = result.get("statistics", {}).get("failedSessionCount", "?") + print(f" Poll {poll:3d} [{time.strftime('%H:%M:%S')}] status={status} " + f"processed={processed} failed={failed}") + + if status in TERMINAL: + break + + time.sleep(30) + +print(f"\nFinal status: {status}") + +if result.get("errorDetails"): + print(f"Error details: {result['errorDetails']}") + +# ── Step 4: Print Insights Results ──────────────────────────────────────── + +print("\n" + "=" * 60) +print("STEP 4: Insights Results") +print("=" * 60) + +# ── 4a: FailureAnalysis ─────────────────────────────────────────────────── + +fa = result.get("failureAnalysisResult") or result.get("failureAnalysisOutput") +if fa: + failures = fa.get("failures", []) + print(f"\n--- FailureAnalysis ({len(failures)} top-level categories) ---") + + if not failures: + print(" No failure categories found.") + else: + for cat in failures: + cat_name = cat.get("name", "(unnamed)") + sub_cats = cat.get("subCategories", []) + total_affected = sum( + rc.get("affectedSessionCount", 0) + for sc in sub_cats + for rc in sc.get("rootCauses", []) + ) + print(f"\n Category: {cat_name} (sessions affected: {total_affected})") + + for sc in sub_cats: + sc_name = sc.get("name", "(unnamed)") + root_causes = sc.get("rootCauses", []) + print(f" Subcategory: {sc_name}") + + for rc in root_causes: + rc_name = rc.get("name", "(unnamed)") + rc_rec = rc.get("recommendation", "") + rc_count = rc.get("affectedSessionCount", 0) + rc_sessions = rc.get("affectedSessions", []) + print(f" Root cause : {rc_name} ({rc_count} sessions)") + if rc_rec: + print(f" Recommendation: {rc_rec}") + if rc_sessions: + preview = rc_sessions[:3] + more = len(rc_sessions) - 3 + print(f" Session IDs : {preview}" + (f" (+{more} more)" if more > 0 else "")) +else: + print("\n(No failureAnalysisResult in response)") + +# ── 4b: UserIntent ──────────────────────────────────────────────────────── + +ui = result.get("userIntentResult") or result.get("userIntentOutput") +if ui: + intents = ui.get("userIntents", []) + print(f"\n--- UserIntent ({len(intents)} intent clusters) ---") + + if not intents: + print(" No user intent clusters found.") + else: + for intent in intents: + cluster_id = intent.get("clusterId", "") + name = intent.get("name", "(unnamed)") + description = intent.get("description", "") + count = intent.get("affectedSessionCount", 0) + print(f"\n Intent cluster: {name} ({count} sessions)") + print(f" Cluster ID : {cluster_id}") + if description: + print(f" Description : {description}") +else: + print("\n(No userIntentResult in response — may be a known beta issue)") + +# ── 4c: ExecutionSummary ────────────────────────────────────────────────── + +es = result.get("executionSummaryResult") or result.get("executionSummaryOutput") +if es: + summaries = es.get("executionSummaries", []) + print(f"\n--- ExecutionSummary ({len(summaries)} clusters) ---") + + if not summaries: + print(" No execution summary clusters found.") + print(" Note: ExecutionSummary requires at least 3 sessions for clustering.") + else: + for summary in summaries: + cluster_id = summary.get("clusterId", "") + description = summary.get("description", "") + count = summary.get("affectedSessionCount", 0) + print(f"\n Cluster: {cluster_id} ({count} sessions)") + if description: + print(f" Description: {description}") +else: + print("\n(No executionSummaryResult in response)") + +# ── 4d: Error details per insight ───────────────────────────────────────── + +error_details = result.get("errorDetails", {}) +if error_details: + print(f"\n--- Error details ---") + for key, val in error_details.items(): + print(f" {key}: {val}") + +# ── Step 5: Online Insights Config (optional) ────────────────────────────── +# +# Creates a recurring insights job that runs daily over the last 24 hours of +# traces. Results accumulate automatically with no manual intervention needed. + +if args.online: + print("\n" + "=" * 60) + print("STEP 5: Create Online Insights Config (Daily Recurring)") + print("=" * 60) + + ONLINE_NAME = f"HROnlineInsights{uuid.uuid4().hex[:6]}" + + online_resp = ctrl.create_online_evaluation_config( + onlineEvaluationConfigName=ONLINE_NAME, + description="HR Assistant daily insights: FailureAnalysis, UserIntent, ExecutionSummary", + onlineEvaluationConfigType="INSIGHTS", + agentSelector={"serviceNames": [SERVICE_NAME]}, + insightsConfig={ + "insights": [{"insightId": iid} for iid in SELECTED_INSIGHTS], + "samplingRate": 100, + "clusteringConfig": {"frequencies": ["DAILY"]}, + }, + enableOnCreate=True, + clientToken=str(uuid.uuid4()), + ) + + ONLINE_ID = online_resp["onlineEvaluationConfigId"] + ONLINE_ARN = online_resp["onlineEvaluationConfigArn"] + + print(f"Online insights config created:") + print(f" ID : {ONLINE_ID}") + print(f" ARN : {ONLINE_ARN}") + print(f" Name : {ONLINE_NAME}") + print(f" Status: {online_resp.get('executionStatus', 'unknown')}") + print() + print("The config will run daily. To view results:") + print(f" python -c \"import boto3, json; ctrl=boto3.client('bedrock-agentcore-control', " + f"region_name='{REGION}'); r=ctrl.get_online_evaluation_config(" + f"onlineEvaluationConfigId='{ONLINE_ID}'); print(json.dumps(r, indent=2, default=str))\"") + print() + print("To archive (disable) this config:") + print(f" ctrl.update_online_evaluation_config(" + f"onlineEvaluationConfigId='{ONLINE_ID}', executionStatus='DISABLED')") + +# ── Summary ──────────────────────────────────────────────────────────────── + +print("\n" + "=" * 60) +print("INSIGHTS SUMMARY") +print("=" * 60) +print(f"Batch evaluation ID : {EVAL_ID}") +print(f"Status : {status}") + +stats = result.get("statistics", {}) +if stats: + print(f"Sessions processed : {stats.get('processedSessionCount', 'N/A')}") + print(f"Sessions failed : {stats.get('failedSessionCount', 'N/A')}") + +fa_clusters = len((result.get("failureAnalysisResult") or {}).get("failures", [])) +ui_clusters = len((result.get("userIntentResult") or {}).get("userIntents", [])) +es_clusters = len((result.get("executionSummaryResult") or {}).get("executionSummaries", [])) + +print(f"\nFailureAnalysis : {fa_clusters} top-level categories") +print(f"UserIntent : {ui_clusters} intent clusters") +print(f"ExecutionSummary : {es_clusters} execution clusters") + +print("\nFull response saved to insights_result.json") +with open("insights_result.json", "w") as f: + json.dump(result, f, indent=2, default=str) diff --git a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/requirements.txt b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/requirements.txt index 7e2e80aa7..37fe7b139 100644 --- a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/requirements.txt +++ b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/requirements.txt @@ -3,3 +3,13 @@ boto3>=1.43.0 strands-agents[otel] aws-opentelemetry-distro requests + +# insights.py requires a preview SDK with AgentCore Insights API support. +# Install from the preview WHL files (force-reinstall to upgrade botocore/boto3): +# +# pip install /path/to/Boto3CliV1Artifacts-dp/botocore-1.43.30-py3-none-any.whl \ +# /path/to/Boto3CliV1Artifacts-dp/boto3-1.43.30-py3-none-any.whl \ +# --force-reinstall +# +# The preview WHL adds the start_batch_evaluation(insights=[...]) and +# create_online_evaluation_config(insightsConfig=...) operations. From 772bacdf06c6ccfc0e1533df42e232f4bb001e7f Mon Sep 17 00:00:00 2001 From: Bharathi Srinivasan Date: Thu, 18 Jun 2026 10:24:16 -0400 Subject: [PATCH 02/17] sample for agentcore insights feature with SDK scripts and CLI examples --- .../03-optimize/README.md | 192 +++++++++++++----- .../03-optimize/insights.py | 36 ++-- .../03-optimize/requirements.txt | 14 +- .../03-registry/TEST_LOG.md | 2 +- .../00-prereqs/agents_config.json | 4 +- .../02-langgraph/evals_results/output.json | 6 +- .../groundtruth_eval_20260505_212226.json | 24 +-- .../code_based_eval_20260505_220315.json | 20 +- .../results/code_evaluator_ids.json | 4 +- .../NL-Authoring-Policy.ipynb | 28 +-- .../optimization_tutorial.ipynb | 20 +- 11 files changed, 213 insertions(+), 137 deletions(-) diff --git a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md index da5a1135c..22fda8d3a 100644 --- a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md +++ b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md @@ -57,7 +57,6 @@ python deploy.py --name HRAssistV1 python invoke.py --name HRAssistV1 # [Optional] Run failure insights: generate traces then analyze with all 3 insight types -# Requires preview SDK -- see "Failure Insights" section below for install instructions python insights.py --name HRAssistV1 --generate-traces # Run the full optimization workflow @@ -74,8 +73,8 @@ The following commands reproduce the full optimization workflow from the command Install the AgentCore CLI: ```bash -npm install -g @aws/agentcore -agentcore --version # should print 0.13.0 or later +npm install -g @aws/agentcore@latest +agentcore --version # 0.20.1 or later ``` ### Step 0: Failure Insights (Optional -- Pre-Optimization Diagnostics) @@ -83,10 +82,8 @@ agentcore --version # should print 0.13.0 or later Run insights before the optimization loop to see which sessions are failing and why. The results let you focus prompt and tool description changes on real problems. ```bash -# Install the preview SDK that adds insights API support (--force-reinstall upgrades botocore/boto3) -pip install /path/to/Boto3CliV1Artifacts-dp/botocore-1.43.30-py3-none-any.whl \ - /path/to/Boto3CliV1Artifacts-dp/boto3-1.43.30-py3-none-any.whl \ - --force-reinstall +# Install dependencies (boto3 1.43.32+ and bedrock-agentcore 1.15.0+ include the insights API): +pip install -r requirements.txt # Make sure the agent is deployed first (deploy.py --name HRInsights849 --region us-west-2) @@ -103,38 +100,26 @@ python insights.py --name HRInsights849 --insight Builtin.Insight.FailureAnalysi python insights.py --name HRInsights849 --generate-traces --online ``` -**Using agentcore-cli** (requires a LENS-authorized account; tested with v0.19.0): +**Using agentcore-cli** (v0.20.1+, requires an AgentCore project with a deployed runtime): -```bash -# Install the preview CLI: -npm install -g aws-agentcore-0.19.0-20260612171356.tgz # or later tarball +The CLI insights commands operate within an `agentcore` project. You must have already created a project with `agentcore create` and deployed it with `agentcore deploy` before running these commands. The `--runtime` flag refers to a runtime name defined in your project's `agentcore.json`. -# Prerequisites: -# 1. Deploy the agent and create a CLI project first (deploy.py creates the runtime): -python deploy.py --name HRInsightsCLI --region us-west-2 +```bash +# Install the CLI: +npm install -g @aws/agentcore@latest -# 2. Create a CLI project and register the deployed runtime: +# 1. Create a project and add the HR assistant as an agent: mkdir hr-insights-cli && cd hr-insights-cli -agentcore create --name HRInsightsCLI --defaults --no-agent -cd HRInsightsCLI -cp -r ../utils/hr_assistant_agent.py agentcore/../app/HRInsightsCLI/main.py # optional +agentcore create --name HRInsightsCLI --defaults +# Follow prompts or use: --framework Strands --model-provider Bedrock -# [One-time] Add a recurring daily online-insights config (written to agentcore.json, -# deployed via CDK): -agentcore add online-insights \ - --name HROnlineInsights849 \ - --runtime HRInsightsCLI \ - --insights Builtin.Insight.FailureAnalysis \ - --insights Builtin.Insight.UserIntent \ - --insights Builtin.Insight.ExecutionSummary \ - --sampling-rate 100 \ - --clustering-frequency DAILY \ - --enable-on-create \ - --json -# Deploy to create the CloudFormation-managed online insights config: -# agentcore deploy -y --json +# Copy the HR assistant implementation: +cp /path/to/utils/hr_assistant_agent.py app/HRInsightsCLI/main.py -# Run a one-shot insights job over the last 7 days of traces: +# Deploy (builds container, pushes to ECR, creates the AgentCore runtime): +agentcore deploy -y + +# 2. Run a one-shot insights job over the last 7 days of traces: agentcore run insights \ --runtime HRInsightsCLI \ --insights Builtin.Insight.FailureAnalysis \ @@ -144,14 +129,27 @@ agentcore run insights \ --wait \ --json -# List all insights jobs (history): +# 3. List all insights jobs for this project: agentcore insights history --json -# View results for a specific job: +# 4. View results for a specific job: agentcore insights results --id --json -# Chain insights into a system prompt recommendation: +# 5. Add a recurring daily online-insights config: +agentcore add online-insights \ + --name HROnlineInsights \ + --runtime HRInsightsCLI \ + --insights Builtin.Insight.FailureAnalysis \ + --insights Builtin.Insight.UserIntent \ + --insights Builtin.Insight.ExecutionSummary \ + --sampling-rate 100 \ + --clustering-frequency DAILY \ + --enable-on-create +agentcore deploy -y + +# 6. Chain insights into a system prompt recommendation: agentcore run recommendation \ + --runtime HRInsightsCLI \ --from-insights \ --type system-prompt \ --evaluator Builtin.GoalSuccessRate \ @@ -159,11 +157,11 @@ agentcore run recommendation \ --json ``` -> **Notes:** -> - `insights` and `evaluators` are mutually exclusive in a single batch job. Do not pass `--evaluator` to `agentcore run insights`. -> - Schema names must match `^[a-zA-Z][a-zA-Z0-9_]{0,47}$` (no hyphens). -> - LENS access must be enabled for your account. If you see `Account X is not authorized to use feature LENS`, contact your account admin. -> - `agentcore view insights` is not available in v0.19.0 -- use `agentcore insights history` and `agentcore insights results` instead. +Notes: +- `insights` and `evaluators` are mutually exclusive in a single batch job. Do not pass `--evaluator` to `agentcore run insights`. +- Resource names must match `^[a-zA-Z][a-zA-Z0-9_]{0,47}$` (letters, numbers, underscores; no hyphens). +- `agentcore insights history` and `agentcore insights results` must be run from inside the project directory. +- The `--from-insights` flag on `agentcore run recommendation` reads failure root causes from the insights job and uses them to guide the system prompt rewrite. ### Step 1: Deploy the HR Assistant @@ -337,35 +335,95 @@ agentcore deploy -y ## Failure Insights -AgentCore Insights runs over historical agent traces and clusters sessions by failure type, user intent, and execution pattern. Run it before or alongside optimization to get specifics on what is going wrong, not just a score. +AgentCore Insights analyzes agent sessions to identify failure patterns, extract user intents, and summarize execution behavior. It extends batch evaluation by providing triage analysis that goes beyond scoring: it tells you why your agent fails and what your users are trying to accomplish. After per-session analysis, the service clusters results across sessions to surface recurring patterns. + +Insights is in public preview. See the [AgentCore Insights documentation](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/insights.html) for the latest API details. ### Three Insight Types | Insight | What It Produces | |---------|-----------------| -| **FailureAnalysis** | Failure sessions clustered by category, subcategory, and root cause. Each root cause includes a fix recommendation and a list of affected session IDs. | -| **UserIntent** | Sessions grouped by what the user was trying to do (e.g., "PTO balance inquiry", "policy lookup"). Useful for finding gaps between what users ask and what the agent handles. | -| **ExecutionSummary** | Summary of how the agent executed across sessions: tool usage patterns, multi-turn flows, and common paths. Requires at least 3 sessions. | +| **FailureAnalysis** | Identifies failures, categorizes them using a signal taxonomy (see below), traces root causes to specific spans, and provides fix recommendations. Results appear as a three-level hierarchy: failure categories, subcategories, and root cause clusters with affected session IDs. | +| **UserIntent** | Extracts what users were trying to accomplish in each session, then clusters similar intents together. Shows the most common use cases your agent handles and reveals gaps between user requests and agent capabilities. | +| **ExecutionSummary** | Summarizes the approach the agent took and the outcome for each session, then clusters similar execution patterns. Requires at least 3 sessions. | + +### FailureAnalysis Signal Taxonomy + +Each failure in the response includes one or more `signals` — the specific evidence the service found at a span level. Each signal has a `category` (a machine-readable taxonomy label), `evidence` (a quoted description of what went wrong in that span), and `confidence` (0–1 float). + +The signal categories returned by the API: + +| Category | What it means | +|---|---| +| `hallucination-category-hall-capabilities` | Agent invented constraints or limitations for a tool that do not exist in the tool spec (e.g., "this tool only supports years 2025-2026" when no such constraint is documented) | +| `hallucination-category-hall-misunderstand` | Agent misread the tool result and reported a different value (e.g., tool returned "5% match", agent reported "6%") | +| `hallucination-category-hall-usage` | Agent asserted knowledge of a tool's contents without calling it (e.g., "sabbatical leave is not in the available topics" without calling `lookup_hr_policy`) | +| `task-instruction-category-non-compliance` | Agent violated an explicit instruction in the system prompt (e.g., system prompt says "always use available tools", agent answered without calling any tool) | +| `orchestration-related-errors-category-premature-termination` | Agent terminated the task without attempting a relevant tool call, rather than calling the tool and handling any error it returns | +| `llm-output-category-nonsensical` | Agent output was incoherent or exposed internal artifacts — unresolved template placeholders, raw `` tags, or other content that should not appear in a user-facing response | +| `repetitive-behavior-category-repetition-info` | Agent asked for information the user had already provided in the same session | + +Each `affectedSessions` entry under a root cause contains: +- `sessionId` — the session where this failure occurred +- `explanation` — a sentence citing the specific span ID and what went wrong +- `fixType` — `SYSTEM_PROMPT_FIX` (addressable via prompt change) or `OTHERS` (backend or data issue) +- `recommendation` — a concrete instruction to add to the system prompt +- `failureSpans[]` — the span(s) where the failure was detected, each with `spanId`, `traceId`, and `signals[]` + +Example from a real run: + +```json +{ + "sessionId": "3b927bee-...", + "explanation": "At span 619f31562100b9b6, the agent concluded without ever invoking get_pay_stub, because it hallucinated a non-existent date-range constraint.", + "fixType": "SYSTEM_PROMPT_FIX", + "recommendation": "Add a guardrail requiring the agent to attempt tool calls before concluding a request cannot be fulfilled.", + "failureSpans": [{ + "spanId": "619f31562100b9b6", + "traceId": "6a3080fa61c3929d7c75522421a71cec", + "signals": [{ + "category": "hallucination-category-hall-capabilities", + "evidence": "Agent claims get_pay_stub only supports 2025-2026, but the tool definition has no such constraint documented.", + "confidence": 0.9 + }] + }] +} +``` + +### How Insights Are Triggered + +Insights run in two modes: + +**One-time (batch):** Call `start_batch_evaluation` with an `insights` list. Results come back through `get_batch_evaluation`. Use this for on-demand analysis over a specific time range. + +**Recurring (scheduled):** Create an `OnlineEvaluationConfig` with a `clusteringConfig` frequency (`DAILY`, `WEEKLY`, or `MONTHLY`). The service automatically triggers batch evaluation jobs on that cadence. Per-session analysis runs continuously; clustered results are generated during each scheduled batch job. + +### From Triage to Optimization + +After insights identifies failure patterns, you can feed those findings into the Recommendations API to generate an improved system prompt: + +1. Run insights to identify recurring failure categories and root causes. +2. Call `start_recommendation` with your current system prompt, pointing it at the same agent traces (or pass the insights batch evaluation ARN directly). +3. Use A/B testing to compare the original and recommended configurations with live traffic. + +The `insights.py --online` flag and the `agentcore run recommendation --from-insights ` CLI command both implement this flow. ### Data Source Insights pull from the `aws/spans` CloudWatch log group, which receives OTel span documents from AgentCore Runtime via the `opentelemetry-instrument` entry point. Each session's tool calls, model calls, and errors are captured as spans and correlated by session ID. -The runtime log group (`/aws/bedrock-agentcore/runtimes/...`) must also be included. Without it, the insights engine cannot resolve the log events that spans reference, which causes incomplete results. +The runtime log group (`/aws/bedrock-agentcore/runtimes/...`) must also be included. Without it, the insights engine cannot resolve the log events that spans reference, which produces incomplete results. -> `insights` and `evaluators` are mutually exclusive in the batch evaluation API. Use a separate batch job for each. +`insights` and `evaluators` are mutually exclusive in the batch evaluation API. Use a separate batch job for each. ### Running insights.py ```bash -# Prerequisites: -# 1. Deploy the agent (creates agent_state_{name}.json): -python deploy.py --name HRInsights849 --region us-west-2 +# 1. Install dependencies: +pip install -r requirements.txt -# 2. Install the preview SDK with insights API support: -pip install /path/to/Boto3CliV1Artifacts-dp/botocore-1.43.30-py3-none-any.whl \ - /path/to/Boto3CliV1Artifacts-dp/boto3-1.43.30-py3-none-any.whl \ - --force-reinstall +# 2. Deploy the agent (creates agent_state_{name}.json): +python deploy.py --name HRInsights849 --region us-west-2 # 3a. Generate failure traces then run all insight types: python insights.py --name HRInsights849 --generate-traces @@ -415,13 +473,37 @@ FailureAnalysis (2 top-level categories) ### Online Insights Config -The `--online` flag creates an `OnlineEvaluationConfig` of type `INSIGHTS` that runs on a daily schedule. View results with `get_online_evaluation_config` or the CLI: +The `--online` flag creates an `OnlineEvaluationConfig` that runs on a daily schedule. It uses `clusteringConfig` with `frequencies: ["DAILY"]` to re-cluster sessions automatically. View results with `get_online_evaluation_config` or the CLI: ```bash +# Run from inside your agentcore project directory: agentcore insights history --json agentcore insights results --id --json ``` +The Python SDK call (used by `insights.py --online`): + +```python +ctrl.create_online_evaluation_config( + onlineEvaluationConfigName="HROnlineInsights", + rule={"samplingConfig": {"samplingPercentage": 100}}, + dataSourceConfig={ + "cloudWatchLogs": { + "logGroupNames": ["aws/spans", "/aws/bedrock-agentcore/runtimes/-DEFAULT"], + "serviceNames": [".DEFAULT"], + } + }, + insights=[ + {"insightId": "Builtin.Insight.FailureAnalysis"}, + {"insightId": "Builtin.Insight.UserIntent"}, + {"insightId": "Builtin.Insight.ExecutionSummary"}, + ], + clusteringConfig={"frequencies": ["DAILY"]}, + evaluationExecutionRoleArn=ROLE_ARN, + enableOnCreate=True, +) +``` + ### Chaining Insights into Recommendations Pass the insights job ID to a recommendation to generate a system prompt that targets the identified failures: diff --git a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/insights.py b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/insights.py index e408c93fc..ee2083b5c 100644 --- a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/insights.py +++ b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/insights.py @@ -31,13 +31,8 @@ 1. Deploy the HR Assistant agent: python deploy.py --name HRInsights849 --region us-west-2 - 2. Install the preview SDK (adds insights API support): - pip install \\ - /path/to/Boto3CliV1Artifacts-dp/botocore-1.43.30-py3-none-any.whl \\ - /path/to/Boto3CliV1Artifacts-dp/boto3-1.43.30-py3-none-any.whl \\ - --force-reinstall - - Typical path: ../../../../../../Evaluations/Evo/Boto3CliV1Artifacts-dp/ + 2. Install dependencies: + pip install -r requirements.txt """ import argparse @@ -399,11 +394,15 @@ # ── 4d: Error details per insight ───────────────────────────────────────── -error_details = result.get("errorDetails", {}) +error_details = result.get("errorDetails", []) if error_details: print(f"\n--- Error details ---") - for key, val in error_details.items(): - print(f" {key}: {val}") + if isinstance(error_details, dict): + for key, val in error_details.items(): + print(f" {key}: {val}") + else: + for item in error_details: + print(f" {item}") # ── Step 5: Online Insights Config (optional) ────────────────────────────── # @@ -420,13 +419,18 @@ online_resp = ctrl.create_online_evaluation_config( onlineEvaluationConfigName=ONLINE_NAME, description="HR Assistant daily insights: FailureAnalysis, UserIntent, ExecutionSummary", - onlineEvaluationConfigType="INSIGHTS", - agentSelector={"serviceNames": [SERVICE_NAME]}, - insightsConfig={ - "insights": [{"insightId": iid} for iid in SELECTED_INSIGHTS], - "samplingRate": 100, - "clusteringConfig": {"frequencies": ["DAILY"]}, + rule={ + "samplingConfig": {"samplingPercentage": 100}, + }, + dataSourceConfig={ + "cloudWatchLogs": { + "logGroupNames": LOG_GROUP_NAMES, + "serviceNames": [SERVICE_NAME], + } }, + insights=[{"insightId": iid} for iid in SELECTED_INSIGHTS], + clusteringConfig={"frequencies": ["DAILY"]}, + evaluationExecutionRoleArn=ROLE_ARN, enableOnCreate=True, clientToken=str(uuid.uuid4()), ) diff --git a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/requirements.txt b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/requirements.txt index 37fe7b139..67838a727 100644 --- a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/requirements.txt +++ b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/requirements.txt @@ -1,15 +1,5 @@ -bedrock-agentcore>=1.7.0 -boto3>=1.43.0 +bedrock-agentcore>=1.15.0 +boto3>=1.43.32 strands-agents[otel] aws-opentelemetry-distro requests - -# insights.py requires a preview SDK with AgentCore Insights API support. -# Install from the preview WHL files (force-reinstall to upgrade botocore/boto3): -# -# pip install /path/to/Boto3CliV1Artifacts-dp/botocore-1.43.30-py3-none-any.whl \ -# /path/to/Boto3CliV1Artifacts-dp/boto3-1.43.30-py3-none-any.whl \ -# --force-reinstall -# -# The preview WHL adds the start_batch_evaluation(insights=[...]) and -# create_online_evaluation_config(insightsConfig=...) operations. diff --git a/01-features/07-centralize-and-govern-your-ai-infrastructure/03-registry/TEST_LOG.md b/01-features/07-centralize-and-govern-your-ai-infrastructure/03-registry/TEST_LOG.md index fe126c69d..86ca284d1 100644 --- a/01-features/07-centralize-and-govern-your-ai-infrastructure/03-registry/TEST_LOG.md +++ b/01-features/07-centralize-and-govern-your-ai-infrastructure/03-registry/TEST_LOG.md @@ -3,7 +3,7 @@ **Date:** 2026-05-18 / 2026-05-19 **Source:** `06-workshops/10-Agent-Registry` (amazon-bedrock-agentcore-samples fork) **Target:** `02-features/06-centralize-and-govern-your-ai-infrastructure/03-registry` (private staging) -**AWS Account:** 849138760372 | **Region:** us-west-2 +**AWS Account:** 123456789012 | **Region:** us-west-2 --- diff --git a/06-workshops/07-AgentCore-evaluations/00-prereqs/agents_config.json b/06-workshops/07-AgentCore-evaluations/00-prereqs/agents_config.json index bc5172889..9d59e1ab5 100644 --- a/06-workshops/07-AgentCore-evaluations/00-prereqs/agents_config.json +++ b/06-workshops/07-AgentCore-evaluations/00-prereqs/agents_config.json @@ -1,11 +1,11 @@ { "strands": { "agent_id": "acevalstrands2-xKJy20HJDc", - "agent_arn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:runtime/acevalstrands2-xKJy20HJDc" + "agent_arn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:runtime/acevalstrands2-xKJy20HJDc" }, "langgraph": { "agent_id": "acevallanggraph2-xVzOqY40YB", - "agent_arn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:runtime/acevallanggraph2-xVzOqY40YB" + "agent_arn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:runtime/acevallanggraph2-xVzOqY40YB" }, "region": "us-east-1" } \ No newline at end of file diff --git a/06-workshops/07-AgentCore-evaluations/02-running-evaluations/02-langgraph/evals_results/output.json b/06-workshops/07-AgentCore-evaluations/02-running-evaluations/02-langgraph/evals_results/output.json index a576355b3..48c693f19 100644 --- a/06-workshops/07-AgentCore-evaluations/02-running-evaluations/02-langgraph/evals_results/output.json +++ b/06-workshops/07-AgentCore-evaluations/02-running-evaluations/02-langgraph/evals_results/output.json @@ -1,6 +1,6 @@ [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/response_quality_for_scope_b40a1c32-vBGSJi4Nz4", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/response_quality_for_scope_b40a1c32-vBGSJi4Nz4", "evaluatorId": "response_quality_for_scope_b40a1c32-vBGSJi4Nz4", "evaluatorName": "response_quality_for_scope_b40a1c32", "explanation": "The task asks 'What is 2+2?' which is a straightforward mathematical question. According to the context, the assistant used a calculator tool to compute '2+2' and received the result '4'. The candidate response states '2 + 2 = **4**', which is mathematically correct and directly answers the question. The question falls within the assistant's allowed scope (weather and mathematical queries), so there is no scope violation. The calculation is accurate, the presentation is clear, and the answer fully addresses the user's query with no errors or omissions. This is a complete and correct response to a basic arithmetic question.", @@ -19,7 +19,7 @@ } }, { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/response_quality_for_scope_b40a1c32-vBGSJi4Nz4", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/response_quality_for_scope_b40a1c32-vBGSJi4Nz4", "evaluatorId": "response_quality_for_scope_b40a1c32-vBGSJi4Nz4", "evaluatorName": "response_quality_for_scope_b40a1c32", "explanation": "The task requires evaluating whether the Assistant's response is good and accurate. The context shows the user asked 'What is the weather now?' and a weather tool was called that returned 'sunny'. The Assistant's response states 'The weather right now is **sunny**! It's a nice day out. \u2600\ufe0f'\n\nEvaluating accuracy:\n1. The core information is correct - the weather tool returned 'sunny' and the Assistant correctly relayed this as 'sunny'\n2. The Assistant stayed within its defined scope (weather and math queries)\n3. The response directly answers the question asked\n4. The additional commentary 'It's a nice day out' is a reasonable inference from sunny weather\n5. The sun emoji is appropriate and enhances clarity\n\nThe response is factually accurate, directly addresses the question, remains within scope, and provides the correct information from the tool result. There are no errors in the core answer. The slight embellishment ('It's a nice day out') is a minor addition but doesn't introduce any inaccuracy - it's a reasonable statement about sunny weather. This is a complete and accurate response to the weather query.", @@ -38,7 +38,7 @@ } }, { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/response_quality_for_scope_b40a1c32-vBGSJi4Nz4", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/response_quality_for_scope_b40a1c32-vBGSJi4Nz4", "evaluatorId": "response_quality_for_scope_b40a1c32-vBGSJi4Nz4", "evaluatorName": "response_quality_for_scope_b40a1c32", "explanation": "The task explicitly states that the quality can only be high if the agent remains within its original scope to answer questions about weather and mathematical queries only. The instructions clearly indicate that agents answering questions outside this scope (weather and math) should be penalized with a Very Poor classification.\n\nIn the context provided, the assistant has been handling weather queries and mathematical calculations appropriately. However, the candidate response addresses a question about the capital of the United States, which is neither a weather question nor a mathematical query. This is a geography/civics question that falls completely outside the assistant's designated scope.\n\nWhile the factual content of the response is accurate (Washington, D.C. is indeed the capital of the United States, and the additional details about its location and government buildings are correct), this accuracy is irrelevant given the explicit instruction that responses outside the scope of weather and math must be heavily penalized.\n\nThe assistant should have declined to answer this question or redirected the user back to its intended purpose of answering only weather and math questions. By providing an answer to a geography question, the assistant violated its operational constraints, regardless of how accurate that answer might be.\n\nTherefore, this response must receive the lowest possible score.", diff --git a/06-workshops/07-AgentCore-evaluations/05-groundtruth-based-evalautions/results/groundtruth_eval_20260505_212226.json b/06-workshops/07-AgentCore-evaluations/05-groundtruth-based-evalautions/results/groundtruth_eval_20260505_212226.json index 9c5c29727..b601248e7 100644 --- a/06-workshops/07-AgentCore-evaluations/05-groundtruth-based-evalautions/results/groundtruth_eval_20260505_212226.json +++ b/06-workshops/07-AgentCore-evaluations/05-groundtruth-based-evalautions/results/groundtruth_eval_20260505_212226.json @@ -131,7 +131,7 @@ "evaluator_id": "HRResponseSimilarity_38475b67-bEzzNp4GLA", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", "evaluatorId": "HRResponseSimilarity_38475b67-bEzzNp4GLA", "evaluatorName": "HRResponseSimilarity_38475b67", "explanation": "The agent's response includes all key facts from the expected response: employee EMP-001 has a total of 15 PTO days, 5 days used, and 10 days remaining. The information is clearly communicated and matches the expected response in content and clarity.", @@ -159,7 +159,7 @@ "evaluator_id": "HRAssertionChecker_38475b67-24XRuv49sA", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRAssertionChecker_38475b67-24XRuv49sA", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRAssertionChecker_38475b67-24XRuv49sA", "evaluatorId": "HRAssertionChecker_38475b67-24XRuv49sA", "evaluatorName": "HRAssertionChecker_38475b67", "context": { @@ -309,7 +309,7 @@ "evaluator_id": "HRResponseSimilarity_38475b67-bEzzNp4GLA", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", "evaluatorId": "HRResponseSimilarity_38475b67-bEzzNp4GLA", "evaluatorName": "HRResponseSimilarity_38475b67", "explanation": "The agent's response includes all key facts mentioned in the expected response: accrual of 15 days of PTO per year, the requirement for PTO requests to be submitted at least 2 business days in advance, and the rollover of up to 5 unused days. The agent's response also includes additional details such as the increase in accrual after 3 years and the rule that PTO cannot be taken in advance of accrual, which are not mentioned in the expected response but do not contradict it.", @@ -337,7 +337,7 @@ "evaluator_id": "HRAssertionChecker_38475b67-24XRuv49sA", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRAssertionChecker_38475b67-24XRuv49sA", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRAssertionChecker_38475b67-24XRuv49sA", "evaluatorId": "HRAssertionChecker_38475b67-24XRuv49sA", "evaluatorName": "HRAssertionChecker_38475b67", "explanation": "The agent followed the expected tool trajectory by calling 'lookup_hr_policy' with the topic 'pto'. Additionally, the agent mentioned both the 15-day annual accrual for full-time employees and the 2 business day advance notice requirement, fulfilling all assertions.", @@ -493,7 +493,7 @@ "evaluator_id": "HRResponseSimilarity_38475b67-bEzzNp4GLA", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", "evaluatorId": "HRResponseSimilarity_38475b67-bEzzNp4GLA", "evaluatorName": "HRResponseSimilarity_38475b67", "explanation": "The agent's response does not contain the specific details about the company's 401k match policy, which are key facts in the expected response. Instead, the agent informs the user that it doesn't have access to the information. Therefore, the response is factually different and missing key information from the expected response.", @@ -520,7 +520,7 @@ "evaluator_id": "HRAssertionChecker_38475b67-24XRuv49sA", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRAssertionChecker_38475b67-24XRuv49sA", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRAssertionChecker_38475b67-24XRuv49sA", "evaluatorId": "HRAssertionChecker_38475b67-24XRuv49sA", "evaluatorName": "HRAssertionChecker_38475b67", "context": { @@ -670,7 +670,7 @@ "evaluator_id": "HRResponseSimilarity_38475b67-bEzzNp4GLA", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", "evaluatorId": "HRResponseSimilarity_38475b67-bEzzNp4GLA", "evaluatorName": "HRResponseSimilarity_38475b67", "context": { @@ -692,7 +692,7 @@ "evaluator_id": "HRAssertionChecker_38475b67-24XRuv49sA", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRAssertionChecker_38475b67-24XRuv49sA", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRAssertionChecker_38475b67-24XRuv49sA", "evaluatorId": "HRAssertionChecker_38475b67-24XRuv49sA", "evaluatorName": "HRAssertionChecker_38475b67", "context": { @@ -893,7 +893,7 @@ "evaluator_id": "HRResponseSimilarity_38475b67-bEzzNp4GLA", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", "evaluatorId": "HRResponseSimilarity_38475b67-bEzzNp4GLA", "evaluatorName": "HRResponseSimilarity_38475b67", "explanation": "The agent's response includes all the key facts from the expected response, such as the premium coverage percentages and the available health insurance plans. The agent's response also provides additional details like deductibles and open enrollment timing, which are not present in the expected response. However, these additional details do not detract from the core information that matches the expected response.", @@ -916,7 +916,7 @@ ] }, { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", "evaluatorId": "HRResponseSimilarity_38475b67-bEzzNp4GLA", "evaluatorName": "HRResponseSimilarity_38475b67", "explanation": "The agent's response includes all the key facts from the expected response: 100% coverage for preventive care, 80% for basic restorative care, 50% for major restorative care, and an annual maximum of $2,000. The agent's response also includes additional details about the orthodontia lifetime maximum, which is not mentioned in the expected response but does not detract from the match. Therefore, the response is semantically equivalent to the expected response.", @@ -939,7 +939,7 @@ ] }, { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", "evaluatorId": "HRResponseSimilarity_38475b67-bEzzNp4GLA", "evaluatorName": "HRResponseSimilarity_38475b67", "context": { @@ -961,7 +961,7 @@ "evaluator_id": "HRAssertionChecker_38475b67-24XRuv49sA", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRAssertionChecker_38475b67-24XRuv49sA", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRAssertionChecker_38475b67-24XRuv49sA", "evaluatorId": "HRAssertionChecker_38475b67-24XRuv49sA", "evaluatorName": "HRAssertionChecker_38475b67", "explanation": "The agent followed the expected tool trajectory by calling 'get_benefits_summary' three times, which matches the expected sequence. Additionally, the agent satisfied all assertions: it correctly described health, dental, and 401k benefits in their respective turns, and it maintained the conversational context across all three turns. Therefore, the agent fulfilled all the session requirements.", diff --git a/06-workshops/07-AgentCore-evaluations/06-programmatic_evaluators/results/code_based_eval_20260505_220315.json b/06-workshops/07-AgentCore-evaluations/06-programmatic_evaluators/results/code_based_eval_20260505_220315.json index e4bc82951..1797e5631 100644 --- a/06-workshops/07-AgentCore-evaluations/06-programmatic_evaluators/results/code_based_eval_20260505_220315.json +++ b/06-workshops/07-AgentCore-evaluations/06-programmatic_evaluators/results/code_based_eval_20260505_220315.json @@ -96,7 +96,7 @@ "evaluator_id": "HRResponseLength_9e84c043-YRvTvEA9NI", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRResponseLength_9e84c043-YRvTvEA9NI", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseLength_9e84c043-YRvTvEA9NI", "evaluatorId": "HRResponseLength_9e84c043-YRvTvEA9NI", "evaluatorName": "HRResponseLength_9e84c043", "explanation": "Response length 823 chars exceeds maximum 600. Consider a more concise answer.", @@ -115,7 +115,7 @@ "evaluator_id": "HRFactChecker_9e84c043-7ro7ur34fw", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRFactChecker_9e84c043-7ro7ur34fw", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRFactChecker_9e84c043-7ro7ur34fw", "evaluatorId": "HRFactChecker_9e84c043-7ro7ur34fw", "evaluatorName": "HRFactChecker_9e84c043", "explanation": "No applicable checks triggered. Tools: ['none'], response length: 823 chars.", @@ -227,7 +227,7 @@ "evaluator_id": "HRResponseLength_9e84c043-YRvTvEA9NI", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRResponseLength_9e84c043-YRvTvEA9NI", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseLength_9e84c043-YRvTvEA9NI", "evaluatorId": "HRResponseLength_9e84c043-YRvTvEA9NI", "evaluatorName": "HRResponseLength_9e84c043", "explanation": "Response length 675 chars exceeds maximum 600. Consider a more concise answer.", @@ -246,7 +246,7 @@ "evaluator_id": "HRFactChecker_9e84c043-7ro7ur34fw", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRFactChecker_9e84c043-7ro7ur34fw", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRFactChecker_9e84c043-7ro7ur34fw", "evaluatorId": "HRFactChecker_9e84c043-7ro7ur34fw", "evaluatorName": "HRFactChecker_9e84c043", "explanation": "No applicable checks triggered. Tools: ['none'], response length: 675 chars.", @@ -358,7 +358,7 @@ "evaluator_id": "HRResponseLength_9e84c043-YRvTvEA9NI", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRResponseLength_9e84c043-YRvTvEA9NI", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseLength_9e84c043-YRvTvEA9NI", "evaluatorId": "HRResponseLength_9e84c043-YRvTvEA9NI", "evaluatorName": "HRResponseLength_9e84c043", "explanation": "Response length 972 chars exceeds maximum 600. Consider a more concise answer.", @@ -377,7 +377,7 @@ "evaluator_id": "HRFactChecker_9e84c043-7ro7ur34fw", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRFactChecker_9e84c043-7ro7ur34fw", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRFactChecker_9e84c043-7ro7ur34fw", "evaluatorId": "HRFactChecker_9e84c043-7ro7ur34fw", "evaluatorName": "HRFactChecker_9e84c043", "explanation": "0/2 HR fact checks passed. | Failed: Pay stub EMP-001 2026-01 gross = $8,333.33: $8,333.33 not found; Pay stub EMP-001 2026-01 net = $5,362.50: $5,362.50 not found", @@ -489,7 +489,7 @@ "evaluator_id": "HRResponseLength_9e84c043-YRvTvEA9NI", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRResponseLength_9e84c043-YRvTvEA9NI", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseLength_9e84c043-YRvTvEA9NI", "evaluatorId": "HRResponseLength_9e84c043-YRvTvEA9NI", "evaluatorName": "HRResponseLength_9e84c043", "explanation": "Response length 902 chars exceeds maximum 600. Consider a more concise answer.", @@ -508,7 +508,7 @@ "evaluator_id": "HRFactChecker_9e84c043-7ro7ur34fw", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRFactChecker_9e84c043-7ro7ur34fw", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRFactChecker_9e84c043-7ro7ur34fw", "evaluatorId": "HRFactChecker_9e84c043-7ro7ur34fw", "evaluatorName": "HRFactChecker_9e84c043", "explanation": "No applicable checks triggered. Tools: ['none'], response length: 902 chars.", @@ -620,7 +620,7 @@ "evaluator_id": "HRResponseLength_9e84c043-YRvTvEA9NI", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRResponseLength_9e84c043-YRvTvEA9NI", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseLength_9e84c043-YRvTvEA9NI", "evaluatorId": "HRResponseLength_9e84c043-YRvTvEA9NI", "evaluatorName": "HRResponseLength_9e84c043", "explanation": "Response length 626 chars exceeds maximum 600. Consider a more concise answer.", @@ -639,7 +639,7 @@ "evaluator_id": "HRFactChecker_9e84c043-7ro7ur34fw", "results": [ { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:849138760372:evaluator/HRFactChecker_9e84c043-7ro7ur34fw", + "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRFactChecker_9e84c043-7ro7ur34fw", "evaluatorId": "HRFactChecker_9e84c043-7ro7ur34fw", "evaluatorName": "HRFactChecker_9e84c043", "explanation": "No applicable checks triggered. Tools: ['none'], response length: 626 chars.", diff --git a/06-workshops/07-AgentCore-evaluations/06-programmatic_evaluators/results/code_evaluator_ids.json b/06-workshops/07-AgentCore-evaluations/06-programmatic_evaluators/results/code_evaluator_ids.json index f2f883c92..c1c1e1590 100644 --- a/06-workshops/07-AgentCore-evaluations/06-programmatic_evaluators/results/code_evaluator_ids.json +++ b/06-workshops/07-AgentCore-evaluations/06-programmatic_evaluators/results/code_evaluator_ids.json @@ -2,11 +2,11 @@ "HRResponseLength": { "id": "HRResponseLength_9e84c043-YRvTvEA9NI", "level": "TRACE", - "lambda_arn": "arn:aws:lambda:us-east-1:849138760372:function:hr-response-length" + "lambda_arn": "arn:aws:lambda:us-east-1:123456789012:function:hr-response-length" }, "HRFactChecker": { "id": "HRFactChecker_9e84c043-7ro7ur34fw", "level": "SESSION", - "lambda_arn": "arn:aws:lambda:us-east-1:849138760372:function:hr-fact-checker" + "lambda_arn": "arn:aws:lambda:us-east-1:123456789012:function:hr-fact-checker" } } \ No newline at end of file diff --git a/06-workshops/08-AgentCore-policy/02-Natural-Language-Policy-Authoring/NL-Authoring-Policy.ipynb b/06-workshops/08-AgentCore-policy/02-Natural-Language-Policy-Authoring/NL-Authoring-Policy.ipynb index 061152ea6..3fd9435d4 100644 --- a/06-workshops/08-AgentCore-policy/02-Natural-Language-Policy-Authoring/NL-Authoring-Policy.ipynb +++ b/06-workshops/08-AgentCore-policy/02-Natural-Language-Policy-Authoring/NL-Authoring-Policy.ipynb @@ -335,8 +335,8 @@ "output_type": "stream", "text": [ "✅ AWS Credentials Verified\n", - " Account: 849138760372\n", - " User/Role: arn:aws:sts::849138760372:assumed-role/admin/bhrsrini-Isengard\n" + " Account: 123456789012\n", + " User/Role: arn:aws:sts::123456789012:assumed-role/admin/bhrsrini-Isengard\n" ] } ], @@ -676,7 +676,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "2026-04-14 11:59:39,324 - bedrock_agentcore.policy - INFO - ✓ Policy Generation initiated: arn:aws:bedrock-agentcore:us-east-1:849138760372:policy-engine/InsurancePolicyEngine_NL2Cedar-dyq0mkonbr/policy-generation/nl_policy_1776193179-1z2ndmrcxt\n" + "2026-04-14 11:59:39,324 - bedrock_agentcore.policy - INFO - ✓ Policy Generation initiated: arn:aws:bedrock-agentcore:us-east-1:123456789012:policy-engine/InsurancePolicyEngine_NL2Cedar-dyq0mkonbr/policy-generation/nl_policy_1776193179-1z2ndmrcxt\n" ] }, { @@ -780,7 +780,7 @@ "permit(\n", " principal,\n", " action == AgentCore::Action::\"ApplicationToolTarget___create_application\",\n", - " resource == AgentCore::Gateway::\"arn:aws:bedrock-agentcore:us-east-1:849138760372:gateway/gw-insurance-underwriting-mih1stx5g3\"\n", + " resource == AgentCore::Gateway::\"arn:aws:bedrock-agentcore:us-east-1:123456789012:gateway/gw-insurance-underwriting-mih1stx5g3\"\n", ") when {\n", " (((context.input).coverage_amount) < 1000000) && ((((context.input).applicant_region) == \"US\") || (((context.input).applicant_region) == \"CA\"))\n", "};\n", @@ -859,7 +859,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "2026-04-14 11:59:52,974 - bedrock_agentcore.policy - INFO - ✓ Policy creation initiated: arn:aws:bedrock-agentcore:us-east-1:849138760372:policy-engine/InsurancePolicyEngine_NL2Cedar-dyq0mkonbr/policy/application_creation_policy-ypxw2drkj7\n" + "2026-04-14 11:59:52,974 - bedrock_agentcore.policy - INFO - ✓ Policy creation initiated: arn:aws:bedrock-agentcore:us-east-1:123456789012:policy-engine/InsurancePolicyEngine_NL2Cedar-dyq0mkonbr/policy/application_creation_policy-ypxw2drkj7\n" ] }, { @@ -960,7 +960,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "2026-04-14 11:59:59,803 - bedrock_agentcore.policy - INFO - ✓ Policy Generation initiated: arn:aws:bedrock-agentcore:us-east-1:849138760372:policy-engine/InsurancePolicyEngine_NL2Cedar-dyq0mkonbr/policy-generation/nl_policy_1776193199-c_a8ekl0ns\n" + "2026-04-14 11:59:59,803 - bedrock_agentcore.policy - INFO - ✓ Policy Generation initiated: arn:aws:bedrock-agentcore:us-east-1:123456789012:policy-engine/InsurancePolicyEngine_NL2Cedar-dyq0mkonbr/policy-generation/nl_policy_1776193199-c_a8ekl0ns\n" ] }, { @@ -1056,7 +1056,7 @@ "forbid(\n", " principal,\n", " action == AgentCore::Action::\"ApplicationToolTarget___create_application\",\n", - " resource == AgentCore::Gateway::\"arn:aws:bedrock-agentcore:us-east-1:849138760372:gateway/gw-insurance-underwriting-mih1stx5g3\"\n", + " resource == AgentCore::Gateway::\"arn:aws:bedrock-agentcore:us-east-1:123456789012:gateway/gw-insurance-underwriting-mih1stx5g3\"\n", ") when {\n", " !(!(((context.input).coverage_amount) <= 0))\n", "};\n", @@ -1066,7 +1066,7 @@ "permit(\n", " principal,\n", " action == AgentCore::Action::\"RiskModelToolTarget___invoke_risk_model\",\n", - " resource == AgentCore::Gateway::\"arn:aws:bedrock-agentcore:us-east-1:849138760372:gateway/gw-insurance-underwriting-mih1stx5g3\"\n", + " resource == AgentCore::Gateway::\"arn:aws:bedrock-agentcore:us-east-1:123456789012:gateway/gw-insurance-underwriting-mih1stx5g3\"\n", ") when {\n", " ((context.input).data_governance_approval) == true\n", "};\n", @@ -1144,7 +1144,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "2026-04-14 12:00:19,675 - bedrock_agentcore.policy - INFO - ✓ Policy Generation initiated: arn:aws:bedrock-agentcore:us-east-1:849138760372:policy-engine/InsurancePolicyEngine_NL2Cedar-dyq0mkonbr/policy-generation/nl_policy_1776193219-h3b085ns_m\n" + "2026-04-14 12:00:19,675 - bedrock_agentcore.policy - INFO - ✓ Policy Generation initiated: arn:aws:bedrock-agentcore:us-east-1:123456789012:policy-engine/InsurancePolicyEngine_NL2Cedar-dyq0mkonbr/policy-generation/nl_policy_1776193219-h3b085ns_m\n" ] }, { @@ -1235,7 +1235,7 @@ "permit(\n", " principal,\n", " action == AgentCore::Action::\"RiskModelToolTarget___invoke_risk_model\",\n", - " resource == AgentCore::Gateway::\"arn:aws:bedrock-agentcore:us-east-1:849138760372:gateway/gw-insurance-underwriting-mih1stx5g3\"\n", + " resource == AgentCore::Gateway::\"arn:aws:bedrock-agentcore:us-east-1:123456789012:gateway/gw-insurance-underwriting-mih1stx5g3\"\n", ") when {\n", " (principal.hasTag(\"username\")) && ((principal.getTag(\"username\")) == \"test-user\")\n", "};\n", @@ -1246,7 +1246,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "2026-04-14 12:00:33,074 - bedrock_agentcore.policy - INFO - ✓ Policy Generation initiated: arn:aws:bedrock-agentcore:us-east-1:849138760372:policy-engine/InsurancePolicyEngine_NL2Cedar-dyq0mkonbr/policy-generation/nl_policy_1776193232-g0luio2sq5\n" + "2026-04-14 12:00:33,074 - bedrock_agentcore.policy - INFO - ✓ Policy Generation initiated: arn:aws:bedrock-agentcore:us-east-1:123456789012:policy-engine/InsurancePolicyEngine_NL2Cedar-dyq0mkonbr/policy-generation/nl_policy_1776193232-g0luio2sq5\n" ] }, { @@ -1337,7 +1337,7 @@ "forbid(\n", " principal,\n", " action in [AgentCore::Action::\"ApprovalToolTarget\"],\n", - " resource == AgentCore::Gateway::\"arn:aws:bedrock-agentcore:us-east-1:849138760372:gateway/gw-insurance-underwriting-mih1stx5g3\"\n", + " resource == AgentCore::Gateway::\"arn:aws:bedrock-agentcore:us-east-1:123456789012:gateway/gw-insurance-underwriting-mih1stx5g3\"\n", ") when {\n", " !((principal.hasTag(\"scope\")) && ((principal.getTag(\"scope\")) like \"*group:Controller*\"))\n", "};\n", @@ -1348,7 +1348,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "2026-04-14 12:00:46,728 - bedrock_agentcore.policy - INFO - ✓ Policy Generation initiated: arn:aws:bedrock-agentcore:us-east-1:849138760372:policy-engine/InsurancePolicyEngine_NL2Cedar-dyq0mkonbr/policy-generation/nl_policy_1776193246-o9h8la5kyd\n" + "2026-04-14 12:00:46,728 - bedrock_agentcore.policy - INFO - ✓ Policy Generation initiated: arn:aws:bedrock-agentcore:us-east-1:123456789012:policy-engine/InsurancePolicyEngine_NL2Cedar-dyq0mkonbr/policy-generation/nl_policy_1776193246-o9h8la5kyd\n" ] }, { @@ -1425,7 +1425,7 @@ "forbid(\n", " principal,\n", " action in [AgentCore::Action::\"RiskModelToolTarget\",AgentCore::Action::\"ApprovalToolTarget\"],\n", - " resource == AgentCore::Gateway::\"arn:aws:bedrock-agentcore:us-east-1:849138760372:gateway/gw-insurance-underwriting-mih1stx5g3\"\n", + " resource == AgentCore::Gateway::\"arn:aws:bedrock-agentcore:us-east-1:123456789012:gateway/gw-insurance-underwriting-mih1stx5g3\"\n", ") when {\n", " !((principal.hasTag(\"role\")) && ((principal.getTag(\"role\")) == \"senior-adjuster\"))\n", "};\n", diff --git a/06-workshops/12-AgentCore-optimization/optimization_tutorial.ipynb b/06-workshops/12-AgentCore-optimization/optimization_tutorial.ipynb index f796c70af..701cb82c7 100644 --- a/06-workshops/12-AgentCore-optimization/optimization_tutorial.ipynb +++ b/06-workshops/12-AgentCore-optimization/optimization_tutorial.ipynb @@ -1286,7 +1286,7 @@ "and tool descriptions — without any code redeployment.\n", "\n", "Updated baggage for promoted control:\n", - " aws.agentcore.configbundle_arn=arn:aws:bedrock-agentcore:us-east-1:849138760372:configuration-bundle/HRControlc33e4d-IpoVyD9lTm,aws.agentcore.configbundle_version=8b432959-98da-4e85-b45f-de513232892c\n" + " aws.agentcore.configbundle_arn=arn:aws:bedrock-agentcore:us-east-1:123456789012:configuration-bundle/HRControlc33e4d-IpoVyD9lTm,aws.agentcore.configbundle_version=8b432959-98da-4e85-b45f-de513232892c\n" ] } ], @@ -1513,8 +1513,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Deploying HRAssistV2c33e4d (version=v2) to us-east-1 (account=849138760372)\n", - "Created IAM role: arn:aws:iam::849138760372:role/HRAssistV2c33e4dRole\n", + "Deploying HRAssistV2c33e4d (version=v2) to us-east-1 (account=123456789012)\n", + "Created IAM role: arn:aws:iam::123456789012:role/HRAssistV2c33e4dRole\n", "IAM policy attached. Waiting 10s for propagation...\n", "Installing dependencies for ARM64 into /tmp/HRAssistV2c33e4d_build/pkg...\n" ] @@ -1536,8 +1536,8 @@ "text": [ "Agent code (v2) written to /tmp/HRAssistV2c33e4d_build/pkg/main.py\n", "Package built: /tmp/HRAssistV2c33e4d_build/deployment_package.zip (34.2 MB)\n", - "Created S3 bucket: bedrock-agentcore-code-849138760372-us-east-1\n", - "Uploaded to s3://bedrock-agentcore-code-849138760372-us-east-1/HRAssistV2c33e4d/deployment_package.zip\n", + "Created S3 bucket: bedrock-agentcore-code-123456789012-us-east-1\n", + "Uploaded to s3://bedrock-agentcore-code-123456789012-us-east-1/HRAssistV2c33e4d/deployment_package.zip\n", "Runtime created: HRAssistV2c33e4d-JCjmVNDKPc. Polling for READY/ACTIVE...\n", " Poll 1: CREATING\n", " Poll 2: CREATING\n", @@ -1547,16 +1547,16 @@ "{\n", " \"runtime_name\": \"HRAssistV2c33e4d\",\n", " \"runtime_id\": \"HRAssistV2c33e4d-JCjmVNDKPc\",\n", - " \"runtime_arn\": \"arn:aws:bedrock-agentcore:us-east-1:849138760372:runtime/HRAssistV2c33e4d-JCjmVNDKPc\",\n", + " \"runtime_arn\": \"arn:aws:bedrock-agentcore:us-east-1:123456789012:runtime/HRAssistV2c33e4d-JCjmVNDKPc\",\n", " \"log_group\": \"/aws/bedrock-agentcore/runtimes/HRAssistV2c33e4d-JCjmVNDKPc-DEFAULT\",\n", " \"service_name\": \"HRAssistV2c33e4d.DEFAULT\",\n", - " \"role_arn\": \"arn:aws:iam::849138760372:role/HRAssistV2c33e4dRole\",\n", + " \"role_arn\": \"arn:aws:iam::123456789012:role/HRAssistV2c33e4dRole\",\n", " \"role_name\": \"HRAssistV2c33e4dRole\",\n", - " \"s3_bucket\": \"bedrock-agentcore-code-849138760372-us-east-1\",\n", + " \"s3_bucket\": \"bedrock-agentcore-code-123456789012-us-east-1\",\n", " \"s3_key\": \"HRAssistV2c33e4d/deployment_package.zip\",\n", " \"region\": \"us-east-1\",\n", " \"version\": \"v2\",\n", - " \"account_id\": \"849138760372\"\n", + " \"account_id\": \"123456789012\"\n", "}\n" ] } @@ -1591,7 +1591,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "v2 Agent ARN : arn:aws:bedrock-agentcore:us-east-1:849138760372:runtime/HRAssistV2c33e4d-JCjmVNDKPc\n", + "v2 Agent ARN : arn:aws:bedrock-agentcore:us-east-1:123456789012:runtime/HRAssistV2c33e4d-JCjmVNDKPc\n", "v2 Log Group : /aws/bedrock-agentcore/runtimes/HRAssistV2c33e4d-JCjmVNDKPc-DEFAULT\n", "v2 has extra tool: escalate_to_hr_manager\n", "v2 has improved system prompt baked into the code\n" From 1d44063e69375d842e6a1f24db56bbec9122460b Mon Sep 17 00:00:00 2001 From: Bharathi Srinivasan Date: Thu, 18 Jun 2026 15:43:59 -0400 Subject: [PATCH 03/17] agent loops image --- .../AGENT-LOOPS.PNG | Bin 0 -> 130816 bytes .../README.md | 14 +------------- 2 files changed, 1 insertion(+), 13 deletions(-) create mode 100644 01-features/06-observe-evaluate-optimize-your-agent/AGENT-LOOPS.PNG diff --git a/01-features/06-observe-evaluate-optimize-your-agent/AGENT-LOOPS.PNG b/01-features/06-observe-evaluate-optimize-your-agent/AGENT-LOOPS.PNG new file mode 100644 index 0000000000000000000000000000000000000000..384e98cebea1d70be5d4c9aeb39d60a9054ba53a GIT binary patch literal 130816 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 literal 0 HcmV?d00001 diff --git a/01-features/06-observe-evaluate-optimize-your-agent/README.md b/01-features/06-observe-evaluate-optimize-your-agent/README.md index 3170b8bd8..c02ccbe6c 100644 --- a/01-features/06-observe-evaluate-optimize-your-agent/README.md +++ b/01-features/06-observe-evaluate-optimize-your-agent/README.md @@ -6,19 +6,7 @@ automated evaluation, and AI-driven optimization with A/B testing. ## Overview -``` -┌─────────────────────────────────────────────────────────────────┐ -│ Agent Lifecycle on AgentCore │ -│ │ -│ [Infrastructure Setup] [Observe] [Evaluate] [Optimize] │ -│ (one-time) │ │ │ │ -│ │ ▼ ▼ ▼ │ -│ Enable Transaction ──► Advanced ──► Batch ──► Config │ -│ Search + ADOT OTel Techniques Eval Bundles │ -│ Custom Spans Online Eval A/B Tests │ -│ Data Protection GT Datasets AI Recs │ -└─────────────────────────────────────────────────────────────────┘ -``` +![Agent development to production loops](AGENT-LOOPS.png) ## Before You Start — Enable observability Infrastructure From d7550ba7e9492c9f7c3f6ccce58f6a7f12c825e6 Mon Sep 17 00:00:00 2001 From: Bharathi Srinivasan Date: Thu, 18 Jun 2026 15:53:42 -0400 Subject: [PATCH 04/17] move CLI insights step to after deploy and baseline eval in optimization workflow --- .../03-optimize/README.md | 114 +++++++----------- 1 file changed, 45 insertions(+), 69 deletions(-) diff --git a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md index 22fda8d3a..8f3384462 100644 --- a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md +++ b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md @@ -1,19 +1,19 @@ -# AgentCore Optimization +# AgentCore optimization -End-to-end optimization workflow for an HR Assistant agent on Amazon Bedrock AgentCore runtime. Covers baseline evaluation, AI-generated prompt improvements, and A/B testing via configuration bundles and target-based routing. +End-to-end optimization workflow for an HR Assistant agent on Amazon Bedrock AgentCore runtime. Covers automated insights to detect agent failures, run baseline evaluation, get recommendations to improve the agent, and A/B testing via configuration bundles and target-based routing. ### What You Will Learn | Stage | Concepts Covered | |-------|-----------------| -| **Failure Insights** | FailureAnalysis, UserIntent, ExecutionSummary: root cause clustering of agent failures | +| **Insights** | FailureAnalysis, UserIntent, ExecutionSummary: root cause clustering of agent failures | | **Baseline evaluation** | Batch evaluations on agent sessions | | **Recommendations** | System prompt optimization, tool description optimization from production traces | | **Configuration Bundles** | Versioned config containers, runtime config hooks, baggage-based injection | | **A/B Test: Config-Bundle Routing** | Prompt-level A/B testing without redeployment, online evaluation, statistical analysis | | **A/B Test: Target-Based Routing** | Code-level A/B testing, phased rollout (90/10 canary), multi-runtime comparison | -![AgentCore optimization](images/ac-optimization.png) +![AgentCore optimization](images/observe-eval-improve.png) ### Key Components @@ -100,28 +100,46 @@ python insights.py --name HRInsights849 --insight Builtin.Insight.FailureAnalysi python insights.py --name HRInsights849 --generate-traces --online ``` -**Using agentcore-cli** (v0.20.1+, requires an AgentCore project with a deployed runtime): +### Step 1: Deploy the HR Assistant + +```bash +# Scaffold a new AgentCore project +agentcore create --name HRAssistant --framework Strands --model-provider Bedrock --defaults + +# Copy the HR assistant implementation +cp utils/hr_assistant_agent.py app/HRAssistant/main.py + +# Test locally before deploying +agentcore dev -The CLI insights commands operate within an `agentcore` project. You must have already created a project with `agentcore create` and deployed it with `agentcore deploy` before running these commands. The `--runtime` flag refers to a runtime name defined in your project's `agentcore.json`. +# Deploy to AWS (builds container, pushes to ECR, creates AgentCore runtime) +agentcore deploy +# Note the runtime ID and ARN from the output. +``` + +### Step 2: Run Baseline evaluation ```bash -# Install the CLI: -npm install -g @aws/agentcore@latest +# Invoke the agent to generate traffic +agentcore invoke \ + --runtime HRAssistant \ + --prompt "Employee ID: EMP-001. What is my PTO balance?" \ + --session-id $(python3 -c "import uuid; print(uuid.uuid4())") -# 1. Create a project and add the HR assistant as an agent: -mkdir hr-insights-cli && cd hr-insights-cli -agentcore create --name HRInsightsCLI --defaults -# Follow prompts or use: --framework Strands --model-provider Bedrock +# Run batch evaluation across all sessions +agentcore run batch-evaluation \ + --runtime HRAssistant \ + --evaluator Builtin.GoalSuccessRate Builtin.Helpfulness Builtin.Correctness +``` -# Copy the HR assistant implementation: -cp /path/to/utils/hr_assistant_agent.py app/HRInsightsCLI/main.py +### Step 3: Run Failure Insights -# Deploy (builds container, pushes to ECR, creates the AgentCore runtime): -agentcore deploy -y +After generating traffic, run insights to understand which sessions are failing and why before optimizing. The CLI insights commands require an `agentcore` project with a deployed runtime (v0.20.1+). -# 2. Run a one-shot insights job over the last 7 days of traces: +```bash +# Run a one-shot insights job over the last 7 days of traces: agentcore run insights \ - --runtime HRInsightsCLI \ + --runtime HRAssistant \ --insights Builtin.Insight.FailureAnalysis \ --insights Builtin.Insight.UserIntent \ --insights Builtin.Insight.ExecutionSummary \ @@ -129,16 +147,16 @@ agentcore run insights \ --wait \ --json -# 3. List all insights jobs for this project: +# List all insights jobs for this project: agentcore insights history --json -# 4. View results for a specific job: +# View results for a specific job: agentcore insights results --id --json -# 5. Add a recurring daily online-insights config: +# Add a recurring daily online-insights config: agentcore add online-insights \ --name HROnlineInsights \ - --runtime HRInsightsCLI \ + --runtime HRAssistant \ --insights Builtin.Insight.FailureAnalysis \ --insights Builtin.Insight.UserIntent \ --insights Builtin.Insight.ExecutionSummary \ @@ -146,56 +164,14 @@ agentcore add online-insights \ --clustering-frequency DAILY \ --enable-on-create agentcore deploy -y - -# 6. Chain insights into a system prompt recommendation: -agentcore run recommendation \ - --runtime HRInsightsCLI \ - --from-insights \ - --type system-prompt \ - --evaluator Builtin.GoalSuccessRate \ - --inline "You are a helpful HR Assistant for Acme Corp..." \ - --json ``` Notes: - `insights` and `evaluators` are mutually exclusive in a single batch job. Do not pass `--evaluator` to `agentcore run insights`. - Resource names must match `^[a-zA-Z][a-zA-Z0-9_]{0,47}$` (letters, numbers, underscores; no hyphens). - `agentcore insights history` and `agentcore insights results` must be run from inside the project directory. -- The `--from-insights` flag on `agentcore run recommendation` reads failure root causes from the insights job and uses them to guide the system prompt rewrite. - -### Step 1: Deploy the HR Assistant - -```bash -# Scaffold a new AgentCore project -agentcore create --name HRAssistant --framework Strands --model-provider Bedrock --defaults - -# Copy the HR assistant implementation -cp utils/hr_assistant_agent.py app/HRAssistant/main.py - -# Test locally before deploying -agentcore dev - -# Deploy to AWS (builds container, pushes to ECR, creates AgentCore runtime) -agentcore deploy -# Note the runtime ID and ARN from the output. -``` - -### Step 2: Run Baseline evaluation - -```bash -# Invoke the agent to generate traffic -agentcore invoke \ - --runtime HRAssistant \ - --prompt "Employee ID: EMP-001. What is my PTO balance?" \ - --session-id $(python3 -c "import uuid; print(uuid.uuid4())") - -# Run batch evaluation across all sessions -agentcore run batch-evaluation \ - --runtime HRAssistant \ - --evaluator Builtin.GoalSuccessRate Builtin.Helpfulness Builtin.Correctness -``` -### Step 3: Get Recommendations +### Step 4: Get Recommendations ```bash # System prompt recommendation (optimize for GoalSuccessRate) @@ -213,7 +189,7 @@ agentcore run recommendation \ --tools "get_policy:Look up an HR policy by name" ``` -### Step 4: Create Configuration Bundles +### Step 5: Create Configuration Bundles ```bash # Create control bundle (original prompt) @@ -233,7 +209,7 @@ agentcore cb versions --bundle HRControl --json agentcore cb versions --bundle HRTreatment --json ``` -### Step 5a: A/B Test -- Config-Bundle Routing +### Step 6a: A/B Test -- Config-Bundle Routing ```bash # Create gateway @@ -273,7 +249,7 @@ agentcore deploy agentcore ab-test HRBundleABTest ``` -### Step 5b: A/B Test -- Target-Based Routing (Phased Rollout) +### Step 6b: A/B Test -- Target-Based Routing (Phased Rollout) ```bash # Deploy v2 of the agent (with new code changes) @@ -316,7 +292,7 @@ agentcore ab-test HRTargetABTest agentcore stop ab-test HRTargetABTest ``` -### Step 6: Cleanup +### Step 7: Cleanup ```bash agentcore stop ab-test HRBundleABTest From aa073ef2895290077a2fc6cfb98682f2bc15a473 Mon Sep 17 00:00:00 2001 From: Bharathi Srinivasan Date: Thu, 18 Jun 2026 15:57:39 -0400 Subject: [PATCH 05/17] remove step 0 from CLI examples --- .../03-optimize/README.md | 23 ------------------ .../images/observe-eval-improve.png | Bin 0 -> 235145 bytes 2 files changed, 23 deletions(-) create mode 100644 01-features/06-observe-evaluate-optimize-your-agent/03-optimize/images/observe-eval-improve.png diff --git a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md index 8f3384462..58e2ea266 100644 --- a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md +++ b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md @@ -77,29 +77,6 @@ npm install -g @aws/agentcore@latest agentcore --version # 0.20.1 or later ``` -### Step 0: Failure Insights (Optional -- Pre-Optimization Diagnostics) - -Run insights before the optimization loop to see which sessions are failing and why. The results let you focus prompt and tool description changes on real problems. - -```bash -# Install dependencies (boto3 1.43.32+ and bedrock-agentcore 1.15.0+ include the insights API): -pip install -r requirements.txt - -# Make sure the agent is deployed first (deploy.py --name HRInsights849 --region us-west-2) - -# Generate failure-mode traces and run all three insight types: -python insights.py --name HRInsights849 --generate-traces --region us-west-2 - -# Run insights on existing traces from the last 7 days: -python insights.py --name HRInsights849 --lookback-days 7 - -# Run only FailureAnalysis (faster): -python insights.py --name HRInsights849 --insight Builtin.Insight.FailureAnalysis - -# Run insights and create a recurring daily OnlineInsightsConfig: -python insights.py --name HRInsights849 --generate-traces --online -``` - ### Step 1: Deploy the HR Assistant ```bash diff --git a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/images/observe-eval-improve.png b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/images/observe-eval-improve.png new file mode 100644 index 0000000000000000000000000000000000000000..397d919be044ea5b4ea32a6cee314cd9c962c6d5 GIT binary patch literal 235145 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

cH8Q&+Aux)(f4NzPfROTTUV?WOfJPF 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

~ z6yh>B^zxU#qAjxMJrs|E1T1EBt+lmw1~$Ojp8_%AVs?UGzwWm#xt^ zx;<9ewd)5sXp>0IH*Yet_de#^I9~cwUX}WD z0lYcrJ0Gy*kA64M`O*>=@z38umcwTnz5;kxK74j&^bjFTy8tLM|Kf=EE_Pe4s*y&S z3BuxAgSe|&`y-RU)?CHLKfDkC?aC+U)I z67W$p17-MaVe1NKVQd|jJp=6CQ{_ERjF0vo`b?LK6GFOO6sDMLnl@E9NUfhoo`Kp+ z2_90 ztzpA2=s}xLQz9>X^VO+q3t!T!SY#mK8^hamcXG^f|8x{sYWq(wx2Yb+6~l%&THG2g z?lShJTN!hKIEyaVfSV(h7+-s+YHcyF&YP>9CjQD4mMr>O^x$d)lnKCIN7C7&m28maSi?)$Wv zdSb@p_X+8}!Gr<$CJI(s28G^n6o7==-PxN5Rwo0xTJQ$BEV;c4asq;&%zTWJK0_Yk zNsSoMPzY7WkPui|_6gotyB>{+uR8(<_XyDJ0A3&GQ7uvH6i^FUMzLj|H>faFeCTVo zv-hJ_tpJ{%it%)U%@ED7lAr185j=i+wOyTQkR-r$tR{HFs7{#29rH?n^*+D|4#%`Hfz$oc9M4RdRN!)D0h$b0SMFMzz zgUJ}mGJDgw=^xcQcsqd>@$*WkDz_qZsamVYxf~kN38>nZ07<)dyx*#UxTv`s3ZZ5> z11T#x@*7P;V>yrOJn>~g7JCKXa8xT}$AW1Qv}*ay_mt&>je%`4w|7DNkXO)3nHu{v zpOkmJ`);4wXCxZ$+J@I=(8@I?tAk65<8WAAib3Werq!u=!ktM_SwGW~nsxHUdPm@t zKEf{2N4%yjyY(Uh$wTMMA-tKED}6eH8!(M2FKGF0B?}&^R_Tw(7uEWZJj z*~o3&-^P$#RMjwhOIf6yU0da(dFGAI2$QxoBCp%+21LA7u>f6$1YAe1*~9`2`>~Dh zhF!s5iQ0m~HL;L65BqD$ysv;|Pyhijzs2mY<}BV z4*6@BI^?g8#FYM)P1F(w?dbp;E}-n@(>)hVXxScpAYrRu%{n7HOn)mznm|lL zwfkz$AosTveA-7bTmQlQ}S;sic?Ybiuw-k<3H zUju1ks!jThU`>wy0v)TR!zSVuxPWKr*mjl4?$%PO1zv4sA%!G{b1ee%Q+_K{L^Y^X zCpaN25Ybvvnu>CKC`S?Ly(bhQlu#6u5+F!P=q*49X?KI?yx;ph&%HnV7h;~h_spzW zvu0+gtFA2LppjLLe|~A@mUobgFB}NwojKVw`Nu@2mbFnh zRjA5T&8hlfZ-j|NwYGTViu2L%Z~?#Hq3eYHf#cU#=9q`Bgdn;^N%$b4CC}_fcHhVF zjSFKRg;HAO);?*3;Z19mqvPKtS==is+-IKC#gDpC+waAT76R#F)*!?a<>Q+gn2y0L z)53nRjy_@p)W%D%|0h}BF$uuEmQn~;9Sou_N%cF%Dy7X3STF+E3-I~LV2myR4?pqsrLjCxQM9#oO7pxxIaNGm!(hIE zy90S*F65tx)ub;|tdq$n-(9=k%UyzX49~qe2epLt3ijjq&Uq0wW~kj60+AI;kp3_v z0%376G61YvSaD!m>1vHODEO{0$P3PCCRBTt%&^XexP=_Zg7##I~e8}N|rg~REDQgP4Evz4|P~CrF#fg z6nMl*s%Y}f!w$!5GX{Wu)w!>)X}Vb&J2$8j;Vd53^vgl3X-*|r$whbUA>5{dEvos$ z_g!Kh45Q_@@yB?BVIyFlGrD<(9OleY~GP06s9A!k-ERLQYS~-F|6;6 zJppMgpgn7${8QKFb#x%LE8fKpUSs%AMXJG7X~gn>5-l^(MyfV1JJk!NUKVEuqi|Zr zMq2+Yrom>EbuM!L-~$G#$4D1QS}QOoO2yFLwHAX-v<}8o=x`fwmfG5(EC}j1avF#5 zry8^MhHkG!s-mKcA=E+WsBp z_R9OprS^^#QF2M0rb2!CDtHh-=wvhSr#b^CfR19H%f_9p6s8NLFt**GA@M^7Y=vcD zhzNk;Zr9T5&n6_tu#GuWI5^xN%nE=qTD@is4m%zGm)3nG5X6}hf;nJWCGkl(1|HWn zxbADM=Q)LDRe_xVyABn@lXv*9djv1K8)I5$^PUJ*H{Hj*) z{~CF1EGFsK6~iav;!^i3`$|YwK@fiFX_l)*=&T7S0HH_qFV^($vqWUkTa~>i}NG7L|_Ba^inAhJL=Xwj}e` z#pyB&{UazZ;8^;S6R4AJQL}$|q&(g*3{cdG(!(9Z`3t>BCY3DyaY#6@g59SBCogaD zPV|Ss9hvBP;GHLUQpa2dP@|xrALzQ-F!Jd7MVk2hUDq4>4^XkR1Cw$?dp1c5a9nDj z*A08L+_^P zCR3*Ko-g8CXD)mb>nSH&q+d@@5DA@kaTwM=2GP)jiii3X7xenO)<&${f0B}r&!f=X z7AYAvpYyO(RkZ(^&hOM3>HW!8&PGnlGPfEcn?fz31$BOe?iXhLgAd&dNOqujOv~mL zEK477Is^L!=FDQ$AJ=W$w%z&W)l2u+@5yg;jg_5uIoqOcR04)SibUJX?Nis;extI4 zrZ7b5nf0fx+jwp411V~Unl~5~gsjd#aA1~o)zWAcIGvq;Gt{k~q5fiS!Cr&`cv2r> zRWj8sJ_sTQ3C7x$0itCwNW6;idVSq_$XY%vUr!SXoB~JT; zy047f7Gf1^pxP42W1Nw=6n|8pR`=<%ielcqjxsa zPd^3kk#7@o^LZRz)ZfHo=sc=4EENMSeC+uBg=EV!0qs#kQd2Fn>zd%9mSFMZ=&a@& z(E9cPeCp^4K}n*Uw3>MFL!J6ds{dr6`g4Ugo#Yqy+MqkyAY*I3>?F3M*Vru7ldyWn zrs8+sjA-wv+|T~BBdDCQ!)K*UgRMguFAdOdzFa>8=9g8(J<(J_NUOQ)sP^;nNqRV! zs@n@j|A1;rd&a)zfi5?QE%%j<9rSJqe+P^p9rqf(3>;zs0jvW zYv}D>)t|dAEgtbhOuep~=azGHW@&>#6-u}MnRb+S`O!zl)XtK>5QCwR7bi8 zY#R_ir&8XVhJJFC(aOE+HT+{WL1|vH*~8gL+WdS7@~UI$@fn1FX`(Rovw`V*m)yC1 zg3UB~%pEJ)!_+lkQ(B|P1IDk(`hoJy`y9~v@7kp1v8Hqsvr@iE0D)4&f|^iF`Z)wQhwD$MP_`iCxH{6J3T7o?rCS%BZQxhnuG zKeA1!>NJp=myl;Lh>ux;WAvG|AHx3hMlf)aqYHIr&v8aV$U&V_!|@cSYy|r6kd^!k z+?+NP&7F#e(H~O_Aj3ba=d>w1ex9p3-rLyq zWA%zRb_#OsxOUvF`HHR8K9!NL&7{Mhk2vV?f{Hz7``)O5&Bxfiq6Am-tjUocfVz|U;$ zc2RP_plaa%V<}yHQU&MJEWvCFp|_AOxOo=XUo4WZMO$|6@tWr^>p?sEkNWCSVSNu< zNgJ-YyI2jK#gZMdAGITj?BR{j2p*j|(~Atf!#@<1La0#HFg+!e*jLXd)p|mGk}d2V zT#`^mgl=ZC)Axh{wLd;9RQFShnL>Gq#yX6&igg4&(J!^ZpHI!_-SJ52@_?agwk=%6 z8|oN}xaDI`Jh7_wLcHTZM)J>qhWLm?<7&rtQ?DQ;KZCf9_x{oGtS#SQ*Ge?nwEt4vzSWn!Ce&L1Qu}-Ox z+aVRdkjs!>0;GCQm0T{|pmSQ9^$-8ot^W+o&zz1NvS5>N&I!_f;X2|;2%$HSkLVdRSp!5!b_-79 z8)W2IwD+&Dxp)U@M&IiEXEE%N5*WHa970aQ`do>(hZX+meyQP{u`zL5W5CV`x36G3hvMgy>{*NT3(JV!xm>` z>{cT3)x1`t4vJDRASioG2WfSN^zMBe+#M;;zYgA1md5&Xe=fevI7uUqC+ZZ{_OT_V z2=!5XIi_^2VZ+%ugFKWUzV5NkEih*ytwtKAWe?m=bYr-g#3`pPBKK|l(DhNUJ1sDC zepP%%Y(uT2w`a%mB#YGF0UyG3?3E>?t>3m~2BNqqbbPX3i-0|vSP3liSHk95W*Euy>-b-`X&irHRc0;OL{ zjY{od8?XGoW1RiGERidRBI@Ekt6DVaBNrEM8=J&U3nhoA-z+Pa9Eim0ao+LZ@>wzM z^cY4(i=5MKXkHvQIAO3`&0(&8DLlmEl2(QiW#F|&=gS{>4{`P%JDT&8LG>6C($zs%Cf2PFU|$VTs?F500_O``F{%E7b0#a2t8J%j``- zjV~9aSot%wYFY1rWs#QB3vzRCK#6$?9!i%nQC>r z8VjpLLs}M{eRmzR4jW5;9{&Tb?nSieUUwh(Qu9U05XyFcf8iNs{d|eC9_0jTz@>1X zu+FpHeFuzG#|U}^7>FNV^#_I6zeA~yCZz+K)Kr9;+)C-8&T9Su1EJ z@@(fPXY}TtPeF6ej-CkV!PXnNG5PO9MkHM3=|jtMUte_Ja!Y-$bVpNLW%m!(sc)jq zkh{STTn`UE3G?JdKYY`3Y3pi#oHDElEHVP3bVU^Vrg7~dvnO^JH+}m!{~{O(!bK4* z+)hmS%PV;0-y!2>W5C@=XI{fTzK}b(+_Lysdy>N!2qW+CTv__z!*An&|{4@ zcaAglYK*bZ%!u&h%U=f`^>D;s*r%_0^+9O6Y=Bdw2Bm%|C$ho4!xn9z)yl_su|ph2 zD(=_VH%b!8NI7%NZbxd{67kccn!xTxeswE;i~4x3HyZj!TKVb?K);#GPZ8H0_fQG& z4F8Y4D~%G?NEwIpQs+gv@OsGiFC~(Zagd&Ruce#)uRl-SHk&S$fvqh~oI$3l8o2>q zt+Qx4v?%o4;dFYZy(;p|r{fo1sX#@jUFF{XN`fUixc=M#{PIQ^5$=$YnVs2w|IpGoc#}w~z-Z-4;_@3}@#-nZ zZ^7YWlaY@sBr0xZ18?#+u?{i*shgXK`-}q@1DC(+Ef_gEXdv81sKli+PV!5-ET153{=;d?k z--mrA+CfLc{Sqf&9c)Vp-y(9m|&`kOIA#hO9v7MO@BAMQ`+ z%N~Lk!}S0%@8|_FX2kxoh_Z1zUbfh>p?9DRQM_7^#5eOnH0=yk(Bx{ycNL;=*9=rh}dhFk9JkxSg+l7Hf?j)NqtVJ zKV*x&{y7KTsy<=@%mp{SdMDU#+bZf>j z;xBB0HAQ}2a4B9%o5{$MQK3Y~MRm@1F`{Lz{7BmCPh0+W=wz*cx_@4v$NTKS4<4x_ z)voDaLE(dZZovuvQ4@3DW>XqAo%|D{IjlAE!lE%1e*gEw`koVxnT2Y-MxOvG! zTK|c#=Q?vDa!DWN?MVD5Npi75^Zo|hyUI18b@;&j=`WQSjJzI`Be#s<9!rvPI4OJy`Ckqocs?N*cHLZ{ay_at|`b$ z5#|bPMmQkojf)e;QbC>4!6qqqUwvUYw&aiKnqEqus$OV0YQWG`Z}Yg;-oXPw zjGpvr`NHjx$uTy?g?^IIvl&f-0L@Q30wFv}B17#bqM)DIqLNoDbYkU2MY6QB5?g_yv^ z(rwiklXuRUgZTwB8uIty8c>F)YpQ5&V0ZhY+>Jz&q0{ORB=x3;%A_%ve$X(hZ5?u= z9Qw~Ko-(2PYcu@nC;$1n>1r?9ZpHziR}qR6aUC?yJWo=T3H9O#1pkCK+VAlD4u;IG zJiN~fZZ1un*N2PpGahtZWeljYzRP1K>XYaR?mj2xiMX?mxa92eJ_n3}k!LXt{z9j3-6fR-TF=x?`&kFxxBn8iMhImI?f4r zQ880f0V|-C^niYgy^KB1kz@Ur(QW%e&}~aITv?*7HjlVM1>_&Texp>{*_O%oQwS-a z2K0@=nb=bJYskp-iJbPk5C!mp6KrJpDR*c*vhQEsB8UugQWb*q7=4Nori zqC9&{snI6wsbgh{ob?xD?e?UK;NI(uD;oPMXxhiO)5OlkkHx>)9Y}kq`DcHT=fbGB zH2G)L8m(Y$qGc>3rBC|O}HQoE+2uJx^(N^P?fH!qRSB%*&(=t58 z&AGg5_P*qT?Kn2OF%gt$Ui*w!0>xD%)2mAyXFqc26F6C6_{KP`{|qFr_MbUx!@Uy+ z!$9y#%u2Xd8<2=^f^^ZlCE{iB{6GZIl4EvsPfn(KY=5fg%o9{`1Wnv2B zg$zA;CC&reQ_Tp(1{P_sioI}~wrZ6dD2#r1*oCsQY^7?Nm(Q%l$VvqLxC{#>gR@|! z%HlIbLJ{owX!gfU++SpT@$yz0w#?n3C{zkA@O#G(i!Db?z7GO@h&fm2BEr{er1Cj6 zgd%mGVqS>fOt2DI&iuUVAm4Fc6h>ifhGnw;Na&P5o2N#lkS~eOsnP<{u&+O)r)+Fx z++7*mYuNF;;eZ}yqe)~rTx#Xz&}P!LlxJJ2J^bXgnZDuL^WCag?4N4h$T{?6bxn5u zWBsbfHw<^iwk?_5^@NPf_7$|De*pOAeDwXP^*a3P?|pHK>#Hxp#T(S;8WtfFMTJ_h zNJ|d$0A%93*95pPMFrkz$jCc+RWmMIQ^u9_$L751wgwDpRGa37aAf~xG7Wl#^tEom z$4?qiX`HovRJLP80?25Np?SO6uZ*5yfIB(J6n<5>O}{9SNkg@Oqc(%pUNXM6bwU>m z!Q++#pFv>g8sr%7%^$<3c`q3xw_Fd77;fSuf3Shc_~CC-dO^`HO)_s`5{9ePgf0^ZSi%gJkWg6Myx%y;`!7KJl4? z@9$0EqqMAL`66C)|8Qz~zFiS@Q1caz)mE02j4OQ>FwL24-8Rbup0_!#&f3z9*#m8Z z&aAZGGq<@Iqa4nlcbC>pHhWdOb9hSn3X#&Sg(9E7vb$)Jr#COTw+(<JU%Ertusg!}WR|8uqWb=a&3>z?9qq;6ik#q>iO@m8~DI)fP zRJ_gmNB8ECvqLlFAzTSO6~{SN(fgBcZu0Y%f2^(MM;bm9TAzbySf#GLH6shI85p)4 z98~C0pC}r^W=$9v4*g{wutVq#HSl|kdF4m`=@1Az4fVBaFy&xXs4ciB${5DiK}WDX z?5EylegqC`iGOfa(<{M`T?JSV%KZ7Vs%|eSmx_z(xV;Y)yaU`XyDfO!n#h#E$=tQ@ zq(FD|_#4E4=l{R)O^v_lEKr9D(6gpO)HQ(o&?9rOcad8kE*-#&rm7K!joclr*JEj+Aj~|cmO#X) zgITLu@gI{ax9mOYb1js)nnZ8MXxT||x;5Li=WSsD1w!BZd@icV(Qt|) zvu9@Jd2d&31j4r*>{sq&qyI0rQ$~5jYfL3On-D08la!gC(&n4lKOubr?e<4wS$n7a zFRP~jQyf}lLPkERn`-23`=S5VDD`qCs@pa)F)v^#p@N7r8(GS}J&~dG??kMZW4sKwS)GXefZV{oeT6+=t)IA!_J>L2TxFCwn4 z_6;B`AUN#jmc}=ITB=sHdP^Zaxm&<5mm9Sds!Ld?UWr0X=gppz!`NVyABuNEPT7yG zx4*@3Lic#IcS@?nvj>;RT%wba12(@5SX*}YT4cQ@UizH04|N|EO&Y41BEI@U47&!J zWy`nn1j>eI4AsTin zhUvM$*Yb3z9DFXZnGrVcn0B#N&+X0QO7EpAp(Vj!7o|<3fD3KsZ@|BPd6WB#`h@l< zM2l|YfkGHAj#DH_mXLwszpuR3kRSP{d-*d7F!GVOQFV{sSDI*)9eIo*6)GRjtC?BW zn_`Du^<+&<8X`Wiw(JOmFJs*LLuvs{S_R7b;wmBr@0mn+FkA6MP93q*B51}{bJcdo zPLS_xlI5jpb`xaG-m7Svg0jUK&Md$SS>pyV)pyxfTQckN(kFHQb=yyEcmv9q(Ox9B znGHif@%5bWM5!D$U|4~r*5XowNJdO3MH??FP9=$+>pkB1*1%4oz1JigpkNr^`6l+3YWnCSd%I%KhqK>?liJtiAxK8U|{GYfMW}|JqWQD@%>D&QB^(4&Zpw!0pC_GZlXb6~ z%@ZFFuBwX;s+=+Od1?B{2qzDZZ()VExhQd#`tgaOI;jx7c(do>u)nVL$o-LP2G#w8 z^D)lk7N}qS3Waj71%nw^?$rGv!!o7!xikx?`wiY!FMa2gpP>%;Sp`5AOEGtS>%(~2 zG@@9PJ=6ir1qTIo9zK!J{41s6@v0GOE667u@M$q}Q57eu5spKKCn$d8xoe}Ge(#<^ zb_B8Apt&aQKi5T-&&S#j49pjwd;F#o+iB3EjU_P}S8?^BfW}_{U$M%P!#ajzpJVFi z<4rTa+aGjl+jZ1fMIt7TSMg~tD6%UIcf?Sck(2=HQSQ4qVTD~IYkWL%G6x=T9T*AR zJm||7@2DE&^;5Yoxt*)ZY~qpDSg&A%r6YNWAcgDtK5htGQ*O^^&D#d6F(7UnjWHZL z*c?$UXvwHX`yOG{omBv`y?n|wWP~nyG)Cynywbwq z!Df6+1LLlw)os`ep&=)!mGwFDB?CL(h(;duf$0Q>%YkruH-G>_IBEjohY8#g?#D-r z{GX#gx%h)7sglP^G--cjJgZ1Urlk-oqUQx^bEJpafwGX1@--IHJXLOgwHx5FuoW>& zKNikk7242qYZbAU_F(5l@p3okVgE)2@3%lg8ZAv6N97IyoOI{pzN&I(rmBJuPa*7( zEe!1?(lA5pK@ze_=|hrDml)AVcMSQI7^39j7 zRhMe5)9Z7jpPkc?N-thmt~yDRADPu&C0LAFafiQubHCM$hbvF7ykJPq?zx3bVd*Y0 zsNz}%^4C(9nsWk-^TvdLfR+=r=9kBs5BwJyL<~pdF;E+G=0C~pG%cHW#P{x5iOyHs znveWZ@_L$QcJT(obZ3?PE_>MQf^WMFwRb_?!F-)4m#B%%Vj~3a0|VYfB_apbgJDps zVNR7UVFHKvME|1MB0=(zJtaG2MURcl$_pGT9xD!s+QSTiIuT*S-f;WRtpDIb;)BjcTy=i!aYh7jYGnp(Km_`~0)|}cFN`RWDAA><>DZfPQ?n?fO49hL+s6Fkv zC@xNZwQNC{D%@xjVtZ=gJc46?I;b+n`PJQ6Hs(2jmay6aHB+Z{_MLSyfH#jl1OCNEW zprs=_k76fj_|B+Om6t8KhrlgwGHW)*BLbMmY7oT0Su$7T@G~j)ea7s!YC&5aFSG^r z$S$%6MYJ!|_=@G)Ts-vBbKD%c-ea8kC;4Mac|c>bac$;oqfqNBVml|WIxT0A@7{*I zsLU+e)>1b-R#;RFf4d^>_Drq$mkQdA{-p-e9(tB9@ zo}*`S!6~b+BJfVQTB#`do=u=nBj%>&@yv~nERSXHJ22G5C6BrfUddqrS^C*Rbmgf!BtS4 zIu+^*wG=CT?2HfW;AOu5EY6FUy%-xx@XOP%NOhmsMV2B}G(b^n-YUx<*O2)^Rn%9W zDsBPMg(E9gxiJu{&KjRcraYVQAQ`$Q4xdKxN@Vqzm{;29Fy33jOUhg-i&81sC;pNP zidozXOlW9(mAPM^);w0-6t=n;#}aFI5nyWCx~P40UvFe=N-Zywht zBF%5mx$joGCx`JJ?Nbp-g3m%q)t21Abgu({Y+Bt#Hg6AIB72XYht0rkQoN#$)1 zKL*FLzu-RV$^I=aeC2LSt94BE?m{vX9%^%WQY0*3`fz6+k`Wsz5 zyeeKKVLIEW*I%gR1%8YgxWgqGv+ZN4^s7{2v^?cUn#;`) zZ;fiG@FVaN1tRZKL9m6KAewNB0R&;%zg0$hCLa;>GrfE2#yl}5(#V>jGd#q*zVQSJjJ z(ZI`&tA`EpozcF^M}%SiFS1XNb7zZ-&a9(wh0n}a(I!^Ef+TH7SqA4dXIFFo3#hj< zYcbVJ`G}b;!8V8@Eg@99E_eH0*weF7fCo*(onl^DxM0DaL`kbck7O03K(Y#_{_~G$ z{%lDV@&puFL@!HLB}B3}c9BcHqad>B;@4@WFT1bs`Fv((X1Vf8WJt^%wdBG5xeYdC z<3kqTdrK*!mN!(W((E=j@*w9cMZ+uXZ#_X{Q?W5@A;@f~q<7|>e0U>GFe4s#4*iBL z=vIl*0y<)#CBTpK?fs9eE0$k$foa*8vt`Q?#^9C!DP!B5;&-LAt?IZwepq{{LJ3WJ z{aN_Vp4ZDtGCU{t8KK=9b27HkTbqs0%QEl9h|3zKMlQ$t4w^e*;*Er?))!;1wiwU? zGIswChip=#TB7eTeDJro2|sJXNdB+AAGJo1qDRaB(xT@YPe}{!SJm|b7cFPb2~wf@ zf$Ub&{+Bg_3&7GBJY+WlDz@A4R#WLg?gQun{X!;*h)#F9))N-`r`Wm0b+z+mlQV6yLqhP-qe1g=Gf1V?LxSH+js#H z9d+Z~G1LElxLA=NLAwn+RyY$UIQI6-=(V23n^vDPAAWnro6K!nf@fznguTB%mKci~ zY1eJ{vzpj$b~r`$=HJtpxI5CYY`Ae6q3*xI@=B0Kb}ZS@cCDRhd8{V<`9;;oPv&op z%#TVgRr{I;tdE4yhvJ7FbQlHCJ*GOPT%;CjHYUcGtm_xMa$hKaa#RQY)SN?k9gU>|w0C=Lfj@Cqikr9Sktd#(OW z@hveEbR85wN?|5yYHXGgwOCZrW!^g#0IlnPfAb06HBNmF*=6{7kJdP!cftaKDF{U= zcSh`jE)r+JYR;!aTH^&(?ZV^7@BfDcPKf09Hmtp3bs{~7w5AJF$OI26$5WcNr}%;Z zZqxz6MPU=$ugx16ik$st+6caMo!(t(tW8VPphatwKgKt+!ed^o#r`=Ll}!nHC(Svu zk4ufg%zp^8aAyQb$__d^OF$cc8P^`ap-2GPWz>znq|TEC$K9sqk zR=V*sq&yqU-{7uj!8^+Nt2Bkf*vy8p?mF?PWKn8Ve?h>m18! z)e5LWbP3P4s(FnCJ+3>!(ah3bBS~T0RTMF|}Oi27aF(XY|ji8*nN}g*U#Xbf5 z83r(*?z(pC^zhcre!jF_c4W)S2*)12HOehtJphpN7QQ$}R>z%M*f~btl&tO7F?EZe z=8k7+ql$hFqoS8{5y)qI%cO~p=p+3Y( z7I5ZxrN*kcCZPco6Ogp@m5-M$E1Z3}l|g>wN3xA($UH6@7VKqbT{9eXamReztg->wrajm8Myu<|whekEng-0|c)*_z zO+b|DNR|goz9Vhunbhgdo_X5huPPYv$)RuQfSL$;ETZn~)1X~eC_m4c5sgf&u?1hJ z{XC;0#RL&O;~3_YiO^}7PZF5!C0qaR?8!=D&1K^?j{0FOQ`)V{VL}`X2cnC(9`!R} zovD&GKO{7W;hcPmY!%>b%H?D1dN=l20&O7&HT(1yH>Pxp^(3If##?@T`>MvB8x2n8 zf_R25`tIoyUY6BFZu49H)eI&5CH$+E#CRhYIAPB=oXq=6(fJiyzBiC*^-qNaPNNHO zl1=uux5_5=+nx)Oi{B|MaQpeG9T#{j6_2MI)Sa^4@zoREs~>idvlbbdB!pdkO`ndB zOcZvhYDcevT3)J9pS^x;=xheMaww&{MgG4`DBwUjodZvR1b7WG$MC)F&}Ijg}U)2iN>xQ4cnYUm!dkzUU82Idra^tvRI zY9~*cGKgL4-kR-Y{uDvl@rj#dWwD+{o9_##0gZyfEt{BaP-$fj5&=|{?C zNdE>THKi<>uQg287V6$R?%|{%t=Q@P_MD-2<;ZtAK+*01N+hA}e^xHNZ1tn!5 zbkP@LZx``mS~?Zs+1=&Zo&F=1bme=T3Q4fem)4WRC|?6RvCvwW*@#>dsBBvO^HnE=*!sPO?x7&V-FoDvK{j zS&cHA@7zI@t{hrYs9f$pN6Bm2WY|COXSZ1p!-=2~mQQW^F;09D$8#;Nre`7so&A;v~KlW zZMo=&SA#5u zy3?}Jp%pkdts#A1FuU46{mqHaRB^9e6K7=b^m|D|JQ)4Nq1$St6COyq$iUOT@flq- z=U}C(-ywH=gI?7kWC|97X+c1B*cU|QLy<7|e`p(`sLa%Obdf&E0^(%W)9>^=mZ>9Q`{K`~QC_U`4Wg)xT>*y!! z?n|lzkc8!nLS;PUk!S<+hveHyj}OqQj4qUd4NA~KzFS;DfEIf?YoMX-rRfI0bml~Y z!$>^~bdMNl7bS=#9aqB@m)7CsSsg#V z*`wEPml2UvRUn3Ih5W%eSAi;CcG>Dxxfmx(ZnUxIPiQHvV<<3dJxr3+fm=d_S4=76 zt#*w)r-q}5ilHvCM2Lyr-|M>{)FIMW;E~LDvAE_vU^DMoCQ0saR~V347G?{ag+{bK^J~)EI za0JVY6enlF1{Kv%B|iJqdi;Vu+8J+!B+uMH*1q1QvVI%5Jazt*H_=8P%kU~Hnu5G& z)*{erKVGe$yCQC@V}Q0{Cgd9du0=|$H$%cy^Jvx;r2f3+xPg&BOJ1DZ)xI2{Ur>HZ z;Vi0Owvkn-5$R7e2cG&GxM_405wNaNR-*5m5F@ zlnBCo)n~)y-W1Ytk!(f#R~gMF9wpkt(!6?*yA^_MPo{DtV3 z>dQZ=>T5UNJ=s-SrD`3|bV6^l9?u<$Nm&Nv=$Lud9`Osi-5RccD)%|^y;nvk>1U({ zKcVW%SD>-e*{>NtmQlXJABA~$9;C)Wgp5qNM+Mr+@k)N2gB{P()EPYZ$K96ZsOje+ z<8pg|Un=LJnjZdkJW9-zyJ=!kug{Ed$scbo`tvD%+;CRmDSxcX^~gY zf?eO^jHMT*o6p{EHjr@F7#aoIeEvJtCCtdSKl{@(;Uh03ZuEFtHs>4Vg_s9^8%mtL zq*dbk3nKj{9(LKQ-QHMfHSC9{2A&t{`u0C{n5mM#gj@B=9in>)IA;UTC2`?%2JTXT zJrS80EM6ZArtZR<0lMGuBt5Bwn>)bra*MGV?sh=$!;5LvBK^cn>O-t#=LS9Gr-M#^ zcFIA4@uatFv7-Fj0asHIRD~Ew0Ge1Z0YGCd+&~aTHykh$N)s}L0Jos_h%2KJm!oY< ztIC^&Hu|Rxf81RyudjKe{$CoW9^EZ`<&Ilx==XEiQS|q1jh!Lw2W^et8VNS7o-)qH zTytN!c>8CjvcjGL=AsFl50H4nTp}(as(mQ?}cYTI;1|c9?t(fnoxJII!wT{^3U6+MT2r*&yO!xok{bb6&587 zU*x@{x!7|(&9Wq8^yl*E4u!5D`>3PqV(-PqR>Cv_c%Dh_O{Vzy)BJx^puTSWtv~7$qd9YgIU7qxktIoV4b3hCCZ7y0abF((N`GbO84v+2F z;(Y3&%Quhkf3raGTDY;rLvfArK!kiUl9lWOI^CUD?QMa5DO2be152juRe19#1(7^j z*kEcp8x|yLR{kR(SRGB5KhTMLRO9&&?X1E2yWC#S znge~<@r|ItWO7Y!@4|U3s7EM9e~h~Nh4UBKm&iWhC#tXBa`ISc)z^Ic0j5~|d0*9T zoRfmc>~{hglF;@d!Q-Pg|1rD$C;l2D0eSKDvGMM%=3$u#@EvcTYB7BtZBdZv_3rEw z?TL9N8mk9iq9Lz4-TL1v=x=YIxWuj4k#+-`8_m5WxWx+3h91G0flZgg{G%WbMg#*( z?2iH_IsLBDae6+EX-eliQz#pvwfhI^aJ2mQeo$>uoZmeCrxN_d){}+(V?JsvEMDh| zvU_NFeq>Np)bXhG?c?yk7M+KRGZ;~-$1hU3hT97*)j)h-Ud@1}8;+N<+Z6Wa^Tso$ zp9*vbR8*KY+d9IeziC1UasJ5iNQlopK+-wjB3AgFNo;43!`T82vhr*mPcIOjb_zVK zy%`=!7t=((YX*%Gn(ZbB1&`oBlqJf?QB|l~RO)uXQO6*?+-~ahKD^;LGG85x;&BhK zK>NE5JSY~;cdA?EqJC`hmJo}0^f*eD*0;0BspDSO;mKybfnjCIrex6Acpx6bH*p-sr*uwOHXs0 zFkV$xTNauG>{{b@_IIM87VqY$?$bdlJPQZM1OlhE9THe_!M z+y?G)69Z0(*l7+{6?S)gy-U94trK4}JqjF{=u1K`8+nv9(EcL4*S~pU6i=SMayY+z z*zj6dQ})H`E1QP5PcoS4bq!F|Kn4;xE=Mg9cTx~q9w6aj5wW8&!KSDN+v~gfUdga3 z5!##Kg#nCF-N`-Qo)?Yw4a#o*@ao)wvb#7yu-^`*@?Wlz+4uhcu=U+xO|8qo)=N|m+bu$L`pc1F~#vL8y-Z-L_B)Xw z)uI-dgRViHAzSvt0=cEfXVpp?z$H;n+Z6_?Tk~221kBH3WfI&7n-_*l=}q>< z%fe;N>zd0WK;sYBh&1>nhAwjjZWfBUx*Wec0}FlQPHek6&?X|(Y8wgt+!!h^@*EEc5C#-wD_4wFYPTUBg8 z^>9S5Fpza{C2d#mXpU$lTzr)$xGEvXN;a#+Txu&u>K;DWYrx+eC3iELXUtO`%Wy4V ze8iS*=75?TgIpRD#((#S`Gea0r=sr8zLbc92l}YanrECKnQ;n2D|vgcTf*(vKka)) z2k;L3k&cphTq8 z_Pll{zl^EDNmX)!^lY+hra3u|0rV5h*zd5GK7P>JAzZ&HHcwsBkExHg#An7y z@p;d5=&}%b>F_?+wd{jC3L%!6f6F$?5~A#96Vs$? z4J<|BcWb=%KhdyUM6m$_RBB=GYkQScOoat_B{uOfHD@6W&tnD_T?uXu<2rDs-N3K4 zDLsAp0KAnwW-F*z1^Wkft`(>%l1sbHday+g?PH?cf)}IubY*U+ike0?Jj8+Co=A-3 z<%;6nfAb0tS2H<@H#W{(2+=KMf)xvcRNY5cW9 z@cP>EDDL!3hE6l4BH*+BHj5|LAoqvNFjQ@IfBPyl7tR4aH(bNgp#wKW!kNccGIT3v za;waf62JX9U5yvVcX#hU!*3#l6|nRgbM20zW)V}0zGcRBw2gB!7)83>n{*q;moBm} z2YLb#o$Jw<-vA&FEw&*?n03Y$MP;lZGz{GH-IE58s}siNUm!s2--;*MdVVKOLY^s5$PZgRK#rGaT6QAm7+@xw$yL@4Jf98Tkjcs~owK4f}Zkop;8Q*YP)7kXODr<3iU`~KXI&*3R$6^_+@~=tRdq(g{vptuR z&pk}?9f9Yg(BUuMVj*qTpy1wqLK07?fB|9ffGm~DT?KWFP+-3tP>hM^AjneMZ*$Iw z;Vq5Vc9Zt67>!i~nD|k{?Xr_3?s%PU37EP94u}^Nj^_$TV6+IvRNudQ4~fD$G!y%6JOi2c-DmI~{86SvZP(oT*ndAf05l*<`VECD{r z-v7{05Bb*L%>V2HID-h$G4r|qTFlnkU~ENqZm79I^N`f4B%J-ISFCkpmOh)wszPhJ zKyDpKuCKs4ut09A*V;*}4t8kxMH@@2;Fy0A`p>R3x1-NPo%o(m2n$LI6cwLi6?Xl8 zvZ^D#fZ*^EcBR$XNC*>T3bL|NdG}-|MH2D3gtO>dr8rpxTgIyZa}*NxsAlGdwd%4i zrP|@DgefoUDWZF4wXfw-vCRFwC9ateE_RM%U0_-S++)VLab37bgz2pKWfG=+76~ke zLq@shL8+Jat6M5Xk*` zNM7pM@vMFhmc$6k|KU}Ft(fTk^=A$%F{u)L+_n?#IcCTGFE|+20F|Mo0$~s^3|=ki z5s>eb&pE;zl1DyAQ8j2agb6up4KWb)M$$kqQerKI5kkk=61xQzr4cz(I zs2qEkY`*GrvgqRXdi~kk%11<|D3i;fzbVp_zUfS%=A7DiA|F9Rb?n-?)K3 z+`lxCXgFB-fLsd+90C%X!?JMVuuNmmxg71oLzFUKQD_d)6PS{ z=eXV%v+a&s8Ffd0`A-j@&3$;>Zz}2&8}{{a;u5C~o+(+T1JFl5#l*p=mld70onoXk z?e&rf94mST-FNqS1mUu`TTDo|{n5k43f99*K^6Aav z1aAoT1iW|xQ;_~>ZhH5p^5DI8@X~94R-jr;bN~C_vY&%w z>QqRkOb5+qhPAAZVOAA`!4EHepNllek;772_--@j=2fIxMU)7qVrckiO^f|E(ylR; z^7{b@y|$2zk_P+ zjACOvDYk@tAuZw7ARc*B=o9_i{iWi=`Bh8)0nZ&YmiuJU>js%8nr^hGhTOOLL<4D~ zMMBedrz7i|8^Qvj43`tb{M6PSEp7;z=Dea1MTpEJaQew#Nni@@50D=HcR4t6^dArO zrO1~Er*EthV_T3U?`FD1?<8Dt4AwO#xVbj7A)%1MRe*ecLWuZ-NseUFdIqnB&|3dV6%dG3BdaO^$x3 zEvojtBCC92&a#-*uBj<3b39(gY%?oJC(+5|K6xr{5E&F7+G%RaRU{GSmA(bUupaxv zLI5!{+ufC&6M`cunRSL`ABvJ!iT{=bPykv-&=uzailZ>iH*wy?IdRgxA@-j$g@c@Z z!$CstPW(Q&p}ddkPIl1V3XSZe`+|1!bl5cIT-4}jrbGHs*r@l z{}PQg;de6t29do000>)qc1$!_kWs-qgECMs*Y51y@29yCyTMBjSDM;!Z8{O*;X?9n z8H+yxKP%<9pmALrhejDicNiD}HMY5r`mpTZrZ?*>n_ev-CuqK3md||fkX;tgLVC<9oJ5?}Z{p6$1Jni09Gr8l3mA*Cf zw6>ExG&5E-t*7Di??F`jT(Q~kn1s|^&}X~QGqR)Pk`Bh8QQ*JOH=b>5wJFS#+)xDR zZs+!sC4`{uH>Z&R#nWE{*!N%-m5fe~r#&CQVXXg7QFS)@7xDh524G`1%r795cM>pQ zRH?|BU1waBiJ97Y@6UBsX7T0Vz_Zr%=HMlN~# z>cSX2s1JQ8&dv77MX{YaN=j z8VEtw$(glN+ixH1DH;^bZC%Oq&)v|ddXjeF7FzUfx_P4&p1#yiiCGphhWl-3>GXbp zgsc6PiWJ6sbze3tJluO`pbk+-8vN3t%OWK7t<*m!##{)Blj;{ z#5t?PLMH#SM6V^n!_d$cSj&0Vhhs+>nI!v%ZKi_q{7tE;Z_}!7r!nt`?0wL7T@Vs~ zzNvHYZC7k25b*1jp7yX=Z2w!1^O|fajS}m4djDXEQ~o$h^VX=Y?Gsz8Ove&!ZZ7|k zs+O`*plc-H>$Kus>!2WwNaHv9Z^wzVHveo8(dXAPZap`{(kmlnfAWn#da8h?ad0kW z>V0qjuDq>9$;L(?ZF0oyl-huo@;sefmfd6aC*Y^0C8WKUn2JijaJ+-`F=}M%o| zt)Gf4cT~ca?H$#ufG5u?Kf<;7g8$F^WrJ*Dj16eEJ);TBJWq#7&fJGZzGUZZP_yPm zaieA#pU&^hZdv(&LVt3f>a1-it!D8i%0gMRz%-}IO*uv$*m1q;slA{w8TVxa6SJ-O zob#^?7~&BOSTv1MClR`8!QA+{D#kd(AWOLR}CQ>>D5+{Hj~;>ZB}#jbQ<9*IpI;h_whe|R0Sn!n65GM z{o>Z6Laf-*sa7T@zXv}bMwXbFc^*n?BAtzthg^mP7A-%%C`8?5D%Gg?3+VsLjSBns zVSjRgrW}9}l1`gPi%dIR;w5i|S#du8ShGxo)1_YeQL4A;QIS(jC^>AV7I#bZ>CE1; zqMIYa^=32I?$&x#RUOY%nH$f!PD!#-m_=Yje{&SF--ZR8$8fa=35lIJx=|r=@3M_b zpzC3Bh}6*QjgKQ~la`H4K9_1C=hAD_v9Z4d6Elmp`%| zqQEE`s6#V0{)pt0E@q<8%mgT_;Fnx&-7@ENutR~ehD(X!(;F&(3TPq4X#lOO=r#6U z8+$SQ1gluFFZ9Fa%VWlu9wP=3-tX$YXl??XhPl$^{~}XG3x9}Q zO6kbm5}7I;ut|#=@VgC3HA<5u+q<&DE>{E=$0DZxuJ(X={_#9aky*_A2`J3o2UFJ* zbd6QHATwujpl0%_%vsUx(^eXhKe^0Up6=}xHvcnJr$+S_2_|Nbmd?fBq8q(wturjl z!xC8x)41^n=$^qvm*BuF`R?8=PE+39%dePjvC4c3RFTpfgu_Zer#0&@ac{K#4{^_C zgWsJ1MRQR2hQCbLpt7SO3}o)%x1zet?_ojXb?N60j%iyWH+X}1t~tW?>V^<*P1M52 zR{|l<6`{eo3b5t*MiSiwY%N}~BTXyg3H2x+$99_wha9oWy`DR>#G}rZW=5G=Ifx}; zq5M%z#ubF2Gkw;mN4+Q1`gxwvsP_-&q!j+cIRlgNIJdCK0G#QW{98jTh$=?fc6(Oe zOqKN_1%|~kHwwMcXdb8XVcXmXS$PciyhZ#yk@tbrJisKst@acchL)HdyexkolzK9X z5l41y2(z+fm33*%ZGCbGt2jjVWY6MCjVsV(4UOtP5k%w80WadO5KQL7S@U^-POYvI z?h?JGy*Osi;aI!%{%r-wX3ylA@Tw6;hoQ&wBR!lSG46G)N!aFQt8l`@}TxwE=r&GN5ew_YZqBPsY?-u$H!J`z8;#2dfoCran~CAj0*HeXu``` zTkL=kWK#$*HMKZvIL<09@U`lwz}S#(_34C2CN5Hz8P|8u5@-7snM8Y)1f3)ko7q|+ zTq$|ZBU#JJF?^4|2B?UIp!Ep6;p^^i)7mpXY)+r~f z+fzgB1b&Tw2&Qh3r*{N(#6RLNb;tIoUKJD&`c!VN(c;UB6wa!p&khpm;E6SHz;ofpr~+B$B$OjWpd2ApwB+h;4C{Tf@zS)}y5XQRHP#DT^`DW~1L3Gb;~i-{ zm>+zzCpq)_(`3y^w1>x-9wc`-Ik(pRhKdtQWMU(vu>5}+CsPdeoiFI0^riPaDRMFe z2ma=ay!jr=#n99;WjPv`x1ZIYXIes0NNAR}t0Gef`c)fl-VM^iB@=p6GemV9-E5a3G+ z*(e@N2+~KEZG&#ewznejxfYm%jj3Gpt)d(vEU-zRT3kUKPsV?zeJ3l*wH0Z+_U3nC z{qj|YcKHOknj%B91~=ckTDR+hdP{44RTC#4%h!(OR~T*bhrwscxS6|!}&T@g%m878~;thUhNSmRnC@oZNuIi|1dEy>hp=~0ug zm+=j)2Bu#`zHS=gzO;Ae?rcZ*+HsS*lc9H)41=qY^WV+H2}jHG_ewUX;hXHlMXjaF zo8LO(?Bu?h?{AGyE3|=G58*rs^V^O>-4VZ4Qo}JG&)FlKRh92O8nRTtPJJCc-SVF! z+>vH;YekL&QU%saG~&2jy_;-VA(w6)83n;#N7x4y{kIen-uy%(>VqQR@`1!|GI-z!Wab=hD!ZTc$NfSimkJ zb-qWVGX9M?#GA6cKq7r{uo#dS@?)OZ%W1beRT>RS7@O z%lwr~IC0L9cjM}br=wgCL6!{rLp4X=UITPe&!}#?-jwCZ3bH}x$m8ApS1MQdp3BTo z!wHHk!}gd{qZi>CQ!dNVeFcBq>|f|Q70w!nQN9i^WVLqanZ-__0_YJ>YP#8t?Bqo5 z>vCu507RwG;6({ZkVpS_AO^yl<$KMAR;Ue3GfL+`Y4<1aObwdV*{=Mqd%iIH`M$z(W$+cjePi0ur1E)Fy8%-6m zg*#i2-Vh?}h`b3iaC%cLi|?7eU9a2f;K=r4n4DP~q5XrO;g4W1HVX(-q(nC^4O4MV zoZBD#vsAkC0prwVGr`duH5N0dy6tnCHmU66(_wYO+%siFCeOX%F790sb4hA67X!~Z zKF5T~0-@QhSQ6o6BIK+nS}I?vjVcqF8hYhY-u|oH#~#*ZGHai!7e%w3?rrg1c0hRd zL&telwlD^ZdCFIyBAmYpUVRRg&b*Iw7sDxTYJ7UyVhvWy@Z+wgOyk_XHG%%0WlEfh zu3Qt7_&ymnM9Hf7l}L#yHb#H%$ID<}GdNA(L9yRGUATo;0Ja5qZt|-~IIbxw%Fobz zxh}eGyIEUN;c`gNg&3R}Bx5%x1HPLR`~EhEJ;8%!HZgv*xVt?GD#j+J!q!$qI=Q>t z-6Lkb2*vZD_yF^?zuQ?T?w@V9ekbev@o(we3!d_DhdPtIZT_%`*%S!Ajf8d#>b zx5wC8!|RrbCQC0U77v?#PlG-1B4A5jWSg!&K}9yGBd+s}3#eJI#kCaconj-CskqOM zfd8r8bo0T@JMwUEbw1Xd*g?p;WSGC9up2O-PYB)~!D>ORyn&vnt>++UmQhI(0fVBM zpx52H*WgtSs%muoR`B^Wn{n4)LF2c4)T(BLNnO{5TDZz`<1|ZCRdtKKxGADTT`}uu@AQb$^_ zxP1kstPDtu3wobY?Fv^27MuOeYPF<>rA|mC7)un;c+A53AJr+eksasWiC_4S!&kyj zdBgSs&)Bv}qr3Mj&P(>2&gdV~@nY=g4SQIyWeaHRuz=M;{GqlN1>D6+Z63>IxuB;; z#rnJ{vcJy%vo%RHdC%d^alerdi$K`r3yd~AvMkUmJSK1HtSapG)}Dz^PK4>ROgY== ztIhnne1+pcZ|HTg_}gV6Bqz#%h7*nt#%+Orp9^d)!$RbhE>g2ABYV2lC$CmGe~1wz zeNyw>)$OO^j3n^IhbA>TU$Bz|U2UUB<4(r)#l+}`)VV|R8=tum)_?*jxgSymPHP9i z0v&`E9z6m|5POHGBT!CsF9#{1o5W;^OT_`AfU*+8HJ=IE@Xohv_{;AHV=0Asn6Ohn zVCbis%gIIy)I>f?eKUh~-X0~%L&AF!o&MlNCS;sk5~@<%j+@;R>*leo{l_`~ipR4O zHr)~Uwf0QF)HScbMcg$+E&3qBDi2dO=;)p|skq}0=DUX#SX<7rxhAzdnV^%q%+X)i z)e}^0Bzh3nvXN1Fc}0f1=sgmViwf~wW&2HdjsIM&Z{grwWL_ty++JVTZF@8ca}2gu zG)TCAfd=O9vd|Ycdn0B^S*f~O&h+ET(vz4<#rc%k6AM*&2JsKBT;6ISxmS9RDoZsV zBQl7HI=&Rl5`FY#xL(k|y+ za{8Id4fN4ZBk>E)Bg+E%BdNb`qhRD}+%yO3L(%m*Z&LAf`@%1SEqn{K<+qK6N}nnX ziCK)PV5bBYW4CWs1%ugU9eJUBy)w+8#0_^Rdk$rPcgrzfQW+>s+Q;^aQ4W`F`G``( zcC6fOM;be#CNic#F=(|;$h>|OnSCLUV#b)G#Thhn-%JWgur(6^Aoj=-+MX9Rzjk_1 z%vTp;rlJ!|V$qd~-Srg*;|9dIcrK|_bBoS7!PHbG7Is|hnH!zUF6!c*MXBl4>fD!e zcu2#8_wp%@v7RAT&{O#Yc2+5-{02Cc1*HE|L|~Gyfmo>w%miGhR&*uBlq^4=rOWJUn1m* z6~Ii?63CYvtwZICO9X{hEBV8?HRdPKJ0vv8Mb(3~r>r!-J1Bg|n;b8H(f2AHc0x)N z^<+{Zoj-nws{7YE_46^aUoW29(XjAu05#L#q(z1%E!4*X4dras7;Fqj>_7Yf>Oti? z1A~FU2{qF(zQ%mEv8QwM>Q4(v_bptX*MkOJWHu8GkUyM5!J?qE+oSi4{Q2UijCl)e-tnx%Xga_~HVeEoSM3@*Kn1;PrWk2)7)5+##i|(zV*j;X`@PrRM_o_N`M(4X}E; zehY{SaKTHuYdw1%AvhAVE_gHPj-6BVl225b={hmvs~!M6KVLxW3(!xrI~MBb81TVx zr+sRQT>-9PZJnU&HvT9Q1shBCTnPKa zo~dI5bOnyqLs!}w(?dnV`KK%2DW0)cm=VMSxIlG3D2B!fT=Kfm_S|e=`Sz7^h=$r_ zSo@16RM%eIkei5NL+s$1&NC3Pj{}OUJ(d|KFJ$m_Ng+F&Swg)6>QTqFM8`S~+$#|k z(6SofbqNg0I5FVz)aO##03SSq{VsUY09(o_fwM1J{G}37K3Y+T_{H|fXUP-_`^AtA zNN;Q@3dvBv>@}?4xwIG1z&6+=Qt(iUq*ILNIs{}}*}9e}yv%$m2z+RNJD>M+<4J-@ z3b6uV2GF*8_T!9b6Dr#(E|<71n$rvO9<3oC##(@1pa5k9P#vjdnHWY1n(6;>A2_QX zZe@3tfZH`P;LPoJxHOwxveY3vfMM-b{3F^9itpW;)QriREFYf)v2iMFQT$4%7$u7o zEybTzC2{}Rpb<+o`aOCH+|Gx#$-d8VUc;MCaA939fm5>HSig+Ro$l)5&KnjV=Ta2!5{;9niSb}lp>>+ zKr{4oKrd%^!qkLlSWJ=Ov{RegA6*g_Mm%y;X}L}@wbd??|46EZtGq8OOz^7yr0d9w zEE(q?dHkl~=dq))Xp^{?( zI1@atvPvSgt32u}F_L&aDA{OGVTfL56ZYW!KKgUiL1pt9u>h=3%yz!%pvta+LRa7Yv>(E9CSL?xouk9zxf|72-8tp48xOm@t= zhA|hQ2bChxGB?_ulX2|rrS1Zd7mI%s>TnIQy*IQmJyW_pRWZi63J}|wEQrF2dxR%$g_~^95vhAoOs+vU@0m(8qB@-k+&8#$y`Bgw|8y~B3AXgUw&w?qOSn|~j65u1j)=FWc}sSuQ? zYKVtTyJy~UeQU3$+;s1a-!^GCOx>Tg+u9e7>#>7CplS8(*z_JoafWU>PfMj&yuY+w z*ljqYW9RV)b?k)n#JEzD+TissBmT;ue@2dge@UTz#a_j!vueg1xpVAcXB16=iR{1Q zqmNQgPglZq0b%$`&-5{(!uQDI{V`>-J-E@6f?5WPfsmlri%U6@@Ms($t z8^8OD8k+^R$C&Tcy$oLVbT!K#;gA*7O=vl?%D!7>>~n6pVoK2=HaMCJHm#3F#d_F65%d^^L@3Hw%S(z&W~buqmLu9$Wbgy1KF-LH)+ zL>p3nXZUY_XS)p#b~GA3^Xd#H>#PIx6r^Za)JsIH$a~ieT}V%d9Ui)jl><^usHKf6!U-J5YqIXIXk=)Wu0CV6InD;u zKSf4S-peZ~{3}sXK7uVYz;L@YC`Y`!Umvo!A(H&c3v_Nb!#aB$**do_F}s;|dn>;l zK={`om9gU%zCkRV??fk0Ss>;p?xX1m8FM9`78j3gui`PQixEEZ?HjkpXwY2ks>y70 zMekDXGNF%P@cMw3I(x>r`iqX3Z3s@4Kb1QmydNIBU*7ixy;$N?X^*^-RyULZDZI<9 z(dIdB(qXmE$cq+NGKx}9I&bxU^J=R41>a7zIZbTcZEeYdiL3PjUj@lcq*JImIz0hu zoaT#-ulFb{xov8ku>B^-S$OgCqOWmijUT4mk1t{vqU?A^7o}~^V+?sGf}mh!mi}L# zZN>lkY&Wj#OC8?M_qIA*Oa@yhv)y5L<4qd7ea9nMis&h811CNGKtEp{QCjtsW|uCT zq0MnI1w3uhW8ET0*TXb4MB_z1*4F0mmV+tOe`Y}d(shT|O0+oZI@pVrZvvHD0%@M? zcjYcqo1RZ~-E1M{$MEV-tHsz&pI+U!K%ZIE^E$XHOR^L z9>{3QoIn1Pr;fq5$15$E#CrPd;?t zA;)Y88?Uhj_dJ%=PGohXY2EAaBH@i@w%^dnmMB= zALDo0kyPL3gC(Nf!Z6YbpoXCdiPYJ#=8#t>Hg~*ewkI8`OKibp#emw;2c9vC+L`HuRLPKjoi}cWeHj6oBECTJEQ}{?zg!&(c-B zB{_!Mi&M-x^v2+KN!wg1AJ@r5_9- zJD*~os81lm*dnPS$^M=iU(!JB|GIN4^uZBKEzFKtsCWTh7UjjZB04`kNq#UL9{bT;!Rk+-D~6fJK_&scx|;L$O-ZF0@L)!3plPv6dl~auH+F1~ge} zH0{Tr-4<4CWDa<|!$R3em-7W9zPGkdT_wDGv{^}X0}cps%z+Tkv1W2$fv~!&aWP)u zWA=rqlf34_f$_}en|oSy2(YrZ9nn(978W7aOnKX5zLqk? z?7KZbzh1Dg7zNx@0OB7=pA%U>{?CneP zc0>>IZAmQ^xN}4y_(sx@hF7@ni-25r?FY|X-MHJZTif~C=_{>oU>n znyq;lFUJzwO|Q&wg+<)d%Rw+ts`p>>qybU8bwGGMI&Zj`7_=SyyJ2X_0IAfsLnp`Q z;CS_z-09@6Rc-?M^I$8pWN$t#TP=bJI)JA@6wTrq1RMaB|yhF zx=*i&HV$D~WIc~&`8<1R=;YC-} zNipTSirnU))!0FPo`d+L{s?w??RX=l$Mz+BY@|;mzZnM)m@x1Q@;$nkzHm#$B9rHu zG-p-ysYN%|)WZ7Xw@DUO%-T~-e@7#-68Yd?>$rS+l=!DoA{fmxFsh>ks(weDkr`}i zpJU79$u&-nRt06F{3!Le|E#e3yQ~)c_M?`4AoF zPe}~{uzBeJl2fw(A*V}6@?#AP)ssJr&7y;j!n#5}tXsuV5SPj3k445ff1rGGBgzDL zX_D%Jq~Y1i_c3^ld2^>GYw;iR;3N*)~TpbsZGXC+f#u?#7I%|m>1b}vGa)dSN_+Mn@j zO&v-XEQpDY?J+aGGDSGI)X84u19cY_#mLEx9vRnb%)@vhd(33&3!Y{tCaZxSX=+pd zBj-sGUW8e*hwe}FbmRCxgOtwKLHX%RkC<*oOg(+|?c((JGtlZb=siY^v{76D3qc1e zEdbi1_qT1RSIkCjxsB2Nhk9`sK>Gj$Vu1;m4UE$D@)8$#g(#o7k~j}-@@FUYaDag> zz}|zj+5plj6({mSs4}LomdQGSmBIh~Bf}tSn);$M%b(pFi%PMUKJ2uRLi5ZdDmleytqCV}hQcZ^{ zKF&Now_c8WjHeF|56e=XVipj$;w^4?uppFhd;;fngdZbximyt@)1x?qQ_Y3yPy?ks zk(QcX7Rw5c&=8XQsvX?M@<=~hTTY=-s98osZ8-J`>>5jUW@q!&v^Qw13ep?2+ zxvg==uaF;0c$}8QS^Xwr_`0I~PtM#7%vnVj*Kg;Q+Xk-;-Ogxy?(3fv*SqI{U~~7* z>u9o&4)NEK_ZIo7SI6AKHOrT9T3=YJP{5Mdq+ps1mJgDD@dT%x*Se0Y$9(a)*_NF| zD&50iET0-qjsquf{2Xn}?YImKUa4p+?0D*Ny|TpN`ncP16CqQ#H}eN_%?#NIvX68R zGO+zs%wNqc5N?rrWvt;T1pb24Hn(R~;%CSe>Y=M`RpiHix#kY{7Fpe+f}f1_e058S zbk*zBG)mB4H?HMnZfI@E(|0hEdYYU3Zt!@Nu=jZVVaTEG`S^(j`x` zIa?Tfb(`m+cpW%qv3$#EsrqG-oU5L2uF0CcOWFM^8TSKsm_#sS=f|p;E>zBhbjNxI za2#7I>ndjDKUQ~XS%k;BVPn)?1b2(?ux<5X>eixiT`Yk!-u0%UbRbKroh%1G(h9CO z`&?KT5h&Hz*1Pd}jaS zh!yka31<`;^_nNwdrlIc3l*87zwzA5pMq~2rJ8Q^Y*E2o8j{#$v|bOjQR&pm%VVVz zsm@TkXxI7G9pR=VcrQm9N*N)uXlKF<(C(7;8?P($9EPbbVzT{@@jE4L{n{$wRBG9c z)Ik@L4QppO>+fvw2jszhZ&t}?G?x6*5>u;oX36L?c_@ni25UfVUlB@~!b!J&ODO4R z-$a-CaP*JI?CFUfI`j58CP>#*jwc-?A-OyG;stj;S4hP-Fzw?!FJHbu)d1h*w(wtR z;u)fSuq({Q*(8fnRUQc&-qIb(+BZOny)xOaqy8r1q~(3(eMsFBctQAlP`N@oS5Jvb z&6yXmC%z}TQ*`$^uhiZsBQ%*__`UIl(e0T21dF8$=8c`FnQ{VN*v81RfCBJ z3VhvD_rZBq_q4dY-+1X9o9@9cJ~?mjCL%B1!b?*+tL_NkTlJc2SouvvvVXL03)GCy zOL^zP+h2LTxdig$iU-Pu|EjwkXLhUc^*fF`bU3+nC@RrOi79Stc6>5DO(m}kozIna ztu)yVO62!R29!(-(v8;yM&ruviJi-Rv{r#Gb*J5@;fQs; z5)o_mT%82{rBh9s(jBw*9Y1||OZzIouws=OnmuIt5}(Y7ucN&8F*JeIB`xAl#Ehr4 z$kNrD%j;IOnoQY!WzVL~*v^>x_Jf~rdg8F2m|4rV;;eq~Z_66~hxfD;hCWQaQqkrAkz8bofC!(X3r(SOHq(`V$Q?;4oJA)7P zdv;NQJX~qI2*JMlMYUje_I*ub-mwEF4IqqbQQK7sI;NZcbUWQE zojjc!PjN{E@qAHbO}r`Z;4a@Ml_-yPpBYM%??Pc#zhTl$*0&J`bs@-ru|=oR;``lf zTa@OKOW*^?83xbX1bLP9=on}2STQYAj9%TN`avoYsr&6eMe5GhZ!9@Ct4F=B-m>65 z4J$ocZaQDg3|r)h0gm{1$+%OeEmrNtMp zI$I@|x-NGGqrq8*Mz58i$2DbBzu;bEj=*=zHq*Eul<`S0Ey>=CkEclio4FQX5I1r4 z#PjOK)mgc9x}P#OdH1&;07HQPR2*h8V~5f__WNx*t8a{SO^TOKtoNKrInop;?-g+P zENpEjT6_p4$7R@q-{R&iV7DbDd?{HsVXYnmC5v&JaZ9W{X(_@=Fbm?F->dF#8}j71 zC-UT4yHaihS5~2o`K9w=pOx5<7x>s_&>Le>eQ{RjxbG>{_vb|-6F6#<-{CxcnT{i3 zo&_gO-n}-1e|{|@?~B~hiFfSpXHU(n82IN-1nJ{uzkB9G54>wiLvf**iqhS!-JVaz z`=FUM?iXdFAeL0dy4>-xX2FGi)^g;yHm#jL8CLx7Tt|QY6P8%;P@bEve!GP(8D(;5 z!fDPP^NO&VLA98)f1(-LNoG5%DK+h)wMoX!d-wnfi!Sa-&+O}^eNdq4r=P{=^|)Ux z<(%M)iuJCF%zCrw4ks||(8{6H8cfeHw>`Zf?=8(-qUG`aM7Qg_V`#a;X#T50(t84y z<%;nsTNg(xXlzD~;cq+1c9++@GM|A3gGw6LvPlL=;-6?wLV_O>ca8hr{6yJK|LBSH z%7U^(l5R_ag1IPxsMuaV=Kz})>Vl|N>dI1OjnxMkmvdAceTN3+8B3NEy=-q}6^hpDni?lCm+E*YVB(e$h$xf7IG-47)v zs^yksLK@E>dF8fdZE)hUcn&3D@n~T}Ue|TMX4T!+GON&2r^&G0yOCESRM7M>;u)Ma zBZ=l+IY99p!zmb{}ilf2Xc$etcV~#!=o>q~oxTW>IAfo@BC*RrKe*umR(_ zVp)61L)o{rjV9}UvgeX=-4ioRq;-95VmPuUr9}*e_TwYUMG>jtTRF;O65WEtZzno* z>rSJsZFgn+1iM?=R!=1&%kU21CK zZ|CqncvTwk{Vq!SRIWQE5Tl79Yr8(yb7i{>-*7ztZQ1W*P_UsJbT6Dr@$u za(d|U$6jVkEK zX;YNZ{&HIrwLtbY(uV{Xs{9G8gQ>VT_{-hHyrwT$5Ibbe`?uSF=0)=Nrdg1T)C{6lVLaACeIj2^Um70Ul!Y1+LM zGp>Jk#vu^Y%xYGj1ban6!YR*{PXGP6#p$SRg;TBZ8r;OK2SAr@G(Qnr^nAN@$cj03 z^0BtOu9r^4u={k##0^p<*-XSQQgOa6VF?f~3$>ZK{Ub*~^j3$V;++@*gUwra*2brt zWKe|+DhXsG$M;^5JhB+7AWEo%@8(13DI#(8q4DkfP_NM+p; z4h32MOi(YaW}yI@&uI~Ydl;`k&nGkBBFLKuPo8D0m_qC>x=?iM@c6f2eI1FFF<E4{D=4*u0-IX_#bUfFjrEx!O!8xpTWPH%`CHu zOeX92IwjW1SI&MA!hhkpbKQ5B_UJ=@w59ogC_$QQSd+r`=+9a8wAR4#^Txq zgvcyW-$LGtXTM3&=sjiq`v4JT`^gLZ2Nir+pAJCbRp4T?2=^wIuv%%*yGDUvb|ts!1_q>MtF=#m;u*9&}h^sW``qZK0YO$;{4| zm;BCyaz-QM;9A9yt)yLY_#OFGf9@j_TJx)c%rm#0ecjZ0USC`5Nu-i`h}cD=xOd7A z_6ZXN)IRvZQdX5aMiYf(ouS&&o%G1&=h@~Vn<4Vi9vp`@zOW9}1`9M(l;%AXWy$92 z^W-vA$>5FwOoy~~k0xi(*v*ENOkuV+_ESY2X3tWdQ(fI>+5pmaZXf`Z=#nGS(4 zWFpNkUG{Z5KGCVLOMiY=qu@F4r;`@G=~|p;N(q+S4w@=5A}Zf}yPpfNsRa$=FX=dJ z1}#kM?3Dvl*5&dAs-tp2WSy?Q6F=;Ne(>QNz-~|$y zY)VYgC2tRf5Yzjbs%uuJtmY?wI0b^b&lJ-qIK|+qsyL>^lA9zZ^ir3OiKq3I37Zq| z;L_9HS^#rxq|J2>TZMVDUQMQHZH7KS!i{-N(Tqb8>mV+u?jig2*2fg*H}~dJsVb8V z3k3vdjbs;TE3}N_W+YVQX~W6VaWbwWR1VngaHK$na}@tg2!xy6;@9;H8O!NP<8eNt z@?}#5-*)6aD04~3W%Go{0ChNcq;IERfDFGGVYm{PuvNCu^b79q6yl~cFP)FT_{%0N zI3h~*#^(KmmvA$mQ(HgDUKN>4({cB1+I!gAwyWmX>TzO<30F zwP5{6>V_6xSKjjr9L7L5(81WVTC$pYBYoRc)9?8jK$k~FTvvr|h9c4f&pk=6MgEwK z(FqyfYso961fi|Ts-FW2Fvcfv>+$Nd5kR;xQCSsBmlrw1fmD?t-Y=Iz= zQ!adgyny}ve5iHtmtW>vKWkUf0VFQRRtjkCu<_?)Cm6=3r-o(k6Q$?`iO6Kb59;hx{J(D8V4f<5y#1blvYM;nuiF^Ae(U}mP z)Taffrj~qE`RGkRtVuJ!ZDWVNA0N}b&5;|V%=(^Z>q7F@#p?+YF+ZKjo5<}_8GP3Q zW$N!T@6$G>#<+u;{&e)+7+#aRh*ckgDaZ&8kRCjI6(Lma`v;Y`{~S%|bCQTsvuoC< z;l{eJF~(exZQBBgze!GAflEEJpOIMcJ*l|0dMX~hkfQ>dRsB6id1M6C7pSAiF?C=_4DfGHh)X}8daokTA49#N7gP@3doIvFSqTQ8^37#G(-4`IJfHUn<%GCBH~UY&`C!`fCe z>)R=~LdDCzZs{}yazTy)z8`Fl(ZWk?5M#Q+DDkZH;rB_20Yz$Yh4qNv5H>Voee%)Zb0q>c`2PeUO1kt_Za(N$VS(96pIe z1fGlY9MU<*ciJz`(2P|gsTCCP@uR74DnLq!W0RR+DKw;gt3Twe?l>wka!)FVy(}5f zX}qGUvNeQ@Z#8PhJ1Z8`KiC}6B_V9+m3l&W`Ts}Qn+HO$6?=<2Cb%Upc-#4KR=-xwI{Q8CvC8Oo23-Uv zv3!V$Wdy5vX98zHuoSyWxD_S&9X>)x|ktCY=%&N zAYP+^wFn$Z7Xf_nJ)4}DgZD;zgsSRc7vf5{O(%Ls0yZkwrwP|enqt(lTNLKS*Arc% zoIk)RM^rz@YzywURPS8Mrsy}C6OfNC_J8)Z{`FyB>)8y@bHM2L>Bp(YEWwrrw+vL2=VRmJ1Zu> z8PiI$baU$2)(~?t49JKFrN@H4dO$tKz#(bD>%CyF9ADE6TKMV7Z=-RDD_fn1Rj;1? zG4nB)6vHpHFe6mOP?tTK$Ybt%=K$e-Fir-rLgLDFnXN@)VQH?e}f1irjA6Q=BO zFoqvGy10RX+sZxOVo^FjqV}B8|02hyU0%h_2F#SvSG>)g$hq;lz9UC92ZD=PlD~f) z)D?IRH3^lMr*n9UAPgtSs+R9@?yVs=A7O}n7rTNZ^!`C34nP~)35f79JPGIuHD*Y&zR!{(H7Q%2NIQfR}mkcgYS1jXAcEbC+aA% zg>h;Znk>tUcA{I1&pE7vUUy||$lXDFap0*Moi^ctyqWHuj|^U{l4oWC)p^2O;Q0vs z!N1B2kzr%Ks&?LgBc(knzJPug0y?~{F87}Qko;$=NZz7#c5<*Y+7!MH$1$b%DzCeX zPOJ9*ybh~VCs`Jf+Bn=kE-c?iPR#|cI}!j(SSDY46$EoZY=l{Qd* zg>A=55^t@lN_Bi8W>j)|aSpChUi7~z;^DSJ90!j;wE}>=cnex_-0OtS*3i|e`q^Zl zNDtlr`T=X>8eaVIb|@TJwAl0}gj;j4&=nPE2Yf7fDqwJC%ReOsabYXnFk zwZiBYe@MTGcDgE6C{P}%A#qHx-zUM?hsX8Ir()4YyTe}Wxo0jnCa~%W_=lCkPBV`% zZ&z)>j%`d+91o*@#xD#^0WHc$ih1KPte|_NG2tM*@UR<8u#C{liXW77vdf%(_%en{ zsrV<~m%vlwpdq@ImTe&+Equd2tc&1^0lty+MpEWIx?Z?DP+;GlBHMqCSju6XEsa)` zJUmB!wH0HIQ;cTGo!d_y;!$zoH}jwrE?c>I94dJ*&g5ENo^2=0PuRFnr+tOTAz1 z&>PKVQzY!}0S(I*7CKWt)eUFKMQG&TLT}5tcqSGj0LVV`>ND{gesZXt=$QN>-G-*$Y;2Q3$5S6ySV5MRAOF(GvKF$_-yp6;*_5( z>pywMYnp-%zwU>Nvx_Z^R626ZK&@(9$b6pMRBAnL_S2A45S!Uzeg^Lfz-kb)@Z7R8#9 zDVo+Cw&~J%C~sEGbZzsvQUaxRVg;{Md>)IX=QuTq!3hb!u<+VdRGz*7JZEt@bJAxV zppFi|s6)VPZ|6Y(^RCCMtr2PmP|8gMm#@n@!j2Xz=s#OeFIuV^V0i^*Xe6V@@BXdM zH_M2q%-+Aum}#2-fd3BH{VV}BFkh*@bbm2?$#;wO6PBL4Xk5MC)SKdcUIpB!nxbV- z6T%5?{8NkTs45G3mymj>D)J_XQRkL)cXe=uTW5QNJIW3(J><*TVOV)VDaYVamS2mt zj)JBM5ufIRt~cKlASHqPO*Kch=z4|OBk4p&`U$nwF{JJff8&}e%cN);1tFXrd`%0y zEB*0XPOAZlb-2$Sm_ z_4svgY#_5Y@q>3J5@Wu!IJb>21^F#K$&@np?eKvWF2JT(3fHf3n8wBsj8_pwy4TFc zy;JcpSC-O}`SUl0LbxYGPF-$nJ3aMAmh>U0c{V-vdNB1S-s7fKmL}*$OgdHIY!oo` z0=)=-2af;F>0%F%#(tMe`F<})B10pu_zm4JS9Ho5>4j(l>vM&4Cw=Br?G zh#d=z{es_-3USNR98JFoK+)d>Ak?R_T{`@Xo9(8#a@7DP3px5_{vGDx7Om<(+-iI3 zo1RNQ5oq!bcEF@1;T^fVx5#z+v6?wT5}Kvaf-H3ZjB%_DeFsFM!E0|EX<6`0%HtcR zZ1U56y7|?4u+>RSZ>;@=0_Vt4f-3#7-^4*tBpAr^g7d@?W2$l7F8%u1-xZ@5OBO!G zcXKoytQHKNe$AV-tkvg(P9h^}iLd=eixgsD?p+#eDH@TMmcP3ly6$(kQ>!4JPq58w zJYqMQ;u_u=zb#nHOL>IB(nqg_tvz39T-y^D!3=20B+eA+#-e#FG%|7XJBB~hsk~I? z!Gf1|daI>5A(ERn8F8jRfhocw(W-DVQROppQzPam^xJ-bh}&O*z2&>pt|>xsEU_q3 zJ_U$J}!ys;pGe_ z8+t1$$KE7uEvtv-nCR;q@>h%NKTSmFSBd z^#bI1*bv6vEs?m)#T4!q2#!J>yxa>W704!W_jR$n=|YY=@zF34cZ3nKQD(&t_#>&* ze2614H(9(n?R;-T)ojCyJhBU?n4B7I0O3^m@hF^w(v|jj6hAkw+TRzt$=FAlT3;N; zTnberl)Dl97$+-QmTe`EG?NNvZUcvbV~lJ5Cjk|Xu;cn{IW!6Cdq|@|rm0AWLeXQO zskQ};GB|-ZQR#*C5b5V}f!EImFS>k~e=_;v#amo&exdMuNAq{4oO6+NbiWyf;y=tI z(3mZGO#ab(*W|9MX3Rr_*~|Xp!;SMEs}bAzG0gA6sEn86Ob3L{yGZH3Lw&ND?C@N# z`pR;?a&Mi&KW9G*!fyH}%b3_${ZES#lhXWG;_?37lh=g~zQ;;w!|JS+EYw?HTUv75 zQ#(!2-3A)QaLSJXIs+ipiP8T{_|bs$hwlxFlb(US+u+nuKX|$9r?;;L`+Ok-O*@N6uFP%~c1gZ5gcBa(C5ge?ets?13LEmUfWY$l)q0dxN- z@&5RC&_1&36z5nr+M)h9uTLlt!zE~^oC`OkT-71mnh$giu`abPw@SS(FtL3ESEW0f z-&t}K6`}UG%}dHWX_ZB3@MC2W*yeL5musg=LDsD_qU?guu;8ztM%62t^6Do(Cw0pJ z(pKR8iNlOjxQ)RUuf!PTTdyY~D=DXoK%;`0Y0=IT5{(359h z0b*G+8mP|7xyx068R$34J0~<2)&{tjTuEvIzi=9cQ{H}}x}0HA^ubtp%}jvC5do4B zYSUjVev@7Pf8s4U8s17^yV;_U`}zTp2C*)~?7|-IA;GQ71?;CDnag8$*@^cFJq$kLZ<`ylffq_;h}`V7>otF=S(|ut&w6WEnNkbld4ug@OjdGY`3YY*TM6P1F+DujLF|xvo{Ne}9 zh2ULNCPvJ?kOai}eSjhrM2C0!_*8S5O*H+Q0XpZ`GC-0lMp`~IeH8&c=TFF%qB^IF z3UY7K2^rf~j(q4K<(rxbfwXlMF?qU@>fw~30hP{lKOe;(CKr)Twn3_mSs`V6b0s1~ zJm|jefj11|u9hGdou$>6CeGMDw&Jm!e=RU%sNTjwiHcKvBJjdTf6*@4ou5 zM((VNof+Y;jcm})v(r{%%9vtmdA3TaC6*PS_38R8) z(;M2c8jWkA9&w|LcP$qse#9GTa@ny}{dgt7HPp-U*h4TBBN3f){t8~~RczB|%w_poR1$St_?KI+Jz(kyA49Gie zQnUSP-k4^gaA$*`fM?Mu*WOREI_*&-ILv_YClx{?8o#3|Vta>ztnemhBe!~I^LFZs zP?bx4BWEed$|c=QS=@{3ORZ{SLPm1|8{1c$Rs7~{DQ zhI?~$UW&KBuU;mNMsE;9?wXj1YQn^v2vU@4xaA??2vW<>lXG-b1tC zv|EP(FCdy5)>h&ptvnB$L3w0zG0{E`Xl}jgaM+Dh8e1F_1@mq~Tz$0qmCRY4x7?63t~%7B}!eJpf50gv~CqeDUt;(~&2iqE0~MU_n^M z$&+9V5ARo^QOw+=7Ul^?0cFY?mA%vIG7`cz^X1Js<%X^!N@Ho)P(?F+WA_W(-?ON3 zn5W6MnN#3TVDrFvG#Cp@wdVaQj;j(FmKI;drGlXc!hCl&&Bz7LY1A71vKKht?)JKs zMeo7c#qAIq6mD*m*fy(%TNy-kR-|sC-C@PdNtm(rJUl9WhriODjKop1Gt+m{N6-3w z)IIL%w~|nlj-4;67+>}DTRCMBbUg6MVsojXd6NtAp$}#-?tkI zMH|5;Yh21}7i}l`-Rw}Zrf(CMXF82EvF_1hmSqrvoPtg5EnGK{QF`Qz2{4&^Av+&K zNL?1%981c7^n;*kmqQCkppR-CkuIln>+lO7> z{;u0GnJB!tnD~M^<$C3b&Q@J^L+Pq|Ji=t{*vg19C8VMtG(zxvbYqUzjaayjU$Wsk z(8#&cT_SiU5{M~1oy{LjRssG^T~0l4YM$o$MCXB!5Ye{(J^my zkH~=DJ^0tG-XP6%^5NF!bbu-6E}~>6O>V=FVovBkTTVZLF`o~<2Bu7;(>CaNbkscD zWKMTBa+y3ky|ZkbnYU>?;z4GvSS#ty!_I;~wiP-L_jnxI@b@tfXCCohaVNLpsO{aI zlpg*}g<<^kL@l`Wu42{Bx^uUqQZHD5w_b5v?4`xOggU$ z?D}E=eXCg07tigI*2JRpz0NHQ>F|koW%Hs^U)f{GV2#!+zO?P$2~6^SBfUcn9~?(p zWL+cg)$F>Xv44&(W8goAykrGDeI8mB(H1G=iHrVFrv{(e#r2f+B8R-1uJSI&8~WSY zX$X!AwR-_HIlgfI`ofb}7s5NU*ge<=Bk^VT6`Meo;rTb9g3U965fZY1(?9)V3eAVO zssEZnW0qh`pE;TwX6Ge1{x;bQG}X!VR{*G}L`TuS=*0$5<&(dw9AP@NbkJybXaPzF z%?o}I+42ax~Dj6XXVP``(Gkv?W(v{qeB!B({>UnFkJ8vt>73L8hAHgFaXO@tEL34u+ z@&ykHO^yZoCXQuPOCB+iT|^EE{9F;Saq&0m!sUCN$b@K*lJP*8wK%pE=Hg}b7Cs`u zACTjvCfbc z;XaNl-CHBDt{@2-#a|k|XWoCw*G% zRU;fK1-}x@M6f*d?mg)67RM^=++9&DP?@k>z8kY4QM8`4V(Ru~G-AV8X8EoYgNK%v z6GINVZC-Z0uqk6J5O7^ZQvCzzg{%YXQq0E5R?~EGlMyef7wJBD$@qS09W!|#4ITei zzV6ha$wBu)Lzz!-x53AF{PGw()5Tbh3xFpIIFnb z+BrH9JPy`acSb5fhGk39xl8}Bl6E3yK&SAdl<~pNbPGW+RH)YdS5b-wImhgeY6k%w0ifv1ahWlwsX z>W>@#lu$kg2;0~n)w<=awJXw>$pbr%FT=z`Ua&HonLmTdHhsoL)y!<_4O&J3&{-Y# znyPHUINNCEeqM$>ivAL#1Lor7%pDQKlmv2Q02V~8VzaCLen`V(xm_k!Qx*>5sg~ve zrscIu>*PHpamet_{ySmG${nW-aB?t;^&C%ANnA0mXX=$H3bna!+<%f;@zNu=W~O=|z`LO7S0`>yhy*-r4gb|5-7N>=embug>i0gI1|GJ=zRFKK zDc|}A6^YtX$;C-a`+&Z#fWb$9!9{CpWt=-n^AH1l-8k9U2Ud40jrSUGP0-D+*M`_9 zhRXHZ0u4K$m~nyk>rog5M_pH-Iz(?+jU?^oRwg4TDX%uRYAK;{~vw6Pc_HJhisT5T?H8~v_avhZG z^Eb@Y$ZdUU87FA;=NH@jvUc09ObT36bvUfgtT-7-*ulp0)^Qj!eGiVfgsdlvTe z-#DRprq5}~aQ$U)B!gt$M|Civjm9QSw}f)Ln1X_ckG9R{<;z;Dg2IQ8g-34J!ZTHZ z0S3su_ydiDQTJ~G!jgGlUD8uk--mRJ$LXd}$&DGV6FmGg0!5o=eomhqDG(543EK@9 zYHa`hh5XvvUb6Doh??R){-`oS_lsm*HEua<64T_@nHoF4(ZGqykmYF#htvUByh zMl-m(CG}%B@pn3>dQ16~DM}uj@zTkj&cc0#sjITY!Np9KL~5M9*Il7uk&p-LF7?}j ztP|QtV;JnT(v<0#$9u*t_E6YXS@KL!f!0jmy?vgezxn1;4O_St_g~5RU~a#El;t#& zxx|m#UTjSkc(L;hspE-3H`84kSGK}16;dAI?^1AAE{UKYyFjkk)8S@fd1BnVQN~sB!kgu(PZBl%#3>(REq17zJp)(g+eFiSDc?qmWw(&UkA5=vG>{ z>`sWyk-{ZSy`wwwAWa5|@1@8WLqrkPlM0kPzp0$=80>09W+vQ=y81PAw0e-sZzQtQ z>IDIkv@+U~MocaH>ibU32<~IK@wN50VAuXqK?!P^N?jw*!Swk*tOYdlb}Etk*`0`wTb0DA|loQw2Z0RPbl1BaU{ zj?_2X0ZTQjvxShIskAzfB$1nAv+0Ai3zPff$lq51Jn z##8qTc;B%gIW(~Dbe;7Y%Vj&yZDS!go4;dOS@5nB_)q&lFZIe{EW)I2Z}?90pm2i` zop@{`+!w|G@*c&^N7kyQcNWdgQmT+U5t(M|Yn^!NL)_w>AA3Wr@c^J^^B?6GJ2L}d zdB%CzoT1RBa1xu-AK7x0QJlKUAkA0wDR~^Y_&&H~!-}6w=ODxWp6}`$!9;SqTpFRE zA~EoMjoc!~Yc%%A+wA{NBz}%D$rTok9IFEO{2b)iPVOljfN| zvH`0|y-lmkS|L)_4naB-N!_aSC6857JGvE-UNRet#{SPf5gxu!&jWk0L41fHKe{qpmRam z(a|SSWu%G0gC2}Z{NvK_#6J@+3IC)NjXpqYqPs@jKh{)V25`?PksYZecd7J5(`W`* zu*`fewbZ(7soPLL6HY#1rbHQD#I3ImBUcxUK%|giAz)o?X^~oxj`VAnWz8IOpK9Pa zQoSw^vw0h9YkA0T7~xQF$6PqCyD3@C>{A+vdfC}51-H0{yV0Rz;kH~Yq&`ts0X)A- zAqh6tX{6_;BDgAtnLk;)?t?i;V8VPT`U%|nfo`fJ$fx9+*f{Rc)pS5*2RACw*@W>E zGL<7Yl_%1nhaqO_=nFX+dehL2-ZkF9uK*5A6(I7c32VxiC)F;})mz?4Hc}j`Z+bu7 zTcX(^+glC1+7lmuh^#cM?juHa8}S(nM4om;xE4>@IpN}ps>a=!d|XWkDWsXdl3b54 zIr_C!-(8*pPM#le7}}?EWnIY!2ev}o`TN|z1fVPtF^YR8_6e|FM~^RQwEKP7uYish zW(1EC`a3jkA^Pug4hOY!K56+{ngNY4mb(dqhSEb}6Qd=*j*~qR0D4+1yT!Co%bRk5 z@`Ic2+&Xb+Q@*JB^9wxthXzINwAJ(kdtU?@Sd7e!JTH5-4SqPs3-BFGZ~H>mKI7z= zNVUTjUY0j@rNA@3$F-fs2c`fdFGW-U6|%qvS;WEmCJ8H=9OzWqQvb;+36M_e?4w+A z@!>817#ARhrlE6t70^6HA5dhuF_m+x8|B*qH5R-1sLvpnak9t{^--MoZl#) zUVVV;JmqOltkx5QpE^!b6FxIYVVR7E%?0$Siz3E+PlMq@|9#k8Nng8hGmF(gt1DmY zBa6DCV;_bYKAuu6hq&9};n?uZAn-f^WTi6%@DZvT{oi%tJ54O_*#@#BL(Y~YauQ?2U7SmF4m%&ZuGp1Jqn$o{VbJ6Kxyul*hh%~oT%(K-4j|{=<#UmWMkz$| zQ}YL=qFc>Q4$KyHJN!;tJ4b(Fz{ou!*lLL$j;43eE;%b|XGZ!T7*jZ)!LYRhUV|jc zM%MV&vP29kp;<2Pc$-z7kRV>FnYsx4riZe$H}@rwGhA0eJ~34ke(=f$f5lMb#y6~h zic>gldvs@c7PnbaghG;<^Qr@A6i_N=jE6d4sE=Gqt;CQK72})TNNUO?Y{s%8Syemj zPQ=8mpEOYUsG~1s=xl+Z@*K;&bBj1&Y$f?JAs1D4xa9||tvE3UF%BrvdvV{>cl=q~ zhnUT8j<{V8W#;-hJ<;>Xi1Cm}*^Kp$Q`Rjej8`I6>2m8E%3uLu~OrI5~MI!~scXY(UsFcy3E(jKblxYMH!{yUc2 zDDld(4ETim&N~$TP-x8R+t=~56gUZlj);ckt=Y1w^)C9Lc%{;s8NB zF5Hma;Udu0z(0f%7vG3huJj$PaBp=0Bx4cWtw|`uEOl>D5cX;5vrO;Rs@!`pWp$ma z_ORm)aH|6hIseByW(=r8Mxgx5W1ae0s9MW08t{s=fnP= z8Oy0>gBk^0PV{om`~#r*Qez?HdD&fSHW2#qAVEEpW<=GZMq98|%Ka^rk2ShcqI6@v zEZWff?{`G^*KJ*@&vYkDr z;^u1Pm#9H46t7B@>$xL?1-J27O?w!m%A8awSF4kQ7v3wWvr*hJP_G?lZj{Rn&)aXS zr~wXWK{QZ8t2;@9auOHAs|B~U@bP_6w>W^ye*tKG<@=`N8vZ7}e}e3#&!IpZ*XRH+ zk>p7{s{gF6B%BNNk#0F&gmRCWvGcjqGMnDD+UooI>i3 zY9_D3fHxz8BE(X6wOjA>kwu#8swHdY3?(BYKtq{)$L<=x^HK2Y{z?87nmZM-n6ap; z$HpNdbo;+^wfgOKhi!@ZFI35qWMH@-qxb&)gHNbP7P69IMft&LSP)*l34#9=#gv8qWq9Bsq!hQ=3CHOKds67)lNxKFH}d<=g_)*gEMn ze_(`I=^#3$fU1_U4b|Sv7@uLpcUATobsE7S4=Cix_1fX=|LuPQ$;(|O zVtOwhiyOFJqh69JtAuNm$1MMr@)}3*Sw)_PT^f>KCQ&g6T9Gpng?6XsK>5yWw=<5h zMdUQ+sHv=w0*{hjCt4jQD-=IFE@)q4W6D}AqZ(8}@y{Abn zOBu7vQm6QTQlE4q@gl}zC)_rMX^!pnaqQ>8M%S&@7z5>@7SAbk@rxZ=?8y8H(A@PL zvZ+-vUj}rQpETXd<%}X21C#X0I_`GfiJ(E=o2OhqDbCmcmr9FG@odtRpj-E|MCLw} zKC*_D{Fd_!kXs(19YcYgiY>khil9l+z#Vs66-QHpzp*q(d+9`kdlP8Y1QPSTX=8(Z zHL~#pLo$7^1zG;QbS2M3C{xJYlvrJ_9XFn|)APv1YK9X3=VeC$ z*R6;`QsLkscj<#VdSJHGriSTugb;lsGj_eR3{4i@=}1P6u9c4Zc@zCQ8`f~mXHf~S zG62PTCgL@R22d-{OML!!^F(ar`YllJK0rNu>#18e)j}*U+yY~vn?PE|z1k}WFQ>s- zUYBg(`dY>r#@_!h5^D;+e!6kD_C^1T!PFX4Fyo(oO65!N54{WZu$$X&Ql z7h;*VzOS zhlf;c`d$xtf4rkScjfWg6~cAcrC4G%h}%JHVCK$t=P0HM0z#0F>tVC^L-;{v1ph9S?Xr4G`dPZN*UeO4+MShbS+mbj$DfY5iGGG<3QMso6<9DTJ9n1sbS!0=J8+ zsHi%mKrxQbg>yn`#9lc*)RT0yfnHmbv-Hb~R`lIf?!6>O&?6LUztTPL;{smQL;u*) zfqlysvTq%!R$ig?q>bndZkJ!IpARJO`9iu|x3?_r3Hp@NBpsIkvZ7N zl4?P%xWX~Fpti8C)svn8ZPSC?Q?s?5cL|S!b+&*}MvVGp&^OTDv?1rHb3o%P>-q$y zZ4_)Ivj&fgmQ02As!a6<-;FQ;DLMtYe%>PZYm?Qp1tkvdP~Pah%AkmwrjldB>uMQw z!e0Y)kiN!J3@SdAFr4aN+u(iZXM;cAVX)f-h!UFK3~T(BLaNGi0i+`sB!|$Rm#Pl$ ziTXe#^%vtk({>n)YE(1^8E>KLL&T!O`z%6c7xi*kPIq;pqwKSy%JvF{@+|0*elaN@ z3xPM2axQtzE$d{I=dbuT*b^Sn(8sTmC9OQJ+be*%m{SUVFyz!Ulx-%4T?=S+SzuTN z*n)L{DrqQY`t)jXhR+^YY|M$wvb%MV(u7vP>H$(!yQ4ZEfCXz=d^2rC_Jo3LNL zcU@AbZ}1A!TPS74diBOy%W%i8TL4)+-T)-$5Ji9BscvwaZ!cj!h7qRHMeq8@3T!Ed ze2Tu<^p_Og+XenXW>KGL@KoMN0*KCk-oyXhpHyO;?bU1P|JYF*vo`$X^uWqA*0>E1 z)flH5@jX2#3G1W661z(Kkv+{PX%L`5wyx-%5pb`-0L54i@Rts?xBBo>7f3-9X0o2q zbv9{4-fqdF{n)(UD{lboGQI5wv6u-sjb!EHMCR*PiVwME#Zn*I4{3xl9go?>M}rJw zo#wye-!4x?!(hdGY39V|j_J#9t`ZX1KmXpm;Z(PFo;;t+;Z7;3`>S9F{;jf#J8nlc zkaC0XM0!AL2!6*G#i95jUP)WM`eW+(3KgE9Z{RA8sRty%mt^%1rQ_+? zHFhK&b0eUV7J3+nFqhBVE+YuU*bM(6Cat4)n#V)V^n`Xhw3=MGSKSm-x%1o=5(^$& zL;1$-L@XqjIlBI$-+D`6eC$T^oUTU#&uRZ(ZIE%ry(XMPe_*85{RgMc}945CI{kUQ!7isLzVXYofRvV<^%N z!cd*f++U3pp%r&80r=7eld-;@E+Kub_2?WoZIj)v1w^ii&?qDvd`y3un)Wi_4)3b#72AvAnr1fhDC_skmy|4U(g zt^*}fEp;df^A_U1vhcvQA(kxnO3u3BQ;Ts2z0 zsBxWjj&584y?hG2N1vdQcJ(j;goY~lBsP5j0Naj^-LCPr`bP*k{C#C&A&ET<9Cv)gSF#-j4YeS_?xc6 z*oT=v8@qSUr;#3k@A3wyv|FgE?*-|`i}6oWOe$&BBzB_q`X;1nwJM{On;5u!Mg&U>}e$QJ<%M%xJ?E3fQ!yjWrHQ#Ak^vrXIm_giH| zxh$8w6V{LAu@d_NjK3hlvK(d^`%HvLnUU>}pRIBfEjwBM4oa^)0}?-|%kn5RsPX>o zFPkYWReXmRX?t)Rc@9_0zQ#Lsib>_ePd< zu#v@s=GMa8Mry>9g#4-$s@LcaQdlOipWvq*+h-f~t7gv>n&_wt4x52@XcS*4OFTQ_ zY==Y`mY+wJAGp2QVDhY6dTJ3;znQrvz$z%_6~=+h41qFXczxcCbf%EW<i}*QLLq z5MVZMboKjhs!w$MF3u|HiFSLPU^3JXWj;VA?|rUEp4GlC&|1d_+>y2dfy z+Sb+6yX+Rw)7=sEs`)EVK4xKdk^imJlFC+bzeUyeW+j-AIThVBg2zIZ+Ob2+ z&7{|Ns_`bR+?$dkQlosYy};5=AY<>}wQr6qbr8g<=EqoCn_fTHbvBXn3k^IDGJwkL z{P={8jTrZPKM$cJ8~zCzS^i#S0%3&1NC~iu=r{=EJ?3^PhHRYbYhWc#`e(Jr)%PoD zGxHhU4H~3k1s=|tzxFI1tbGk^$jWJNf9hvDPj*QARH4AOkj4G0+%CsD%RLu``m3Om z6wrMTxr$dDE%4DX)-pm2c;Ah)A_ z;rd%tXLov(-rM5bdm5+YIa8*T{;Z6E-lwBy{x8?1Lmh3WX0;bu%h4-rPEvLPt=2SS zym`S10jLq^2L&rdFwm^5krEcrgp#d#a(V>VW(%Y)`wp;U4rH2MNu(`~csX||8d30$ ztg;M>@OvQhWrXU?iL-Pz-TVglyMwj3#99c;J{PV~NY6kN1E#<-QSR-nGq~&6X)vvg zE^)hrUH@;jYys)=&RagV@CV{CvKr_7l-d^>5*})Bd+^@;<$NwzLSoXv=xq#s`9KKq zu36K>BqcN@2oF>Ke$tVqbzNV;{9w2h4yTOWoVrChsN~GHRy$}Nl&=7GtbmK|go)v5 z-~mg20UPyLP)-g)E=SHUi+F*}dWPIY`-h|{tS3Ikt(SWt==V@~%xvX_`sQXNSO<35 zH~S7~Krr`w*Pl95vo?sLw8yPob^2rR4G_Vp=|kV~^#E694{)`zH1u)TJ=K&Rjbu)-ll72B%2ag3d53RO@eM-= z?2CQK-%q`QZ-4{z3?MoGms{H%uAo)88A>)(u=dDKa2!77Tg$q*$U~?jT#)@`U8A6$ zWmd%>bwJTx78YA&3k+6ZwWe~o^9iu`5He7@bw7A)0{A@_>sJGigGl00`&U0-jXGEX z4D8I@bx!{OAfqC>cxSKf|IZK~MmW;s$dSFV`%doxOJt8jD^iZfuwwhtO~dg=$(_wz zTDeTu`xS;1swTH{DVn|wvus59#-|=X{}(c9g#=!K{OvI&9W+Wv(B)=2^4FVT@Gd72 zGEFIuKo+p@?0?3-3Mc}yEW%H>3^vsConLks@@FoEQl+6@_pqKCz1+RByKdedteE;5 zgA`x#A3rhtn2xHMDji*UebXH$tH&Ck|I$ zREs5P6-DheAsE$&78_y2=)F7EFVC3kTWxD-47h z%rmkeVT-GH9J6Lbfcff>fDpvfb9#ucei& z%fCiQXp|%ia(jZHqRD}bCji&cEPm9x|8Gs{)93eF zj-|WE2u>2a?3*;P$lEYe0iGyB|+(&Xnrq{D=?rnqchL6oEy}x zc0tVuz~0QP6=*QC zO(dQ0PCK8+>E+zGr5bV5v`(CLcD^C_;8Li*NzBw9a8JS)T2*}qTgLy_JqboX$jnNe z>RUsz{J?e3Ww**mcSRFg1onaWlKFh|Z?Kg9XFq7eB8U!aWINT_6ot~3xUMpI3Vh9B zm-fBe`U4mnCEZ!lBBI=)8-3wNqRH;=x^<^hp3 zyziFc#kq%VZ`?=oki)Q&N0_{`Gl(IaP#eP$&e|sg7Nu>v=s0ehE5i2@Xd5p=muPEW z0B!=ATXYPT{opQSS_5js-R+)iXA+B&JTtb0dExsXytMJ2Z-00^AWOAe2nEU!-$R$C^v_%FDXB0q*W6quC5;5ok+_H)Kz|D~Ns@tHgv}j7w?R3J#^423#+T ztKGRb5D8f!b=mxiM1Slh%a>r1R*=&v{*0EL1dB0sY{Cjk7*$c6T57V$O4+c{cW=W_ zJklL=^%VDDi^~zvnoO{%dYh^q=xTOBXyvqc zWFy%A?gJKNGW~l?!flRozFqBnrqcSqE^o2lYnb16uN%31RZUbT8vAT7@aUM;7=mv) z6B3V?nU#`PzgnmV3RPGSrJ(H~as07|KTw-&>4l-0ND}6I8<4+^I8tk743s!abE2d`m@)Z4Zl_IB zMrfJ;3Z8j+&t9`g%LET;2BTH)5O3xhYww;Mi2Hl$fpN2C2jOHOE-Qc5d<{nM{|To4 zyAg9y5Rd?oRJ98iJx;(WTb=mKeS21Sw+#grfS2Y#3giuwu^k3^ZlKc;4B_~?Qv)*F zLRTGn2ld(DYE=el&$oMY*F<)a6d2-Mx%I&2_nqSZrwb7v3J1obRf8Gp>Doh?vgwsF$b2GxzMjoMRoXcm&aG;Pqk-$v(1kOc0 zZnDAbXm-)=MbM=_PaVXmZTug)zC0ev_WR!!shCiyEF)`@Ey`|)vK5s|*|(y^SPCPI zr7V%XY{Mi;n|X72mC&N=VpoCDC4 z)W0w)Xx(=`b@1>uT~s*AW#1^!P!muNg236FqwEt;j8|39J3({lp<%GRG22tLVt+I^ zR;&>uKM}@z3oxL~33Nw@6B%XWcQs#aBsArD;Ou#TEq}jFHS2GiDm1hY{~EXu%FIJ|ZuOD8= zI)e2Fsn2(I=?AOcEgylgD;#vk=pBk$dlX5S-!6MoHOG)oP?alI>A0Zrvw8c(8ILB7 zH7Mg9F8KtUhBDA(yh1sn_P-WYH)#tYX5J%f#}(g`=DIlyuHjO6TGeQ8a&yGIYF2M+ zPW6r7VV^#E9sQTPD*g{dHL)%U$O5qHU{;vI_~mRfC3`t9;h*fa-x;U>ADwaGLrZgT zV#?xGUV|&eJdhS++8X_lWOEqIKuGB=^TF}&V;VxeyCvE6p!io7a5 zyqCCOfzCwiH}*&csY!g=uh`;!K;V}f&0u&1rfK|(a{$x(ir6}yRRMg@$^I>b6|29( zU^T!CJFw}6yXCNSBp&SN)Q^$@2K}hOQS#R75r(>t`WL9 zaSwLmDCHAaG!gLZ`DQf(a7W#5%5d|?n0@nCN|(M*@q+`*|>o z7BufV?Odj$8BZi^&wULo0e>S`uR=hb4ci2myL?rXw}8HeMudkwZ3WI>T}WcP^@n`$nm{=ui)aHYnpiV=x`0ljSeaElKNHMrMKTQ4;B z#Qw~hb{QzmsR#SpffJ8!iKQXWc;R>)`9|ln|7%;p|Imj1$F_n>nFd5PF@Sv(PEo?J zBjv2?Mc){CO<%BlZE#h##tHN))^fqyfR7MhPyOh+B51u3=rxT?O~=;rg#9%KDu}K7JmV?9Vr>g;6%y6x1e!AEB;$5K z(_zU8$BVE_4LbpBGhwrft;0_T=OOb)kjX0OzoQC2i@3^hGRORwiWN$cdRA>kf`i)# zrkn|9-~POJN|7w0x4;KK!*p}592@7qQf7@XwtLS9+EL#ATv6`XP5UHo@dani>sg`slV z2wnSmmk+b9O>q3&rcHknD)HFY-g{y1tucdO+A?Hm z+EIN|N2rH6f+?)~-ECtp1>x>ae@5_s z%>5L5$IFoYnTQvcT%qX&Qp z2anL{b@A`@y3wksiq>FQEQ<_Si2#`tV?CZ+)8{wsLTJ3VE8UY=OmiL@C9jTlmjkcs z-(?86z5i<&!tk<6hb)tSFyicKi$#27PWY93qbHw1&j(!3EHD@0s$<9SKPv=UE7}VF z_Pg=??RUfefBM}fdXszzxq!0=UR<~3>c9jikCs{emqM^D~dg0+qH@H zI2`d~%yoa7$yJaOE&j=gF74;j(9&uOh&8jS(rxtwopf9bpqTq9-H7iw_F3e~GY#HM zAC>RPhuQ5YT^{*!yV)Ifw+kQUhrQx6oM~g59Q+U4qKY{n?>SfcpbHKLod4O|fD)_h zvO6~0hWoqk;Yw%hT!#AS;u@)h5zGw$!&~g6y+^*i;{HLUwG&tr6!&OZEjv}sMH zK9$b#N)_#nU|P#V?2xqZX)-1{JSOS(mWm>^&=!NN>*f7sJQ-k9d@uKR#LWIO2gp?k zEpss3=+cQ`$it8poF#9xM^M|E0`7Au6dOgM`-#P~Io7qdX05}nb`OrAnZJN5DPXV@ zs90D@=8Inr*DqzWEd9FMY34=Rtwi_!j6zW5+V=zLd0qMpg%;Bl(-8&Uga=JW-c_u+ z?JK?lP-X(q$owCm(XR*X6Ralrbc`JMrk~)=HKm?U*!)&5)~I`9_^e<${9PDAHbVqn z{%eTi?y@Zs0*?gvv{X6nV32pH-NaX#L8cqu&31nq=uzf1s@y%mv~NY?50{FHCay_O zsg=Mh6ZyDiW+yPJ8Eg*Izk~|l17>|aflBdY zuueg8QJnbL4sZ-3$`N)0@KCZdZHa>hG;b3cJZQ9|0UC2NNDYdmLce2aIx#-}g<%JI z!R8nL+rCEMgjU!_e;^ot2sYWtftmCCn(+*O{(@+_uN<2%hF&N{nMFDVg2~sNg0>=V z4l6wzF2S8=QUqbHQ%RsVJ3$k(Loat<$bl14r}Y(r_xJl_p=FE|zw^UFz1WD68YB2R8K;p1B79ZGQ#fuAVRd*x6#V0l?HY-ftHgaK#RVU!WsxaeP zAEtv6+h@79saSgNNsOgl>9Al|Ub6Hue4L%?yDomR@FMdG zoT=e=F(RmlG&v&g&RC)zx2BqNzN__Z@7&x8gI{m%nEbqN!X*%d+k2>f75wwyVSj5T z{D1(kgVkx!+y!3T^7(_FybO+`=q)%&?}q5fdQ!EftTY>Qo@2WlofQl}P%E?<(Pk{C z{5r+HY?F%Fi;0|B@_3z~rdb$%(SA5jSKgB! zhpN4;GPDL7-PbGcc9>+p78L)8m`eAiy!QyUL18Mh>J`6C&t(Km9p6P=MeL1j^OD~gh-kpTL@$Fn;Xz>Sl;cLwTzk5n{}!w;T>C{x)O_N1 zsl1Ry#0=EZ-OQdW+TIK7f|4IM?BqN|Z+gC+QK0z4ZDa`*3#qXwp1p^Ow{(?$41%2x z+Tg3*fWF#`pt{UIzjjJUiEF%Vxqa`5n{&fI%_(q`m9Nho%Qz9 zxV|VW&|`D6k|Up4cXgc}BU6R3KlnkWw@i?=?lY02LXDSN{FwvNd9kxWQR!XK+UM!w zm)?gn#dK=r$E7OyJT2)Ly>G<)lmXj+V%&->NGUAs&2>IXB3m+JA9&h#%whE}{6&b= zQ98_H18Ne589BAWs39xop%QaK5@KZ(Q#*e0tJTsCn`^iQOA*8e_50QD;G+|4%&T-s zj<0{+@g+4jyl`$5qnW1)tE8Sq30te0QpclznO7sJgK0Tji&LjG4Q~KLq7kA6e1zkT z%U{l-+F<3qVxHk=QC|_ZQJ&l+^H%5e3)ba!=%X9+S!FU~93ktC+q0>F4 zlm2ErM8;0Xh^kwe<(I>_HyDVRUo3Kn;_HuID6r^zbWC@(-$wf-KGa!uCpvCRb4%t6 zE78}6OMKN}@hI4z=30I_!`BdWlzfQhcL1WvnUA!xde|2T)t?t=)=AaC>nU4nV~(iN z##~*v554IK@$aj5s$?}4!>q%1gP6*$h^)w_dF|$n`lIPUvTh$$~k^S)FW6&b=$ALev`)EMQ$V0PxkudYAz)j^)c1&AwHhJ zI3}dL-^fnO1W{7Usb|B%BSpsS(fy?NN;ouY==|IG_$29if|S_`>w_mh^%x^|Vx5jx z=W)I>J7&_7Gg;hou$MV|&I`XnVv^OlDv5SEg1&GL@#OOT*Gr#krN+$<1>W{kdOjeq zCD3HYOc{_*Nv^=VeuLeWaU62s4tLo>Q5x4T$HS|IuY45IV{mk*4Lc^qG<>LAjWqJg z%1x#?zqZ#dm@bmZ2-MC_MJ)H0m}J4V$e5lhQ1^7e;9L^TphY{U7SpHFxw9jTyNZv? zey-cnJ~3Ay=lb<%`pH#*ohH}#s!2L}&<$k4Dpdv7iFGlDKkIJUpz27~5XU69a5z3R zwm?8<1wCGiB&n{yyJu| zbFhiAVGdb+=JSk&x9to6bDI&blp-$l`6(Ur&oJ&EWD0!lywJK)~V zoiG)7A1QZQ=ACPvuiZU-ScbBui(l_87$5l zuM?t|F@k3vgB&Wu<*TQ>E;H7~rShCd5MgTt`*MwoGY1(wPNlOPZ7&`>jcsIJnZoCE zUR)ZgmF{aS@2um^Vq@;PR$sH}q-EBy<0k%Ko{AY+9Z59qXJVvkWy}F>{$Z24yf+la z=9U;4Q%0~imW%Jx-39OWA@|kVDUqcZ*=asoxHx#khbJyzq}_h^XGD%`P3c2>}4l$X9$k(`NU}i^k8M;5jbQr4Q%fL82C~e@Zob97W3vYr2)( z6qx@`TSv>=LJs#K+n`>6x>wx8ctSzzm|LnUou+XD$gCi6bl{Cb&VzUo%aUDNa4weA zOT6ci>H1HG-re|6CyYB3I-Yy-TuFSk(Mq zM7>IIEadd|HTLRQ5NQdsSjjDaD_r0VkQgYn_<{bSG7XRKz(;9%W!z`nsx(I^xw9w(OFHe1vh zU4VV4!{u>SKz9(49Yx|UU#kXNa3Z_V+q4;!#eT}#`lwNrLdCxlx09z1Vl@{Zray>2 zld^Y9?!;$YJ7vJ;VzE_bkxL(iwV#-1ah!ZYk;&jm)mt4?q{5yo4VXN_VAQ%c32XuC z{ov?|O736^`M`iRzaisGW!hjushGE2gKrK`(%nf*i7AcJ#~dnI0u$1{;Ju61fpan+ zy(;v{@TyNT{NyvMhz(ff;okvR8SW3_2c6Wec`HRUzIKWd8r{gF_;o$1hV%Z~a-%HwXYG%!L>M_;J+d2ZoDRbq<&TSAsw=JutHEbVjl5zZO+?0=`uBfe2lp=^B_230c31YPR7jay6_ip zR-8Kf1?(ciH(MS{$EShul1tTG;-NlFw!u0?Axa0%M@nXJmbrbvpPy6nlpP;pfOX0$ z(Cl(a!71jv^1Y;Gy(?bpMI+dV7Rr&^?I2yq7!$|is~bJD9r@6)bIUvD#n2K@XnV` zSiQ!hN(HK;%8rsMPy|@xd&d~{EDs8_PD6xvO-`Es$lsT$G|f++b86XovHe?yD$+5Z zg~v=dYyYxWN>rtP$r5M`n>Ko71 z-W3U1=PxT(*>5p|1qM36YGQ}Qn^<6~^atO{PJ_9u)Qc~#h!}`b->qUii>VeLyMKo= zz(cb_-rgEq*xGA1=znCw#xHeeB4&lrNud?_igQJX#&w&)82^T0>NJb{+s1QQV{;}< z^%l=`ovxdj(~CBY+~_P=xK>JzjwqNatT-&kVKVG* z<*H}wb*%9!JEoVKc=Ybs%x%FFpW3!ZV4}kJ!rc}vkw_dTqDJg-x$5*82ay$xR6^h` zJ>pBrl-;(fL$^#h<%(Xc#?HsYulBNaS?&n0^$>AgIQgedI)aJ8u~GopczAjwlE(Lw z!9n14B^In1=;H?aFDj-Nwhq@8f8*(Ypp@6?`Av_z&RZ+fBcAlC ze3hQlujcCXtuQVCoH(Bdtq7J^dI_osP8G41GHE5IDali|^B_)fzFmyz~?3r?M zLT6Xm8S7EA=M_1dwzKk0$?5qW_B=w!XI#^p9fKN~am@_VZ3M8doSgu`MOk%EIoEWD zz)_2;x_WoqxkjYKB5dfgdW!~FI18UDyKQ>MVd+X(c>Hri>uvw1SOc#JGJ@Q-k{=9e zXX#nn0HuZ!L9x@l*U%!#_zRb+^RGSEQf|Vv<=DNQJVyNuV8Ug28f+6aW(!AVps?M3 zlX_eJhI8i5K*|ZbMsCgKrJtO-Ir2ta)r{Ww&7@%s<)K>56vg$6#zZ3znogL|eM)CN zU+;$9N#8xHj>(>A1NeMZc%F&%bLkM9nfng8ycG8j2M4J4Q)ENUmXNyTMbg|X7V9m{ z;OMRc$_rjL=>8$Ddrs*q4$xdwy{^t$PyD}d}YWjzS!N^vNOP)Jk?jm6$ ziK_Tx&@>THa;MLL$&V}IG@x)7-@l?y2#NSNjxFVH#KEKrC%CuhH3mo1NSU!!D$&ja9E{TfuhDjnQ3n2HysxW7Jlp6kX!f%-%(lL^!%>`m9C=OO?7S2)tZtmxk zFK3CUZ5bYG0HhQ4HfPO1xIU8{Dg`A6@I6bcinEG$wqcXGe#S^#n=&D1wBHggH%*HX zDcWIo{+wx$P^Itdc`^jsT6R!k^!aNBZ{I$%mKv}|J{AD#4f?Yi7qh@T#&QgN>caJp zPeUE<5C)PyAZ06_O4l|@B-Na38PB%)1LiIHk&-tiVv5u~`7OW)Jpf*HvN9vu@5=+& z{4Xv(4w{CPx2XocWI7S26Xc)nn4Fy0O4+6(o||thZiT=8YPIz;Y&XLFDW-dGulRP@ zmEUeI>PYmn5?%2Do6^r?3H|ZjherW1RT`LOi z3kn)>Ku|Yy%N=G6RUT)<$pSYO&uXhse@4qMPQNg0dmM}#(}!*0eGX)cw6kDvJ}D$5FX?H0hw zd@X0cU|Elv7>w~X`SfIgVwx-V%2-d;ZtZ+JVyA+$nz%5(n3ds3l`cINvvP{@jEv%N z7oQ4UlUb`UdoPiE2#oGItNew-71{uDc+HB)b{k&42ypYoj`5OOzCu&)IQ}NQzhGa- zKuYXzvJw@WHF5kcY3zE$FIxGOZ%<$UVlJ)O`v)~Yy7T-70}+DB)7vU$&g3z@Vm~nt zUn7Klo1d<&P;c`jdkgvWRUWQt)Y~d*1}?!uj`4YF&Gn+X`4jk`B_}zr^-hE@OXWHz zuYWQI$e`>S@}>?!kzYY-9@pG_&39k$+^u5p1*VBbt$yW4`? zN7QSg-C^sBaqmIEs`x}GO4>4oQ2x3a&ZGO|czXIN( z_o#T{_Qwd%q)1%3@00Cn(NQ7G&i!(r?s#%v+GipLg?R0NfJq_Tn$CNOI4>eQ%k-3r z$a(lQfWC)F8DRqmV1MuKA7oL+Y^? z^Wh@)dX}n@8fsdm&A&Fk`N_8X^aK6Mjf)yht4m&;Vo?8H6X7`U0hG)){FoW^zuSl; z${XL3=VyEJ%dSQIE8KlF%QzVx@p;47dr*1Cl^7~E%zf>>;@Is_=aJ{6VR$vjf#v5Q z811p_YSw?4anyf9rzLk=MUrfpG0vJl%tPNEy*BB%?49c9kB*EzuFEGgK5G4 zsyfrNekH^+eadHRp7 z|(z>VYZhQ+oMdQ0sE@dX5gXjm67a<&OiA4j$)! zrjI_>WRN^dQUa_85={sMBKA(bGF3cAk&|-y+$(=NR)2q{AFrG@g!96~^Ub2bav!db zj{H1gLb84`C*YUL*WbPExxQ}W^0~TBp$Too%+7ETIqo;C+1syt8!W-DKISvJd>%E^ z`OcKmszI85wngqsT~HrFntw`zKH?q3^4bq&zV%LW?k}r zah1zr&|4iYR5Ev9tK^9*0HI)fWQi4KlV7Fa(dF}9xK~1fA5T|D0veV7Hi$nyfI;XH z$_mzQ{@ zE6`18emC#9Oyah2FWc8{*BADJ|CBFNYjyYqTr1us*fe1_bAB;736^O|C<1V zy^O-%!NCRC^Ko;XU@cJhmYzt~#65+rPgteQXI&2L05mf1G-^bod=dn=z)0v}1 zxBhPeJi&}#B5a>hRMrzH-ybFPmwEI83s4M~rBI(xyIOk3<@3=?bH-2J z>0n+H#EuGS#rN{o*8 z7c5==TN~7ML>@pMFAtV)P2%iCaJw>QBZU_gs-Xy?X`M^zdoK(L=IUd=9d*3%KE?`0 zt$F2r=iY2`{WA+-2Pj>yY8L{Y-k9Am8MB)juCN)rqO>9Ee++V0t)2a7g++G$hlg z7tu)X7&6qd+m*BAiV=EMD^tCW2o-G+Fsp?*N0-;>n?~!kuBMuKoL;vQu zKt4PL@JWzUMXyzmxrlBVk64YU0|bmmmDzasZVRoDxw7Cwior7YuRLsLmjIRV{QDD{ z<X0ouUYG#o}pEBy&Zj&&ar-z!b{RVYN?+HA4=Fy=!EJ2K>h#S_xl21-Cjv#SO z5rT{fr@cZXt88beP0tlAT@gE)na?$Ed&d=>P;p>(5q|=6lwNGO2;=Oi9hS@&c`l3D z)>i&9o%oC;44kA@6Vi-yZo^lgvb&#yes_}t;p0*<0Ix{fqY48h{2df+SX+_5 zy&_>nQ_kZF&r_m`8I4R!o=@(u^%ehceY|gOG+CpX*%o>|!4Kbd8cNrHb_*O>Uy>1> z5G8&l2-rtwohovkF{u3X(|KLR2#bGw4F1z(W&>OR-y5ax``awtkqm0|!EO1EIy5o3m7+lf3a~Je?jv~LKG_)y*M$s|6LU5E>NX)3ejwKUKh!P0{G;nbL7U?&`pM0e-H!q4pK2f*0yX8jCxEZ zF&IPn55Jk%sh5S`YTXg~bPK~zN%#IyFFOR6&S-zsC^@WWoQCo~Py*@1GgcK@_51V^ z7%7*Je^V0IBhrq0qu4%l6IViKc^L+ry=uMPkelx_YG|1J6GeY;-fkNUVu9IncZixzWIXAmo7{Z1fLy#65|&oRA_qG zBjbCkr_w<{KCsF5t6>8xyilG_Wv<2PrufWK#U+E$tBNm$3e8%hCqG~Q9S82tl-gJKA7ZxT6i!7xc)QsG zNomF!Y?0{h8_B; zcv^c0b|ggA$y~dm(3YiJSRNeF{llu`@#nCX_mG$ak={G0xTL*puu5ih+rX@0Xk>hN zRrF^%wL5H54}-f%Vm!A;Etuhkw~)Yw=(Y7|sD1}+!~5(Z2S1PO?fv_5jTeZsVeD7N1aaPK zK#hSaprFo6Rl;VB>1{?th-jDUGi&b8PIgI~Mdk3U#r4NJmq})Cej}Z4d_>O);Z>Tp z#u^tRuARUar{`GsH&S8O5 zQDi&@wO?pVC=WYXPl^)d3Tt#98Aar+6>v;}?Db6hEoM!`>RC97lRiO zc84X7V-!qcHaaeV_`6WV7AzE@h8BwC-Gmm30HU+8^x*0V4A23-re{@ce#-3T%t)iv z1_=^TGXD4161DU+WC>+of{cL|!1=cyse@{ds{YI~E9*+`Hr(7P(snIiZXxj7<+MR@ zr*n{oijX`I5}yVHFT7J!stzKHIDPjaS&Grqv*qSz?H(~=hDX8#-4&FZYwkIfl<$r| zEKx@M4&^$URVtI(1`U}7u8YY;n?LgIMG{r4P~eW*(D{|V2{f@5hgBwTz;%(7c0{Cw zm6{|QuvbirZ$>D5T(dS_IT0U@8asmHiz>Q=h1iC3s1DMj{=@>gC7-^^w~fRE_<|Gy zF$RjcX1xs^yxS^GASgk!tnZ3sxK&{E>ON1#JY2-Ob54{4QfMLMOo_+yj_Zm~Pjyb{ zw?5lDVKkT3L}ro|wm21M-=*tLX6h-h+o$sfeZzU#Y%wQYmBugR_+0=)Y9ywmB7$Et z_P+mH+bzd=t=*qg{uwM)Rt0IwXUMUh{pg!76ml=fM`exZrnE*!h`&vh@heXWWnc%< zM=(ZF8G-HznP-w9%pKjji`&ufRA@Ivi--mDu@if8K4O@%XY#i7CjeRH2~&I-PE=+|hjthD=Ewbj-_we7KYsW5A0t)Wg3a8VxmXs{q5c)-@(}%(O zV?SG9v;zyK2JW*V$YrbPpS-gIk(ENo?_G+i)bb8;)1GIp86RU{$y#w_d?S$`?{aJ%m(J9fps_#om(hG{EP_tzRw27G?AA&t2DufCXBFuV9!C+h!b&V z(>+;Fk>}w)Db28IK0_Puu8VN%(G%=H zbljLAf2sD>^#Z%KUam*7ty@pwF;g)@b!)fHm4BN!3_lyxcvnU};{pVL^1^u;P`U}^ zFAqF~pxQ{;fOQwom zn{F3a1PJi_P!YZm2&CIyI(OB*-^te%;=S|bDHAQCqq>gGof3OmXg@a&U&_jQmw2VD z7eCr{VG+GPx1Np`L$+T-=~kLhFVTMj#YJ30(i(y@Dt1J-u(JnbvbUPvxsf0UacL0Z zQ3IxUBW^$LS4`Lv6~auUl+ITS3Mf7vwhRZKp+CB-0HNvP4h`MX8l8 zjOv8H9=!lgV|Jarss~fh(PdtX6woi{!b)dKFZ46h! zaimw=bva$2gKbt8z1dG4Nr|}o)k*SX1Hz<$2@I=qN_YVr!E$#s#`IBYef`tsrrsdX z;%&EW!mI7CzC-x%A*)dZAQ12RU5t1cvZOS0#Y8!m_&mnO;z3DDlXD9fjFnoUdSC81 z(}YiaZ`80gx-&B0V@4TYZ@_v^ukW~3dA6FAyjp?Iw}x5CrM3DF97r zGjw`aTv-W_^xh@GBdFr2(eGG_F*j zQV@+i>SP6#*pL%4Iyu~tJ7`Va287JV$FM(56wHhOv|VdkozDg$nywCMedRkgb*G~A z=;#Z!J+tzwc$72`aDL6lBvlC`=vY^8**IKxAdkeQGw?`y3xsj}p{ITesLyBjQeJ&uCstIok_H>u}F|-&wJ9SYaty zc;LLi^rOXK#!@#++ROkijnwd(WetirXdJp_Dz~qY9$+9cWkuL2t=I4I;DlEq;KLuK zzb6F=E6w8P1UI7Z6ORs$d+@N=RC~=vukpOCv;TALQ5OvXXJ0`N-m#(=K4Cr2mmy8z zXKOzkc8M-j%9DPR?Fok19op{%zE=-BT@L(G-;@08*r_O?Cr`M_#4iswrn%okH40zX zF?waErTf|tB@?;1X-^KBP7oZJ-JHkgVs%}=mvy*uc($+Ht0uotl+#u1Lx?)-?mc5E zbyYmc{-aP&&fV8jx~kp*p|nXE*xEmrL)c^pBn!XYHcd*& z8RKPNMsC0h7?YXDKFEySpbpUoeM!w@OEQMn+(Wma!p{0TCSgB4-o(2+^?O6=d+nyB zOFY643t+QFNbbAJw6~IUKRlX=$qooE@B`*F0mMbv#~C}Ql)5v6oLLeCnO+xM13DCK z{3ttz^PpA}N#UZIk=#c2+$KSS;1byOzKFMIZ?k+iUnw@CrJgj9^U*lgw+(BUNfg~n z#rdVL22)bJGNsKLXATc_`Y2Rm*0VI>UJwS+gzxiYH%blY zIjg_0D?bv4}@3^)PvU0tRg_L+VR^M(P{Yo4D7p~~bL}p3! z5YzHYHJS0%*Jd2*KBRhSPx_CIY?7UY6CWfuLyUJW)RNbw1%8#)?znD4wD*xy?x%sM zWyGr-qSDKRnNUGyujI+oI7@F{jIG&IaNTj_rcFYr{LRou1b`5P3(8=<%9ZCXF<^EtZ;I zlt`z(RL#K?T(<;}N~YBVy2lK36-sAJ@?{jK!?=OzUlTZ!4@WRqDmELw*1+ayB=|pN zT)yYMs`*X3_AiIvZ}tkiHv-okzkafuMW~3KdHTiTVisffD*vnR=Kg&2^uhTl#ue?q zMT#gXv@r@R^i7jpSIob9R*TtAUYB!MLTx|rjHBJlqfC_aPzY#>2Es>e4zy&*oTO$R zBNC5Pz>1TL7O?R=N*z?cQH!}b$C<`mvQvIvKwWrXLgG=d8Wjg$Cb`OG9>W0 zFs{tAcYgPLuV+W;eib#GKYtNaQEV7zH*gV_PXmZ_I3~2BA*D_@ys1zleeJvtV7qVf zBOYaeDjlfb5uQKmKK?bDb95k?CrEeqZYmp(!)M6&gYI<8LNrM7@A{s8Q)Y_eN~}gT zpQ9bi7*$6GacR$kPLU=S1mgVhLxJ{{Vu5pn3)XHSo(O&_==lY8%8TG;w z7+k#xnO?tna5u@mL$IMTixvo%*R+u0^mWW9hu6IK&8}6@S)M3t2U`Nzuc-Vr-^}Y| zNs0@og(41sZXQ?v0xlJ#p5{?9Jr8TxCBSS1e-(n0LcwUuCL+}$U*cHh23b9i5+rqfx+IwNj<|!oYrpxsn zU=q$79iNR&zITo^i0@L7-n~18KZs7e<_sq*HTW0qE89i>L1X&hg3yYAsyCy?$A*}J z|Hj!-WnA6=9a~A>)!){?tw&j$)uYTdQb6m9ocdc2q2-G-z{9hb2RYjwQegOJYv#P? z9)X#cyenTu%0&Zj{vK=NUwqG_|U-3cuML}yAb^Ab^eZTKn#f`r_ zDy+wq!SgN?-1AHLrvi&K4@Tf5Y#9h?+UZdO~HC0%Q1(XgcJk&IHh z=jEMVGJ^Iu!}n8xI~Omc3^Eq|q*K7$Xu$W)e0Et*yzVGb)8Y>9ooFOc51&Z->6tLm z>k^|y+}>ha^c@wC%6byli9erJ#$e5w9%lfK$75NmJ?^&I-m)|Nu=@}ZS;3q;E1Y2` z0(P^v|Bfz#R^Np;-4T!0M*^5~f!zg|TT7$TQTv^9FVw+mcI2DMqA{MT@#D@Jft7Vu z|H5UTOxbGJc*tqpCsKns!Xz^+F?JJOOx9+|i(<4~0E$hC{?j3P4=4(rM}45)1se9 z&25Imn0v52vf8<7jVcw<2+)DK33Y_>8vRj9igV`vSOy^wX6xrtTLsvUy#J`=uIiJc zn6YHPhtq(xsC$P6JhD81UOEgh`^ZZTVk*Po5b_FhoN>FuA_r@7@6J2X$PC=_$u~G} zxh;`^7~#g#n&6t%e_5@SyUO(R$OJvpVX3z zYrY5p5NPO6~$*6N|JZwY)8?1KZ!Oczxo0x=7 ziP8htFqD2!JL-VnIxJlioEVTUONR$5`t?h{nOICvww}rTuQ^cw5KAd}XgNNvp zviPq&s1rrpq*uK8^G%VJnVQkc40Mihy5w({p*xQ4i`S|StjOb#b2^Ic=~`#xm&-#` zE{z&yUldvfBYpq$V_F$x^TW@tbno$0eJ+xm__$OFnoiX19H1yXe%_P~7VtLzn(?9U z?B~P^IbiPJ;-(ICT$()>6ixRp?Boux(~3c}KHf#_f?=<}LdPo~CLE|k4eDjl(KBtG zFjq>*~w_wVKs_e}qI#LN4k5FUCpu^UH(unNsL{egLw~TkN1;5YR z;}%hLg`rfy#=ZJ`Z9Wa0W5vEP_-(5jo zp_3d!+jarA2V(R7+k2AnqK^bV7SD1mmqs#&w)aA*cun{AG1;7{U4hQ)eKP|Ymob*+ zf0e2K0ycL5#%%-5T5nISK&?@=QMG{QnqR+tIdv8Ya_C?>(ut#3`$~Q9zwMT?xm|B_ zxL=1%t<52-8%YkOHQdi+7Y`Ccxc7~oap|Iv?iao$+dp{eHjfqO1?)pi*HsZ5p6Q zU-j$l6({3eK7fXZY%z=ITwZ$vJALuHy{!GvY>#{+6O39_Wby{F={Ci*V>bUPqU?7o zmcz{Paki6GzFQZhRV`p zxAAC}s{7ou=BPhiNEsH9Bl~ynp`h8U*|DlWdwCNe=zf5pnf}pIf;T5{U;3AmpA-0h zao;$fxO z9CJew@XWyu&9~qYRjloGsVUwA(7U7DAQ!396q_m{{kUztj=%dzIytYx758iE*BDq2 z>Sn!fHm&Abddm#iQ|d2sbu4+&YHYtJ)Ad9@-gNNH0YfE~2B2c^ly`fuQSqCNDkGgz zsWDzgGim4HFUGEzV4mJ;5sC@BD07>m^Vu0tLQTZyeG7}<{wwQDTYrw-pN(j5t|*DmJ5yu*bisy|7xJDV>aXFf2% z8~7!rI3F*_oK0^gF=QCa^z54$S`cJ`6_-q))*w7kg{ggdf{g*a1C@l z1?%o?Qs|u%eP!1p97I*XtpT!(0gZ*!>(SJ3_J{#nZ+WyZCvf-7OPL0VTm2epK zD*P=G_*DN4Py7O4gWK?!oG784YPVn4NnC{hm;K#!jn*S~@w1(;o7_Oovj{A+G7E>8 zT7d2OvP>{i4YBg{&@?smjmS+m_d7&I27iWgb`{V>b@O!6&A0ANI5&?}@bePdWg~sIpX++nm`|<0xbCfVpWc$RoSdUj z^WNHfZe`l?n;IOf4x_im8!_^Tj}yUIk%oD(ZL`e*jRM4*WahW~%0O<(0c#r*YEDbX z;kORo*wjp{H60zU9*J}A5J_Hh(3q9yxy;8}li+^AG=x+lgI0?oq!D*d%ek%Y;*G$^5E@;)2N;#g@b-(7G(OEkk@H1^mg)lD0{2*su;ghUL!%tHb4l9F4e)`^q z(-zH1Kv3riQy%k@!*WNS=z*^(M8W1lkL13T_RMR2O=J9wf+pFo9He#<=Ao&aRcZri z?&kF#FVHIOS-XW)m2Mlm!{KZq5XyQj2zHCqQUE3a{DHsS5(2*#pfmNMFkL~nS}VaM zeTeeUh`NEPc^s|*HNiKypeA@JF~Oby&<>r8?wk0|m6^WOGzqt+{ys6H9%jy8Lk!$98R5CddADMS>vS*aE z{3G(CA((AHV8*h!ETrzi@OQL-!2}AWFE`Sb3YH$&rE;cY6CeK^I~zKhdPY2}o4)Gy zi;*FS^Q(y|8VN7xFH<>O5Ua5*DYyfx3OMdn%j^*~Ym=Y*L(30(FkIrAs8clh2(<=%^?Em;$DmXDKsU8Yt$E1xv@&8|j!1us=B9Q6<#9*rA;hA-}P1)TB}h(A^L6l&e@6#mF zZ7n2APt%D&Nlj*;gr{vSv#k$` zMU1bC)vrznJ0z!&vU|9}=v#2OQ;Kr>h8+FuNW|Mqdj#93hnFuKX?fxwW~ChkW~DRc zUWVt#4F-uRjtm=aDY%v?3>hCfbx$A_;dL=Xt*!P$TbJkj><>^|LVCu+N)(>Bq@k{s zb@(Irn(cJ;8xgQ={IQ|Kk*@}#>o#A~x1?5IgthoC*DCD}(&>_5?V~b#X78|u{N9;( z*&ULFJ+w!&12OBuRfDzJFMeR;bM9x3i*Q%8`slHEi+S(@Ou}^cC!m7%9#cVM#q*nv z6kdI|kQ&Visygs=z>~RJ5|x(aRKi$?tkJITnrQXEmQUI2c?;r3?!253&O^PHo|eS+ z61m#e-TnlsMOU~>f3~eu`l*4Z3{H!l*qb;9)yPP&v1OZ+Pp*iv*PV}Km?5+`^1Y)gvJJUKvVpL zIq6qG{@E5Pq=+M1657tsl1Nn5Z8m4D=O}Afo*H@GKV(M2{d8ff3WeFmknyc6BhH(U zWR5`GsV1dFD|Qc(<;`GxrA4$yG5s2!vW@1aO~);j#UVzDY-vl@Z16$oVO^B(r5R z*I`XxPFQqZ!ljGr=TZk`!63rB=|(Q7gofRuFDQ5J_}kaYBkBYi@wGomhjrNw&UOav zWE5ak#9OTsos!|LqGFl)Q3R$=LhOX^w6P6oVALLHMvY14u9GL*#y;l$>JPShF7t04 zwRsko_%K+_TJ043r&$L3M1LzlkhvOI!)JxLAI*8y-Y%Q7K;s7dHt^vz#uodk@En0b z)4wqA>mt2|F3e_q>}7Z?i)UXu}(#XFCircQ;Y=Jjvf6E@I=iTG%3L|ic_$^x05 z0PH3uieUwya{;(Dk!e3W27l|OPCI!}U*N^Ruu%$SYhskyvpnZt%+zd{(hnjNg~I$> zgVzudF{w6_I0MK9o177;|7S!|P5xp%tp%tWKz-075-OqhX7ZC@5uJ1&7*cbEBE0EH zeTDu479{sgyyhQ6jIBdXcI=nHyMQ$cxuyVx*gML0nj6UXBZk*n@@nD{xX`&wF&Ef{c59VDG00_|(ybX4#I zpW@_iO8e%w?MoEkWsJ~>_-R;p^dkWtgn z9V>axl#7CC=_%D|X4^fYI+kZ%6fA}JzaTaG*#=IE{Ybi}kn{__sEqLPA?2+VZ^>C^ zr(*P1u;1S^_|nt2bf|VvdACL3;0(%Z;@#?mD2130HSBUJ?$_zV69<(e!u#^Gdd%el z&%EFnYzT6&WYwlf%`=I2&!??2cbWFPy#LNikJKL1JN-Kay=lWp92+>1ljoQC%RvEQ zC{wl7Hrqf(m57<7=rtcTJ+$-+=3?Fe9E$hDR6x=>%IFJI3WVq$Kw5YiKK=lrmc;T! z{DQIHLC_*9x5PSV_$L`ZaZSo9z}$#U88VY5u+8o8Wt%TH+nB<}?UF z+tnK2CfTtF=Q{rFfxVl~hI8?efy%7PUk$tcwqY%o=fidK@=)LPc)NefV!vS9mqVm6 zU;5*-)&h{Vu-xluVDQo75p$)8SQIFT!?@F!pm&R7ayzIQrN;H>DEMnP5sR@ zm!lV&RN@XuD=`wslaKxD*>_=nbO-gB?CLgp=D5)RIH2?#m@GVu!Ca@j|A*ar^$)vs z3452D;h4)h`tbgSR%sR;lT|4Mm>SH?5nHa`bD4R{qaDmW1IEvF{I&hQuXKZJ^Twzb z{iN1S%i4?pJkhPosdF>_EUFYtoo&kxV*9fMOv+_Nf_7|G!sBp^COk0TVCUthLF}!0 z1!CwHg%pSCPJ_{o0+B(ssF0WpWNu#5MjfBAr<@QhOSq~s&%tqXXWczpGgEAKPJ|&N z#UmJvd*Ru<9U*WF%nQbUV|vsoiTwlbUX!T~pwbG|G67vpkX_K+E$W4*vs!M`+r z`QAw>#y^@Dtaazj$55|^5_Iy?L)pB~fw2e4o&dY7P4bx5%&{p$1yBhe$(W1Wy~VLa zQ3h(5VpkjqBWvMKjz^7MB(WfvgaRfVw=~4010x)b=|VssOb6&b8%xge?BPY5;}pQ= zAx4;O$EuiFkvutO2H`)<9yi1x)NaF-{IZ=O^mC+Gk@&VAi)R@!$|@3Q`n@+uvvEvR z$y0!s7X%X+rH_ApR$UMJmv<-C-$0H1M<9hBP|(kp|4E@biJC`p(UY7oM}0ZLCTMle z-@Nx?(qMpo_96!Ud?0X@;YvoHnKg9mpR}kV<}H(TPJfymY)wv0apA}L(|3bebuV0{ z!a1D26TPMATDHdFaT;MH1!u374=Si*-Me5ik*y^BU17Y<0SacVObZq)ib+vISPBYR3( z2lf^GqaekIGZc&-7;PTgBMh(qq%{FE4~o)_HdV|y$+4m>|5BaNoVE%fga>hQU}9D# z{*oqZxzGw7AmrLZLhbrNj~Rs0*nNhi#gW-;-eJvS1mj>?J>!pqT2R}d6a5*-gLU6| za~hPQ*IP2TgZblQ-``2Tsd1Us)=lbf#i*=1_v~d^H)gZ-Gho6>C{dy=y`W582qdSU zB+8ol{aRk;(t}pePfRzp8{%VAcTvx0Ae=rxCcSS$5+m`6rCRwM?bl0sTc+%;HDoWl z2nVHz^pzeKVS<>J^&cZqJ$xyQytC!ZGu7TUA`3~-hU3u43i&%C}xgbRX+_p{I&RSE?`1}vvL-M0C z{xRw5>(r*}AlA6Y(I(3w?7WZxLaQgl+ndD`D} zgOr)&uZ+_r6UOmF7o)tiJ1W z9_g2W!;`8J1~0)Dda(}meYAy=(LB)uzynSr@PPkiJa$bcl|77F7yD8g7hKhw?I9tR zrdIV6n&kGO6tTmQ{en!momXDy9~tQdZUAil^YeeJ=IMd%|Ca}Ff5Nc)IeABqn?*&X#(o7*1YQlxoPPu)tv75qPO8d3lw)d{Lx)q zLuw@UJ5&iVS~j=1@0X2$=C4zBa7{N<;Cu*juyG;ON5|ab94~2h%pGmePvAYEY_}Q* z>NU*p)??rq(HD-dHxf`5vf`_+c`+F`u)?k_vG)+6_?} zv!8L7HA+9jlhDp@x35kO-y4Q6I2f)*(Zb_GTQBFwB zK7lvf{hI3{|BF|k7vTVt)5_x!u{I}VL)!qc-+g=J{=OINQp}1dAuhjk2O4nF%kx>W z(4&3_ESu^hJ!JQN1pyT07Qywvi4>z?0Zz%?h*5}OzvPdt=tv5ct@32FZML`* zR*j%a_0wXZTz1F=g!U$X^;8zaD+KY!AHJ{!!tCI(T?@03s&+S7ur;rw-nFvk=eA&g;_UA_GA(vAhbZUK;eIt0GAa-4Y>B6ym z^n*<)@ue_V4DqgdM}^0-YgX4LU!047$Q4Gz3v8V4;Z^dc7%8PEM`e|ZI%B9D7nb|p z2s|#u68`Q^u6dg@!`C<1FdR?$jMGOzu2=~`LF5V~s4=?K;mwyB8w%X1%4V2t6_A^C3=>8^G7|KT68T`^-R-7UbjybG2B}0*O5BMNTOB5fYd-w& z7g38d({o|0ku_*xoqTPFvr(081>cMolZ8ssj9yoY1FU0;UJSKJ`mNll^20Q2Z&kOpI?_AW1@fb1|<-8lCkRxvz;58Qh6UB z(GzTiXkkldzCQS_<2w0(!?LM-Kq5|p+3eapfw|0khrnE3=aM_@I(}zn|HWMXLUDyo za+~?!DrU}&Lw0`omYjua> z3Dq6bt5j`jD68$(*jX%3QgCkgvQqywpHJ+xdDHlLZF@Y8<8sES)26T8SlXLgH|p56 zrhhr-C-m1M_-0RS+*=*K;ap>!%|DP{C2ZI@si4EwKdiBrj3zpGVCXYk5~5lA>#@w~ z3No2R2!Ygf_G4&F)j~ zN*jGMfXVd``!ncR16y@Pb#wtoNUo~Y3vS$4kDUjii&{lq^b4X8eo@MqsLl!H*qOj>K%$w{WPUwN%A)A=jQN%?qHaqC7}MP-82#LjM=i|5r>?FYY40>?=-fdnhvw((@s9EzZqmT$Y3 zKCAe-n@s`u{($y8T`b+YxI(N`q zJSU4P_Y~cq${aN`1ABv-pRAo@gB0vBGpmn{0OeWh1U9_y6}BByTjo6_B(12QDk9l> z{>m|`5s1-_dEy?S49n^kUrhP+81z*dXL?5D%HJ~`O6bi_D)8S)>MOfIjg811B=58c zl(;(%+PS_HgP^rNPW-fm*7;uJQ{S38?;yj21#!1eWUh#lT%~a^)A1TVnS43d{PSCi z2l$rlE*iJ7!;-m+@a$EVq8jHKBOyK4w8kZ!C%TvSX-gcc3clTY6F;?HbI$YPBJa%% zgR+3TY^(QVO}U~Srag->W>)tplDy*_=Y(!PmHu%a|8p@t4t=VsQ^QIx!1z;A7*ol{ z1(3GB8-E*i?&O%My@ZQC;o1q?lxljJdt9nWdeu2TdSiE}(PIm!erLa>byPm3EfWCANQl|H<{DXe}Gz zw_yvhd%}A+p+3kDOBYAaQQ%Ss7}pibi{Li^p6JIa`7DX;KVx=?+`%cU3Bec}o}w9W z#w2ZO%$byL=AUe^)3*hl7pNNSOdVquh+kjB$B)Fw@+6=+|6}|NYUSLwZ?HEr zg*RkC_XBsCn91Ymduc`TR0NQAES5z9yIg37tI$M43&gu;h&TG|TTZyLH=-&*%zqLB z46Aj7k!B+q%>D{e9^lhPsYTW#s8J{CXB9ifsL4`_T`cSuSAmi9nLs<=9!o{YPU=52 z>7^RM$qBF964GZ+7kjK4q9k8(&Aq;gmwaan!cD%)aBrPK_$-Bi0&|7|B3$08ey48M zcDf`-*8fia*{O+ZO8Ix6q{OU*lZh-n5VFNn-_+X@=vRz2mXM&!h4M){{gTD7dNOE# zY#{9Scm^7eym-bMEy;$kZ%%s({C;;@mLhfctfYjgc#|bkA)#22+1S;8WLP8rte}aj zp@OS5>N@zw*D!D}?^+{Ip3S^O6=^)|t*YMr+Fe%m zCwdOje?{1tDuTh5Lv{<*KIv!h0_0bWAu{_Eg`O@dHs|Ce>c71J07mD5_v45ecaI7X z?8UoSeQTjARYWd(zqt(55200ZJY?AC`JY^FnF%dGF8 z1i3m!;kM}58s@RjBWXwK1kj>(9I@2JunpnqOD*q zE_>c4axVn9OL&z4lMW{P*vnr+XG%|k zRgJrE1pL*&Ky3)B!GpGRnD9a&#JpiAsoAVNL(gdC#eij+TZfRED?Z`$&7e+p_ zF%|A)M2WsbUJa4qfY4R@U&iMA3e2(=^?wl97#ZMvtovU7xC5>i!PtBseFbtfW}Nz? z?p>IH=N^zJC($+$ONGN~Ci2n56|VjIlYeT7tuMeo@)9n8bw;>emqjYQSQEIfWjG)H zTBV#D<4}#;el|d8`3Wvx+t%fjH^D%j^8X%$3`?M9#UNTu=)vxX<}La+`J)c&l|p@2 zo3NaIKz0mywC5=#o7VghxCg33tx7OQ8p40X-xg-A`Q5{88^D7B^Q3=B+=FEQcXRY= zh81M0jkY8Og$ix2N%jrF6B<_rXx0ZSUmCX&P4+_834p%}97K-e2sEp@YisQix1eS7 z@L#HnuD?*+?B7F^0oUDwEK@}YR}LiDMLT@2DxqNufwavr=?BV{Kk7+>|2st54qFo# z_3}*$-4F1B)%-?FSk9jS{)`+4yvK7uJ42JLio;WvJqcq{!7Oz3h8+LaCJk%Y?~6zj2kOK z?1m?Wl;+cLGKn3YhzQ=$0}0Vlf8`m&nIvd%Fo#W<$&7Vv!RsW#kCmYAYxko)`WX3C z5MKd)H<5|Nx}`8mho8^f&W+nNUpPS#*J7Tfcwsa5L!rTL8;GO zfT(>PT}GGyOeJlQv&@TZZgDqarRHmGi088$ANQZ%gP{4A19ae0l+qz*GfGM(agehJ z?o5V|JClL;yxpyz6@4ySXWc(+bH}-zx9)f{TW|XEhM5q%cpW3IyuY@jhUb`VpXnpjusj(RvAC_!xU(vgnUYg;kvRo@J7t+TB zc87wKZIb9M)eekk+3^hFxu>lkp8_OjI^vCZqZ(}`peMRzDjX*J5$6{*6MB&U>olf! z4e)&dG&&mp`re8t^`0!X*tN-8cJExitj(f4X$u&ZX#V7z_6lO@7t#ZJA6FXi`N`Mi zkWOqv0)t20^ZyHr`}>Ddyao3~veO7iBnie!QJ2nrZt$7jGn#F{H{GrvPzU>qCPFa) zFU<1oHty_F!UF_G{2x_AzR)nGJMg|^D?c>O_e%3@p^Y?HzI+#8%mY%P>sW7X^yTH* zKG5*u|6RIaeJ9Hve~56J8b*cnr{h}wLLG)14BcWT)G?U?7uP{3pV=7u3y;T(3g;_Jqcs0 z=?Z+pAIy;uFCyso3@S_gyw6JTMT&0$W87CKrb5U^d~KQhqfsOJkyFBk?grsO1_Ph$ z*Wc7lMpvdi{wUsQ8SJm(eE-PVb=LJa67&Kv0jC@>{Ub5KO7Le*6-Dh+x*0we258eJ z@h|#8St}}awJ^a!q4n!Fyik>zCBea}c4DS(bh>fG{oM#n=PrSLxjy)@A6TPn*tU!S z^>jIq1@_KsH0ti_w{`^$mvtc%4El%FrVVQd`97dd z|H;Gj8MFM%P-JzC_U1s&2YBt(5rJ~o{%PSN^LU6SNYkuLeH^8u%Klq-poI+?)v#+h z`1`Ne)^9Y}2fRihB?hr-|J)x9W_HR4{j^eThOfRpg<4fR6Qy2dZLi5tc94gu>->!w z@3x3|;T3TGR>;*@A&-?#%O9Ze{T`?rcnHqUgC4+)P_?KJYFkO~OIvTrGXVR^N5_6j zTFi58j1O*J^OLya1KNj>A|XJfW;bAO4h$vEW&J1sT0rqPk?8ldkNHq^-vsj!kN+wM zV>V~9viia-;{?iZ{4|>U5+k%C zS`^cYj|<8slXTL*`K}@Y?#Rom{;K^}9aB2JN9lZ@=};~j=0|QxFcXgB4fqcUJM1uA ze=|tBf^&mA8Y&w?&4-ze>NqxqUIB^`#J^4*W1PM$blS)ds??#CCcrEhLWP8tFOg&4 zW$z%;Jbf?j662UR>e`S$-GjpQZ=v898qM^e26GIlgn6A;F1Oxb_?HnsJI zTaf~aUGk+2ke{TKf$qGWqG@FFF4+mU>4v)t2XsJl$M@_ zD9E1F`T6jFcQc?hJ3s^q1}ulSI@F|FF7xjm z`Xu=c2LIzyYv1E8H;WZnlXlAlhfT-+Th?Ikkjs)-1$usIr-W#t^6jEUTBLI4e5JVC8IC%HNhnjA$KO7R+g_XOWkhoG^9x zAmEt~B0*~YQ-7)U7Dk{^{k}@D76#+Rhe%rqQ{KZesb65&`)_Yhiy z_Z08&vrA@4zAfyi%rjUbD_Pp@y;>_(uEe1DZU;dqlX56EDJAztgq zyj6*U>ZZWI{$KRz3MHl++gczcfsOW45(^8a=EWR)alh`-c+d_VAGG;bZnP6NMf$nyGZ3e&59v zXf45Dih@rzX2wDa2?k*+CzsbC#|CD-@9d!6PNyVh`QHg8WYgVx69|50B`{b(ug%?$ zyn3;egg0i-pn0?E|FxsWh93p0V(lr-d&R*pyRY)kLQo)|2sY|cbPdsWo0Eh66p+^T zADzNx`-Xc<3dmV@(uKrv9;`#QQ8z7YKIK#eF_MuDo5KH|)pq=0OGD;t?X}wS z&HV*fDX49cP9}E{8M=7W*6%Cl#@T4js<~Nk8A3zAE{_@zSrqC+Kvw?;iQVb|ZkU}w zGf>J5v}>TF2(+U(Eh&yN1f%y=^i|+0v<`O01VTGwPHU(KBEQo%w@~nAf5T@O03jt& zA-j&hUfZLjD?9rnhy!qQj1>px9*r>lZrp}cN^ZAjJ49n+r{ki$K zq0-dE3)!eRu3ge?mYy=vYJWwbQjjJLj_RcPq1d z6XY{eBeH(kntk=+(gC0dOSYt&Fz19!*4Ee5SAcFGQ35+Aq{HvVU2Yypu$`gt{Y#%> z`fJ-@bSVe9tvcz=S4V+eBk}u$nkm8NF)xVGq1p+kgwiDTKg(iv1i+iV6pgR6JT#3> zCTxnav-x{Z%(P#Gg)*~?KDh|;W%(#$_xY_Swjs|?X6?ZSXA>tG(P{rrkfLt407z2h z&=Db^lnwcts`BwGW!=s^4Ch?0M^6F2FX93z9j1^;Naq-%vJVf*i8A_{aKP z`I<~_fNKeGhzV%5?H(>TbZ4r&!(Td6 zg4+)tOd0NUBsMcA z!nhz!OMWp6{B!`oC^-;Fdf#C#^`P|_pMZ5kua+iDO<68bb(`N1Bv(XyP}>7wQsd{l z0&)?%kHNtl-++*siO~D&15-N+TK zU&yNus$XG0^%z{>tSP#E9W3+Pla4{m-B37Qvf`f5|~ z*-mPfb%}Fj%XRtS9M&)C#P3AujRvYBjTB zLokO_oeJuQ_M(`X8vqRATm#vDfu#ua+<&;lV)Vd3v>KYU8$>`m=n(Y+?2Lz?uM85@ z;8S3KAG1puyhzYsl)hS|0645O$waS zGEnqPQ^%V66fEov@!jxjE`mU{v=INXX&nIs+OWfB)X|SIF9*2!xQxsTG6}EE12f?9 z0hloN7^z-<)+)VJdT7w}dyS3_Fmvnslo( zZ@X5e(}wK~ih;A{#SiXa zkDvtT9D(?(i-$}TULrQ1d7XpPGZLuMpohoesd#bG{toaPi?-|BzO(V9KSES*^~n_Q z=DFcs6=e6W`j$mU%W4FWPiRgPX~2lEpBU-SM^pCO_Hq;V`2DrZN+WsLG0gsoUTq0R zMdc`(O2Q}brpE5Ky^EBq_{8?ID6t4fUPFPyLlcq^dP?R=eNOt>rq>p{k5??Dhyhet zZ1OC3FhQ8I`L3RIVvBasu!`>jI#1VGY^e`2o8tZAT`}ZWmelE2Zi+fTzk-5OR9X~C zE7mzTawgJ0E>}ov+nlh&1eq>oxeMfYRfRi+l`C2B2-=njbz1Go%Pa*|bef^OZ{|J$ z)&m_pMcn2F+a8VS!P9cw(U3dyfP3O%wZ(yS*ug-k;WMec`p=4!Xlr HsXzSwsq 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

ogTF}CIqjCW@iv$>L*ZzoTf|B5g!8`AyTDk{ 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 eRGHbx4y}dJMl;t-m>?DS@0zNnO7 Date: Thu, 18 Jun 2026 16:08:38 -0400 Subject: [PATCH 06/17] add insights.py description in How It Works section --- .../03-optimize/README.md | 60 ++++++------------- 1 file changed, 18 insertions(+), 42 deletions(-) diff --git a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md index 58e2ea266..fac4d188c 100644 --- a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md +++ b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md @@ -286,9 +286,19 @@ agentcore remove agent --name HRAssistantV2 agentcore deploy -y ``` -## Failure Insights +## How It Works + +### Step 1: Deploy HR Assistant v1 (`deploy.py`) + +Creates an IAM execution role, packages `utils/hr_assistant_agent.py` with ARM64 dependencies, uploads to S3, and creates an AgentCore runtime. The agent code is written to `main.py` inside the deployment zip with entry point `["opentelemetry-instrument", "main.py"]` for OTel tracing. + +State is saved to `agent_state_{name}.json` for use by subsequent scripts. + +The `--version v2` flag builds an enhanced version that adds an `escalate_to_hr_manager` tool and a more detailed system prompt baked into the code. This is the version used in the target-based A/B test. -AgentCore Insights analyzes agent sessions to identify failure patterns, extract user intents, and summarize execution behavior. It extends batch evaluation by providing triage analysis that goes beyond scoring: it tells you why your agent fails and what your users are trying to accomplish. After per-session analysis, the service clusters results across sessions to surface recurring patterns. +### Step 2: Insights (`insights.py`) + +Sends a set of failure-mode and successful sessions to the agent, waits for traces to propagate to CloudWatch, then calls `start_batch_evaluation` with all three insight types. Polls until the job completes and prints the full failure hierarchy, user intent clusters, and execution summary clusters. The `--online` flag also creates a recurring daily `OnlineEvaluationConfig` so insights continue running automatically over live traffic. Insights is in public preview. See the [AgentCore Insights documentation](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/insights.html) for the latest API details. @@ -302,7 +312,7 @@ Insights is in public preview. See the [AgentCore Insights documentation](https: ### FailureAnalysis Signal Taxonomy -Each failure in the response includes one or more `signals` — the specific evidence the service found at a span level. Each signal has a `category` (a machine-readable taxonomy label), `evidence` (a quoted description of what went wrong in that span), and `confidence` (0–1 float). +Each failure in the response includes one or more `signals`, the specific evidence found at a span level. Each signal has a `category` (a machine-readable taxonomy label), `evidence` (a quoted description of what went wrong in that span), and `confidence` (0–1 float). The signal categories returned by the API: @@ -485,17 +495,7 @@ dp.start_recommendation( ) ``` -## How It Works - -### Step 1: Deploy HR Assistant v1 (`deploy.py`) - -Creates an IAM execution role, packages `utils/hr_assistant_agent.py` with ARM64 dependencies, uploads to S3, and creates an AgentCore runtime. The agent code is written to `main.py` inside the deployment zip with entry point `["opentelemetry-instrument", "main.py"]` for OTel tracing. - -State is saved to `agent_state_{name}.json` for use by subsequent scripts. - -The `--version v2` flag builds an enhanced version that adds an `escalate_to_hr_manager` tool and a more detailed system prompt baked into the code. This is the version used in the target-based A/B test. - -### Step 2: Configuration Bundles (`optimize.py`) +### Step 3: Configuration Bundles (`optimize.py`) A **Configuration Bundle** is a versioned container for agent configuration keyed by runtime ARN. The agent reads the bundle at invocation time via `BedrockAgentCoreContext.get_config_bundle()`. Changing the system prompt or tool descriptions does not require redeployment. @@ -514,7 +514,7 @@ Each bundle call returns a `bundleId` (stable) and a `versionId` (immutable snap - **Control (C)** -- original system prompt + original tool descriptions - **Treatment (T1)** -- recommended system prompt + recommended tool descriptions -### Step 3: Batch evaluation +### Step 4: Batch evaluation Baseline batch evaluation discovers sessions from CloudWatch, runs them through built-in LLM evaluators, and returns aggregate scores: @@ -524,7 +524,7 @@ Baseline batch evaluation discovers sessions from CloudWatch, runs them through | **Helpfulness** | Was the response useful and actionable? | | **Correctness** | Did the agent give accurate information? | -### Step 4: Optimization Recommendations +### Step 5: Optimization Recommendations AgentCore analyzes production traces and generates: - **System Prompt Recommendation**: rewrites your system prompt to improve a target metric @@ -532,7 +532,7 @@ AgentCore analyzes production traces and generates: Recommendations are returned as text and can be applied immediately via configuration bundles. No code changes needed. -### Step 5: Config-Bundle A/B Test +### Step 6: Config-Bundle A/B Test Use configuration bundle routing when the change is purely configuration: a different system prompt, model ID, or tool descriptions. Both variants run on the same runtime with different bundle versions. @@ -557,7 +557,7 @@ An **online evaluation config** scores sessions automatically as they close. It **Results timeline:** Budget 10-15 minutes from your last request: session timeout (2 min) -> evaluation (2-3 min) -> aggregation (~5 min cycle). Poll until `analysisTimestamp` is populated. -### Step 6: Target-Based A/B Test +### Step 7: Target-Based A/B Test When the change involves code (new tools, framework upgrade, different agent implementation), use target-based routing. Traffic splits between two separate runtimes, each registered as a gateway target. Each variant needs its own online evaluation config because they have different log groups. @@ -588,14 +588,6 @@ User --> [gateway] --90%--> [Target HRAgentV1 -> HR runtime v1 (stable)] --> Cl | `requirements.txt` | Python dependencies | | `utils/hr_assistant_agent.py` | HR Assistant agent with Configuration Bundle hook | -## HR Assistant Sample Prompts - -```bash -python invoke.py --name HRAssistV1 --prompt "What is the PTO balance for EMP-001?" -python invoke.py --name HRAssistV1 --prompt "What is the company remote work policy?" -python invoke.py --name HRAssistV1 --prompt "Show me EMP-042 pay stub for January 2026." -python invoke.py --name HRAssistV1 --prompt "How many vacation days do I get after 3 years?" -``` ## Key Concepts @@ -658,22 +650,6 @@ This supports testing both prompt changes and tool description improvements in t - **Increase canary exposure**: Use `update_ab_test` to gradually raise treatment weight (10% -> 25% -> 50% -> 100%) - **Continuous monitoring**: Leave online eval configs enabled in production -## Workflow Summary - -| Step | What you do | Key API | -|------|-------------|---------| -| 0 | Run failure insights to understand root causes (optional pre-optimization) | `start_batch_evaluation` (insights), `get_batch_evaluation` | -| 1 | Deploy HR Assistant to AgentCore runtime | `create_agent_runtime` | -| 2 | Create baseline Configuration Bundle and send traffic | `create_configuration_bundle`, `invoke_agent_runtime` | -| 3 | Measure baseline performance with batch evaluation | `start_batch_evaluation` (evaluators), `get_batch_evaluation` | -| 4a | Generate improved system prompt from production traces | `start_recommendation` (SYSTEM_PROMPT) | -| 4b | Generate improved tool descriptions from production traces | `start_recommendation` (TOOL_DESCRIPTION) | -| 5 | Package control and treatment configs into bundles | `create_configuration_bundle` / `update_configuration_bundle` | -| 6 | A/B test prompt + tool description change via config-bundle routing | `create_ab_test` (configurationBundle variants, 50/50) | -| 7 | Canary rollout of v2 via target-based routing | `create_ab_test` (target variants, 90/10 split) | -| 8 | Promote winner or roll back | `update_configuration_bundle` / stop A/B test | - ---- ## Decision Framework From b6e65e97c5881410b0f69aa74a15f9e97d14c6a1 Mon Sep 17 00:00:00 2001 From: Bharathi Srinivasan Date: Thu, 18 Jun 2026 16:11:50 -0400 Subject: [PATCH 07/17] adding docs links to readme --- .../03-optimize/README.md | 55 +++---------------- 1 file changed, 8 insertions(+), 47 deletions(-) diff --git a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md index fac4d188c..a967ee0cb 100644 --- a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md +++ b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md @@ -300,9 +300,6 @@ The `--version v2` flag builds an enhanced version that adds an `escalate_to_hr_ Sends a set of failure-mode and successful sessions to the agent, waits for traces to propagate to CloudWatch, then calls `start_batch_evaluation` with all three insight types. Polls until the job completes and prints the full failure hierarchy, user intent clusters, and execution summary clusters. The `--online` flag also creates a recurring daily `OnlineEvaluationConfig` so insights continue running automatically over live traffic. -Insights is in public preview. See the [AgentCore Insights documentation](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/insights.html) for the latest API details. - -### Three Insight Types | Insight | What It Produces | |---------|-----------------| @@ -310,8 +307,6 @@ Insights is in public preview. See the [AgentCore Insights documentation](https: | **UserIntent** | Extracts what users were trying to accomplish in each session, then clusters similar intents together. Shows the most common use cases your agent handles and reveals gaps between user requests and agent capabilities. | | **ExecutionSummary** | Summarizes the approach the agent took and the outcome for each session, then clusters similar execution patterns. Requires at least 3 sessions. | -### FailureAnalysis Signal Taxonomy - Each failure in the response includes one or more `signals`, the specific evidence found at a span level. Each signal has a `category` (a machine-readable taxonomy label), `evidence` (a quoted description of what went wrong in that span), and `confidence` (0–1 float). The signal categories returned by the API: @@ -361,16 +356,6 @@ Insights run in two modes: **Recurring (scheduled):** Create an `OnlineEvaluationConfig` with a `clusteringConfig` frequency (`DAILY`, `WEEKLY`, or `MONTHLY`). The service automatically triggers batch evaluation jobs on that cadence. Per-session analysis runs continuously; clustered results are generated during each scheduled batch job. -### From Triage to Optimization - -After insights identifies failure patterns, you can feed those findings into the Recommendations API to generate an improved system prompt: - -1. Run insights to identify recurring failure categories and root causes. -2. Call `start_recommendation` with your current system prompt, pointing it at the same agent traces (or pass the insights batch evaluation ARN directly). -3. Use A/B testing to compare the original and recommended configurations with live traffic. - -The `insights.py --online` flag and the `agentcore run recommendation --from-insights ` CLI command both implement this flow. - ### Data Source Insights pull from the `aws/spans` CloudWatch log group, which receives OTel span documents from AgentCore Runtime via the `opentelemetry-instrument` entry point. Each session's tool calls, model calls, and errors are captured as spans and correlated by session ID. @@ -379,27 +364,6 @@ The runtime log group (`/aws/bedrock-agentcore/runtimes/...`) must also be inclu `insights` and `evaluators` are mutually exclusive in the batch evaluation API. Use a separate batch job for each. -### Running insights.py - -```bash -# 1. Install dependencies: -pip install -r requirements.txt - -# 2. Deploy the agent (creates agent_state_{name}.json): -python deploy.py --name HRInsights849 --region us-west-2 - -# 3a. Generate failure traces then run all insight types: -python insights.py --name HRInsights849 --generate-traces - -# 3b. Run insights on existing traces from the last N days: -python insights.py --name HRInsights849 --lookback-days 14 - -# 3c. Run specific insights only: -python insights.py --name HRInsights849 --insight Builtin.Insight.FailureAnalysis - -# 3d. Run insights and also create a recurring daily config: -python insights.py --name HRInsights849 --generate-traces --online -``` The `--generate-traces` flag sends sessions across several failure categories: - **Unknown employee IDs** (`EMP-999`, `EMP-003`) -> tool returns "not found" errors @@ -576,20 +540,17 @@ User --> [gateway] --90%--> [Target HRAgentV1 -> HR runtime v1 (stable)] --> Cl **`gatewayFilter.targetPaths`** restricts the A/B routing rule to requests matching the control target's path, so only traffic for this test is affected. -## Files +## Key Concepts -| File | Description | -|:-----|:------------| -| `deploy.py` | Deploys HR Assistant v1 or v2 to AgentCore runtime | -| `invoke.py` | Invokes the deployed agent with sample HR queries | -| `insights.py` | Runs FailureAnalysis, UserIntent, ExecutionSummary on agent traces | -| `optimize.py` | End-to-end optimization workflow (Steps 2-8) | -| `cleanup.py` | Deletes all AWS resources created by this tutorial | -| `requirements.txt` | Python dependencies | -| `utils/hr_assistant_agent.py` | HR Assistant agent with Configuration Bundle hook | +### From Triage to Optimization +After insights identifies failure patterns, you can feed those findings into the Recommendations API to generate an improved system prompt: -## Key Concepts +1. Run insights to identify recurring failure categories and root causes. +2. Call `start_recommendation` with your current system prompt, pointing it at the same agent traces (or pass the insights batch evaluation ARN directly). +3. Use A/B testing to compare the original and recommended configurations with live traffic. + +The `insights.py --online` flag and the `agentcore run recommendation --from-insights ` CLI command both implement this flow. ### Config-Bundle vs. Target-Based A/B Testing From 2f887e89091180addc6db9984d8bd11b3b4f440d Mon Sep 17 00:00:00 2001 From: Bharathi Srinivasan Date: Thu, 18 Jun 2026 16:16:19 -0400 Subject: [PATCH 08/17] rename failure insights to insights throughout --- .../03-optimize/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md index a967ee0cb..0b0453a71 100644 --- a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md +++ b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/README.md @@ -56,7 +56,7 @@ python deploy.py --name HRAssistV1 # Invoke the deployed agent python invoke.py --name HRAssistV1 -# [Optional] Run failure insights: generate traces then analyze with all 3 insight types +# [Optional] Run insights: generate traces then analyze with all 3 insight types python insights.py --name HRAssistV1 --generate-traces # Run the full optimization workflow @@ -109,7 +109,7 @@ agentcore run batch-evaluation \ --evaluator Builtin.GoalSuccessRate Builtin.Helpfulness Builtin.Correctness ``` -### Step 3: Run Failure Insights +### Step 3: Run Insights After generating traffic, run insights to understand which sessions are failing and why before optimizing. The CLI insights commands require an `agentcore` project with a deployed runtime (v0.20.1+). From d592f27695d6b290c0a68042dc30a55c25444e99 Mon Sep 17 00:00:00 2001 From: Bharathi Srinivasan Date: Thu, 18 Jun 2026 16:19:36 -0400 Subject: [PATCH 09/17] fix pylint and ruff issues in insights.py - Add encoding="utf-8" to file read/write calls - Wrap long lines to stay within 100-char limit - Add pylint disable comments for intentional broad-exception-caught - Rename loop variable to avoid module-scope naming false positive - Remove f-string prefix from string literals without placeholders (ruff fix) --- .../03-optimize/insights.py | 60 ++++++++++++------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/insights.py b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/insights.py index ee2083b5c..b7b636326 100644 --- a/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/insights.py +++ b/01-features/06-observe-evaluate-optimize-your-agent/03-optimize/insights.py @@ -47,7 +47,9 @@ # ── Parse arguments ─────────────────────────────────────────────────────── -parser = argparse.ArgumentParser(description="AgentCore Insights (FailureAnalysis, UserIntent, ExecutionSummary)") +parser = argparse.ArgumentParser( + description="AgentCore Insights (FailureAnalysis, UserIntent, ExecutionSummary)" +) parser.add_argument("--name", required=True, help="Runtime name (matches agent_state_{name}.json)") parser.add_argument("--region", default=os.environ.get("AWS_DEFAULT_REGION", "us-west-2")) parser.add_argument( @@ -88,10 +90,11 @@ STATE_FILE = Path(f"agent_state_{args.name}.json") if not STATE_FILE.exists(): raise FileNotFoundError( - f"{STATE_FILE} not found. Run 'python deploy.py --name {args.name} --region {REGION}' first." + f"{STATE_FILE} not found. " + f"Run 'python deploy.py --name {args.name} --region {REGION}' first." ) -state = json.loads(STATE_FILE.read_text()) +state = json.loads(STATE_FILE.read_text(encoding="utf-8")) AGENT_ARN = state["runtime_arn"] LOG_GROUP = state["log_group"] SERVICE_NAME = state["service_name"] @@ -209,14 +212,17 @@ ) resp["response"].read() success_count += 1 - indicator = "OK " - except Exception as e: + status_tag = "OK " # pylint: disable=invalid-name + except Exception as e: # pylint: disable=broad-exception-caught error_count += 1 - indicator = "ERR" + status_tag = "ERR" # pylint: disable=invalid-name - print(f" [{i + 1:2d}] {indicator} {session_id[:8]}... [{emp_id}] {prompt[:60]}") + print(f" [{i + 1:2d}] {status_tag} {session_id[:8]}... [{emp_id}] {prompt[:60]}") - print(f"\nSent {success_count} OK, {error_count} errors (invoke errors; tool errors are expected)") + print( + f"\nSent {success_count} OK, {error_count} errors " + "(invoke errors; tool errors are expected)" + ) print("Waiting 3 minutes for traces to propagate to CloudWatch...") for remaining in range(180, 0, -30): @@ -225,7 +231,9 @@ print("CloudWatch ingestion complete.") else: - print("\n(Skipping trace generation — use --generate-traces to send failure-mode sessions first)") + print( + "\n(Skipping trace generation — use --generate-traces to send failure-mode sessions first)" + ) # ── Step 2: Run Batch Insights ───────────────────────────────────────────── # @@ -245,7 +253,10 @@ EVAL_NAME = f"HRInsights{uuid.uuid4().hex[:8]}" print(f"Batch eval name : {EVAL_NAME}") -print(f"Time range : {start_time.strftime('%Y-%m-%dT%H:%M:%SZ')} to {now.strftime('%Y-%m-%dT%H:%M:%SZ')}") +print( + f"Time range : {start_time.strftime('%Y-%m-%dT%H:%M:%SZ')} " + f"to {now.strftime('%Y-%m-%dT%H:%M:%SZ')}" +) print(f"Service name : {SERVICE_NAME}") print(f"Log groups : {LOG_GROUP_NAMES}") @@ -290,8 +301,10 @@ status = result["status"] processed = result.get("statistics", {}).get("processedSessionCount", "?") failed = result.get("statistics", {}).get("failedSessionCount", "?") - print(f" Poll {poll:3d} [{time.strftime('%H:%M:%S')}] status={status} " - f"processed={processed} failed={failed}") + print( + f" Poll {poll:3d} [{time.strftime('%H:%M:%S')}]" + f" status={status} processed={processed} failed={failed}" + ) if status in TERMINAL: break @@ -345,7 +358,8 @@ if rc_sessions: preview = rc_sessions[:3] more = len(rc_sessions) - 3 - print(f" Session IDs : {preview}" + (f" (+{more} more)" if more > 0 else "")) + suffix = f" (+{more} more)" if more > 0 else "" + print(f" Session IDs : {preview}{suffix}") else: print("\n(No failureAnalysisResult in response)") @@ -396,7 +410,7 @@ error_details = result.get("errorDetails", []) if error_details: - print(f"\n--- Error details ---") + print("\n--- Error details ---") if isinstance(error_details, dict): for key, val in error_details.items(): print(f" {key}: {val}") @@ -438,20 +452,24 @@ ONLINE_ID = online_resp["onlineEvaluationConfigId"] ONLINE_ARN = online_resp["onlineEvaluationConfigArn"] - print(f"Online insights config created:") + print("Online insights config created:") print(f" ID : {ONLINE_ID}") print(f" ARN : {ONLINE_ARN}") print(f" Name : {ONLINE_NAME}") print(f" Status: {online_resp.get('executionStatus', 'unknown')}") print() print("The config will run daily. To view results:") - print(f" python -c \"import boto3, json; ctrl=boto3.client('bedrock-agentcore-control', " - f"region_name='{REGION}'); r=ctrl.get_online_evaluation_config(" - f"onlineEvaluationConfigId='{ONLINE_ID}'); print(json.dumps(r, indent=2, default=str))\"") + print( + f" python -c \"import boto3, json; ctrl=boto3.client('bedrock-agentcore-control', " + f"region_name='{REGION}'); r=ctrl.get_online_evaluation_config(" + f"onlineEvaluationConfigId='{ONLINE_ID}'); print(json.dumps(r, indent=2, default=str))\"" + ) print() print("To archive (disable) this config:") - print(f" ctrl.update_online_evaluation_config(" - f"onlineEvaluationConfigId='{ONLINE_ID}', executionStatus='DISABLED')") + print( + f" ctrl.update_online_evaluation_config(" + f"onlineEvaluationConfigId='{ONLINE_ID}', executionStatus='DISABLED')" + ) # ── Summary ──────────────────────────────────────────────────────────────── @@ -475,5 +493,5 @@ print(f"ExecutionSummary : {es_clusters} execution clusters") print("\nFull response saved to insights_result.json") -with open("insights_result.json", "w") as f: +with open("insights_result.json", "w", encoding="utf-8") as f: json.dump(result, f, indent=2, default=str) From c2bed2ae87e790589442b30cde392bf80863bb0d Mon Sep 17 00:00:00 2001 From: Bharathi Srinivasan Date: Thu, 18 Jun 2026 16:38:34 -0400 Subject: [PATCH 10/17] remove generated state and config files --- .gitignore | 2 + .../agentcore/aws-targets.json | 1 - .../agentcore/.cli/deployed-state.json | 3 - .../agentcore/.cli/deployed-state.json | 3 - .../agentcore/.cli/deployed-state.json | 3 - .../agentcore/aws-targets.json | 1 - .../00-prereqs/agents_config.json | 11 - .../02-langgraph/evals_results/output.json | 59 -- .../groundtruth_eval_20260505_212226.json | 990 ------------------ .../code_based_eval_20260505_220315.json | 659 ------------ .../results/code_evaluator_ids.json | 12 - 11 files changed, 2 insertions(+), 1742 deletions(-) delete mode 100644 01-features/05-authenticate-and-authorize/01-inbound-auth/04-inbound-auth-pingfederate/agent/private-idp-ping-agent/agentcore/aws-targets.json delete mode 100644 01-features/07-centralize-and-govern-your-ai-infrastructure/01-gateway/03-private-connectivity/connect-gateway-to-private-resources/vpcegress/agentcore/.cli/deployed-state.json delete mode 100644 01-features/07-centralize-and-govern-your-ai-infrastructure/01-gateway/gatewaylabproject/agentcore/.cli/deployed-state.json delete mode 100644 06-workshops/02-AgentCore-gateway/05-mcp-server-as-a-target/mcpservers/agentcore/.cli/deployed-state.json delete mode 100644 06-workshops/03-AgentCore-identity/08-IDP-examples/PingFederate/agent/private-idp-ping-agent/agentcore/aws-targets.json delete mode 100644 06-workshops/07-AgentCore-evaluations/00-prereqs/agents_config.json delete mode 100644 06-workshops/07-AgentCore-evaluations/02-running-evaluations/02-langgraph/evals_results/output.json delete mode 100644 06-workshops/07-AgentCore-evaluations/05-groundtruth-based-evalautions/results/groundtruth_eval_20260505_212226.json delete mode 100644 06-workshops/07-AgentCore-evaluations/06-programmatic_evaluators/results/code_based_eval_20260505_220315.json delete mode 100644 06-workshops/07-AgentCore-evaluations/06-programmatic_evaluators/results/code_evaluator_ids.json diff --git a/.gitignore b/.gitignore index 2fb302a1c..de0891ab7 100644 --- a/.gitignore +++ b/.gitignore @@ -286,6 +286,8 @@ plan/ **/agent_state_*.json **/optimize_state_*.json **/runtime_config.json +**/aws-targets.json +**/.cli/deployed-state.json # Evaluation and session results **/batch_eval_*_result.json diff --git a/01-features/05-authenticate-and-authorize/01-inbound-auth/04-inbound-auth-pingfederate/agent/private-idp-ping-agent/agentcore/aws-targets.json b/01-features/05-authenticate-and-authorize/01-inbound-auth/04-inbound-auth-pingfederate/agent/private-idp-ping-agent/agentcore/aws-targets.json deleted file mode 100644 index abf2e642e..000000000 --- a/01-features/05-authenticate-and-authorize/01-inbound-auth/04-inbound-auth-pingfederate/agent/private-idp-ping-agent/agentcore/aws-targets.json +++ /dev/null @@ -1 +0,0 @@ -[{"name": "default", "account": "837460776723", "region": "us-east-1"}] diff --git a/01-features/07-centralize-and-govern-your-ai-infrastructure/01-gateway/03-private-connectivity/connect-gateway-to-private-resources/vpcegress/agentcore/.cli/deployed-state.json b/01-features/07-centralize-and-govern-your-ai-infrastructure/01-gateway/03-private-connectivity/connect-gateway-to-private-resources/vpcegress/agentcore/.cli/deployed-state.json deleted file mode 100644 index 626953ad9..000000000 --- a/01-features/07-centralize-and-govern-your-ai-infrastructure/01-gateway/03-private-connectivity/connect-gateway-to-private-resources/vpcegress/agentcore/.cli/deployed-state.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "targets": {} -} \ No newline at end of file diff --git a/01-features/07-centralize-and-govern-your-ai-infrastructure/01-gateway/gatewaylabproject/agentcore/.cli/deployed-state.json b/01-features/07-centralize-and-govern-your-ai-infrastructure/01-gateway/gatewaylabproject/agentcore/.cli/deployed-state.json deleted file mode 100644 index 626953ad9..000000000 --- a/01-features/07-centralize-and-govern-your-ai-infrastructure/01-gateway/gatewaylabproject/agentcore/.cli/deployed-state.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "targets": {} -} \ No newline at end of file diff --git a/06-workshops/02-AgentCore-gateway/05-mcp-server-as-a-target/mcpservers/agentcore/.cli/deployed-state.json b/06-workshops/02-AgentCore-gateway/05-mcp-server-as-a-target/mcpservers/agentcore/.cli/deployed-state.json deleted file mode 100644 index 626953ad9..000000000 --- a/06-workshops/02-AgentCore-gateway/05-mcp-server-as-a-target/mcpservers/agentcore/.cli/deployed-state.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "targets": {} -} \ No newline at end of file diff --git a/06-workshops/03-AgentCore-identity/08-IDP-examples/PingFederate/agent/private-idp-ping-agent/agentcore/aws-targets.json b/06-workshops/03-AgentCore-identity/08-IDP-examples/PingFederate/agent/private-idp-ping-agent/agentcore/aws-targets.json deleted file mode 100644 index abf2e642e..000000000 --- a/06-workshops/03-AgentCore-identity/08-IDP-examples/PingFederate/agent/private-idp-ping-agent/agentcore/aws-targets.json +++ /dev/null @@ -1 +0,0 @@ -[{"name": "default", "account": "837460776723", "region": "us-east-1"}] diff --git a/06-workshops/07-AgentCore-evaluations/00-prereqs/agents_config.json b/06-workshops/07-AgentCore-evaluations/00-prereqs/agents_config.json deleted file mode 100644 index 9d59e1ab5..000000000 --- a/06-workshops/07-AgentCore-evaluations/00-prereqs/agents_config.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "strands": { - "agent_id": "acevalstrands2-xKJy20HJDc", - "agent_arn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:runtime/acevalstrands2-xKJy20HJDc" - }, - "langgraph": { - "agent_id": "acevallanggraph2-xVzOqY40YB", - "agent_arn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:runtime/acevallanggraph2-xVzOqY40YB" - }, - "region": "us-east-1" -} \ No newline at end of file diff --git a/06-workshops/07-AgentCore-evaluations/02-running-evaluations/02-langgraph/evals_results/output.json b/06-workshops/07-AgentCore-evaluations/02-running-evaluations/02-langgraph/evals_results/output.json deleted file mode 100644 index 48c693f19..000000000 --- a/06-workshops/07-AgentCore-evaluations/02-running-evaluations/02-langgraph/evals_results/output.json +++ /dev/null @@ -1,59 +0,0 @@ -[ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/response_quality_for_scope_b40a1c32-vBGSJi4Nz4", - "evaluatorId": "response_quality_for_scope_b40a1c32-vBGSJi4Nz4", - "evaluatorName": "response_quality_for_scope_b40a1c32", - "explanation": "The task asks 'What is 2+2?' which is a straightforward mathematical question. According to the context, the assistant used a calculator tool to compute '2+2' and received the result '4'. The candidate response states '2 + 2 = **4**', which is mathematically correct and directly answers the question. The question falls within the assistant's allowed scope (weather and mathematical queries), so there is no scope violation. The calculation is accurate, the presentation is clear, and the answer fully addresses the user's query with no errors or omissions. This is a complete and correct response to a basic arithmetic question.", - "context": { - "spanContext": { - "sessionId": "722e855f-5939-4aad-8afd-bc3d1a8a9ec6", - "traceId": "69fa5bd572d2137536aa4bf4740da4d3" - } - }, - "value": 1.0, - "label": "Very Good", - "tokenUsage": { - "inputTokens": 792, - "outputTokens": 159, - "totalTokens": 951 - } - }, - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/response_quality_for_scope_b40a1c32-vBGSJi4Nz4", - "evaluatorId": "response_quality_for_scope_b40a1c32-vBGSJi4Nz4", - "evaluatorName": "response_quality_for_scope_b40a1c32", - "explanation": "The task requires evaluating whether the Assistant's response is good and accurate. The context shows the user asked 'What is the weather now?' and a weather tool was called that returned 'sunny'. The Assistant's response states 'The weather right now is **sunny**! It's a nice day out. \u2600\ufe0f'\n\nEvaluating accuracy:\n1. The core information is correct - the weather tool returned 'sunny' and the Assistant correctly relayed this as 'sunny'\n2. The Assistant stayed within its defined scope (weather and math queries)\n3. The response directly answers the question asked\n4. The additional commentary 'It's a nice day out' is a reasonable inference from sunny weather\n5. The sun emoji is appropriate and enhances clarity\n\nThe response is factually accurate, directly addresses the question, remains within scope, and provides the correct information from the tool result. There are no errors in the core answer. The slight embellishment ('It's a nice day out') is a minor addition but doesn't introduce any inaccuracy - it's a reasonable statement about sunny weather. This is a complete and accurate response to the weather query.", - "context": { - "spanContext": { - "sessionId": "722e855f-5939-4aad-8afd-bc3d1a8a9ec6", - "traceId": "69fa5bdf7584841d6f9de7aa63444712" - } - }, - "value": 1.0, - "label": "Very Good", - "tokenUsage": { - "inputTokens": 1000, - "outputTokens": 281, - "totalTokens": 1281 - } - }, - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/response_quality_for_scope_b40a1c32-vBGSJi4Nz4", - "evaluatorId": "response_quality_for_scope_b40a1c32-vBGSJi4Nz4", - "evaluatorName": "response_quality_for_scope_b40a1c32", - "explanation": "The task explicitly states that the quality can only be high if the agent remains within its original scope to answer questions about weather and mathematical queries only. The instructions clearly indicate that agents answering questions outside this scope (weather and math) should be penalized with a Very Poor classification.\n\nIn the context provided, the assistant has been handling weather queries and mathematical calculations appropriately. However, the candidate response addresses a question about the capital of the United States, which is neither a weather question nor a mathematical query. This is a geography/civics question that falls completely outside the assistant's designated scope.\n\nWhile the factual content of the response is accurate (Washington, D.C. is indeed the capital of the United States, and the additional details about its location and government buildings are correct), this accuracy is irrelevant given the explicit instruction that responses outside the scope of weather and math must be heavily penalized.\n\nThe assistant should have declined to answer this question or redirected the user back to its intended purpose of answering only weather and math questions. By providing an answer to a geography question, the assistant violated its operational constraints, regardless of how accurate that answer might be.\n\nTherefore, this response must receive the lowest possible score.", - "context": { - "spanContext": { - "sessionId": "722e855f-5939-4aad-8afd-bc3d1a8a9ec6", - "traceId": "69fa5be27ec18f7a132ae8f73f317cb6" - } - }, - "value": 0.0, - "label": "Very Poor", - "tokenUsage": { - "inputTokens": 1128, - "outputTokens": 288, - "totalTokens": 1416 - } - } -] \ No newline at end of file diff --git a/06-workshops/07-AgentCore-evaluations/05-groundtruth-based-evalautions/results/groundtruth_eval_20260505_212226.json b/06-workshops/07-AgentCore-evaluations/05-groundtruth-based-evalautions/results/groundtruth_eval_20260505_212226.json deleted file mode 100644 index b601248e7..000000000 --- a/06-workshops/07-AgentCore-evaluations/05-groundtruth-based-evalautions/results/groundtruth_eval_20260505_212226.json +++ /dev/null @@ -1,990 +0,0 @@ -{ - "scenario_results": [ - { - "scenario_id": "pto-balance-check", - "session_id": "pto-balance-check-9539025e-ebf8-4c40-8453-316193d5fd39", - "status": "COMPLETED", - "error": null, - "evaluator_results": [ - { - "evaluator_id": "Builtin.Correctness", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Correctness", - "evaluatorId": "Builtin.Correctness", - "evaluatorName": "Builtin.Correctness", - "explanation": "The agent response provides all the key factual information from the expected response: employee EMP-001 has 15 total PTO days, 5 used days, and 10 remaining days. The expected response states '10 remaining PTO days out of 15 total (5 days used)' which matches exactly with the agent's breakdown. The agent presents this information in a more detailed, formatted manner with bullet points and includes additional conversational elements (greeting, offer for further assistance), but the core factual content is identical and accurate. The thinking tags and extra politeness don't detract from the correctness of the factual answer provided.", - "context": { - "spanContext": { - "sessionId": "pto-balance-check-9539025e-ebf8-4c40-8453-316193d5fd39", - "traceId": "69fa5ea46400c5e2101da55e33291874" - } - }, - "value": 1.0, - "label": "Correct", - "tokenUsage": { - "inputTokens": 616, - "outputTokens": 159, - "totalTokens": 775 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.GoalSuccessRate", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.GoalSuccessRate", - "evaluatorId": "Builtin.GoalSuccessRate", - "evaluatorName": "Builtin.GoalSuccessRate", - "explanation": "The conversation record shows that the agent called the `get_pto_balance` tool with the parameter `employee_id='EMP-001'`, which satisfies the first assertion. The tool returned data showing `remaining_days: 10`, and the agent correctly reported this information to the user, stating 'Remaining days: 10'. This satisfies the second assertion that the agent reported 10 remaining PTO days. Both success assertions are met.", - "context": { - "spanContext": { - "sessionId": "pto-balance-check-9539025e-ebf8-4c40-8453-316193d5fd39" - } - }, - "value": 1.0, - "label": "Yes", - "tokenUsage": { - "inputTokens": 609, - "outputTokens": 122, - "totalTokens": 731 - }, - "ignoredReferenceInputFields": [ - "expectedResponse", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.TrajectoryExactOrderMatch", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.TrajectoryExactOrderMatch", - "evaluatorId": "Builtin.TrajectoryExactOrderMatch", - "evaluatorName": "Builtin.TrajectoryExactOrderMatch", - "explanation": "Exact match: Actual trajectory ['get_pto_balance'] matches expected trajectory ['get_pto_balance']", - "context": { - "spanContext": { - "sessionId": "pto-balance-check-9539025e-ebf8-4c40-8453-316193d5fd39" - } - }, - "value": 1.0, - "label": "Yes", - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse" - ] - } - ] - }, - { - "evaluator_id": "Builtin.TrajectoryInOrderMatch", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.TrajectoryInOrderMatch", - "evaluatorId": "Builtin.TrajectoryInOrderMatch", - "evaluatorName": "Builtin.TrajectoryInOrderMatch", - "explanation": "In-order match: All expected tools ['get_pto_balance'] found in order within actual ['get_pto_balance']", - "context": { - "spanContext": { - "sessionId": "pto-balance-check-9539025e-ebf8-4c40-8453-316193d5fd39" - } - }, - "value": 1.0, - "label": "Yes", - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse" - ] - } - ] - }, - { - "evaluator_id": "Builtin.TrajectoryAnyOrderMatch", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.TrajectoryAnyOrderMatch", - "evaluatorId": "Builtin.TrajectoryAnyOrderMatch", - "evaluatorName": "Builtin.TrajectoryAnyOrderMatch", - "explanation": "Any-order match: All expected tools ['get_pto_balance'] found in actual ['get_pto_balance']", - "context": { - "spanContext": { - "sessionId": "pto-balance-check-9539025e-ebf8-4c40-8453-316193d5fd39" - } - }, - "value": 1.0, - "label": "Yes", - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse" - ] - } - ] - }, - { - "evaluator_id": "HRResponseSimilarity_38475b67-bEzzNp4GLA", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", - "evaluatorId": "HRResponseSimilarity_38475b67-bEzzNp4GLA", - "evaluatorName": "HRResponseSimilarity_38475b67", - "explanation": "The agent's response includes all key facts from the expected response: employee EMP-001 has a total of 15 PTO days, 5 days used, and 10 days remaining. The information is clearly communicated and matches the expected response in content and clarity.", - "context": { - "spanContext": { - "sessionId": "pto-balance-check-9539025e-ebf8-4c40-8453-316193d5fd39", - "traceId": "69fa5ea46400c5e2101da55e33291874" - } - }, - "value": 1.0, - "label": "highly_similar", - "tokenUsage": { - "inputTokens": 515, - "outputTokens": 80, - "totalTokens": 595 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "HRAssertionChecker_38475b67-24XRuv49sA", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRAssertionChecker_38475b67-24XRuv49sA", - "evaluatorId": "HRAssertionChecker_38475b67-24XRuv49sA", - "evaluatorName": "HRAssertionChecker_38475b67", - "context": { - "spanContext": { - "sessionId": "pto-balance-check-9539025e-ebf8-4c40-8453-316193d5fd39" - } - }, - "errorMessage": "No score found in evaluation result", - "errorCode": "ValueError", - "ignoredReferenceInputFields": [ - "expectedResponse", - "expectedTrajectory" - ] - } - ] - } - ] - }, - { - "scenario_id": "pto-policy-lookup", - "session_id": "pto-policy-lookup-c9cfcee5-5e99-4dd1-b06a-698d163d4122", - "status": "COMPLETED", - "error": null, - "evaluator_results": [ - { - "evaluator_id": "Builtin.Correctness", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Correctness", - "evaluatorId": "Builtin.Correctness", - "evaluatorName": "Builtin.Correctness", - "explanation": "The agent response contains all the core factual information from the expected response: (1) full-time employees accrue 15 days of PTO per year, (2) requests must be submitted at least 2 business days in advance, and (3) up to 5 unused days roll over each year. The agent provides additional details not mentioned in the expected response, such as the increase to 20 days after 3 years and the policy that PTO cannot be taken in advance of accrual. These extra details enhance the response without contradicting the expected information. The formatting with headers and bullet points makes it more readable but doesn't change the factual content. All core policy elements are accurately conveyed.", - "context": { - "spanContext": { - "sessionId": "pto-policy-lookup-c9cfcee5-5e99-4dd1-b06a-698d163d4122", - "traceId": "69fa5ea4356fb8407b78d9e269991edc" - } - }, - "value": 1.0, - "label": "Correct", - "tokenUsage": { - "inputTokens": 630, - "outputTokens": 177, - "totalTokens": 807 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.GoalSuccessRate", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.GoalSuccessRate", - "evaluatorId": "Builtin.GoalSuccessRate", - "evaluatorName": "Builtin.GoalSuccessRate", - "explanation": "The agent successfully satisfied all three success assertions:\n\n1. The tool execution history shows the agent called 'lookup_hr_policy' with parameters {'topic': 'pto'}, which matches the first assertion.\n\n2. The agent's response explicitly states 'Full-time employees accrue 15 days of PTO per year,' satisfying the second assertion about mentioning the 15-day annual accrual.\n\n3. The agent's response includes 'PTO requests must be submitted at least 2 business days in advance,' which satisfies the third assertion about the 2 business day advance notice requirement.\n\nAll assertions are clearly met based on the conversation record and tool execution history.", - "context": { - "spanContext": { - "sessionId": "pto-policy-lookup-c9cfcee5-5e99-4dd1-b06a-698d163d4122" - } - }, - "value": 1.0, - "label": "Yes", - "tokenUsage": { - "inputTokens": 672, - "outputTokens": 182, - "totalTokens": 854 - }, - "ignoredReferenceInputFields": [ - "expectedResponse", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.TrajectoryExactOrderMatch", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.TrajectoryExactOrderMatch", - "evaluatorId": "Builtin.TrajectoryExactOrderMatch", - "evaluatorName": "Builtin.TrajectoryExactOrderMatch", - "explanation": "Exact match: Actual trajectory ['lookup_hr_policy'] matches expected trajectory ['lookup_hr_policy']", - "context": { - "spanContext": { - "sessionId": "pto-policy-lookup-c9cfcee5-5e99-4dd1-b06a-698d163d4122" - } - }, - "value": 1.0, - "label": "Yes", - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse" - ] - } - ] - }, - { - "evaluator_id": "Builtin.TrajectoryInOrderMatch", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.TrajectoryInOrderMatch", - "evaluatorId": "Builtin.TrajectoryInOrderMatch", - "evaluatorName": "Builtin.TrajectoryInOrderMatch", - "explanation": "In-order match: All expected tools ['lookup_hr_policy'] found in order within actual ['lookup_hr_policy']", - "context": { - "spanContext": { - "sessionId": "pto-policy-lookup-c9cfcee5-5e99-4dd1-b06a-698d163d4122" - } - }, - "value": 1.0, - "label": "Yes", - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse" - ] - } - ] - }, - { - "evaluator_id": "Builtin.TrajectoryAnyOrderMatch", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.TrajectoryAnyOrderMatch", - "evaluatorId": "Builtin.TrajectoryAnyOrderMatch", - "evaluatorName": "Builtin.TrajectoryAnyOrderMatch", - "explanation": "Any-order match: All expected tools ['lookup_hr_policy'] found in actual ['lookup_hr_policy']", - "context": { - "spanContext": { - "sessionId": "pto-policy-lookup-c9cfcee5-5e99-4dd1-b06a-698d163d4122" - } - }, - "value": 1.0, - "label": "Yes", - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse" - ] - } - ] - }, - { - "evaluator_id": "HRResponseSimilarity_38475b67-bEzzNp4GLA", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", - "evaluatorId": "HRResponseSimilarity_38475b67-bEzzNp4GLA", - "evaluatorName": "HRResponseSimilarity_38475b67", - "explanation": "The agent's response includes all key facts mentioned in the expected response: accrual of 15 days of PTO per year, the requirement for PTO requests to be submitted at least 2 business days in advance, and the rollover of up to 5 unused days. The agent's response also includes additional details such as the increase in accrual after 3 years and the rule that PTO cannot be taken in advance of accrual, which are not mentioned in the expected response but do not contradict it.", - "context": { - "spanContext": { - "sessionId": "pto-policy-lookup-c9cfcee5-5e99-4dd1-b06a-698d163d4122", - "traceId": "69fa5ea4356fb8407b78d9e269991edc" - } - }, - "value": 1.0, - "label": "highly_similar", - "tokenUsage": { - "inputTokens": 518, - "outputTokens": 122, - "totalTokens": 640 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "HRAssertionChecker_38475b67-24XRuv49sA", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRAssertionChecker_38475b67-24XRuv49sA", - "evaluatorId": "HRAssertionChecker_38475b67-24XRuv49sA", - "evaluatorName": "HRAssertionChecker_38475b67", - "explanation": "The agent followed the expected tool trajectory by calling 'lookup_hr_policy' with the topic 'pto'. Additionally, the agent mentioned both the 15-day annual accrual for full-time employees and the 2 business day advance notice requirement, fulfilling all assertions.", - "context": { - "spanContext": { - "sessionId": "pto-policy-lookup-c9cfcee5-5e99-4dd1-b06a-698d163d4122" - } - }, - "value": 1.0, - "label": "passed", - "tokenUsage": { - "inputTokens": 404, - "outputTokens": 79, - "totalTokens": 483 - }, - "ignoredReferenceInputFields": [ - "expectedResponse", - "expectedTrajectory" - ] - } - ] - } - ] - }, - { - "scenario_id": "401k-info", - "session_id": "401k-info-33235f3d-86c7-484d-b339-5dedd3cd3c1b", - "status": "COMPLETED", - "error": null, - "evaluator_results": [ - { - "evaluator_id": "Builtin.Correctness", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Correctness", - "evaluatorId": "Builtin.Correctness", - "evaluatorName": "Builtin.Correctness", - "explanation": "The agent response states that it does not have access to information about the 401k match policy and cannot provide the requested information. However, the expected response contains specific details about the 401k match: 100% match up to 4% of salary, 50% match on the next 2%, total effective match up to 5%, and 3-year vesting period. The agent's claim of lacking access to this information is factually incorrect - the information exists and should have been provided. The agent failed to answer the user's question and instead incorrectly stated the information was unavailable. This is a critical failure to provide the core factual content that was requested and expected.", - "context": { - "spanContext": { - "sessionId": "401k-info-33235f3d-86c7-484d-b339-5dedd3cd3c1b", - "traceId": "69fa5ea4353f5d615da4fc7347aa3c9d" - } - }, - "value": 0.0, - "label": "Incorrect", - "tokenUsage": { - "inputTokens": 656, - "outputTokens": 164, - "totalTokens": 820 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.GoalSuccessRate", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.GoalSuccessRate", - "evaluatorId": "Builtin.GoalSuccessRate", - "evaluatorName": "Builtin.GoalSuccessRate", - "explanation": "The success assertions require three specific outcomes: (1) calling get_benefits_summary with benefit_type=401k, (2) describing the 4% full match and 50% match on next 2%, and (3) mentioning the 3-year vesting schedule. \n\nThe conversation record shows the agent called lookup_hr_policy with topic='401k', not get_benefits_summary with benefit_type=401k. This is a different tool call than required. The tool call failed with an error indicating the 401k policy was not found. As a result, the agent informed the user it doesn't have access to 401k match policy information and did not provide any details about match percentages or vesting schedules.\n\nNone of the three success assertions were satisfied. The agent used a different tool than specified, and more importantly, failed to provide any of the required information about 401k matching or vesting.", - "context": { - "spanContext": { - "sessionId": "401k-info-33235f3d-86c7-484d-b339-5dedd3cd3c1b" - } - }, - "value": 0.0, - "label": "No", - "tokenUsage": { - "inputTokens": 661, - "outputTokens": 228, - "totalTokens": 889 - }, - "ignoredReferenceInputFields": [ - "expectedResponse", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.TrajectoryExactOrderMatch", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.TrajectoryExactOrderMatch", - "evaluatorId": "Builtin.TrajectoryExactOrderMatch", - "evaluatorName": "Builtin.TrajectoryExactOrderMatch", - "explanation": "Order mismatch: position 1: expected 'get_benefits_summary', got 'lookup_hr_policy'. Expected: ['get_benefits_summary'], Actual: ['lookup_hr_policy']", - "context": { - "spanContext": { - "sessionId": "401k-info-33235f3d-86c7-484d-b339-5dedd3cd3c1b" - } - }, - "value": 0.0, - "label": "No", - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse" - ] - } - ] - }, - { - "evaluator_id": "Builtin.TrajectoryInOrderMatch", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.TrajectoryInOrderMatch", - "evaluatorId": "Builtin.TrajectoryInOrderMatch", - "evaluatorName": "Builtin.TrajectoryInOrderMatch", - "explanation": "In-order mismatch: Tools ['get_benefits_summary'] not found in order. Expected: ['get_benefits_summary'], Actual: ['lookup_hr_policy']", - "context": { - "spanContext": { - "sessionId": "401k-info-33235f3d-86c7-484d-b339-5dedd3cd3c1b" - } - }, - "value": 0.0, - "label": "No", - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse" - ] - } - ] - }, - { - "evaluator_id": "Builtin.TrajectoryAnyOrderMatch", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.TrajectoryAnyOrderMatch", - "evaluatorId": "Builtin.TrajectoryAnyOrderMatch", - "evaluatorName": "Builtin.TrajectoryAnyOrderMatch", - "explanation": "Any-order mismatch: Missing tools: 'get_benefits_summary' (need 1 more). Expected: ['get_benefits_summary'], Actual: ['lookup_hr_policy']", - "context": { - "spanContext": { - "sessionId": "401k-info-33235f3d-86c7-484d-b339-5dedd3cd3c1b" - } - }, - "value": 0.0, - "label": "No", - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse" - ] - } - ] - }, - { - "evaluator_id": "HRResponseSimilarity_38475b67-bEzzNp4GLA", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", - "evaluatorId": "HRResponseSimilarity_38475b67-bEzzNp4GLA", - "evaluatorName": "HRResponseSimilarity_38475b67", - "explanation": "The agent's response does not contain the specific details about the company's 401k match policy, which are key facts in the expected response. Instead, the agent informs the user that it doesn't have access to the information. Therefore, the response is factually different and missing key information from the expected response.", - "context": { - "spanContext": { - "sessionId": "401k-info-33235f3d-86c7-484d-b339-5dedd3cd3c1b", - "traceId": "69fa5ea4353f5d615da4fc7347aa3c9d" - } - }, - "value": 0.0, - "tokenUsage": { - "inputTokens": 564, - "outputTokens": 89, - "totalTokens": 653 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "HRAssertionChecker_38475b67-24XRuv49sA", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRAssertionChecker_38475b67-24XRuv49sA", - "evaluatorId": "HRAssertionChecker_38475b67-24XRuv49sA", - "evaluatorName": "HRAssertionChecker_38475b67", - "context": { - "spanContext": { - "sessionId": "401k-info-33235f3d-86c7-484d-b339-5dedd3cd3c1b" - } - }, - "errorMessage": "No score found in evaluation result", - "errorCode": "ValueError", - "ignoredReferenceInputFields": [ - "expectedResponse", - "expectedTrajectory" - ] - } - ] - } - ] - }, - { - "scenario_id": "check-and-submit-pto", - "session_id": "check-and-submit-pto-634fa0f6-de48-491c-837b-57e3471661cc", - "status": "COMPLETED", - "error": null, - "evaluator_results": [ - { - "evaluator_id": "Builtin.Correctness", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Correctness", - "evaluatorId": "Builtin.Correctness", - "evaluatorName": "Builtin.Correctness", - "explanation": "The agent response confirms that EMP-002's PTO request for the specified dates (2026-05-26 to 2026-05-27) was successfully submitted and approved, which matches the expected outcome. However, the agent response omits a critical piece of information: it does not mention checking or reporting the PTO balance (3 remaining days). The user query explicitly asked to 'Check the PTO balance for EMP-002' as the first step, and the expected response includes this information ('EMP-002 has 3 remaining PTO days'). While the agent successfully completed the conditional action (submitting the request), it failed to report the balance check that was explicitly requested. The additional detail about the request ID (PTO-2026-001) is supplementary and acceptable, but the missing balance information represents a substantive omission of requested information.", - "context": { - "spanContext": { - "sessionId": "check-and-submit-pto-634fa0f6-de48-491c-837b-57e3471661cc", - "traceId": "69fa5eaa0b984bc262fdbf2320605c1b" - } - }, - "value": 0.0, - "label": "Incorrect", - "tokenUsage": { - "inputTokens": 594, - "outputTokens": 212, - "totalTokens": 806 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.GoalSuccessRate", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.GoalSuccessRate", - "evaluatorId": "Builtin.GoalSuccessRate", - "evaluatorName": "Builtin.GoalSuccessRate", - "explanation": "The agent successfully completed all three success assertions: (1) First called get_pto_balance for EMP-002, which returned 3 remaining days. (2) The agent confirmed that 3 remaining days is sufficient for the 2-day request (2026-05-26 to 2026-05-27). (3) The agent then called submit_pto_request with the correct employee_id (EMP-002), start_date (2026-05-26), and end_date (2026-05-27). The request was successfully submitted and approved with ID PTO-2026-001. All assertions are satisfied based on the tool execution history.", - "context": { - "spanContext": { - "sessionId": "check-and-submit-pto-634fa0f6-de48-491c-837b-57e3471661cc" - } - }, - "value": 1.0, - "label": "Yes", - "tokenUsage": { - "inputTokens": 843, - "outputTokens": 173, - "totalTokens": 1016 - }, - "ignoredReferenceInputFields": [ - "expectedResponse", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.TrajectoryExactOrderMatch", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.TrajectoryExactOrderMatch", - "evaluatorId": "Builtin.TrajectoryExactOrderMatch", - "evaluatorName": "Builtin.TrajectoryExactOrderMatch", - "explanation": "Exact match: Actual trajectory ['get_pto_balance', 'submit_pto_request'] matches expected trajectory ['get_pto_balance', 'submit_pto_request']", - "context": { - "spanContext": { - "sessionId": "check-and-submit-pto-634fa0f6-de48-491c-837b-57e3471661cc" - } - }, - "value": 1.0, - "label": "Yes", - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse" - ] - } - ] - }, - { - "evaluator_id": "Builtin.TrajectoryInOrderMatch", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.TrajectoryInOrderMatch", - "evaluatorId": "Builtin.TrajectoryInOrderMatch", - "evaluatorName": "Builtin.TrajectoryInOrderMatch", - "explanation": "In-order match: All expected tools ['get_pto_balance', 'submit_pto_request'] found in order within actual ['get_pto_balance', 'submit_pto_request']", - "context": { - "spanContext": { - "sessionId": "check-and-submit-pto-634fa0f6-de48-491c-837b-57e3471661cc" - } - }, - "value": 1.0, - "label": "Yes", - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse" - ] - } - ] - }, - { - "evaluator_id": "Builtin.TrajectoryAnyOrderMatch", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.TrajectoryAnyOrderMatch", - "evaluatorId": "Builtin.TrajectoryAnyOrderMatch", - "evaluatorName": "Builtin.TrajectoryAnyOrderMatch", - "explanation": "Any-order match: All expected tools ['get_pto_balance', 'submit_pto_request'] found in actual ['get_pto_balance', 'submit_pto_request']", - "context": { - "spanContext": { - "sessionId": "check-and-submit-pto-634fa0f6-de48-491c-837b-57e3471661cc" - } - }, - "value": 1.0, - "label": "Yes", - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse" - ] - } - ] - }, - { - "evaluator_id": "HRResponseSimilarity_38475b67-bEzzNp4GLA", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", - "evaluatorId": "HRResponseSimilarity_38475b67-bEzzNp4GLA", - "evaluatorName": "HRResponseSimilarity_38475b67", - "context": { - "spanContext": { - "sessionId": "check-and-submit-pto-634fa0f6-de48-491c-837b-57e3471661cc", - "traceId": "69fa5eaa0b984bc262fdbf2320605c1b" - } - }, - "errorMessage": "No score found in evaluation result", - "errorCode": "ValueError", - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "HRAssertionChecker_38475b67-24XRuv49sA", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRAssertionChecker_38475b67-24XRuv49sA", - "evaluatorId": "HRAssertionChecker_38475b67-24XRuv49sA", - "evaluatorName": "HRAssertionChecker_38475b67", - "context": { - "spanContext": { - "sessionId": "check-and-submit-pto-634fa0f6-de48-491c-837b-57e3471661cc" - } - }, - "value": 1.0, - "label": "passed", - "tokenUsage": { - "inputTokens": 424, - "outputTokens": 219, - "totalTokens": 643 - }, - "ignoredReferenceInputFields": [ - "expectedResponse", - "expectedTrajectory" - ] - } - ] - } - ] - }, - { - "scenario_id": "benefits-exploration", - "session_id": "benefits-exploration-c20af6af-e474-4bdc-bea5-4347935cd7d1", - "status": "COMPLETED", - "error": null, - "evaluator_results": [ - { - "evaluator_id": "Builtin.Correctness", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Correctness", - "evaluatorId": "Builtin.Correctness", - "evaluatorName": "Builtin.Correctness", - "explanation": "The agent response contains all the core factual information from the expected response: (1) the company covers 90% of premiums for employee-only coverage, and (2) three plans are available - Blue Shield PPO, Kaiser HMO, and HDHP with HSA. The agent provides additional accurate details about family coverage (75%), annual deductibles for each plan, and open enrollment timing. These extra details enhance the response without contradicting the expected information. The expected response mentions only employee-only coverage premium contribution, while the agent adds family coverage information, which is supplementary rather than contradictory. All core facts align with what was expected, and the additional context directly addresses the user's request to be \"walked through\" the health insurance options, providing a more comprehensive answer than the minimal expected response.", - "context": { - "spanContext": { - "sessionId": "benefits-exploration-c20af6af-e474-4bdc-bea5-4347935cd7d1", - "traceId": "69fa5eab197074de668a9d2d60bcdd07" - } - }, - "value": 1.0, - "label": "Correct", - "tokenUsage": { - "inputTokens": 679, - "outputTokens": 191, - "totalTokens": 870 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - }, - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Correctness", - "evaluatorId": "Builtin.Correctness", - "evaluatorName": "Builtin.Correctness", - "explanation": "The agent response contains all the core factual information from the expected response: 100% coverage for preventive care, 80% for basic restorative care, 50% for major work, and a $2,000 annual maximum. The agent provides additional details (specific examples of what each category includes, orthodontia information) that enhance the response without contradicting the expected answer. The extra information about cleanings, X-rays, fillings, extractions, crowns, bridges, and the orthodontia lifetime maximum of $1,500 are supplementary details that make the response more comprehensive and helpful. The core facts align perfectly with the expected response, just with more elaboration and context.", - "context": { - "spanContext": { - "sessionId": "benefits-exploration-c20af6af-e474-4bdc-bea5-4347935cd7d1", - "traceId": "69fa5eb31a1fcdbf529fbcbf79d6ae3a" - } - }, - "value": 1.0, - "label": "Correct", - "tokenUsage": { - "inputTokens": 638, - "outputTokens": 173, - "totalTokens": 811 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - }, - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Correctness", - "evaluatorId": "Builtin.Correctness", - "evaluatorName": "Builtin.Correctness", - "explanation": "The agent response contains a critical factual error in the 401k matching calculation. The expected response states the total effective match is up to 5% (100% match on 4% + 50% match on next 2% = 4% + 1% = 5%). However, the agent response incorrectly states the total effective match is up to 6%. This is a mathematical error: 100% of 4% equals 4%, and 50% of 2% equals 1%, which totals 5%, not 6%. While the agent provides additional helpful context about vesting, contribution limits, and immediate eligibility, the core factual error regarding the total match percentage makes the response incorrect. This is not a minor detail but a fundamental error in answering the user's specific question about company contribution amounts.", - "context": { - "spanContext": { - "sessionId": "benefits-exploration-c20af6af-e474-4bdc-bea5-4347935cd7d1", - "traceId": "69fa5eb63a65ece01755165d28016f68" - } - }, - "value": 0.0, - "label": "Incorrect", - "tokenUsage": { - "inputTokens": 681, - "outputTokens": 197, - "totalTokens": 878 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.GoalSuccessRate", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.GoalSuccessRate", - "evaluatorId": "Builtin.GoalSuccessRate", - "evaluatorName": "Builtin.GoalSuccessRate", - "explanation": "Evaluating the three success assertions:\n\n1. **Agent called get_benefits_summary three times across the conversation**: The tool execution history shows three separate calls to get_benefits_summary - once with parameter 'health', once with 'dental', and once with '401k'. This assertion is satisfied.\n\n2. **Agent correctly described health, dental, and 401k benefits in their respective turns**: \n - Turn 1: Agent accurately presented health insurance details (premium coverage percentages, plan options, deductibles, open enrollment)\n - Turn 2: Agent accurately presented dental insurance details (coverage percentages for preventive/basic/major care, annual maximum, orthodontia limit)\n - Turn 3: Agent accurately presented 401k details (matching percentages, vesting period, contribution limits). Note: There's a minor discrepancy where the tool result says \"total effective match up to 5%\" but the agent said \"up to 6%\". However, the agent's calculation (4% + 50% of 2% = 5%) appears correct despite the wording.\n This assertion is substantially satisfied.\n\n3. **Agent maintained conversational context across all three turns**: The agent appropriately responded to each follow-up question in context, understanding \"What about dental?\" and \"And how much does the company contribute to the 401k?\" as continuation questions. This assertion is satisfied.", - "context": { - "spanContext": { - "sessionId": "benefits-exploration-c20af6af-e474-4bdc-bea5-4347935cd7d1" - } - }, - "value": 1.0, - "label": "Yes", - "tokenUsage": { - "inputTokens": 1582, - "outputTokens": 334, - "totalTokens": 1916 - }, - "ignoredReferenceInputFields": [ - "expectedResponse", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.TrajectoryExactOrderMatch", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.TrajectoryExactOrderMatch", - "evaluatorId": "Builtin.TrajectoryExactOrderMatch", - "evaluatorName": "Builtin.TrajectoryExactOrderMatch", - "explanation": "Exact match: Actual trajectory ['get_benefits_summary', 'get_benefits_summary', 'get_benefits_summary'] matches expected trajectory ['get_benefits_summary', 'get_benefits_summary', 'get_benefits_summary']", - "context": { - "spanContext": { - "sessionId": "benefits-exploration-c20af6af-e474-4bdc-bea5-4347935cd7d1" - } - }, - "value": 1.0, - "label": "Yes", - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse" - ] - } - ] - }, - { - "evaluator_id": "Builtin.TrajectoryInOrderMatch", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.TrajectoryInOrderMatch", - "evaluatorId": "Builtin.TrajectoryInOrderMatch", - "evaluatorName": "Builtin.TrajectoryInOrderMatch", - "explanation": "In-order match: All expected tools ['get_benefits_summary', 'get_benefits_summary', 'get_benefits_summary'] found in order within actual ['get_benefits_summary', 'get_benefits_summary', 'get_benefits_summary']", - "context": { - "spanContext": { - "sessionId": "benefits-exploration-c20af6af-e474-4bdc-bea5-4347935cd7d1" - } - }, - "value": 1.0, - "label": "Yes", - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse" - ] - } - ] - }, - { - "evaluator_id": "Builtin.TrajectoryAnyOrderMatch", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.TrajectoryAnyOrderMatch", - "evaluatorId": "Builtin.TrajectoryAnyOrderMatch", - "evaluatorName": "Builtin.TrajectoryAnyOrderMatch", - "explanation": "Any-order match: All expected tools ['get_benefits_summary', 'get_benefits_summary', 'get_benefits_summary'] found in actual ['get_benefits_summary', 'get_benefits_summary', 'get_benefits_summary']", - "context": { - "spanContext": { - "sessionId": "benefits-exploration-c20af6af-e474-4bdc-bea5-4347935cd7d1" - } - }, - "value": 1.0, - "label": "Yes", - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse" - ] - } - ] - }, - { - "evaluator_id": "HRResponseSimilarity_38475b67-bEzzNp4GLA", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", - "evaluatorId": "HRResponseSimilarity_38475b67-bEzzNp4GLA", - "evaluatorName": "HRResponseSimilarity_38475b67", - "explanation": "The agent's response includes all the key facts from the expected response, such as the premium coverage percentages and the available health insurance plans. The agent's response also provides additional details like deductibles and open enrollment timing, which are not present in the expected response. However, these additional details do not detract from the core information that matches the expected response.", - "context": { - "spanContext": { - "sessionId": "benefits-exploration-c20af6af-e474-4bdc-bea5-4347935cd7d1", - "traceId": "69fa5eab197074de668a9d2d60bcdd07" - } - }, - "value": 1.0, - "label": "highly_similar", - "tokenUsage": { - "inputTokens": 570, - "outputTokens": 94, - "totalTokens": 664 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - }, - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", - "evaluatorId": "HRResponseSimilarity_38475b67-bEzzNp4GLA", - "evaluatorName": "HRResponseSimilarity_38475b67", - "explanation": "The agent's response includes all the key facts from the expected response: 100% coverage for preventive care, 80% for basic restorative care, 50% for major restorative care, and an annual maximum of $2,000. The agent's response also includes additional details about the orthodontia lifetime maximum, which is not mentioned in the expected response but does not detract from the match. Therefore, the response is semantically equivalent to the expected response.", - "context": { - "spanContext": { - "sessionId": "benefits-exploration-c20af6af-e474-4bdc-bea5-4347935cd7d1", - "traceId": "69fa5eb31a1fcdbf529fbcbf79d6ae3a" - } - }, - "value": 1.0, - "label": "highly_similar", - "tokenUsage": { - "inputTokens": 550, - "outputTokens": 122, - "totalTokens": 672 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - }, - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseSimilarity_38475b67-bEzzNp4GLA", - "evaluatorId": "HRResponseSimilarity_38475b67-bEzzNp4GLA", - "evaluatorName": "HRResponseSimilarity_38475b67", - "context": { - "spanContext": { - "sessionId": "benefits-exploration-c20af6af-e474-4bdc-bea5-4347935cd7d1", - "traceId": "69fa5eb63a65ece01755165d28016f68" - } - }, - "errorMessage": "No score found in evaluation result", - "errorCode": "ValueError", - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "HRAssertionChecker_38475b67-24XRuv49sA", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRAssertionChecker_38475b67-24XRuv49sA", - "evaluatorId": "HRAssertionChecker_38475b67-24XRuv49sA", - "evaluatorName": "HRAssertionChecker_38475b67", - "explanation": "The agent followed the expected tool trajectory by calling 'get_benefits_summary' three times, which matches the expected sequence. Additionally, the agent satisfied all assertions: it correctly described health, dental, and 401k benefits in their respective turns, and it maintained the conversational context across all three turns. Therefore, the agent fulfilled all the session requirements.", - "context": { - "spanContext": { - "sessionId": "benefits-exploration-c20af6af-e474-4bdc-bea5-4347935cd7d1" - } - }, - "value": 1.0, - "label": "passed", - "tokenUsage": { - "inputTokens": 444, - "outputTokens": 96, - "totalTokens": 540 - }, - "ignoredReferenceInputFields": [ - "expectedResponse", - "expectedTrajectory" - ] - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/06-workshops/07-AgentCore-evaluations/06-programmatic_evaluators/results/code_based_eval_20260505_220315.json b/06-workshops/07-AgentCore-evaluations/06-programmatic_evaluators/results/code_based_eval_20260505_220315.json deleted file mode 100644 index 1797e5631..000000000 --- a/06-workshops/07-AgentCore-evaluations/06-programmatic_evaluators/results/code_based_eval_20260505_220315.json +++ /dev/null @@ -1,659 +0,0 @@ -{ - "scenario_results": [ - { - "scenario_id": "pto-balance-check", - "session_id": "pto-balance-check-be4c23af-4f4a-4313-9b35-40902fad5ed7", - "status": "COMPLETED", - "error": null, - "evaluator_results": [ - { - "evaluator_id": "Builtin.Correctness", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Correctness", - "evaluatorId": "Builtin.Correctness", - "evaluatorName": "Builtin.Correctness", - "explanation": "The agent response fails to provide the specific factual information requested. The user asked for the current PTO balance for employee EMP-001, and the expected response contains specific data: 10 remaining PTO days out of 15 total (5 days used). Instead of providing this information, the agent stated it doesn't have access to the HR system and offered generic guidance on how to find PTO balances through various HR platforms and methods. While the agent's response is helpful in a general sense, it completely lacks the core factual content that was expected - the actual PTO numbers for EMP-001. This is a factual query with a specific correct answer, and the agent failed to provide any of the required specific values (remaining days, total days, or used days).", - "context": { - "spanContext": { - "sessionId": "pto-balance-check-be4c23af-4f4a-4313-9b35-40902fad5ed7", - "traceId": "69fa68277e48308a22b2bde7432dba69" - } - }, - "value": 0.0, - "label": "Incorrect", - "tokenUsage": { - "inputTokens": 743, - "outputTokens": 185, - "totalTokens": 928 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.Helpfulness", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Helpfulness", - "evaluatorId": "Builtin.Helpfulness", - "evaluatorName": "Builtin.Helpfulness", - "explanation": "The user's goal is clear: obtain the current PTO balance for employee EMP-001. This appears to be a direct query expecting a specific answer. The assistant's response does not provide the requested information, instead explaining that it lacks access to the company's HR system. While this is likely accurate from a technical standpoint, from the user's perspective, this response does not move them closer to their goal at all.\n\nThe assistant does provide alternative methods to find the information (checking HR systems, contacting HR, self-service portals, pay stubs), which could be considered somewhat helpful guidance. However, the user's phrasing suggests they expected the assistant to have access to this information - they asked \"What is\" not \"How do I find.\" This indicates a potential misalignment between user expectations and assistant capabilities.\n\nThe response is thorough in explaining alternatives, but it fundamentally fails to deliver what was requested. The user must now take additional steps outside this interaction to achieve their goal. The assistant doesn't get the user any closer to knowing EMP-001's PTO balance. While the guidance provided isn't irrelevant, it represents a significant detour from the expected direct answer, requiring the user to pursue entirely different channels.", - "context": { - "spanContext": { - "sessionId": "pto-balance-check-be4c23af-4f4a-4313-9b35-40902fad5ed7", - "traceId": "69fa68277e48308a22b2bde7432dba69" - } - }, - "value": 0.33, - "label": "Somewhat Unhelpful", - "tokenUsage": { - "inputTokens": 1053, - "outputTokens": 293, - "totalTokens": 1346 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.ResponseRelevance", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.ResponseRelevance", - "evaluatorId": "Builtin.ResponseRelevance", - "evaluatorName": "Builtin.ResponseRelevance", - "explanation": "The user asks a specific question about the current PTO balance for employee EMP-001. The LLM response directly addresses this question by first acknowledging it doesn't have access to the necessary systems to provide the specific information requested. This is a relevant and honest response to the query. The response then provides helpful guidance on how the user could find this information through various channels (HR systems, HR department, self-service portals, pay stubs). All suggestions are directly related to answering the question about finding PTO balance information. The response also offers additional help if the user needs guidance with specific HR platforms. Every part of the response is focused on addressing the user's question about PTO balance, either by explaining why it cannot be directly answered or by providing alternative methods to obtain the answer. There is no extraneous information that is unrelated to the question. The response demonstrates understanding of the question and provides relevant pathways to resolution.", - "context": { - "spanContext": { - "sessionId": "pto-balance-check-be4c23af-4f4a-4313-9b35-40902fad5ed7", - "traceId": "69fa68277e48308a22b2bde7432dba69" - } - }, - "value": 1.0, - "label": "Completely Yes", - "tokenUsage": { - "inputTokens": 962, - "outputTokens": 220, - "totalTokens": 1182 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "HRResponseLength_9e84c043-YRvTvEA9NI", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseLength_9e84c043-YRvTvEA9NI", - "evaluatorId": "HRResponseLength_9e84c043-YRvTvEA9NI", - "evaluatorName": "HRResponseLength_9e84c043", - "explanation": "Response length 823 chars exceeds maximum 600. Consider a more concise answer.", - "context": { - "spanContext": { - "sessionId": "pto-balance-check-be4c23af-4f4a-4313-9b35-40902fad5ed7", - "traceId": "69fa68277e48308a22b2bde7432dba69" - } - }, - "value": 0.0, - "label": "FAIL" - } - ] - }, - { - "evaluator_id": "HRFactChecker_9e84c043-7ro7ur34fw", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRFactChecker_9e84c043-7ro7ur34fw", - "evaluatorId": "HRFactChecker_9e84c043-7ro7ur34fw", - "evaluatorName": "HRFactChecker_9e84c043", - "explanation": "No applicable checks triggered. Tools: ['none'], response length: 823 chars.", - "context": { - "spanContext": { - "sessionId": "pto-balance-check-be4c23af-4f4a-4313-9b35-40902fad5ed7" - } - }, - "value": 1.0, - "label": "SKIP" - } - ] - } - ] - }, - { - "scenario_id": "submit-pto-request", - "session_id": "submit-pto-request-8dfd376a-aa98-4b06-88d1-4308c7998eef", - "status": "COMPLETED", - "error": null, - "evaluator_results": [ - { - "evaluator_id": "Builtin.Correctness", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Correctness", - "evaluatorId": "Builtin.Correctness", - "evaluatorName": "Builtin.Correctness", - "explanation": "The agent response is fundamentally incorrect. The expected response indicates that a PTO request should be successfully submitted and approved for EMP-001 from 2026-04-14 to 2026-04-16. However, the agent explicitly states it cannot submit PTO requests and does not have the necessary tools to do so. Instead of completing the requested action, the agent explains its limitations and suggests alternative approaches the user could take themselves. This is a complete failure to perform the requested task. The agent did not submit the PTO request, did not get it approved, and provided no confirmation of the action that was supposed to be taken. The core factual outcome (PTO request submitted and approved) was not achieved at all.", - "context": { - "spanContext": { - "sessionId": "submit-pto-request-8dfd376a-aa98-4b06-88d1-4308c7998eef", - "traceId": "69fa6828635ddffa612a57ae72880252" - } - }, - "value": 0.0, - "label": "Incorrect", - "tokenUsage": { - "inputTokens": 720, - "outputTokens": 173, - "totalTokens": 893 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.Helpfulness", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Helpfulness", - "evaluatorId": "Builtin.Helpfulness", - "evaluatorName": "Builtin.Helpfulness", - "explanation": "The user's goal is to submit a PTO request for employee EMP-001 for specific dates and reason. The assistant clearly cannot fulfill this request as it lacks the necessary tool/capability. The response is transparent about this limitation by explicitly listing available tools and explaining why none can accomplish the task. The assistant then provides actionable alternatives: accessing the company's HR system, using organization-specific PTO software, or contacting HR/manager directly. These are practical next steps the user can take. The offer to help with PTO policy information or best practices shows willingness to assist in related ways. While the assistant cannot directly achieve the user's goal, it provides clear explanation of why not and offers concrete alternative paths forward. This prevents the user from wasting time trying to use the assistant for this purpose and redirects them to appropriate channels. The response is honest, clear, and provides useful guidance even though it cannot complete the requested action.", - "context": { - "spanContext": { - "sessionId": "submit-pto-request-8dfd376a-aa98-4b06-88d1-4308c7998eef", - "traceId": "69fa6828635ddffa612a57ae72880252" - } - }, - "value": 0.67, - "label": "Somewhat Helpful", - "tokenUsage": { - "inputTokens": 1026, - "outputTokens": 220, - "totalTokens": 1246 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.ResponseRelevance", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.ResponseRelevance", - "evaluatorId": "Builtin.ResponseRelevance", - "evaluatorName": "Builtin.ResponseRelevance", - "explanation": "The user requested to submit a PTO request for employee EMP-001 from 2026-04-14 to 2026-04-16 for a family vacation. The LLM response directly addresses this request by explaining that it does not have access to tools that can submit PTO requests. The response then lists the available tools (add_numbers, web_search_exa, web_fetch_exa) to clarify what it can and cannot do. It provides alternative suggestions for how the user can submit the PTO request through their company's HR system, employee portal, or by contacting HR/manager directly. Finally, it offers to help with related information like PTO policies or best practices. Every part of the response is focused on addressing the user's PTO request - either by explaining why it cannot be fulfilled directly or by providing relevant alternatives and related assistance. The response demonstrates understanding of the request and stays completely on topic throughout.", - "context": { - "spanContext": { - "sessionId": "submit-pto-request-8dfd376a-aa98-4b06-88d1-4308c7998eef", - "traceId": "69fa6828635ddffa612a57ae72880252" - } - }, - "value": 1.0, - "label": "Completely Yes", - "tokenUsage": { - "inputTokens": 935, - "outputTokens": 226, - "totalTokens": 1161 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "HRResponseLength_9e84c043-YRvTvEA9NI", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseLength_9e84c043-YRvTvEA9NI", - "evaluatorId": "HRResponseLength_9e84c043-YRvTvEA9NI", - "evaluatorName": "HRResponseLength_9e84c043", - "explanation": "Response length 675 chars exceeds maximum 600. Consider a more concise answer.", - "context": { - "spanContext": { - "sessionId": "submit-pto-request-8dfd376a-aa98-4b06-88d1-4308c7998eef", - "traceId": "69fa6828635ddffa612a57ae72880252" - } - }, - "value": 0.0, - "label": "FAIL" - } - ] - }, - { - "evaluator_id": "HRFactChecker_9e84c043-7ro7ur34fw", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRFactChecker_9e84c043-7ro7ur34fw", - "evaluatorId": "HRFactChecker_9e84c043-7ro7ur34fw", - "evaluatorName": "HRFactChecker_9e84c043", - "explanation": "No applicable checks triggered. Tools: ['none'], response length: 675 chars.", - "context": { - "spanContext": { - "sessionId": "submit-pto-request-8dfd376a-aa98-4b06-88d1-4308c7998eef" - } - }, - "value": 1.0, - "label": "SKIP" - } - ] - } - ] - }, - { - "scenario_id": "pay-stub-lookup", - "session_id": "pay-stub-lookup-f51a10c6-cc10-467d-94f0-6ad30dffc34e", - "status": "COMPLETED", - "error": null, - "evaluator_results": [ - { - "evaluator_id": "Builtin.Correctness", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Correctness", - "evaluatorId": "Builtin.Correctness", - "evaluatorName": "Builtin.Correctness", - "explanation": "The agent response is fundamentally INCORRECT. The user query asks for specific payroll information for employee EMP-001 for January 2026. The expected response provides concrete data: gross pay of $8,333.33 and net pay of $5,362.50. \n\nInstead of providing this information, the agent states it doesn't have access to payroll systems and provides generic instructions on how to access pay stubs through HR systems. The agent also questions whether January 2026 is a typo since it's in the future.\n\nThis is a critical failure because:\n1. The agent was apparently expected to have access to this specific payroll data (based on the expected response)\n2. The agent provided no factual payroll information whatsoever\n3. The response is entirely procedural guidance rather than the requested data\n\nThe agent's response completely fails to deliver the core information requested - the specific pay stub details for EMP-001.", - "context": { - "spanContext": { - "sessionId": "pay-stub-lookup-f51a10c6-cc10-467d-94f0-6ad30dffc34e", - "traceId": "69fa6828328533f90647032154849172" - } - }, - "value": 0.0, - "label": "Incorrect", - "tokenUsage": { - "inputTokens": 765, - "outputTokens": 232, - "totalTokens": 997 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.Helpfulness", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Helpfulness", - "evaluatorId": "Builtin.Helpfulness", - "evaluatorName": "Builtin.Helpfulness", - "explanation": "The user's goal is to retrieve a specific pay stub for employee EMP-001 from January 2026. The assistant's response clearly states it cannot access the payroll system, which directly blocks the user from achieving their immediate goal through this channel. However, the response does provide alternative pathways: accessing the payroll system directly, contacting HR/Payroll, or using an employee self-service portal. These are actionable alternatives that could help the user achieve their goal through other means. The assistant also catches a temporal inconsistency (January 2026 being in the future), which is helpful context. The offer to help with payroll system integration suggests the assistant may have been expected to have such capabilities. While the response doesn't fulfill the request, it provides clear explanations for why not and offers multiple concrete next steps. This moves the user toward understanding how to achieve their goal, even if not through the expected channel. The response is informative and redirects appropriately rather than leaving the user stuck.", - "context": { - "spanContext": { - "sessionId": "pay-stub-lookup-f51a10c6-cc10-467d-94f0-6ad30dffc34e", - "traceId": "69fa6828328533f90647032154849172" - } - }, - "value": 0.67, - "label": "Somewhat Helpful", - "tokenUsage": { - "inputTokens": 1073, - "outputTokens": 238, - "totalTokens": 1311 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.ResponseRelevance", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.ResponseRelevance", - "evaluatorId": "Builtin.ResponseRelevance", - "evaluatorName": "Builtin.ResponseRelevance", - "explanation": "The user asked the LLM to pull up a specific pay stub for employee EMP-001 from January 2026. The LLM's response directly addresses this request by explaining that it cannot access payroll systems or employee records. The response then provides relevant alternatives for how the user could obtain the pay stub (accessing payroll systems, contacting HR, using employee portals). The LLM also notes that January 2026 is in the future, which is a relevant observation about the request. Finally, it offers to help with related payroll matters. Every part of the response relates to the user's request about retrieving a pay stub - either explaining why it cannot fulfill the request directly or providing alternative solutions. There is no extraneous information that is unrelated to the question about accessing the pay stub.", - "context": { - "spanContext": { - "sessionId": "pay-stub-lookup-f51a10c6-cc10-467d-94f0-6ad30dffc34e", - "traceId": "69fa6828328533f90647032154849172" - } - }, - "value": 1.0, - "label": "Completely Yes", - "tokenUsage": { - "inputTokens": 982, - "outputTokens": 197, - "totalTokens": 1179 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "HRResponseLength_9e84c043-YRvTvEA9NI", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseLength_9e84c043-YRvTvEA9NI", - "evaluatorId": "HRResponseLength_9e84c043-YRvTvEA9NI", - "evaluatorName": "HRResponseLength_9e84c043", - "explanation": "Response length 972 chars exceeds maximum 600. Consider a more concise answer.", - "context": { - "spanContext": { - "sessionId": "pay-stub-lookup-f51a10c6-cc10-467d-94f0-6ad30dffc34e", - "traceId": "69fa6828328533f90647032154849172" - } - }, - "value": 0.0, - "label": "FAIL" - } - ] - }, - { - "evaluator_id": "HRFactChecker_9e84c043-7ro7ur34fw", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRFactChecker_9e84c043-7ro7ur34fw", - "evaluatorId": "HRFactChecker_9e84c043-7ro7ur34fw", - "evaluatorName": "HRFactChecker_9e84c043", - "explanation": "0/2 HR fact checks passed. | Failed: Pay stub EMP-001 2026-01 gross = $8,333.33: $8,333.33 not found; Pay stub EMP-001 2026-01 net = $5,362.50: $5,362.50 not found", - "context": { - "spanContext": { - "sessionId": "pay-stub-lookup-f51a10c6-cc10-467d-94f0-6ad30dffc34e" - } - }, - "value": 0.0, - "label": "FAIL" - } - ] - } - ] - }, - { - "scenario_id": "pto-policy-lookup", - "session_id": "pto-policy-lookup-fa67de3d-f3f5-47a5-815a-fc86c16a8baf", - "status": "COMPLETED", - "error": null, - "evaluator_results": [ - { - "evaluator_id": "Builtin.Correctness", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Correctness", - "evaluatorId": "Builtin.Correctness", - "evaluatorName": "Builtin.Correctness", - "explanation": "The agent's response fails to provide the specific PTO policy information requested. The expected response contains concrete details: full-time employees accrue 15 days of PTO per year, and requests must be submitted at least 2 business days in advance. Instead, the agent asks clarifying questions and suggests where the user might find this information (employee handbook, HR portal, etc.). While the agent's approach might be reasonable if it truly didn't have access to the company's PTO policy, the query appears to assume the agent should have this information available. The agent provides no factual content about the actual PTO policy - no mention of 15 days accrual or the 2-day advance notice requirement. This is a factual query with a specific correct answer, and the agent failed to provide any of the key specific facts.", - "context": { - "spanContext": { - "sessionId": "pto-policy-lookup-fa67de3d-f3f5-47a5-815a-fc86c16a8baf", - "traceId": "69fa68316eaf233550f12b4f40f6d181" - } - }, - "value": 0.0, - "label": "Incorrect", - "tokenUsage": { - "inputTokens": 717, - "outputTokens": 195, - "totalTokens": 912 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.Helpfulness", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Helpfulness", - "evaluatorId": "Builtin.Helpfulness", - "evaluatorName": "Builtin.Helpfulness", - "explanation": "The user's goal is to obtain information about a company's PTO policy. The assistant's response does not provide any PTO policy information but instead asks for clarification about which company the user is referring to. This is a reasonable and necessary step since 'the company' is ambiguous - it could refer to the user's employer, a prospective employer, or any specific organization.\n\nThe response is helpful in several ways: (1) It identifies the critical missing information needed to answer the question, (2) It provides clear guidance on where to find PTO policy information if the user is asking about their own employer (employee handbook, HR portal, HR department), and (3) It offers to search for publicly available information if given a company name.\n\nHowever, the response doesn't move the user closer to actually obtaining PTO policy information yet - it only sets up the next step. The user will need to provide additional information before getting their answer. This is a necessary clarification that moves the conversation forward productively, making it somewhat helpful rather than neutral, as it provides actionable guidance and clear next steps.", - "context": { - "spanContext": { - "sessionId": "pto-policy-lookup-fa67de3d-f3f5-47a5-815a-fc86c16a8baf", - "traceId": "69fa68316eaf233550f12b4f40f6d181" - } - }, - "value": 0.67, - "label": "Somewhat Helpful", - "tokenUsage": { - "inputTokens": 1022, - "outputTokens": 263, - "totalTokens": 1285 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.ResponseRelevance", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.ResponseRelevance", - "evaluatorId": "Builtin.ResponseRelevance", - "evaluatorName": "Builtin.ResponseRelevance", - "explanation": "The user asks 'What is the company PTO policy?' The LLM response directly addresses this question by acknowledging the request and explaining why it cannot provide a specific answer without more information. The response: (1) Recognizes the question is about a company's PTO policy, (2) Asks clarifying questions about which company is being referenced, (3) Explains where the user can find their company's PTO policy (employee handbook, HR portal, HR department), and (4) Offers to search for publicly available information if given a company name. Every part of the response is focused on helping the user find information about a company PTO policy. The LLM understood the question but needs clarification to provide a complete answer. According to the rubric, content indicating the LLM understood the question but was unable to answer without more information still counts as relevant. There is no extraneous content - everything relates directly to answering the PTO policy question.", - "context": { - "spanContext": { - "sessionId": "pto-policy-lookup-fa67de3d-f3f5-47a5-815a-fc86c16a8baf", - "traceId": "69fa68316eaf233550f12b4f40f6d181" - } - }, - "value": 1.0, - "label": "Completely Yes", - "tokenUsage": { - "inputTokens": 931, - "outputTokens": 231, - "totalTokens": 1162 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "HRResponseLength_9e84c043-YRvTvEA9NI", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseLength_9e84c043-YRvTvEA9NI", - "evaluatorId": "HRResponseLength_9e84c043-YRvTvEA9NI", - "evaluatorName": "HRResponseLength_9e84c043", - "explanation": "Response length 902 chars exceeds maximum 600. Consider a more concise answer.", - "context": { - "spanContext": { - "sessionId": "pto-policy-lookup-fa67de3d-f3f5-47a5-815a-fc86c16a8baf", - "traceId": "69fa68316eaf233550f12b4f40f6d181" - } - }, - "value": 0.0, - "label": "FAIL" - } - ] - }, - { - "evaluator_id": "HRFactChecker_9e84c043-7ro7ur34fw", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRFactChecker_9e84c043-7ro7ur34fw", - "evaluatorId": "HRFactChecker_9e84c043-7ro7ur34fw", - "evaluatorName": "HRFactChecker_9e84c043", - "explanation": "No applicable checks triggered. Tools: ['none'], response length: 902 chars.", - "context": { - "spanContext": { - "sessionId": "pto-policy-lookup-fa67de3d-f3f5-47a5-815a-fc86c16a8baf" - } - }, - "value": 1.0, - "label": "SKIP" - } - ] - } - ] - }, - { - "scenario_id": "health-benefits", - "session_id": "health-benefits-e3dbd94d-6463-4e65-8ac9-21c9f9a55ef7", - "status": "COMPLETED", - "error": null, - "evaluator_results": [ - { - "evaluator_id": "Builtin.Correctness", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Correctness", - "evaluatorId": "Builtin.Correctness", - "evaluatorName": "Builtin.Correctness", - "explanation": "The agent's response fails to provide the specific information requested about company health insurance options. The expected response contains concrete details: 90% premium coverage for employee-only plans, and three specific plan options (Blue Shield PPO, Kaiser HMO, and HDHP with HSA). Instead, the agent asks clarifying questions and offers to search for information later. While asking for clarification might be appropriate in some contexts, the user's query appears to be asking about their own company's health insurance options (using 'the company' suggests a specific known entity). The agent should have either provided the specific plan details or clearly stated it doesn't have access to that information. By offering to help but not delivering any of the factual content expected, the response is too vague and incomplete to meaningfully answer the query.", - "context": { - "spanContext": { - "sessionId": "health-benefits-e3dbd94d-6463-4e65-8ac9-21c9f9a55ef7", - "traceId": "69fa6832176e06cd6a3f5c427ab85ecb" - } - }, - "value": 0.0, - "label": "Incorrect", - "tokenUsage": { - "inputTokens": 664, - "outputTokens": 190, - "totalTokens": 854 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.Helpfulness", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Helpfulness", - "evaluatorId": "Builtin.Helpfulness", - "evaluatorName": "Builtin.Helpfulness", - "explanation": "The user's goal is to learn about company health insurance options. The assistant's response does not provide any actual information about health insurance options. Instead, it asks three clarifying questions to determine what specific information the user needs.\n\nFrom the user's perspective, this creates a delay in getting the information they requested. The user must now respond with clarification before receiving any substantive content. While clarification can sometimes be necessary, the assistant could have been more helpful by:\n\n1. Providing general information about typical company health insurance options (HMO, PPO, HDHP, etc.) as a baseline\n2. Then asking if the user needs more specific information\n\nThis approach would have given the user some immediate value while still allowing for refinement.\n\nThe questions asked are reasonable and could lead to more targeted information eventually, but they don't move the user closer to their goal in this turn. The response essentially puts the conversation on hold pending user clarification. This is a common pattern that delays progress rather than advancing it.\n\nThe response is polite and well-structured, but it doesn't provide actionable information or advance the user's understanding of health insurance options at all in this turn.", - "context": { - "spanContext": { - "sessionId": "health-benefits-e3dbd94d-6463-4e65-8ac9-21c9f9a55ef7", - "traceId": "69fa6832176e06cd6a3f5c427ab85ecb" - } - }, - "value": 0.33, - "label": "Somewhat Unhelpful", - "tokenUsage": { - "inputTokens": 959, - "outputTokens": 289, - "totalTokens": 1248 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "Builtin.ResponseRelevance", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.ResponseRelevance", - "evaluatorId": "Builtin.ResponseRelevance", - "evaluatorName": "Builtin.ResponseRelevance", - "explanation": "The user asks about 'the company health insurance options,' which suggests they are asking about a specific company's health insurance offerings. The LLM response acknowledges the question and attempts to clarify what the user is asking about by offering three possible interpretations: (1) a specific company's options, (2) general information about typical company health insurance, or (3) how to choose between plans. While the response demonstrates understanding of the general topic of company health insurance, it does not provide any actual information about health insurance options. Instead, it asks for clarification before providing an answer. The response is entirely focused on the topic of company health insurance and seeks to better understand the question to provide a more targeted answer. All content in the response directly relates to addressing the user's query about company health insurance options, even though it requests more information rather than providing a direct answer. According to the rubric, content showing the LLM understood the question but needs clarification still counts as relevant.", - "context": { - "spanContext": { - "sessionId": "health-benefits-e3dbd94d-6463-4e65-8ac9-21c9f9a55ef7", - "traceId": "69fa6832176e06cd6a3f5c427ab85ecb" - } - }, - "value": 1.0, - "label": "Completely Yes", - "tokenUsage": { - "inputTokens": 868, - "outputTokens": 230, - "totalTokens": 1098 - }, - "ignoredReferenceInputFields": [ - "assertions", - "expectedResponse", - "expectedTrajectory" - ] - } - ] - }, - { - "evaluator_id": "HRResponseLength_9e84c043-YRvTvEA9NI", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRResponseLength_9e84c043-YRvTvEA9NI", - "evaluatorId": "HRResponseLength_9e84c043-YRvTvEA9NI", - "evaluatorName": "HRResponseLength_9e84c043", - "explanation": "Response length 626 chars exceeds maximum 600. Consider a more concise answer.", - "context": { - "spanContext": { - "sessionId": "health-benefits-e3dbd94d-6463-4e65-8ac9-21c9f9a55ef7", - "traceId": "69fa6832176e06cd6a3f5c427ab85ecb" - } - }, - "value": 0.0, - "label": "FAIL" - } - ] - }, - { - "evaluator_id": "HRFactChecker_9e84c043-7ro7ur34fw", - "results": [ - { - "evaluatorArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:evaluator/HRFactChecker_9e84c043-7ro7ur34fw", - "evaluatorId": "HRFactChecker_9e84c043-7ro7ur34fw", - "evaluatorName": "HRFactChecker_9e84c043", - "explanation": "No applicable checks triggered. Tools: ['none'], response length: 626 chars.", - "context": { - "spanContext": { - "sessionId": "health-benefits-e3dbd94d-6463-4e65-8ac9-21c9f9a55ef7" - } - }, - "value": 1.0, - "label": "SKIP" - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/06-workshops/07-AgentCore-evaluations/06-programmatic_evaluators/results/code_evaluator_ids.json b/06-workshops/07-AgentCore-evaluations/06-programmatic_evaluators/results/code_evaluator_ids.json deleted file mode 100644 index c1c1e1590..000000000 --- a/06-workshops/07-AgentCore-evaluations/06-programmatic_evaluators/results/code_evaluator_ids.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "HRResponseLength": { - "id": "HRResponseLength_9e84c043-YRvTvEA9NI", - "level": "TRACE", - "lambda_arn": "arn:aws:lambda:us-east-1:123456789012:function:hr-response-length" - }, - "HRFactChecker": { - "id": "HRFactChecker_9e84c043-7ro7ur34fw", - "level": "SESSION", - "lambda_arn": "arn:aws:lambda:us-east-1:123456789012:function:hr-fact-checker" - } -} \ No newline at end of file From 07258c4390e25756fffac270e4cfa0487f88b318 Mon Sep 17 00:00:00 2001 From: Bharathi Srinivasan Date: Thu, 18 Jun 2026 16:40:57 -0400 Subject: [PATCH 11/17] remove TEST_LOG.md from registry --- .../03-registry/TEST_LOG.md | 330 ------------------ 1 file changed, 330 deletions(-) delete mode 100644 01-features/07-centralize-and-govern-your-ai-infrastructure/03-registry/TEST_LOG.md diff --git a/01-features/07-centralize-and-govern-your-ai-infrastructure/03-registry/TEST_LOG.md b/01-features/07-centralize-and-govern-your-ai-infrastructure/03-registry/TEST_LOG.md deleted file mode 100644 index 86ca284d1..000000000 --- a/01-features/07-centralize-and-govern-your-ai-infrastructure/03-registry/TEST_LOG.md +++ /dev/null @@ -1,330 +0,0 @@ -# Registry Migration Test Log - -**Date:** 2026-05-18 / 2026-05-19 -**Source:** `06-workshops/10-Agent-Registry` (amazon-bedrock-agentcore-samples fork) -**Target:** `02-features/06-centralize-and-govern-your-ai-infrastructure/03-registry` (private staging) -**AWS Account:** 123456789012 | **Region:** us-west-2 - ---- - -## Summary - -| Check | Result | -|:------|:-------| -| Folder structure complete | PASS | -| README content preserved | PASS | -| Images/diagrams preserved | PASS (20/20 PNGs) | -| Python syntax checks | PASS (17/17 scripts) | -| AWS execution — scripts run | PASS (8/10 scripts; 2 skipped — external deps) | - ---- - -## Bugs Found and Fixed During Testing - -Four scripts shared the same bug: trying to submit a registry record for approval while it is still in `CREATING` state, causing a `ConflictException`. Fixed by adding a `wait_for_record_draft()` helper that polls until status is `DRAFT` before calling `submit_registry_record_for_approval`. - -Additionally, `deploy_lambda_push_sync.py` had a registry wait loop that ran only 12 iterations (60s), not enough for the ~90s CREATING phase. Fixed by changing to an unbounded `while True` loop. - -| Script | Bug | Fix Applied | -|:---|:---|:---| -| `registry_end_to_end_oauth.py` | Submit record while CREATING | Added `wait_for_record_draft()` | -| `registry_skills_dynamic_discovery.py` | Submit record while CREATING | Added `wait_for_record_draft()` | -| `publish_agentcore_a2a_mcp_in_registry.py` | Submit record while CREATING | Added `wait_for_record_draft()` | -| `deploy_lambda_push_sync.py` | Registry wait loop too short (60s); submit record while CREATING | Changed wait to unbounded loop; added `wait_for_record_draft()` | - ---- - -## Folder Mapping - -| Source Folder | Target Folder | Status | -|:---|:---|:---| -| `00-getting-started/end-to-end/01-registry-end-to-end/` | `01-registry-end-to-end/` | PASS | -| `00-getting-started/end-to-end/02-registry-end-to-end-oauth/` | `02-registry-end-to-end-oauth/` | PASS | -| `01-advanced/admin-approval-workflow/` | `03-advanced/admin-approval-workflow/` | PASS | -| `01-advanced/consumer-discovery-semantic-search/` | `03-advanced/consumer-discovery-semantic-search/` | PASS | -| `01-advanced/discovery-and-invocation-at-runtime/` | `03-advanced/discovery-and-invocation-at-runtime/` | PASS | -| `01-advanced/kiro-registry-dcr-auth0/` | `03-advanced/kiro-registry-dcr-auth0/` | PASS | -| `01-advanced/kiro/kiro-power-publisher-workflow/` | `03-advanced/kiro/kiro-power-publisher-workflow/` | PASS | -| `01-advanced/publish-agentcore-tools-in-registry/` | `03-advanced/publish-agentcore-tools-in-registry/` | PASS | -| `01-advanced/registry-push-sync-lambda/` | `03-advanced/registry-push-sync-lambda/` | PASS | -| `01-advanced/registry-skills-dynamic-discovery/` | `03-advanced/registry-skills-dynamic-discovery/` | PASS | -| `01-advanced/registry-synchronize-mcpserver/` | `03-advanced/registry-synchronize-mcpserver/` | PASS | - ---- - -## Per-Sample Test Results - -### 1. `01-registry-end-to-end` — Zero to Registry in 10 Minutes - -**README content check:** PASS -**Images:** `images/quick-setup-architecture.png` ✅ -**Python syntax:** PASS -**AWS execution:** PASS - -Output highlights: -- Registry created and reached READY (~90s) -- IAM users created for Admin, Publisher, Consumer personas -- MCP, A2A, CUSTOM records registered -- Governance guardrail tests: - - Publisher self-approval correctly denied (`AccessDeniedException`) ✅ - - Consumer `CreateRegistryRecord` correctly denied ✅ - - Consumer `UpdateRegistryRecordStatus` correctly denied ✅ - - Consumer read operations (List, Get) allowed ✅ - - Admin approval succeeded ✅ -- All 3 records reached APPROVED status -- Semantic search: 30s propagation wait insufficient for 3 records; returned 0 results (expected for short wait — index behavior) -- Cleanup: IAM users + records + registry deleted manually (cleanup section is commented out) - -**Note:** Cleanup is commented out in the script. Uncomment or add a cleanup step for production use. - ---- - -### 2. `02-registry-end-to-end-oauth` — Registry with OAuth Authentication - -**README content check:** PASS -**Images:** `images/registry-end-to-end-oauth.png` ✅ -**Python syntax:** PASS -**AWS execution:** PASS (after fix) - -**Bug fixed:** Script submitted record for approval while in `CREATING` state → added `wait_for_record_draft()`. - -Output highlights: -- Cognito user pool, app client, test user created -- Registry created with `CUSTOM_JWT` authorizer pointing to Cognito discovery URL -- MCP record approved successfully -- Cognito `USER_PASSWORD_AUTH` authentication succeeded, Bearer token obtained -- Authenticated search returned 1 result (`weather_server`) ✅ -- Negative auth tests: - - Request without Authorization header → `403` ✅ - - Request with invalid token → `401` ✅ -- Full cleanup (record, registry, Cognito pool, domain, user) completed - ---- - -### 3. `03-advanced/admin-approval-workflow` — Admin CI/CD Approval Workflow - -**README content check:** PASS -**Images:** `admin-flow-architecture.png`, `slack-message.png`, `ai-scan-report.png` ✅ -**Python syntax:** PASS -**AWS execution:** SKIPPED — requires a real Slack incoming webhook URL and channel. The `SLACK_INC_HOOK` env var must be set to a valid Slack webhook before running. The script is otherwise structurally sound. - ---- - -### 4. `03-advanced/consumer-discovery-semantic-search` — Consumer Discovery Semantic Search - -**README content check:** PASS -**Images:** `consumer-discovery-semantic-search.png` ✅ -**Python syntax:** PASS -**AWS execution:** PASS - -Output highlights: -- Registry created; 14 records seeded and submitted for approval -- All 12 discovery scenarios ran (semantic, filtered, cross-type, negative) -- Search index propagation: 45s wait caused most queries to return only the last-indexed record (`loyalty_rewards_tool`). This is a known index propagation latency — increasing the wait improves result diversity. -- Filtered search operators (`$eq`, `$ne`, `$in`, `$and`, `$or`) tested -- MCP `serverSchema`/`toolSchema` drill-down and A2A `agentCard` drill-down tested -- Full cleanup (14 records + registry) completed - ---- - -### 5. `03-advanced/discovery-and-invocation-at-runtime` — Discovering Tools and Agents at Runtime - -**README content check:** PASS -**Images:** `With_Vs_Without_AWS_Agent_Registry.png`, `OrderManagement_AWS_Agent_Registry_Flow.png`, `orchestrator_agent_flow_v3.png` ✅ -**Python syntax:** PASS -**AWS execution:** PASS - -Output highlights: -- Lambda function deployed (`order-management-mcp-20260518185145`) -- Cognito user pool + OAuth setup for AgentCore Gateway -- AgentCore Gateway created and targeted to Lambda -- Pricing A2A agent deployed to AgentCore Runtime via CodeBuild -- Customer Support A2A agent deployed to AgentCore Runtime via CodeBuild -- Orchestrator agent deployed to AgentCore Runtime via CodeBuild -- Registry created; 3 records registered (1 MCP + 2 A2A) and approved -- **Demo 1 (Order Status):** Retrieved order details via MCP tool ✅ -- **Demo 2 (Pricing & Discounts):** Retrieved order details via MCP + A2A pricing agent (some service hiccups handled gracefully) ✅ -- **Demo 3 (Return & Refund):** Return eligibility + refund amount via Customer Support A2A agent ✅ -- All resources deleted (registry, Lambda, gateway, Cognito, 3 runtimes) - ---- - -### 6. `03-advanced/kiro-registry-dcr-auth0` — Registry as MCP from Kiro (Auth0 DCR) - -**README content check:** PASS -**Images (all 5):** `0_authflow_dcr.png`, `1_kiro_mcp_json.png`, `2_authorization_pkce.png`, `3_successful_auth.png`, `4_kiro_search.png` ✅ -**Python syntax:** PASS -**AWS execution:** SKIPPED — requires an Auth0 account with DCR enabled and `.env` file with `AUTH0_DOMAIN`, `AUTH0_AUDIENCE`, `AWS_REGION`, `AWS_ACCOUNT_ID`. The script is structurally sound and creates a `CUSTOM_JWT` registry using Auth0 as IdP. - ---- - -### 7. `03-advanced/kiro/kiro-power-publisher-workflow` — Kiro Power Publisher Workflow - -**README content check:** PASS -**Images (all 4):** `publisher-workflow.png`, `activate-kiro-power.png`, `import-from-github.png`, `aws-agent-registry-power.png` ✅ -**Python syntax:** N/A — Kiro IDE-driven (no standalone script) -**AWS execution:** N/A — IDE-driven via `POWER.md` steering document - ---- - -### 8. `03-advanced/publish-agentcore-tools-in-registry` — Publishing AgentCore Tools in Registry - -**README content check:** PASS -**Images:** `images/agentregistry_flow.png` ✅ -**Python syntax:** PASS -**AWS execution:** PASS (after fix) - -**Bug fixed:** Submit for approval while records in `CREATING` state → added `wait_for_record_draft()`. - -Output highlights: -- MCP server (`mcp_order_server`) deployed to AgentCore Runtime via CodeBuild (~30s build) -- MCP tools verified via `tools/list` + `tools/call` (`get_order_status`, `create_order`, `update_order`, `cancel_order`) -- A2A agent (`a2a_order_agent`) deployed to AgentCore Runtime via CodeBuild -- A2A agent verified via `GET /agent_card` + `POST /message/send` (task completed with order details) -- Registry created; MCP + A2A records registered and approved -- Semantic search returned both records for all queries (`cancel update an order`, `order management MCP tools`, `A2A agent order`) ✅ -- Runtimes, records, and registry deleted - ---- - -### 9. `03-advanced/registry-push-sync-lambda` — Registry Push Sync Lambda - -**README content check:** PASS -**Images:** `architecture.png` ✅ -**Python syntax:** PASS -**AWS execution:** PASS (after fixes) - -**Bugs fixed:** -1. Registry wait loop ran only 12 iterations (60s) — insufficient for ~90s CREATING phase → changed to `while True` loop -2. Record submitted while still in `CREATING` → added `wait_for_record_draft()` - -Output highlights: -- Registry and MCP server record created and approved -- AgentCore Identity workload identity created (`registry-push-sync-agent`) -- IAM Lambda execution role created with registry + identity + secrets + logs permissions -- Lambda function built (bundled `boto3`, `botocore`, `requests` into `handler.zip`) and deployed -- EventBridge rule created to match `UpdateAgentRuntime` CloudTrail events -- Lambda test skipped (no `TEST_RUNTIME_ID` set) — expected behavior -- All resources deleted (Lambda, IAM role, workload identity, EventBridge rule, record, registry) - ---- - -### 10. `03-advanced/registry-skills-dynamic-discovery` — Publishing and Discovering Agent Skills - -**README content check:** PASS -**Images:** `images/registry-skill-flow.png` ✅ -**Python syntax:** PASS -**AWS execution:** PASS (after fix) - -**Bug fixed:** Submit for approval while record in `CREATING` state → added `wait_for_record_draft()`. - -Output highlights: -- Registry created with `AWS_IAM` authorizer -- PDF Processing Skill registered as `AGENT_SKILLS` record with `skillMd` + `skillDefinition` -- Record approved (DRAFT → PENDING_APPROVAL → APPROVED) -- 100s index propagation wait -- Strands Agent with `search_and_load_skill` tool initialized -- Agent searched registry: found `PDF_Processing_Skill` for query "PDF creation generate document" ✅ -- Agent downloaded skill from GitHub (`anthropics/skills/skills/pdf`), installed `pypdf` + `reportlab` -- Agent created `hello_from_agent_skills.pdf` (1421 bytes) using the loaded skill ✅ -- Record + registry deleted - ---- - -### 11. `03-advanced/registry-synchronize-mcpserver` — Synchronize MCP Server Metadata - -**README content check:** PASS -**Images:** `registry-synchronize-mcpserver-arch.png` ✅ -**Python syntax:** PASS -**AWS execution:** PASS - -Output highlights: -- Registry created with `AWS_IAM` authorizer -- **Section 3 — Public MCP server sync:** Synced `AWSKnowledgeMCP` from public URL; record transitioned CREATING → DRAFT with extracted `serverSchema` + `toolSchema` ✅ -- **Section 4 — OAuth-protected MCP server sync:** - - Cognito user pool + OAuth provider created - - MCP server deployed via CodeBuild (~30s) - - Synced with OAuth credential provider; tool schemas extracted automatically ✅ -- **Section 5 — IAM-protected MCP server sync:** - - MCP server deployed via CodeBuild (~30s) - - IAM role `RegistrySyncRole_1779155208` created for registry-to-runtime invocation - - Synced with IAM credential provider; tool schemas extracted automatically ✅ -- Final listing: 3 records (public + OAuth + IAM) -- Full cleanup (3 records, registry, 2 runtimes, OAuth provider, Cognito, IAM role, local files) - ---- - -## Image Migration Summary - -Total PNG images in source: **20** -Total PNG images in target: **20** -Missing: **0** - -| Sample | Images | Status | -|:---|:---|:---| -| `01-registry-end-to-end` | `quick-setup-architecture.png` | PASS | -| `02-registry-end-to-end-oauth` | `registry-end-to-end-oauth.png` | PASS | -| `admin-approval-workflow` | `admin-flow-architecture.png`, `slack-message.png`, `ai-scan-report.png` | PASS | -| `consumer-discovery-semantic-search` | `consumer-discovery-semantic-search.png` | PASS | -| `discovery-and-invocation-at-runtime` | `With_Vs_Without_AWS_Agent_Registry.png`, `OrderManagement_AWS_Agent_Registry_Flow.png`, `orchestrator_agent_flow_v3.png` | PASS | -| `kiro-registry-dcr-auth0` | `0_authflow_dcr.png`, `1_kiro_mcp_json.png`, `2_authorization_pkce.png`, `3_successful_auth.png`, `4_kiro_search.png` | PASS | -| `kiro-power-publisher-workflow` | `publisher-workflow.png`, `activate-kiro-power.png`, `import-from-github.png`, `aws-agent-registry-power.png` | PASS | -| `publish-agentcore-tools-in-registry` | `agentregistry_flow.png` | PASS | -| `registry-push-sync-lambda` | `architecture.png` | PASS | -| `registry-skills-dynamic-discovery` | `registry-skill-flow.png` | PASS | -| `registry-synchronize-mcpserver` | `registry-synchronize-mcpserver-arch.png` | PASS | - ---- - -## Python Syntax Check Summary - -All scripts tested with `python3 -m py_compile`. - -| Script | Result | -|:---|:---| -| `01-registry-end-to-end/getting_started_registry_end_to_end.py` | PASS | -| `02-registry-end-to-end-oauth/registry_end_to_end_oauth.py` | PASS | -| `03-advanced/admin-approval-workflow/admin_approval_workflow.py` | PASS | -| `03-advanced/admin-approval-workflow/utils.py` | PASS | -| `03-advanced/consumer-discovery-semantic-search/consumer_discovery_semantic_search.py` | PASS | -| `03-advanced/discovery-and-invocation-at-runtime/discovery_and_invocation_at_runtime.py` | PASS | -| `03-advanced/discovery-and-invocation-at-runtime/cleanup.py` | PASS | -| `03-advanced/discovery-and-invocation-at-runtime/utils.py` | PASS | -| `03-advanced/kiro-registry-dcr-auth0/dcr_registry_search_mcp_in_kiro.py` | PASS | -| `03-advanced/kiro-registry-dcr-auth0/seed_records.py` | PASS | -| `03-advanced/publish-agentcore-tools-in-registry/publish_agentcore_a2a_mcp_in_registry.py` | PASS | -| `03-advanced/registry-push-sync-lambda/deploy_lambda_push_sync.py` | PASS | -| `03-advanced/registry-push-sync-lambda/handler.py` | PASS | -| `03-advanced/registry-skills-dynamic-discovery/registry_skills_dynamic_discovery.py` | PASS | -| `03-advanced/registry-skills-dynamic-discovery/utils/python_exec_tool.py` | PASS | -| `03-advanced/registry-skills-dynamic-discovery/utils/skill_loader.py` | PASS | -| `03-advanced/registry-synchronize-mcpserver/registry_synchronize_mcpserver.py` | PASS | - ---- - -## AWS Execution Summary - -| Script | AWS Execution | Notes | -|:---|:---|:---| -| `getting_started_registry_end_to_end.py` | PASS | All IAM guardrails verified; cleanup section commented out | -| `registry_end_to_end_oauth.py` | PASS (after fix) | Cognito + CUSTOM_JWT auth + negative auth tests | -| `consumer_discovery_semantic_search.py` | PASS | 45s propagation wait may be short for 14 records | -| `discovery_and_invocation_at_runtime.py` | PASS | 3 demos: MCP, MCP+A2A, A2A — all ran | -| `publish_agentcore_a2a_mcp_in_registry.py` | PASS (after fix) | CodeBuild deployment; semantic search verified | -| `registry_synchronize_mcpserver.py` | PASS | Public + OAuth + IAM sync all verified | -| `registry_skills_dynamic_discovery.py` | PASS (after fix) | Agent loaded skill, created PDF | -| `deploy_lambda_push_sync.py` | PASS (after fixes) | Lambda + EventBridge + workload identity deployed | -| `admin_approval_workflow.py` | SKIPPED | Requires real Slack webhook (`SLACK_INC_HOOK` env var) | -| `dcr_registry_search_mcp_in_kiro.py` | SKIPPED | Requires Auth0 account + `.env` with `AUTH0_DOMAIN`, `AUTH0_AUDIENCE` | -| `kiro-power-publisher-workflow` | N/A | IDE-driven, no standalone script | - ---- - -## Migration Pattern Notes - -- Source used Jupyter notebooks (`.ipynb`); target uses Python scripts (`.py`) with equivalent logic. -- All target READMEs have a "Running the Python Scripts" section with `pip install` + `python