vision-agent 0.2.236__py3-none-any.whl → 0.2.238__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.
Files changed (37) hide show
  1. vision_agent/.sim_tools/df.csv +57 -80
  2. vision_agent/.sim_tools/embs.npy +0 -0
  3. vision_agent/agent/agent.py +2 -2
  4. vision_agent/agent/vision_agent.py +3 -2
  5. vision_agent/agent/vision_agent_coder.py +13 -19
  6. vision_agent/agent/vision_agent_coder_v2.py +17 -17
  7. vision_agent/agent/vision_agent_planner.py +16 -21
  8. vision_agent/agent/vision_agent_planner_prompts_v2.py +19 -20
  9. vision_agent/agent/vision_agent_planner_v2.py +29 -15
  10. vision_agent/agent/vision_agent_v2.py +12 -12
  11. vision_agent/clients/landing_public_api.py +1 -1
  12. vision_agent/configs/anthropic_openai_config.py +17 -3
  13. vision_agent/configs/config.py +17 -3
  14. vision_agent/lmm/__init__.py +0 -1
  15. vision_agent/lmm/lmm.py +4 -3
  16. vision_agent/models/__init__.py +11 -0
  17. vision_agent/{lmm/types.py → models/lmm_types.py} +4 -1
  18. vision_agent/sim/__init__.py +9 -0
  19. vision_agent/{utils → sim}/sim.py +3 -3
  20. vision_agent/tools/__init__.py +10 -23
  21. vision_agent/tools/meta_tools.py +4 -5
  22. vision_agent/tools/planner_tools.py +148 -37
  23. vision_agent/tools/tools.py +388 -302
  24. vision_agent/utils/__init__.py +0 -1
  25. vision_agent/{agent/agent_utils.py → utils/agent.py} +11 -2
  26. vision_agent/utils/image_utils.py +18 -7
  27. vision_agent/{tools/tool_utils.py → utils/tools.py} +1 -93
  28. vision_agent/utils/tools_doc.py +87 -0
  29. vision_agent/utils/video.py +15 -0
  30. vision_agent/utils/video_tracking.py +38 -5
  31. {vision_agent-0.2.236.dist-info → vision_agent-0.2.238.dist-info}/METADATA +2 -3
  32. vision_agent-0.2.238.dist-info/RECORD +55 -0
  33. vision_agent-0.2.236.dist-info/RECORD +0 -52
  34. /vision_agent/{agent/types.py → models/agent_types.py} +0 -0
  35. /vision_agent/{tools → models}/tools_types.py +0 -0
  36. {vision_agent-0.2.236.dist-info → vision_agent-0.2.238.dist-info}/LICENSE +0 -0
  37. {vision_agent-0.2.236.dist-info → vision_agent-0.2.238.dist-info}/WHEEL +0 -0
@@ -6,4 +6,3 @@ from .execute import (
6
6
  Logs,
7
7
  Result,
8
8
  )
9
- from .sim import AzureSim, OllamaSim, Sim, load_sim, merge_sim
@@ -1,3 +1,4 @@
1
+ import base64
1
2
  import copy
2
3
  import json
3
4
  import logging
@@ -14,8 +15,7 @@ from rich.syntax import Syntax
14
15
  from rich.table import Table
15
16
 
16
17
  import vision_agent.tools as T
17
- from vision_agent.agent.types import AgentMessage, PlanContext
18
- from vision_agent.lmm.types import Message
18
+ from vision_agent.models import AgentMessage, Message, PlanContext
19
19
  from vision_agent.utils.execute import CodeInterpreter, Execution
20
20
  from vision_agent.utils.image_utils import b64_to_pil, convert_to_b64
21
21
 
@@ -185,6 +185,7 @@ class DefaultImports:
185
185
  "import os",
186
186
  "import numpy as np",
187
187
  "from vision_agent.tools import *",
188
+ "from vision_agent.tools.planner_tools import judge_od_results",
188
189
  "from typing import *",
189
190
  "from pillow_heif import register_heif_opener",
190
191
  "register_heif_opener()",
@@ -248,6 +249,14 @@ def add_media_to_chat(
248
249
  ) as temp_file:
249
250
  media_pil.save(temp_file, format="PNG")
250
251
  media = str(temp_file.name)
252
+ elif isinstance(media, str) and media.startswith("data:video/"):
253
+ ext = media.split(";")[0].split("/")[-1]
254
+ with tempfile.NamedTemporaryFile(
255
+ mode="wb", suffix=f".{ext}", delete=False
256
+ ) as temp_file:
257
+ media_bytes = base64.b64decode(media.split(",")[1])
258
+ temp_file.write(media_bytes)
259
+ media = str(temp_file.name)
251
260
  if code_interpreter is not None:
252
261
  media = str(code_interpreter.upload_file(media))
253
262
  media_list_i.append(media)
