skyvern-llamaindex 0.0.1__py3-none-any.whl

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.
@@ -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
@@ -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,7 @@
1
+ skyvern_llamaindex/agent.py,sha256=x1Hg19Pw3Y6NuOWR8FcylJClzcqL-cyysx9Mon2R-a0,4815
2
+ skyvern_llamaindex/client.py,sha256=ZVKQR7trdrutRZlSDkouWIkW-FUaObAE3ewMUdKFt3g,6996
3
+ skyvern_llamaindex/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ skyvern_llamaindex/schema.py,sha256=tTvnSC-ms_tW8bnzIn6FXPOCngom7l62B-IyhIwvRxQ,409
5
+ skyvern_llamaindex-0.0.1.dist-info/METADATA,sha256=yblp6nsXM5AR8C1NxjicYXCXrL8FHYgSRIvPWYGgIo0,6757
6
+ skyvern_llamaindex-0.0.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
7
+ skyvern_llamaindex-0.0.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: poetry-core 1.9.1
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any