From 84147f4d815b834aa6e3b6a54ac80a5aa414af43 Mon Sep 17 00:00:00 2001 From: dmahan93 Date: Mon, 9 Mar 2026 20:49:18 -0500 Subject: [PATCH] refactor: update to new atropos tool-calling API Migrate from old tool_call_parser (instance) to new ToolCallTranslator pattern from atropos add-openai-endpoint-for-managed-server branch: - Set tool_parser on ServerManager (string name, e.g. 'hermes') - Use managed_server(tokenizer=..., preserve_think_blocks=...) instead of managed_server(tokenizer=..., tool_call_parser=instance) - ManagedServer now handles tool call translation internally via ToolCallTranslator (bidirectional raw text <-> OpenAI tool_calls) - Remove old parser loading code (get_parser/KeyError fallback) The hermes-agent tool_call_parsers/ directory is preserved as a standalone fallback for environments that don't use vLLM's parsers. --- environments/hermes_base_env.py | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/environments/hermes_base_env.py b/environments/hermes_base_env.py index 9025edd21..651722ff1 100644 --- a/environments/hermes_base_env.py +++ b/environments/hermes_base_env.py @@ -229,6 +229,12 @@ class HermesAgentBaseEnv(BaseEnv): from environments.agent_loop import resize_tool_pool resize_tool_pool(config.tool_pool_size) + # Set tool_parser on the ServerManager so ManagedServer uses it + # for bidirectional tool call translation (raw text ↔ OpenAI tool_calls). + if hasattr(self.server, 'tool_parser'): + self.server.tool_parser = config.tool_call_parser + print(f"🔧 Tool parser: {config.tool_call_parser}") + # Current group's resolved tools (set in collect_trajectories) self._current_group_tools: Optional[Tuple[List[Dict], Set[str]]] = None @@ -466,22 +472,14 @@ class HermesAgentBaseEnv(BaseEnv): # Run the agent loop result: AgentResult if self._use_managed_server(): - # Phase 2: ManagedServer with parser -- exact tokens + logprobs - # Load the tool call parser from registry based on config - from environments.tool_call_parsers import get_parser - try: - tc_parser = get_parser(self.config.tool_call_parser) - except KeyError: - logger.warning( - "Tool call parser '%s' not found, falling back to 'hermes'", - self.config.tool_call_parser, - ) - tc_parser = get_parser("hermes") - + # Phase 2: ManagedServer with ToolCallTranslator -- exact tokens + logprobs + # tool_parser is set on ServerManager in __init__ and passed through + # to ManagedServer, which uses ToolCallTranslator for bidirectional + # translation between raw text and OpenAI tool_calls. try: async with self.server.managed_server( tokenizer=self.tokenizer, - tool_call_parser=tc_parser, + preserve_think_blocks=bool(self.config.thinking_mode), ) as managed: agent = HermesAgentLoop( server=managed,