-
Notifications
You must be signed in to change notification settings - Fork 87
Expand file tree
/
Copy pathagent.py
More file actions
113 lines (97 loc) · 3.27 KB
/
Copy pathagent.py
File metadata and controls
113 lines (97 loc) · 3.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
"""OpenTag's triage-first Deep Agent."""
import os
from pathlib import Path
from copilotkit import CopilotKitMiddleware
from deepagents import (
GeneralPurposeSubagentProfile,
HarnessProfile,
create_deep_agent,
register_harness_profile,
)
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langgraph.checkpoint.memory import MemorySaver
from internal_sources import internal_source_tools
from prompts import (
BASE_SYSTEM_PROMPT,
NO_WEB_SEARCH_TOOL_ADDENDUM,
WEB_SEARCH_TOOL_ADDENDUM,
)
from tools import web_search
load_dotenv(Path(__file__).resolve().parent.parent / ".env")
VALID_REASONING_EFFORTS = frozenset(
{"none", "minimal", "low", "medium", "high", "xhigh", "max"}
)
VALID_VERBOSITY_LEVELS = frozenset({"low", "medium", "high"})
# Deep Agents adds shell execution and a general-purpose delegation tool by
# default. OpenTag has no sandbox for execute, and delegating routine turns to
# another agent adds latency without improving triage.
register_harness_profile(
"openai",
HarnessProfile(
excluded_tools=frozenset({"execute"}),
general_purpose_subagent=GeneralPurposeSubagentProfile(enabled=False),
),
)
def _validated_openai_setting(
name: str,
*,
default: str,
allowed: frozenset[str],
) -> str:
"""Read and validate a non-secret OpenAI tuning setting."""
value = os.environ.get(name, default).strip().lower()
if value not in allowed:
choices = ", ".join(sorted(allowed))
raise RuntimeError(f"Invalid {name}: expected one of {choices}")
return value
def build_agent():
"""Build the OpenTag triage graph."""
api_key = os.environ.get("OPENAI_API_KEY")
if not api_key:
raise RuntimeError("Missing OPENAI_API_KEY environment variable")
reasoning_effort = _validated_openai_setting(
"OPENAI_REASONING_EFFORT",
default="low",
allowed=VALID_REASONING_EFFORTS,
)
verbosity = _validated_openai_setting(
"OPENAI_VERBOSITY",
default="low",
allowed=VALID_VERBOSITY_LEVELS,
)
has_web_search = bool(os.environ.get("TAVILY_API_KEY"))
model_name = os.environ.get("OPENAI_MODEL", "gpt-5.5")
llm = ChatOpenAI(
model=model_name,
api_key=api_key,
reasoning_effort=reasoning_effort,
verbosity=verbosity,
use_responses_api=True,
)
internal_tools = internal_source_tools()
main_tools = (
[web_search, *internal_tools]
if has_web_search
else [*internal_tools]
)
system_prompt = BASE_SYSTEM_PROMPT + (
WEB_SEARCH_TOOL_ADDENDUM
if has_web_search
else NO_WEB_SEARCH_TOOL_ADDENDUM
)
agent_graph = create_deep_agent(
model=llm,
system_prompt=system_prompt,
tools=main_tools,
middleware=[CopilotKitMiddleware()],
checkpointer=MemorySaver(),
)
print(
"[AGENT] OpenTag Agent created "
f"with model={model_name}, reasoning={reasoning_effort}, verbosity={verbosity}"
)
print(f"[AGENT] web search: {'enabled' if has_web_search else 'disabled'}")
print(f"[AGENT] internal-source tools: {len(internal_tools)}")
print(f"[AGENT] Main tools: {[t.name for t in main_tools]}")
return agent_graph.with_config({"recursion_limit": 25})