Skip to content

Commit 8b04fd6

Browse files
authored
Allowing the evaluation to not call commit_tool (volcengine#2041)
* 允许评估时不调用commit_tool * prompt回滚
1 parent 81fb3f5 commit 8b04fd6

4 files changed

Lines changed: 50 additions & 11 deletions

File tree

bot/vikingbot/agent/loop.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -197,11 +197,16 @@ async def _publish_thinking_event(
197197
progress to users during long-running operations.
198198
199199
Example:
200-
>>> await self._publish_thinking_event(
201-
... session_key=SessionKey(channel="telegram", chat_id="123"),
202-
... event_type=OutboundEventType.TOOL_START,
203-
... content="Executing web search..."
204-
... )
200+
async def notify_tool_call() -> None:
201+
await self._publish_thinking_event(
202+
session_key=SessionKey(
203+
type="telegram",
204+
channel_id="default",
205+
chat_id="123",
206+
),
207+
event_type=OutboundEventType.TOOL_CALL,
208+
content="Executing web search...",
209+
)
205210
"""
206211
await self.bus.publish_outbound(
207212
OutboundMessage(
@@ -267,6 +272,7 @@ async def _run_agent_loop(
267272
sender_id: str | None = None,
268273
ov_tools_enable: bool = True,
269274
memory_user_ids: list[str] | None = None,
275+
disabled_tools: list[str] | None = None,
270276
) -> tuple[str | None, str | None, list[dict], dict[str, int], int]:
271277
"""
272278
Run the core agent loop: call LLM, execute tools, repeat until done.
@@ -277,6 +283,7 @@ async def _run_agent_loop(
277283
publish_events: Whether to publish ITERATION/REASONING/TOOL_CALL events to the bus
278284
ov_tools_enable: Whether to enable OpenViking tools for this session
279285
memory_user_ids: List of user IDs for memory retrieval
286+
disabled_tools: Tool names to hide from the model for this request
280287
281288
Returns:
282289
tuple of (final_content, final_reasoning_content, tools_used, token_usage, iteration)
@@ -306,7 +313,10 @@ async def _run_agent_loop(
306313

307314
response = await self.provider.chat(
308315
messages=messages,
309-
tools=self.tools.get_definitions(ov_tools_enable=ov_tools_enable),
316+
tools=self.tools.get_definitions(
317+
ov_tools_enable=ov_tools_enable,
318+
disabled_tools=disabled_tools,
319+
),
310320
model=self.model,
311321
session_id=session_key.safe_name(),
312322
)
@@ -516,6 +526,9 @@ async def check_long_running():
516526
session = self.sessions.get_or_create(session_key, skip_heartbeat=skip_heartbeat)
517527

518528
ov_tools_enable = self._get_ov_tools_enable(session_key)
529+
disabled_tools = msg.metadata.get("disabled_tools", []) if msg.metadata else []
530+
if not isinstance(disabled_tools, list):
531+
disabled_tools = []
519532
# Get profile_user_list from channel config
520533
profile_user_list = []
521534
# Try to get memory_users from message metadata first (CLI mode), then from channel config
@@ -668,6 +681,7 @@ async def check_long_running():
668681
sender_id=msg.sender_id,
669682
ov_tools_enable=ov_tools_enable,
670683
memory_user_ids=memory_user,
684+
disabled_tools=disabled_tools,
671685
)
672686

673687
# Log response preview
@@ -1046,4 +1060,4 @@ async def process_direct(
10461060
)
10471061

10481062
response = await self._process_message(msg)
1049-
return response.content if response else ""
1063+
return response.content if response else ""

bot/vikingbot/agent/tools/registry.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,11 @@ def has(self, name: str) -> bool:
100100
"""
101101
return name in self._tools
102102

103-
def get_definitions(self, ov_tools_enable: bool = True) -> list[dict[str, Any]]:
103+
def get_definitions(
104+
self,
105+
ov_tools_enable: bool = True,
106+
disabled_tools: list[str] | None = None,
107+
) -> list[dict[str, Any]]:
104108
"""
105109
Get all tool definitions in OpenAI format.
106110
@@ -110,6 +114,7 @@ def get_definitions(self, ov_tools_enable: bool = True) -> list[dict[str, Any]]:
110114
Args:
111115
ov_tools_enable: Whether to include OpenViking tools. If False,
112116
tools with names starting with "openviking_" will be excluded.
117+
disabled_tools: Tool names to hide from the model for this request.
113118
114119
Returns:
115120
List of tool schemas in OpenAI format, where each schema contains
@@ -123,6 +128,9 @@ def get_definitions(self, ov_tools_enable: bool = True) -> list[dict[str, Any]]:
123128
tools = self._tools.values()
124129
if not ov_tools_enable:
125130
tools = [tool for tool in tools if not tool.name.startswith("openviking_")]
131+
if disabled_tools:
132+
disabled = set(disabled_tools)
133+
tools = [tool for tool in tools if tool.name not in disabled]
126134
return [tool.to_schema() for tool in tools]
127135

128136
async def execute(
@@ -234,4 +242,4 @@ def __len__(self) -> int:
234242
return len(self._tools)
235243

236244
def __contains__(self, name: str) -> bool:
237-
return name in self._tools
245+
return name in self._tools

bot/vikingbot/channels/openapi.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def __init__(self):
4848
self.final_content: Optional[str] = None
4949
self.response_id: Optional[str] = None
5050
self.relevant_memories: Optional[str] = None
51+
self.token_usage: Dict[str, int] = {}
5152
self.event = asyncio.Event()
5253
self.stream_queue: asyncio.Queue[Optional[ChatStreamEvent]] = asyncio.Queue()
5354

@@ -202,6 +203,7 @@ async def send(self, msg: OutboundMessage) -> None:
202203
):
203204
pending.set_response_id(msg.response_id)
204205
pending.relevant_memories = (msg.metadata or {}).get("relevant_memories")
206+
pending.token_usage = msg.token_usage
205207
await pending.add_event(
206208
"response",
207209
{"content": msg.content or "", "response_id": msg.response_id},
@@ -227,6 +229,7 @@ async def send(self, msg: OutboundMessage) -> None:
227229
if msg.event_type == OutboundEventType.RESPONSE:
228230
# Final response - add to stream first
229231
pending.set_response_id(msg.response_id)
232+
pending.token_usage = msg.token_usage
230233
pending.relevant_memories = (msg.metadata or {}).get("relevant_memories")
231234
await pending.add_event(
232235
"response",
@@ -479,6 +482,7 @@ async def _handle_chat(self, request: ChatRequest) -> ChatResponse:
479482
session_key=session_key,
480483
sender_id=user_id,
481484
content=content,
485+
metadata={"disabled_tools": request.disabled_tools},
482486
)
483487

484488
await self.bus.publish_inbound(msg)
@@ -498,6 +502,7 @@ async def _handle_chat(self, request: ChatRequest) -> ChatResponse:
498502
message=response_content,
499503
events=pending.events if pending.events else None,
500504
relevant_memories=pending.relevant_memories,
505+
token_usage=pending.token_usage,
501506
)
502507

503508
except HTTPException:
@@ -543,6 +548,7 @@ async def event_generator():
543548
session_key=session_key,
544549
sender_id=user_id,
545550
content=request.message,
551+
metadata={"disabled_tools": request.disabled_tools},
546552
)
547553

548554
await self.bus.publish_inbound(msg)
@@ -622,6 +628,7 @@ async def _handle_bot_chat(self, channel_id: str, request: ChatRequest) -> ChatR
622628
sender_id=user_id,
623629
content=content,
624630
need_reply=request.need_reply,
631+
metadata={"disabled_tools": request.disabled_tools},
625632
)
626633

627634
await self.bus.publish_inbound(msg)
@@ -641,6 +648,7 @@ async def _handle_bot_chat(self, channel_id: str, request: ChatRequest) -> ChatR
641648
message=response_content,
642649
events=pending.events if pending.events else None,
643650
relevant_memories=pending.relevant_memories,
651+
token_usage=pending.token_usage,
644652
)
645653

