Skip to content

Commit c652d04

Browse files
committed
refactor: extract helper functions, move scripts to scripts/agents
1 parent 54c73c5 commit c652d04

7 files changed

Lines changed: 48 additions & 113 deletions

File tree

.github/workflows/pr-quality-check.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@ jobs:
3030
PR_NUMBER: ${{ github.event.pull_request.number }}
3131
PR_TITLE: ${{ github.event.pull_request.title }}
3232
REPO_NAME: ${{ github.repository }}
33-
run: python scripts/pr_checker_agent.py
33+
run: python scripts/agents/pr_checker_agent.py

.github/workflows/security-review.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,4 @@ jobs:
4242
PR_NUMBER: ${{ github.event.pull_request.number || github.event.issue.number }}
4343
REPO_NAME: ${{ github.repository }}
4444
TRIGGER: ${{ github.event_name }}
45-
run: python scripts/security_review_agent.py
45+
run: python scripts/agents/security_review_agent.py

.github/workflows/triage.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@ jobs:
3030
ISSUE_NUMBER: ${{ github.event.issue.number }}
3131
ISSUE_TITLE: ${{ github.event.issue.title }}
3232
REPO_NAME: ${{ github.repository }}
33-
run: python scripts/triage_agent.py
33+
run: python scripts/agents/triage_agent.py

scripts/agents/helpers.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
def validate_api_keys():
2+
valid_api_keys = ["ANTHROPIC_API_KEY", "OPENAI_API_KEY", "GEMINI_API_KEY"]
3+
if not any(os.environ.get(k) for k in valid_api_keys):
4+
raise ValueError("No API key is set")
5+
6+
7+
def validate_env_vars(env_vars: list[str]):
8+
for env_var in env_vars:
9+
if not os.environ.get(env_var):
10+
raise ValueError(f"{env_var} is not set")
11+
12+
13+
def run_agent(messages: list, tools: list, handle_tool_call, model: str):
14+
while True:
15+
response = litellm.completion(
16+
model=model, messages=messages, tools=tools, temperature=0
17+
)
18+
message = response.choices[0].message
19+
if message.content:
20+
print(f"[agent] {message.content}")
21+
messages.append(message.model_dump(exclude_none=True))
22+
if response.choices[0].finish_reason == "stop" or not message.tool_calls:
23+
break
24+
tool_results = []
25+
for tool_call in message.tool_calls:
26+
inputs = json.loads(tool_call.function.arguments)
27+
result = handle_tool_call(tool_call.function.name, inputs)
28+
tool_results.append({
29+
"role": "tool",
30+
"tool_call_id": tool_call.id,
31+
"content": result,
32+
})
33+
messages.extend(tool_results)
Lines changed: 4 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import json
33
import litellm
44
from github import Github, Auth
5+
from helpers import validate_env_vars, validate_api_keys, run_agent
56

67
# Setup
78

@@ -11,14 +12,8 @@
1112
author = os.environ["AUTHOR_USERNAME"]
1213

1314
MODEL = os.environ["MODEL"]
14-
for env_var in ["GITHUB_TOKEN", "REPO_NAME", "PR_NUMBER", "AUTHOR_USERNAME", "MODEL"]:
15-
if not os.environ[env_var]:
16-
raise ValueError(f"{env_var} is not set")
17-
18-
valid_api_keys = ["ANTHROPIC_API_KEY", "OPENAI_API_KEY", "GEMINI_API_KEY"]
19-
if not any(os.environ.get(api_key) for api_key in valid_api_keys):
20-
raise ValueError("No API key is set")
21-
15+
validate_env_vars(["GITHUB_TOKEN", "REPO_NAME", "PR_NUMBER", "AUTHOR_USERNAME", "MODEL"])
16+
validate_api_keys()
2217

2318
# Tools
2419

@@ -126,36 +121,7 @@ def run_pr_review_agent():
126121
{"role": "system", "content": SYSTEM_PROMPT},
127122
{"role": "user", "content": build_initial_message()},
128123
]
129-
130-
while True:
131-
response = litellm.completion(
132-
model=MODEL,
133-
messages=messages,
134-
tools=TOOLS,
135-
temperature=0,
136-
)
137-
138-
message = response.choices[0].message
139-
140-
if message.content:
141-
print(f"[agent] {message.content}")
142-
143-
messages.append(message.model_dump(exclude_none=True))
144-
145-
if response.choices[0].finish_reason == "stop" or not message.tool_calls:
146-
break
147-
148-
tool_results = []
149-
for tool_call in message.tool_calls:
150-
inputs = json.loads(tool_call.function.arguments)
151-
result = handle_tool_call(tool_call.function.name, inputs)
152-
tool_results.append({
153-
"role": "tool",
154-
"tool_call_id": tool_call.id,
155-
"content": result,
156-
})
157-
158-
messages.extend(tool_results)
124+
run_agent(messages, TOOLS, handle_tool_call, MODEL)
159125

