ForcePilot/backend/package/yuxi/channel/extensions/github/agent_tools.py
Kris 702fcd4c33 feat(github): 新增GitHub渠道插件完整实现
新增了完整的GitHub集成插件,包含认证、会话管理、Webhook处理、消息收发、反应支持等核心功能,支持Issues、Discussions、Pull Request的交互与通知。
2026-05-21 10:48:42 +08:00

53 lines
2.3 KiB
Python

from __future__ import annotations
import logging
from yuxi.channel.extensions.github.api import GitHubApiClient
logger = logging.getLogger(__name__)
class GitHubAgentTools:
def __init__(self, api_client: GitHubApiClient):
self._api = api_client
async def search_issues(self, query: str, owner: str, repo: str) -> list[dict]:
client = await self._api._get_client()
full_query = f"{query} repo:{owner}/{repo}"
resp = await client.rest.search.issues_issues(q=full_query, per_page=10)
items = resp.parsed_data.items
return [
{"number": item.number, "title": item.title, "state": item.state, "url": item.html_url}
for item in items
]
async def create_issue(
self, owner: str, repo: str, title: str, body: str = "",
labels: list[str] | None = None,
) -> dict:
return await self._api.create_issue(owner, repo, title, body, labels)
async def close_issue(self, owner: str, repo: str, issue_number: int) -> dict:
return await self._api.close_issue(owner, repo, issue_number)
async def reopen_issue(self, owner: str, repo: str, issue_number: int) -> dict:
return await self._api.reopen_issue(owner, repo, issue_number)
async def add_labels(self, owner: str, repo: str, issue_number: int, labels: list[str]) -> dict:
return await self._api.add_labels(owner, repo, issue_number, labels)
async def remove_labels(self, owner: str, repo: str, issue_number: int, labels: list[str]) -> dict:
return await self._api.remove_labels(owner, repo, issue_number, labels)
async def list_issues(self, owner: str, repo: str, state: str = "open", labels: str = "") -> list[dict]:
return await self._api.list_issues(owner, repo, state=state, labels=labels)
async def get_issue(self, owner: str, repo: str, issue_number: int) -> dict:
return await self._api.get_issue(owner, repo, issue_number)
async def set_assignees(self, owner: str, repo: str, issue_number: int, assignees: list[str]) -> dict:
return await self._api.set_assignees(owner, repo, issue_number, assignees)
async def get_issue_comments(self, owner: str, repo: str, issue_number: int) -> list[dict]:
return await self._api.get_issue_comments(owner, repo, issue_number)