AI Agent Development: Use Cases, Architecture, and Deployment Patterns

  1. Home
  2. /
  3. Insights
  4. /
  5. AI Agent Development: Use...

Most enterprise AI pilots that make it past proof-of-concept share a common architectural moment: the point where a single LLM call stops being enough. A model that can answer questions cannot reliably orchestrate a five-step procurement workflow, retry a failed API call, or update a knowledge base mid-task. That gap — between “model that responds” and “system that acts” — is precisely where AI agent development begins.

This article is for architects and technical leads who are evaluating or already building agentic systems and want a production-grade perspective rather than a conceptual overview. You will come away with a clear mental model of agent anatomy, a grounded read on the current framework landscape, and a deployment decision matrix you can actually use when talking to your infrastructure and security teams.

We will cover: production-ready enterprise use cases for agentic systems, a deep dive into agent architecture (memory, tool execution, and reasoning layers), a comparative analysis of LangGraph, CrewAI, AutoGen, and custom implementations, and a deployment guide that covers both cloud-native and strict-enterprise security patterns.

What an AI Agent Actually Is (and Is Not)

ai agent development

Before going deep on architecture, it is worth being precise. An AI agent is a software system that combines an LLM’s reasoning capability with the ability to execute actions — reading from databases, calling APIs, writing files, spawning sub-processes — in an iterative loop that runs until a goal condition is met or an abort signal is triggered.

This is meaningfully different from a chain (a fixed sequence of LLM calls) and from a RAG pipeline (retrieval-augmented generation, where documents are injected into context before a single inference). An agent can:

  • Decide which tool to call based on the current state of a task
  • Observe the result of that tool call and update its internal state
  • Branch or backtrack when a tool returns an error or an unexpected result
  • Persist information between tool calls, across turns, and across sessions

The loop — often called a ReAct loop (Reason + Act) after the 2022 paper by Yao et al. — is the foundational execution pattern. Most production agent frameworks implement a variant of it.

Production-Ready Enterprise Use Cases

Theoretical use cases for agents are plentiful. The ones that survive contact with engineering reality share a few properties: well-defined success criteria, bounded tool sets, and failure modes that are recoverable. The following represent patterns that have shipped at scale.

Autonomous Customer Support Triage and Resolution

Tier-1 support automation is probably the most deployed agentic pattern in production today. The agent’s task graph looks roughly like this:

  1. Classify the incoming issue against a policy taxonomy (billing, access, technical failure, feature request)
  2. Retrieve the customer’s account state from a CRM via a structured API call
  3. Consult a vector-indexed knowledge base of resolution runbooks
  4. Attempt a resolution action — resetting a flag in the auth system, triggering a refund workflow, sending a re-provisioning event — via a write-capable tool
  5. Validate the outcome (did the action produce the expected state change?)
  6. Escalate with a structured context packet if resolution fails

The critical architectural decision here is defining the write permission boundary. Most teams start agents in read-only mode, validate accuracy against human-handled tickets, and progressively unlock write operations on low-risk action types. Our case study on the AI-powered self-learning chatbot implementation shows how this graduated permission model plays out across a real deployment lifecycle.

Codebase Refactoring and Technical Debt Agents

These agents operate on a code graph rather than a document corpus. A typical refactoring agent will:

  • Parse an AST (abstract syntax tree) of the target repository to identify deprecated patterns, security anti-patterns (e.g., unsanitized SQL concatenation), or dependency conflicts
  • Generate candidate refactors using a code-specialized model (Codex, Claude, or a fine-tuned Llama variant)
  • Execute a test suite via a sandboxed bash tool and parse the exit codes and diff output
  • Commit passing changes to a staging branch and open a structured PR with annotated reasoning

The key engineering constraint is sandboxing. Any agent that can write to a filesystem and execute code must run inside a containerized, network-isolated environment with explicit egress controls. Security teams typically require that the agent’s execution environment is stateless and that all artifacts are logged to an immutable audit trail before touching a staging branch.

Supply Chain and Procurement Automation

In logistics and procurement contexts, agents handle multi-step workflows that previously required human coordination across four or five internal systems. A representative flow:

  1. Detect a stock-level alert from an ERP webhook
  2. Query the supplier catalog API for current lead times and pricing across three approved vendors
  3. Cross-reference against budget allocations in the financial system
  4. Draft and submit a purchase order via an EDI integration
  5. Update the inventory forecast model with the expected arrival date

