asteroid-odyssey 1.3.0__py3-none-any.whl → 1.3.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.
@@ -7,9 +7,13 @@ from .client import (
7
7
  wait_for_execution_result,
8
8
  upload_execution_files,
9
9
  get_browser_session_recording,
10
+ get_last_n_execution_activities,
11
+ add_message_to_execution,
12
+ wait_for_agent_interaction,
10
13
  AsteroidAPIError,
11
14
  ExecutionError,
12
- TimeoutError
15
+ TimeoutError,
16
+ AgentInteractionResult
13
17
  )
14
18
  from .agents_v1_gen import ExecutionResult
15
19
 
@@ -22,8 +26,12 @@ __all__ = [
22
26
  'wait_for_execution_result',
23
27
  'upload_execution_files',
24
28
  'get_browser_session_recording',
29
+ 'get_last_n_execution_activities',
30
+ 'add_message_to_execution',
31
+ 'wait_for_agent_interaction',
25
32
  'AsteroidAPIError',
26
33
  'ExecutionError',
27
34
  'TimeoutError',
35
+ 'AgentInteractionResult',
28
36
  'ExecutionResult'
29
37
  ]
@@ -32,6 +32,7 @@ __all__ = [
32
32
  "ApiException",
33
33
  "AgentProfile",
34
34
  "BrowserSessionRecordingResponse",
35
+ "Cookie",
35
36
  "CountryCode",
36
37
  "CreateAgentProfileRequest",
37
38
  "Credential",
@@ -69,6 +70,7 @@ from asteroid_odyssey.agents_v1_gen.exceptions import ApiException as ApiExcepti
69
70
  # import models into sdk package
70
71
  from asteroid_odyssey.agents_v1_gen.models.agent_profile import AgentProfile as AgentProfile
71
72
  from asteroid_odyssey.agents_v1_gen.models.browser_session_recording_response import BrowserSessionRecordingResponse as BrowserSessionRecordingResponse
73
+ from asteroid_odyssey.agents_v1_gen.models.cookie import Cookie as Cookie
72
74
  from asteroid_odyssey.agents_v1_gen.models.country_code import CountryCode as CountryCode
73
75
  from asteroid_odyssey.agents_v1_gen.models.create_agent_profile_request import CreateAgentProfileRequest as CreateAgentProfileRequest
74
76
  from asteroid_odyssey.agents_v1_gen.models.credential import Credential as Credential
@@ -16,6 +16,7 @@
16
16
  # import models into model package
17
17
  from asteroid_odyssey.agents_v1_gen.models.agent_profile import AgentProfile
18
18
  from asteroid_odyssey.agents_v1_gen.models.browser_session_recording_response import BrowserSessionRecordingResponse
19
+ from asteroid_odyssey.agents_v1_gen.models.cookie import Cookie
19
20
  from asteroid_odyssey.agents_v1_gen.models.country_code import CountryCode
20
21
  from asteroid_odyssey.agents_v1_gen.models.create_agent_profile_request import CreateAgentProfileRequest
21
22
  from asteroid_odyssey.agents_v1_gen.models.credential import Credential
@@ -20,6 +20,7 @@ import json
20
20
  from datetime import datetime
21
21
  from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictStr
22
22
  from typing import Any, ClassVar, Dict, List
23
+ from asteroid_odyssey.agents_v1_gen.models.cookie import Cookie
23
24
  from asteroid_odyssey.agents_v1_gen.models.country_code import CountryCode
24
25
  from asteroid_odyssey.agents_v1_gen.models.credential import Credential
25
26
  from asteroid_odyssey.agents_v1_gen.models.proxy_type import ProxyType
@@ -39,9 +40,10 @@ class AgentProfile(BaseModel):
39
40
  captcha_solver_active: StrictBool = Field(description="Whether the captcha solver is active for this profile")
40
41
  sticky_ip: StrictBool = Field(description="Whether the same IP address should be used for all executions of this profile")
41
42
  credentials: List[Credential] = Field(description="List of credentials associated with this agent profile")
43
+ cookies: List[Cookie] = Field(description="List of cookies associated with this agent profile")
42
44
  created_at: datetime = Field(description="The date and time the agent profile was created")
43
45
  updated_at: datetime = Field(description="The last update time of the agent profile")
44
- __properties: ClassVar[List[str]] = ["id", "name", "description", "organization_id", "proxy_cc", "proxy_type", "captcha_solver_active", "sticky_ip", "credentials", "created_at", "updated_at"]
46
+ __properties: ClassVar[List[str]] = ["id", "name", "description", "organization_id", "proxy_cc", "proxy_type", "captcha_solver_active", "sticky_ip", "credentials", "cookies", "created_at", "updated_at"]
45
47
 
46
48
  model_config = ConfigDict(
47
49
  populate_by_name=True,
@@ -89,6 +91,13 @@ class AgentProfile(BaseModel):
89
91
  if _item_credentials:
90
92
  _items.append(_item_credentials.to_dict())
91
93
  _dict['credentials'] = _items
94
+ # override the default output from pydantic by calling `to_dict()` of each item in cookies (list)
95
+ _items = []
96
+ if self.cookies:
97
+ for _item_cookies in self.cookies:
98
+ if _item_cookies:
99
+ _items.append(_item_cookies.to_dict())
100
+ _dict['cookies'] = _items
92
101
  return _dict
93
102
 
94
103
  @classmethod
@@ -110,6 +119,7 @@ class AgentProfile(BaseModel):
110
119
  "captcha_solver_active": obj.get("captcha_solver_active"),
111
120
  "sticky_ip": obj.get("sticky_ip"),
112
121
  "credentials": [Credential.from_dict(_item) for _item in obj["credentials"]] if obj.get("credentials") is not None else None,
122
+ "cookies": [Cookie.from_dict(_item) for _item in obj["cookies"]] if obj.get("cookies") is not None else None,
113
123
  "created_at": obj.get("created_at"),
114
124
  "updated_at": obj.get("updated_at")
115
125
  })
