ਕੰਮ ਕਰਨ ਵਾਲੀਆਂ ਵਿਵਸਥਿਤੀ: ਕਿਉਂ ਬਹੁਤ ਸਾਰੀਆਂ agentic ਪ੍ਰਣਾਲੀਆਂ ਉਤਪਾਦਨ ਵਿੱਚ ਫੇਲ ਹੁੰਦੀਆਂ ਹਨ ਅਤੇ ਸੂਚਿਤ ਸਟੇਟ-ਮਸ਼ੀਨ, ਸਾਫ ਟੂਲ ਕਾਂਟ੍ਰੈਕਟ, ਰੀਟ੍ਰਾਈ ਨੀਤੀਆਂ ਅਤੇ ਗਹਿਰੀ ਓਬਜ਼ਰਵੇਬਿਲਿਟੀ ਨਾਲ ਭਰੋਸੇਯੋਗ ਏਜੰਟ ਕਿਵੇਂ ਡਿਜ਼ਾਇਨ ਕਰਨੇ ਹਨ।

Agentic systems are applications where an LLM doesn’t just answer a prompt, but decides what to do next: which tools to call, which data to fetch, which steps to run, and when it is “done.” They combine a model, a set of tools (APIs, databases, services), a planning/execution loop, and infrastructure that glues everything together.
In a demo, this looks magical: an agent figures out a plan, calls a few tools, and returns a perfect result. The happy path is short, latency is low, and nothing fails at the same time.
Under real workloads, the same agent is stressed in ways the demo never saw:
The result: flaky behavior that’s hard to reproduce, silent data corruption, and user flows that occasionally hang or spin forever.
Flaky agents don’t just hurt “delight.” They:
This article is about engineering patterns, not “better prompts.” We’ll look at state machines, explicit tool contracts, retry and failure-handling strategies, memory and concurrency control, and observability patterns that make agentic systems predictable under load—not just impressive on stage.
Most agent systems look fine in a single happy-path demo. They fail when traffic, tools, and edge cases arrive together.
Naive orchestration assumes the model will “do the right thing” in one or two calls. Under real usage, you see recurring patterns:
Without explicit states and end conditions, these behaviors are inevitable.
LLM sampling, latency variability, and tool timing create hidden non-determinism. The same input can traverse different branches, invoke different tools, or interpret tool results differently.
At scale, tool issues dominate:
Every one of these turns into spurious loops, retries, or incorrect final answers.
What breaks rarely at 10 RPS will break constantly at 1,000 RPS. Concurrency reveals:
Product teams often expect deterministic workflows, clear SLAs, and auditability. Agents, left unconstrained, offer probabilistic, best-effort behavior with weak guarantees.
When architectures ignore this mismatch—treating agents like traditional services instead of stochastic planners—systems behave unpredictably just when reliability matters most.
Production-ready agents are less about “smart prompts” and more about disciplined systems design. A useful way to think about them is as small, predictable machines that occasionally call an LLM, not as mysterious LLM blobs that occasionally touch your systems.
Four properties matter most:
You don’t get these properties from prompts alone. You get them from structure.
The default pattern many teams start with is: “while not done, call the model, let it think, maybe call a tool, repeat”. This is easy to prototype and hard to operate.
A safer pattern is to represent the agent as an explicit workflow:
COLLECTING_INPUT, PLANNING, EXECUTING_STEP, WAITING_ON_HUMAN, DONE).This turns the agent into a state machine where every step is inspectable, testable, and replayable. Free-form loops feel flexible, but explicit workflows are what make incidents debuggable and behavior auditable.
Monolithic agents that “do everything” are appealing, but they create tight coupling between unrelated responsibilities: planning, retrieval, business logic, UI orchestration, and more.
Instead, compose small, well-scoped agents or skills:
Each skill can have its own state machine, tools, and safety rules. The composition logic then becomes a higher-level workflow, not an ever-growing prompt inside a single agent.
This modularity keeps each agent simple enough to reason about and lets you evolve one capability without destabilizing the rest.
A useful mental model is to split an agent into three layers:
By enforcing this separation, you avoid the trap of hiding business logic in prompts or tool descriptions. The LLM becomes a decision component inside a clear, deterministic shell, not the shell itself.
The most reliable agentic systems are not the most impressive demos—they are the ones whose behavior you can explain on a whiteboard.
Concretely:
This bias toward small, composable, well-structured agents is what allows systems to grow in scope without collapsing under their own complexity.
Most agent implementations start as a loop of "think, act, observe" wrapped around an LLM call. That’s fine for demos, but it quickly turns opaque and brittle. A better approach is to treat the agent as an explicit state machine: a finite set of states, with well-defined transitions triggered by events.
Instead of letting the model implicitly decide what to do next, define a small state diagram:
Transitions between these states are triggered by typed events such as UserRequestReceived, ToolCallSucceeded, ToolValidationFailed, TimeoutExceeded, or HumanOverride. Each event, plus the current state, determines the next state and actions.
This makes retries and timeouts straightforward: you attach policies to individual states (e.g., CALL_TOOL may retry 3 times with exponential backoff, PLAN might not retry at all) instead of scattering retry logic across the codebase.
Persist the current state and minimal context in an external store (database, queue, or workflow engine). The agent then becomes a pure function:
next_state, actions = transition(current_state, event, context)
This enables:
With a state machine, every step of the agent’s behavior is explicit: which state it was in, what event occurred, which transition fired, and what side effects were produced. That clarity makes debugging faster, simplifies incident investigations, and creates a natural audit trail for compliance reviews. You can prove, from logs and state history, that certain risky actions are only taken from specific states and under defined conditions.
Agents behave much more predictably when tools look less like “APIs hidden in prose” and more like well‑designed interfaces with explicit guarantees.
Each tool should have a contract that covers:
InvalidInput, NotFound, RateLimited, TransientFailure) with clear semantics.Expose this contract to the model as structured documentation, not as a wall of text. The agent planner should know which errors are retriable, which require user intervention, and which should stop the workflow.
Treat tool I/O like any other production API:
This lets you simplify prompts: instead of verbose instructions, rely on schema‑driven guidance. Clear constraints reduce hallucinated arguments and nonsensical tool sequences.
Tools evolve; agents should not break every time they do.
v1, v1.1, v2) and pin agents to a version.Planning logic can then safely mix agents and tools at different maturity levels.
Design contracts with partial failure in mind:
The agent can then adapt: continue a workflow with reduced functionality, ask the user for confirmation, or switch to a fallback tool.
Tool contracts are a natural place to encode security limits:
confirm: true).Combine this with server‑side checks; never rely solely on the model to “behave”.
When tools have clear, validated, versioned contracts, prompts can be shorter, orchestration logic becomes simpler, and debugging is far easier. You move complexity from brittle natural‑language instructions into deterministic schemas and policies, cutting down on hallucinated tool calls and unexpected side effects.
Reliable agentic systems assume that everything will fail eventually: models, tools, networks, even your own coordination layer. The goal is not to avoid failure, but to make it cheap and safe.
Idempotency means: repeating the same request has the same externally visible effect as doing it once. This is critical for LLM agents, which frequently re-issue tool calls after partial failures or ambiguous responses.
Make tools idempotent by design:
request_id. The tool stores this and returns the same result if it sees the ID again.Use structured retries for transient failures (timeouts, rate limits, 5xx): exponential backoff, jitter to avoid thundering herds, and strict max attempts. Log every attempt with correlation IDs so you can trace agent behavior.
For permanent failures (4xx, validation errors, business rule violations), do not retry. Surface a structured error to the agent policy so it can revise the plan, ask the user, or choose a different tool.
Implement circuit breakers at both the agent and tool layers: after repeated failures, temporarily block calls to that tool and fail fast. Pair this with well-defined fallbacks: degraded modes, cached data, or alternative tools.
Avoid blind retries from the agent loop. Without idempotent tools and clear failure classes, you only multiply side effects, latency, and cost.
Reliable agents start with clear thinking about what is state and where it lives.
Treat an agent like you would a service handling a request:
Mixing these leads to confusion and bugs. For example, putting ephemeral tool results into “memory” makes agents reuse stale context in future conversations.
You have three main options:
A good rule: the LLM is a stateless function over an explicit state object. Persist that object outside the model and regenerate prompts from it.
A common failure pattern is using conversation logs, traces, or raw prompts as de facto memory.
Problems:
Instead, define structured memory schemas: user_profile, project, task_history, etc. Derive logs from state, not the other way around.
When multiple tools or agents update the same entities (e.g., a CRM record or a task status), you need basic consistency controls:
For high-value operations, record a decision log separate from the conversational log: what changed, why, and based on which inputs.
To survive crashes, deploys, and rate limiting, workflows should be resumable:
This also enables time travel debugging: you can inspect and replay the exact state that led to a bad decision.
Memory is a liability as much as an asset. For production agents:
Treat memory as a product surface: designed, versioned, and governed—not just an ever-growing text dump attached to your agent.
Agents look sequential on a whiteboard but behave like distributed systems under real load. As soon as you have many concurrent users, tools, and background jobs, you’re juggling race conditions, duplicate work, and ordering issues.
Common failure modes:
You mitigate these with idempotent tool contracts, explicit workflow state, and optimistic or pessimistic locking at the data layer.
Synchronous request–response flows are simple but fragile: every dependency must be up, within rate limits, and fast. Once agents fan out to many tools or parallel sub-tasks, move long-running or side-effectful steps behind a queue.
Queue-based orchestration lets you:
Agents typically hit three classes of limits:
You need an explicit rate-limit layer with per-user, per-tenant, and global throttles. Use token buckets or leaky buckets to enforce policies, and expose clear error types (e.g., RATE_LIMIT_SOFT, RATE_LIMIT_HARD) so agents can back off gracefully.
Backpressure is how the system protects itself under stress. Strategies include:
Monitor saturation signals: queue depth, worker utilization, model/tool error rates, and latency percentiles. Rising queues combined with increasing latency or 429/503 errors are your early warning that agents are overrunning their environment.
You can’t make an agent reliable if you can’t answer two questions quickly: what did it do? and why did it do that? Observability for agentic systems is about making those answers cheap and precise.
Design observability so a single task has a trace that threads through:
Within that trace, attach structured logs for key decisions (routing choice, plan revision, guardrail triggers) and metrics for volume and health.
A useful trace usually includes:
Log prompts, tool inputs, and outputs in structured form, but pass them through a redaction layer first:
Keep raw content behind feature flags in lower environments; production should default to redacted views.
At minimum, track:
When incidents happen, good traces and metrics let you move from “the agent feels flaky” to a precise statement like: “P95 tasks failing in ToolSelection after 2 retries due to new schema in billing_service,” cutting diagnosis from hours to minutes and giving you concrete levers for tuning behavior.
Testing agents means testing both the tools they call and the flows that stitch everything together. Treat it like distributed systems testing, not just prompt tinkering.
Start with unit tests at the tool boundary:
These tests never depend on the LLM. You call the tool directly with synthetic inputs and assert the exact output or error contract.
Integration tests exercise the agent workflow end-to-end: LLM + tools + orchestration.
Model these as scenario-based tests:
These tests assert state transitions and tool calls, not every token of the LLM’s wording. Check: which tools were called, with what arguments, in what order, and what final state/result the agent reached.
To keep tests repeatable, fixture both LLM responses and tool outputs.
A typical pattern:
with mocked_llm(fixtures_dir="fixtures/llm"), mocked_tools():
result = run_agent_scenario(input_case)
assert result.state == "COMPLETED"
Every prompt or schema change should trigger a non-negotiable regression run:
Schema evolution (adding fields, tightening types) gets its own regression cases to catch agents or tools that still assume the old contract.
Never ship a new model, policy, or routing strategy straight to production traffic.
Instead:
Only after passing offline gates should a new variant hit production, ideally behind feature flags and gradual rollout.
Agent logs often contain sensitive user data. Testing must respect that.
Codify these rules as part of your CI pipeline so no test artifact can be generated or stored without anonymization checks.
Operating agents in production is closer to running a distributed system than shipping a static model. You need controls for rollout, clear reliability targets, and disciplined change management.
Introduce new agents or behaviors gradually:
Back all of this with feature flags and config-driven policies: routing rules, enabled tools, temperature, safety settings. Changes should be deployable by config, not code, and instantly reversible.
Define SLOs that reflect both system health and user value:
Wire these into alerts and run incidents like you would for any production service: clear ownership, runbooks for triage, and standard mitigation steps (rollback flag, traffic drain, safe-mode behavior).
Use logs, traces, and conversation transcripts to refine prompts, tools, and policies. Treat each change as a versioned artifact with review, approval, and rollback capability.
Avoid silent prompt or tool changes. Without change control, you cannot correlate regressions to specific edits, and incident response turns into guesswork instead of engineering.
A production-ready agentic system benefits from a clear separation of concerns. The goal is to keep the agent smart at decisions, but dumb at infrastructure.
1. Gateway / API edge
Single entry point for clients (apps, services, UIs). It handles:
2. Orchestrator
The orchestrator is the “brainstem,” not the brain. It coordinates:
The LLM(s) live behind the orchestrator, used by the planner and by specific tools that need language understanding.
3. Tooling and storage layer
Business logic remains in existing microservices, queues, and data systems. Tools are thin wrappers around:
The orchestrator invokes tools via strict contracts, while storage systems remain the source of truth.
Enforce auth and quotas at the gateway; enforce safety, data access, and policy in the orchestrator. All calls (LLM and tools) emit structured telemetry to a pipeline that feeds:
A simpler architecture (gateway → single orchestrator → tools) is easier to operate; adding separate planners, policy engines, and model gateways increases flexibility, at the price of more coordination, latency, and operational complexity.
You now have the core ingredients for agents that behave predictably under real load: explicit state machines, clear tool contracts, disciplined retries, and deep observability. The final step is turning those ideas into a repeatable practice for your team.
Think of each agent as a stateful workflow:
When these pieces align, you get systems that degrade gracefully instead of collapsing under edge cases.
Before shipping a prototype agent to real users, confirm:
If any item is missing, you are still in prototype mode.
A sustainable setup usually separates:
This lets product teams move fast while platform teams enforce reliability, security, and cost controls.
Once you have stable foundations, you can explore:
Progress here should be incremental: introduce new learning components behind feature flags, with offline evaluation and strong guardrails.
The theme through all of this is the same: design for failure, favor clarity over cleverness, and iterate where you can observe and roll back safely. With those constraints in place, agentic systems stop being scary prototypes and become infrastructure your organization can depend on.
ਇੱਕ ਏਜੰਟਿਕ ਪ੍ਰਣਾਲੀ ਉਹ ਐਪਲੀਕੇਸ਼ਨ ਹੈ ਜਿੱਥੇ LLM ਸਿਰਫ਼ ਇੱਕ ਪ੍ਰਾਂਪਟ ਦਾ ਜਵਾਬ ਨਹੀਂ ਦਿੰਦਾ, ਬਲਕਿ ਅਗਲਾ ਕਦਮ ਖ਼ੁਦ ਫੈਸਲਾਂਦਾ ਹੈ: ਕਿਹੜੇ ਟੂਲ ਕਾਲ ਕਰਨੇ ਹਨ, ਕਿਹੜੇ ਡੇਟਾ ਲੈਣਾ ਹੈ, ਵਰਕਫਲੋ ਦਾ ਕਿਹੜਾ ਕਦਮ ਚਲਾਉਣਾ ਹੈ ਅਤੇ ਕਦੋਂ ਰੁਕਣਾ ਹੈ।
ਸਧਾਰਣ ਚੈਟ ਕੰਪਲੀਸ਼ਨ ਦੇ ਵਿਰੁੱਧ, ਇੱਕ ਏਜੰਟਿਕ ਪ੍ਰਣਾਲੀ ਵਿੱਚ ਸ਼ਾਮਲ ਹੁੰਦੇ ਹਨ:
ਉਤਪਾਦਨ ਵਿੱਚ, LLM ਇੱਕ ਵੱਡੇ ਨਿਰਧਾਰਤ ਸ਼ੈੱਲ ਦੇ اندر ਇੱਕ ਫੈਸਲਾ ਕਰਨ ਵਾਲਾ ਕੰਪੋਨੈਂਟ ਬਣ ਜਾਂਦਾ ਹੈ—ਨਹੀਂ ਕਿ ਸਿਸਟਮ ਦਾ ਸਾਰਾ ਭਾਗ।
ਡੈਮੋ ਆਮ ਤੌਰ 'ਤੇ ਇੱਕ ਖੁਸ਼ੀ-ਰਾਹ ਚਲਾਉਂਦੇ ਹਨ: ਇਕ ਵਰਤੋਂਕਾਰ, ਆਦਰਸ਼ ਟੂਲ ਵਿਹਾਰ, ਕੋਈ ਟਾਈਮਆਊਟ ਨਹੀਂ, ਕੋਈ schema drift ਨਹੀਂ, ਅਤੇ ਛੋਟੀਆਂ ਗੱਲਬਾਤਾਂ। ਉਤਪਾਦਨ ਲੋਡ 'ਤੇ, ਏਜੰਟ ਇਹਨਾਂ ਨਾਲ ਨਿਭਾਉਂਦੇ ਹਨ:
ਬਿਨਾਂ ਸਪੱਸ਼ਟ ਵਰਕਫਲੋ, ਕਾਂਟ੍ਰੈਕਟ, ਅਤੇ ਫੇਲਅਰ ਹੈਂਡਲਿੰਗ ਦੇ, ਇਹ ਕਾਰਕ ਲੂਪ, ਰੁਕਾਵਟਾਂ, ਆਧੂਰੇ ਕੰਮ, ਅਤੇ ਖਾਮੋਸ਼ ਗਲਤੀਆਂ ਪੈਦਾ ਕਰਦੇ ਹਨ ਜੋ ਡੈਮੋ ਵਾਤਾਵਰਣ ਵਿੱਚ ਨਹੀਂ ਦਿਖਾਈ ਦਿੰਦੀਆਂ।
LLM ਨੂੰ ਇੱਕ ਸਪੱਸ਼ਟ ਢਾਂਚੇ ਦੇ اندر ਚਲਾਓ ਨਾ ਕਿ ਫ੍ਰੀ-ਫਾਰਮ ਲੂਪ ਦੇ ਵਿਚ:
ਏਜੰਟ ਨੂੰ ਵਰਕਫਲੋ ਦੇ ਤੌਰ 'ਤੇ ਮਾਡਲ ਕਰੋ ਜਿਸ ਵਿੱਚ ਨਾਮੀ ਸਟੇਟਸ ਅਤੇ ਟਾਈਪ ਕੀਤੇ ਇਵੈਂਟਸ ਹੋਣ, ਨਾ ਕਿ while not done: call LLM ਵਰਗੀ ਲੂਪ।
ਆਮ ਸਟੇਟਸ ਸ਼ਾਮਲ ਹੋ ਸਕਦੇ ਹਨ:
ਟੂਲਾਂ ਨੂੰ ਪ੍ਰੋਡਕਸ਼ਨ APIs ਵਾਂਗ ਤਿਆਰ ਕਰੋ, ਨਾ ਕਿ ਪ੍ਰਾਂਪਟ ਵਿੱਚ ਛੁਪੇ ਹੋਏ ਵਰਣਨਾਂ ਵਾਂਗ। ਹਰ ਟੂਲ ਦਾ ਕਾਂਟ੍ਰੈਕਟ ਸ਼ਾਮਲ ਹੋਵੇ:
ਹਰ ਬਾਹਰੀ ਕਾਲ ਕਦੇ ਨਾ ਕਦੇ ਫੇਲ ਹੋਵੇਗੀ—ਇਸ ਗੱਲ ਨੂੰ ਮੰਨ ਕੇ ਡਿਜ਼ਾਇਨ ਕਰੋ।
ਮੁੱਖ ਪੈਟਰਨ:
ਛੋਟੇ-ਅਰੰਭਕ ਸਟੇਟ ਨੂੰ ਲੰਬੇ ਸਮੇਂ ਦੀ ਮੇਮੋਰੀ ਤੋਂ ਵੱਖ ਕਰੋ ਅਤੇ LLM ਨੂੰ ਸਟੇਟਲੈੱਸ ਰੱਖੋ।
ਅਣਸੰਰਚਿਤ ਲੋਗ ਜਾਂ ਪੂਰਾ ਗੱਲਬਾਤ ਇਤਿਹਾਸ ਨੂੰ "ਮੇਮੋਰੀ" ਵਜੋਂ ਵਰਤਣ ਤੋਂ ਬਚੋ; ਇਸ ਦੀ ਥਾਂ ਤੇ ਇੱਕ ਸੰਕੁਚਿਤ, ਸਟ੍ਰਕਚਰਡ ਰਿਕਾਰਡ ਬਣਾਓ ਜਿਸ ਦੀ ਰਿਟੇਸ਼ਨ ਅਤੇ ਪ੍ਰਾਈਵੇਸੀ ਨੀਤੀਆਂ ਹੋਣ।
ਏਜੰਟ ਸਿਸਟਮ ਨੂੰ ਲੋਡ ਹੇਠਾਂ ਇੱਕ ਵੰਡਿਆ ਹੋਇਆ ਸਿਸਟਮ ਸਮਝੋ, ਭਾਵੇਂ ਹਰ ਫਲੋ ਸੀਰੀਅਲ ਲੱਗੇ।
ਭਰੋਸੇਯੋਗ ਰਹਿਣ ਲਈ:
ਤੁਸੀਂ ਕਿਸੇ ਵੀ ਟਾਸਕ ਲਈ "ਏਜੰਟ ਨੇ ਕੀ ਕੀਤਾ?" ਅਤੇ "ਉਸਨੇ ਉਹ ਕੀਤਾ ਕਿਉਂ?" ਦੇ ਜਵਾਬ ਸੌਖੇ ਅਤੇ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਦੇ ਸਕਣਾ ਚਾਹੁੰਦੇ ਹੋ। ਓਬਜ਼ਰਵੇਬਿਲਿਟੀ ਲਈ:
ਏਜੰਟਾਂ ਨੂੰ ਵਿਕਸਤ ਕਰਨ ਵੇਲੇ ਉਨ੍ਹਾਂ ਨੂੰ ਸਰਵਿਸ ਦੀ ਤਰ੍ਹਾਂ ਹੀ ਚਲਾਓ — ਸਥਿਰ ਨਹੀਂ। ਇਹਨਾਂ ਨੂੰ ਇੰਜੀਨੀਅਰਿੰਗ ਦੇ ਉੱਚ ਮਿਆਰ ਨਾਲ ਸੰਭਾਲੋ:
ਇਸ ਤਰ੍ਹਾਂ ਤੁਸੀਂ ਕਤਾਰਬੱਧ ਤੌਰ 'ਤੇ ਏਜੰਟਾਂ ਨੂੰ ਬਿਹਤਰ ਕਰ ਸਕਦੇ ਹੋ ਅਤੇ ਫੇਲ੍ਹਅਰਾਂ ਨੂੰ ਸੀਮਿਤ, ਤੁਰੰਤ ਸਮਝਣਯੋਗ ਅਤੇ ਵਾਪਸ ਲੈਣਯੋਗ ਰੱਖ ਸਕਦੇ ਹੋ।
ਇਸ ਤਰ੍ਹਾਂ ਤੁਸੀਂ ਹਰ ਕਦਮ ਨੂੰ ਵਿਆਖਿਆ ਕਰ ਸਕਦੇ ਹੋ, ਟੈਸਟ ਕਰ ਸਕਦੇ ਹੋ ਅਤੇ ਡੀਬੱਗ ਕਰ ਸਕਦੇ ਹੋ ਬਜਾਏ ਗੁੱਥੇ "ਏਜੰਟ ਸੋਚ" ਵਾਲੇ ਲੂਪਾਂ ਦੇ।
PLAN – ਬੇਨਤੀ ਨੂੰ ਸਮਝੋ ਅਤੇ ਕਦਮ-ਬ-ਕਦਮ ਯੋਜਨਾ ਬਣਾਓCALL_TOOL – ਕਿਸੇ ਖਾਸ ਟੂਲ ਜਾਂ ਬੈਚ ਟੂਲਾਂ ਨੂੰ ਕਾਲ ਕਰੋVERIFY – ਨਤੀਜਿਆਂ ਨੂੰ ਸਧਾਰਨ ਨਿਯਮਾਂ ਜਾਂ ਸੈਕੰਡਰੀ ਮਾਡਲ ਚੈੱਕ ਨਾਲ ਜਾਂਚੋRECOVER – ਰੀਟ੍ਰਾਈ, ਫਾਲਬੈਕ ਜਾਂ ਏਸਕਲੈਸ਼ਨ ਰਾਹੀਂ ਐਰਰ ਹੈਂਡਲਿੰਗDONE / FAILED – ਟਰਮੀਨਲ ਨਤੀਜੇਇਵੈਂਟਾਂ (ਜਿਵੇਂ ToolCallSucceeded, TimeoutExceeded) ਅਤੇ ਮੌਜੂਦਾ ਸਟੇਟ ਮਿਲਕੇ ਅਗਲਾ ਸਟੇਟ ਨਿਰਧਾਰਤ ਕਰਦੇ ਹਨ। ਇਹ ਰੀਟ੍ਰਾਈ, ਟਾਈਮਆਊਟ ਅਤੇ ਏਰਰ ਹੈਂਡਲਿੰਗ ਨੂੰ ਸਪੱਸ਼ਟ ਬਣਾਉਂਦਾ ਹੈ।
InvalidInput, NotFound, RateLimited, TransientFailure) ਅਤੇ ਸਪੱਸ਼ਟ ਸੈਮੈਂਟਿਕਸਇਹ ਕਾਂਟ੍ਰੈਕਟ ਮਾਡਲ ਨੂੰ ਸਟਰਕਚਰਡ ਦਸਤਾਵੇਜ਼ ਦੇ ਰੂਪ ਵਿੱਚ ਦਿਖਾਉ, ਲੰਮੇ ਪੈਰਾ ਦੀ ਥਾਂ। ਪਲਾਨਰ ਨੂੰ ਪਤਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ ਕਿ ਕਿਹੜੇ ਐਰਰ ਰੀਟ੍ਰਾਈਯੋਗ ਹਨ, ਕਿਹੜੇ ਯੂਜ਼ਰ ਦਖਲਗਿਰੀ ਚਾਹੀਦੇ ਹਨ, ਅਤੇ ਕਿਹੜੇ ਵਰਕਫਲੋ ਰੋਕਦੇ ਹਨ।
request_idਇਸ ਨਾਲ ਭਰੋਸੇਯੋਗਤਾ ਉੱਚੀ ਰਹਿੰਦੀ ਹੈ ਬਿਨਾਂ ਚਲਾਕ ਲੂਪਾਂ, ਡੁਪਲੀਕੇਟ ਸਾਈਡ-ਐਫੈਕਟਸ, ਜਾਂ ਅਣਕੰਟਰੋਲ ਖਰਚੇ ਦੇ।
ਕਿਊ ਡੈਪਥ, ਲੈਟੈਂਸੀ ਪ੍ਰਸੈਂਟਾਈਲ, ਅਤੇ 429/503 ਦਰਾਂ ਦੀ ਨਿਗਰਾਨੀ ਕਰੋ ਤਾਂ ਕਿ ਓਵਰਲੋਡ ਨੂੰ ਆਛੇ ਤਰੀਕੇ ਨਾਲ ਰੋਕਿਆ ਜਾ ਸਕੇ।
ਇਸ ਨਾਲ ਘਟਨਾ ਟ੍ਰਾਇਜ਼ ਜਾਂਚ "ਏਜੰਟ ਫਲੇਕੀ ਮਹਿਸੂਸ ਹੁੰਦਾ ਹੈ" ਤੋਂ ਬਦਲ ਕੇ ਸਪੱਸ਼ਟ ਸਟੇਟ, ਟੂਲ ਅਤੇ ਬਦਲਾਅ ਦੇ ਕਾਰਨ ਤੱਕ ਆ ਜਾਂਦੀ ਹੈ।