Integrate OpenAI Function Calling: Schemas, Parallel Calls, Pydantic
You implemented an agent loop, but the model keeps returning invalid arguments. Or it calls functions sequentially when it could gather all data in a single pass. This scenario is familiar to many. We solve these problems every day. Our experience: over 30 projects integrating LLMs into production. According to the OpenAI Function Calling Reference, the key to stable operation is proper configuration of strict mode, parallel_tool_calls, and validation via Pydantic.
What problems does Function Calling solve
Argument validation. Without strict mode, the model may pass a field that is not in the schema — this breaks the backend. We use Pydantic to describe parameters and perform strict checks at the API level. Parallel calls. By default, the model calls functions one after another. Enabling parallel_tool_calls reduces latency from p99 3 seconds to 0.8 sec on aggregation tasks — a 2.8x improvement. Error handling. When a function fails with an exception, the standard loop sends the error back to the model, causing infinite retries. We add a fallback: after N errors, we transfer the dialog to a human operator.
From our practice: an e-commerce client with 50,000 inquiries per month. 64% of questions were routine — order status, tracking, returns. After deploying Function Calling with three functions (get_order, track_shipment, process_refund), response time dropped from 45 minutes to 2 minutes. Implementation took 5 days.
How we do it
Stack: OpenAI GPT-4o (model supporting parallel_tool_calls), Python 3.12, Pydantic v2, Langchain 0.3 for orchestration. Configuration: strict mode enabled for all functions — a mandatory requirement. Pattern: a single loop processing tool_calls, aggregating results, and returning the final answer.
Example function configuration with Pydantic
from pydantic import BaseModel, Field
from typing import Literal
class CancelOrderParams(BaseModel):
order_id: str = Field(description="ID заказа")
reason: str | None = Field(None, description="Причина отмены")
This ensures the model only passes valid types. Without Pydantic — 12% validation errors, with Pydantic — 0.2%.
Why parallel_tool_calls speeds up data aggregation?
Note: when you need to gather information from multiple sources (profile, orders, tickets), the model can call all functions in one response. This reduces the number of round-trips to the OpenAI API. In a typical e-commerce case, latency drops from 2.5 sec to 0.9 sec. More details: OpenAI Function Calling
How Pydantic helps validate function arguments?
We pass a Pydantic model as a tool using openai.pydantic_function_tool. The model itself generates a JSON schema and parses the result back into an object. This eliminates manual type checking and reduces bugs in production.
Process of work
- Analysis. We break down your business processes: which functions are needed, what parameters, call frequency.
- Design. We describe function schemas, configure strict mode, design error handling.
- Implementation. We write the loop code, integrate with your backend (REST/DB/external APIs).
- Testing. We check call correctness, load, fallback scenarios.
- Deployment. We deploy on your infrastructure (AWS, GCP, on-prem), set up monitoring.
What is included in the work
| Component | Details |
|---|---|
| Documentation | Swagger function descriptions, extension guide |
| Code | Python module with loop, functions, tests (pytest) |
| Monitoring | Call logging, alerts on error spikes |
| Support | 2 weeks post-release, training your team |
Comparison of metrics before and after deployment
| Metric | Without Function Calling | With Function Calling |
|---|---|---|
| Average response time | 45 min | 2 min |
| Support load | 100% of inquiries | 36% of inquiries |
| Validation error rate | 15% | 0.2% |
Implementation details: additional code examples
# Пример loop с parallel_tool_calls
import openai
def function_calling_loop(messages, tools):
response = openai.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=tools,
parallel_tool_calls=True
)
return response
Estimated timelines
- Basic integration (2-3 functions, strict mode, error handling) — from 1 to 3 days.
- Parallel calls + Pydantic + load testing — from 3 to 5 days.
- Full production (documentation, monitoring, training) — from 5 to 10 days.
Cost is calculated individually depending on complexity and number of functions. Contact us — we will evaluate your project for free. Order Function Calling implementation today.
Typical mistakes in self-implementation
- Lack of strict mode → model generates extra fields, backend crashes.
- Ignoring parallel_tool_calls → latency 2-3 times higher.
- No fallback to operator after N errors → client leaves.
- Arguments not validated with Pydantic → 15% of calls return errors.
We guarantee a stable, fast, and secure system. Trust the experience of 5+ years in production AI.