160126

161127
if __name__ == "__main__":
Lines changed: 4 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import json
33
import litellm
44
from github import Github, Auth
5+
from helpers import validate_env_vars, validate_api_keys, run_agent
56

67
# Setup
78

@@ -10,13 +11,8 @@
1011
pr = repo.get_pull(int(os.environ["PR_NUMBER"]))
1112

1213
MODEL = os.environ["MODEL"]
13-
for env_var in ["GITHUB_TOKEN", "REPO_NAME", "PR_NUMBER", "MODEL"]:
14-
if not os.environ[env_var]:
15-
raise ValueError(f"{env_var} is not set")
16-
17-
valid_api_keys = ["ANTHROPIC_API_KEY", "OPENAI_API_KEY", "GEMINI_API_KEY"]
18-
if not any(os.environ.get(api_key) for api_key in valid_api_keys):
19-
raise ValueError("No API key is set")
14+
validate_env_vars(["GITHUB_TOKEN", "REPO_NAME", "PR_NUMBER", "MODEL"])
15+
validate_api_keys()
2016

2117
IGNORED_FILENAMES = set(os.environ.get(
2218
"IGNORED_FILENAMES",
@@ -178,37 +174,7 @@ def run_security_review_agent():
178174
{"role": "system", "content": SYSTEM_PROMPT},
179175
{"role": "user", "content": build_initial_message()},
180176
]
181-
182-
while True:
183-
response = litellm.completion(
184-
model=MODEL,
185-
messages=messages,
186-
tools=TOOLS,
187-
temperature=0,
188-
)
189-
190-
message = response.choices[0].message
191-
192-
if message.content:
193-
print(f"[agent] {message.content}")
194-
195-
messages.append(message.model_dump(exclude_none=True))
196-
197-
if response.choices[0].finish_reason == "stop" or not message.tool_calls:
198-
break
199-
200-
tool_results = []
201-
for tool_call in message.tool_calls:
202-
inputs = json.loads(tool_call.function.arguments)
203-
result = handle_tool_call(tool_call.function.name, inputs)
204-
print(f"[tool] {tool_call.function.name}: {result}")
205-
tool_results.append({
206-
"role": "tool",
207-
"tool_call_id": tool_call.id,
208-
"content": result,
209-
})
210-
211-
messages.extend(tool_results)
177+
run_agent(messages, TOOLS, handle_tool_call, MODEL)
212178

213179

214180
if __name__ == "__main__":
Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import json
33
import litellm
44
from github import Github, Auth
5+
from helpers import validate_env_vars, validate_api_keys, run_agent
56

67
# Setup
78

@@ -13,13 +14,8 @@
1314
AVAILABLE_LABELS = os.environ.get("AVAILABLE_LABELS", "bug,enhancement,question,documentation,needs-info")
1415
MODEL = os.environ["MODEL"]
1516

16-
for env_var in ["GITHUB_TOKEN", "REPO_NAME", "ISSUE_NUMBER", "ISSUE_TITLE", "ISSUE_BODY", "MODEL"]:
17-
if not os.environ[env_var]:
18-
raise ValueError(f"{env_var} is not set")
19-
20-
valid_api_keys = ["ANTHROPIC_API_KEY", "OPENAI_API_KEY", "GEMINI_API_KEY"]
21-
if not any(os.environ.get(api_key) for api_key in valid_api_keys):
22-
raise ValueError("No API key is set")
17+
validate_env_vars(["GITHUB_TOKEN", "REPO_NAME", "ISSUE_NUMBER", "ISSUE_TITLE", "ISSUE_BODY", "MODEL"])
18+
validate_api_keys()
2319

2420
# Tools
2521

@@ -224,33 +220,7 @@ def run_triage_agent():
224220
{"role": "system", "content": SYSTEM_PROMPT},
225221
{"role": "user", "content": build_initial_message()},
226222
]
227-
228-
while True:
229-
response = litellm.completion(
230-
model=MODEL,
231-
messages=messages,
232-
tools=TOOLS,
233-
temperature=0,
234-
)
235-
236-
message = response.choices[0].message
237-
messages.append(message.model_dump(exclude_none=True))
238-
239-
finish_reason = response.choices[0].finish_reason
240-
if finish_reason == "stop" or not message.tool_calls:
241-
break
242-
243-
tool_results = []
244-
for tool_call in message.tool_calls:
245-
inputs = json.loads(tool_call.function.arguments)
246-
result = handle_tool_call(tool_call.function.name, inputs)
247-
tool_results.append({
248-
"role": "tool",
249-
"tool_call_id": tool_call.id,
250-
"content": result,
251-
})
252-
253-
messages.extend(tool_results)
223+
run_agent(messages, TOOLS, handle_tool_call, MODEL)
254224

255225

256226
if __name__ == "__main__":

0 commit comments

Comments
 (0)