Skip to content

Commit

Permalink
Merge branch 'main' into patch-3
Browse files Browse the repository at this point in the history
  • Loading branch information
zzstoatzz authored Oct 19, 2024
2 parents 52d5d00 + 3d1ff88 commit 3d02197
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 11 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/build-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ on:

env:
MKDOCS_SOCIAL_CARDS: ${{ vars.MKDOCS_SOCIAL_CARDS }}
MKDOCS_MATERIAL_INSIDERS_REPO_RO: ${{ secrets.MKDOCS_MATERIAL_INSIDERS_REPO_RO }}
MKDOCS_MATERIAL_INSIDERS_CONTENTS_RO: ${{ secrets.MKDOCS_MATERIAL_INSIDERS_CONTENTS_RO }}

permissions:
contents: write
Expand All @@ -34,7 +34,7 @@ jobs:
run: pip install -U uv && uv venv

- name: Install Material Insiders
run: pip install git+https://oauth:${MKDOCS_MATERIAL_INSIDERS_REPO_RO}@github.com/PrefectHQ/mkdocs-material-insiders.git
run: pip install git+https://oauth:${MKDOCS_MATERIAL_INSIDERS_CONTENTS_RO}@github.com/PrefectHQ/mkdocs-material-insiders.git

# for now, only install mkdocs. In the future may need to install Marvin itself.
- name: Install dependencies for MKDocs Material
Expand All @@ -47,4 +47,4 @@ jobs:
cairosvg
- name: Build docs
run: |
mkdocs build --config-file mkdocs.insiders.yml
mkdocs build --config-file mkdocs.insiders.yml
2 changes: 1 addition & 1 deletion .github/workflows/publish-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ on:

env:
MKDOCS_SOCIAL_CARDS: ${{ vars.MKDOCS_SOCIAL_CARDS }}
MKDOCS_MATERIAL_INSIDERS_REPO_RO: ${{ secrets.MKDOCS_MATERIAL_INSIDERS_REPO_RO }}
MKDOCS_MATERIAL_INSIDERS_REPO_RO: ${{ secrets.MKDOCS_MATERIAL_INSIDERS_CONTENTS_RO }}

permissions:
contents: write
Expand Down
15 changes: 13 additions & 2 deletions cookbook/slackbot/start.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
)
from marvin.utilities.strings import count_tokens, slice_tokens
from prefect import flow, task
from prefect.blocks.notifications import SlackWebhook
from prefect.states import Completed
from prefect.variables import Variable
from tools import (
Expand Down Expand Up @@ -126,7 +127,16 @@ async def handle_message(payload: SlackPayload):

@app.post("/chat")
async def chat_endpoint(request: Request):
payload = SlackPayload(**await request.json())
try:
payload = SlackPayload(**await request.json())
except Exception as e:
logger.error(f"Error parsing Slack payload: {e}")
slack_webhook = await SlackWebhook.load("marvin-bot-pager")
await slack_webhook.notify( # type: ignore
body=f"Error parsing Slack payload: {e}",
subject="Slackbot Error",
)
raise HTTPException(400, "Invalid event type")
match payload.type:
case "event_callback":
options = dict(
Expand All @@ -146,6 +156,7 @@ async def chat_endpoint(request: Request):

if __name__ == "__main__":
if not os.getenv("OPENAI_API_KEY", None): # TODO: Remove this
os.environ["OPENAI_API_KEY"] = marvin.settings.openai.api_key.get_secret_value()
assert (api_key := marvin.settings.openai.api_key), "OPENAI_API_KEY not set"
os.environ["OPENAI_API_KEY"] = api_key.get_secret_value()

uvicorn.run(app, host="0.0.0.0", port=4200)
19 changes: 14 additions & 5 deletions src/marvin/utilities/slack.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

import os
import re
from typing import List, Optional, Union
from typing import Any, Dict, List, Optional, Union

import httpx
from pydantic import BaseModel, field_validator
from pydantic import BaseModel, ValidationInfo, field_validator, model_validator

import marvin

Expand All @@ -31,7 +31,7 @@ class SlackEvent(BaseModel):
client_msg_id: Optional[str] = None
type: str
text: Optional[str] = None
user: Optional[str] = None
user: Union[str, Dict[str, Any], None] = None
ts: Optional[str] = None
team: Optional[str] = None
channel: Optional[str] = None
Expand All @@ -40,6 +40,13 @@ class SlackEvent(BaseModel):
parent_user_id: Optional[str] = None
blocks: Optional[List[EventBlock]] = None

@model_validator(mode="before")
@classmethod
def extract_user_id(cls, data: Dict[str, Any]) -> Dict[str, Any]:
if isinstance(data.get("user"), dict):
data["user"] = data["user"].get("id")
return data


class EventAuthorization(BaseModel):
enterprise_id: Optional[str] = None
Expand All @@ -63,8 +70,10 @@ class SlackPayload(BaseModel):
challenge: Optional[str] = None

@field_validator("event")
def validate_event(cls, v: Optional[SlackEvent]) -> Optional[SlackEvent]:
if v.type != "url_verification" and v is None:
def validate_event(
cls, v: Optional[SlackEvent], info: ValidationInfo
) -> Optional[SlackEvent]:
if v is None and info.data.get("type") != "url_verification":
raise ValueError("event is required")
return v

Expand Down

0 comments on commit 3d02197

Please sign in to comment.