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.
37 lines
971 B
Python
37 lines
971 B
Python
import json
|
|
import os
|
|
from typing import Annotated, Any, Optional
|
|
|
|
import serpapi
|
|
|
|
from arcade.sdk import tool
|
|
|
|
|
|
@tool
|
|
async def search_google(
|
|
query: Annotated[str, "Search query"],
|
|
n_results: Annotated[int, "Number of results to retrieve"] = 5,
|
|
) -> str:
|
|
"""Search Google using SerpAPI and return organic search results."""
|
|
|
|
api_key = get_secret("SERP_API_KEY")
|
|
if not api_key:
|
|
raise ValueError("SERP_API_KEY is not set")
|
|
|
|
client = serpapi.Client(api_key=api_key)
|
|
params = {"engine": "google", "q": query}
|
|
|
|
search = client.search(params)
|
|
results = search.as_dict()
|
|
organic_results = results.get("organic_results", [])
|
|
|
|
return json.dumps(organic_results[:n_results])
|
|
|
|
|
|
def get_secret(name: str, default: Optional[Any] = None) -> Any:
|
|
secret = os.getenv(name)
|
|
if secret is None:
|
|
if default is not None:
|
|
return default
|
|
raise ValueError(f"Secret {name} is not set.")
|
|
return secret
|