From 44abec3d829c4cb02c7accb1bee5217bdd57d0f5 Mon Sep 17 00:00:00 2001 From: Baitinq Date: Wed, 22 Oct 2025 01:13:17 +0200 Subject: Impl --- main.py | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 79 insertions(+), 5 deletions(-) diff --git a/main.py b/main.py index 9914609..6d31763 100644 --- a/main.py +++ b/main.py @@ -1,10 +1,84 @@ -from agents import Agent, Runner, RunConfig +from agents import Agent, Runner, RunConfig, function_tool +import subprocess -def main(): - agent = Agent(name="Assistant", instructions="You are a helpful assistant") +@function_tool +async def codex(request: str) -> str: + return str(subprocess.check_output(['codex', 'exec',request])) + +@function_tool +async def create_pr(branch: str, title: str, body: str = "") -> str: + """Create a pull request for the given branch and description.""" + return f"Simulated PR created for branch '{branch}' with title '{title}'" + +@function_tool +async def notify(channel: str, message: str) -> str: + """Send a notification to a given communication channel.""" + print(f"[{channel}] {message}") + return "notified" + +notifier_agent = Agent( + name="NotifierAgent", + instructions=( + "You are the communication layer for the DevEx system. " + "Your job is to summarize important outcomes and send clear, concise messages to the relevant stakeholders. " + "You DO NOT make technical changes yourself — you simply report or announce results. " + "Use the `notify` tool to deliver updates. " + "Always specify the target channel (e.g., 'slack', 'github', or 'email'). " + "Your responses should be short, actionable, and easy to read." + ), + tools=[notify], +) - result = Runner.run_sync(agent, "Write a haiku about recursion in programming.", run_config=RunConfig(tracing_disabled=True)) - print(result.final_output) +patch_reviewer_agent = Agent( + name="PatchReviewer", + instructions=( + "You are a senior-level code reviewer responsible for evaluating proposed patches. " + "You review code diffs, changes, or pull requests to ensure they follow best practices. " + "Your feedback should be precise, constructive, and focused on maintainability, clarity, and DevEx impact. " + "If the patch is acceptable, summarize why. If not, list clear improvement points. " + "Output format:\n" + "```\nReview Summary:\n- ...\nDecision: APPROVE | REQUEST CHANGES\n```" + ) +) + +code_agent = Agent( + name="CodeAgent", + instructions=( + "You are a hands-on software automation agent. " + "You can perform code-related actions in the repository using the `codex` tool, " + "and you can open pull requests using `create_pr`. " + "When you receive a task, determine what change or fix is needed, execute it, " + "and, if appropriate, create a new PR. " + "Once your work is done, transfer to the PatchReviewer to review the changes. " + "Always explain briefly what change you made and why before creating the PR." + ), + handoffs=[patch_reviewer_agent], + tools=[codex, create_pr], +) + +triaging_agent = Agent( + name="DevEx Triager", + instructions=( + "You are the DevEx Orchestrator — a high-level system that monitors CI/CD events, code health, and developer experience. " + "You receive event messages describing issues, failures, or changes in the engineering workflow. " + "Your responsibilities are:\n" + "1. Understand the event and determine its relevance.\n" + "2. If it requires a code modification or fix, transfer to the CodeAgent.\n" + "3. If it concerns code review quality or standards, transfer to the PatchReviewer.\n" + "4. If it only needs a status update or alert, transfer to the NotifierAgent.\n" + "5. If no action is required, explain briefly why.\n\n" + "You are proactive but conservative — only act when it clearly improves DevEx or code quality. " + "Always summarize your reasoning before transferring to another agent." + ), + handoffs=[code_agent, patch_reviewer_agent, notifier_agent], +) + +def main(): + print("🤖 DevEx Triager listening for events...") + while True: + event = input("Event> ") + result = Runner.run_sync(triaging_agent, event, run_config=RunConfig(tracing_disabled=True)) + print(result.final_output) if __name__ == "__main__": main() -- cgit 1.4.1