| import json |
| import logging |
|
|
| import aiohttp |
| from open_webui.config import WEBUI_FAVICON_URL |
| from open_webui.env import ( |
| AIOHTTP_CLIENT_ALLOW_REDIRECTS, |
| AIOHTTP_CLIENT_SESSION_SSL, |
| AIOHTTP_CLIENT_TIMEOUT, |
| VERSION, |
| ) |
| from open_webui.retrieval.web.utils import validate_url |
|
|
| log = logging.getLogger(__name__) |
|
|
|
|
| |
| |
| async def post_webhook(name: str, url: str, message: str, event_data: dict) -> bool: |
| try: |
| log.debug(f'post_webhook: {url}, {message}, {event_data}') |
| |
| |
| |
| validate_url(url) |
| payload = {} |
|
|
| |
| if 'https://hooks.slack.com' in url or 'https://chat.googleapis.com' in url: |
| payload['text'] = message |
| |
| elif 'https://discord.com/api/webhooks' in url: |
| payload['content'] = message if len(message) < 2000 else f'{message[: 2000 - 20]}... (truncated)' |
| |
| elif 'webhook.office.com' in url: |
| action = event_data.get('action', 'undefined') |
| user_data = event_data.get('user', '{}') |
| if isinstance(user_data, dict): |
| user_dict = user_data |
| else: |
| user_dict = json.loads(user_data) |
| facts = [{'name': name, 'value': value} for name, value in user_dict.items()] |
| payload = { |
| '@type': 'MessageCard', |
| '@context': 'http://schema.org/extensions', |
| 'themeColor': '0076D7', |
| 'summary': message, |
| 'sections': [ |
| { |
| 'activityTitle': message, |
| 'activitySubtitle': f'{name} ({VERSION}) - {action}', |
| 'activityImage': WEBUI_FAVICON_URL, |
| 'facts': facts, |
| 'markdown': True, |
| } |
| ], |
| } |
| |
| else: |
| payload = {**event_data} |
|
|
| log.debug(f'payload: {payload}') |
| async with aiohttp.ClientSession( |
| trust_env=True, timeout=aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT) |
| ) as session: |
| async with session.post( |
| url, |
| json=payload, |
| ssl=AIOHTTP_CLIENT_SESSION_SSL, |
| allow_redirects=AIOHTTP_CLIENT_ALLOW_REDIRECTS, |
| ) as r: |
| r_text = await r.text() |
| r.raise_for_status() |
| log.debug(f'r.text: {r_text}') |
|
|
| return True |
| except Exception as e: |
| log.exception(e) |
| return False |
|
|