oagi 0.4.3__py3-none-any.whl → 0.6.0__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.

Potentially problematic release.


This version of oagi might be problematic. Click here for more details.

@@ -6,15 +6,15 @@
6
6
  # Licensed under the MIT License.
7
7
  # -----------------------------------------------------------------------------
8
8
 
9
- from .async_client import AsyncClient
10
- from .logging import get_logger
11
- from .sync_client import encode_screenshot_from_bytes
12
- from .types import Image, Step
9
+ from ..client import AsyncClient
10
+ from ..logging import get_logger
11
+ from ..types import Image, Step
12
+ from .base import BaseTask, encode_screenshot_from_bytes
13
13
 
14
14
  logger = get_logger("async_task")
15
15
 
16
16
 
17
- class AsyncTask:
17
+ class AsyncTask(BaseTask):
18
18
  """Async base class for task automation with the OAGI API."""
19
19
 
20
20
  def __init__(
@@ -22,51 +22,64 @@ class AsyncTask:
22
22
  api_key: str | None = None,
23
23
  base_url: str | None = None,
24
24
  model: str = "vision-model-v1",
25
+ temperature: float | None = None,
25
26
  ):
27
+ super().__init__(api_key, base_url, model, temperature)
26
28
  self.client = AsyncClient(base_url=base_url, api_key=api_key)
27
29
  self.api_key = self.client.api_key
28
30
  self.base_url = self.client.base_url
29
- self.task_id: str | None = None
30
- self.task_description: str | None = None
31
- self.model = model
32
31
 
33
- async def init_task(self, task_desc: str, max_steps: int = 5):
34
- """Initialize a new task with the given description."""
35
- self.task_description = task_desc
32
+ async def init_task(
33
+ self,
34
+ task_desc: str,
35
+ max_steps: int = 5,
36
+ last_task_id: str | None = None,
37
+ history_steps: int | None = None,
38
+ ):
39
+ """Initialize a new task with the given description.
40
+
41
+ Args:
42
+ task_desc: Task description
43
+ max_steps: Maximum number of steps (for logging)
44
+ last_task_id: Previous task ID to retrieve history from
45
+ history_steps: Number of historical steps to include (default: 1)
46
+ """
47
+ self._prepare_init_task(task_desc, last_task_id, history_steps)
36
48
  response = await self.client.create_message(
37
49
  model=self.model,
38
50
  screenshot="",
39
51
  task_description=self.task_description,
40
52
  task_id=None,
41
53
  )
42
- self.task_id = response.task_id # Reset task_id for new task
43
- logger.info(f"Async task initialized: '{task_desc}' (max_steps: {max_steps})")
54
+ self._process_init_response(response, task_desc, max_steps, prefix="Async ")
44
55
 
45
56
  async def step(
46
- self, screenshot: Image | bytes, instruction: str | None = None
57
+ self,
58
+ screenshot: Image | bytes,
59
+ instruction: str | None = None,
60
+ temperature: float | None = None,
47
61
  ) -> Step:
48
62
  """Send screenshot to the server and get the next actions.
49
63
 
50
64
  Args:
51
65
  screenshot: Screenshot as Image object or raw bytes
52
66
  instruction: Optional additional instruction for this step (only works with existing task_id)
67
+ temperature: Sampling temperature for this step (overrides task default if provided)
53
68
 
54
69
  Returns:
55
70
  Step: The actions and reasoning for this step
56
71
  """
57
- if not self.task_description:
58
- raise ValueError("Task description must be set. Call init_task() first.")
59
-
60
- logger.debug(f"Executing async step for task: '{self.task_description}'")
72
+ self._validate_step_preconditions()
73
+ self._log_step_execution(prefix="async ")
61
74
 
62
75
  try:
63
76
  # Convert Image to bytes using the protocol
64
- if isinstance(screenshot, Image):
65
- screenshot_bytes = screenshot.read()
66
- else:
67
- screenshot_bytes = screenshot
77
+ screenshot_bytes = self._prepare_screenshot(screenshot)
68
78
  screenshot_b64 = encode_screenshot_from_bytes(screenshot_bytes)
69
79
 
80
+ # Use provided temperature or fall back to task default
81
+ temp = self._get_temperature(temperature)
82
+
70
83
  # Call API
