skyvern-llamaindex 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- skyvern_llamaindex-0.0.1/PKG-INFO +197 -0
- skyvern_llamaindex-0.0.1/README.md +184 -0
- skyvern_llamaindex-0.0.1/pyproject.toml +20 -0
- skyvern_llamaindex-0.0.1/skyvern_llamaindex/agent.py +95 -0
- skyvern_llamaindex-0.0.1/skyvern_llamaindex/client.py +146 -0
- skyvern_llamaindex-0.0.1/skyvern_llamaindex/py.typed +0 -0
- skyvern_llamaindex-0.0.1/skyvern_llamaindex/schema.py +18 -0
@@ -0,0 +1,197 @@
|
|
1
|
+
Metadata-Version: 2.1
|
2
|
+
Name: skyvern-llamaindex
|
3
|
+
Version: 0.0.1
|
4
|
+
Summary: Skyvern integration for LlamaIndex
|
5
|
+
Author: lawyzheng
|
6
|
+
Author-email: lawy@skyvern.com
|
7
|
+
Requires-Python: >=3.11,<3.12
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
9
|
+
Classifier: Programming Language :: Python :: 3.11
|
10
|
+
Requires-Dist: llama-index (>=0.12.19,<0.13.0)
|
11
|
+
Requires-Dist: skyvern (>=0.1.56,<0.2.0)
|
12
|
+
Description-Content-Type: text/markdown
|
13
|
+
|
14
|
+
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
15
|
+
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
16
|
+
**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*
|
17
|
+
|
18
|
+
- [Skyvern LlamaIndex](#skyvern-llamaindex)
|
19
|
+
- [Installation](#installation)
|
20
|
+
- [Usage](#usage)
|
21
|
+
- [Run a task(sync) with skyvern agent (calling skyvern agent function directly in the tool)](#run-a-tasksync-with-skyvern-agent-calling-skyvern-agent-function-directly-in-the-tool)
|
22
|
+
- [Run a task(async) with skyvern agent (calling skyvern agent function directly in the tool)](#run-a-taskasync-with-skyvern-agent-calling-skyvern-agent-function-directly-in-the-tool)
|
23
|
+
- [Run a task(sync) with skyvern client (calling skyvern OpenAPI in the tool)](#run-a-tasksync-with-skyvern-client-calling-skyvern-openapi-in-the-tool)
|
24
|
+
- [Run a task(async) with skyvern client (calling skyvern OpenAPI in the tool)](#run-a-taskasync-with-skyvern-client-calling-skyvern-openapi-in-the-tool)
|
25
|
+
|
26
|
+
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
27
|
+
|
28
|
+
# Skyvern LlamaIndex
|
29
|
+
|
30
|
+
This is a LlamaIndex integration for Skyvern.
|
31
|
+
|
32
|
+
## Installation
|
33
|
+
|
34
|
+
```bash
|
35
|
+
pip install skyvern-llamaindex
|
36
|
+
```
|
37
|
+
|
38
|
+
## Usage
|
39
|
+
|
40
|
+
### Run a task(sync) with skyvern agent (calling skyvern agent function directly in the tool)
|
41
|
+
> sync task won't return until the task is finished.
|
42
|
+
|
43
|
+
:warning: :warning: if you want to run this code block, you need to run `skyvern init --openai-api-key <your_openai_api_key>` command in your terminal to set up skyvern first.
|
44
|
+
|
45
|
+
|
46
|
+
```python
|
47
|
+
import asyncio
|
48
|
+
from dotenv import load_dotenv
|
49
|
+
from llama_index.agent.openai import OpenAIAgent
|
50
|
+
from llama_index.llms.openai import OpenAI
|
51
|
+
from skyvern_llamaindex.agent import SkyvernAgentToolSpec
|
52
|
+
|
53
|
+
# load OpenAI API key from .env
|
54
|
+
load_dotenv()
|
55
|
+
|
56
|
+
skyvern_tool = SkyvernAgentToolSpec()
|
57
|
+
|
58
|
+
tools = skyvern_tool.to_tool_list(["run_task_v2"])
|
59
|
+
|
60
|
+
agent = OpenAIAgent.from_tools(
|
61
|
+
tools=tools,
|
62
|
+
llm=OpenAI(model="gpt-4o"),
|
63
|
+
verbose=True,
|
64
|
+
max_function_calls=10,
|
65
|
+
)
|
66
|
+
|
67
|
+
# to run skyvern agent locally, must run `skyvern init` first
|
68
|
+
response = agent.chat("Run the task with skyvern. The task is about 'Navigate to the Hacker News homepage and get the top 3 posts.'")
|
69
|
+
print(response)
|
70
|
+
```
|
71
|
+
|
72
|
+
### Run a task(async) with skyvern agent (calling skyvern agent function directly in the tool)
|
73
|
+
> async task will return immediately and the task will be running in the background. You can use `get_task_v2` tool to poll the task information until the task is finished.
|
74
|
+
|
75
|
+
:warning: :warning: if you want to run this code block, you need to run `skyvern init --openai-api-key <your_openai_api_key>` command in your terminal to set up skyvern first.
|
76
|
+
|
77
|
+
```python
|
78
|
+
import asyncio
|
79
|
+
from dotenv import load_dotenv
|
80
|
+
from llama_index.agent.openai import OpenAIAgent
|
81
|
+
from llama_index.llms.openai import OpenAI
|
82
|
+
from llama_index.core.tools import FunctionTool
|
83
|
+
from skyvern_llamaindex.agent import SkyvernAgentToolSpec
|
84
|
+
|
85
|
+
async def sleep(seconds: int) -> str:
|
86
|
+
await asyncio.sleep(seconds)
|
87
|
+
return f"Slept for {seconds} seconds"
|
88
|
+
|
89
|
+
# load OpenAI API key from .env
|
90
|
+
load_dotenv()
|
91
|
+
|
92
|
+
skyvern_tool = SkyvernAgentToolSpec()
|
93
|
+
|
94
|
+
sleep_tool = FunctionTool.from_defaults(
|
95
|
+
async_fn=sleep,
|
96
|
+
description="Sleep for a given number of seconds",
|
97
|
+
name="sleep",
|
98
|
+
)
|
99
|
+
|
100
|
+
tools = skyvern_tool.to_tool_list(["queue_task_v2", "get_task_v2"])
|
101
|
+
tools.append(sleep_tool)
|
102
|
+
|
103
|
+
agent = OpenAIAgent.from_tools(
|
104
|
+
tools=tools,
|
105
|
+
llm=OpenAI(model="gpt-4o"),
|
106
|
+
verbose=True,
|
107
|
+
max_function_calls=10,
|
108
|
+
)
|
109
|
+
|
110
|
+
response = agent.chat("Queue a task with Skyvern. The task is about 'Navigate to the Hacker News homepage and get the top 3 posts.' Then, get this task information until it's completed. The task information re-get interval should be 60s.")
|
111
|
+
print(response)
|
112
|
+
|
113
|
+
```
|
114
|
+
|
115
|
+
### Run a task(sync) with skyvern client (calling skyvern OpenAPI in the tool)
|
116
|
+
> sync task won't return until the task is finished.
|
117
|
+
|
118
|
+
no need to run `skyvern init` command in your terminal to set up skyvern before using this integration.
|
119
|
+
|
120
|
+
```python
|
121
|
+
import asyncio
|
122
|
+
from dotenv import load_dotenv
|
123
|
+
from llama_index.agent.openai import OpenAIAgent
|
124
|
+
from llama_index.llms.openai import OpenAI
|
125
|
+
from skyvern_llamaindex.client import SkyvernClientToolSpec
|
126
|
+
|
127
|
+
|
128
|
+
async def sleep(seconds: int) -> str:
|
129
|
+
await asyncio.sleep(seconds)
|
130
|
+
return f"Slept for {seconds} seconds"
|
131
|
+
|
132
|
+
# load OpenAI API key from .env
|
133
|
+
load_dotenv()
|
134
|
+
|
135
|
+
skyvern_client_tool = SkyvernClientToolSpec(
|
136
|
+
credential="<your_organization_api_key>",
|
137
|
+
)
|
138
|
+
|
139
|
+
tools = skyvern_client_tool.to_tool_list(["run_task_v2"])
|
140
|
+
|
141
|
+
agent = OpenAIAgent.from_tools(
|
142
|
+
tools=tools,
|
143
|
+
llm=OpenAI(model="gpt-4o"),
|
144
|
+
verbose=True,
|
145
|
+
max_function_calls=10,
|
146
|
+
)
|
147
|
+
|
148
|
+
response = agent.chat("Run the task with skyvern. The task is about 'Navigate to the Hacker News homepage and get the top 3 posts.'")
|
149
|
+
print(response)
|
150
|
+
|
151
|
+
```
|
152
|
+
|
153
|
+
### Run a task(async) with skyvern client (calling skyvern OpenAPI in the tool)
|
154
|
+
> async task will return immediately and the task will be running in the background. You can use `GetSkyvernClientTaskV2Tool` tool to poll the task information until the task is finished.
|
155
|
+
|
156
|
+
no need to run `skyvern init` command in your terminal to set up skyvern before using this integration.
|
157
|
+
|
158
|
+
```python
|
159
|
+
import asyncio
|
160
|
+
from dotenv import load_dotenv
|
161
|
+
from llama_index.agent.openai import OpenAIAgent
|
162
|
+
from llama_index.llms.openai import OpenAI
|
163
|
+
from llama_index.core.tools import FunctionTool
|
164
|
+
from skyvern_llamaindex.client import SkyvernClientToolSpec
|
165
|
+
|
166
|
+
|
167
|
+
async def sleep(seconds: int) -> str:
|
168
|
+
await asyncio.sleep(seconds)
|
169
|
+
return f"Slept for {seconds} seconds"
|
170
|
+
|
171
|
+
# load OpenAI API key from .env
|
172
|
+
load_dotenv()
|
173
|
+
|
174
|
+
skyvern_client_tool = SkyvernClientToolSpec(
|
175
|
+
credential="<your_organization_api_key>",
|
176
|
+
)
|
177
|
+
|
178
|
+
sleep_tool = FunctionTool.from_defaults(
|
179
|
+
async_fn=sleep,
|
180
|
+
description="Sleep for a given number of seconds",
|
181
|
+
name="sleep",
|
182
|
+
)
|
183
|
+
|
184
|
+
tools = skyvern_client_tool.to_tool_list(["queue_task_v2", "get_task_v2"])
|
185
|
+
tools.append(sleep_tool)
|
186
|
+
|
187
|
+
agent = OpenAIAgent.from_tools(
|
188
|
+
tools=tools,
|
189
|
+
llm=OpenAI(model="gpt-4o"),
|
190
|
+
verbose=True,
|
191
|
+
max_function_calls=10,
|
192
|
+
)
|
193
|
+
|
194
|
+
response = agent.chat("Queue a task with Skyvern. The task is about 'Navigate to the Hacker News homepage and get the top 3 posts.' Then, get this task information until it's completed. The task information re-get interval should be 60s.")
|
195
|
+
print(response)
|
196
|
+
|
197
|
+
```
|
@@ -0,0 +1,184 @@
|
|
1
|
+
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
2
|
+
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
3
|
+
**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*
|
4
|
+
|
5
|
+
- [Skyvern LlamaIndex](#skyvern-llamaindex)
|
6
|
+
- [Installation](#installation)
|
7
|
+
- [Usage](#usage)
|
8
|
+
- [Run a task(sync) with skyvern agent (calling skyvern agent function directly in the tool)](#run-a-tasksync-with-skyvern-agent-calling-skyvern-agent-function-directly-in-the-tool)
|
9
|
+
- [Run a task(async) with skyvern agent (calling skyvern agent function directly in the tool)](#run-a-taskasync-with-skyvern-agent-calling-skyvern-agent-function-directly-in-the-tool)
|
10
|
+
- [Run a task(sync) with skyvern client (calling skyvern OpenAPI in the tool)](#run-a-tasksync-with-skyvern-client-calling-skyvern-openapi-in-the-tool)
|
11
|
+
- [Run a task(async) with skyvern client (calling skyvern OpenAPI in the tool)](#run-a-taskasync-with-skyvern-client-calling-skyvern-openapi-in-the-tool)
|
12
|
+
|
13
|
+
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
14
|
+
|
15
|
+
# Skyvern LlamaIndex
|
16
|
+
|
17
|
+
This is a LlamaIndex integration for Skyvern.
|
18
|
+
|
19
|
+
## Installation
|
20
|
+
|
21
|
+
```bash
|
22
|
+
pip install skyvern-llamaindex
|
23
|
+
```
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
### Run a task(sync) with skyvern agent (calling skyvern agent function directly in the tool)
|
28
|
+
> sync task won't return until the task is finished.
|
29
|
+
|
30
|
+
:warning: :warning: if you want to run this code block, you need to run `skyvern init --openai-api-key <your_openai_api_key>` command in your terminal to set up skyvern first.
|
31
|
+
|
32
|
+
|
33
|
+
```python
|
34
|
+
import asyncio
|
35
|
+
from dotenv import load_dotenv
|
36
|
+
from llama_index.agent.openai import OpenAIAgent
|
37
|
+
from llama_index.llms.openai import OpenAI
|
38
|
+
from skyvern_llamaindex.agent import SkyvernAgentToolSpec
|
39
|
+
|
40
|
+
# load OpenAI API key from .env
|
41
|
+
load_dotenv()
|
42
|
+
|
43
|
+
skyvern_tool = SkyvernAgentToolSpec()
|
44
|
+
|
45
|
+
tools = skyvern_tool.to_tool_list(["run_task_v2"])
|
46
|
+
|
47
|
+
agent = OpenAIAgent.from_tools(
|
48
|
+
tools=tools,
|
49
|
+
llm=OpenAI(model="gpt-4o"),
|
50
|
+
verbose=True,
|
51
|
+
max_function_calls=10,
|
52
|
+
)
|
53
|
+
|
54
|
+
# to run skyvern agent locally, must run `skyvern init` first
|
55
|
+
response = agent.chat("Run the task with skyvern. The task is about 'Navigate to the Hacker News homepage and get the top 3 posts.'")
|
56
|
+
print(response)
|
57
|
+
```
|
58
|
+
|
59
|
+
### Run a task(async) with skyvern agent (calling skyvern agent function directly in the tool)
|
60
|
+
> async task will return immediately and the task will be running in the background. You can use `get_task_v2` tool to poll the task information until the task is finished.
|
61
|
+
|
62
|
+
:warning: :warning: if you want to run this code block, you need to run `skyvern init --openai-api-key <your_openai_api_key>` command in your terminal to set up skyvern first.
|
63
|
+
|
64
|
+
```python
|
65
|
+
import asyncio
|
66
|
+
from dotenv import load_dotenv
|
67
|
+
from llama_index.agent.openai import OpenAIAgent
|
68
|
+
from llama_index.llms.openai import OpenAI
|
69
|
+
from llama_index.core.tools import FunctionTool
|
70
|
+
from skyvern_llamaindex.agent import SkyvernAgentToolSpec
|
71
|
+
|
72
|
+
async def sleep(seconds: int) -> str:
|
73
|
+
await asyncio.sleep(seconds)
|
74
|
+
return f"Slept for {seconds} seconds"
|
75
|
+
|
76
|
+
# load OpenAI API key from .env
|
77
|
+
load_dotenv()
|
78
|
+
|
79
|
+
skyvern_tool = SkyvernAgentToolSpec()
|
80
|
+
|
81
|
+
sleep_tool = FunctionTool.from_defaults(
|
82
|
+
async_fn=sleep,
|
83
|
+
description="Sleep for a given number of seconds",
|
84
|
+
name="sleep",
|
85
|
+
)
|
86
|
+
|
87
|
+
tools = skyvern_tool.to_tool_list(["queue_task_v2", "get_task_v2"])
|
88
|
+
tools.append(sleep_tool)
|
89
|
+
|
90
|
+
agent = OpenAIAgent.from_tools(
|
91
|
+
tools=tools,
|
92
|
+
llm=OpenAI(model="gpt-4o"),
|
93
|
+
verbose=True,
|
94
|
+
max_function_calls=10,
|
95
|
+
)
|
96
|
+
|
97
|
+
response = agent.chat("Queue a task with Skyvern. The task is about 'Navigate to the Hacker News homepage and get the top 3 posts.' Then, get this task information until it's completed. The task information re-get interval should be 60s.")
|
98
|
+
print(response)
|
99
|
+
|
100
|
+
```
|
101
|
+
|
102
|
+
### Run a task(sync) with skyvern client (calling skyvern OpenAPI in the tool)
|
103
|
+
> sync task won't return until the task is finished.
|
104
|
+
|
105
|
+
no need to run `skyvern init` command in your terminal to set up skyvern before using this integration.
|
106
|
+
|
107
|
+
```python
|
108
|
+
import asyncio
|
109
|
+
from dotenv import load_dotenv
|
110
|
+
from llama_index.agent.openai import OpenAIAgent
|
111
|
+
from llama_index.llms.openai import OpenAI
|
112
|
+
from skyvern_llamaindex.client import SkyvernClientToolSpec
|
113
|
+
|
114
|
+
|
115
|
+
async def sleep(seconds: int) -> str:
|
116
|
+
await asyncio.sleep(seconds)
|
117
|
+
return f"Slept for {seconds} seconds"
|
118
|
+
|
119
|
+
# load OpenAI API key from .env
|
120
|
+
load_dotenv()
|
121
|
+
|
122
|
+
skyvern_client_tool = SkyvernClientToolSpec(
|
123
|
+
credential="<your_organization_api_key>",
|
124
|
+
)
|
125
|
+
|
126
|
+
tools = skyvern_client_tool.to_tool_list(["run_task_v2"])
|
127
|
+
|
128
|
+
agent = OpenAIAgent.from_tools(
|
129
|
+
tools=tools,
|
130
|
+
llm=OpenAI(model="gpt-4o"),
|
131
|
+
verbose=True,
|
132
|
+
max_function_calls=10,
|
133
|
+
)
|
134
|
+
|
135
|
+
response = agent.chat("Run the task with skyvern. The task is about 'Navigate to the Hacker News homepage and get the top 3 posts.'")
|
136
|
+
print(response)
|
137
|
+
|
138
|
+
```
|
139
|
+
|
140
|
+
### Run a task(async) with skyvern client (calling skyvern OpenAPI in the tool)
|
141
|
+
> async task will return immediately and the task will be running in the background. You can use `GetSkyvernClientTaskV2Tool` tool to poll the task information until the task is finished.
|
142
|
+
|
143
|
+
no need to run `skyvern init` command in your terminal to set up skyvern before using this integration.
|
144
|
+
|
145
|
+
```python
|
146
|
+
import asyncio
|
147
|
+
from dotenv import load_dotenv
|
148
|
+
from llama_index.agent.openai import OpenAIAgent
|
149
|
+
from llama_index.llms.openai import OpenAI
|
150
|
+
from llama_index.core.tools import FunctionTool
|
151
|
+
from skyvern_llamaindex.client import SkyvernClientToolSpec
|
152
|
+
|
153
|
+
|
154
|
+
async def sleep(seconds: int) -> str:
|
155
|
+
await asyncio.sleep(seconds)
|
156
|
+
return f"Slept for {seconds} seconds"
|
157
|
+
|
158
|
+
# load OpenAI API key from .env
|
159
|
+
load_dotenv()
|
160
|
+
|
161
|
+
skyvern_client_tool = SkyvernClientToolSpec(
|
162
|
+
credential="<your_organization_api_key>",
|
163
|
+
)
|
164
|
+
|
165
|
+
sleep_tool = FunctionTool.from_defaults(
|
166
|
+
async_fn=sleep,
|
167
|
+
description="Sleep for a given number of seconds",
|
168
|
+
name="sleep",
|
169
|
+
)
|
170
|
+
|
171
|
+
tools = skyvern_client_tool.to_tool_list(["queue_task_v2", "get_task_v2"])
|
172
|
+
tools.append(sleep_tool)
|
173
|
+
|
174
|
+
agent = OpenAIAgent.from_tools(
|
175
|
+
tools=tools,
|
176
|
+
llm=OpenAI(model="gpt-4o"),
|
177
|
+
verbose=True,
|
178
|
+
max_function_calls=10,
|
179
|
+
)
|
180
|
+
|
181
|
+
response = agent.chat("Queue a task with Skyvern. The task is about 'Navigate to the Hacker News homepage and get the top 3 posts.' Then, get this task information until it's completed. The task information re-get interval should be 60s.")
|
182
|
+
print(response)
|
183
|
+
|
184
|
+
```
|
@@ -0,0 +1,20 @@
|
|
1
|
+
[tool.poetry]
|
2
|
+
name = "skyvern-llamaindex"
|
3
|
+
version = "0.0.1"
|
4
|
+
description = "Skyvern integration for LlamaIndex"
|
5
|
+
authors = ["lawyzheng <lawy@skyvern.com>"]
|
6
|
+
packages = [{ include = "skyvern_llamaindex" }]
|
7
|
+
readme = "README.md"
|
8
|
+
|
9
|
+
[tool.poetry.dependencies]
|
10
|
+
python = "^3.11,<3.12"
|
11
|
+
skyvern = "^0.1.56"
|
12
|
+
llama-index = "^0.12.19"
|
13
|
+
|
14
|
+
|
15
|
+
[tool.poetry.group.dev.dependencies]
|
16
|
+
twine = "^6.1.0"
|
17
|
+
|
18
|
+
[build-system]
|
19
|
+
requires = ["poetry-core"]
|
20
|
+
build-backend = "poetry.core.masonry.api"
|
@@ -0,0 +1,95 @@
|
|
1
|
+
from typing import Any, Dict, List, Tuple
|
2
|
+
|
3
|
+
from llama_index.core.tools.tool_spec.base import SPEC_FUNCTION_TYPE, BaseToolSpec
|
4
|
+
from llama_index.core.tools.types import ToolMetadata
|
5
|
+
from skyvern_llamaindex.schema import GetTaskInput, TaskV1Request, TaskV2Request
|
6
|
+
|
7
|
+
from skyvern.agent import Agent
|
8
|
+
from skyvern.forge.sdk.schemas.observers import ObserverTask
|
9
|
+
from skyvern.forge.sdk.schemas.tasks import CreateTaskResponse, TaskResponse
|
10
|
+
|
11
|
+
|
12
|
+
class SkyvernAgentToolSpec(BaseToolSpec):
|
13
|
+
spec_functions: List[SPEC_FUNCTION_TYPE] = [
|
14
|
+
"run_task_v1",
|
15
|
+
"queue_task_v1",
|
16
|
+
"get_task_v1",
|
17
|
+
"run_task_v2",
|
18
|
+
"queue_task_v2",
|
19
|
+
"get_task_v2",
|
20
|
+
]
|
21
|
+
spec_metadata: Dict[str, ToolMetadata] = {
|
22
|
+
"run_task_v1": ToolMetadata(
|
23
|
+
name="run-skyvern-agent-task-v1",
|
24
|
+
description="Use Skyvern agent to run a v1 task. It is usually used for the simple tasks. This function won't return until the task is finished.",
|
25
|
+
fn_schema=TaskV1Request,
|
26
|
+
),
|
27
|
+
"queue_task_v1": ToolMetadata(
|
28
|
+
name="queue-skyvern-agent-task-v1",
|
29
|
+
description="Use Skyvern agent to queue a v1 task. It is usually used for the simple tasks. This function will return immediately and the task will be running in the background.",
|
30
|
+
fn_schema=TaskV1Request,
|
31
|
+
),
|
32
|
+
"get_task_v1": ToolMetadata(
|
33
|
+
name="get-skyvern-agent-task-v1",
|
34
|
+
description="Use Skyvern agent to get a v1 task. v1 tasks are usually simple tasks.",
|
35
|
+
fn_schema=GetTaskInput,
|
36
|
+
),
|
37
|
+
"run_task_v2": ToolMetadata(
|
38
|
+
name="run-skyvern-agent-task-v2",
|
39
|
+
description="Use Skyvern agent to run a v2 task. It is usually used for the complicated tasks. This function won't return until the task is finished.",
|
40
|
+
fn_schema=TaskV2Request,
|
41
|
+
),
|
42
|
+
"queue_task_v2": ToolMetadata(
|
43
|
+
name="queue-skyvern-agent-task-v2",
|
44
|
+
description="Use Skyvern agent to queue a v2 task. It is usually used for the complicated tasks. This function will return immediately and the task will be running in the background.",
|
45
|
+
fn_schema=TaskV2Request,
|
46
|
+
),
|
47
|
+
"get_task_v2": ToolMetadata(
|
48
|
+
name="get-skyvern-agent-task-v2",
|
49
|
+
description="Use Skyvern agent to get a v2 task. v2 tasks are usually complicated tasks.",
|
50
|
+
fn_schema=GetTaskInput,
|
51
|
+
),
|
52
|
+
}
|
53
|
+
|
54
|
+
def __init__(self) -> None:
|
55
|
+
self.agent = Agent()
|
56
|
+
|
57
|
+
def get_metadata_from_fn_name(
|
58
|
+
self, fn_name: str, spec_functions: List[str | Tuple[str, str]] | None = None
|
59
|
+
) -> ToolMetadata | None:
|
60
|
+
try:
|
61
|
+
getattr(self, fn_name)
|
62
|
+
except AttributeError:
|
63
|
+
return None
|
64
|
+
|
65
|
+
return self.spec_metadata.get(fn_name)
|
66
|
+
|
67
|
+
async def run_task_v1(self, **kwargs: Dict[str, Any]) -> TaskResponse:
|
68
|
+
"""Use Skyvern agent to run a v1 task. It is usually used for the simple tasks. This function won't return until the task is finished."""
|
69
|
+
task_request = TaskV1Request(**kwargs)
|
70
|
+
return await self.agent.run_task(task_request=task_request, timeout_seconds=task_request.timeout_seconds)
|
71
|
+
|
72
|
+
async def queue_task_v1(self, **kwargs: Dict[str, Any]) -> CreateTaskResponse:
|
73
|
+
"""Use Skyvern agent to queue a v1 task. It is usually used for the simple tasks. This function will return immediately and the task will be running in the background."""
|
74
|
+
task_request = TaskV1Request(**kwargs)
|
75
|
+
return await self.agent.create_task(task_request=task_request)
|
76
|
+
|
77
|
+
async def get_task_v1(self, task_id: str) -> TaskResponse | None:
|
78
|
+
"""Use Skyvern agent to get a v1 task. v1 tasks are usually simple tasks."""
|
79
|
+
return await self.agent.get_task(task_id=task_id)
|
80
|
+
|
81
|
+
async def run_task_v2(self, **kwargs: Dict[str, Any]) -> ObserverTask:
|
82
|
+
"""Use Skyvern agent to run a v2 task. It is usually used for the complicated tasks. This function won't return until the task is finished."""
|
83
|
+
task_request = TaskV2Request(**kwargs)
|
84
|
+
return await self.agent.run_observer_task_v_2(
|
85
|
+
task_request=task_request, timeout_seconds=task_request.timeout_seconds
|
86
|
+
)
|
87
|
+
|
88
|
+
async def queue_task_v2(self, **kwargs: Dict[str, Any]) -> ObserverTask:
|
89
|
+
"""Use Skyvern agent to queue a v2 task. It is usually used for the complicated tasks. This function will return immediately and the task will be running in the background."""
|
90
|
+
task_request = TaskV2Request(**kwargs)
|
91
|
+
return await self.agent.observer_task_v_2(task_request=task_request)
|
92
|
+
|
93
|
+
async def get_task_v2(self, task_id: str) -> ObserverTask | None:
|
94
|
+
"""Use Skyvern agent to get a v2 task. v2 tasks are usually complicated tasks."""
|
95
|
+
return await self.agent.get_observer_task_v_2(task_id=task_id)
|
@@ -0,0 +1,146 @@
|
|
1
|
+
from typing import Any, Dict, List, Tuple
|
2
|
+
|
3
|
+
from httpx import AsyncClient
|
4
|
+
from llama_index.core.tools.tool_spec.base import SPEC_FUNCTION_TYPE, BaseToolSpec
|
5
|
+
from llama_index.core.tools.types import ToolMetadata
|
6
|
+
from skyvern_llamaindex.schema import GetTaskInput, TaskV1Request, TaskV2Request
|
7
|
+
|
8
|
+
from skyvern.client import AsyncSkyvern
|
9
|
+
from skyvern.forge.sdk.schemas.tasks import CreateTaskResponse, TaskResponse
|
10
|
+
|
11
|
+
|
12
|
+
class SkyvernClientToolSpec(BaseToolSpec):
|
13
|
+
spec_functions: List[SPEC_FUNCTION_TYPE] = [
|
14
|
+
"run_task_v1",
|
15
|
+
"queue_task_v1",
|
16
|
+
"get_task_v1",
|
17
|
+
"run_task_v2",
|
18
|
+
"queue_task_v2",
|
19
|
+
"get_task_v2",
|
20
|
+
]
|
21
|
+
|
22
|
+
spec_metadata: Dict[str, ToolMetadata] = {
|
23
|
+
"run_task_v1": ToolMetadata(
|
24
|
+
name="run-skyvern-client-task-v1",
|
25
|
+
description="Use Skyvern client to run a v1 task. It is usually used for the simple tasks. This function won't return until the task is finished.",
|
26
|
+
fn_schema=TaskV1Request,
|
27
|
+
),
|
28
|
+
"queue_task_v1": ToolMetadata(
|
29
|
+
name="queue-skyvern-client-task-v1",
|
30
|
+
description="Use Skyvern client to queue a v1 task. It is usually used for the simple tasks. This function will return immediately and the task will be running in the background.",
|
31
|
+
fn_schema=TaskV1Request,
|
32
|
+
),
|
33
|
+
"get_task_v1": ToolMetadata(
|
34
|
+
name="get-skyvern-client-task-v1",
|
35
|
+
description="Use Skyvern client to get a v1 task. v1 tasks are usually simple tasks.",
|
36
|
+
fn_schema=GetTaskInput,
|
37
|
+
),
|
38
|
+
"run_task_v2": ToolMetadata(
|
39
|
+
name="run-skyvern-client-task-v2",
|
40
|
+
description="Use Skyvern client to run a v2 task. It is usually used for the complicated tasks. This function won't return until the task is finished.",
|
41
|
+
fn_schema=TaskV2Request,
|
42
|
+
),
|
43
|
+
"queue_task_v2": ToolMetadata(
|
44
|
+
name="queue-skyvern-client-task-v2",
|
45
|
+
description="Use Skyvern client to queue a v2 task. It is usually used for the complicated tasks. This function will return immediately and the task will be running in the background.",
|
46
|
+
fn_schema=TaskV2Request,
|
47
|
+
),
|
48
|
+
"get_task_v2": ToolMetadata(
|
49
|
+
name="get-skyvern-client-task-v2",
|
50
|
+
description="Use Skyvern client to get a v2 task. It is usually used for the complicated tasks.",
|
51
|
+
fn_schema=GetTaskInput,
|
52
|
+
),
|
53
|
+
}
|
54
|
+
|
55
|
+
def __init__(self, credential: str, base_url: str = "https://api.skyvern.com"):
|
56
|
+
httpx_client = AsyncClient(
|
57
|
+
headers={
|
58
|
+
"Content-Type": "application/json",
|
59
|
+
"x-api-key": credential,
|
60
|
+
},
|
61
|
+
)
|
62
|
+
self.client = AsyncSkyvern(base_url=base_url, httpx_client=httpx_client)
|
63
|
+
|
64
|
+
def get_metadata_from_fn_name(
|
65
|
+
self, fn_name: str, spec_functions: List[str | Tuple[str, str]] | None = None
|
66
|
+
) -> ToolMetadata | None:
|
67
|
+
try:
|
68
|
+
getattr(self, fn_name)
|
69
|
+
except AttributeError:
|
70
|
+
return None
|
71
|
+
|
72
|
+
return self.spec_metadata.get(fn_name)
|
73
|
+
|
74
|
+
async def run_task_v1(self, **kwargs: Dict[str, Any]) -> TaskResponse:
|
75
|
+
task_request = TaskV1Request(**kwargs)
|
76
|
+
return await self.client.agent.run_task(
|
77
|
+
max_steps_override=task_request.max_steps,
|
78
|
+
timeout_seconds=task_request.timeout_seconds,
|
79
|
+
url=task_request.url,
|
80
|
+
title=task_request.title,
|
81
|
+
webhook_callback_url=task_request.webhook_callback_url,
|
82
|
+
totp_verification_url=task_request.totp_verification_url,
|
83
|
+
totp_identifier=task_request.totp_identifier,
|
84
|
+
navigation_goal=task_request.navigation_goal,
|
85
|
+
data_extraction_goal=task_request.data_extraction_goal,
|
86
|
+
navigation_payload=task_request.navigation_goal,
|
87
|
+
error_code_mapping=task_request.error_code_mapping,
|
88
|
+
proxy_location=task_request.proxy_location,
|
89
|
+
extracted_information_schema=task_request.extracted_information_schema,
|
90
|
+
complete_criterion=task_request.complete_criterion,
|
91
|
+
terminate_criterion=task_request.terminate_criterion,
|
92
|
+
browser_session_id=task_request.browser_session_id,
|
93
|
+
)
|
94
|
+
|
95
|
+
async def queue_task_v1(self, **kwargs: Dict[str, Any]) -> CreateTaskResponse:
|
96
|
+
task_request = TaskV1Request(**kwargs)
|
97
|
+
return await self.client.agent.create_task(
|
98
|
+
max_steps_override=task_request.max_steps,
|
99
|
+
url=task_request.url,
|
100
|
+
title=task_request.title,
|
101
|
+
webhook_callback_url=task_request.webhook_callback_url,
|
102
|
+
totp_verification_url=task_request.totp_verification_url,
|
103
|
+
totp_identifier=task_request.totp_identifier,
|
104
|
+
navigation_goal=task_request.navigation_goal,
|
105
|
+
data_extraction_goal=task_request.data_extraction_goal,
|
106
|
+
navigation_payload=task_request.navigation_goal,
|
107
|
+
error_code_mapping=task_request.error_code_mapping,
|
108
|
+
proxy_location=task_request.proxy_location,
|
109
|
+
extracted_information_schema=task_request.extracted_information_schema,
|
110
|
+
complete_criterion=task_request.complete_criterion,
|
111
|
+
terminate_criterion=task_request.terminate_criterion,
|
112
|
+
browser_session_id=task_request.browser_session_id,
|
113
|
+
)
|
114
|
+
|
115
|
+
async def get_task_v1(self, task_id: str) -> TaskResponse:
|
116
|
+
return await self.client.agent.get_task(task_id=task_id)
|
117
|
+
|
118
|
+
async def run_task_v2(self, **kwargs: Dict[str, Any]) -> Dict[str, Any | None]:
|
119
|
+
task_request = TaskV2Request(**kwargs)
|
120
|
+
return await self.client.agent.run_observer_task_v_2(
|
121
|
+
max_iterations_override=task_request.max_iterations,
|
122
|
+
timeout_seconds=task_request.timeout_seconds,
|
123
|
+
user_prompt=task_request.user_prompt,
|
124
|
+
url=task_request.url,
|
125
|
+
browser_session_id=task_request.browser_session_id,
|
126
|
+
webhook_callback_url=task_request.webhook_callback_url,
|
127
|
+
totp_verification_url=task_request.totp_verification_url,
|
128
|
+
totp_identifier=task_request.totp_identifier,
|
129
|
+
proxy_location=task_request.proxy_location,
|
130
|
+
)
|
131
|
+
|
132
|
+
async def queue_task_v2(self, **kwargs: Dict[str, Any]) -> Dict[str, Any | None]:
|
133
|
+
task_request = TaskV2Request(**kwargs)
|
134
|
+
return await self.client.agent.observer_task_v_2(
|
135
|
+
max_iterations_override=task_request.max_iterations,
|
136
|
+
user_prompt=task_request.user_prompt,
|
137
|
+
url=task_request.url,
|
138
|
+
browser_session_id=task_request.browser_session_id,
|
139
|
+
webhook_callback_url=task_request.webhook_callback_url,
|
140
|
+
totp_verification_url=task_request.totp_verification_url,
|
141
|
+
totp_identifier=task_request.totp_identifier,
|
142
|
+
proxy_location=task_request.proxy_location,
|
143
|
+
)
|
144
|
+
|
145
|
+
async def get_task_v2(self, task_id: str) -> Dict[str, Any | None]:
|
146
|
+
return await self.client.agent.get_observer_task_v_2(task_id=task_id)
|
File without changes
|
@@ -0,0 +1,18 @@
|
|
1
|
+
from pydantic import BaseModel
|
2
|
+
|
3
|
+
from skyvern.forge.sdk.schemas.observers import ObserverTaskRequest
|
4
|
+
from skyvern.forge.sdk.schemas.tasks import TaskRequest
|
5
|
+
|
6
|
+
|
7
|
+
class TaskV1Request(TaskRequest):
|
8
|
+
max_steps: int = 10
|
9
|
+
timeout_seconds: int = 60 * 60
|
10
|
+
|
11
|
+
|
12
|
+
class TaskV2Request(ObserverTaskRequest):
|
13
|
+
max_iterations: int = 10
|
14
|
+
timeout_seconds: int = 60 * 60
|
15
|
+
|
16
|
+
|
17
|
+
class GetTaskInput(BaseModel):
|
18
|
+
task_id: str
|