The challenge here is partial failure handling. If the supplier API returns an error on step two, the agent must decide whether to retry, fall back to a secondary vendor list, or halt and notify a human approver. This requires explicit error-handling branches in the task graph, not just a top-level try/catch.

Intelligent Data Analytics Pipelines

Agents are increasingly used to automate the analyst workflow: receiving a business question in natural language, generating the appropriate SQL or dataframe transformation, executing it against a warehouse (Snowflake, BigQuery, Redshift), validating the result shape, and rendering a narrative summary with a structured data artifact. Teams using this pattern at scale typically combine it with our data analytics services infrastructure for governance and lineage tracking.

Agent Architecture: A Deep Dive

Every production agent, regardless of framework, is composed of four interacting layers. Understanding them individually is necessary before you can reason about failure modes, performance bottlenecks, or security perimeters.

The Memory Layer

Memory in an agent context means more than conversation history. There are four distinct memory types, each with different storage backends and access semantics:

Memory TypeScopeTypical StorageLatency Profile
In-context (working) memoryCurrent task executionLLM context windowSub-millisecond (already loaded)
Short-term episodic memoryMulti-turn sessionRedis / in-process state< 5ms
Long-term semantic memoryCross-session knowledgeVector DB (pgvector, Pinecone, Weaviate, Qdrant)10–80ms (includes embedding + ANN search)
Procedural memoryLearned task patternsFine-tuned model weights or LoRA adaptersOffline (baked into inference)

The vector database interaction pattern deserves more attention than it usually gets. When an agent needs to consult long-term memory, the flow is:

  1. The agent’s current working context (task state + recent observations) is embedded using a dedicated embedding model (text-embedding-3-large, BGE-M3, or a locally hosted model for data-sensitive deployments)
  2. An approximate nearest-neighbor (ANN) search retrieves the top-k semantically similar documents from the vector index
  3. Retrieved chunks are reranked — using a cross-encoder or a dedicated reranker model — before being injected into context
  4. The agent reasons over the retrieved content as part of its next action decision

A common architectural mistake is skipping the reranking step. ANN search optimizes for recall, not precision. Without reranking, agents routinely receive off-topic chunks that pollute reasoning and increase hallucination risk.

The Tools Execution Layer

Tools are the agent’s actuators — the mechanisms through which it affects external state. At the implementation level, a tool is a callable function with a typed signature that the LLM can invoke by generating a structured tool-call payload (JSON in the OpenAI/Anthropic tool-use format).

Production tool sets typically include:

  • Read tools: vector search, SQL query executor, REST API GET wrapper, file reader
  • Write tools: API POST/PATCH/DELETE wrappers, database write executor, filesystem writer, code executor (sandboxed)
  • Control tools: human-in-the-loop escalation trigger, sub-agent spawner, task state updater, abort/halt

Tool definitions must be precise. The LLM uses the tool’s name and description to decide when to invoke it, and uses the parameter schema to populate the call correctly. Vague descriptions (“does database stuff”) predictably produce wrong invocations. The description should specify: what the tool does, what inputs it expects, what it returns, and what errors it can raise.

Tool execution should always be wrapped in:

  • Timeout enforcement (external calls must not block the agent loop indefinitely)
  • Output validation (schema-check the tool’s return before injecting it into context)
  • Audit logging (every tool call with its inputs, outputs, and timestamp, written to an append-only log)

The Reasoning and Routing Layer

This is the LLM itself — specifically, the planning and action selection logic that decides what to do next given the current state. The dominant pattern is the ReAct loop, but production systems typically implement additional control logic on top of it.

Here is a pseudocode representation of a production-grade routing loop:

function run_agent(task: Task, tools: ToolRegistry, config: AgentConfig):
state = AgentState(task=task, history=[], scratchpad=””)

for step in range(config.max_steps):
# Build the prompt from current state
prompt = build_prompt(
system_instructions=config.system_prompt,
task=state.task,
history=state.history,
scratchpad=state.scratchpad,
available_tools=tools.get_schemas()
)

# LLM inference call
response = llm.complete(prompt, tools=tools.get_schemas())