@@ -0,0 +1,113 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Asteroid Agents API
5
+
6
+ Version 1 of the Asteroid Agents API
7
+
8
+ The version of the OpenAPI document: v1.0.0
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from datetime import datetime
21
+ from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictStr, field_validator
22
+ from typing import Any, ClassVar, Dict, List, Optional
23
+ from typing import Optional, Set
24
+ from typing_extensions import Self
25
+
26
+ class Cookie(BaseModel):
27
+ """
28
+ Cookie
29
+ """ # noqa: E501
30
+ id: Optional[StrictStr] = Field(default=None, description="Unique identifier for the cookie")
31
+ name: StrictStr = Field(description="Display name for the cookie")
32
+ key: StrictStr = Field(description="The cookie name/key")
33
+ value: StrictStr = Field(description="The cookie value")
34
+ expiry: Optional[datetime] = Field(default=None, description="When the cookie expires (optional)")
35
+ domain: StrictStr = Field(description="The domain for which the cookie is valid")
36
+ secure: StrictBool = Field(description="Whether the cookie should only be sent over HTTPS")
37
+ same_site: StrictStr = Field(description="SameSite attribute for the cookie")
38
+ http_only: StrictBool = Field(description="Whether the cookie should be accessible only via HTTP(S)")
39
+ created_at: datetime = Field(description="When the cookie was created")
40
+ __properties: ClassVar[List[str]] = ["id", "name", "key", "value", "expiry", "domain", "secure", "same_site", "http_only", "created_at"]
41
+
42
+ @field_validator('same_site')
43
+ def same_site_validate_enum(cls, value):
44
+ """Validates the enum"""
45
+ if value not in set(['Strict', 'Lax', 'None']):
46
+ raise ValueError("must be one of enum values ('Strict', 'Lax', 'None')")
47
+ return value
48
+
49
+ model_config = ConfigDict(
50
+ populate_by_name=True,
51
+ validate_assignment=True,
52
+ protected_namespaces=(),
53
+ )
54
+
55
+
56
+ def to_str(self) -> str:
57
+ """Returns the string representation of the model using alias"""
58
+ return pprint.pformat(self.model_dump(by_alias=True))
59
+
60
+ def to_json(self) -> str:
61
+ """Returns the JSON representation of the model using alias"""
62
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
63
+ return json.dumps(self.to_dict())
64
+
65
+ @classmethod
66
+ def from_json(cls, json_str: str) -> Optional[Self]:
67
+ """Create an instance of Cookie from a JSON string"""
68
+ return cls.from_dict(json.loads(json_str))
69
+
70
+ def to_dict(self) -> Dict[str, Any]:
71
+ """Return the dictionary representation of the model using alias.
72
+
73
+ This has the following differences from calling pydantic's
74
+ `self.model_dump(by_alias=True)`:
75
+
76
+ * `None` is only added to the output dict for nullable fields that
77
+ were set at model initialization. Other fields with value `None`
78
+ are ignored.
79
+ """
80
+ excluded_fields: Set[str] = set([
81
+ ])
82
+
83
+ _dict = self.model_dump(
84
+ by_alias=True,
85
+ exclude=excluded_fields,
86
+ exclude_none=True,
87
+ )
88
+ return _dict
89
+
90
+ @classmethod
91
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
92
+ """Create an instance of Cookie from a dict"""
93
+ if obj is None:
94
+ return None
95
+
96
+ if not isinstance(obj, dict):
97
+ return cls.model_validate(obj)
98
+
99
+ _obj = cls.model_validate({
100
+ "id": obj.get("id"),
101
+ "name": obj.get("name"),
102
+ "key": obj.get("key"),
103
+ "value": obj.get("value"),
104
+ "expiry": obj.get("expiry"),
105
+ "domain": obj.get("domain"),
106
+ "secure": obj.get("secure"),
107
+ "same_site": obj.get("same_site"),
108
+ "http_only": obj.get("http_only"),
109
+ "created_at": obj.get("created_at")
110
+ })
111
+ return _obj
112
+
113
+
@@ -20,6 +20,7 @@ import json
20
20
  from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictStr
21
21
  from typing import Any, ClassVar, Dict, List
22
22
  from typing_extensions import Annotated
23
+ from asteroid_odyssey.agents_v1_gen.models.cookie import Cookie
23
24
  from asteroid_odyssey.agents_v1_gen.models.country_code import CountryCode
24
25
  from asteroid_odyssey.agents_v1_gen.models.credential import Credential
25
26
  from asteroid_odyssey.agents_v1_gen.models.proxy_type import ProxyType
@@ -38,7 +39,8 @@ class CreateAgentProfileRequest(BaseModel):
38
39
  captcha_solver_active: StrictBool = Field(description="Whether the captcha solver should be active for this profile")
39
40
  sticky_ip: StrictBool = Field(description="Whether the same IP address should be used for all executions of this profile")
40
41
  credentials: List[Credential] = Field(description="Optional list of credentials to create with the profile")
41
- __properties: ClassVar[List[str]] = ["name", "description", "organization_id", "proxy_cc", "proxy_type", "captcha_solver_active", "sticky_ip", "credentials"]
42
+ cookies: List[Cookie] = Field(description="Optional list of cookies to create with the profile")
43
+ __properties: ClassVar[List[str]] = ["name", "description", "organization_id", "proxy_cc", "proxy_type", "captcha_solver_active", "sticky_ip", "credentials", "cookies"]
42
44
 
43
45
  model_config = ConfigDict(
44
46
  populate_by_name=True,
@@ -86,6 +88,13 @@ class CreateAgentProfileRequest(BaseModel):
86
88
  if _item_credentials:
87
89
  _items.append(_item_credentials.to_dict())
88
90
  _dict['credentials'] = _items
91
+ # override the default output from pydantic by calling `to_dict()` of each item in cookies (list)
92
+ _items = []
93
+ if self.cookies:
94
+ for _item_cookies in self.cookies:
95
+ if _item_cookies:
96
+ _items.append(_item_cookies.to_dict())
97
+ _dict['cookies'] = _items
89
98
  return _dict
90
99
 
91
100
  @classmethod
@@ -105,7 +114,8 @@ class CreateAgentProfileRequest(BaseModel):
105
114
  "proxy_type": obj.get("proxy_type"),
106
115
  "captcha_solver_active": obj.get("captcha_solver_active") if obj.get("captcha_solver_active") is not None else False,
107
116
  "sticky_ip": obj.get("sticky_ip") if obj.get("sticky_ip") is not None else False,
108
- "credentials": [Credential.from_dict(_item) for _item in obj["credentials"]] if obj.get("credentials") is not None else None
117
+ "credentials": [Credential.from_dict(_item) for _item in obj["credentials"]] if obj.get("credentials") is not None else None,
118
+ "cookies": [Cookie.from_dict(_item) for _item in obj["cookies"]] if obj.get("cookies") is not None else None
109
119
  })
110
120
  return _obj
111
121
 
@@ -20,6 +20,7 @@ import json
20
20
  from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictStr
21
21
  from typing import Any, ClassVar, Dict, List, Optional
22
22
  from typing_extensions import Annotated
23
+ from asteroid_odyssey.agents_v1_gen.models.cookie import Cookie
23
24
  from asteroid_odyssey.agents_v1_gen.models.country_code import CountryCode
24
25
  from asteroid_odyssey.agents_v1_gen.models.credential import Credential
25
26
  from asteroid_odyssey.agents_v1_gen.models.proxy_type import ProxyType
@@ -38,7 +39,9 @@ class UpdateAgentProfileRequest(BaseModel):
38
39
  sticky_ip: Optional[StrictBool] = Field(default=None, description="Whether the same IP address should be used for all executions of this profile")
39
40
  credentials_to_add: Optional[List[Credential]] = Field(default=None, description="List of credentials to add to the profile")
40
41
  credentials_to_delete: Optional[List[StrictStr]] = Field(default=None, description="List of credential IDs to delete from the profile")
41
- __properties: ClassVar[List[str]] = ["name", "description", "proxy_cc", "proxy_type", "captcha_solver_active", "sticky_ip", "credentials_to_add", "credentials_to_delete"]
42
+ cookies_to_add: Optional[List[Cookie]] = Field(default=None, description="List of cookies to add to the profile")
43
+ cookies_to_delete: Optional[List[StrictStr]] = Field(default=None, description="List of cookie IDs to delete from the profile")
44
+ __properties: ClassVar[List[str]] = ["name", "description", "proxy_cc", "proxy_type", "captcha_solver_active", "sticky_ip", "credentials_to_add", "credentials_to_delete", "cookies_to_add", "cookies_to_delete"]
42
45
 