71
84
  response = await self.client.create_message(
72
85
  model=self.model,
@@ -74,33 +87,16 @@ class AsyncTask:
74
87
  task_description=self.task_description,
75
88
  task_id=self.task_id,
76
89
  instruction=instruction,
90
+ last_task_id=self.last_task_id if self.task_id else None,
91
+ history_steps=self.history_steps if self.task_id else None,
92
+ temperature=temp,
77
93
  )
78
94
 
79
95
  # Update task_id from response
80
- if self.task_id != response.task_id:
81
- if self.task_id is None:
82
- logger.debug(f"Task ID assigned: {response.task_id}")
83
- else:
84
- logger.debug(
85
- f"Task ID changed: {self.task_id} -> {response.task_id}"
86
- )
87
- self.task_id = response.task_id
96
+ self._update_task_id(response)
88
97
 
89
98
  # Convert API response to Step
90
- result = Step(
91
- reason=response.reason,
92
- actions=response.actions,
93
- stop=response.is_complete,
94
- )
95
-
96
- if response.is_complete:
97
- logger.info(f"Async task completed after {response.current_step} steps")
98
- else:
99
- logger.debug(
100
- f"Async step {response.current_step} completed with {len(response.actions)} actions"
101
- )
102
-
103
- return result
99
+ return self._build_step_response(response, prefix="Async ")
104
100
 
105
101
  except Exception as e:
106
102
  logger.error(f"Error during async step execution: {e}")