646654
except HTTPException:
@@ -693,6 +701,7 @@ async def event_generator():
693701
session_key=session_key,
694702
sender_id=user_id,
695703
content=request.message,
704+
metadata={"disabled_tools": request.disabled_tools},
696705
)
697706

698707
await self.bus.publish_inbound(msg)
@@ -895,4 +904,4 @@ def get_openapi_router(bus: MessageBus, config: Config) -> APIRouter:
895904
)
896905
logger.info(f"Subscribed to bot_api channel: {channel_id}")
897906

898-
return channel.get_router()
907+
return channel.get_router()

bot/vikingbot/channels/openapi_models.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ class ChatRequest(BaseModel):
6060
channel_id: Optional[str] = Field(
6161
default=None, description="Channel ID for multi-channel routing (optional)"
6262
)
63+
disabled_tools: List[str] = Field(
64+
default_factory=list,
65+
description="Tool names to hide for this request",
66+
)
6367

6468

6569
class ChatResponse(BaseModel):
@@ -75,6 +79,10 @@ class ChatResponse(BaseModel):
7579
default=None,
7680
description="OpenViking memories assembled during _process_message",
7781
)
82+
token_usage: Dict[str, int] = Field(
83+
default_factory=dict,
84+
description="Token usage statistics (prompt_tokens, completion_tokens, total_tokens)",
85+
)
7886
timestamp: datetime = Field(default_factory=datetime.now, description="Response timestamp")
7987

8088

@@ -168,4 +176,4 @@ class ErrorResponse(BaseModel):
168176

169177
error: str = Field(..., description="Error message")
170178
code: Optional[str] = Field(default=None, description="Error code")
171-
detail: Optional[str] = Field(default=None, description="Detailed error information")
179+
detail: Optional[str] = Field(default=None, description="Detailed error information")

0 commit comments

Comments
 (0)