There are more agent frameworks than there are opinions about them, and most comparisons are lists of features. Here is the comparison I wanted: what does each one refuse to do, and what is that refusal protecting you from.
The shape of the question
Every framework makes a choice about where the agent's state lives and who is allowed to change it. That choice determines what you can debug at 2 a.m. and what you cannot.
CrewAI
crewaiinc/crewAI is MIT-licensed and built around roles: agents with a job description, tasks with an expected output, and a process that runs them. The refusal is the abstraction itself. You hand it a crew and a list of tasks and it decides the order.
That is excellent when your problem is genuinely a crew of specialists, and it is the wrong shape when you need the agent to decide the order, because the decision is now inside the framework and you cannot see it.
AutoGen
microsoft/autogen is the one with the surprise licence: the file at the root of the repository is Creative Commons Attribution 4.0, not a standard software licence, and its last push was in April. The framework's own refusal is older: it is built around a conversation between agents, and it assumes the human is in the loop somewhere.
Its strength is multi-agent conversation with a human in it, which is the thing that is genuinely hard to get right and that the other frameworks do not do at all.
smolagents
huggingface/smolagents is deliberately small. The refusal is everything it does not have: no persistent state, no complex workflow language, no memory layer.
What you get is an agent, some tools, and code, in about a thousand lines you can read in an afternoon. For a lot of people that is the whole argument, because the alternative is a framework whose behaviour you cannot predict from its documentation.
Agno
agno-agi/agno sits in the middle: it has a concept of a model, a tool, a memory and a team, and it is a much larger surface than smolagents.
The comparison that is actually useful
Ask three questions of any framework before you adopt it:
Where does the state live? If the answer is "inside the framework object", you cannot inspect it. If it is "in files and in your database", you can.
Can you run one step without the framework? A framework you can call one function at a time is a framework you can debug. One you can only run end to end is a black box with better marketing.
What happens when it fails halfway? A framework that persists every step is restartable. One that does not is a research project.
None of these is a feature list, and all three are answerable by reading an hour of somebody's code.