- AI
- A
Why OpenAI Assistants Are Unsuitable for Complex AI Agents
OpenAI Assistants lacked the flexibility for complex logic. Its backend turned into an operational nightmare—50% of the time spent on support instead of development. Agent Builder created vendor lock-in. Here's how we solved this problem at Soft Skills Lab.
About the article:
This is a case study of how we at Soft Skills Lab developed AI agents for an EdTech product:
Why OpenAI Assistants were not suitable for complex scenarios
What problems arose with our backend
Why we needed to create our own platform for managing agents
If you are integrating AI into a product and are wondering which path to take — this experience may be useful.
Launching an AI agent on OpenAI Assistants is easy. We at Soft Skills Lab did just that: we created 20 AI simulators for negotiations. Everything worked smoothly, OpenAI's infrastructure is great.
But when we started complicating the scenarios — we hit a wall.
Do we need to explicitly manage the agent’s memory? No. Conditional logic in the middle of a dialogue? Workarounds. Switch the model to another one? Rewrite the integration. Understand why the agent gave a strange answer? There are practically no logs.
We realized: for complex product scenarios, we need not just stability, but operational control. Here’s how we came to this conclusion (and what we did next).
First attempt - OpenAI Assistants
We started with OpenAI Assistants — a quick start, stable infrastructure. It works great for simple scenarios.
But then we wanted to develop an exercise called "Skills Testing": the agent asks questions, analyzes answers, evaluates competencies. And that’s where the trouble began...
Flexibility issues:
1. Conditional logic based on the response
In skills testing, it is very important to apply different checking logic depending on what the person answers.
For example: if the person answered A — ask a clarifying question, if B — move to the next block, if C — give a hint and ask again.
In Assistants, this is either through functions or is generally impossible to implement explicitly.
2. Control over memory
The agent needed to remember the pattern of responses: if the person made a mistake in one category of skills three times in a row — this is a signal for a deeper check.
In Assistants, memory works automatically through threads — convenient, but you do not control WHAT exactly the agent remembered and HOW it uses it. Sometimes it pulled the wrong data from context, and the logic broke down.
3. Works like a black box
When the agent gives an unexpected assessment or misses an important pattern — you want to understand why.
But in Assistants, you only see the final result. There are no detailed logs — the system works like a black box.
For debugging complex testing logic, this is a problem.
Conclusion on OpenAI Assistants — a cool tool for a quick start. But when explicit conditional logic, memory control, and detailed analytics of each step are needed — you run into limitations.
Attempt 2 - our exercise constructor
We decided to create our own backend: FastAPI, our prompts, full control.
Plus: we can implement any logic, with no restrictions. The infrastructure is stable.
And then problems arose...
1. Debugging turns into a quest
The agent gave a strange evaluation in testing. I want to understand why — I go to the developers.
They look at the logs on the server, figure out what happened at which step, searching for where exactly the agent went wrong.
Analyzing one strange case took from one hour to several hours of team work.
2. Switching models = pain
We wanted to test Claude instead of GPT-4 — this means changing the integration, testing, deploying. Each model switch carries the risk of breaking something.
3. Provider lock-in
Even while creating our own backend, we were essentially tied to the OpenAI API.
When we wanted to try GigaChat or DeepSeek — we realized that it would take weeks of work for refactoring.
At some point, I understood: we were spending 40-50% of our time not on new exercises, but on supporting existing ones, debugging, and making small fixes.
We didn't have a unified system: logs in one place, prompt settings in the code, dialogue analytics — nowhere at all.
Attempt 3 - Agent Builder from OpenAI
We saw Agent Builder from OpenAI — wow, this solves our problems! A visual constructor, logic can be set up without coding, iterations are fast.
We almost started redoing exercises on Agent Builder...
But...
Then I asked myself: what if tomorrow we realize that for a specific exercise, Gemini performs better than GPT-4?
Or that DeepSeek provides the same quality but is 5 times cheaper for certain tasks?
Agent Builder solved the flexibility problem but created a new one: we would be forever stuck on OpenAI models.
All our exercises would be trapped with one provider. Migration = rewriting all 20+ simulators from scratch.
Realization:
We understood: different tasks require different models. In some places, GPT-4 is the best, in others, Gemini performs better, and sometimes you can save on DeepSeek without losing quality.
We need the flexibility of Agent Builder, but without being tied to one provider and its models.
Assemblix — an operating system for AI agents
We compiled a list of what is REALLY needed to support AI agents in production:
Visual builder for flexible logic (like Agent Builder)
Transparency of each call — detailed logs
Independence from the provider — choosing the best model for each task
A unified system to manage all agents
Memory between agents and sessions
Initially, we created it for ourselves in SSL. Then we realized: this problem is not only ours.
Attempt 4 (hope it's the last):
1. Visual builder independent of the provider
We assemble exercises visually: nodes, conditions, prompts — like in Agent Builder, but on our infrastructure.
The same simulator "Skills Testing": if answer A — a clarifying question (node), if B — the next block (transition), if C — a hint (condition). All this visually, without code.
We change the logic right in the interface, without releases and deployments.
2. Seeing each step of the agent
We see each step of each agent: what it answered, how much time it took, what logic was triggered.
The agent gave a strange evaluation? We open the log of this session, see the entire path: what conditions were triggered, what the model answered at each step.
Debugging a strange case — a few minutes instead of several hours of team work.
3. Model selection for each task
OpenAI, Claude, GigaChat, DeepSeek, Gemini — we choose a model for a specific exercise.
In some cases, GPT-4 shows the best quality, in others, Gemini handles specific logic better, and sometimes DeepSeek provides the same quality at a lower cost.
Switching between providers is literally a choice from a list in the interface. Everything is out of the box, without technical difficulties.
4. Shared memory between agents
We have a chain of exercises: first skills testing, then practical tasks based on the test results.
Previously, data was transmitted manually between exercises. Now we simply pass client_id — both agents automatically see the entire interaction history.
The memory works out of the box.
5. Unified operational panel
All agents, all exercises, all user sessions — in one place.
We can filter: show all sessions of a specific student, or all exercises with a certain model, or all dialogues from the last week.
This is operational control over the entire AI infrastructure.
What have we achieved?
1. Debugging is no longer a pain for developers
In the last month, the development team has not once been approached with a request to figure out why an exercise is not working correctly.
Previously, this was a regular pain: developers were distracted from tasks, digging through logs, looking for issues.
Now, methodologists and trainers open the logs in Assemblix themselves, see every step of the agent, and find the problem without developers.
2. Speed of creating exercises
Previously: new exercise = several weeks of development.
Now: several days of active work in the builder.
The main work is done by methodologists; developers are only needed for final integration.
3. The best model for each task
We stopped using one model for everything.
Part of the logic has been delegated to OpenAI (generating responses to users), and part to Gemini (analyzing user responses) — each model where it shows the best results.
Previously, such switching would have taken weeks of refactoring. Now — selecting a model from a dropdown.
4. Scale
On Assemblix, we created about 7 large exercises, which we are actively integrating into our courses.
(In the next article, I will share a specific case with details — how one of the exercises works under the hood.)
What's next?
We launched Assemblix as a product for teams that create AI agents in production.
In the next article, I will share a specific case: how one of our exercises works under the hood, what problems we encountered, and how we solved them.
Write comment