oagi-core 0.10.2__py3-none-any.whl → 0.10.3__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.
oagi/agent/default.py CHANGED
@@ -10,6 +10,12 @@ import asyncio
10
10
  import logging
11
11
 
12
12
  from .. import AsyncActor
13
+ from ..constants import (
14
+ DEFAULT_MAX_STEPS,
15
+ DEFAULT_STEP_DELAY,
16
+ DEFAULT_TEMPERATURE,
17
+ MODEL_ACTOR,
18
+ )
13
19
  from ..types import (
14
20
  ActionEvent,
15
21
  AsyncActionHandler,
@@ -36,11 +42,11 @@ class AsyncDefaultAgent:
36
42
  self,
37
43
  api_key: str | None = None,
38
44
  base_url: str | None = None,
39
- model: str = "lux-actor-1",
40
- max_steps: int = 20,
41
- temperature: float | None = 0.5,
45
+ model: str = MODEL_ACTOR,
46
+ max_steps: int = DEFAULT_MAX_STEPS,
47
+ temperature: float | None = DEFAULT_TEMPERATURE,
42
48
  step_observer: AsyncObserver | None = None,
43
- step_delay: float = 0.3,
49
+ step_delay: float = DEFAULT_STEP_DELAY,
44
50
  ):
45
51
  self.api_key = api_key
46
52
  self.base_url = base_url
oagi/agent/factories.py CHANGED
@@ -6,6 +6,16 @@
6
6
  # Licensed under the MIT License.
7
7
  # -----------------------------------------------------------------------------
8
8
  from oagi.agent.tasker import TaskerAgent
9
+ from oagi.constants import (
10
+ DEFAULT_MAX_STEPS,
11
+ DEFAULT_MAX_STEPS_TASKER,
12
+ DEFAULT_MAX_STEPS_THINKER,
13
+ DEFAULT_REFLECTION_INTERVAL_TASKER,
14
+ DEFAULT_STEP_DELAY,
15
+ DEFAULT_TEMPERATURE_LOW,
16
+ MODEL_ACTOR,
17
+ MODEL_THINKER,
18
+ )
9
19
  from oagi.types import AsyncStepObserver
10
20
 
11
21
  from .default import AsyncDefaultAgent
@@ -17,11 +27,11 @@ from .registry import async_agent_register
17
27
  def create_default_agent(
18
28
  api_key: str | None = None,
19
29
  base_url: str | None = None,
20
- model: str = "lux-actor-1",
21
- max_steps: int = 20,
22
- temperature: float = 0.1,
30
+ model: str = MODEL_ACTOR,
31
+ max_steps: int = DEFAULT_MAX_STEPS,
32
+ temperature: float = DEFAULT_TEMPERATURE_LOW,
23
33
  step_observer: AsyncStepObserver | None = None,
24
- step_delay: float = 0.3,
34
+ step_delay: float = DEFAULT_STEP_DELAY,
25
35
  ) -> AsyncAgent:
