{"slug": "amazon-saves-millions-by-replacing-sonnet-4-6-with-strands-decider", "title": "Amazon saves millions by replacing Sonnet 4.6 with Strands Decider", "summary": "Two Amazon engineers replaced Claude Sonnet 4.6 with Strands Decider E4B for labeling tickets across one of the world's largest internal ticketing systems, cutting token costs by 98% and saving millions of dollars a year, according to an AWS blog post. On a test set of tickets, Strands Decider E4B matched or beat production Sonnet while averaging 897 ms per call versus 4,215 ms (78% faster) and using 2,010 total tokens per ticket versus 6,724 (70% fewer). The labeling Lambda reads a three-way BEDROCK/DUAL/DECIDER switch from AWS AppConfig, and the stack runs on SageMaker ml.g5.xlarge instances with SQS, Lambda, CloudWatch and CDK deployment stages for Beta, Gamma and Prod.", "body_md": "For a while, Amazon and AWS teams relied on Claude Sonnet 4.6 to label tickets in an internal system without breaking the bank.\n\nSonnet 4.6 fit the goldilocks choice of balancing intelligence with cost. Considering it dealt with one\nof the world’s largest internal ticketing systems, the nine month old model did well. However, two\nAmazon engineers recently swapped out Sonnet 4.6 for\n[Strands Decider](https://strandsagents.com/blog/introducing-strands-decider/), a decision model we launched a month ago, that\nperformed just as well *at 98% less cost*. This change will save millions of dollars of token costs in\na year.\n\nCarr and Mehul, who work on the internal ticketing system, walk through how this happened below.\n\n## Replacing an LLM’s job with a decision model\n\nWe had Sonnet 4.6 labeling tickets at enormous scale. The tickets could be customer escalations, capacity requests, automated alarms, security findings, or anything else across the company that needed to fit within 20 category types. The agent ran with a long system prompt on every ticket, generating JSON and reasoning against a fixed set of labels.\n\nA decision model can’t generate text. It’s first given some state and a question with a set of options, then the decision model returns a probability for each option plus a confidence score. We saw this method fit perfectly with ticket labeling: the state is the ticket, the options are the label catalog.\n\nWe started with the original [Strands Decider 2B](https://strandsagents.com/blog/introducing-strands-decider/). On a test set of\ntickets, the [E4B Gemma 4 build](https://strandsagents.com/blog/strands-decider-gemma-4-models/) got clearly better results, so\nwe switched to it. Afterwards, we tuned how confident the model needed to be before applying a label.\nThe results showed E4B beating production Sonnet on a separate set of our tickets.\n\nWe ran E4B on SageMaker `ml.g5.xlarge` instances (one A10G, 24 GB each). The model used about 19 GiB,\nand one request took about 640 ms on one instance. The endpoint autoscales with traffic, but its network\nwas isolated, preventing outbound access to the container. SageMaker copies the model weights in from\nS3 before start-up.\n\nCustomers can do this too! Apart from our ticketing APIs, everything in the path is a standard AWS service. Ticket events land in an SQS queue that then triggers a Lambda function. It reads the ticket data and calls the model, a SageMaker AI Endpoint with Strands Decider. AppConfig holds the switch (described below), and CloudWatch carries the logs, metrics and alarms. The stack is defined in CDK with deployment stages for Beta, Gamma, and Prod.\n\n## Running Sonnet 4.6 and Strands Decider on the same tickets\n\nWe didn’t want to flip a switch and hope. The labeling Lambda reads a three-way setting from AWS AppConfig on every message:\n\n- `BEDROCK` : Sonnet labels every ticket, but Strands Decider isn’t called.\n- `DUAL` : Both the Sonnet and Strands Decider models are called in parallel. The results from the\nSonnet model are applied to the ticket and compared with Strands Decider results.\n- `DECIDER` : Strands Decider labels every ticket and Bedrock isn’t called.\n\n## What we measured\n\n|  | Claude Sonnet 4.6 | Strands Decider E4B | % Improvement | \n|---|---|---|---|\n| Average time per call | 4,215 ms | 897 ms | 78% | \n| Input tokens per ticket | 6,554 | 2,009 |  | \n| Output tokens per ticket | 170 | 1 |  | \n| Total tokens, per ticket | 6,724 | 2,010 | 70% | \n\nThe token drop had two sources. Strands Decider produced one output, the choice, instead of a JSON answer. Its prompt was also much shorter than Sonnet 4.6’s. Production’s label descriptions alone are longer than Strands Decider’s 4,096-token window, so we rewrote each of the 20 labels as a one- or two-sentence criterion and sent them as the options of a single choice question, plus a “none” option. The ticket data is the same as what Sonnet gets, except that on long tickets Strands Decider drops the oldest comments to fit.\n\nBelow is a graph of our Lambda durations on the day we turned off the Sonnet usage, showing the average Lambda execution duration dropping 74%.\n\n## What it costs\n\nAt published us-east-1 on-demand prices:\n\n|  | Claude Sonnet 4.6 (Bedrock, global endpoint) | Strands Decider E4B (SageMaker, `ml.g5.xlarge` ) | \n|---|---|---|\n| Price | $3.00 per 1M input, $15.00 per 1M output tokens | $1.408 per instance-hour | \n| Per ticket | $0.0222 | about $0.0005 | \n| Per million tickets | about $22,200 | about $500 | \n\nSonnet’s cost per ticket comes straight from the token counts above. Strands Decider’s depends on how busy each instance is. At about 640 ms per request, one instance can handle about 5,600 tickets an hour, which would be $250 per million tickets at full use. We keep headroom for bursts, and in practice it comes to about $500 per million. That is about 44 times cheaper than Sonnet, a 98% reduction.\n\nThese are published list prices. They leave out the Lambda, which also runs for less time per ticket now.\n\nOne thing that surprised us was that JSON key order changed the answer. Sending the same content with keys in a different order moved the output probabilities by up to 0.19. We now send every request with sorted keys, so if you serve a decision model behind an API, check this before you compare runs.\n\n## Our lessons\n\nThis worked because the task is a closed choice from a known catalog, the volume is high, and the latency of the old path mattered. If your labels need explanation text, if the catalog changes weekly, or if you can’t fit the useful context into a few thousand tokens, a decision model probably can’t replace the LLM’s job.\n\nThe part we’d copy regardless of model is the three-way switch. Running both on real traffic, then judging every disagreement, told us more than any offline eval would have. It also meant going back was a 45-second config change.\n\nThe world of agents gets a lot more exciting (and less costly) with decision models. If you’re running\na classification agent, try the [Strands Decider repo](https://github.com/strands-labs/strands-decider)\nand its\n[serving notes](https://github.com/strands-labs/strands-decider/blob/0ac22a97e584f3ccf87cc9b8cc5fdbad57cdf534/docs/inference.md#gemma-4-models).", "url": "https://wpnews.pro/news/amazon-saves-millions-by-replacing-sonnet-4-6-with-strands-decider", "canonical_source": "https://strandsagents.com/blog/amazon-saves-millions-replacing-sonnet-with-strands-decider/", "published_at": "2026-11-10 06:01:08+00:00", "updated_at": "2026-11-10 06:25:56.731281+00:00", "lang": "en", "topics": ["artificial-intelligence", "large-language-models", "ai-infrastructure", "ai-tools"], "entities": ["Amazon", "AWS", "Claude Sonnet 4.6", "Strands Decider", "Strands Decider E4B", "SageMaker", "AWS AppConfig", "Gemma 4"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/amazon-saves-millions-by-replacing-sonnet-4-6-with-strands-decider", "markdown": "https://wpnews.pro/news/amazon-saves-millions-by-replacing-sonnet-4-6-with-strands-decider.md", "text": "https://wpnews.pro/news/amazon-saves-millions-by-replacing-sonnet-4-6-with-strands-decider.txt", "jsonld": "https://wpnews.pro/news/amazon-saves-millions-by-replacing-sonnet-4-6-with-strands-decider.jsonld"}}