Discord bot for GitHub Issues bridge with tool calling.
| 478 | |
| 479 | |
| 480 | class PollyBot(commands.Bot): |
| 481 | """Discord bot for GitHub Issues bridge with tool calling.""" |
| 482 | |
| 483 | def __init__(self): |
| 484 | intents = discord.Intents.default() |
| 485 | intents.message_content = True |
| 486 | super().__init__(command_prefix="!", intents=intents) |
| 487 | self.issue_notifier = None |
| 488 | self.webhook_server = None |
| 489 | self._api_server = None |
| 490 | |
| 491 | async def setup_hook(self): |
| 492 | """Called when the bot is starting up.""" |
| 493 | # Initialize GitHub App auth if configured |
| 494 | if config.use_github_app: |
| 495 | init_github_app( |
| 496 | app_id=config.github_app_id, |
| 497 | private_key=config.github_private_key, |
| 498 | installation_id=config.github_installation_id, |
| 499 | ) |
| 500 | logger.info("GitHub App authentication initialized") |
| 501 | else: |
| 502 | logger.info("Using GitHub PAT authentication") |
| 503 | |
| 504 | # Register tool handlers with pollinations client |
| 505 | for name, handler in TOOL_HANDLERS.items(): |
| 506 | pollinations_client.register_tool_handler(name, handler) |
| 507 | logger.info(f"Registered {len(TOOL_HANDLERS)} GitHub tool handlers") |
| 508 | |
| 509 | # Register code_search handler if embeddings enabled |
| 510 | if config.local_embeddings_enabled: |
| 511 | pollinations_client.register_tool_handler("code_search", _code_search_handler) |
| 512 | logger.info("Registered code_search tool handler (embeddings enabled)") |
| 513 | |
| 514 | # Register doc_search handler if doc embeddings enabled |
| 515 | if config.doc_embeddings_enabled: |
| 516 | pollinations_client.register_tool_handler("doc_search", _doc_search_handler) |
| 517 | logger.info("Registered doc_search tool handler (doc embeddings enabled)") |
| 518 | |
| 519 | # Register web_search handler (always available) |
| 520 | from .services.pollinations import web_search_handler |
| 521 | |
| 522 | pollinations_client.register_tool_handler("web_search", web_search_handler) |
| 523 | logger.info("Registered web_search tool handler") |
| 524 | |
| 525 | # Register web_scrape handler (always available - Crawl4AI powered) |
| 526 | from .services.web_scraper import web_scrape_handler |
| 527 | |
| 528 | pollinations_client.register_tool_handler("web_scrape", web_scrape_handler) |
| 529 | logger.info("Registered web_scrape tool handler (Crawl4AI)") |
| 530 | |
| 531 | # Register render_visual handler (always available). |
| 532 | # Old tool name aliased for back-compat with cached AI sessions. |
| 533 | from .services.charts import data_visualization, render_visual |
| 534 | |
| 535 | pollinations_client.register_tool_handler("render_visual", render_visual) |
| 536 | pollinations_client.register_tool_handler("data_visualization", data_visualization) |
| 537 | logger.info("Registered render_visual tool handler (data_visualization alias)") |