# Route based on response type
if response.type == “final_answer”:
return AgentResult(
answer=response.content,
steps=state.history,
status=”success”
)

elif response.type == “tool_call”:
tool = tools.get(response.tool_name)

# Validate tool call before execution
validation_result = tool.validate_input(response.tool_args)
if not validation_result.ok:
state.scratchpad += f”[Error] Invalid tool args: {validation_result.error}”
continue

# Execute with timeout
try:
tool_output = tool.execute(
args=response.tool_args,
timeout=config.tool_timeout_seconds
)
except TimeoutError:
tool_output = ToolOutput(error=”Tool execution timed out”)
except ToolError as e:
tool_output = ToolOutput(error=str(e))

# Log the action
audit_log.append(tool_name=tool.name, args=response.tool_args, output=tool_output)

# Update state
state.history.append(
ActionRecord(thought=response.reasoning, action=response.tool_name,
args=response.tool_args, observation=tool_output)
)

elif response.type == “clarification_needed”:
return AgentResult(status=”needs_human_input”,
question=response.content)

# Max steps exceeded
return AgentResult(status=”max_steps_exceeded”,
partial_history=state.history)

The routing decision — choosing between final_answer, tool_call, and clarification_needed — is one of the most sensitive parts of the system. Models tend to over-tool (calling tools unnecessarily) or under-tool (synthesizing answers from stale context instead of fetching fresh data). Mitigation strategies include few-shot examples in the system prompt, explicit routing instructions, and a lightweight classifier that validates the model’s tool selection before execution.

Architecture Diagram

┌─────────────────────────────────────────────────────────────────┐
│ AI AGENT RUNTIME │
│ │
│ ┌─────────────┐ ┌──────────────────────────────────────┐ │
│ │ Task Input │────▶│ REASONING LAYER (LLM) │ │
│ └─────────────┘ │ – System prompt + task context │ │
│ │ – Tool schemas injected │ │
│ ┌─────────────┐ │ – Action selection (ReAct loop) │ │
│ │ Memory │────▶│ │ │
│ │ Layer │ └────────────┬─────────────────────────┘ │
│ │ │ │ │
│ │ ┌─────────┐ │ ┌────────▼────────┐ │
│ │ │Working │ │ │ ROUTER LOGIC │ │
│ │ │Memory │ │ │ │ │
│ │ │(context)│ │ └─┬──────────┬───┘ │
│ │ └─────────┘ │ │ │ │
│ │ │ ┌──────▼──┐ ┌────▼──────────┐ │
│ │ ┌─────────┐ │ │ FINAL │ │ TOOL CALL │ │
│ │ │Episodic │ │ │ ANSWER │ │ EXECUTION │ │
│ │ │Memory │ │ └─────────┘ │ │ │
│ │ │(Redis) │ │ │ ┌───────────┐ │ │
│ │ └─────────┘ │ │ │Read Tools │ │ │
│ │ │ │ │Write Tools│ │ │
│ │ ┌─────────┐ │ │ │Code Exec │ │ │
│ │ │Semantic │◀│─────────────────│ │Escalation │ │ │
│ │ │Memory │ │ (RAG update) └───────────┘ │ │
│ │ │(Vector │ │ │ │ │
│ │ │ DB) │ │ └───────┬───────┘ │
│ │ └─────────┘ │ │ │
│ └─────────────┘ ┌──────────▼──────────┐ │
│ │ OBSERVATION + │ │
│ │ STATE UPDATE │ │
│ │ (back to LLM) │ │
│ └─────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ AUDIT LOG │ TOOL REGISTRY │ ERROR HANDLER │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘

Framework Landscape: Choosing the Right Tool for the Architectural Job

The agent framework space has converged around a few dominant options, but the choice between them is not primarily about feature checklists — it is about which execution model matches your agent’s topology and your team’s tolerance for abstraction overhead.

LangGraph

LangGraph (from LangChain) models agents as directed graphs where nodes are processing steps and edges represent transitions between them, including conditional branching and cycles. This makes it the natural choice for:

  • Cyclic workflows where an agent may revisit a prior step based on an observation (e.g., a research agent that loops back to search after evaluating source quality)
  • Stateful multi-step pipelines with explicit checkpointing (LangGraph’s persistence layer writes state to Postgres or Redis between nodes)
  • Human-in-the-loop patterns where the graph pauses at a designated node for human approval before continuing