@@ -183,7 +183,9 @@ def encode_image_bytes(image: bytes, resize: Optional[int] = None) -> str:
183
183
  return encoded_image
184
184
 
185
185
 
186
- def encode_media(media: Union[str, Path], resize: Optional[int] = None) -> str:
186
+ def encode_media(
187
+ media: Union[str, Path, np.ndarray, ImageType], resize: Optional[int] = None
188
+ ) -> str:
187
189
  if isinstance(media, str) and media.startswith(("http", "https")):
188
190
  # for mp4 video url, we assume there is a same url but ends with png
189
191
  # vision-agent-ui will upload this png when uploading the video
@@ -191,16 +193,25 @@ def encode_media(media: Union[str, Path], resize: Optional[int] = None) -> str:
191
193
  return media[:-4] + ".png"
192
194
  return media
193
195
 
194
- # if media is in base64 ensure it's the correct resize
195
- if isinstance(media, str) and media.startswith("data:image/"):
196
- image_pil = b64_to_pil(media)
196
+ def resize_to_b64(image: ImageType, resize: Optional[int] = None) -> str:
197
197
  if resize is not None:
198
- if image_pil.size[0] > resize or image_pil.size[1] > resize:
199
- image_pil.thumbnail((resize, resize))
198
+ image.thumbnail((resize, resize))
200
199
  buffer = io.BytesIO()
201
- image_pil.save(buffer, format="PNG")
200
+ image.save(buffer, format="PNG")
202
201
  return base64.b64encode(buffer.getvalue()).decode("utf-8")
203
202
 
203
+ # if media is in base64, numpy array or PIL Image ensure it's the correct resize
204
+ if isinstance(media, str) and media.startswith("data:image/"):
205
+ image_pil = b64_to_pil(media)
206
+ return resize_to_b64(image_pil, resize=resize)
207
+
208
+ if isinstance(media, np.ndarray):
209
+ image_pil = Image.fromarray(media).convert("RGB")
210
+ return resize_to_b64(image_pil, resize=resize)
211
+
212
+ if isinstance(media, ImageType):
213
+ return resize_to_b64(media, resize=resize)
214
+
204
215
  extension = "png"
205
216
  extension = Path(media).suffix