43
46
  model_config = ConfigDict(
44
47
  populate_by_name=True,
@@ -86,6 +89,13 @@ class UpdateAgentProfileRequest(BaseModel):
86
89
  if _item_credentials_to_add:
87
90
  _items.append(_item_credentials_to_add.to_dict())
88
91
  _dict['credentials_to_add'] = _items
92
+ # override the default output from pydantic by calling `to_dict()` of each item in cookies_to_add (list)
93
+ _items = []
94
+ if self.cookies_to_add:
95
+ for _item_cookies_to_add in self.cookies_to_add:
96
+ if _item_cookies_to_add:
97
+ _items.append(_item_cookies_to_add.to_dict())
98
+ _dict['cookies_to_add'] = _items
89
99
  return _dict
90
100
 
91
101
  @classmethod
@@ -105,7 +115,9 @@ class UpdateAgentProfileRequest(BaseModel):
105
115
  "captcha_solver_active": obj.get("captcha_solver_active"),
106
116
  "sticky_ip": obj.get("sticky_ip"),
107
117
  "credentials_to_add": [Credential.from_dict(_item) for _item in obj["credentials_to_add"]] if obj.get("credentials_to_add") is not None else None,
108
- "credentials_to_delete": obj.get("credentials_to_delete")
118
+ "credentials_to_delete": obj.get("credentials_to_delete"),
119
+ "cookies_to_add": [Cookie.from_dict(_item) for _item in obj["cookies_to_add"]] if obj.get("cookies_to_add") is not None else None,
120
+ "cookies_to_delete": obj.get("cookies_to_delete")
109
121
  })
110
122
  return _obj
111
123
 