The downside is complexity overhead. Expressing a simple linear agent as a LangGraph is verbose and unnecessary. The framework shines specifically when your control flow cannot be expressed as a DAG.

CrewAI

CrewAI is designed around multi-agent collaboration — a “crew” of specialized agents, each with a defined role and tool set, working toward a shared goal under an orchestrator. The mental model maps well to real team structures: a researcher agent, a writer agent, a validator agent, a code reviewer agent.

It is the most accessible framework for teams building multi-agent systems for the first time, with a high-level API that handles inter-agent communication and task handoff. The trade-off is reduced visibility into the underlying execution. When a CrewAI run fails, debugging requires dropping into framework internals.

AutoGen (Microsoft)

AutoGen takes a different conceptual approach: agents are implemented as conversational actors that interact via a structured message protocol. This makes it particularly well-suited for:

  • Code generation and execution loops (AutoGen’s built-in code executor is battle-tested)
  • Critic-actor patterns where one agent proposes and another evaluates
  • Research workflows requiring iterative refinement with a human or automated evaluator in the loop

AutoGen’s group chat orchestration handles multi-agent turn-taking out of the box, which saves significant plumbing work for systems where multiple agents need to collaborate on a shared artifact.

Custom Python Implementations

For teams with strict latency requirements, unusual tool interfaces, or security constraints that make third-party frameworks impractical, a custom implementation built directly on the provider SDK (Anthropic, OpenAI, or a local model via Ollama/vLLM) is often the right call.

The advantages are significant:

  • Zero framework overhead in the critical path
  • Complete control over prompt construction, tool registration, and error handling
  • No hidden HTTP calls, no opaque retry logic, no framework-version dependency management
  • Straightforward integration with enterprise observability stacks (Datadog, Grafana, OpenTelemetry)

The cost is that you are building and maintaining the routing loop, state management, and tool registry yourself. For teams with experienced ML engineers and a clear understanding of the agentic AI patterns that have emerged in 2025, this is often worth it.

A framework selection heuristic:

  • Simple linear agent, single model → Custom SDK implementation
  • Complex branching / cyclic state machine → LangGraph
  • Multiple specialized agents collaborating → CrewAI or AutoGen
  • Code generation with execution loop → AutoGen
  • Strict enterprise security / air-gapped → Custom implementation, potentially with a locally hosted model

Deployment and LLMOps Patterns

Deployment and LLMOps Patterns

Getting an agent working in a notebook and getting it running reliably in production are two categorically different engineering problems. The deployment decision involves infrastructure topology, latency SLAs, data residency requirements, cost structure, and security governance — and those constraints interact.

Cloud-Native and Serverless Patterns

For teams operating in AWS, GCP, or Azure without strict data residency requirements, the standard cloud-native deployment gives you the fastest path to production scale.

The typical stack looks like this:

  • Agent runtime: Containerized Python service (FastAPI or gRPC), deployed on ECS Fargate, Cloud Run, or AKS
  • LLM inference: Managed API endpoint (Anthropic, OpenAI, Azure OpenAI) with retry logic and exponential backoff
  • Short-term memory: ElastiCache (Redis) for session state
  • Long-term memory: Managed vector database (Pinecone, Weaviate Cloud, or pgvector on RDS)
  • Tool execution: Lambda functions or Cloud Run jobs for sandboxed code execution; direct API calls for integration tools
  • Observability: OpenTelemetry traces to Datadog or Honeycomb, LLM-specific logging (token counts, latency, tool call sequences) to a dedicated analytics sink
  • Orchestration: Step Functions or Cloud Workflows for durable, long-running task graphs with guaranteed execution

The AI-powered automation patterns that work well in this model share a common property: the LLM provider is treated as a reliable external dependency, not infrastructure you own, which means SLA responsibility sits with the provider.

Advantages of cloud-native deployment:

  • Horizontal scaling with near-zero ops overhead (autoscaling groups, managed inference endpoints)
  • Pay-per-token cost model with no idle infrastructure cost
  • Fast iteration: new tool implementations or prompt changes deploy in minutes
  • Managed vector DB services handle index replication, backup, and scaling

