Compare commits

...

5 Commits

Author SHA1 Message Date
openhands
09055b5f05 Fix formatting issues in codeact_agent.py and condenser.py 2025-07-30 20:11:38 +00:00
Xingyao Wang
5e95aa0ed1 Merge branch 'main' into xw/llm-stats 2025-07-30 15:34:10 -04:00
Xingyao Wang
45c1210502 reorder 2025-07-30 15:29:15 -04:00
Xingyao Wang
2fd96f455a handle user_id 2025-07-30 15:26:35 -04:00
Xingyao Wang
ab52bc1f15 feat(llm): add model name to metadata 2025-07-30 14:10:40 -04:00
6 changed files with 35 additions and 5 deletions

View File

@@ -193,7 +193,11 @@ class CodeActAgent(Agent):
'messages': self.llm.format_messages_for_llm(messages),
}
params['tools'] = check_tools(self.tools, self.llm.config)
params['extra_body'] = {'metadata': state.to_llm_metadata(agent_name=self.name)}
params['extra_body'] = {
'metadata': state.to_llm_metadata(
model_name=self.llm.config.model, agent_name=self.name
)
}
response = self.llm.completion(**params)
logger.debug(f'Response from LLM: {response}')
actions = self.response_to_actions(response)

View File

@@ -657,6 +657,7 @@ class AgentController:
# Take a snapshot of the current metrics before starting the delegate
state = State(
session_id=self.id.removesuffix('-delegate'),
user_id=self.user_id,
inputs=action.inputs or {},
iteration_flag=self.state.iteration_flag,
budget_flag=self.state.budget_flag,

View File

@@ -79,6 +79,7 @@ class State:
"""
session_id: str = ''
user_id: str | None = None
iteration_flag: IterationControlFlag = field(
default_factory=lambda: IterationControlFlag(
limit_increase_amount=100, current_value=0, max_value=100
@@ -265,16 +266,19 @@ class State:
return event
return None
def to_llm_metadata(self, agent_name: str) -> dict:
return {
def to_llm_metadata(self, model_name: str, agent_name: str) -> dict:
metadata = {
'session_id': self.session_id,
'trace_version': openhands.__version__,
'trace_user_id': self.user_id,
'tags': [
f'model:{model_name}',
f'agent:{agent_name}',
f'web_host:{os.environ.get("WEB_HOST", "unspecified")}',
f'openhands_version:{openhands.__version__}',
],
}
return metadata
def get_local_step(self):
if not self.parent_iteration:

View File

@@ -73,6 +73,7 @@ class StateTracker:
if state is None:
self.state = State(
session_id=id.removesuffix('-delegate'),
user_id=self.user_id,
inputs={},
iteration_flag=IterationControlFlag(
limit_increase_amount=max_iterations,

View File

@@ -8,6 +8,7 @@ from pydantic import BaseModel
from openhands.controller.state.state import State
from openhands.core.config.condenser_config import CondenserConfig
from openhands.core.logger import openhands_logger as logger
from openhands.events.action.agent import CondensationAction
from openhands.memory.view import View
@@ -101,10 +102,29 @@ class Condenser(ABC):
def condensed_history(self, state: State) -> View | Condensation:
"""Condense the state's history."""
self._llm_metadata = state.to_llm_metadata('condenser')
if hasattr(self, 'llm'):
model_name = self.llm.config.model
else:
model_name = 'unknown'
self._llm_metadata = state.to_llm_metadata(
model_name=model_name, agent_name='condenser'
)
with self.metadata_batch(state):
return self.condense(state.view)
@property
def llm_metadata(self) -> dict[str, Any]:
"""Metadata to be passed to the LLM when using this condenser.
This metadata is used to provide context about the condensation process and can be used by the LLM to understand how the history was condensed.
"""
if not self._llm_metadata:
logger.warning(
'LLM metadata is empty. Ensure to set it in the condenser implementation.'
)
return self._llm_metadata
@classmethod
def register_config(cls, configuration_type: type[CondenserConfig]) -> None:
"""Register a new condenser configuration type.

View File

@@ -133,7 +133,7 @@ CURRENT_STATE: Last flip: Heads, Haiku count: 15/20"""
response = self.llm.completion(
messages=self.llm.format_messages_for_llm(messages),
extra_body={'metadata': self._llm_metadata},
extra_body={'metadata': self.llm_metadata},
)
summary = response.choices[0].message.content