Update Examples & Various Renames (#233)

# PR Description
* This PR updates code in `examples/` to be compatible with version
1.0.0
* This PR removes the Spotify examples since the Arcade hosted worker
doesn't currently cataloge the Spotify toolkit. We can reintroduce these
examples when it does.
* This PR performs various renames across the codebase for
`arcade-ai.com` --> `arcade.dev` and `Arcade AI` --> `Arcade`
This commit is contained in:
Eric Gustin 2025-01-28 17:17:29 -08:00 committed by GitHub
parent 8226cb3316
commit ce2fb0f6c1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
33 changed files with 64 additions and 257 deletions

View file

@ -29,7 +29,7 @@ Anything tagged with "enhancement" and "help wanted" is open to whoever wants to
## Write Documentation
Arcade AI could always use more documentation, whether as part of the official docs, in docstrings, or even on the web in blog posts, articles, and such.
Arcade could always use more documentation, whether as part of the official docs, in docstrings, or even on the web in blog posts, articles, and such.
## Submit Feedback

View file

@ -157,7 +157,7 @@ clean-dist: ## Clean all built distributions
.PHONY: help
help:
@echo "🛠️ Arcade AI Dev Commands:\n"
@echo "🛠️ Arcade Dev Commands:\n"
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

View file

@ -43,7 +43,7 @@
[Arcade](https://arcade.dev?ref=github) provides developer-focused tooling and APIs designed to improve the capabilities of LLM applications and agents.
By removing the complexity of connecting agentic applications with your users' data and services, Arcade AI enables developers to focus on building their agentic applications.
By removing the complexity of connecting agentic applications with your users' data and services, Arcade enables developers to focus on building their agentic applications.
To learn more, check out our [documentation](https://docs.arcade.dev/home).
@ -57,7 +57,7 @@ _Pst. hey, you, give us a star if you like it!_
### Requirements
1. An **[Arcade AI account](https://arcade-ai.typeform.com/early-access)** (currently a waitlist)
1. An **[Arcade account]([https://arcade-ai.typeform.com/early-access](https://account.arcade.dev/registerOrRedirect?return_to=https%3A%2F%2Fapi.arcade.dev%2Fdashboard&new_user_return_to=https%3A%2F%2Fapi.arcade.dev%2Fdashboard%2Fwelcome))**
2. **Python 3.10+** and **pip**
### Installation
@ -68,7 +68,7 @@ Install the package:
pip install 'arcade-ai[fastapi]'
```
Log in to your account:
Log in to your account via the CLI:
```bash
arcade login
@ -93,7 +93,7 @@ User (dev@arcade.dev):
> star the ArcadeAI/arcade-ai repo on Github
```
Arcade AI will prompt you to authorize with GitHub and will star the [ArcadeAI/arcade-ai](https://github.com/ArcadeAI/arcade-ai) repo on your behalf.
Arcade will prompt you to authorize with GitHub and will star the [ArcadeAI/arcade-ai](https://github.com/ArcadeAI/arcade-ai) repo on your behalf.
You'll see:
@ -106,11 +106,11 @@ Press `Ctrl-C` to exit the chat.
## Arcade Cloud
Arcade Cloud is a hosted version of the Arcade AI engine that hosts a number of prebuilt toolkits for interacting with a variety of services.
Arcade Cloud is a hosted version of the Arcade engine that hosts a number of prebuilt toolkits for interacting with a variety of services.
### Prebuilt Toolkits
Arcade AI offers a number of prebuilt toolkits that can be used by agents to interact with a variety of services.
Arcade offers a number of prebuilt toolkits that can be used by agents to interact with a variety of services.
<table>
<thead>
@ -300,13 +300,17 @@ The LLM API supports a variety of language models. Currently, the ones supported
For more information, refer to the [supported models documentation](https://docs.arcade.dev/home/supported-models).
### Get Started with Arcade
To get started with Arcade, check out our [quickstart guide](https://docs.arcade.dev/home/quickstart).
### Building Your Own Tools
Learn how to build your own tools by following our [creating a custom toolkit guide](https://docs.arcade.dev/home/build-tools/create-a-toolkit).
### Evaluating Tools
Arcade AI enables you to evaluate your custom tools to ensure they function correctly with the AI assistant, including defining evaluation cases and using different critics.
Arcade enables you to evaluate your custom tools to ensure they function correctly with the AI assistant, including defining evaluation cases and using different critics.
Learn how to evaluate your tools by following our [evaluating tools guide](https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite).

View file

@ -1,13 +1,13 @@
# Arcade AI Python SDK and CLI
# Arcade Python SDK and CLI
[Arcade AI](https://arcade-ai.com?ref=pypi) provides developer-focused tooling and APIs designed to improve the capabilities of LLM applications and agents.
[Arcade](https://arcade.dev?ref=pypi) provides developer-focused tooling and APIs designed to improve the capabilities of LLM applications and agents.
By removing the complexity of connecting agentic applications with your users' data and services, Arcade AI enables developers to focus on building their agentic applications.
By removing the complexity of connecting agentic applications with your users' data and services, Arcade enables developers to focus on building their agentic applications.
To learn more, check out our
- [Website](https://arcade-ai.com?ref=pypi)
- [Website](https://arcade.dev?ref=pypi)
- [GitHub](https://github.com/ArcadeAI/arcade-ai)
- [Documentation](https://docs.arcade-ai.com)
- [Documentation](https://docs.arcade.dev)
- [Discord](https://discord.com/invite/GUZEMpEZ9p)
- [X](https://x.com/TryArcade)
- [LinkedIn](https://www.linkedin.com/company/arcade-ai)

View file

@ -227,7 +227,7 @@ def display_arcade_chat_header(base_url: str, stream: bool) -> None:
chat_header = Text.assemble(
"\n",
(
"=== Arcade AI Chat ===",
"=== Arcade Chat ===",
"bold magenta underline",
),
"\n",

View file

@ -169,7 +169,7 @@ def _get_config_file(
)
console.print(
"TIP: Please install the Arcade Engine by following the instructions at:\n"
" https://docs.arcade-ai.com/home/install/local#install-the-engine\n",
" https://docs.arcade.dev/home/install/local#install-the-engine\n",
style="bold green",
)
@ -229,7 +229,7 @@ def _build_engine_command(engine_config: str | None, engine_env: str | None = No
if not engine_bin:
console.print(
"❌ Engine binary not found, refer to the installation guide at "
"https://docs.arcade-ai.com/guides/installation for how to install the engine",
"https://docs.arcade.dev/guides/installation for how to install the engine",
style="bold red",
)
sys.exit(1)

View file

@ -414,7 +414,7 @@ def evals(
asyncio.run(run_evaluations())
@cli.command(help="Launch Arcade AI locally for tool dev", rich_help_panel="Launch")
@cli.command(help="Launch Arcade locally for tool dev", rich_help_panel="Launch")
def dev(
host: str = typer.Option("127.0.0.1", help="Host for the worker server.", show_default=True),
port: int = typer.Option(

View file

@ -108,8 +108,8 @@ def serve_default_worker(
worker_secret = worker_secret or "dev"
app = fastapi.FastAPI(
title="Arcade AI Worker",
description="Arcade AI default Worker implementation using FastAPI.",
title="Arcade Worker",
description="Arcade default Worker implementation using FastAPI.",
version="0.1.0",
lifespan=lifespan, # Use custom lifespan to catch errors, notably KeyboardInterrupt (Ctrl+C)
)

View file

@ -85,7 +85,7 @@ class Config(BaseConfig):
If no configuration file exists, this method will create a new one with default values.
The default configuration includes:
- An empty API configuration
- A default Engine configuration (host: "api.arcade-ai.com", port: None, tls: True)
- A default Engine configuration (host: "api.arcade.dev", port: None, tls: True)
- No user configuration
Returns:

View file

@ -50,12 +50,12 @@
1. Run `make test` from the root of the repository
## How to run evals:
1. [Install the Arcade Engine Locally](https://docs.arcade-ai.com/home/install/local)
1. [Install the Arcade Engine Locally](https://docs.arcade.dev/home/install/local)
2. Install extra dependencies needed for evals:
```bash
pip install 'arcade-ai[fastapi,evals]'
```
3. Log into Arcade AI:
3. Log into Arcade:
```bash
arcade login
```

View file

@ -1,12 +1,12 @@
[tool.poetry]
name = "arcade-ai"
version = "1.0.1"
description = "Arcade AI Python SDK and CLI"
description = "Arcade Python SDK and CLI"
readme = "README.md"
packages = [
{include="arcade", from="."}
]
authors = ["Arcade AI <dev@arcade-ai.com>"]
authors = ["Arcade <dev@arcade.dev>"]
[build-system]
requires = ["poetry-core>=1.0.0"]

View file

@ -56,7 +56,7 @@ build-and-publish: build publish ## Build and publish.
.PHONY: help
help:
@echo "🛠️ Arcade AI Dev Commands:\n"
@echo "🛠️ Arcade Dev Commands:\n"
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
.DEFAULT_GOAL := help

View file

@ -25,7 +25,7 @@
## Overview
`langchain-arcade` allows you to use Arcade AI tools in your LangChain and LangGraph applications.
`langchain-arcade` allows you to use Arcade tools in your LangChain and LangGraph applications.
## Installation

View file

@ -2,7 +2,7 @@
name = "langchain-arcade"
version = "1.0.0"
description = "An integration package connecting Arcade and LangChain/LangGraph"
authors = ["Arcade AI <dev@arcade-ai.com>"]
authors = ["Arcade <dev@arcade.dev>"]
readme = "README.md"
repository = "https://github.com/arcadeai/arcade-ai/tree/main/contrib/langchain"
license = "MIT"

View file

@ -16,12 +16,12 @@ def call_non_auth_tool(client: Arcade, user_id: str) -> None:
This is a simple example of calling a non-auth tool. Next, try writing your own non-auth tool for your own use case.
"""
# Prepare the inputs to the tool as a dictionary where keys are the names of the parameters expected by the tool and the values are the actual values to pass to the tool
inputs = {"a": 9001, "b": 42}
tool_input = {"a": 9001, "b": 42}
# Execute the tool
response = client.tools.execute(
tool_name="Math.Add",
inputs=inputs,
input=tool_input,
user_id=user_id,
)
@ -30,7 +30,7 @@ def call_non_auth_tool(client: Arcade, user_id: str) -> None:
if __name__ == "__main__":
cloud_host = "https://api.arcade-ai.com"
cloud_host = "https://api.arcade.dev"
client = Arcade(
base_url=cloud_host, # Alternatively, use http://localhost:9099 if you are running Arcade Engine locally, or any base_url if you're hosting elsewhere

View file

@ -29,12 +29,12 @@ def call_auth_tool(client: Arcade, user_id: str) -> None:
client.auth.wait_for_completion(auth_response)
# Prepare the inputs to the tool as a dictionary where keys are the names of the parameters expected by the tool and the values are the actual values to pass to the tool
inputs = {"n_emails": 5}
tool_input = {"n_emails": 5}
# Execute the tool
response = client.tools.execute(
tool_name="Google.ListEmails",
inputs=inputs,
input=tool_input,
user_id=user_id,
)
@ -44,7 +44,7 @@ def call_auth_tool(client: Arcade, user_id: str) -> None:
if __name__ == "__main__":
client = Arcade(
base_url="https://api.arcade-ai.com", # Alternatively, use http://localhost:9099 if you are running Arcade Engine locally, or any base_url if you're hosting elsewhere
base_url="https://api.arcade.dev", # Alternatively, use http://localhost:9099 if you are running Arcade Engine locally, or any base_url if you're hosting elsewhere
)
user_id = "you@example.com"

View file

@ -12,7 +12,7 @@ def call_tool_with_openai(client: OpenAI) -> dict:
messages=[
{"role": "user", "content": "Star the ArcadeAI/arcade-ai repository."},
],
model="gpt-4o-mini", # TODO: Try "claude-3-5-sonnet-20240620" or other models from our supported model providers. Checkout out our docs for a full list: https://docs.arcade-ai.com/integrations
model="gpt-4o-mini", # TODO: Try "claude-3-5-sonnet-20240620" or other models from our supported model providers. Checkout out our docs for a full list https://docs.arcade.dev
user="you@example.com",
tools=["Github.SetStarred"],
tool_choice="generate", # TODO: Try "execute" and note any differences
@ -25,7 +25,7 @@ if __name__ == "__main__":
arcade_api_key = os.environ.get(
"ARCADE_API_KEY"
) # If you forget your Arcade API key, it is stored at ~/.arcade/credentials.yaml on `arcade login`
cloud_host = "https://api.arcade-ai.com" + "/v1"
cloud_host = "https://api.arcade.dev" + "/v1"
openai_client = OpenAI(
api_key=arcade_api_key,

View file

@ -1,119 +0,0 @@
"""Example script demonstrating how to call multiple tools directly with authentication.
For this example, we are using the prebuilt Spotify toolkit to start playing similar songs to the currently playing song.
Steps:
1. Search for the song
2. Start playing the song
3. Get info about the currently playing song
4. Inform the user which song is now playing
"""
from typing import Any, Optional
from arcade_spotify.tools.models import SearchType
from arcadepy import Arcade # pip install arcade-py
# Need to click on a link for every provider
def get_permissions(client: Arcade, provider_to_scopes: dict, user_id: str) -> None:
"""Prompt the user to authorize necessary permissions for each provider."""
for provider, scopes in provider_to_scopes.items():
auth_response = client.auth.start(
user_id=user_id,
provider=provider,
scopes=scopes,
)
if auth_response.status != "completed":
print(f"Click this link to authorize: {auth_response.authorization_url}")
input("After you have authorized, press Enter to continue...")
def call_tool(client: Arcade, tool_name: str, user_id: str, inputs: Optional[dict] = None) -> Any:
"""Call a single tool."""
if inputs is None:
inputs = {}
response = client.tools.execute(
tool_name=tool_name,
inputs=inputs,
user_id=user_id,
)
if response.output.error:
print(response.output.error)
return response.output.value
def search_and_play_song(
client: Arcade,
provider_to_scopes: dict,
tools: list[str],
user_id: str,
song_name: str,
artist_name: str,
) -> None:
"""Execute the sequence of tools to get recommendations and start playback."""
get_permissions(client, provider_to_scopes, user_id)
(
search_tool,
start_playback_tool,
get_currently_playing_tool,
) = tools
# Step 1: search for the song
response = call_tool(
client=client,
tool_name=search_tool,
user_id=user_id,
inputs={
"q": f"{song_name} {artist_name}",
"types": [SearchType.TRACK],
},
)
if not response["tracks"]["items"]:
print("Sorry, I couldn't find that song on Spotify.")
return
# Step 2: Start playing the song
track_id = response["tracks"]["items"][0]["id"]
response = call_tool(
client,
start_playback_tool,
user_id,
inputs={"track_ids": [track_id]},
)
# Step 3: get currently playing song
response = call_tool(client, get_currently_playing_tool, user_id)
print(
f"\nNow playing: {response['track_name']} by {', '.join(response['track_artists'])} - {response['track_spotify_url']}"
)
if __name__ == "__main__":
client = Arcade(base_url="https://api.arcade-ai.com")
# Necessary scopes for the tools we are calling:
provider_to_scopes = {
"spotify": [
"user-read-currently-playing",
"user-read-playback-state",
],
}
tools = [
"Spotify.Search", # Search for a song
"Spotify.StartTracksPlaybackById", # Start playing the song
"Spotify.GetCurrentlyPlaying", # Get info about the current song
]
user_id = "you@example.com"
song_name = input("Enter the song name: ")
artist_name = input("Enter the artist name: ")
search_and_play_song(client, provider_to_scopes, tools, user_id, song_name, artist_name)

View file

@ -1,80 +0,0 @@
"""
Example script demonstrating how to call multiple tools (sequentially) using an LLM with authentication.
For this example, we are using the prebuilt Spotify toolkit to search for a song, start playing it, and
get info about the currently playing song.
Steps:
1. Search for the song
2. Start playing the song
3. Get info about the currently playing song
4. Inform the user which song is now playing
"""
import os
from openai import OpenAI
def call_tool(client: OpenAI, user_id: str, tool: str, message: dict, history: list[dict]) -> str:
"""Make a tool call with a specific tool and message."""
response = client.chat.completions.create(
messages=[
*history,
message,
],
model="gpt-4o",
user=user_id,
tools=[tool],
tool_choice="generate",
)
return response
def call_tools_with_llm(
client: OpenAI, user_id: str, song_name: str, artist_name: str
) -> list[dict]:
"""Use an LLM to execute the sequence of tools to search for a song and start playback."""
tools = [
"Spotify.Search",
"Spotify.StartTracksPlaybackById",
"Spotify.GetCurrentlyPlaying",
]
messages = [
{"role": "user", "content": f"Search for '{song_name}' by {artist_name}' on Spotify."},
{"role": "user", "content": "Start playing the song. Just one tool call."},
{"role": "user", "content": "Get the currently playing song."},
]
history = []
for i in range(len(messages)):
response = call_tool(client, user_id, tools[i], messages[i], history)
print("\n\n", response.choices[0].message.content)
if (
response.choices[0].tool_authorizations
and response.choices[0].tool_authorizations[0].get("status") == "pending"
):
input("\nPress Enter once you have authorized...")
response = call_tool(client, user_id, tools[i], messages[i], history)
history.append(messages[i])
history.append({"role": "assistant", "content": response.choices[0].message.content})
return history
if __name__ == "__main__":
arcade_api_key = os.environ.get("ARCADE_API_KEY")
cloud_host = "https://api.arcade-ai.com/v1"
openai_client = OpenAI(
api_key=arcade_api_key,
base_url=cloud_host,
)
user_id = "you@example.com"
song_name = input("Enter the song name: ")
artist_name = input("Enter the artist name: ")
history = call_tools_with_llm(openai_client, user_id, song_name, artist_name)
print("\n\n", history)

View file

@ -22,7 +22,7 @@ def get_auth_token(client: Arcade, user_id: str) -> str:
)
if auth_response.status != "completed":
print(f"Click this link to authorize: {auth_response.authorization_url}")
print(f"Click this link to authorize: {auth_response.url}")
auth_response = client.auth.wait_for_completion(auth_response)
return auth_response.context.token
@ -46,7 +46,7 @@ def use_auth_token(token: str) -> None:
if __name__ == "__main__":
cloud_host = "https://api.arcade-ai.com"
cloud_host = "https://api.arcade.dev"
client = Arcade(
base_url=cloud_host, # Alternatively, use http://localhost:9099 if you are running Arcade locally, or any base_url if you're hosting elsewhere

View file

@ -2,7 +2,7 @@
### API keys
Follow [these instructions](https://docs.arcade.dev/home/custom-tools/) to Install Arcade AI and create an API key.
Follow [these instructions](https://docs.arcade.dev/home/custom-tools/) to Install Arcade and create an API key.
This example is using OpenAI, as the LLM provider. Ensure you have an [OpenAI API key](https://platform.openai.com/docs/quickstart).

View file

@ -1,5 +1,5 @@
"""
Example script demonstrating how to build a simple chatbot with Arcade AI.
Example script demonstrating how to build a simple chatbot with Arcade.
For this example, we are using the prebuilt Google Docs toolkit to create and edit documents.
@ -55,20 +55,22 @@ if __name__ == "__main__":
arcade_api_key = os.environ.get(
"ARCADE_API_KEY"
) # If you forget your Arcade API key, it is stored at ~/.arcade/credentials.yaml on `arcade login`
local_host = "http://localhost:9099/v1"
cloud_host = "https://api.arcade.dev/v1"
user_id = "user@example.com"
openai_client = OpenAI(
api_key=arcade_api_key,
base_url=local_host,
base_url=cloud_host,
)
tool_names = [
"Google.GetDocumentById",
"Google.InsertTextAtEndOfDocument",
"Google.CreateBlankDocument",
"Google.CreateDocumentFromText",
"Google.ListDocuments",
"Google.SendEmail",
"Google.SendDraftEmail",
"Google.WriteDraftEmail",
"Google.UpdateDraftEmail",
"Google.ListDraftEmails",
"Google.ListEmailsByHeader",
"Google.ListEmails",
]
chat(openai_client, tool_names, user_id)

View file

@ -2,7 +2,7 @@
name = "arcade_code_sandbox"
version = "0.1.9"
description = "LLM tools for running code in a sandbox"
authors = ["Arcade AI <dev@arcade-ai.com>"]
authors = ["Arcade <dev@arcade.dev>"]
[tool.poetry.dependencies]
python = "^3.10"

View file

@ -2,7 +2,7 @@
name = "arcade_github"
version = "0.1.9"
description = "LLM tools for interacting with Github"
authors = ["Arcade AI <dev@arcade-ai.com>"]
authors = ["Arcade <dev@arcade.dev>"]
[tool.poetry.dependencies]
python = "^3.10"

View file

@ -2,7 +2,7 @@
name = "arcade_google"
version = "0.2.0"
description = "Arcade tools for the entire google suite"
authors = ["Arcade AI <dev@arcade-ai.com>"]
authors = ["Arcade <dev@arcade.dev>"]
[tool.poetry.dependencies]
python = "^3.10"

View file

@ -2,7 +2,7 @@
name = "arcade_linkedin"
version = "0.1.10"
description = "Arcade tools for LinkedIn"
authors = ["Arcade AI <dev@arcade-ai.com>"]
authors = ["Arcade <dev@arcade.dev>"]
[tool.poetry.dependencies]
python = "^3.10"

View file

@ -2,7 +2,7 @@
name = "arcade_math"
version = "0.1.9"
description = "Math toolkit for Arcade"
authors = ["Arcade AI <dev@arcade-ai.com>"]
authors = ["Arcade <dev@arcade.dev>"]
[tool.poetry.dependencies]
python = "^3.10"

View file

@ -2,7 +2,7 @@
name = "arcade_search"
version = "0.1.10"
description = "Tools for searching the web"
authors = ["Arcade AI <dev@arcade-ai.com>"]
authors = ["Arcade <dev@arcade.dev>"]
[tool.poetry.dependencies]
python = "^3.10"

View file

@ -2,7 +2,7 @@
name = "arcade_slack"
version = "0.2.0"
description = "Slack tools for LLMs"
authors = ["Arcade AI <dev@arcade-ai.com>"]
authors = ["Arcade <dev@arcade.dev>"]
[tool.poetry.dependencies]
python = "^3.10"

View file

@ -2,7 +2,7 @@
name = "arcade_spotify"
version = "0.2.1"
description = "Arcade tools for Spotify"
authors = ["Arcade AI <dev@arcade-ai.com>"]
authors = ["Arcade <dev@arcade.dev>"]
[tool.poetry.dependencies]
python = "^3.10"

View file

@ -2,7 +2,7 @@
name = "arcade_web"
version = "0.1.9"
description = "LLM tools for web-related tasks"
authors = ["Arcade AI <dev@arcade-ai.com>"]
authors = ["Arcade <dev@arcade.dev>"]
[tool.poetry.dependencies]
python = "^3.10"

View file

@ -2,7 +2,7 @@
name = "arcade_x"
version = "0.1.11"
description = "LLM tools for interacting with X (Twitter)"
authors = ["Arcade AI <dev@arcade-ai.com>"]
authors = ["Arcade <dev@arcade.dev>"]
[tool.poetry.dependencies]
python = "^3.10"

View file

@ -2,7 +2,7 @@
name = "arcade_zoom"
version = "0.1.10"
description = "Arcade tools for Zoom"
authors = ["Arcade AI <dev@arcade-ai.com>"]
authors = ["Arcade <dev@arcade.dev>"]
[tool.poetry.dependencies]
python = "^3.10"