Commit graph

343 commits

Author SHA1 Message Date
Nate Barbettini
e46b985cc9
fix: Typo in Sqrt tool description (#378) 2025-04-23 10:28:12 -03:00
Renato Byrro
3e35c70f85
Update Hubspot toolkit to use Hubspot auth class (#375) 2025-04-22 21:55:39 -03:00
Renato Byrro
9346498edb
Fix google type errors (#376) 2025-04-22 21:26:45 -03:00
Renato Byrro
de227c5f51
Hubspot toolkit (#363)
Reviewer:

1. DM me to get a client ID/secret for the Hubspot app and login
credentials for a sample Hubspot account
2. For now, you'll need to run the engine on the branch
`nate/token-introspection` for the auth flow to work with Hubspot
3. Add the following to `auth.providers` in your engine yaml:

```yaml
- id: arcade-hubspot
  description: 'Hubspot provider'
  enabled: true
  type: oauth2
  provider_id: hubspot
  client_id: ${env:HUBSPOT_CLIENT_ID}
  client_secret: ${env:HUBSPOT_CLIENT_SECRET}
```
2025-04-22 17:43:15 -03:00
Renato Byrro
52807bfd0e
Update Salesforce provider id (#373)
Updating the auth provider's `id` to simply `salesforce`. We don't want
it to be confused with a future well-known `provider_id` of
`arcade-salesforce`.

Also, what the toolkit was referring to as `org_domain` is actually the
organization's SUBdomain. We changed all references to "subdomain" to be
more precise. The documentation has been updated accordingly.
2025-04-22 16:32:05 -03:00
Renato Byrro
ea14b898b4
Add Hubspot OAuth class (#372) 2025-04-21 17:55:45 -03:00
Eric Gustin
8f1dd30960
Add Dropbox toolkit to Worker (#371) 2025-04-21 13:20:40 -07:00
Eric Gustin
81ada1d9b9
Add Google File Picker Tool (#361)
## Google File Picker
The Google Picker lets users select or upload Google Drive files. Users
can grant permission to your apps to access their Drive data, providing
a secure and authorized way to interact with their files.

The `generate_google_file_picker_url` returns a URL to a Google File
Picker for the user.
2025-04-18 18:25:05 -07:00
Eric Gustin
edac6ab48d
Add Microsoft as well-known auth provider (#369) 2025-04-18 14:26:08 -07:00
Eric Gustin
09e86e9005
Toolkit Release: Reddit 0.1.0 (#370)
Associated PR: https://github.com/ArcadeAI/arcade-ai/pull/352
2025-04-18 11:01:28 -07:00
Renato Byrro
e1c293ee4f
Salesforce toolkit (#360)
Co-authored-by: Eric Gustin <34000337+EricGustin@users.noreply.github.com>
2025-04-18 14:28:27 -03:00
Mateo Torres
eb6b7f3987
Mateo/google calendar list (#367)
Adds "ListCalendars" to the calendar toolkit
2025-04-18 10:05:39 -07:00
Eric Gustin
2dc70a7814
Add More Reddit Tools (#352)
| Name | Description |

|----------------------------------|-------------------------------------------------------------------------|
| Reddit.CheckSubredditAccess | Checks whether the specified subreddit
exists and also if it is accessible |
| Reddit.GetSubredditRules | Gets the rules of the specified subreddit |
| Reddit.GetMyUsername | Get the Reddit username of the authenticated
user |
| Reddit.GetMyPosts | Get posts that were created by the authenticated
user sorted by newest |


Four new tools that I had to create for my demo app.
2025-04-17 19:51:28 -07:00
Eric Gustin
89f3ab13ce
Google Calendar - Strip 'Z' from datetimes (#366) 2025-04-17 16:58:14 -07:00
Eric Gustin
0bcbaa380a
Bump Python version for Worker's Dockerfile (#365)
[build-and-publish](https://github.com/ArcadeAI/arcade-ai/actions/runs/14522118587/job/40745392086)
is failing to build the Worker container because the arcade-stripe
toolkit requires Python >=3.11. The arcade-stripe toolkit has a
dependency that requires >=3.11, so we can't loosen the toolkit's
requirement.
2025-04-17 16:12:32 -07:00
Eric Gustin
5bfb498188
Add Stripe toolkit to Worker (#364) 2025-04-17 11:15:09 -07:00
Eric Gustin
ad713e4939
Tool Metadata (#357) 2025-04-16 19:17:36 -08:00
Eric Gustin
c7fba25488
Add Stripe toolkit (#333)
| Name | Description | Package | Version |

|-----------------------------------|---------------------------------------------------------------------------|---------|---------|
| Stripe.CreateCustomer | This tool will create a customer in Stripe. |
Stripe | 0.0.1 |
| Stripe.ListCustomers | This tool will fetch a list of Customers from
Stripe. | Stripe | 0.0.1 |
| Stripe.CreateProduct | This tool will create a product in Stripe. |
Stripe | 0.0.1 |
| Stripe.ListProducts | This tool will fetch a list of Products from
Stripe. | Stripe | 0.0.1 |
| Stripe.CreatePrice | This tool will create a price in Stripe. If a
product has not already been | Stripe | 0.0.1 |
| Stripe.ListPrices | This tool will fetch a list of Prices from Stripe.
| Stripe | 0.0.1 |
| Stripe.CreatePaymentLink | This tool will create a payment link in
Stripe. | Stripe | 0.0.1 |
| Stripe.ListInvoices | This tool will list invoices in Stripe. | Stripe
| 0.0.1 |
| Stripe.CreateInvoice | This tool will create an invoice in Stripe. |
Stripe | 0.0.1 |
| Stripe.CreateInvoiceItem | This tool will create an invoice item in
Stripe. | Stripe | 0.0.1 |
| Stripe.FinalizeInvoice | This tool will finalize an invoice in Stripe.
| Stripe | 0.0.1 |
| Stripe.RetrieveBalance | This tool will retrieve the balance from
Stripe. It takes no input. | Stripe | 0.0.1 |
| Stripe.CreateRefund | This tool will refund a payment intent in
Stripe. | Stripe | 0.0.1 |
| Stripe.ListPaymentIntents | This tool will list payment intents in
Stripe. | Stripe | 0.0.1 |
| Stripe.CreateBillingPortalSession | This tool will create a billing
portal session. | Stripe | 0.0.1 |

-------------------------

This PR implements the tools in
[stripe-agent-toolkit](https://github.com/stripe/agent-toolkit)
verbatim. This means that the logic needed to implement these tools is
minimal since stripe has already done the heavy lifting.

The tools added in this toolkit are the same tools that are in the
stripe-agent-toolkit, but formatted as Arcade tools. This means that the
names of the tools, the parameter annotations, and tool docstrings are
taken from the stripe-agent-toolkit. I have omitted evals since the tool
definitions are taken from the stripe-agent-toolkit.

The tools in this PR are generated via a script. I have included this
script in the PR (`_generate.py`) so that if the stripe-agent-toolkit
ever adds more tools, then we can simply run that script to generate the
new tools.
2025-04-14 10:29:23 -07:00
Eric Gustin
a3ff278640
Increase httpx timeout for a Notion Tool (#358)
Increasing this helps with large pages
2025-04-10 11:39:33 -07:00
Sergio Serrano
3a45d5fec0
Add LangGraph-TS example (#356)
This PR adds a new example showcasing how to integrate Arcade tools with
LangGraph.js to create a ReAct agent. The example is based on the
[LangChain React Agent
JS](https://github.com/langchain-ai/react-agent-js/tree/main)
repository.
2025-04-09 21:08:18 -03:00
Eric Gustin
8f11fce4b4
Fix Import Path In Google Calendar Eval (#355) 2025-04-08 15:02:11 -07:00
Eric Gustin
e3fe630c27
Toolkit Release: Slack (#351)
https://github.com/ArcadeAI/arcade-ai/pull/345 made changes to the Slack
toolkit & made it such that the pipe syntax is used for the return type
for some of its tools. This syntax requires arcade-ai >= 1.2.0
2025-04-07 15:00:45 -07:00
Eric Gustin
b1d293ac28
Add Reddit toolkit to worker (#350) 2025-04-07 11:11:11 -07:00
Eric Gustin
ae3b02f79e
Support PEP 604 Union Types (#347)
⚠️ Local Worker will not work with Slack toolkit until this is merged 

Support [PEP 604](https://peps.python.org/pep-0604/) Union Types for
tool input param types and return types.

https://github.com/ArcadeAI/arcade-ai/pull/345 introduced PEP 604 Union
Types into our toolkits, but the worker did not support this syntax, so
it was failing on start up if a tool used bar syntax in its return type
(Slack).

Additionally, optionals defined with `Union[T, None]` were already
supported, but didn't have any unit tests, so I added them.
2025-04-07 10:52:53 -07:00
Eric Gustin
ac92f9fd65
Fix GH Action 'publish langchain' (#348)
I've set up a new slack workflow for contrib/ packages
2025-04-06 19:42:51 -07:00
Sam Partee
3fa06f5ef1
fix terminal (#349)
Fix terminal output
2025-04-05 13:20:53 -07:00
Renato Byrro
ae5ceed016
Fix missing dependency in Dropbox toolkit pyproject (#346) 2025-04-04 14:40:05 -03:00
Eric Gustin
6af49ef068
Common changes in all toolkits (#345)
Addresses general improvements to all toolkits including changing ruff
from python 3.9 to python 3.10 which is the reason for the removal of
Optional[] among others.

Also, turns out that our `make install` for toolkits wasn't correctly
checking for whether poetry was installed (&> /dev/null syntax isn't
supported by our check-toolkits GitHub action, so we were installing
poetry twice. I replaced with the more portable >/dev/null 2>&1)

Question: Should we also change ruff to py310 for the `arcade/` package
in a later PR?

-------------------

CU-86b4gzyp6
2025-04-04 09:32:37 -07:00
Eric Gustin
7c6a739f25
Add Reddit Toolkit (#336)
| Name | Description | Package | Version |

|----------------------------|------------------------------------------------------------------|---------|---------|
| Reddit.SubmitTextPost | Submit a text-based post to a subreddit |
Reddit | 0.0.1 |
| Reddit.CommentOnPost | Comment on a Reddit post | Reddit | 0.0.1 |
| Reddit.ReplyToComment | Reply to a Reddit comment | Reddit | 0.0.1 |
| Reddit.GetPostsInSubreddit | Gets posts titles, links, and other
metadata in the specified subreddit | Reddit | 0.0.1 |
| Reddit.GetContentOfPost | Get the content (body) of a Reddit post by
its identifier. | Reddit | 0.0.1 |
| Reddit.GetContentOfMultiplePosts | Get the content (body) of multiple
Reddit posts by their identifiers. | Reddit | 0.0.1 |
| Reddit.GetTopLevelComments | Get the first page of top-level comments
of a Reddit post. | Reddit | 0.0.1 |


### Why not use an SDK?
Reddit API does not have an official SDK, although
[PRAW](https://github.com/praw-dev/praw) has large community support.

I played around with PRAW, but ultimately decided to not use an SDK.
PRAW made it incredibly easy to work with Reddit Objects, but there were
a few drawbacks that ultimately swayed me to not use it:
1. PRAW assumes that it will do the auth for you. A client ID and secret
must be passed to PRAW, but a tool only has the auth token. I was able
to hack around this by manipulating private properties - but it felt too
hacky
2. PRAW does not support Python 3.13
3. PRAW is not async. There is
[AsyncPRAW](https://github.com/praw-dev/asyncpraw), but the community
does not look active there.
2025-04-03 14:07:10 -07:00
Sergio Serrano
e604e8bde3
Improve getArcadeTools utility function (#344)
It is unnecessary to call `arcadeClient.tools.list` first and then
`arcadeClient.tools.formatted.get` for each tool. We can simply use the
`arcadeClient.tools.formatted.list` function.
2025-04-03 12:59:05 -03:00
Sergio Serrano
bc4a1894f3
Add an example for the AI SDK (#343)
Simple example of how to integrate Arcade with the Vercel AI SDK
2025-04-03 12:42:14 -03:00
Vadym Barda
daa57bc7ee
langchain-arcade: remove langgraph dependency (#342) 2025-04-03 05:25:37 -07:00
Eric Gustin
2dd7719517
Skip listing tools that aren't valid ToolDefinitions (#340)
The tool used in the mcp demo isn't a valid ToolDefinition.

Unable to list tool 'Demo.lorem': 1 validation error for ToolDefinition
requirements Input should be a valid dictionary or
instance of ToolRequirements For further information visit
https://errors.pydantic.dev/2.10/v/model_type
2025-04-01 14:20:17 -07:00
Renato Byrro
cb1fff151b
Fix issue in get_channel_metadata_by_name: missing scope for private channels and conversation types filter (#338) 2025-04-01 17:01:25 -03:00
Renato Byrro
79e3b03a8e
Google Calendar tool to find time slots when one or more people (within the same org domain) are simultaneously free (#279) 2025-04-01 14:53:27 -03:00
Renato Byrro
351814aa74
In arcade chat, ground the LLM with today's date for better accuracy (#337)
Some tools have date-related arguments where LLMs fail to provide the
correct values if the user asks in a relative way (e.g. next Monday,
last month, etc). By including today's date and day of the week in the
`arcade chat` system prompt, we avoid that issue.
2025-04-01 00:33:08 -03:00
Nate Barbettini
73520f4df5
chore: apt-get upgrade needs -y (#335) 2025-03-28 09:41:33 -07:00
Nate Barbettini
ec76c2a7ed
chore: apt-get ugprade in dockerfile (#334)
Adds `apt-get upgrade` to ensure that system packages are up to date in
the image
2025-03-28 09:29:44 -07:00
Renato Byrro
c1e8fc795a
Dropbox Toolkit (#332)
Basic tools to list items in a folder, search for files / folders, and
download a file content.
2025-03-27 18:34:10 -03:00
Sam Partee
13a01254df
Langchain Example update (#328)
Small update to reflect some changes to the `langchain-arcade` package
in the last release.

---------

Co-authored-by: Eric Gustin <34000337+EricGustin@users.noreply.github.com>
2025-03-27 13:26:31 -07:00
Eric Gustin
89a009d1af
Normalize arcade show -T input (#331)
Small change that normalizes the toolkit package name to use underscores
instead of hyphens. Python packages use underscores, not hyphens
2025-03-27 10:38:37 -07:00
Eric Gustin
887ded441e
Toolkit Release 03-25-25 (#329)
Minor version releases for Google and Search Toolkits.

Related PRs:

Google:
https://github.com/ArcadeAI/arcade-ai/pull/321

Search:
https://github.com/ArcadeAI/arcade-ai/pull/316
https://github.com/ArcadeAI/arcade-ai/pull/320
https://github.com/ArcadeAI/arcade-ai/pull/317
2025-03-25 12:01:55 -07:00
Renato Byrro
d91e417c8d
Improve error message when an exception is raised at toolkit import time upon Worker startup (#327)
Upon Worker startup, when an exception raised in a toolkit at import
time, the worker logged output will not display the cause of the
exception, or even that there was an exception raised in the toolkit.

Instead, the worker logs only a not very useful message:

```
 Failed to start Arcade Worker: Could not find tool {tool_name} in module {toolkit_name}.tools.{module_name}
```

This PR improves the logged message by adding the cause of the error.
2025-03-24 22:31:49 -03:00
Eric Gustin
e7daa1edba
Fix Failing Slack Toolkit Build (#326)
`typing` was being installed and causing builds to fail. [See logs
here](https://github.com/ArcadeAI/arcade-ai/actions/runs/14041206262/job/39311571300)

This PR also removes the `typing-extensions` dependency
2025-03-24 13:45:04 -07:00
Eric Gustin
3b8d978e89
Update README (#325)
Without the quotes - `zsh: no matches found: arcade-ai[evals]`
2025-03-24 09:57:58 -07:00
Eric Gustin
04bda3cc45
Google Sheets Tools (#321)
| Name | Description |

|--------------------------|---------------------------------------------------------------------------------------|
| Google.CreateSpreadsheet | Create a new spreadsheet with the provided
title and data in its first sheet |
| Google.GetSpreadsheet | Get the user entered and formatted data for
all sheets in the spreadsheet |
| Google.WriteToCell | Write a value to a single cell in a spreadsheet.
|


## Google.CreateSpreadsheet
This tool can create a new spreadsheet with data in its first sheet
This tool takes in the data as a JSON string. Here's an example input: 
```
// Good at large payloads, sparse payloads, and contiguous data payloads.
// For example data[1]["D"] represents the value of the cell in the first row in the D column
{
  // All data in row 1
  1: {
    "A": 42, 
    "B": 2, 
    "D":"=A1+B1"
  },
  // All data in row 54
  54: {
    "A": "my string",
    "QQ": "my far away string"
  }
}
```
The above data format performed better on evals than the other two that
I tested:
```
// Performed poorly at sparse data and also at larger amounts of data
[
  [42, 2, "", "=A1+B1"], 
  [], 
  [],
  ..., 
  ["A": "my string", "", "", ..., "my far away string"]
]
```
```
// Good at small payloads and sparse payloads, but very bad at payloads with contiguous data
{
  "A1": 42", "B1": 2, "D1": "=A1+B1", "A54": "my string", "QQ": "my far away string"
}
```

## Google.GetSpreadsheet
Gets the formatted values for all non empty cells in all sheets of the
spreadsheet. The data returned is in a similar format as the
`Google.CreateSpreadsheet` tool's `data` input parameter. The difference
is that `get_spreadsheet` will return the user entered value (=A1+B1)
and also the formatted value (23.4) for each cell.

## Google.WriteToCell
Writes to a single cell. At this point in time we do not support batch
updating a sheet.
2025-03-24 09:52:51 -07:00
Eric Gustin
e26f647c3d
Add 'Invalid Renamed Tool Parameter' Check (#324)
Arcade tools can rename parameters like so,

```py
@tool()
def func_with_renamed_param(
    param1: Annotated[str, "MyRenamedParam", "The first parameter"],
):
    pass
```

but there is no check for whether the renamed parameter is a valid
identifier.

Anthropic models, for example, will fail if a renamed parameter is not a
valid identifier (which was the cause for
https://github.com/ArcadeAI/arcade-ai/pull/319).
2025-03-22 09:25:56 -07:00
Renato Byrro
c9ed5ce123
Google Shopping search tool (#317) 2025-03-21 21:09:54 -03:00
Renato Byrro
f6765bed67
Walmart shopping search tools (#320) 2025-03-21 21:02:45 -03:00
Sterling Dreyer
227f02d2fd
Add Notion and Youtube toolkits to worker (#322) 2025-03-21 15:33:21 -07:00