@@ -0,0 +1,73 @@
1
+ # -----------------------------------------------------------------------------
2
+ # Copyright (c) OpenAGI Foundation
3
+ # All rights reserved.
4
+ #
5
+ # This file is part of the official API project.
6
+ # Licensed under the MIT License.
7
+ # -----------------------------------------------------------------------------
8
+
9
+ from ..logging import get_logger
10
+ from ..types import AsyncActionHandler, AsyncImageProvider
11
+ from .async_ import AsyncTask
12
+ from .base import BaseAutoMode
13
+
14
+ logger = get_logger("async_short_task")
15
+
16
+
17
+ class AsyncShortTask(AsyncTask, BaseAutoMode):
18
+ """Async task implementation with automatic mode for short-duration tasks."""
19
+
20
+ def __init__(
21
+ self,
22
+ api_key: str | None = None,
23
+ base_url: str | None = None,
24
+ model: str = "vision-model-v1",
25
+ temperature: float | None = None,
26
+ ):
27
+ super().__init__(
28
+ api_key=api_key, base_url=base_url, model=model, temperature=temperature
29
+ )
30
+
31
+ async def auto_mode(
32
+ self,
33
+ task_desc: str,
34
+ max_steps: int = 5,
35
+ executor: AsyncActionHandler = None,
36
+ image_provider: AsyncImageProvider = None,
37
+ last_task_id: str | None = None,
38
+ history_steps: int | None = None,
39
+ temperature: float | None = None,
40
+ ) -> bool:
41
+ """Run the task in automatic mode with the provided executor and image provider.
42
+
43
+ Args:
44
+ task_desc: Task description
45
+ max_steps: Maximum number of steps
46
+ executor: Async handler to execute actions
47
+ image_provider: Async provider for screenshots
48
+ last_task_id: Previous task ID to retrieve history from
49
+ history_steps: Number of historical steps to include
50
+ temperature: Sampling temperature for all steps (overrides task default if provided)
51
+ """
52
+ self._log_auto_mode_start(task_desc, max_steps, prefix="async ")
53
+
54
+ await self.init_task(
55
+ task_desc,
56
+ max_steps=max_steps,
57
+ last_task_id=last_task_id,
58
+ history_steps=history_steps,
59
+ )
60
+
61
+ for i in range(max_steps):
62
+ self._log_auto_mode_step(i + 1, max_steps, prefix="async ")
63
+ image = await image_provider()
64
+ step = await self.step(image, temperature=temperature)
65
+ if executor:
66
+ self._log_auto_mode_actions(len(step.actions), prefix="async ")
67
+ await executor(step.actions)
68
+ if step.stop:
69
+ self._log_auto_mode_completion(i + 1, prefix="async ")
70
+ return True
71
+
72
+ self._log_auto_mode_max_steps(max_steps, prefix="async ")
73
+ return False
oagi/task/base.py ADDED
@@ -0,0 +1,130 @@
1
+ # -----------------------------------------------------------------------------
2
+ # Copyright (c) OpenAGI Foundation
3
+ # All rights reserved.
4
+ #
5
+ # This file is part of the official API project.
6
+ # Licensed under the MIT License.
7
+ # -----------------------------------------------------------------------------
8
+
9
+ import base64
10
+
11
+ from ..logging import get_logger
12
+ from ..types import Image, Step
13
+ from ..types.models import LLMResponse
14
+
15
+ logger = get_logger("task.base")
16
+
17
+
18
+ def encode_screenshot_from_bytes(image_bytes: bytes) -> str:
19
+ return base64.b64encode(image_bytes).decode("utf-8")
20
+
21
+
22
+ def encode_screenshot_from_file(image_path: str) -> str:
23
+ with open(image_path, "rb") as f:
24
+ return encode_screenshot_from_bytes(f.read())
25
+
26
+
27
+ class BaseTask:
28
+ """Base class with shared task management logic for sync/async tasks."""
29
+
30
+ def __init__(
31
+ self,
32
+ api_key: str | None,
33
+ base_url: str | None,
34
+ model: str,
35
+ temperature: float | None,
36
+ ):
37
+ self.task_id: str | None = None
38
+ self.task_description: str | None = None
39
+ self.model = model
40
+ self.temperature = temperature
41
+ self.last_task_id: str | None = None
42
+ self.history_steps: int | None = None
43
+ # Client will be set by subclasses
44
+ self.api_key: str | None = None
45
+ self.base_url: str | None = None
46
+
47
+ def _prepare_init_task(
48
+ self,
49
+ task_desc: str,
50
+ last_task_id: str | None = None,
51
+ history_steps: int | None = None,
52
+ ):
53
+ self.task_description = task_desc
54
+ self.last_task_id = last_task_id
55
+ self.history_steps = history_steps
56
+
57
+ def _process_init_response(
58
+ self, response: LLMResponse, task_desc: str, max_steps: int, prefix: str = ""
59
+ ):
60
+ self.task_id = response.task_id # Reset task_id for new task
61
+ logger.info(f"{prefix}Task initialized: '{task_desc}' (max_steps: {max_steps})")
62
+ if self.last_task_id:
63
+ logger.info(
64
+ f"Will include {self.history_steps or 1} steps from previous task: {self.last_task_id}"
65
+ )
66
+
67
+ def _validate_step_preconditions(self):
68
+ if not self.task_description:
69
+ raise ValueError("Task description must be set. Call init_task() first.")
70
+
71
+ def _prepare_screenshot(self, screenshot: Image | bytes) -> bytes:
72
+ if isinstance(screenshot, Image):
73
+ return screenshot.read()
74
+ return screenshot
75
+
76
+ def _get_temperature(self, temperature: float | None) -> float | None:
77
+ return temperature if temperature is not None else self.temperature
78
+
79
+ def _update_task_id(self, response: LLMResponse):
80
+ if self.task_id != response.task_id:
81
+ if self.task_id is None:
82
+ logger.debug(f"Task ID assigned: {response.task_id}")
83
+ else:
84
+ logger.debug(f"Task ID changed: {self.task_id} -> {response.task_id}")
85
+ self.task_id = response.task_id
86
+
87
+ def _build_step_response(self, response: LLMResponse, prefix: str = "") -> Step:
88
+ result = Step(
89
+ reason=response.reason,
90
+ actions=response.actions,
91
+ stop=response.is_complete,
92
+ )
93
+
94
+ if response.is_complete:
95
+ logger.info(f"{prefix}Task completed after {response.current_step} steps")
96
+ else:
97
+ logger.debug(
98
+ f"{prefix}Step {response.current_step} completed with {len(response.actions)} actions"
99
+ )
100
+
101
+ return result
102
+
103
+ def _log_step_execution(self, prefix: str = ""):
104
+ logger.debug(f"Executing {prefix}step for task: '{self.task_description}'")
105
+
106
+
107
+ class BaseAutoMode:
108
+ """Base class with shared auto_mode logic for ShortTask implementations."""
109
+
110
+ def _log_auto_mode_start(self, task_desc: str, max_steps: int, prefix: str = ""):
111
+ logger.info(
112
+ f"Starting {prefix}auto mode for task: '{task_desc}' (max_steps: {max_steps})"
113
+ )
114
+
115
+ def _log_auto_mode_step(self, step_num: int, max_steps: int, prefix: str = ""):
116
+ logger.debug(f"{prefix.capitalize()}auto mode step {step_num}/{max_steps}")
117
+
118
+ def _log_auto_mode_actions(self, action_count: int, prefix: str = ""):
119
+ verb = "asynchronously" if "async" in prefix else ""
120
+ logger.debug(f"Executing {action_count} actions {verb}".strip())
121
+
122
+ def _log_auto_mode_completion(self, steps: int, prefix: str = ""):
123
+ logger.info(
124
+ f"{prefix.capitalize()}auto mode completed successfully after {steps} steps"
125
+ )
126
+
127
+ def _log_auto_mode_max_steps(self, max_steps: int, prefix: str = ""):
128
+ logger.warning(
129
+ f"{prefix.capitalize()}auto mode reached max steps ({max_steps}) without completion"
130
+ )
oagi/task/short.py ADDED
@@ -0,0 +1,73 @@
1
+ # -----------------------------------------------------------------------------
2
+ # Copyright (c) OpenAGI Foundation
3
+ # All rights reserved.
4
+ #
5
+ # This file is part of the official API project.
6
+ # Licensed under the MIT License.
7
+ # -----------------------------------------------------------------------------
8
+
9
+ from ..logging import get_logger
10
+ from ..types import ActionHandler, ImageProvider
11
+ from .base import BaseAutoMode
12
+ from .sync import Task
13
+
14
+ logger = get_logger("short_task")
15
+
16
+
17
+ class ShortTask(Task, BaseAutoMode):
18
+ """Task implementation with automatic mode for short-duration tasks."""
19
+
20
+ def __init__(
21
+ self,
22
+ api_key: str | None = None,
23
+ base_url: str | None = None,
24
+ model: str = "vision-model-v1",
25
+ temperature: float | None = None,
26
+ ):
27
+ super().__init__(
28
+ api_key=api_key, base_url=base_url, model=model, temperature=temperature
29
+ )
30
+
31
+ def auto_mode(
32
+ self,
33
+ task_desc: str,
34
+ max_steps: int = 5,
35
+ executor: ActionHandler = None,
36
+ image_provider: ImageProvider = None,
37
+ last_task_id: str | None = None,
38
+ history_steps: int | None = None,
39
+ temperature: float | None = None,
40
+ ) -> bool:
41
+ """Run the task in automatic mode with the provided executor and image provider.
42
+
43
+ Args:
44
+ task_desc: Task description
45
+ max_steps: Maximum number of steps
46
+ executor: Handler to execute actions
47
+ image_provider: Provider for screenshots
48
+ last_task_id: Previous task ID to retrieve history from
49
+ history_steps: Number of historical steps to include
50
+ temperature: Sampling temperature for all steps (overrides task default if provided)
51
+ """
52
+ self._log_auto_mode_start(task_desc, max_steps)
53
+
54
+ self.init_task(
55
+ task_desc,
56
+ max_steps=max_steps,
57
+ last_task_id=last_task_id,
58
+ history_steps=history_steps,
59
+ )
60
+
61
+ for i in range(max_steps):
62
+ self._log_auto_mode_step(i + 1, max_steps)
63
+ image = image_provider()
64
+ step = self.step(image, temperature=temperature)
65
+ if executor:
66
+ self._log_auto_mode_actions(len(step.actions))
67
+ executor(step.actions)
68
+ if step.stop:
69
+ self._log_auto_mode_completion(i + 1)
70
+ return True
71
+
72
+ self._log_auto_mode_max_steps(max_steps)
73
+ return False
@@ -6,14 +6,15 @@
6
6
  # Licensed under the MIT License.