Limitations to plan for:

  • Data leaves your network boundary on every LLM inference call (critical for PII, PHI, and regulated financial data)
  • Latency spikes during provider incidents are outside your control
  • Token-level costs can be opaque at scale without careful instrumentation

Enterprise Security Patterns: On-Premise, Private VPC, and Hybrid

For financial services, healthcare, defense contractors, and any organization operating under strict data residency or classification requirements, the cloud-native model above is often not an option. The data security challenges in regulated environments apply to agent deployments with additional surface area, since agents make multiple sequential external calls rather than a single API request.

On-Premise / Air-Gapped Deployment:

  • LLM inference runs locally on GPU infrastructure (NVIDIA H100/A100 clusters, or inference-optimized hardware like Groq for lower latency requirements)
  • Model serving via vLLM, TGI (Text Generation Inference), or TensorRT-LLM
  • Vector DB runs on self-managed Qdrant, Weaviate, or pgvector on bare-metal Postgres
  • All tool calls stay within the internal network; external integrations route through a hardened API gateway
  • The entire agent runtime, including model weights, is air-gapped from public internet

Private VPC (AWS/GCP/Azure):

  • LLM inference via Azure OpenAI with Private Endpoint (data does not traverse public internet; the API endpoint is assigned a private IP inside the VPC)
  • Alternatively, a self-hosted model on EC2/GKE GPU nodes within the VPC
  • VPC Service Controls (GCP) or AWS PrivateLink for all managed service access
  • Agent runtime deployed in a private subnet with no public IP

Hybrid Architecture:

A common pattern for enterprises that want managed inference for non-sensitive tasks but air-gapped execution for sensitive data: route classification happens at the gateway, and requests are dispatched to either the cloud inference endpoint or the on-prem model based on a data classification label attached to the task payload.

Deployment Pattern Comparison

DimensionCloud-Native (Serverless)Private VPCOn-Premise / Air-Gapped
Time to productionDays to weeks2–6 weeks8–20 weeks
Infrastructure ops burdenVery lowMediumHigh
Data residency controlLow (data sent to provider)High (stays in VPC)Complete
Inference latency (p50)300ms–2s (provider-dependent)200ms–1.5s100ms–800ms (hardware-dependent)
Cost modelToken-based, variableInfra + token costHigh CapEx, low per-inference OpEx
Model flexibilityProvider-constrainedProvider + self-hostedFull (any model)
Compliance postureRequires DPA, BAA, audit logsMeets most enterprise requirementsMeets strictest (DoD IL4/5, HIPAA onsite)
Scaling modelAuto-horizontalSemi-auto (k8s HPA)Manual or k8s on bare metal
Best forSaaS products, internal tools, low sensitivity**Regulated financial, healthcare SaaSDefense, banking core systems, sovereign AI

LLMOps Instrumentation Requirements

Regardless of deployment topology, production agent systems require instrumentation that goes beyond standard APM:

  • Trace-level logging that captures the full agent loop: each reasoning step, tool call input/output, memory retrieval result, and final answer, linked by a common trace ID
  • Token budget tracking per agent run and per task type, with alerts on p95 token consumption to catch prompt injection or runaway loops
  • Tool call success/failure rates broken out by tool type, enabling targeted debugging when the agent is failing on a specific integration
  • Latency attribution: time spent in LLM inference vs. tool execution vs. memory retrieval — essential for optimization work
  • Evaluation harnesses that run a regression suite of representative tasks against every model or prompt change before promotion to production

Building this instrumentation from scratch is one of the strongest arguments for engaging a team with dedicated AI development expertise early, rather than discovering the gaps in production.

Multi-Agent System Design Considerations

Single-agent architectures work well when the task graph is bounded and the tool set is manageable. As scope expands, multi-agent systems emerge as the natural structure — but they introduce coordination complexity that deserves explicit design attention.

Key design decisions in multi-agent architectures:

  • Orchestrator vs. peer topology: Either a central orchestrator agent dispatches tasks to specialized sub-agents (simpler to reason about, single point of failure), or agents communicate peer-to-peer via a shared message bus (more resilient, harder to debug)
  • Shared vs. isolated memory: Whether agents share a common long-term memory store or maintain isolated semantic indexes. Shared memory creates coordination risk (one agent’s writes can confuse another’s retrieval); isolated memory creates inconsistency risk
  • Trust boundaries between agents: An orchestrator agent should not automatically trust a sub-agent’s output as ground truth, particularly if sub-agents can be independently compromised or hallucinate. Output validation at agent boundaries is a necessary pattern
  • Failure propagation: Define explicitly what happens when a sub-agent fails, times out, or returns a malformed result. The orchestrator must have a fallback plan, not just an error handler