206
217
  if extension.lower() not in {
@@ -1,18 +1,15 @@
1
- import inspect
2
1
  import logging
3
2
  import os
4
3
  from base64 import b64encode
5
- from typing import Any, Callable, Dict, List, MutableMapping, Optional, Tuple
4
+ from typing import Any, Dict, List, MutableMapping, Optional, Tuple
6
5
 
7
6
  import numpy as np
8
- import pandas as pd
9
7
  from IPython.display import display
10
8
  from pydantic import BaseModel
11
9
  from requests import Session
12
10
  from requests.adapters import HTTPAdapter
13
11
  from urllib3.util.retry import Retry
14
12
 
15
- from vision_agent.tools.tools_types import BoundingBoxes
16
13
  from vision_agent.utils.exceptions import RemoteToolCallFailed
17
14
  from vision_agent.utils.execute import Error, MimeType
18
15
  from vision_agent.utils.image_utils import normalize_bbox
@@ -121,89 +118,6 @@ def _create_requests_session(
121
118
  return session
122
119
 
123
120
 
124
- def get_tool_documentation(funcs: List[Callable[..., Any]]) -> str:
125
- docstrings = ""
126
- for func in funcs:
127
- docstrings += f"{func.__name__}{inspect.signature(func)}:\n{func.__doc__}\n\n"
128
-
129
- return docstrings
130
-
131
-
132
- def get_tool_descriptions(funcs: List[Callable[..., Any]]) -> str:
133
- descriptions = ""
134
- for func in funcs:
135
- description = func.__doc__
136
- if description is None:
137
- description = ""
138
-
139
- if "Parameters:" in description:
140
- description = (
141
- description[: description.find("Parameters:")]
142
- .replace("\n", " ")
143
- .strip()
144
- )
145
-
146
- description = " ".join(description.split())
147
- descriptions += f"- {func.__name__}{inspect.signature(func)}: {description}\n"
148
- return descriptions
149
-
150
-
151
- def get_tool_descriptions_by_names(
152
- tool_name: Optional[List[str]],
153
- funcs: List[Callable[..., Any]],
154
- util_funcs: List[
155
- Callable[..., Any]
156
- ], # util_funcs will always be added to the list of functions
157
- ) -> str:
158
- if tool_name is None:
159
- return get_tool_descriptions(funcs + util_funcs)
160
-
161
- invalid_names = [
162
- name for name in tool_name if name not in {func.__name__ for func in funcs}
163
- ]
164
-
165
- if invalid_names:
166
- raise ValueError(f"Invalid customized tool names: {', '.join(invalid_names)}")
167
-
168
- filtered_funcs = (
169
- funcs
170
- if not tool_name
171
- else [func for func in funcs if func.__name__ in tool_name]
172
- )
173
- return get_tool_descriptions(filtered_funcs + util_funcs)
174
-
175
-
176
- def get_tools_df(funcs: List[Callable[..., Any]]) -> pd.DataFrame:
177
- data: Dict[str, List[str]] = {"desc": [], "doc": [], "name": []}
178
-
179
- for func in funcs:
180
- desc = func.__doc__
181
- if desc is None:
182
- desc = ""
183
- desc = desc[: desc.find("Parameters:")].replace("\n", " ").strip()
184
- desc = " ".join(desc.split())
185
-
186
- doc = f"{func.__name__}{inspect.signature(func)}:\n{func.__doc__}"
187
- data["desc"].append(desc)
188
- data["doc"].append(doc)
189
- data["name"].append(func.__name__)
190
-
191
- return pd.DataFrame(data) # type: ignore
192
-
193
-
194
- def get_tools_info(funcs: List[Callable[..., Any]]) -> Dict[str, str]:
195
- data: Dict[str, str] = {}
196
-
197
- for func in funcs:
198
- desc = func.__doc__
199
- if desc is None:
200
- desc = ""
201
-
202
- data[func.__name__] = f"{func.__name__}{inspect.signature(func)}:\n{desc}"
203
-
204
- return data
205
-
206
-
207
121
  def _call_post(
208
122
  url: str,
209
123
  payload: dict[str, Any],
@@ -259,12 +173,6 @@ def _call_post(
259
173
  display({MimeType.APPLICATION_JSON: trace}, raw=True)
260
174
 
261
175
 
262
- def filter_bboxes_by_threshold(
263
- bboxes: BoundingBoxes, threshold: float
264
- ) -> BoundingBoxes:
265
- return list(filter(lambda bbox: bbox.score >= threshold, bboxes))
266
-
267
-
268
176
  def add_bboxes_from_masks(
269
177
  all_preds: List[List[Dict[str, Any]]],
270
178
  ) -> List[List[Dict[str, Any]]]:
@@ -0,0 +1,87 @@
1
+ import inspect
2
+ from typing import Any, Callable, Dict, List, Optional
3
+
4
+ import pandas as pd
5
+
6
+
7
+ def get_tool_documentation(funcs: List[Callable[..., Any]]) -> str:
8
+ docstrings = ""
9
+ for func in funcs:
10
+ docstrings += f"{func.__name__}{inspect.signature(func)}:\n{func.__doc__}\n\n"
11
+
12
+ return docstrings
13
+
14
+
15
+ def get_tool_descriptions(funcs: List[Callable[..., Any]]) -> str:
16
+ descriptions = ""
17
+ for func in funcs:
18
+ description = func.__doc__
19
+ if description is None:
20
+ description = ""
21
+
22
+ if "Parameters:" in description:
23
+ description = (
24
+ description[: description.find("Parameters:")]
25
+ .replace("\n", " ")
26
+ .strip()
27
+ )
28
+
29
+ description = " ".join(description.split())
30
+ descriptions += f"- {func.__name__}{inspect.signature(func)}: {description}\n"
31
+ return descriptions
32
+
33
+
34
+ def get_tool_descriptions_by_names(
35
+ tool_name: Optional[List[str]],
36
+ funcs: List[Callable[..., Any]],
37
+ util_funcs: List[
38
+ Callable[..., Any]
39
+ ], # util_funcs will always be added to the list of functions
40
+ ) -> str:
41
+ if tool_name is None:
42
+ return get_tool_descriptions(funcs + util_funcs)
43
+
44
+ invalid_names = [
45
+ name for name in tool_name if name not in {func.__name__ for func in funcs}
46
+ ]
47
+
48
+ if invalid_names:
49
+ raise ValueError(f"Invalid customized tool names: {', '.join(invalid_names)}")
50
+
51
+ filtered_funcs = (
52
+ funcs
53
+ if not tool_name
54
+ else [func for func in funcs if func.__name__ in tool_name]
55
+ )
56
+ return get_tool_descriptions(filtered_funcs + util_funcs)
57
+
58
+
59
+ def get_tools_df(funcs: List[Callable[..., Any]]) -> pd.DataFrame:
60
+ data: Dict[str, List[str]] = {"desc": [], "doc": [], "name": []}
61
+
62
+ for func in funcs:
63
+ desc = func.__doc__
64
+ if desc is None:
65
+ desc = ""
66
+ desc = desc[: desc.find("Parameters:")].replace("\n", " ").strip()
67
+ desc = " ".join(desc.split())
68
+
69
+ doc = f"{func.__name__}{inspect.signature(func)}:\n{func.__doc__}"
70
+ data["desc"].append(desc)
71
+ data["doc"].append(doc)
72
+ data["name"].append(func.__name__)
73
+
74
+ return pd.DataFrame(data) # type: ignore
75
+
76
+
77
+ def get_tools_info(funcs: List[Callable[..., Any]]) -> Dict[str, str]:
78
+ data: Dict[str, str] = {}
79
+
80
+ for func in funcs:
81
+ desc = func.__doc__
82
+ if desc is None:
83
+ desc = ""
84
+
85
+ data[func.__name__] = f"{func.__name__}{inspect.signature(func)}:\n{desc}"
86
+
87
+ return data
@@ -106,6 +106,20 @@ def frames_to_bytes(
106
106
  return buffer_bytes
107
107
 
108
108
 
109
+ def rescale(frame: np.ndarray, max_size: Tuple[int, int]) -> np.ndarray:
110
+ h, w = frame.shape[:2]
111
+ new_h, new_w = h, w
112
+ if new_h > max_size[0]:
113
+ new_h = max_size[0]
114
+ new_w = int(w * new_h / h)
115
+ if new_w > max_size[1]:
116
+ new_w = max_size[1]
117
+ new_h = int(h * new_w / w)
118
+ if h != new_h or w != new_w:
119
+ frame = cv2.resize(frame, (new_w, new_h))
120
+ return frame
121
+
122
+
109
123
  # WARNING: This cache is a little dangerous because if the underlying video
110
124
  # contents change but the filename remains the same it will return the old file contents.
111
125
  # For vision agent it's unlikely to change the file contents while keeping the
@@ -158,6 +172,7 @@ def extract_frames_from_video(
158
172
  # causes the last frame to be skipped
159
173
  elapsed_time = round(elapsed_time, 8)
160
174
  if elapsed_time >= targ_frame_time:
175
+ frame = rescale(frame, (1024, 1024))
161
176
  frames.append((cv2.cvtColor(frame, cv2.COLOR_BGR2RGB), i / orig_fps))
162
177
  elapsed_time -= targ_frame_time
163
178
 
@@ -5,11 +5,8 @@ from typing import Any, Callable, Dict, List, Optional, Tuple
5
5
  import numpy as np
6
6
  from scipy.optimize import linear_sum_assignment # type: ignore
7
7
 
8
- from vision_agent.tools.tool_utils import (
9
- add_bboxes_from_masks,
10
- send_task_inference_request,
11
- )
12
8
  from vision_agent.utils.image_utils import denormalize_bbox, rle_decode_array
9
+ from vision_agent.utils.tools import add_bboxes_from_masks, send_task_inference_request
13
10
  from vision_agent.utils.video import frames_to_bytes
14
11
 
15
12
 
@@ -115,6 +112,40 @@ def process_segment(
115
112
  metadata=metadata,
116
113
  )
117
114
 
115
+ segment_detections = join_scores(transformed_detections, segment_detections)
116
+ return segment_detections
117
+
118
+
119
+ def join_scores(
120
+ transformed_detections: List[Optional[Dict[str, Any]]],
121
+ segment_detections: List[List[Dict[str, Any]]],
122
+ ) -> List[List[Dict[str, Any]]]:
123
+ # The scores should really be returned from the SAM2 endpoint so we don't have to
124
+ # try and match them.
125
+ for detection in transformed_detections:
126
+ if detection is not None:
127
+ for i in range(len(detection["scores"])):
128
+ id_to_score = {}
129
+ if len(segment_detections) > 0:
130
+ # This assumes none of the initial boxes are filtered out by SAM2
131
+ # so we have a 1:1 mapping between the initial boxes and the SAM2 boxes
132
+ for j, segment_detection in enumerate(segment_detections[0]):
133
+ id_to_score[segment_detection["id"]] = detection["scores"][j]
134
+
135
+ # after we've created the id_to_score, assign the scores. Some of the
136
+ # boxes could have been removed in subsequent frames, hence the mapping
137
+ # is needed
138
+ for t in range(len(segment_detections)):
139
+ for segment_detection in segment_detections[t]:
140
+ if segment_detection["id"] in id_to_score:
141
+ segment_detection["score"] = id_to_score[
142
+ segment_detection["id"]
143
+ ]
144
+ else:
145
+ # if we can't find the score, set it to 1.0 so it doesn't
146
+ # get filtered out
147
+ segment_detection["score"] = 1.0
148
+
118
149
  return segment_detections
119
150
 
120
151
 
@@ -141,11 +172,13 @@ def transform_detections(
141
172
  bboxes = [
142
173
  denormalize_bbox(detection["bbox"], image_size) for detection in frame
143
174
  ]
175
+ scores = [detection["score"] for detection in frame]
144
176
 
145
177
  output_list.append(
146
178
  {
147
179
  "labels": labels,
148
180
  "bboxes": bboxes,
181
+ "scores": scores,
149
182
  }
150
183
  )
151
184
  else:
@@ -280,7 +313,7 @@ def post_process(
280
313
  "label": label,
281
314
  "mask": detection["decoded_mask"],
282
315
  "rle": detection["mask"],
283
- "score": 1.0,
316
+ "score": detection["score"],
284
317
  }
285
318
  )
286
319
  del detection["decoded_mask"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vision-agent
3
- Version: 0.2.236
3
+ Version: 0.2.238
4
4
  Summary: Toolset for Vision Agent
5
5
  Author: Landing AI
6
6
  Author-email: dev@landing.ai
@@ -15,7 +15,6 @@ Requires-Dist: e2b (>=0.17.2a50,<0.18.0)
15
15
  Requires-Dist: e2b-code-interpreter (==0.0.11a37)
16
16
  Requires-Dist: flake8 (>=7.0.0,<8.0.0)
17
17
  Requires-Dist: ipykernel (>=6.29.4,<7.0.0)
18
- Requires-Dist: langsmith (>=0.1.58,<0.2.0)
19
18
  Requires-Dist: libcst (>=1.5.0,<2.0.0)
20
19
  Requires-Dist: matplotlib (>=3.9.2,<4.0.0)
21
20
  Requires-Dist: nbclient (>=0.10.0,<0.11.0)
@@ -85,7 +84,7 @@ You can run VisionAgent in a local Jupyter Notebook [Counting cans in an image](
85
84
  You can use VisionAgent to generate code to count the number of people in an image:
86
85
  ```python
87
86
  from vision_agent.agent import VisionAgentCoderV2
88
- from vision_agent.agent.types import AgentMessage
87
+ from vision_agent.models import AgentMessage
89
88
 
90
89
  agent = VisionAgentCoderV2(verbose=True)
91
90
  code_context = agent.generate_code(
@@ -0,0 +1,55 @@
1
+ vision_agent/.sim_tools/df.csv,sha256=3tuSr8bjF1pzjEpRJi7LLJssU_2A25SDCWvs4VZKkg4,41479
2
+ vision_agent/.sim_tools/embs.npy,sha256=pi7h3NHlrKncIGNR-oPn_XoTe2PzBb9-aFMi7qK0tEw,245888
3
+ vision_agent/__init__.py,sha256=EAb4-f9iyuEYkBrX4ag1syM8Syx8118_t0R6_C34M9w,57
4
+ vision_agent/agent/README.md,sha256=Q4w7FWw38qaWosQYAZ7NqWx8Q5XzuWrlv7nLhjUd1-8,5527
5
+ vision_agent/agent/__init__.py,sha256=M8CffavdIh8Zh-skznLHIaQkYGCGK7vk4dq1FaVkbs4,617
6
+ vision_agent/agent/agent.py,sha256=RoS7kMfXYILv0zuPpcxqQIlaHGa3K-qw_5EwgsEJTPQ,1530
7
+ vision_agent/agent/vision_agent.py,sha256=4LqvwPTSsiuJEDwBbMx9Dg9ALJwNR6x1c63TZvOMm8A,23486
8
+ vision_agent/agent/vision_agent_coder.py,sha256=Ry6AiyAj3hsSeYPu_5guMcTzf2E4SoebPzpHyJtSPbQ,27360
9
+ vision_agent/agent/vision_agent_coder_prompts.py,sha256=D4RJxTWoxpl-WtYRvHNxaLSdWVHsdYb0jJIQ2ZCGU0A,12277
10
+ vision_agent/agent/vision_agent_coder_prompts_v2.py,sha256=53b_DhQtffX5wxLuCbNQ83AJhB0P_3wEnuKr-v5bx-o,4866
11
+ vision_agent/agent/vision_agent_coder_v2.py,sha256=bWAUyk7-lYKwLIjkL_wUTeYv06zIIroJE1yIDRaGUHw,17059
12
+ vision_agent/agent/vision_agent_planner.py,sha256=rp_atRMDg35WFXNKOTkjUpGPrpSCsiMhcfZtqK-DIV4,18668
13
+ vision_agent/agent/vision_agent_planner_prompts.py,sha256=rYRdJthc-sQN57VgCBKrF09Sd73BSxcBdjNe6C4WNZ8,6837
14
+ vision_agent/agent/vision_agent_planner_prompts_v2.py,sha256=TiiF5BGnFVraFlQnDaeRU67927LvszvpcMUOgVgo0ps,35843
15
+ vision_agent/agent/vision_agent_planner_v2.py,sha256=IqEP5ded5P4ESkLEur81gUvJtTmTdlKAx9uQyLyIwPc,21212
16
+ vision_agent/agent/vision_agent_prompts.py,sha256=KaJwYPUP7_GvQsCPPs6Fdawmi3AQWmWajBUuzj7gTG4,13812
17
+ vision_agent/agent/vision_agent_prompts_v2.py,sha256=Wyxa15NOe75PefAfw3_RRwvgjg8YVqCrU7WvvWoYJpk,2733
18
+ vision_agent/agent/vision_agent_v2.py,sha256=O070_QdgsqNzex5eRtye8QmJgCtHcf_B7zeteWpw3LM,10895
19
+ vision_agent/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ vision_agent/clients/http.py,sha256=k883i6M_4nl7zwwHSI-yP5sAgQZIDPM1nrKD6YFJ3Xs,2009
21
+ vision_agent/clients/landing_public_api.py,sha256=Vz9lldtNbaJRWzT7T8-uQrC-dMnt47LIsDrxHgoVdEw,1492
22
+ vision_agent/configs/__init__.py,sha256=Iu75-w9_nlPmnB_qKA7nYaaaHf7xtTrDmK8N4v2WV34,27
23
+ vision_agent/configs/anthropic_config.py,sha256=T1UuESgiY8913A6wA42P7-cg8FTk9-LkJpyywo7OnIQ,4298
24
+ vision_agent/configs/anthropic_openai_config.py,sha256=rUz5zca4Pn5dTUwJXiJzRDYua5PWizApCKI3y0zOvhc,4699
25
+ vision_agent/configs/config.py,sha256=rUz5zca4Pn5dTUwJXiJzRDYua5PWizApCKI3y0zOvhc,4699
26
+ vision_agent/configs/openai_config.py,sha256=v2_AIY89d7LKWn4uqA2G047U2IdmnqZrGH2Iww9gRIw,4498
27
+ vision_agent/fonts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ vision_agent/fonts/default_font_ch_en.ttf,sha256=1YM0Z3XqLDjSNbF7ihQFSAIUdjF9m1rtHiNC_6QosTE,1594400
29
+ vision_agent/lmm/__init__.py,sha256=4qX2lmGnKWHeKftXueEi9xj_ieK2nQh_ipHf72nKGFk,84
30
+ vision_agent/lmm/lmm.py,sha256=XYp1frrqQ-6q-0y2IWwM8-EIH5UrFZ21SAhkcM32J9w,19355
31
+ vision_agent/models/__init__.py,sha256=qAdygB-0EsmxMHNzYTPNM6tAF8Fym95gm9bsHJafdgE,287
32
+ vision_agent/models/agent_types.py,sha256=dIdxATH_PP76pD5Wfo0oofWt6iPQh0vpf48QbEQSzhs,2472
33
+ vision_agent/models/lmm_types.py,sha256=v04h-NjbczHOIN8UWa1vvO5-1BDuZ4JQhD2mge1cXmw,305
34
+ vision_agent/models/tools_types.py,sha256=8hYf2OZhI58gvf65KGaeGkt4EQ56nwLFqIQDPHioOBc,2339
35
+ vision_agent/sim/__init__.py,sha256=Aouz6HEPPTYcLxR5_0fTYCL1OvPKAH1RMWAF90QXAlA,135
36
+ vision_agent/sim/sim.py,sha256=VSU_1rYd4ifvF45xKWBEYugxdeeEQVpj0QL6rjx49i4,9801
37
+ vision_agent/tools/__init__.py,sha256=T-MPNBVbvWtfo71hobaZsdYzQ52oyymolk_OAb2Pq_g,2463
38
+ vision_agent/tools/meta_tools.py,sha256=-heMwGkx0hX_9zUp1dgBqsJpVnl6Y6tErMsjFy0dwLM,28652
39
+ vision_agent/tools/planner_tools.py,sha256=orBTdJQz2NKoLuX9WE6XixaYuG305xz0UBYvZOiuquQ,19474
40
+ vision_agent/tools/prompts.py,sha256=V1z4YJLXZuUl_iZ5rY0M5hHc_2tmMEUKr0WocXKGt4E,1430
41
+ vision_agent/tools/tools.py,sha256=-xg5Msq5ZtHgaISpHnbq5rJ5MIERwfH6wPHg6KpaYjg,111457
42
+ vision_agent/utils/__init__.py,sha256=mANUs_84VL-3gpZbXryvV2mWU623eWnRlJCSUHtMjuw,122
43
+ vision_agent/utils/agent.py,sha256=QGKcbzpAjcVj0958bXYLv07-d2i1GU7-bXVG7bTGRMA,14619
44
+ vision_agent/utils/exceptions.py,sha256=booSPSuoULF7OXRr_YbC4dtKt6gM_HyiFQHBuaW86C4,2052
45
+ vision_agent/utils/execute.py,sha256=vOEP5Ys7S2lc0_7pOJbgk7OaWi85hrCNu9_8Bo3zk6I,29356
46
+ vision_agent/utils/image_utils.py,sha256=bJM2mEvB6E__M9pxi74yQYzAiZ7mu3KE2ptyVrp5vzQ,12533
47
+ vision_agent/utils/tools.py,sha256=USZL0MKsiJgqA8RFiYRTcj_Kn2FVYKLHK4wIk0gP1Ow,7694
48
+ vision_agent/utils/tools_doc.py,sha256=yFue6KSXoa_Z1ngCdBEc4SdPZOWF1rVLeaHu02I8Wis,2523
49
+ vision_agent/utils/type_defs.py,sha256=BE12s3JNQy36QvauXHjwyeffVh5enfcvd4vTzSwvEZI,1384
50
+ vision_agent/utils/video.py,sha256=Dt9_pqGgr63gmpurzisnpF6d9tr65-zxS1CccXdVuxk,6458
51
+ vision_agent/utils/video_tracking.py,sha256=GM9qfeawqhmZVWoKrzw5-NETd4gEo7ImMfWtBnhC3bw,12086
52
+ vision_agent-0.2.238.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
53
+ vision_agent-0.2.238.dist-info/METADATA,sha256=VnupHm4Iav889sO4JPGeWYM7902KwPKaJYem81_EDCk,5712
54
+ vision_agent-0.2.238.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
55
+ vision_agent-0.2.238.dist-info/RECORD,,
@@ -1,52 +0,0 @@
1
- vision_agent/.sim_tools/df.csv,sha256=oVUuyoVTCnayorbGUAvWed8l1YA_-rF9rSF78fMtvuU,42468
2
- vision_agent/.sim_tools/embs.npy,sha256=YJe8EcKVNmeX_75CS2T1sbY-sUS_1HQAMT-34zc18a0,254080
3
- vision_agent/__init__.py,sha256=EAb4-f9iyuEYkBrX4ag1syM8Syx8118_t0R6_C34M9w,57
4
- vision_agent/agent/README.md,sha256=Q4w7FWw38qaWosQYAZ7NqWx8Q5XzuWrlv7nLhjUd1-8,5527
5
- vision_agent/agent/__init__.py,sha256=M8CffavdIh8Zh-skznLHIaQkYGCGK7vk4dq1FaVkbs4,617
6
- vision_agent/agent/agent.py,sha256=_1tHWAs7Jm5tqDzEcPfCRvJV3uRRveyh4n9_9pd6I1w,1565
7
- vision_agent/agent/agent_utils.py,sha256=4RgG8SUEGuMFHkIt0jCFkRQF6G1PZp3Ub4LuVYKF7Ic,14092
8
- vision_agent/agent/types.py,sha256=dIdxATH_PP76pD5Wfo0oofWt6iPQh0vpf48QbEQSzhs,2472
9
- vision_agent/agent/vision_agent.py,sha256=fH9NOLk7twL1fPr9vLSqkaYhah-gfDWfTOVF2FfMyzI,23461
10
- vision_agent/agent/vision_agent_coder.py,sha256=flUxOibyGZK19BCSK5mhaD3HjCxHw6c6FtKom6N2q1E,27359
11
- vision_agent/agent/vision_agent_coder_prompts.py,sha256=D4RJxTWoxpl-WtYRvHNxaLSdWVHsdYb0jJIQ2ZCGU0A,12277
12
- vision_agent/agent/vision_agent_coder_prompts_v2.py,sha256=53b_DhQtffX5wxLuCbNQ83AJhB0P_3wEnuKr-v5bx-o,4866
13
- vision_agent/agent/vision_agent_coder_v2.py,sha256=yQYcO0s4BI9pWaAQQAVtkwWa3UF5w0iLKvwpeJ6iegM,17077
14
- vision_agent/agent/vision_agent_planner.py,sha256=fFzjNkZBKkh8Y_oS06ATI4qz31xmIJvixb_tV1kX8KA,18590
15
- vision_agent/agent/vision_agent_planner_prompts.py,sha256=rYRdJthc-sQN57VgCBKrF09Sd73BSxcBdjNe6C4WNZ8,6837
16
- vision_agent/agent/vision_agent_planner_prompts_v2.py,sha256=gElqTNC5b9JgnJs1jxkM9OmtWe9uou2CR8fwroUW5Ic,35622
17
- vision_agent/agent/vision_agent_planner_v2.py,sha256=ByxS5Z5tEpm8wqz79KEOTrONjcGGQm9JCsV5Sq9dpQI,20719
18
- vision_agent/agent/vision_agent_prompts.py,sha256=KaJwYPUP7_GvQsCPPs6Fdawmi3AQWmWajBUuzj7gTG4,13812
19
- vision_agent/agent/vision_agent_prompts_v2.py,sha256=Wyxa15NOe75PefAfw3_RRwvgjg8YVqCrU7WvvWoYJpk,2733
20
- vision_agent/agent/vision_agent_v2.py,sha256=Q96YsLovCUOd6m2Cg7EGCiHshDq65vxHsfVj7IToyls,10936
21
- vision_agent/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- vision_agent/clients/http.py,sha256=k883i6M_4nl7zwwHSI-yP5sAgQZIDPM1nrKD6YFJ3Xs,2009
23
- vision_agent/clients/landing_public_api.py,sha256=lU2ev6E8NICmR8DMUljuGcVFy5VNJQ4WQkWC8WnnJEc,1503
24
- vision_agent/configs/__init__.py,sha256=Iu75-w9_nlPmnB_qKA7nYaaaHf7xtTrDmK8N4v2WV34,27
25
- vision_agent/configs/anthropic_config.py,sha256=T1UuESgiY8913A6wA42P7-cg8FTk9-LkJpyywo7OnIQ,4298
26
- vision_agent/configs/anthropic_openai_config.py,sha256=YQjFxmlxppn5L55dJjK_v1myBJQ_V5J4q25pmUtwTOU,4310
27
- vision_agent/configs/config.py,sha256=YQjFxmlxppn5L55dJjK_v1myBJQ_V5J4q25pmUtwTOU,4310
28
- vision_agent/configs/openai_config.py,sha256=v2_AIY89d7LKWn4uqA2G047U2IdmnqZrGH2Iww9gRIw,4498
29
- vision_agent/fonts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
- vision_agent/fonts/default_font_ch_en.ttf,sha256=1YM0Z3XqLDjSNbF7ihQFSAIUdjF9m1rtHiNC_6QosTE,1594400
31
- vision_agent/lmm/__init__.py,sha256=xk2Rn8Zgpy2xwYaOGHzy4tXxnxo2aj6SkpNjeJ8yxcY,111
32
- vision_agent/lmm/lmm.py,sha256=arwfYPWme_RxCxSpEQ0ZkpHO22GFPCwVeoSvXqLPOAk,19288
33
- vision_agent/lmm/types.py,sha256=ZEXR_ptBL0ZwDMTDYkgxUCmSZFmBYPQd2jreNzr_8UY,221
34
- vision_agent/tools/__init__.py,sha256=zopUrANPx7p0NGy6BxmEaYhDrj8DX8w7BLfgmCbz-mU,2897
35
- vision_agent/tools/meta_tools.py,sha256=TPeS7QWnc_PmmU_ndiDT03dXbQ5yDSP33E7U8cSj7Ls,28660
36
- vision_agent/tools/planner_tools.py,sha256=8pJZCGGOGIqGiV2or52BjyRP6eDlporuQ2hXCIHfLTQ,15382
37
- vision_agent/tools/prompts.py,sha256=V1z4YJLXZuUl_iZ5rY0M5hHc_2tmMEUKr0WocXKGt4E,1430
38
- vision_agent/tools/tool_utils.py,sha256=l4oWkgPd_s8QzXqqbrLwPgcfnhsJaPpdMKikOcwRaoQ,10396
39
- vision_agent/tools/tools.py,sha256=MBeFVYyCx-QQLCFb0Cn4m6SgmT6-6HxUOmCKAARrv6s,108547
40
- vision_agent/tools/tools_types.py,sha256=8hYf2OZhI58gvf65KGaeGkt4EQ56nwLFqIQDPHioOBc,2339
41
- vision_agent/utils/__init__.py,sha256=QKk4zVjMwGxQI0MQ-aZZA50N-qItxRY4EB9CwQkZ2HY,185
42
- vision_agent/utils/exceptions.py,sha256=booSPSuoULF7OXRr_YbC4dtKt6gM_HyiFQHBuaW86C4,2052
43
- vision_agent/utils/execute.py,sha256=vOEP5Ys7S2lc0_7pOJbgk7OaWi85hrCNu9_8Bo3zk6I,29356
44
- vision_agent/utils/image_utils.py,sha256=z_ONgcza125B10NkoGwPOzXnL470bpTWZbkB16NeeH0,12188
45
- vision_agent/utils/sim.py,sha256=DYya76dYVtifFyXilMLxBzGgyfyeqhEwU4RJ4894lCI,9796
46
- vision_agent/utils/type_defs.py,sha256=BE12s3JNQy36QvauXHjwyeffVh5enfcvd4vTzSwvEZI,1384
47
- vision_agent/utils/video.py,sha256=e1VwKhXzzlC5LcFMyrcQYrPnpnX4wxDpnQ-76sB4jgM,6001
48
- vision_agent/utils/video_tracking.py,sha256=PXZYB0ZJM97WU52XbucyoXX2GW9-gNpSHrPF30_Lq1Q,10263
49
- vision_agent-0.2.236.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
50
- vision_agent-0.2.236.dist-info/METADATA,sha256=gN1PVrgEDRzhrGoxuZyc5lrw-O8TM-gRuMpvyCh_Kpo,5760
51
- vision_agent-0.2.236.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
52
- vision_agent-0.2.236.dist-info/RECORD,,
File without changes
File without changes