On the last few PRs I have noticed two problems: 1. `ruff format` fails even though it seems OK on our local machines (sometimes, not always) 2. Nate's and Sam's machines kept flip-flopping a specific piece of formatting back and forth, indicating a subtle difference of config hiding somewhere 3. This was reproducible by running `ruff format` in the terminal, followed by `make check`. The former would edit files, and then `make check` would edit them back! This PR addresses both issues, and further standardizes our editor & linter configs to be super stable. Specifically: 1. The main fix for the above, the pre-commit hook was pinned to a super old version of ruff. This resulted in subtle differences in behavior between our machines, and on CI. 2. Moved ruff settings from `pyproject.toml` to `.ruff.toml` pyproject files in subdirectories (e.g. `toolkits/**`) were overriding the main pyproject file and erasing the custom ruff config we set at the root. This meant that our ruff config was applied to `arcade` but not to any of the other packages. By moving the config to `.ruff.toml` at the root, all projects will inherit the same ruff linting & formatting config. 4. Un-ignored the `.vscode/` directory so that we can share vscode/cursor workspace settings. This is valuable for standardizing settings like the default formatter (ruff) and default test framework (pytest). However, it's important that going forward we _only_ commit things here that should apply across all of our machines. 5. To avoid any conflict between prettier and ruff, prettier now explicitly ignores *.py files 6. Finally, `ruff format` and `make check` agree. A number of files are newly auto-formatted.
55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
import os
|
|
|
|
import arcade_math
|
|
from fastapi import FastAPI, HTTPException
|
|
from pydantic import BaseModel
|
|
|
|
from arcade.actor.fastapi.actor import FastAPIActor
|
|
from arcade.client import AsyncArcade
|
|
from arcade.core.config import config
|
|
from arcade.core.toolkit import Toolkit
|
|
|
|
if not config.api or not config.api.key:
|
|
raise ValueError("Arcade API key not set. Please run `arcade login`.")
|
|
|
|
client = AsyncArcade(api_key=config.api.key)
|
|
|
|
app = FastAPI()
|
|
|
|
actor_secret = os.environ.get("ARCADE_ACTOR_SECRET")
|
|
actor = FastAPIActor(app, secret=actor_secret)
|
|
actor.register_toolkit(Toolkit.from_module(arcade_math))
|
|
|
|
|
|
class ChatRequest(BaseModel):
|
|
message: str
|
|
|
|
|
|
@app.post("/chat")
|
|
async def postChat(request: ChatRequest, tool_choice: str = "execute"):
|
|
try:
|
|
raw_response = await client.chat.completions.create(
|
|
messages=[
|
|
{"role": "system", "content": "You are a helpful assistant."},
|
|
{"role": "user", "content": request.message},
|
|
],
|
|
model="gpt-4o-mini",
|
|
max_tokens=500,
|
|
tools=[
|
|
# "Google.GetEmails",
|
|
# "Google.SearchEmailsByHeader",
|
|
# "Google.WriteDraft",
|
|
# "GitHub.CountStargazers",
|
|
# "GitHub.SetStarred",
|
|
# "GitHub.SearchIssues",
|
|
# "Slack.SendDmToUser",
|
|
# "Slack.SendMessageToChannel",
|
|
],
|
|
tool_choice=tool_choice,
|
|
user=config.user.email if config.user else None,
|
|
)
|
|
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
else:
|
|
return raw_response.choices
|