The machine learning development work that underlies capable specialist agents — fine-tuning, LoRA adaptation, RLHF for tool use — is often what separates reliable multi-agent systems from fragile ones.

Security and Governance

Agents introduce an attack surface that does not exist in passive inference systems. Because agents act on external systems based on LLM output, adversarial inputs can trigger real-world side effects. The primary threat vectors:

  • Prompt injection via tool outputs: A malicious document returned by a search tool can contain instructions that hijack the agent’s subsequent actions. Mitigation: sanitize tool outputs before injecting into context; use a separate model call to detect injected instructions
  • Tool privilege escalation: An agent with broad write permissions can cause irreversible damage from a single bad action. Mitigation: implement the least-privilege principle at the tool level; stage write permissions progressively
  • Data exfiltration via constrained channels: An agent with access to sensitive data and network egress can be prompted to exfiltrate via ostensibly innocent API calls. Mitigation: explicit egress filtering, output inspection before external calls

Governance requirements for enterprise deployments typically include:

  • An immutable audit log of every agent action, including rejected tool calls
  • Human approval gates for high-impact write operations
  • A circuit breaker that halts the agent when anomalous behavior patterns are detected (e.g., unusual tool call sequences, token consumption spikes)
  • Regular red-team exercises against the agent’s tool interface

For organizations considering a dedicated development team structure for long-running agent projects, a dedicated team model gives security teams a stable point of contact and enables the audit-and-iterate governance cycle that agentic systems require.

Where Agent Development Is Heading

Two trends worth tracking for architectural planning purposes:

Model-native tool use improvements: Both Anthropic’s and OpenAI’s latest models show significantly better tool selection accuracy and parallel tool call capability compared to 2023 baselines. This reduces the need for hand-crafted routing logic and makes simpler agent architectures viable for tasks that previously required complex state machines.

Agent-to-agent protocols: The MCP (Model Context Protocol, from Anthropic) and Google’s A2A (Agent-to-Agent) specification are converging on standard interfaces for inter-agent communication and tool exposure. Building to these standards now reduces migration cost when they become dominant.

The organizations that are making the most progress with production agents are not the ones chasing the latest model release. They are the ones that invested in the unglamorous infrastructure: tool observability, evaluation harnesses, memory hygiene, and clear human-oversight protocols. The architecture above will still be relevant regardless of which model is in the inference slot — because the hard problems are in the system design, not the LLM.

For teams navigating the build vs. buy vs. partner decision on agent infrastructure, our AI software development expertise page outlines the engagement models we use to take agent systems from architecture to production deployment.

More insights:

12 Must-Have Features in Recruitment Automation...

Automation is one of the most noteworthy 2021 recruiting trends. Harvard Business School reports, 75% …

Scrum Tips to Be a Successful Scrum Master...

Scrum is a dominant framework for implementing principles of Agile software development that have …

Business Analyst Benefits for a Software...

People often confuse project managers and business analysts as they have seemingly similar responsibilities…

Read more

Scrum Tips to Be a Successful Scrum Master...

Scrum Tips to Be a Successful Scrum Master of Remote Teams Home Companies have been…

12 Must-Have Features in Recruitment Automation...

12 Must-Have Features in Recruitment Automation Software Home Companies have been moving their business to…

How Exactly Cloud Computing Can Benefit ...

espite its numerous advantages, cloud computing has its flaws — many of its advantages could be…

When to Hire a Business Analyst?

When to assign BA to a project? When you have
Limited budget with no understanding…

Still thinking?

That’s fine. We just want you to know there’s 
a real team on the other side of this — people who’ve shipped products like yours and genuinely care how they turn out.

Top 100 Global Service 
Providers by Clutch

Top Rated Plus
on Upwork

5 stars Rating 
on GooFirms

Verified on Google 
My Business

Trusted by clients 
on Trustpilot

100% Job Success 
on Upwork