7
7
  # -----------------------------------------------------------------------------
8
8
 
9
- from .logging import get_logger
10
- from .sync_client import SyncClient, encode_screenshot_from_bytes
11
- from .types import Image, Step
9
+ from ..client import SyncClient
10
+ from ..logging import get_logger
11
+ from ..types import Image, Step
12
+ from .base import BaseTask, encode_screenshot_from_bytes
12
13
 
13
14
  logger = get_logger("task")
14
15
 
15
16
 
16
- class Task:
17
+ class Task(BaseTask):
17
18
  """Base class for task automation with the OAGI API."""
18
19
 
19
20
  def __init__(
@@ -21,49 +22,64 @@ class Task:
21
22
  api_key: str | None = None,
22
23
  base_url: str | None = None,
23
24
  model: str = "vision-model-v1",
25
+ temperature: float | None = None,
24
26
  ):
27
+ super().__init__(api_key, base_url, model, temperature)
25
28
  self.client = SyncClient(base_url=base_url, api_key=api_key)
26
29
  self.api_key = self.client.api_key
27
30
  self.base_url = self.client.base_url
28
- self.task_id: str | None = None
29
- self.task_description: str | None = None
30
- self.model = model
31
31
 
32
- def init_task(self, task_desc: str, max_steps: int = 5):
33
- """Initialize a new task with the given description."""
34
- self.task_description = task_desc
32
+ def init_task(
33
+ self,
34
+ task_desc: str,
35
+ max_steps: int = 5,
36
+ last_task_id: str | None = None,
37
+ history_steps: int | None = None,
38
+ ):
39
+ """Initialize a new task with the given description.
40
+
41
+ Args:
42
+ task_desc: Task description
43
+ max_steps: Maximum number of steps (for logging)
44
+ last_task_id: Previous task ID to retrieve history from
45
+ history_steps: Number of historical steps to include (default: 1)
46
+ """
47
+ self._prepare_init_task(task_desc, last_task_id, history_steps)
35
48
  response = self.client.create_message(
36
49
  model=self.model,
37
50
  screenshot="",
38
51
  task_description=self.task_description,
39
52
  task_id=None,
40
53
  )