26
36
  return AsyncDefaultAgent(
27
37
  api_key=api_key,
@@ -38,11 +48,11 @@ def create_default_agent(
38
48
  def create_thinker_agent(
39
49
  api_key: str | None = None,
40
50
  base_url: str | None = None,
41
- model: str = "lux-thinker-1",
42
- max_steps: int = 100,
43
- temperature: float = 0.1,
51
+ model: str = MODEL_THINKER,
52
+ max_steps: int = DEFAULT_MAX_STEPS_THINKER,
53
+ temperature: float = DEFAULT_TEMPERATURE_LOW,
44
54
  step_observer: AsyncStepObserver | None = None,
45
- step_delay: float = 0.3,
55
+ step_delay: float = DEFAULT_STEP_DELAY,
46
56
  ) -> AsyncAgent:
47
57
  return AsyncDefaultAgent(
48
58
  api_key=api_key,
@@ -59,12 +69,12 @@ def create_thinker_agent(
59
69
  def create_planner_agent(
60
70
  api_key: str | None = None,
61
71
  base_url: str | None = None,
62
- model: str = "lux-actor-1",
63
- max_steps: int = 30,
64
- temperature: float = 0.1,
65
- reflection_interval: int = 20,
72
+ model: str = MODEL_ACTOR,
73
+ max_steps: int = DEFAULT_MAX_STEPS_TASKER,
74
+ temperature: float = DEFAULT_TEMPERATURE_LOW,
75
+ reflection_interval: int = DEFAULT_REFLECTION_INTERVAL_TASKER,
66
76
  step_observer: AsyncStepObserver | None = None,
67
- step_delay: float = 0.3,
77
+ step_delay: float = DEFAULT_STEP_DELAY,
68
78
  ) -> AsyncAgent:
69
79
  tasker = TaskerAgent(
70
80
  api_key=api_key,
@@ -10,6 +10,7 @@ import json
10
10
  from typing import Any
11
11
 
12
12
  from ...client import AsyncClient
13
+ from ...constants import DEFAULT_REFLECTION_INTERVAL
13
14
  from ...types import URL, Image
14
15
  from .memory import PlannerMemory
15
16
  from .models import Action, PlannerOutput, ReflectionOutput
@@ -175,7 +176,7 @@ class Planner:
175
176
  memory: PlannerMemory | None = None,
176
177
  todo_index: int | None = None,
177
178
  current_instruction: str | None = None,
178
- reflection_interval: int = 4,
179
+ reflection_interval: int = DEFAULT_REFLECTION_INTERVAL,
179
180
  ) -> ReflectionOutput:
180
181
  """Reflect on recent actions and progress.
181
182
 
@@ -12,6 +12,13 @@ from datetime import datetime
12
12
  from typing import Any
13
13
 
14
14
  from oagi import AsyncActor
15
+ from oagi.constants import (
16
+ DEFAULT_MAX_STEPS,
17
+ DEFAULT_REFLECTION_INTERVAL,
18
+ DEFAULT_STEP_DELAY,
19
+ DEFAULT_TEMPERATURE,
20
+ MODEL_ACTOR,
21
+ )
15
22
  from oagi.types import (
16
23
  URL,
17
24
  ActionEvent,
@@ -52,15 +59,15 @@ class TaskeeAgent(AsyncAgent):
52
59
  self,
53
60
  api_key: str | None = None,
54
61
  base_url: str | None = None,
55
- model: str = "lux-actor-1",
56
- max_steps: int = 20,
57
- reflection_interval: int = 4,
58
- temperature: float = 0.5,
62
+ model: str = MODEL_ACTOR,
63
+ max_steps: int = DEFAULT_MAX_STEPS,
64
+ reflection_interval: int = DEFAULT_REFLECTION_INTERVAL,
65
+ temperature: float = DEFAULT_TEMPERATURE,
59
66
  planner: Planner | None = None,
60
67
  external_memory: PlannerMemory | None = None,
61
68
  todo_index: int | None = None,
62
69
  step_observer: AsyncObserver | None = None,
63
- step_delay: float = 0.3,
70
+ step_delay: float = DEFAULT_STEP_DELAY,
64
71
  ):
65
72
  """Initialize the taskee agent.
66
73
 
@@ -9,6 +9,13 @@
9
9
  import logging
10
10
  from typing import Any
11
11
 
12
+ from oagi.constants import (
13
+ DEFAULT_MAX_STEPS_TASKER,
14
+ DEFAULT_REFLECTION_INTERVAL,
15
+ DEFAULT_STEP_DELAY,
16
+ DEFAULT_TEMPERATURE,
17
+ MODEL_ACTOR,
18
+ )
12
19
  from oagi.types import AsyncActionHandler, AsyncImageProvider, AsyncObserver, SplitEvent
13
20
 
14
21
  from ..protocol import AsyncAgent
@@ -34,13 +41,13 @@ class TaskerAgent(AsyncAgent):
34
41
  self,
35
42
  api_key: str | None = None,
36
43
  base_url: str | None = None,
37
- model: str = "lux-actor-1",
38
- max_steps: int = 60,
39
- temperature: float = 0.5,
40
- reflection_interval: int = 4,
44
+ model: str = MODEL_ACTOR,
45
+ max_steps: int = DEFAULT_MAX_STEPS_TASKER,
46
+ temperature: float = DEFAULT_TEMPERATURE,
47
+ reflection_interval: int = DEFAULT_REFLECTION_INTERVAL,
41
48
  planner: Planner | None = None,
42
49
  step_observer: AsyncObserver | None = None,
43
- step_delay: float = 0.3,
50
+ step_delay: float = DEFAULT_STEP_DELAY,
44
51
  ):
45
52
  """Initialize the tasker agent.
46
53
 
oagi/cli/agent.py CHANGED
@@ -14,6 +14,17 @@ import time
14
14
  import traceback
15
15
 
16
16
  from oagi.agent.observer import AsyncAgentObserver
17
+ from oagi.constants import (
18
+ API_KEY_HELP_URL,
19
+ DEFAULT_BASE_URL,
20
+ DEFAULT_MAX_STEPS,
21
+ DEFAULT_MAX_STEPS_THINKER,
22
+ DEFAULT_STEP_DELAY,
23
+ DEFAULT_TEMPERATURE,
24
+ MODE_ACTOR,
25
+ MODEL_ACTOR,
26
+ MODEL_THINKER,
27
+ )
17
28
  from oagi.exceptions import check_optional_dependency
18
29
 
19
30
  from .display import display_step_table
@@ -32,7 +43,7 @@ def add_agent_parser(subparsers: argparse._SubParsersAction) -> None:
32
43
  "instruction", type=str, help="Task instruction for the agent to execute"
33
44
  )
34
45
  run_parser.add_argument(
35
- "--model", type=str, help="Model to use (default: lux-actor-1)"
46
+ "--model", type=str, help=f"Model to use (default: {MODEL_ACTOR})"
36
47
  )
37
48
  run_parser.add_argument(
38
49
  "--max-steps", type=int, help="Maximum number of steps (default: 20)"
@@ -43,8 +54,8 @@ def add_agent_parser(subparsers: argparse._SubParsersAction) -> None:
43
54
  run_parser.add_argument(
44
55
  "--mode",
45
56
  type=str,
46
- default="actor",
47
- help="Agent mode to use (default: actor). Available modes: actor, planner",
57
+ default=MODE_ACTOR,
58
+ help=f"Agent mode to use (default: {MODE_ACTOR}). Available modes: actor, planner",
48
59
  )
49
60
  run_parser.add_argument(
50
61
  "--oagi-api-key", type=str, help="OAGI API key (default: OAGI_API_KEY env var)"
@@ -52,7 +63,7 @@ def add_agent_parser(subparsers: argparse._SubParsersAction) -> None:
52
63
  run_parser.add_argument(
53
64
  "--oagi-base-url",
54
65
  type=str,
55
- help="OAGI base URL (default: https://api.agiopen.org, or OAGI_BASE_URL env var)",
66
+ help=f"OAGI base URL (default: {DEFAULT_BASE_URL}, or OAGI_BASE_URL env var)",
56
67
  )
57
68
  run_parser.add_argument(
58
69
  "--export",
@@ -68,7 +79,7 @@ def add_agent_parser(subparsers: argparse._SubParsersAction) -> None:
68
79
  run_parser.add_argument(
69
80
  "--step-delay",
70
81
  type=float,
71
- help="Delay in seconds after each step before next screenshot (default: 0.3)",
82
+ help=f"Delay in seconds after each step before next screenshot (default: {DEFAULT_STEP_DELAY})",
72
83
  )
73
84
 
74
85
  # agent permission command
@@ -189,19 +200,23 @@ def run_agent(args: argparse.Namespace) -> None:
189
200
  if not api_key:
190
201
  print(
191
202
  "Error: OAGI API key not provided.\n"
192
- "Set OAGI_API_KEY environment variable or use --oagi-api-key flag.",
203
+ "Set OAGI_API_KEY environment variable or use --oagi-api-key flag.\n"
204
+ f"Get your API key at {API_KEY_HELP_URL}",
193
205
  file=sys.stderr,
194
206
  )
195
207
  sys.exit(1)
196
208
 
197
- base_url = args.oagi_base_url or os.getenv(
198
- "OAGI_BASE_URL", "https://api.agiopen.org"
209
+ base_url = args.oagi_base_url or os.getenv("OAGI_BASE_URL", DEFAULT_BASE_URL)
210
+ model = args.model or MODEL_ACTOR
211
+ default_max_steps = (
212
+ DEFAULT_MAX_STEPS_THINKER if model == MODEL_THINKER else DEFAULT_MAX_STEPS
199
213
  )
200
- model = args.model or "lux-actor-1"
201
- max_steps = args.max_steps or 20
202
- temperature = args.temperature if args.temperature is not None else 0.5
203
- mode = args.mode or "actor"
204
- step_delay = args.step_delay if args.step_delay is not None else 0.3
214
+ max_steps = args.max_steps or default_max_steps
215
+ temperature = (
216
+ args.temperature if args.temperature is not None else DEFAULT_TEMPERATURE
217
+ )
218
+ mode = args.mode or MODE_ACTOR
219
+ step_delay = args.step_delay if args.step_delay is not None else DEFAULT_STEP_DELAY
205
220
  export_format = args.export
206
221
  export_file = args.export_file
207
222
 
oagi/cli/display.py CHANGED
@@ -29,7 +29,8 @@ def display_step_table(
29
29
  actions_display = []
30
30
  for action in step.actions[:3]:
31
31
  arg = action.argument[:20] if action.argument else ""
32
- actions_display.append(f"{action.type.value}({arg})")
32
+ count_str = f" x{action.count}" if action.count and action.count > 1 else ""
33
+ actions_display.append(f"{action.type.value}({arg}){count_str}")
33
34
 
34
35
  actions_str = ", ".join(actions_display)
35
36
  if len(step.actions) > 3:
oagi/cli/server.py CHANGED
@@ -25,7 +25,7 @@ def add_server_parser(subparsers: argparse._SubParsersAction) -> None:
25
25
  start_parser.add_argument(
26
26
  "--host",
27
27
  type=str,
28
- help="Server host (default: 0.0.0.0, or OAGI_SERVER_HOST env var)",
28
+ help="Server host (default: 127.0.0.1, or OAGI_SERVER_HOST env var)",
29
29
  )
30
30
  start_parser.add_argument(
31
31
  "--port",
oagi/cli/utils.py CHANGED
@@ -11,6 +11,7 @@ import os
11
11
  import sys
12
12
  from importlib.metadata import version as get_version
13
13
 
14
+ from oagi.constants import DEFAULT_BASE_URL, MODEL_ACTOR
14
15
  from oagi.exceptions import check_optional_dependency
15
16
 
16
17
 
@@ -55,10 +56,10 @@ def display_version() -> None:
55
56
  def display_config() -> None:
56
57
  config_vars = {
57
58
  "OAGI_API_KEY": os.getenv("OAGI_API_KEY", ""),
58
- "OAGI_BASE_URL": os.getenv("OAGI_BASE_URL", "https://api.agiopen.org"),
59
- "OAGI_DEFAULT_MODEL": os.getenv("OAGI_DEFAULT_MODEL", "lux-actor-1"),
59
+ "OAGI_BASE_URL": os.getenv("OAGI_BASE_URL", DEFAULT_BASE_URL),
60
+ "OAGI_DEFAULT_MODEL": os.getenv("OAGI_DEFAULT_MODEL", MODEL_ACTOR),
60
61
  "OAGI_LOG_LEVEL": os.getenv("OAGI_LOG_LEVEL", "INFO"),
61
- "OAGI_SERVER_HOST": os.getenv("OAGI_SERVER_HOST", "0.0.0.0"),
62
+ "OAGI_SERVER_HOST": os.getenv("OAGI_SERVER_HOST", "127.0.0.1"),
62
63
  "OAGI_SERVER_PORT": os.getenv("OAGI_SERVER_PORT", "8000"),
63
64
  "OAGI_MAX_STEPS": os.getenv("OAGI_MAX_STEPS", "30"),
64
65
  }
oagi/client/async_.py CHANGED
@@ -10,6 +10,13 @@ from functools import wraps
10
10
 
11
11
  import httpx
12
12
 
13
+ from ..constants import (
14
+ API_HEALTH_ENDPOINT,
15
+ API_V1_FILE_UPLOAD_ENDPOINT,
16
+ API_V1_GENERATE_ENDPOINT,
17
+ API_V2_MESSAGE_ENDPOINT,
18
+ HTTP_CLIENT_TIMEOUT,
19
+ )
13
20
  from ..logging import get_logger
14
21
  from ..types import Image
15
22
  from ..types.models import GenerateResponse, LLMResponse, UploadFileResponse
@@ -41,7 +48,7 @@ class AsyncClient(BaseClient[httpx.AsyncClient]):
41
48
  def __init__(self, base_url: str | None = None, api_key: str | None = None):
42
49
  super().__init__(base_url, api_key)
43
50
  self.client = httpx.AsyncClient(base_url=self.base_url)
44
- self.upload_client = httpx.AsyncClient(timeout=60) # client for uploading image
51
+ self.upload_client = httpx.AsyncClient(timeout=HTTP_CLIENT_TIMEOUT)
45
52
  logger.info(f"AsyncClient initialized with base_url: {self.base_url}")
46
53
 
47
54
  async def __aenter__(self):
@@ -121,7 +128,10 @@ class AsyncClient(BaseClient[httpx.AsyncClient]):
121
128
  # Make request
122
129
  try:
123
130
  response = await self.client.post(
124
- "/v2/message", json=payload, headers=headers, timeout=self.timeout
131
+ API_V2_MESSAGE_ENDPOINT,
132
+ json=payload,
133
+ headers=headers,
134
+ timeout=self.timeout,
125
135
  )
126
136
  return self._process_response(response)
127
137
  except (httpx.TimeoutException, httpx.NetworkError) as e:
@@ -136,7 +146,7 @@ class AsyncClient(BaseClient[httpx.AsyncClient]):
136
146
  """
137
147
  logger.debug("Making async health check request")
138
148
  try:
139
- response = await self.client.get("/health")
149
+ response = await self.client.get(API_HEALTH_ENDPOINT)
140
150
  response.raise_for_status()
141
151
  result = response.json()
142
152
  logger.debug("Async health check successful")
@@ -158,12 +168,12 @@ class AsyncClient(BaseClient[httpx.AsyncClient]):
158
168
  Returns:
159
169
  UploadFileResponse: The response from /v1/file/upload with uuid and presigned S3 URL
160
170
  """
161
- logger.debug("Making async API request to /v1/file/upload")
171
+ logger.debug(f"Making async API request to {API_V1_FILE_UPLOAD_ENDPOINT}")
162
172
 
163
173
  try:
164
174
  headers = self._build_headers(api_version)
165
175
  response = await self.client.get(
166
- "/v1/file/upload", headers=headers, timeout=self.timeout
176
+ API_V1_FILE_UPLOAD_ENDPOINT, headers=headers, timeout=self.timeout
167
177
  )
168
178
  return self._process_upload_response(response)
169
179
  except (httpx.TimeoutException, httpx.NetworkError, httpx.HTTPStatusError) as e:
@@ -283,7 +293,10 @@ class AsyncClient(BaseClient[httpx.AsyncClient]):
283
293
  # Make request
284
294
  try:
285
295
  response = await self.client.post(
286
- "/v1/generate", json=payload, headers=headers, timeout=self.timeout
296
+ API_V1_GENERATE_ENDPOINT,
297
+ json=payload,
298
+ headers=headers,
299
+ timeout=self.timeout,
287
300
  )
288
301
  return self._process_generate_response(response)
289
302
  except (httpx.TimeoutException, httpx.NetworkError) as e:
oagi/client/base.py CHANGED
@@ -11,6 +11,7 @@ from typing import Any, Generic, TypeVar
11
11
 
12
12
  import httpx
13
13
 
14
+ from ..constants import API_KEY_HELP_URL, DEFAULT_BASE_URL, HTTP_CLIENT_TIMEOUT
14
15
  from ..exceptions import (
15
16
  APIError,
16
17
  AuthenticationError,
@@ -41,20 +42,19 @@ class BaseClient(Generic[HttpClientT]):
41
42
 
42
43
  def __init__(self, base_url: str | None = None, api_key: str | None = None):
43
44
  # Get from environment if not provided
44
- self.base_url = (
45
- base_url or os.getenv("OAGI_BASE_URL") or "https://api.agiopen.org"
46
- )
45
+ self.base_url = base_url or os.getenv("OAGI_BASE_URL") or DEFAULT_BASE_URL
47
46
  self.api_key = api_key or os.getenv("OAGI_API_KEY")
48
47
 
49
48
  # Validate required configuration
50
49
  if not self.api_key:
51
50
  raise ConfigurationError(
52
51
  "OAGI API key must be provided either as 'api_key' parameter or "
53
- "OAGI_API_KEY environment variable"
52
+ "OAGI_API_KEY environment variable. "
53
+ f"Get your API key at {API_KEY_HELP_URL}"
54
54
  )
55
55
 
56
56
  self.base_url = self.base_url.rstrip("/")
57
- self.timeout = 60
57
+ self.timeout = HTTP_CLIENT_TIMEOUT
58
58
  self.client: HttpClientT # Will be set by subclasses
59
59
 
60
60
  logger.info(f"Client initialized with base_url: {self.base_url}")
@@ -273,22 +273,20 @@ class BaseClient(Generic[HttpClientT]):
273
273
  NetworkError: If network error occurs
274
274
  APIError: If API returns error or invalid response
275
275
  """
276
+ response_data = self._parse_response_json(response)
277
+
278
+ # Check for error status codes first (follows _process_response pattern)
279
+ if response.status_code != 200:
280
+ self._handle_response_error(response, response_data)
281
+
276
282
  try:
277
- response_data = response.json()
278
283
  upload_file_response = UploadFileResponse(**response_data)
279
284
  logger.debug("Calling /v1/file/upload successful")
280
285
  return upload_file_response
281
- except ValueError:
282
- logger.error(f"Non-JSON API response: {response.status_code}")
283
- raise APIError(
284
- f"Invalid response format (status {response.status_code})",
285
- status_code=response.status_code,
286
- response=response,
287
- )
288
- except KeyError as e:
289
- logger.error(f"Invalid response: {response.status_code}")
286
+ except Exception as e:
287
+ logger.error(f"Invalid upload response: {response.status_code}")
290
288
  raise APIError(
291
- f"Invalid presigned S3 URL response: missing field {e}",
289
+ f"Invalid presigned S3 URL response: {e}",
292
290
  status_code=response.status_code,
293
291
  response=response,
294
292
  )
oagi/client/sync.py CHANGED
@@ -11,6 +11,13 @@ from functools import wraps
11
11
  import httpx
12
12
  from httpx import Response
13
13
 
14
+ from ..constants import (
15
+ API_HEALTH_ENDPOINT,
16
+ API_V1_FILE_UPLOAD_ENDPOINT,
17
+ API_V1_GENERATE_ENDPOINT,
18
+ API_V2_MESSAGE_ENDPOINT,
19
+ HTTP_CLIENT_TIMEOUT,
20
+ )
14
21
  from ..logging import get_logger
15
22
  from ..types import Image
16
23
  from ..types.models import GenerateResponse, LLMResponse, UploadFileResponse
@@ -46,7 +53,7 @@ class SyncClient(BaseClient[httpx.Client]):
46
53
  def __init__(self, base_url: str | None = None, api_key: str | None = None):
47
54
  super().__init__(base_url, api_key)
48
55
  self.client = httpx.Client(base_url=self.base_url)
49
- self.upload_client = httpx.Client(timeout=60) # client for uploading image
56
+ self.upload_client = httpx.Client(timeout=HTTP_CLIENT_TIMEOUT)
50
57
  logger.info(f"SyncClient initialized with base_url: {self.base_url}")
51
58
 
52
59
  def __enter__(self):
@@ -124,7 +131,10 @@ class SyncClient(BaseClient[httpx.Client]):
124
131
  # Make request
125
132
  try:
126
133
  response = self.client.post(
127
- "/v2/message", json=payload, headers=headers, timeout=self.timeout
134
+ API_V2_MESSAGE_ENDPOINT,
135
+ json=payload,
136
+ headers=headers,
137
+ timeout=self.timeout,
128
138
  )
129
139
  return self._process_response(response)
130
140
  except (httpx.TimeoutException, httpx.NetworkError) as e:
@@ -139,7 +149,7 @@ class SyncClient(BaseClient[httpx.Client]):
139
149
  """
140
150
  logger.debug("Making health check request")
141
151
  try:
142
- response = self.client.get("/health")
152
+ response = self.client.get(API_HEALTH_ENDPOINT)
143
153
  response.raise_for_status()
144
154
  result = response.json()
145
155
  logger.debug("Health check successful")
@@ -161,12 +171,12 @@ class SyncClient(BaseClient[httpx.Client]):
161
171
  Returns:
162
172
  UploadFileResponse: The response from /v1/file/upload with uuid and presigned S3 URL
163
173
  """
164
- logger.debug("Making API request to /v1/file/upload")
174
+ logger.debug(f"Making API request to {API_V1_FILE_UPLOAD_ENDPOINT}")
165
175
 
166
176
  try:
167
177
  headers = self._build_headers(api_version)
168
178
  response = self.client.get(
169
- "/v1/file/upload", headers=headers, timeout=self.timeout
179
+ API_V1_FILE_UPLOAD_ENDPOINT, headers=headers, timeout=self.timeout
170
180
  )
171
181
  return self._process_upload_response(response)
172
182
  except (httpx.TimeoutException, httpx.NetworkError, httpx.HTTPStatusError) as e:
@@ -286,7 +296,10 @@ class SyncClient(BaseClient[httpx.Client]):
286
296
  # Make request
287
297
  try:
288
298
  response = self.client.post(
289
- "/v1/generate", json=payload, headers=headers, timeout=self.timeout
299
+ API_V1_GENERATE_ENDPOINT,
300
+ json=payload,
301
+ headers=headers,
302
+ timeout=self.timeout,
290
303
  )
291
304
  return self._process_generate_response(response)
292
305
  except (httpx.TimeoutException, httpx.NetworkError) as e:
oagi/constants.py ADDED
@@ -0,0 +1,43 @@
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
+ # URLs & API Endpoints
10
+ DEFAULT_BASE_URL = "https://api.agiopen.org"
11
+ API_KEY_HELP_URL = "https://developer.agiopen.org/api-keys"
12
+ API_V2_MESSAGE_ENDPOINT = "/v2/message"
13
+ API_V1_FILE_UPLOAD_ENDPOINT = "/v1/file/upload"
14
+ API_V1_GENERATE_ENDPOINT = "/v1/generate"
15
+ API_HEALTH_ENDPOINT = "/health"
16
+
17
+ # Model identifiers
18
+ MODEL_ACTOR = "lux-actor-1"
19
+ MODEL_THINKER = "lux-thinker-1"
20
+
21
+ # Agent modes
22
+ MODE_ACTOR = "actor"
23
+ MODE_THINKER = "thinker"
24
+ MODE_TASKER = "tasker"
25
+
26
+ # Default max steps per model
27
+ DEFAULT_MAX_STEPS = 20
28
+ DEFAULT_MAX_STEPS_THINKER = 100
29
+ DEFAULT_MAX_STEPS_TASKER = 60
30
+
31
+ # Reflection intervals
32
+ DEFAULT_REFLECTION_INTERVAL = 4
33
+ DEFAULT_REFLECTION_INTERVAL_TASKER = 20
34
+
35
+ # Timing & Delays
36
+ DEFAULT_STEP_DELAY = 0.3
37
+
38
+ # Temperature Defaults
39
+ DEFAULT_TEMPERATURE = 0.5
40
+ DEFAULT_TEMPERATURE_LOW = 0.1
41
+
42
+ # Timeout Values
43
+ HTTP_CLIENT_TIMEOUT = 60
@@ -64,7 +64,8 @@ class PyautoguiConfig(BaseModel):
64
64
  default=0.5, description="Duration for drag operations in seconds"
65
65
  )
66
66
  scroll_amount: int = Field(
67
- default=30, description="Amount to scroll (positive for up, negative for down)"
67
+ default=2 if sys.platform == "darwin" else 100,
68
+ description="Amount to scroll (positive for up, negative for down)",
68
69
  )
69
70
  wait_duration: float = Field(
70
71
  default=1.0, description="Duration for wait actions in seconds"
oagi/server/config.py CHANGED
@@ -8,6 +8,7 @@
8
8
 
9
9
  from pydantic import Field
10
10
 
11
+ from ..constants import DEFAULT_MAX_STEPS, MODEL_ACTOR
11
12
  from ..exceptions import check_optional_dependency
12
13
 
13
14
  check_optional_dependency("pydantic_settings", "Server features", "server")
@@ -20,7 +21,7 @@ class ServerConfig(BaseSettings):
20
21
  oagi_base_url: str = Field(default="https://api.agiopen.org", alias="OAGI_BASE_URL")
21
22
 
22
23
  # Server settings
23
- server_host: str = Field(default="0.0.0.0", alias="OAGI_SERVER_HOST")
24
+ server_host: str = Field(default="127.0.0.1", alias="OAGI_SERVER_HOST")
24
25
  server_port: int = Field(default=8000, alias="OAGI_SERVER_PORT")
25
26
  cors_allowed_origins: str = Field(default="*", alias="OAGI_CORS_ORIGINS")
26
27
 
@@ -28,11 +29,13 @@ class ServerConfig(BaseSettings):
28
29
  session_timeout_seconds: float = Field(default=10.0)
29
30
 
30
31
  # Model settings
31
- default_model: str = Field(default="lux-actor-1", alias="OAGI_DEFAULT_MODEL")
32
+ default_model: str = Field(default=MODEL_ACTOR, alias="OAGI_DEFAULT_MODEL")
32
33
  default_temperature: float = Field(default=0.5, ge=0.0, le=2.0)
33
34
 
34
35
  # Agent settings
35
- max_steps: int = Field(default=20, alias="OAGI_MAX_STEPS", ge=1, le=100)
36
+ max_steps: int = Field(
37
+ default=DEFAULT_MAX_STEPS, alias="OAGI_MAX_STEPS", ge=1, le=200
38
+ )
36
39
 
37
40
  # Socket.IO settings
38
41
  socketio_path: str = Field(default="/socket.io")
oagi/server/models.py CHANGED
@@ -10,13 +10,15 @@ from typing import Literal
10
10
 
11
11
  from pydantic import BaseModel, Field
12
12
 
13
+ from ..constants import DEFAULT_TEMPERATURE_LOW, MODE_ACTOR, MODEL_ACTOR
14
+
13
15
 
14
16
  # Client-to-server events
15
17
  class InitEventData(BaseModel):
16
18
  instruction: str = Field(...)
17
- mode: str | None = Field(default="actor")
18
- model: str | None = Field(default="lux-actor-1")
19
- temperature: float | None = Field(default=0.1, ge=0.0, le=2.0)
19
+ mode: str | None = Field(default=MODE_ACTOR)
20
+ model: str | None = Field(default=MODEL_ACTOR)
21
+ temperature: float | None = Field(default=DEFAULT_TEMPERATURE_LOW, ge=0.0, le=2.0)
20
22
 
21
23
 
22
24
  # Server-to-client events
@@ -11,14 +11,16 @@ from datetime import datetime
11
11
  from typing import Any
12
12
  from uuid import uuid4
13
13
 
14
+ from ..constants import MODE_ACTOR, MODEL_ACTOR
15
+
14
16
 
15
17
  class Session:
16
18
  def __init__(
17
19
  self,
18
20
  session_id: str,
19
21
  instruction: str,
20
- mode: str = "actor",
21
- model: str = "lux-actor-1",
22
+ mode: str = MODE_ACTOR,
23
+ model: str = MODEL_ACTOR,
22
24
  temperature: float = 0.0,
23
25
  ):
24
26
  self.session_id: str = session_id
@@ -53,8 +55,8 @@ class SessionStore:
53
55
  def create_session(
54
56
  self,
55
57
  instruction: str,
56
- mode: str = "actor",
57
- model: str = "lux-actor-1",
58
+ mode: str = MODE_ACTOR,
59
+ model: str = MODEL_ACTOR,
58
60
  temperature: float = 0.0,
59
61
  session_id: str | None = None,
60
62
  ) -> str:
@@ -15,6 +15,7 @@ from pydantic import ValidationError
15
15
 
16
16
  from ..agent import AsyncDefaultAgent, create_agent
17
17
  from ..client import AsyncClient
18
+ from ..constants import MODE_ACTOR
18
19
  from ..exceptions import check_optional_dependency
19
20
  from ..types.models.action import (
20
21
  Action,
@@ -80,7 +81,7 @@ class SessionNamespace(socketio.AsyncNamespace):
80
81
  session = Session(
81
82
  session_id=session_id,
82
83
  instruction="",
83
- mode="actor", # Default mode
84
+ mode=MODE_ACTOR,
84
85
  model=self.config.default_model,
85
86
  temperature=self.config.default_temperature,
86
87
  )
oagi/task/async_.py CHANGED
@@ -9,6 +9,7 @@
9
9
  import warnings
10
10
 
11
11
  from ..client import AsyncClient
12
+ from ..constants import DEFAULT_MAX_STEPS, MODEL_ACTOR
12
13
  from ..types import URL, Image, Step
13
14
  from .base import BaseActor
14
15
 
@@ -20,7 +21,7 @@ class AsyncActor(BaseActor):
20
21
  self,
21
22
  api_key: str | None = None,
22
23
  base_url: str | None = None,
23
- model: str = "lux-actor-1",
24
+ model: str = MODEL_ACTOR,
24
25
  temperature: float | None = None,
25
26
  ):
26
27
  super().__init__(api_key, base_url, model, temperature)
@@ -31,7 +32,7 @@ class AsyncActor(BaseActor):
31
32
  async def init_task(
32
33
  self,
33
34
  task_desc: str,
34
- max_steps: int = 20,
35
+ max_steps: int = DEFAULT_MAX_STEPS,
35
36
  ):
36
37
  """Initialize a new task with the given description.
37
38
 
@@ -89,7 +90,7 @@ class AsyncTask(AsyncActor):
89
90
  self,
90
91
  api_key: str | None = None,
91
92
  base_url: str | None = None,
92
- model: str = "lux-actor-1",
93
+ model: str = MODEL_ACTOR,
93
94
  temperature: float | None = None,
94
95
  ):
95
96
  warnings.warn(
oagi/task/async_short.py CHANGED
@@ -8,6 +8,7 @@
8
8
 
9
9
  import warnings
10
10
 
11
+ from ..constants import DEFAULT_MAX_STEPS, MODEL_ACTOR
11
12
  from ..logging import get_logger
12
13
  from ..types import AsyncActionHandler, AsyncImageProvider
13
14
  from .async_ import AsyncActor
@@ -27,7 +28,7 @@ class AsyncShortTask(AsyncActor, BaseAutoMode):
27
28
  self,
28
29
  api_key: str | None = None,
29
30
  base_url: str | None = None,
30
- model: str = "lux-actor-1",
31
+ model: str = MODEL_ACTOR,
31
32
  temperature: float | None = None,
32
33
  ):
33
34
  warnings.warn(
@@ -43,7 +44,7 @@ class AsyncShortTask(AsyncActor, BaseAutoMode):
43
44
  async def auto_mode(
44
45
  self,
45
46
  task_desc: str,
46
- max_steps: int = 20,
47
+ max_steps: int = DEFAULT_MAX_STEPS,
47
48
  executor: AsyncActionHandler = None,
48
49
  image_provider: AsyncImageProvider = None,
49
50
  temperature: float | None = None,
oagi/task/base.py CHANGED
@@ -8,6 +8,7 @@
8
8
 
9
9
  from uuid import uuid4
10
10
 
11
+ from ..constants import DEFAULT_MAX_STEPS
11
12
  from ..logging import get_logger
12
13
  from ..types import URL, Image, Step
13
14
  from ..types.models import LLMResponse
@@ -30,7 +31,7 @@ class BaseActor:
30
31
  self.model = model
31
32
  self.temperature = temperature
32
33
  self.message_history: list = [] # OpenAI-compatible message history
33
- self.max_steps: int = 20 # Maximum steps allowed
34
+ self.max_steps: int = DEFAULT_MAX_STEPS
34
35
  self.current_step: int = 0 # Current step counter
35
36
  # Client will be set by subclasses
36
37
  self.api_key: str | None = None
oagi/task/short.py CHANGED
@@ -8,6 +8,7 @@
8
8
 
9
9
  import warnings
10
10
 
11
+ from ..constants import DEFAULT_MAX_STEPS, MODEL_ACTOR
11
12
  from ..logging import get_logger
12
13
  from ..types import ActionHandler, ImageProvider
13
14
  from .base import BaseAutoMode
@@ -27,7 +28,7 @@ class ShortTask(Actor, BaseAutoMode):
27
28
  self,
28
29
  api_key: str | None = None,
29
30
  base_url: str | None = None,
30
- model: str = "lux-actor-1",
31
+ model: str = MODEL_ACTOR,
31
32
  temperature: float | None = None,
32
33
  ):
33
34
  warnings.warn(
@@ -43,7 +44,7 @@ class ShortTask(Actor, BaseAutoMode):
43
44
  def auto_mode(
44
45
  self,
45
46
  task_desc: str,
46
- max_steps: int = 20,
47
+ max_steps: int = DEFAULT_MAX_STEPS,
47
48
  executor: ActionHandler = None,
48
49
  image_provider: ImageProvider = None,
49
50
  temperature: float | None = None,
oagi/task/sync.py CHANGED
@@ -9,6 +9,7 @@
9
9
  import warnings
10
10
 
11
11
  from ..client import SyncClient
12
+ from ..constants import DEFAULT_MAX_STEPS, MODEL_ACTOR
12
13
  from ..types import URL, Image, Step
13
14
  from .base import BaseActor
14
15
 
@@ -20,7 +21,7 @@ class Actor(BaseActor):
20
21
  self,
21
22
  api_key: str | None = None,
22
23
  base_url: str | None = None,
23
- model: str = "lux-actor-1",
24
+ model: str = MODEL_ACTOR,
24
25
  temperature: float | None = None,
25
26
  ):
26
27
  super().__init__(api_key, base_url, model, temperature)
@@ -31,7 +32,7 @@ class Actor(BaseActor):
31
32
  def init_task(
32
33
  self,
33
34
  task_desc: str,
34
- max_steps: int = 20,
35
+ max_steps: int = DEFAULT_MAX_STEPS,
35
36
  ):
36
37
  """Initialize a new task with the given description.
37
38
 
@@ -87,7 +88,7 @@ class Task(Actor):
87
88
  self,
88
89
  api_key: str | None = None,
89
90
  base_url: str | None = None,
90
- model: str = "lux-actor-1",
91
+ model: str = MODEL_ACTOR,
91
92
  temperature: float | None = None,
92
93
  ):
93
94
  warnings.warn(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: oagi-core
3
- Version: 0.10.2
3
+ Version: 0.10.3
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>
@@ -1,9 +1,10 @@
1
1
  oagi/__init__.py,sha256=xI--F3inDKuNQ2caI4Xx0rdFuUxO24cEeAX6WoGi170,4836
2
+ oagi/constants.py,sha256=ZhlY_g3Z8w8njvoVykuGe3nty8A1LoGpRo5oJPh6qS0,1142
2
3
  oagi/exceptions.py,sha256=Rco37GQTPYUfc2vRO3hozxPF_s8mKFDpFvBg2UKWo3Y,3066
3
4
  oagi/logging.py,sha256=YT3KCMFj5fzO98R9xlDDgfSotUuz1xRD6OZeYM2rKoo,1760
4
5
  oagi/agent/__init__.py,sha256=KTVLUMhbjgpTJoOWMUZkkiqwhgumvbOZV2tJ9XCLfao,901
5
- oagi/agent/default.py,sha256=JZ4N2RRl0i5W60jumVg9j22XYWi9wn3yMFL92YVdpQA,4359
6
- oagi/agent/factories.py,sha256=QF-Ivey9yx2uDcVSHLXidM-gAPLj1L9jkoQ0tgGJFBw,2293
6
+ oagi/agent/default.py,sha256=zHcTGyMv5QKE2tqwAsKsN6YyMWeSxCGCMzmv2PHdzMk,4520
7
+ oagi/agent/factories.py,sha256=i-GIOEYmwBiiTq4W8UzKfZPkuZcMuOrlc_8dkxM1zLs,2727
7
8
  oagi/agent/protocol.py,sha256=IQJGiMN4yZIacrh5e9JQsoM9TyHb8wJRQR4LAk8dSA0,1615
8
9
  oagi/agent/registry.py,sha256=7bMA2-pH3xQ9ZavrHB_mnc2fOGSMeICPbOGtHoM7It0,4851
9
10
  oagi/agent/observer/__init__.py,sha256=YZ4qvR22pFB0mSDMX6iKKLbBA1dB-nqC7HZVvdMIVGw,909
@@ -15,40 +16,40 @@ oagi/agent/observer/report_template.html,sha256=NOp280_-P2g_4TYbtqPhYxv-y_x3Pwov
15
16
  oagi/agent/tasker/__init__.py,sha256=1iTEFe7lzcqh96TL9R0QADPpLJLrUP0shtZ4DlZSv_8,764
16
17
  oagi/agent/tasker/memory.py,sha256=NR13l5yxRA8GUE-oupAP4W1n80ZNG0SxpUfxsNltkUY,5033
17
18
  oagi/agent/tasker/models.py,sha256=sMQgwIMKhT1tvVF2yoc1hh8GwEiJ6i6qPMy9WoiA8JM,2137
18
- oagi/agent/tasker/planner.py,sha256=1NJQ2279GlGLMTB6JUhgnJtN46iiEGy2O_czaxRQwsE,14437
19
- oagi/agent/tasker/taskee_agent.py,sha256=X5pFcZIG3uE6p23c2FDdIUZtOnCgW0a9Sdt13NLR5-E,17040
20
- oagi/agent/tasker/tasker_agent.py,sha256=YrblKaTDTjiBt0N3_jDgmJAB7smSxvCJy_2nC9-vtnk,10920
19
+ oagi/agent/tasker/planner.py,sha256=RxDilAGJAaC8gu9EkTwBATDLv7lQlzc3LMyxs0KMR74,14516
20
+ oagi/agent/tasker/taskee_agent.py,sha256=MHl_ZH0p8fJ9iSG-VZe_4WUzdyjg4cLZbvEnccQcV2w,17263
21
+ oagi/agent/tasker/tasker_agent.py,sha256=P0O4Ned8U0JfMFLWT2JCYXyfuHbU8XziPSotrRuNzMM,11157
21
22
  oagi/cli/__init__.py,sha256=aDnJViTseShpo5fdGPTj-ELysZhmdvB6Z8mEj2D-_N4,359
22
- oagi/cli/agent.py,sha256=fTqr50Q0QO9Gsy_P7iJcb4K7TaDeY3kUXTDQrePVlVQ,9756
23
- oagi/cli/display.py,sha256=rkAxuHa40ZtKdmvwARev1rgyfsNyVvQ-J6RdjOZIPwc,1729
23
+ oagi/cli/agent.py,sha256=eFwdVZdZcG9ZTMupwoH_JqKSRKDAto3j3z4Xqz5XH7g,10225
24
+ oagi/cli/display.py,sha256=Y8_Dn5RIEfRqZUHVGF6URItW0C3XC7bPLWoAmmhvBS0,1829
24
25
  oagi/cli/main.py,sha256=faHns0HaQCGyylDn2YZLpjQESuEiMYjoQVoMkt8FsH4,2292
25
- oagi/cli/server.py,sha256=Z1ic8r55yaeQBFRCsMNZStC1jRiJdnDGqe9On9LmFzQ,3031
26
+ oagi/cli/server.py,sha256=JFpzCOeaftITxesz8Ya-_Efs03bgotBg7aYwmMZhPwU,3033
26
27
  oagi/cli/tracking.py,sha256=TdrAcNq_-OjgXltFCoFc8NsO_k6yHbdzHnMn3vAAvKA,1707
27
- oagi/cli/utils.py,sha256=BI6C7WvC51NBsXEsjDONjSNwqdD4i0nHA_rsfpyLwmA,2986
28
+ oagi/cli/utils.py,sha256=zIkTrr-ai__3cGSaxiXY-OJs69Fcxd1sHb2FoeyHFtE,3034
28
29
  oagi/client/__init__.py,sha256=F9DShPUdb6vZYmN1fpM1VYzp4MWqUao_e_R1KYmM4Q4,410
29
- oagi/client/async_.py,sha256=iEOQun2kxW1iQ4h_TsSKqj-w3LviKLDxddXrteY61Fk,10894
30
- oagi/client/base.py,sha256=lczoKI1FqlqJbfAB6lAuXH2oDCVT-F0_LBVu6OS1pDo,16739
31
- oagi/client/sync.py,sha256=LPCG136BVzzL9yQOW7QdBiEXCDwRzzqL3GXnJHA6ui8,10730
30
+ oagi/client/async_.py,sha256=Z8DyQHEl_XAyw1Fs0o3qQzEX9lGlZhqCTSEtQh5XHSw,11204
31
+ oagi/client/base.py,sha256=tKYmhJufg7sqEOOp7nn0S9jv4hDYfM-pBuluh0pqew0,16756
32
+ oagi/client/sync.py,sha256=CcesgCk_b26v_DF9OKpjfSHKSMjK0N2ywAxwaGnJ4fo,11040
32
33
  oagi/handler/__init__.py,sha256=Ha11L42K33K3L9S4lQ10UC0DnD5g6egtQUsJpS_tKgg,835
33
34
  oagi/handler/_macos.py,sha256=aHkp-xGzvWL_SBjuS690i9jf93OITFJfGHzHeYCK65I,1957
34
35
  oagi/handler/async_pyautogui_action_handler.py,sha256=hQzseR1yBD0QMpgsEVNsUmuApGVAIIyGYD06BXd82Dc,1615
35
36
  oagi/handler/async_screenshot_maker.py,sha256=8QCtUV59ozpOpvkqhUMb8QDI2qje2gsoFT1qB60tfJM,1689
36
37
  oagi/handler/pil_image.py,sha256=yUcAoGBL-aZ0PCjSaAmQsDwtyzjldXHqXQp_OYRk6e4,4080
37
- oagi/handler/pyautogui_action_handler.py,sha256=AIzxLCZipWlIP8wsJ4qtwhT-bp06KW5ly4FADl_odjQ,10559
38
+ oagi/handler/pyautogui_action_handler.py,sha256=vxSkD_Xsshxb6cfoFFd_zpAwQm21cYTk4w1BGenKZes,10604
38
39
  oagi/handler/screenshot_maker.py,sha256=j1jTW-awx3vAnb1N5_FIMBC0Z-rNVQbiBP-S6Gh5dlE,1284
39
40
  oagi/server/__init__.py,sha256=uZx8u3vJUb87kkNzwmmVrgAgbqRu0WxyMIQCLSx56kk,452
40
41
  oagi/server/agent_wrappers.py,sha256=j8va0A7u80bzOM82nndAplK1uaO_T3kufHWScK6kfWM,3263
41
- oagi/server/config.py,sha256=2gJ-pDpYAxNUubwSsGKOieGcOtNX9b5YGuSqtf6g2P0,1607
42
+ oagi/server/config.py,sha256=AJ1PLKuxrc6pRuur1hm5DwG2g2otxPwOCfKgzIACkSk,1691
42
43
  oagi/server/main.py,sha256=jnTxk7Prc5CzlsUnkBNJp4MOoYN-7HN_Be_m1d3COa8,4829
43
- oagi/server/models.py,sha256=7zsmjvnIZ0JUcCpE8F2A1OqX4_kGJydraRkbvPHnvn8,2593
44
- oagi/server/session_store.py,sha256=922Sz00_Ao-9fA0dhA1lrzs7yd6wo7xpdYJH4hZmEaI,3634
45
- oagi/server/socketio_server.py,sha256=9FNkx6K-ZbRWylHCKv8zrW0pkiKybDN5pWBANTnouts,14211
44
+ oagi/server/models.py,sha256=DXjuf5icpCOgCUGMzzoLfRCoreM541KBWKBZnCk5_S0,2688
45
+ oagi/server/session_store.py,sha256=319CDqGT9bnqaHK5JiLCG2mKxJmIbq1eH3BpjhWLxdI,3685
46
+ oagi/server/socketio_server.py,sha256=0JUf8Y6r9Y7gmltznnsGsEeTp1FhT7AxohSHeBuH3R8,14233
46
47
  oagi/task/__init__.py,sha256=g_8_7ZLDLKuCGzyrB42OzY3gSOjd_SxzkJW3_pf-PXs,662
47
- oagi/task/async_.py,sha256=ev1jnuOQIYahjjMlSCFwtaeyOliePZCpEVt3ocsZXAI,3124
48
- oagi/task/async_short.py,sha256=VMIBKcTQMjadWXPHiJXWlYZqr5v4MeGVYnuKOs7dS3Y,2752
49
- oagi/task/base.py,sha256=D4e4N1cWoObMzaGcXyXGBPKyNbzmxABIjxbHiVrK548,5664
50
- oagi/task/short.py,sha256=xSR5_9BX35UMfITXtCgKXRLU92f4vnqa06c-HSjUO0A,2561
51
- oagi/task/sync.py,sha256=ciDkQYJQZkQyp8buNIKXU9Oy6kD7WIezCh2L0trLDDc,2958
48
+ oagi/task/async_.py,sha256=12BrdE-51bEz2-PZv5X2VW__I_nwq2K1YxGfD3wFxos,3190
49
+ oagi/task/async_short.py,sha256=wVMYpsKGbvqYIe2Ws7cMf8-t7SZKmtrgjW1x_RENMgg,2820
50
+ oagi/task/base.py,sha256=6F_nmJsb2Zw6nUibJyAEW0uQBY_jHiQINUbd_jT5wkQ,5696
51
+ oagi/task/short.py,sha256=D5VX8QGy0o8W7njy74jx95PxU0Rv2Nvoa-2T17aBaZQ,2629
52
+ oagi/task/sync.py,sha256=pKRpIFcetm1n2BgmYGWQeWgV3kKLAQRG9xPlBVQ_pho,3024
52
53
  oagi/types/__init__.py,sha256=nhxQBaDssygtscetliQa3AaryvuNZhkVmBYsVcuR-qg,1332
53
54
  oagi/types/action_handler.py,sha256=NH8E-m5qpGqWcXzTSWfF7W0Xdp8SkzJsbhCmQ0B96cg,1075
54
55
  oagi/types/async_action_handler.py,sha256=k1AaqSkFcXlxwW8sn-w0WFHGsIqHFLbcOPrkknmSVug,1116
@@ -62,8 +63,8 @@ oagi/types/models/action.py,sha256=Q14xfYJrj9IsrqxDpEIzd6iWS-gLmNHfIX6Ef8k0O9E,2
62
63
  oagi/types/models/client.py,sha256=1xIKBgLSheHfqYbcyRKMDOLQJaKijaKQ5l-COc6e7_k,1471
63
64
  oagi/types/models/image_config.py,sha256=tl6abVg_-IAPLwpaWprgknXu7wRWriMg-AEVyUX73v0,1567
64
65
  oagi/types/models/step.py,sha256=RSI4H_2rrUBq_xyCoWKaq7JHdJWNobtQppaKC1l0aWU,471
65
- oagi_core-0.10.2.dist-info/METADATA,sha256=zEpy_q3jUhSphhGi6QYKkvjGvZKLnDq6QSPlOtJ8ppw,8269
66
- oagi_core-0.10.2.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
67
- oagi_core-0.10.2.dist-info/entry_points.txt,sha256=zzgsOSWX6aN3KUB0Z1it8DMxFFBJBqmZVqMVAJRjYuw,44
68
- oagi_core-0.10.2.dist-info/licenses/LICENSE,sha256=sy5DLA2M29jFT4UfWsuBF9BAr3FnRkYtnAu6oDZiIf8,1075
69
- oagi_core-0.10.2.dist-info/RECORD,,
66
+ oagi_core-0.10.3.dist-info/METADATA,sha256=XvsZ9dqWB1fDxdazYcT5u8-k9aeKqZBmtmmm_x0JEMo,8269
67
+ oagi_core-0.10.3.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
68
+ oagi_core-0.10.3.dist-info/entry_points.txt,sha256=zzgsOSWX6aN3KUB0Z1it8DMxFFBJBqmZVqMVAJRjYuw,44
69
+ oagi_core-0.10.3.dist-info/licenses/LICENSE,sha256=sy5DLA2M29jFT4UfWsuBF9BAr3FnRkYtnAu6oDZiIf8,1075
70
+ oagi_core-0.10.3.dist-info/RECORD,,