| Every single SDK I've used was a nightmare once you get past the basics. I ended up just using an OpenRouter client library [1] and writing agents by hand without an abstraction layer. Is it a little more boilerplatey? Yea. Does it take more LoC to write? Yea. Is it worth it? 100%. Despite writing more code, the mental model is much easier (personally) to follow and understand. As for the actual agent I just do the following: - Get metadata from initial query - Pass relevant metadata to agent - Agent is a reasoning model with tools and output - Agent runs in a loop (max of n times). It will reason which tool calls to use - If there is a tool call, execute it and continue the loop - Once the agent outputs content, the loop is effectively finished and you have your output This is effectively a ReAct agent. Thanks to the reasoning being built in, you don't need an additional evaluator step. Tools can be anything. It can be a subagent with subagents, a database query, etc.
Need to do an agent handoff? Just output the result of the agent into a different agent. You don't need an sdk to do a workflow. I've tried some other SDKs/frameworks (Eino and langchaingo), and personally found it quicker to do it manually (as described above) than fight against the framework. [1]: https://github.com/reVrost/go-openrouter |