41
- self.task_id = response.task_id # Reset task_id for new task
42
- logger.info(f"Task initialized: '{task_desc}' (max_steps: {max_steps})")
54
+ self._process_init_response(response, task_desc, max_steps)
43
55
 
44
- def step(self, screenshot: Image | bytes, instruction: str | None = None) -> Step:
56
+ def step(
57
+ self,
58
+ screenshot: Image | bytes,
59
+ instruction: str | None = None,
60
+ temperature: float | None = None,
61
+ ) -> Step:
45
62
  """Send screenshot to the server and get the next actions.
46
63
 
47
64
  Args:
48
65
  screenshot: Screenshot as Image object or raw bytes
49
66
  instruction: Optional additional instruction for this step (only works with existing task_id)
67
+ temperature: Sampling temperature for this step (overrides task default if provided)
50
68
 
51
69
  Returns:
52
70
  Step: The actions and reasoning for this step
53
71
  """
54
- if not self.task_description:
55
- raise ValueError("Task description must be set. Call init_task() first.")
56
-
57
- logger.debug(f"Executing step for task: '{self.task_description}'")
72
+ self._validate_step_preconditions()
73
+ self._log_step_execution()
58
74
 
59
75
  try:
60
76
  # Convert Image to bytes using the protocol
61
- if isinstance(screenshot, Image):
62
- screenshot_bytes = screenshot.read()
63
- else:
64
- screenshot_bytes = screenshot
77
+ screenshot_bytes = self._prepare_screenshot(screenshot)
65
78
  screenshot_b64 = encode_screenshot_from_bytes(screenshot_bytes)
66
79
 
80
+ # Use provided temperature or fall back to task default
81
+ temp = self._get_temperature(temperature)
82
+
67
83
  # Call API
68
84
  response = self.client.create_message(
69
85
  model=self.model,
@@ -71,33 +87,16 @@ class Task:
71
87
  task_description=self.task_description,
72
88
  task_id=self.task_id,
73
89
  instruction=instruction,
90
+ last_task_id=self.last_task_id if self.task_id else None,
91
+ history_steps=self.history_steps if self.task_id else None,
92
+ temperature=temp,
74
93
  )
75
94
 
76
95
  # Update task_id from response
77
- if self.task_id != response.task_id:
78
- if self.task_id is None:
79
- logger.debug(f"Task ID assigned: {response.task_id}")
80
- else:
81
- logger.debug(
82
- f"Task ID changed: {self.task_id} -> {response.task_id}"
83
- )
84
- self.task_id = response.task_id
96
+ self._update_task_id(response)
85
97
 