@@ -50,6 +50,10 @@ __all__ = [
50
50
  "ExecutionActivityStepStartedPayload",
51
51
  "ExecutionActivityTransitionedNodePayload",
52
52
  "ExecutionActivityUserMessageReceivedPayload",
53
+ "ExecutionAwaitingConfirmationPayload",
54
+ "ExecutionCompletedPayload",
55
+ "ExecutionFailedPayload",
56
+ "ExecutionPausedPayload",
53
57
  "ExecutionStatus",
54
58
  "ExecutionTerminalPayload",
55
59
  "ExecutionUserMessagesAddTextBody",
@@ -93,6 +97,10 @@ from asteroid_odyssey.agents_v2_gen.models.execution_activity_step_completed_pay
93
97
  from asteroid_odyssey.agents_v2_gen.models.execution_activity_step_started_payload import ExecutionActivityStepStartedPayload as ExecutionActivityStepStartedPayload
94
98
  from asteroid_odyssey.agents_v2_gen.models.execution_activity_transitioned_node_payload import ExecutionActivityTransitionedNodePayload as ExecutionActivityTransitionedNodePayload
95
99
  from asteroid_odyssey.agents_v2_gen.models.execution_activity_user_message_received_payload import ExecutionActivityUserMessageReceivedPayload as ExecutionActivityUserMessageReceivedPayload
100
+ from asteroid_odyssey.agents_v2_gen.models.execution_awaiting_confirmation_payload import ExecutionAwaitingConfirmationPayload as ExecutionAwaitingConfirmationPayload
101
+ from asteroid_odyssey.agents_v2_gen.models.execution_completed_payload import ExecutionCompletedPayload as ExecutionCompletedPayload
102
+ from asteroid_odyssey.agents_v2_gen.models.execution_failed_payload import ExecutionFailedPayload as ExecutionFailedPayload
103
+ from asteroid_odyssey.agents_v2_gen.models.execution_paused_payload import ExecutionPausedPayload as ExecutionPausedPayload
96
104
  from asteroid_odyssey.agents_v2_gen.models.execution_status import ExecutionStatus as ExecutionStatus
97
105
  from asteroid_odyssey.agents_v2_gen.models.execution_terminal_payload import ExecutionTerminalPayload as ExecutionTerminalPayload
98
106
  from asteroid_odyssey.agents_v2_gen.models.execution_user_messages_add_text_body import ExecutionUserMessagesAddTextBody as ExecutionUserMessagesAddTextBody
@@ -209,7 +209,7 @@ conf = asteroid_odyssey.agents_v2_gen.Configuration(
209
209
  ) -> None:
210
210
  """Constructor
211
211
  """
212
- self._base_path = "https://odyssey.asteroid.ai/agents/frontend" if host is None else host
212
+ self._base_path = "https://odyssey.asteroid.ai/agents/v2" if host is None else host
213
213
  """Default Base url
214
214
  """
215
215
  self.server_index = 0 if server_index is None and host is None else server_index
@@ -546,7 +546,7 @@ conf = asteroid_odyssey.agents_v2_gen.Configuration(
546
546
  'variables': {
547
547
  'version': {
548
548
  'description': "No description provided",
549
- 'default_value': "",
549
+ 'default_value': "v2",
550
550
  'enum_values': [
551
551
  "frontend",
552
552
  "v2"
@@ -36,6 +36,10 @@ from asteroid_odyssey.agents_v2_gen.models.execution_activity_step_completed_pay
36
36
  from asteroid_odyssey.agents_v2_gen.models.execution_activity_step_started_payload import ExecutionActivityStepStartedPayload
37
37
  from asteroid_odyssey.agents_v2_gen.models.execution_activity_transitioned_node_payload import ExecutionActivityTransitionedNodePayload
38
38
  from asteroid_odyssey.agents_v2_gen.models.execution_activity_user_message_received_payload import ExecutionActivityUserMessageReceivedPayload
39
+ from asteroid_odyssey.agents_v2_gen.models.execution_awaiting_confirmation_payload import ExecutionAwaitingConfirmationPayload
40
+ from asteroid_odyssey.agents_v2_gen.models.execution_completed_payload import ExecutionCompletedPayload
41
+ from asteroid_odyssey.agents_v2_gen.models.execution_failed_payload import ExecutionFailedPayload
42
+ from asteroid_odyssey.agents_v2_gen.models.execution_paused_payload import ExecutionPausedPayload
39
43
  from asteroid_odyssey.agents_v2_gen.models.execution_status import ExecutionStatus
40
44
  from asteroid_odyssey.agents_v2_gen.models.execution_terminal_payload import ExecutionTerminalPayload
41
45
  from asteroid_odyssey.agents_v2_gen.models.execution_user_messages_add_text_body import ExecutionUserMessagesAddTextBody
@@ -17,8 +17,12 @@ import pprint
17
17
  import re # noqa: F401
18
18
  import json
19
19
 
20
- from pydantic import BaseModel, ConfigDict
21
- from typing import Any, ClassVar, Dict, List
20
+ from pydantic import BaseModel, ConfigDict, Field
21
+ from typing import Any, ClassVar, Dict, List, Optional
22
+ from asteroid_odyssey.agents_v2_gen.models.execution_awaiting_confirmation_payload import ExecutionAwaitingConfirmationPayload
23
+ from asteroid_odyssey.agents_v2_gen.models.execution_completed_payload import ExecutionCompletedPayload
24
+ from asteroid_odyssey.agents_v2_gen.models.execution_failed_payload import ExecutionFailedPayload
25
+ from asteroid_odyssey.agents_v2_gen.models.execution_paused_payload import ExecutionPausedPayload
22
26
  from asteroid_odyssey.agents_v2_gen.models.execution_status import ExecutionStatus
23
27
  from typing import Optional, Set
24
28
  from typing_extensions import Self
@@ -27,8 +31,12 @@ class ExecutionActivityStatusChangedPayload(BaseModel):
27
31
  """
28
32
  ExecutionActivityStatusChangedPayload
29
33
  """ # noqa: E501
34
+ awaiting_confirmation_payload: Optional[ExecutionAwaitingConfirmationPayload] = Field(default=None, alias="awaitingConfirmationPayload")
35
+ completed_payload: Optional[ExecutionCompletedPayload] = Field(default=None, alias="completedPayload")
36
+ failed_payload: Optional[ExecutionFailedPayload] = Field(default=None, alias="failedPayload")
37
+ paused_payload: Optional[ExecutionPausedPayload] = Field(default=None, alias="pausedPayload")
30
38
  status: ExecutionStatus
31
- __properties: ClassVar[List[str]] = ["status"]
39
+ __properties: ClassVar[List[str]] = ["awaitingConfirmationPayload", "completedPayload", "failedPayload", "pausedPayload", "status"]
32
40
 
33
41
  model_config = ConfigDict(
34
42
  populate_by_name=True,
@@ -69,6 +77,18 @@ class ExecutionActivityStatusChangedPayload(BaseModel):
69
77
  exclude=excluded_fields,
70
78
  exclude_none=True,
71
79
  )
80
+ # override the default output from pydantic by calling `to_dict()` of awaiting_confirmation_payload
81
+ if self.awaiting_confirmation_payload:
82
+ _dict['awaitingConfirmationPayload'] = self.awaiting_confirmation_payload.to_dict()
83
+ # override the default output from pydantic by calling `to_dict()` of completed_payload
84
+ if self.completed_payload:
85
+ _dict['completedPayload'] = self.completed_payload.to_dict()
86
+ # override the default output from pydantic by calling `to_dict()` of failed_payload
87
+ if self.failed_payload:
88
+ _dict['failedPayload'] = self.failed_payload.to_dict()
89
+ # override the default output from pydantic by calling `to_dict()` of paused_payload
90
+ if self.paused_payload:
91
+ _dict['pausedPayload'] = self.paused_payload.to_dict()
72
92
  return _dict
73
93
 
74
94
  @classmethod
@@ -81,6 +101,10 @@ class ExecutionActivityStatusChangedPayload(BaseModel):
81
101
  return cls.model_validate(obj)
82
102
 
83
103
  _obj = cls.model_validate({
104
+ "awaitingConfirmationPayload": ExecutionAwaitingConfirmationPayload.from_dict(obj["awaitingConfirmationPayload"]) if obj.get("awaitingConfirmationPayload") is not None else None,
105
+ "completedPayload": ExecutionCompletedPayload.from_dict(obj["completedPayload"]) if obj.get("completedPayload") is not None else None,
106
+ "failedPayload": ExecutionFailedPayload.from_dict(obj["failedPayload"]) if obj.get("failedPayload") is not None else None,
107
+ "pausedPayload": ExecutionPausedPayload.from_dict(obj["pausedPayload"]) if obj.get("pausedPayload") is not None else None,
84
108
  "status": obj.get("status")
85
109
  })
86
110
  return _obj
@@ -0,0 +1,87 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Agent Service
5
+
6
+ No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
7
+
8
+ The version of the OpenAPI document: v2
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, StrictStr
21
+ from typing import Any, ClassVar, Dict, List
22
+ from typing import Optional, Set
23
+ from typing_extensions import Self
24
+
25
+ class ExecutionAwaitingConfirmationPayload(BaseModel):
26
+ """
27
+ ExecutionAwaitingConfirmationPayload
28
+ """ # noqa: E501
29
+ reason: StrictStr
30
+ __properties: ClassVar[List[str]] = ["reason"]
31
+
32
+ model_config = ConfigDict(
33
+ populate_by_name=True,
34
+ validate_assignment=True,
35
+ protected_namespaces=(),
36
+ )
37
+
38
+
39
+ def to_str(self) -> str:
40
+ """Returns the string representation of the model using alias"""
41
+ return pprint.pformat(self.model_dump(by_alias=True))
42
+
43
+ def to_json(self) -> str:
44
+ """Returns the JSON representation of the model using alias"""
45
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
46
+ return json.dumps(self.to_dict())
47
+
48
+ @classmethod
49
+ def from_json(cls, json_str: str) -> Optional[Self]:
50
+ """Create an instance of ExecutionAwaitingConfirmationPayload from a JSON string"""
51
+ return cls.from_dict(json.loads(json_str))
52
+
53
+ def to_dict(self) -> Dict[str, Any]:
54
+ """Return the dictionary representation of the model using alias.
55
+
56
+ This has the following differences from calling pydantic's
57
+ `self.model_dump(by_alias=True)`:
58
+
59
+ * `None` is only added to the output dict for nullable fields that
60
+ were set at model initialization. Other fields with value `None`
61
+ are ignored.
62
+ """
63
+ excluded_fields: Set[str] = set([
64
+ ])
65
+
66
+ _dict = self.model_dump(
67
+ by_alias=True,
68
+ exclude=excluded_fields,
69
+ exclude_none=True,
70
+ )
71
+ return _dict
72
+
73
+ @classmethod
74
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
75
+ """Create an instance of ExecutionAwaitingConfirmationPayload from a dict"""
76
+ if obj is None:
77
+ return None
78
+
79
+ if not isinstance(obj, dict):
80
+ return cls.model_validate(obj)
81
+
82
+ _obj = cls.model_validate({
83
+ "reason": obj.get("reason")
84
+ })
85
+ return _obj
86
+
87
+
@@ -0,0 +1,105 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Agent Service
5
+
6
+ No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
7
+
8
+ The version of the OpenAPI document: v2
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, StrictStr, field_validator
21
+ from typing import Any, ClassVar, Dict, List, Optional
22
+ from typing import Optional, Set
23
+ from typing_extensions import Self
24
+
25
+ class ExecutionCompletedPayload(BaseModel):
26
+ """
27
+ ExecutionCompletedPayload
28
+ """ # noqa: E501
29
+ final_answer: Optional[StrictStr] = None
30
+ outcome: StrictStr
31
+ reasoning: StrictStr
32
+ result: Optional[Any]
33
+ __properties: ClassVar[List[str]] = ["final_answer", "outcome", "reasoning", "result"]
34
+
35
+ @field_validator('outcome')
36
+ def outcome_validate_enum(cls, value):
37
+ """Validates the enum"""
38
+ if value not in set(['success', 'failure']):
39
+ raise ValueError("must be one of enum values ('success', 'failure')")
40
+ return value
41
+
42
+ model_config = ConfigDict(
43
+ populate_by_name=True,
44
+ validate_assignment=True,
45
+ protected_namespaces=(),
46
+ )
47
+
48
+
49
+ def to_str(self) -> str:
50
+ """Returns the string representation of the model using alias"""
51
+ return pprint.pformat(self.model_dump(by_alias=True))
52
+
53
+ def to_json(self) -> str:
54
+ """Returns the JSON representation of the model using alias"""
55
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
56
+ return json.dumps(self.to_dict())
57
+
58
+ @classmethod
59
+ def from_json(cls, json_str: str) -> Optional[Self]:
60
+ """Create an instance of ExecutionCompletedPayload from a JSON string"""
61
+ return cls.from_dict(json.loads(json_str))
62
+
63
+ def to_dict(self) -> Dict[str, Any]:
64
+ """Return the dictionary representation of the model using alias.
65
+
66
+ This has the following differences from calling pydantic's
67
+ `self.model_dump(by_alias=True)`:
68
+
69
+ * `None` is only added to the output dict for nullable fields that
70
+ were set at model initialization. Other fields with value `None`
71
+ are ignored.
72
+ """
73
+ excluded_fields: Set[str] = set([
74
+ ])
75
+
76
+ _dict = self.model_dump(
77
+ by_alias=True,
78
+ exclude=excluded_fields,
79
+ exclude_none=True,
80
+ )
81
+ # set to None if result (nullable) is None
82
+ # and model_fields_set contains the field
83
+ if self.result is None and "result" in self.model_fields_set:
84
+ _dict['result'] = None
85
+
86
+ return _dict
87
+
88
+ @classmethod
89
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
90
+ """Create an instance of ExecutionCompletedPayload from a dict"""
91
+ if obj is None:
92
+ return None
93
+
94
+ if not isinstance(obj, dict):
95
+ return cls.model_validate(obj)
96
+
97
+ _obj = cls.model_validate({
98
+ "final_answer": obj.get("final_answer"),
99
+ "outcome": obj.get("outcome"),
100
+ "reasoning": obj.get("reasoning"),
101
+ "result": obj.get("result")
102
+ })
103
+ return _obj
104
+
105
+
@@ -0,0 +1,87 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Agent Service
5
+
6
+ No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
7
+
8
+ The version of the OpenAPI document: v2
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, StrictStr
21
+ from typing import Any, ClassVar, Dict, List
22
+ from typing import Optional, Set
23
+ from typing_extensions import Self
24
+
25
+ class ExecutionFailedPayload(BaseModel):
26
+ """
27
+ ExecutionFailedPayload
28
+ """ # noqa: E501
29
+ reason: StrictStr
30
+ __properties: ClassVar[List[str]] = ["reason"]
31
+
32
+ model_config = ConfigDict(
33
+ populate_by_name=True,
34
+ validate_assignment=True,
35
+ protected_namespaces=(),
36
+ )
37
+
38
+
39
+ def to_str(self) -> str:
40
+ """Returns the string representation of the model using alias"""
41
+ return pprint.pformat(self.model_dump(by_alias=True))
42
+
43
+ def to_json(self) -> str:
44
+ """Returns the JSON representation of the model using alias"""
45
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
46
+ return json.dumps(self.to_dict())
47
+
48
+ @classmethod
49
+ def from_json(cls, json_str: str) -> Optional[Self]:
50
+ """Create an instance of ExecutionFailedPayload from a JSON string"""
51
+ return cls.from_dict(json.loads(json_str))
52
+
53
+ def to_dict(self) -> Dict[str, Any]:
54
+ """Return the dictionary representation of the model using alias.
55
+
56
+ This has the following differences from calling pydantic's
57
+ `self.model_dump(by_alias=True)`:
58
+
59
+ * `None` is only added to the output dict for nullable fields that
60
+ were set at model initialization. Other fields with value `None`
61
+ are ignored.
62
+ """
63
+ excluded_fields: Set[str] = set([
64
+ ])
65
+
66
+ _dict = self.model_dump(
67
+ by_alias=True,
68
+ exclude=excluded_fields,
69
+ exclude_none=True,
70
+ )
71
+ return _dict
72
+
73
+ @classmethod
74
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
75
+ """Create an instance of ExecutionFailedPayload from a dict"""
76
+ if obj is None:
77
+ return None
78
+
79
+ if not isinstance(obj, dict):
80
+ return cls.model_validate(obj)
81
+
82
+ _obj = cls.model_validate({
83
+ "reason": obj.get("reason")
84
+ })
85
+ return _obj
86
+
87
+
@@ -0,0 +1,87 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Agent Service
5
+
6
+ No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
7
+
8
+ The version of the OpenAPI document: v2
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, StrictStr
21
+ from typing import Any, ClassVar, Dict, List
22
+ from typing import Optional, Set
23
+ from typing_extensions import Self
24
+
25
+ class ExecutionPausedPayload(BaseModel):
26
+ """
27
+ ExecutionPausedPayload
28
+ """ # noqa: E501
29
+ reason: StrictStr
30
+ __properties: ClassVar[List[str]] = ["reason"]
31
+
32
+ model_config = ConfigDict(
33
+ populate_by_name=True,
34
+ validate_assignment=True,
35
+ protected_namespaces=(),
36
+ )
37
+
38
+
39
+ def to_str(self) -> str:
40
+ """Returns the string representation of the model using alias"""
41
+ return pprint.pformat(self.model_dump(by_alias=True))
42
+
43
+ def to_json(self) -> str:
44
+ """Returns the JSON representation of the model using alias"""
45
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
46
+ return json.dumps(self.to_dict())
47
+
48
+ @classmethod
49
+ def from_json(cls, json_str: str) -> Optional[Self]:
50
+ """Create an instance of ExecutionPausedPayload from a JSON string"""
51
+ return cls.from_dict(json.loads(json_str))
52
+
53
+ def to_dict(self) -> Dict[str, Any]:
54
+ """Return the dictionary representation of the model using alias.
55
+
56
+ This has the following differences from calling pydantic's
57
+ `self.model_dump(by_alias=True)`:
58
+
59
+ * `None` is only added to the output dict for nullable fields that
60
+ were set at model initialization. Other fields with value `None`
61
+ are ignored.
62
+ """
63
+ excluded_fields: Set[str] = set([
64
+ ])
65
+
66
+ _dict = self.model_dump(
67
+ by_alias=True,
68
+ exclude=excluded_fields,
69
+ exclude_none=True,
70
+ )
71
+ return _dict
72
+
73
+ @classmethod
74
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
75
+ """Create an instance of ExecutionPausedPayload from a dict"""
76
+ if obj is None:
77
+ return None
78
+
79
+ if not isinstance(obj, dict):
80
+ return cls.model_validate(obj)
81
+
82
+ _obj = cls.model_validate({
83
+ "reason": obj.get("reason")
84
+ })
85
+ return _obj
86
+
87
+
@@ -10,9 +10,8 @@ without modifying any generated files.
10
10
 
11
11
  import time
12
12
  import os
13
- import logging
14
13
  import base64
15
- from typing import Dict, Any, Optional, List, Union, Tuple
14
+ from typing import Dict, Any, Optional, List, Union, Tuple, NamedTuple
16
15
  from cryptography.hazmat.primitives import serialization
17
16
  from cryptography.hazmat.primitives.asymmetric import padding, rsa
18
17
  from .agents_v1_gen import (
@@ -60,6 +59,14 @@ class TimeoutError(AsteroidAPIError):
60
59
  super().__init__(message)
61
60
 
62
61
 
62
+ class AgentInteractionResult(NamedTuple):
63
+ """Result returned by wait_for_agent_interaction method."""
64
+ is_terminal: bool # True if execution reached a terminal state
65
+ status: str # Current execution status
66
+ agent_message: Optional[str] # Agent's message if requesting interaction
67
+ execution_result: Optional[ExecutionResult] # Final result if terminal
68
+
69
+
63
70
  def encrypt_with_public_key(plaintext: str, pem_public_key: str) -> str:
64
71
  """
65
72
  Encrypt plaintext using RSA public key with PKCS1v15 padding.
@@ -576,6 +583,166 @@ class AsteroidClient:
576
583
  except ApiException as e:
577
584
  raise AsteroidAPIError(f"Failed to get credentials public key: {e}") from e
578
585
 
586
+ def wait_for_agent_interaction(
587
+ self,
588
+ execution_id: str,
589
+ poll_interval: float = 2.0,
590
+ timeout: float = 3600.0
591
+ ) -> AgentInteractionResult:
592
+ """
593
+ Wait for an agent interaction request or terminal state.
594
+
595
+ This method polls an existing execution until it either:
596
+ 1. Requests human input (paused_by_agent state)
597
+ 2. Reaches a terminal state (completed, failed, cancelled)
598
+ 3. Times out
599
+
600
+ Unlike interactive_agent, this method doesn't start an execution or handle
601
+ the response automatically - it just waits and reports what happened.
602
+
603
+ Args:
604
+ execution_id: The execution identifier for an already started execution
605
+ poll_interval: How often to check for updates in seconds (default: 2.0)
606
+ timeout: Maximum wait time in seconds (default: 3600 - 1 hour)
607
+
608
+ Returns:
609
+ AgentInteractionResult containing:
610
+ - is_terminal: True if execution finished (completed/failed/cancelled)
611
+ - status: Current execution status string
612
+ - agent_message: Agent's message if requesting interaction (None if terminal)
613
+ - execution_result: Final result if terminal state (None if requesting interaction)
614
+
615
+ Raises:
616
+ ValueError: If interval or timeout parameters are invalid
617
+ TimeoutError: If the execution times out
618
+ AsteroidAPIError: If API calls fail
619
+
620
+ Example:
621
+ # Start an execution first
622
+ execution_id = client.execute_agent('agent-id', {'input': 'test'})
623
+
624
+ # Wait for interaction or completion
625
+ result = client.wait_for_agent_interaction(execution_id)
626
+
627
+ if result.is_terminal:
628
+ print(f"Execution finished with status: {result.status}")
629
+ if result.execution_result:
630
+ print(f"Result: {result.execution_result.outcome}")
631
+ else:
632
+ print(f"Agent requesting input: {result.agent_message}")
633
+ # Send response
634
+ client.add_message_to_execution(execution_id, "user response")
635
+ # Wait again
636
+ result = client.wait_for_agent_interaction(execution_id)
637
+ """
638
+ # Validate parameters
639
+ if poll_interval <= 0:
640
+ raise ValueError("poll_interval must be positive")
641
+ if timeout <= 0:
642
+ raise ValueError("timeout must be positive")
643
+
644
+ start_time = time.time()
645
+
646
+ while True:
647
+ elapsed_time = time.time() - start_time
648
+ if elapsed_time >= timeout:
649
+ raise TimeoutError(f"Wait for interaction on execution {execution_id} timed out after {timeout}s")
650
+
651
+ # Get current status
652
+ status_response = self.get_execution_status(execution_id)
653
+ current_status = status_response.status
654
+ status_str = current_status.value.lower()
655
+
656
+ # Handle terminal states
657
+ if current_status == Status.COMPLETED:
658
+ try:
659
+ execution_result = self.get_execution_result(execution_id)
660
+ return AgentInteractionResult(
661
+ is_terminal=True,
662
+ status=status_str,
663
+ agent_message=None,
664
+ execution_result=execution_result
665
+ )
666
+ except AsteroidAPIError as e:
667
+ if "not available yet" in str(e):
668
+ time.sleep(poll_interval)
669
+ continue
670
+ raise e
671
+
672
+ elif current_status in [Status.FAILED, Status.CANCELLED]:
673
+ try:
674
+ execution_result = self.get_execution_result(execution_id)
675
+ return AgentInteractionResult(
676
+ is_terminal=True,
677
+ status=status_str,
678
+ agent_message=None,
679
+ execution_result=execution_result
680
+ )
681
+ except AsteroidAPIError as e:
682
+ # If we can't get the execution result, still return terminal state
683
+ return AgentInteractionResult(
684
+ is_terminal=True,
685
+ status=status_str,
686
+ agent_message=None,
687
+ execution_result=None
688
+ )
689
+
690
+ # Handle agent interaction request
691
+ elif current_status == Status.PAUSED_BY_AGENT:
692
+ # Get the agent's message/request
693
+ agent_message = self._extract_agent_request_message(execution_id)
694
+ return AgentInteractionResult(
695
+ is_terminal=False,
696
+ status=status_str,
697
+ agent_message=agent_message,
698
+ execution_result=None
699
+ )
700
+
701
+ # Wait before next poll for non-terminal, non-interaction states
702
+ time.sleep(poll_interval)
703
+
704
+ def _extract_agent_request_message(self, execution_id: str) -> str:
705
+ """
706
+ Extract the agent's request message from recent activities.
707
+
708
+ Args:
709
+ execution_id: The execution identifier
710
+
711
+ Returns:
712
+ The agent's message or a default message if not found
713
+ """
714
+ try:
715
+ activities = self.get_last_n_execution_activities(execution_id, 20)
716
+
717
+ # Filter for human input requests
718
+ human_input_requests = [
719
+ activity for activity in activities
720
+ if (hasattr(activity, 'payload') and
721
+ activity.payload and
722
+ getattr(activity.payload, 'activityType', None) == 'action_started')
723
+ ]
724
+
725
+ if human_input_requests:
726
+ human_input_request = human_input_requests[0]
727
+
728
+ # Extract message from payload data with robust error handling
729
+ try:
730
+ payload = human_input_request.payload
731
+ if hasattr(payload, 'data') and payload.data:
732
+ payload_data = payload.data
733
+ if hasattr(payload_data, 'message') and payload_data.message:
734
+ return str(payload_data.message)
735
+ return 'Agent is requesting input'
736
+ except (AttributeError, TypeError) as e:
737
+ return 'Agent is requesting input (extraction failed)'
738
+
739
+ return 'Agent is requesting input'
740
+
741
+ except AsteroidAPIError as e:
742
+ return 'Agent is requesting input (API error)'
743
+ except Exception as e:
744
+ return 'Agent is requesting input (extraction failed)'
745
+
579
746
  def __enter__(self):
580
747
  """Context manager entry."""
581
748
  return self
@@ -592,10 +759,7 @@ class AsteroidClient:
592
759
  if pool_manager:
593
760
  pool_manager.clear()
594
761
  except Exception as e:
595
- # Log but don't mask the original exception (if any)
596
- logging.warning("Failed to clear connection pool: %s", e)
597
-
598
- # Returning False allows any exception in the 'with' block to propagate
762
+ pass
599
763
  return False
600
764
 
601
765
  # Utility methods for nicer response formatting
@@ -949,6 +1113,60 @@ def add_message_to_execution(client: AsteroidClient, execution_id: str, message:
949
1113
  """
950
1114
  return client.add_message_to_execution(execution_id, message)
951
1115
 
1116
+
1117
+ def wait_for_agent_interaction(
1118
+ client: AsteroidClient,
1119
+ execution_id: str,
1120
+ poll_interval: float = 2.0,
1121
+ timeout: float = 3600.0
1122
+ ) -> AgentInteractionResult:
1123
+ """
1124
+ Wait for an agent interaction request or terminal state.
1125
+
1126
+ This convenience function provides the same functionality as the AsteroidClient.wait_for_agent_interaction method.
1127
+
1128
+ Args:
1129
+ client: The AsteroidClient instance
1130
+ execution_id: The execution identifier for an already started execution
1131
+ poll_interval: How often to check for updates in seconds (default: 2.0)
1132
+ timeout: Maximum wait time in seconds (default: 3600 - 1 hour)
1133
+
1134
+ Returns:
1135
+ AgentInteractionResult containing:
1136
+ - is_terminal: True if execution finished (completed/failed/cancelled)
1137
+ - status: Current execution status string
1138
+ - agent_message: Agent's message if requesting interaction (None if terminal)
1139
+ - execution_result: Final result if terminal state (None if requesting interaction)
1140
+
1141
+ Raises:
1142
+ ValueError: If interval or timeout parameters are invalid
1143
+ TimeoutError: If the execution times out
1144
+ AsteroidAPIError: If API calls fail
1145
+
1146
+ Example:
1147
+ # Start an execution first
1148
+ execution_id = execute_agent(client, 'agent-id', {'input': 'test'})
1149
+
1150
+ # Wait for interaction or completion
1151
+ result = wait_for_agent_interaction(client, execution_id)
1152
+
1153
+ if result.is_terminal:
1154
+ print(f"Execution finished with status: {result.status}")
1155
+ if result.execution_result:
1156
+ print(f"Result: {result.execution_result.outcome}")
1157
+ else:
1158
+ print(f"Agent requesting input: {result.agent_message}")
1159
+ # Send response
1160
+ add_message_to_execution(client, execution_id, "user response")
1161
+ # Wait again
1162
+ result = wait_for_agent_interaction(client, execution_id)
1163
+ """
1164
+ return client.wait_for_agent_interaction(
1165
+ execution_id=execution_id,
1166
+ poll_interval=poll_interval,
1167
+ timeout=timeout
1168
+ )
1169
+
952
1170
  # Re-export common types for convenience
953
1171
  __all__ = [
954
1172
  'AsteroidClient',
@@ -964,8 +1182,13 @@ __all__ = [
964
1182
  'create_agent_profile',
965
1183
  'update_agent_profile',
966
1184
  'delete_agent_profile',
1185
+ 'get_last_n_execution_activities',
1186
+ 'add_message_to_execution',
1187
+ 'interactive_agent',
1188
+ 'wait_for_agent_interaction',
967
1189
  'get_credentials_public_key',
968
1190
  'AsteroidAPIError',
969
1191
  'ExecutionError',
970
- 'TimeoutError'
1192
+ 'TimeoutError',
1193
+ 'AgentInteractionResult'
971
1194
  ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: asteroid-odyssey
3
- Version: 1.3.0
3
+ Version: 1.3.1
4
4
  Summary: A Python SDK for browser automation using Asteroid platform.
5
5
  Author-email: David Mlcoch <founders@asteroid.com>
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
- asteroid_odyssey/__init__.py,sha256=UEWVMA46rvvJFAP0eAnfY84sh2EImKMLuMLF2pFhrXw,653
2
- asteroid_odyssey/client.py,sha256=etlUKFJsaUB59ifsHQKGJSHpvsJck0oSKt3EK-f4y94,35896
3
- asteroid_odyssey/agents_v1_gen/__init__.py,sha256=TJdnk__jClVyed4Wvpkm6g2CwCtQeLy7aY5kMYSNJwI,4298
1
+ asteroid_odyssey/__init__.py,sha256=r3WWW_BsZUiHfBcstmWnJxeeDrmWdy-7uovPEHHfO80,915
2
+ asteroid_odyssey/client.py,sha256=lcjZ9YMU2w3q05qw2aOVJr78CCaI_FHlkwlAJixpZrQ,45335
3
+ asteroid_odyssey/agents_v1_gen/__init__.py,sha256=bc-NDFcUy9zBjdMcfRgZtKtMotoyz74VMR9jKeCjgkM,4386
4
4
  asteroid_odyssey/agents_v1_gen/api_client.py,sha256=Fq7Uh5yc9Mwza9NgCE1A0g2zrJ_hl5qQ_WFkACeHxWw,27747
5
5
  asteroid_odyssey/agents_v1_gen/api_response.py,sha256=eMxw1mpmJcoGZ3gs9z6jM4oYoZ10Gjk333s9sKxGv7s,652
6
6
  asteroid_odyssey/agents_v1_gen/configuration.py,sha256=Q5iAuaxcXVhsirre6lzbDLNP6okMLJacsp9UxNvt-5I,19060
@@ -11,11 +11,12 @@ asteroid_odyssey/agents_v1_gen/api/__init__.py,sha256=oj1pzgrbo8C6FrpBVC7IvfUu-u
11
11
  asteroid_odyssey/agents_v1_gen/api/agent_profile_api.py,sha256=uOgyH3VN8LseS5Mq2uFxAbZM5iH88O0YEmXFTMc8bQ0,66369
12
12
  asteroid_odyssey/agents_v1_gen/api/api_api.py,sha256=vqZ7wQEQGOpa1D6U1QLL27XK-0DY5_v9tdQJNt_lpsM,19217
13
13
  asteroid_odyssey/agents_v1_gen/api/execution_api.py,sha256=RXYDwX_VKMfM44IrKRb-c5D3FXnAPw8QQcpqDoGpL3Q,67849
14
- asteroid_odyssey/agents_v1_gen/models/__init__.py,sha256=xBLsQJ8YhBrZy8S153OH0mJAzsGwwvT-ylegSOKLNAI,1989
15
- asteroid_odyssey/agents_v1_gen/models/agent_profile.py,sha256=L121f_DtK0zIGm9NEuoG9KMWuq-zGX8b9iGaKaaNQCc,4718
14
+ asteroid_odyssey/agents_v1_gen/models/__init__.py,sha256=B4qBgPxwjUAB2yKdPOgFj_uYNjxMYCwaLrKUBrKTuiI,2053
15
+ asteroid_odyssey/agents_v1_gen/models/agent_profile.py,sha256=ByGmAHoJFuqF_tdUejWZaWnz19v1BT1sH6FJ1tU6Vm8,5344
16
16
  asteroid_odyssey/agents_v1_gen/models/browser_session_recording_response.py,sha256=OgYXsMiADk5IIDKkWJTy0RfnnBO3Zbaq9mEUyaxTaH0,2590
17
+ asteroid_odyssey/agents_v1_gen/models/cookie.py,sha256=jvK-SgpFn8Untq3JnHTxDQnznT6Snn7Vnykba1-c3XU,4020
17
18
  asteroid_odyssey/agents_v1_gen/models/country_code.py,sha256=pYFM0OC_maaGfUsFTTnKtSJxXKQiNS0pU3O0LLFz_Uo,802
18
- asteroid_odyssey/agents_v1_gen/models/create_agent_profile_request.py,sha256=3GpU72vT31ntV_qMRyCp2ejN6BbBxXv5eFPVahrFE68,4567
19
+ asteroid_odyssey/agents_v1_gen/models/create_agent_profile_request.py,sha256=jqHaASZlDkTWSpF9AYEsc4QyEpfN9uY4QPw0uMhcSOA,5194
19
20
  asteroid_odyssey/agents_v1_gen/models/credential.py,sha256=MSzwgGLjNiH_fclHpZpYKKDWn-498etD1CLS_EfmA7k,3033
20
21
  asteroid_odyssey/agents_v1_gen/models/delete_agent_profile200_response.py,sha256=y6gaG8VLeC2muBcw-i6KG64i-xrHq1v-8A7T8ViwBwk,2514
21
22
  asteroid_odyssey/agents_v1_gen/models/error_response.py,sha256=njnDeKZeMPiteuX4l3MsWTHkG4qEiv8sbIUTv0Z8yQY,2459
@@ -28,18 +29,18 @@ asteroid_odyssey/agents_v1_gen/models/health_check500_response.py,sha256=b6pG-pq
28
29
  asteroid_odyssey/agents_v1_gen/models/proxy_type.py,sha256=5AUJvncQEl77V3QLJCIidk-WQRU1BlhMJo9ARUUdo1Y,704
29
30
  asteroid_odyssey/agents_v1_gen/models/status.py,sha256=tnt_4jdoMzcjo6J0vttf2QKLNK0FC9XcjZKbGC3sbz0,889
30
31
  asteroid_odyssey/agents_v1_gen/models/structured_agent_execution_request.py,sha256=VZyW85pVz9T27aiG4ZlGywnnxTOaJCAjHSDz8D2YxY8,2913
31
- asteroid_odyssey/agents_v1_gen/models/update_agent_profile_request.py,sha256=pIk46Eb5wk-JbxOM_C8TOuUsE-LEJq7zSdL0WRSrlx8,4709
32
+ asteroid_odyssey/agents_v1_gen/models/update_agent_profile_request.py,sha256=ZggUpiv1G87Ds85n7XDCR0Lc3buwK-1C2kt0Zp3xUM0,5646
32
33
  asteroid_odyssey/agents_v1_gen/models/upload_execution_files200_response.py,sha256=u85oEP2bEuhszonE78VcrB_keT0UZpv16CTGvfse_v4,2735
33
- asteroid_odyssey/agents_v2_gen/__init__.py,sha256=m5xswSgtY2acRs-Ezgm1sbBK0HG_nUbzYyekVJdxqhw,6464
34
+ asteroid_odyssey/agents_v2_gen/__init__.py,sha256=qQ6DKYTAwQ0g4DLl8mQ-CPCh-jZV1lMwZh1hWmcP8Qw,7149
34
35
  asteroid_odyssey/agents_v2_gen/api_client.py,sha256=KxpVoMofYD5Uwdg7-TXy6TdWgGdtQtaD3UunO3T75MY,27807
35
36
  asteroid_odyssey/agents_v2_gen/api_response.py,sha256=eMxw1mpmJcoGZ3gs9z6jM4oYoZ10Gjk333s9sKxGv7s,652
36
- asteroid_odyssey/agents_v2_gen/configuration.py,sha256=Anb7lKRriv-3p5j16Oj72gj1yvYx_KxH9ngkMiGXTBk,19319
37
+ asteroid_odyssey/agents_v2_gen/configuration.py,sha256=WbWZkkdcOX_oqWTdQuBQo07UqU5qlCPUrjMZrfnYtgw,19315
37
38
  asteroid_odyssey/agents_v2_gen/exceptions.py,sha256=hBo-qUqJrW250S_xxUORV_LZU3YWE1-EhXXTxX5-P3k,6474
38
39
  asteroid_odyssey/agents_v2_gen/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
40
  asteroid_odyssey/agents_v2_gen/rest.py,sha256=QUgg1ahRFOoPjd6F0BU4uZ0MxdrxqGQartE6QMMziTI,9487
40
41
  asteroid_odyssey/agents_v2_gen/api/__init__.py,sha256=HJP59V3S9sayesugWn215uvjoIfhzWxNGRknmMvtRJE,122
41
42
  asteroid_odyssey/agents_v2_gen/api/execution_api.py,sha256=1rCYuGB2S4dgsFJmocRXXj9IVig7dEdx1xyGXwRF5bA,25365
42
- asteroid_odyssey/agents_v2_gen/models/__init__.py,sha256=08hB-NQQCuoo8HaWalo_wUkie3bgnE6lsE-5TilwB3I,3394
43
+ asteroid_odyssey/agents_v2_gen/models/__init__.py,sha256=k238x-mE3t97EpcO5BfLjlX9NxyFgG20C2TS68w2ots,3821
43
44
  asteroid_odyssey/agents_v2_gen/models/activity_payload_union_action_completed.py,sha256=djIqJOhSsyNDehLRJ_RKfjhZyQL596TNz4XhYC65FgY,3389
44
45
  asteroid_odyssey/agents_v2_gen/models/activity_payload_union_action_failed.py,sha256=Ld0T3X-TjRwd3PnBObiHE7jFpHBejRXgt8ENB486zU8,3359
45
46
  asteroid_odyssey/agents_v2_gen/models/activity_payload_union_action_started.py,sha256=ZVanUlpD1p5u1woVZ1YWi6qpj2X1Yg1twTCVI-ZoBB0,3369
@@ -57,16 +58,20 @@ asteroid_odyssey/agents_v2_gen/models/execution_activity_action_failed_payload.p
57
58
  asteroid_odyssey/agents_v2_gen/models/execution_activity_action_started_payload.py,sha256=yC9InGz_D_CyIFiC5ZOUBjh0VpTpfb8k_tfIviEOdFA,2579
58
59
  asteroid_odyssey/agents_v2_gen/models/execution_activity_generic_payload.py,sha256=xkECW6M-Rd-DhbAFiCT2-2QN7o0ZGeej4Xml24Mg_xU,2555
59
60
  asteroid_odyssey/agents_v2_gen/models/execution_activity_payload_union.py,sha256=9RlOiopP4UpYCb1RsqXdN2GAJY33Q9_gFn_L3dvuQ2U,14956
60
- asteroid_odyssey/agents_v2_gen/models/execution_activity_status_changed_payload.py,sha256=oTNr-hXTTjm_mIxqh4HU3CAhrS8wD0VL6mhoxcb1EMs,2653
61
+ asteroid_odyssey/agents_v2_gen/models/execution_activity_status_changed_payload.py,sha256=jdBn1YAHmwTuveFAIoELV--NdpeUw0NyJorlwz1cgCc,5073
61
62
  asteroid_odyssey/agents_v2_gen/models/execution_activity_step_completed_payload.py,sha256=SOC8Y7Ox5POHbrACjYUX9wUkEnGFgWdRV60dhqhfbPg,2627
62
63
  asteroid_odyssey/agents_v2_gen/models/execution_activity_step_started_payload.py,sha256=6IIbpvDKLIDzc5sr2KaHcGGKPDnUu4iPR-LlXChysT0,2619
63
64
  asteroid_odyssey/agents_v2_gen/models/execution_activity_transitioned_node_payload.py,sha256=nvHGIaaF37ol12EjU0RduaUnRhUaDpKD1qKStpJ7qLE,2769
64
65
  asteroid_odyssey/agents_v2_gen/models/execution_activity_user_message_received_payload.py,sha256=47US747NjJy11BsuwggH-o8-UhO3HUDamnNA4KISjjM,2718
66
+ asteroid_odyssey/agents_v2_gen/models/execution_awaiting_confirmation_payload.py,sha256=KFgB1DITaMhPgITwFCdvuhCEn1WnJ9IQxMLCLvIc7X4,2571
67
+ asteroid_odyssey/agents_v2_gen/models/execution_completed_payload.py,sha256=iFozfv2PoqHJ83lTqbIqo0RKPKww-knEeqnY434A8AA,3306
68
+ asteroid_odyssey/agents_v2_gen/models/execution_failed_payload.py,sha256=dzIk6XgTy1BWBp963FTnDQasrrkRb5fsshOkIsn_j54,2515
69
+ asteroid_odyssey/agents_v2_gen/models/execution_paused_payload.py,sha256=scUIg3_2yLGWry6-vnZwMEG4AeaSphVBewQ4tv_07z4,2515
65
70
  asteroid_odyssey/agents_v2_gen/models/execution_status.py,sha256=SHpsS6IzN42kPdDiykmKudEzmCiR1yRttJ9nG206W-g,959
66
71
  asteroid_odyssey/agents_v2_gen/models/execution_terminal_payload.py,sha256=hWh7Fuy0fswZZFwXncRwdtlyDD4WGEA-wYYdtOg8-vQ,2935
67
72
  asteroid_odyssey/agents_v2_gen/models/execution_user_messages_add_text_body.py,sha256=BQ9klnV_2-3svbyPFcGC272y7uKanIKtpbwVPXQs6gk,2559
68
73
  asteroid_odyssey/agents_v2_gen/models/versions.py,sha256=54MndkW0A32LnZbTGHEsFnNRrrT112iWNJMgk7-a2eM,736
69
- asteroid_odyssey-1.3.0.dist-info/METADATA,sha256=UzPlt9vKQROOQuHnDd4QGBHcS5sNa8fTo2Et_Eh7sIQ,7073
70
- asteroid_odyssey-1.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
71
- asteroid_odyssey-1.3.0.dist-info/top_level.txt,sha256=h4T6NKscnThJ4Nhzors2NKlJeZzepnM7XvDgsnfi5HA,17
72
- asteroid_odyssey-1.3.0.dist-info/RECORD,,
74
+ asteroid_odyssey-1.3.1.dist-info/METADATA,sha256=fjCqNaAB4EAyUb0dhY3OToLWfbQ2h2_LsHuX9ewMvcI,7073
75
+ asteroid_odyssey-1.3.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
76
+ asteroid_odyssey-1.3.1.dist-info/top_level.txt,sha256=h4T6NKscnThJ4Nhzors2NKlJeZzepnM7XvDgsnfi5HA,17
77
+ asteroid_odyssey-1.3.1.dist-info/RECORD,,