Skip to content

Commit 49adcdd

Browse files
authored
refactor(tool-framework): migrate metadata declarations to enums (#4767) (#4822)
* refactor(tool-framework): migrate metadata declarations to enums (#4767) Signed-off-by: DevSars24 <saurabhsingh100605@gmail.com> * fix(tool-framework): address maintainer review feedback --------- Signed-off-by: DevSars24 <saurabhsingh100605@gmail.com>
1 parent b094694 commit 49adcdd

43 files changed

Lines changed: 173 additions & 79 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

core/tool_framework/base.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,8 @@ class BaseTool(ABC):
4545
input_model: ClassVar[type[BaseModel] | None] = None
4646
source: ClassVar[EvidenceSource]
4747
source_id: ClassVar[str | None] = None
48-
# Declared as ``... | str`` so subclasses may keep using the plain wire
49-
# values (``"logs"``, ``"read_only"``); ``ToolMetadata`` validation in
50-
# ``__init_subclass__`` coerces them to the enum member.
51-
evidence_type: ClassVar[EvidenceType | str | None] = None
52-
side_effect_level: ClassVar[SideEffectLevel | str | None] = None
48+
evidence_type: ClassVar[EvidenceType | None] = None
49+
side_effect_level: ClassVar[SideEffectLevel | None] = None
5350
use_cases: ClassVar[Sequence[str]] = ()
5451
examples: ClassVar[Sequence[str]] = ()
5552
anti_examples: ClassVar[Sequence[str]] = ()
@@ -61,7 +58,7 @@ class BaseTool(ABC):
6158
retrieval_controls: ClassVar[RetrievalControls] = (
6259
RetrievalControls()
6360
) # Declares supported controls
64-
surfaces: ClassVar[tuple[ToolSurface | str, ...]] = ("investigation",)
61+
surfaces: ClassVar[tuple[ToolSurface | str, ...]] = (ToolSurface.INVESTIGATION,)
6562
tags: ClassVar[Sequence[str]] = ()
6663
parallel_safe: ClassVar[bool] = True
6764
requires_approval: ClassVar[bool] = False # Whether this tool needs approval from messaging

core/tool_framework/registered_tool.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,8 @@ class RegisteredTool:
5353
run: Callable[..., Any] = field(repr=False)
5454
display_name: str | None = None
5555
source_id: str | None = None
56-
# ``... | str`` keeps plain wire values accepted from callers; the
57-
# ``ToolMetadata`` round-trip in ``__post_init__`` coerces them to members.
58-
evidence_type: EvidenceType | str | None = None
59-
side_effect_level: SideEffectLevel | str | None = None
56+
evidence_type: EvidenceType | None = None
57+
side_effect_level: SideEffectLevel | None = None
6058
surfaces: tuple[ToolSurface | str, ...] = _DEFAULT_SURFACES
6159
use_cases: list[str] = field(default_factory=list)
6260
examples: list[str] = field(default_factory=list)
@@ -290,8 +288,8 @@ def from_function(
290288
input_model: type[BaseModel] | None = None,
291289
source: EvidenceSource | None,
292290
source_id: str | None = None,
293-
evidence_type: EvidenceType | str | None = None,
294-
side_effect_level: SideEffectLevel | str | None = None,
291+
evidence_type: EvidenceType | None = None,
292+
side_effect_level: SideEffectLevel | None = None,
295293
surfaces: Iterable[str] | None = None,
296294
use_cases: list[str] | None = None,
297295
examples: list[str] | None = None,

core/tool_framework/tool_decorator.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ def tool(
2525
input_model: type[BaseModel] | None = None,
2626
source: EvidenceSource | None = None,
2727
source_id: str | None = None,
28-
evidence_type: EvidenceType | str | None = None,
29-
side_effect_level: SideEffectLevel | str | None = None,
28+
evidence_type: EvidenceType | None = None,
29+
side_effect_level: SideEffectLevel | None = None,
3030
surfaces: tuple[str, ...] | None = None,
3131
use_cases: list[str] | None = None,
3232
examples: list[str] | None = None,
@@ -60,8 +60,8 @@ def tool[F: Callable[..., Any]](
6060
input_model: type[BaseModel] | None = None,
6161
source: EvidenceSource | None = None,
6262
source_id: str | None = None,
63-
evidence_type: EvidenceType | str | None = None,
64-
side_effect_level: SideEffectLevel | str | None = None,
63+
evidence_type: EvidenceType | None = None,
64+
side_effect_level: SideEffectLevel | None = None,
6565
surfaces: tuple[str, ...] | None = None,
6666
use_cases: list[str] | None = None,
6767
examples: list[str] | None = None,
@@ -95,8 +95,8 @@ def tool[F: Callable[..., Any]](
9595
input_model: type[BaseModel] | None = None,
9696
source: EvidenceSource | None = None,
9797
source_id: str | None = None,
98-
evidence_type: EvidenceType | str | None = None,
99-
side_effect_level: SideEffectLevel | str | None = None,
98+
evidence_type: EvidenceType | None = None,
99+
side_effect_level: SideEffectLevel | None = None,
100100
surfaces: tuple[str, ...] | None = None,
101101
use_cases: list[str] | None = None,
102102
examples: list[str] | None = None,
@@ -129,8 +129,8 @@ def tool[F: Callable[..., Any]](
129129
input_model: type[BaseModel] | None = None,
130130
source: EvidenceSource | None = None,
131131
source_id: str | None = None,
132-
evidence_type: EvidenceType | str | None = None,
133-
side_effect_level: SideEffectLevel | str | None = None,
132+
evidence_type: EvidenceType | None = None,
133+
side_effect_level: SideEffectLevel | None = None,
134134
surfaces: tuple[str, ...] | None = None,
135135
use_cases: list[str] | None = None,
136136
examples: list[str] | None = None,

integrations/buzz/tools/buzz_send_message_tool/tool.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from typing import Any
66

77
from core.tool_framework.base import BaseTool
8+
from core.tool_framework.metadata import SideEffectLevel
89
from core.tool_framework.tool_decorator import tool
910
from integrations.buzz.tools.buzz_send_message_tool.constants import SOURCE
1011
from integrations.buzz.tools.buzz_send_message_tool.delivery import (
@@ -35,7 +36,7 @@ class BuzzSendMessageTool(BaseTool):
3536
"Following up after an investigation with a short status update",
3637
]
3738
requires = ["buzz"]
38-
side_effect_level = "external"
39+
side_effect_level = SideEffectLevel.EXTERNAL
3940
requires_approval = True
4041
approval_reason = "Sends a message via Buzz on your behalf."
4142
input_schema = {

integrations/datadog/tools/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import re
1010
from typing import Any
1111

12+
from core.tool_framework.metadata import EvidenceType, SideEffectLevel
1213
from core.tool_framework.tool_decorator import tool
1314
from core.tool_framework.utils.tool_availability import tool_unavailable
1415
from integrations.datadog._client import make_async_client
@@ -557,8 +558,8 @@ def _metrics_extract_params(sources: dict[str, dict]) -> dict[str, Any]:
557558
],
558559
requires=[],
559560
source_id="datadog_metrics_api",
560-
evidence_type="metrics",
561-
side_effect_level="read_only",
561+
evidence_type=EvidenceType.METRICS,
562+
side_effect_level=SideEffectLevel.READ_ONLY,
562563
examples=[
563564
"Check `system.cpu.user` around incident window for saturation patterns.",
564565
"Run a custom metrics query string for service-specific error-rate metrics.",

integrations/eks/tools/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import logging
88
from typing import Any
99

10+
from core.tool_framework.metadata import EvidenceType, SideEffectLevel
1011
from core.tool_framework.tool_decorator import tool
1112
from core.tool_framework.utils.tool_availability import tool_unavailable
1213
from integrations.eks.eks_k8s_client import build_k8s_clients
@@ -777,8 +778,8 @@ class ListEKSPodsOutput(BaseModel):
777778
],
778779
requires=["cluster_name"],
779780
source_id="eks_core_v1",
780-
evidence_type="topology",
781-
side_effect_level="read_only",
781+
evidence_type=EvidenceType.TOPOLOGY,
782+
side_effect_level=SideEffectLevel.READ_ONLY,
782783
examples=[
783784
"List pods in `payments` namespace to identify CrashLoopBackOff pods.",
784785
"Use namespace `all` to detect widespread node scheduling issues.",

integrations/github/tools/architecture_issue_tool/tool.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from typing import Any
66

77
from core.agent_harness.tools.tool_context import action_context_from_agent_context
8+
from core.tool_framework.metadata import SideEffectLevel
89
from core.tool_framework.tool_decorator import tool
910
from integrations.github.tools.architecture_issue_tool.repo_workspace import (
1011
WorkspaceError,
@@ -78,7 +79,7 @@ def _session_id_from_runtime(context: Any, explicit: str = "") -> str:
7879
],
7980
requires=["owner", "repo"],
8081
surfaces=("action",),
81-
side_effect_level="mutating",
82+
side_effect_level=SideEffectLevel.MUTATING,
8283
input_schema={
8384
"type": "object",
8485
"properties": {
@@ -153,7 +154,7 @@ def architecture_clone_repo(
153154
use_cases=["Cleanup after architecture_clone_repo"],
154155
anti_examples=["Deleting arbitrary paths outside the architecture workspace"],
155156
surfaces=("action",),
156-
side_effect_level="mutating",
157+
side_effect_level=SideEffectLevel.MUTATING,
157158
input_schema={
158159
"type": "object",
159160
"properties": {
@@ -201,7 +202,7 @@ def architecture_cleanup_repo(
201202
],
202203
requires=["repo_name", "observations"],
203204
surfaces=("action",),
204-
side_effect_level="mutating",
205+
side_effect_level=SideEffectLevel.MUTATING,
205206
accepts_runtime_context=True,
206207
input_schema={
207208
"type": "object",

integrations/github/tools/ci_fix/tool.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from typing import Any
66

77
from core.agent_harness.tools.tool_context import action_context_from_agent_context
8+
from core.tool_framework.metadata import SideEffectLevel
89
from core.tool_framework.tool_decorator import tool
910
from integrations.github.client import resolve_github_token
1011
from integrations.github.helpers import (
@@ -104,7 +105,7 @@ def _confirm_fn(context: Any) -> Any:
104105
"Fixing GitHub security alerts (use fix_github_security_alert)",
105106
],
106107
surfaces=("action",),
107-
side_effect_level="mutating",
108+
side_effect_level=SideEffectLevel.MUTATING,
108109
requires_approval=True,
109110
approval_reason=("Checks out the PR branch, edits files, commits, and pushes to that branch."),
110111
parallel_safe=False,

integrations/github/tools/community_followup_tool/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from typing import Any
66

7+
from core.tool_framework.metadata import SideEffectLevel
78
from core.tool_framework.tool_decorator import tool
89
from core.tool_framework.utils.tool_availability import tool_unavailable
910
from integrations.github.client import GitHubApiError, GitHubRestClient, resolve_github_token
@@ -42,7 +43,7 @@ def _community_extract_params(sources: dict[str, dict]) -> dict[str, Any]:
4243
],
4344
anti_examples=["Posting replies", "Changing GitHub labels or assignees"],
4445
surfaces=("investigation", "chat"),
45-
side_effect_level="read_only",
46+
side_effect_level=SideEffectLevel.READ_ONLY,
4647
input_schema={
4748
"type": "object",
4849
"properties": {

integrations/github/tools/github_cli/tool.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from typing import Any
66

7+
from core.tool_framework.metadata import SideEffectLevel
78
from core.tool_framework.tool_decorator import tool
89
from integrations.github.tools.github_cli.credentials import (
910
GITHUB_CLI_INJECTED_PARAMS,
@@ -95,7 +96,7 @@ def _normalize_args(args: list[str] | None) -> list[str]:
9596
"Inventing repo lists without calling github_cli",
9697
],
9798
surfaces=("action",),
98-
side_effect_level="mutating",
99+
side_effect_level=SideEffectLevel.MUTATING,
99100
requires_approval=False,
100101
input_schema=_ARGS_SCHEMA,
101102
is_available=_github_cli_available,

0 commit comments

Comments
 (0)