86
98
  # Convert API response to Step
87
- result = Step(
88
- reason=response.reason,
89
- actions=response.actions,
90
- stop=response.is_complete,
91
- )
92
-
93
- if response.is_complete:
94
- logger.info(f"Task completed after {response.current_step} steps")
95
- else:
96
- logger.debug(
97
- f"Step {response.current_step} completed with {len(response.actions)} actions"
98
- )
99
-
100
- return result
99
+ return self._build_step_response(response)
101
100
 
102
101
  except Exception as e:
103
102
  logger.error(f"Error during step execution: {e}")
@@ -7,7 +7,17 @@
7
7
  # -----------------------------------------------------------------------------
8
8
 
9
9
  from .action import Action, ActionType
10
+ from .client import ErrorDetail, ErrorResponse, LLMResponse, Usage
10
11
  from .image_config import ImageConfig
11
12
  from .step import Step
12
13
 
13
- __all__ = ["Action", "ActionType", "ImageConfig", "Step"]
14
+ __all__ = [
15
+ "Action",
16
+ "ActionType",
17
+ "ErrorDetail",
18
+ "ErrorResponse",
19
+ "ImageConfig",
20
+ "LLMResponse",
21
+ "Step",
22
+ "Usage",
23
+ ]
@@ -0,0 +1,45 @@
1
+ # -----------------------------------------------------------------------------
2
+ # Copyright (c) OpenAGI Foundation
3
+ # All rights reserved.
4
+ #
5
+ # This file is part of the official API project.
6
+ # Licensed under the MIT License.
7
+ # -----------------------------------------------------------------------------
8
+
9
+ from pydantic import BaseModel
10
+
11
+ from .action import Action
12
+
13
+
14
+ class Usage(BaseModel):
15
+ prompt_tokens: int
16
+ completion_tokens: int
17
+ total_tokens: int
18
+
19
+
20
+ class ErrorDetail(BaseModel):
21
+ """Detailed error information."""
22
+
23
+ code: str
24
+ message: str
25
+
26
+
27
+ class ErrorResponse(BaseModel):
28
+ """Standard error response format."""
29
+
30
+ error: ErrorDetail | None
31
+
32
+
33
+ class LLMResponse(BaseModel):
34
+ id: str
35
+ task_id: str
36
+ object: str = "task.completion"
37
+ created: int
38
+ model: str
39
+ task_description: str
40
+ current_step: int
41
+ is_complete: bool
42
+ actions: list[Action]
43
+ reason: str | None = None
44
+ usage: Usage
45
+ error: ErrorDetail | None = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: oagi
3
- Version: 0.4.3
3
+ Version: 0.6.0
4
4
  Summary: Official API of OpenAGI Foundation
5
5
  Project-URL: Homepage, https://github.com/agiopen-org/oagi
6
6
  Author-email: OpenAGI Foundation <contact@agiopen.org>
