新增了完整的GitHub集成插件,包含认证、会话管理、Webhook处理、消息收发、反应支持等核心功能,支持Issues、Discussions、Pull Request的交互与通知。
53 lines
2.3 KiB
Python
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)
|