Skip to content

How to dynamically add/remove tools in a tool_use_behavior="run_llm_again"-loop #767

Closed
@Afstkla

Description

@Afstkla

Please read this first

  • Have you read the docs?Agents SDK docs: yes :)
  • Have you searched for related issues? Others may have had similar requests: also yes :)

Question

I'm building an agent that's often running multiple tool calls sequentially, and sometimes tool A will 'unlock' tools B, C, and D. But I so far haven't found a way to 'inject' those during an automated run_llm_again loop. And I'm really dreading writing all the logic required to manually handle the run loop.

I've attempted using the Hooks to dynamically add new tools, I've been trying to work with various different Agents as tools, where the tools of those Agents are added dynamically through the hooks. The only thing that's semi worked for me is to use the handoff feature, but then I can't give control back to the 'main' agent.

My agent's flow will normally be like:

  1. User asks for information from Gmail
  2. Agent Runner starts
  3. Agent detects that there's no Gmail connection set up
  4. Agent will call the "initiate gmail connection" tool
  5. Response from the tool 'unlocks' all Gmail actions
  6. Agent calls the 'get latest emails' tool
  7. Agent streams the response
  8. Agent Runner exits

But this is a workflow that I can't currently figure out. Is there a way?

Activity

rm-openai

rm-openai commented on May 27, 2025

@rm-openai
Collaborator

This is a good question. I'll have to think of a long term good answer, but the short term hack is: just add the tools in the initiate_gmail_connection tool call.

my_agent = Agent(instructions=[...])

@function_tool
def initiate_gmail_connection():
   my_agent.tools.extend([send_gmail, read_gmail, ...])
Afstkla

Afstkla commented on May 28, 2025

@Afstkla
Author

Thanks @rm-openai , unfortunately, it seems that extending the tools isn't enough reason to refresh the current_span / agent_span in the _run_streamed_impl (

if current_span is None:
), and therefore extending the tools doesn't work within the run_llm_again loop (or I tested it wrong, ofc also possible).

Any other ideas?

rm-openai

rm-openai commented on Jun 2, 2025

@rm-openai
Collaborator

Ah you're totally right. Let me fix this - we shouldn't be caching the tools list.

added
bugSomething isn't working
and removed
questionQuestion about using the SDK
on Jun 2, 2025
added a commit that references this issue on Jun 2, 2025
rm-openai

rm-openai commented on Jun 4, 2025

@rm-openai
Collaborator

@Afstkla this is now fixed. I'd recommend using is_enabled on the tool, which lets you specify a function to dynamically enable/disable behavior.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @Afstkla@rm-openai

        Issue actions

          How to dynamically add/remove tools in a `tool_use_behavior="run_llm_again"`-loop · Issue #767 · openai/openai-agents-python