@@ -0,0 +1,35 @@
1
+ oagi/__init__.py,sha256=XM1BgoAFQveyvevQo1g9C2jrWs3rQaN44HPJZaqpVss,2095
2
+ oagi/async_pyautogui_action_handler.py,sha256=F-lKyePCONWI03WnSxpX_QwxONbvnfdQu51wTod6mdw,1614
3
+ oagi/async_screenshot_maker.py,sha256=pI-dbLcYOzcO1ffgTmozAdbYJQNBPKA7hmqj1RxEmIY,1688
4
+ oagi/async_single_step.py,sha256=VPCfpd3GIzgNtYSG-IiKNflB0qFXQ8sZvlIGEvwcy0w,2965
5
+ oagi/exceptions.py,sha256=VMwVS8ouE9nHhBpN3AZMYt5_U2kGcihWaTnBhoQLquo,1662
6
+ oagi/logging.py,sha256=CWe89mA5MKTipIvfrqSYkv2CAFNBSwHMDQMDkG_g64g,1350
7
+ oagi/pil_image.py,sha256=Zp7YNwyE_AT25ZEFsWKbzMxbO8JOQsJ1Espph5ye8k8,3804
8
+ oagi/pyautogui_action_handler.py,sha256=8IFbU4p907L4b3TV3Eeh0-c-pYL2lYw-_qf1r8TtPTw,9811
9
+ oagi/screenshot_maker.py,sha256=sVuW7jn-K4FmLhmYI-akdNI-UVcTeBzh9P1_qJhoq1s,1282
10
+ oagi/single_step.py,sha256=-OKFyxpFwlflDnayJ6f-mjTxmnFgfF2u__vWlvwF-jI,3072
11
+ oagi/client/__init__.py,sha256=F9DShPUdb6vZYmN1fpM1VYzp4MWqUao_e_R1KYmM4Q4,410
12
+ oagi/client/async_.py,sha256=okeFWLqqaVSZF5AD4WZ2_4jVPeZ_SZefe9yrmkF_lX0,4940
13
+ oagi/client/base.py,sha256=qc2Le28MNpRFvjlO0U0z1rjzqCh9-6YZmO5uOoZO_u8,6538
14
+ oagi/client/sync.py,sha256=yCsgJble5rMAqJjfGqVUgjKt9fhNUmfgnqU6wzNWqH8,4898
15
+ oagi/task/__init__.py,sha256=kvB8ENQ3iII9Uzqa9SSIxBv5JFKv44j2T6J-_Qc8A-4,494
16
+ oagi/task/async_.py,sha256=JS_2ZW1gE8jZd1ZmwyHg8GB0OuiV0a19lIs9psb4Qc4,3996
17
+ oagi/task/async_short.py,sha256=gLPRIb3hekT8YnIy0Vo1EYRo1Pn65KdQLSP26g17gJU,2655
18
+ oagi/task/base.py,sha256=fm7G5e-NH29lII0tPwNjmP8OSwj0dnu_eOetc1lJgjw,4705
19
+ oagi/task/short.py,sha256=W3DOZs66a0YO8Yi5v72BnFIMRWjYkpq-WoNk4h_lYPw,2479
20
+ oagi/task/sync.py,sha256=Scsz0GUvqxZjFHxLLrl2swABAuGDMdST-XLLa34sjZA,3866
21
+ oagi/types/__init__.py,sha256=YXxL-30f92qAf9U6LZuVCtKFG-Pi3xahKedaNxyrxFE,766
22
+ oagi/types/action_handler.py,sha256=NH8E-m5qpGqWcXzTSWfF7W0Xdp8SkzJsbhCmQ0B96cg,1075
23
+ oagi/types/async_action_handler.py,sha256=k1AaqSkFcXlxwW8sn-w0WFHGsIqHFLbcOPrkknmSVug,1116
24
+ oagi/types/async_image_provider.py,sha256=wnhRyPtTmuALt45Qore74-RCkP5yxU9sZGjvOzFqzOk,1170
25
+ oagi/types/image.py,sha256=KgPCCTJ6D5vHIaGZdbTE7eQEa1WlT6G9tf59ZuUCV2U,537
26
+ oagi/types/image_provider.py,sha256=oYFdOYznrK_VOR9egzOjw5wFM5w8EY2sY01pH0ANAgU,1112
27
+ oagi/types/models/__init__.py,sha256=mpJpyko5EN_WUeh3eitI7ZerHlP50yKdAG7TqW7Gr24,625
28
+ oagi/types/models/action.py,sha256=hh6mRRSSWgrW4jpZo71zGMCOcZpV5_COu4148uG6G48,967
29
+ oagi/types/models/client.py,sha256=a6aFwoGG5tBNg3Qr_Dd_TYsg6CpKvA-4tU6b6dCQkoU,983
30
+ oagi/types/models/image_config.py,sha256=tl6abVg_-IAPLwpaWprgknXu7wRWriMg-AEVyUX73v0,1567
31
+ oagi/types/models/step.py,sha256=RSI4H_2rrUBq_xyCoWKaq7JHdJWNobtQppaKC1l0aWU,471
32
+ oagi-0.6.0.dist-info/METADATA,sha256=Y_abrzYAE5P7Sam9syDhSEZpcG6TdRYsstsnnmw3g3c,4799
33
+ oagi-0.6.0.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
34
+ oagi-0.6.0.dist-info/licenses/LICENSE,sha256=sy5DLA2M29jFT4UfWsuBF9BAr3FnRkYtnAu6oDZiIf8,1075
35
+ oagi-0.6.0.dist-info/RECORD,,