Files
agents/main.py
T

77 lines
2.2 KiB
Python
Raw Normal View History

2026-09-19 23:47:45 +03:00
import logging
import os
from contextlib import asynccontextmanager
2026-09-19 14:37:16 +03:00
2026-09-19 23:47:45 +03:00
import httpx
from dotenv import load_dotenv
from fastapi import FastAPI, HTTPException
2026-09-20 00:11:49 +03:00
from agents.issue_reader.IssueReaderAgent import IssueReaderAgent
from agents.issue_reader.context_builder import YouTrackContextBuilder
2026-09-19 23:47:45 +03:00
from common.llm_client import LLMClient
from common.youtrack_mcp_client import YouTrackMCPClient, IssueNotFound
2026-09-19 14:37:16 +03:00
2026-09-19 23:47:45 +03:00
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
load_dotenv()
def env(key: str) -> str:
value = os.environ.get(key)
if not value:
raise RuntimeError(f"Missing required env var: {key}")
return value
@asynccontextmanager
async def lifespan(app: FastAPI):
mcp = await YouTrackMCPClient(
str(os.getenv('YOUTRACK_MCP_SERVER')),
str(os.getenv('YOUTRACK_MCP_TOKEN')),
).connect()
http_for_attachments = httpx.AsyncClient(
headers={"Authorization": f"Bearer {env('YOUTRACK_MCP_TOKEN')}"},
proxy=env("HTTPS_PROXY"),
timeout=httpx.Timeout(30.0, connect=10.0, read=60.0),
follow_redirects=True,
)
2026-09-20 00:11:49 +03:00
app.state.issue_reader_agent = IssueReaderAgent(
2026-09-19 23:47:45 +03:00
YouTrackContextBuilder(mcp, http_for_attachments),
LLMClient(
base_url=env("LLM_ADDRESS"),
api_key=env("LLM_API_KEY"),
model=env("LLM_MODEL"),
),
)
yield
# ---- shutdown ----
await mcp.close()
app = FastAPI(lifespan=lifespan)
2026-09-19 14:37:16 +03:00
@app.get("/")
async def root():
return {"message": "Hello World"}
@app.get("/hello/{name}")
async def say_hello(name: str):
return {"message": f"Hello {name}"}
2026-09-19 23:47:45 +03:00
2026-09-20 00:11:49 +03:00
@app.get("/decomposing")
async def decomposing_issue(issue: str):
agent: IssueReaderAgent = app.state.issue_reader_agent
2026-09-19 23:47:45 +03:00
try:
2026-09-20 00:11:49 +03:00
logger.info(f"Received an issue: {issue}")
plan = await agent.plan_issue(issue)
2026-09-19 23:47:45 +03:00
logger.info("Task planning successful.")
print(agent.render(plan))
return {"plan": plan}
except IssueNotFound:
2026-09-20 00:11:49 +03:00
logger.error(f"Issue {issue} not found.")
raise HTTPException(status_code=404, detail=f"Issue {issue} not found")
2026-09-19 23:47:45 +03:00
except Exception as e:
logger.exception("An unexpected error occurred")
return {"error": str(e)}