vision-agent 0.2.241__py3-none-any.whl → 0.2.243__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.
- vision_agent/agent/agent.py +3 -2
- vision_agent/agent/vision_agent_coder_v2.py +6 -1
- vision_agent/agent/vision_agent_planner_v2.py +27 -10
- vision_agent/agent/vision_agent_prompts_v2.py +15 -3
- vision_agent/agent/vision_agent_v2.py +25 -6
- vision_agent/models/__init__.py +7 -1
- vision_agent/models/agent_types.py +16 -1
- vision_agent/utils/agent.py +5 -4
- {vision_agent-0.2.241.dist-info → vision_agent-0.2.243.dist-info}/METADATA +1 -1
- {vision_agent-0.2.241.dist-info → vision_agent-0.2.243.dist-info}/RECORD +12 -12
- {vision_agent-0.2.241.dist-info → vision_agent-0.2.243.dist-info}/LICENSE +0 -0
- {vision_agent-0.2.241.dist-info → vision_agent-0.2.243.dist-info}/WHEEL +0 -0
vision_agent/agent/agent.py
CHANGED
@@ -5,6 +5,7 @@ from typing import Any, Dict, List, Optional, Union
|
|
5
5
|
from vision_agent.models import (
|
6
6
|
AgentMessage,
|
7
7
|
CodeContext,
|
8
|
+
ErrorContext,
|
8
9
|
InteractionContext,
|
9
10
|
Message,
|
10
11
|
PlanContext,
|
@@ -36,7 +37,7 @@ class AgentCoder(Agent):
|
|
36
37
|
chat: List[AgentMessage],
|
37
38
|
max_steps: Optional[int] = None,
|
38
39
|
code_interpreter: Optional[CodeInterpreter] = None,
|
39
|
-
) -> Union[CodeContext, InteractionContext]:
|
40
|
+
) -> Union[CodeContext, InteractionContext, ErrorContext]:
|
40
41
|
pass
|
41
42
|
|
42
43
|
@abstractmethod
|
@@ -56,5 +57,5 @@ class AgentPlanner(Agent):
|
|
56
57
|
chat: List[AgentMessage],
|
57
58
|
max_steps: Optional[int] = None,
|
58
59
|
code_interpreter: Optional[CodeInterpreter] = None,
|
59
|
-
) -> Union[PlanContext, InteractionContext]:
|
60
|
+
) -> Union[PlanContext, InteractionContext, ErrorContext]:
|
60
61
|
pass
|
@@ -13,6 +13,7 @@ from vision_agent.lmm import LMM
|
|
13
13
|
from vision_agent.models import (
|
14
14
|
AgentMessage,
|
15
15
|
CodeContext,
|
16
|
+
ErrorContext,
|
16
17
|
InteractionContext,
|
17
18
|
Message,
|
18
19
|
PlanContext,
|
@@ -365,6 +366,8 @@ class VisionAgentCoderV2(AgentCoder):
|
|
365
366
|
code_or_interaction = self.generate_code(input_msg)
|
366
367
|
if isinstance(code_or_interaction, InteractionContext):
|
367
368
|
return code_or_interaction.chat[-1].content
|
369
|
+
elif isinstance(code_or_interaction, ErrorContext):
|
370
|
+
return code_or_interaction.error
|
368
371
|
return code_or_interaction.code
|
369
372
|
|
370
373
|
def generate_code(
|
@@ -372,7 +375,7 @@ class VisionAgentCoderV2(AgentCoder):
|
|
372
375
|
chat: List[AgentMessage],
|
373
376
|
max_steps: Optional[int] = None,
|
374
377
|
code_interpreter: Optional[CodeInterpreter] = None,
|
375
|
-
) -> Union[CodeContext, InteractionContext]:
|
378
|
+
) -> Union[CodeContext, InteractionContext, ErrorContext]:
|
376
379
|
"""Generate vision code from a conversation.
|
377
380
|
|
378
381
|
Parameters:
|
@@ -404,6 +407,8 @@ class VisionAgentCoderV2(AgentCoder):
|
|
404
407
|
# the planner needs an interaction, so return before generating code
|
405
408
|
if isinstance(plan_context, InteractionContext):
|
406
409
|
return plan_context
|
410
|
+
elif isinstance(plan_context, ErrorContext):
|
411
|
+
return plan_context
|
407
412
|
|
408
413
|
code_context = self.generate_code_from_plan(
|
409
414
|
orig_chat,
|
@@ -24,7 +24,13 @@ from vision_agent.agent.vision_agent_planner_prompts_v2 import (
|
|
24
24
|
)
|
25
25
|
from vision_agent.configs import Config
|
26
26
|
from vision_agent.lmm import LMM
|
27
|
-
from vision_agent.models import
|
27
|
+
from vision_agent.models import (
|
28
|
+
AgentMessage,
|
29
|
+
ErrorContext,
|
30
|
+
InteractionContext,
|
31
|
+
Message,
|
32
|
+
PlanContext,
|
33
|
+
)
|
28
34
|
from vision_agent.tools.planner_tools import check_function_call
|
29
35
|
from vision_agent.utils.agent import (
|
30
36
|
add_media_to_chat,
|
@@ -322,7 +328,7 @@ def create_finalize_plan(
|
|
322
328
|
model: LMM,
|
323
329
|
chat: List[AgentMessage],
|
324
330
|
verbose: bool = False,
|
325
|
-
) -> Tuple[List[AgentMessage], PlanContext]:
|
331
|
+
) -> Tuple[List[AgentMessage], Union[PlanContext, ErrorContext]]:
|
326
332
|
# if we're in the middle of an interaction, don't finalize the plan
|
327
333
|
if chat[-1].role == "interaction":
|
328
334
|
return [], PlanContext(plan="", instructions=[], code="")
|
@@ -337,11 +343,19 @@ def create_finalize_plan(
|
|
337
343
|
return_chat = [AgentMessage(role="planner", content=plan_str, media=None)]
|
338
344
|
|
339
345
|
plan_json = extract_tag(plan_str, "json")
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
346
|
+
|
347
|
+
# sometimes the planner model will refuse to answer a question becuase of some
|
348
|
+
# safety concern, we then wont be able to parse the response so we have to send
|
349
|
+
# it back to the user/conversation agent
|
350
|
+
try:
|
351
|
+
plan = (
|
352
|
+
extract_json(plan_json)
|
353
|
+
if plan_json is not None
|
354
|
+
else {"plan": plan_str, "instructions": [], "code": ""}
|
355
|
+
)
|
356
|
+
except json.JSONDecodeError:
|
357
|
+
return return_chat, ErrorContext(error=plan_str)
|
358
|
+
|
345
359
|
code_snippets = extract_tag(plan_str, "code")
|
346
360
|
plan["code"] = code_snippets if code_snippets is not None else ""
|
347
361
|
if verbose:
|
@@ -473,14 +487,17 @@ class VisionAgentPlannerV2(AgentPlanner):
|
|
473
487
|
plan_or_interaction = self.generate_plan(input_msg)
|
474
488
|
if isinstance(plan_or_interaction, InteractionContext):
|
475
489
|
return plan_or_interaction.chat[-1].content
|
476
|
-
|
490
|
+
elif isinstance(plan_or_interaction, PlanContext):
|
491
|
+
return plan_or_interaction.plan
|
492
|
+
else:
|
493
|
+
return plan_or_interaction.error
|
477
494
|
|
478
495
|
def generate_plan(
|
479
496
|
self,
|
480
497
|
chat: List[AgentMessage],
|
481
498
|
max_steps: Optional[int] = None,
|
482
499
|
code_interpreter: Optional[CodeInterpreter] = None,
|
483
|
-
) -> Union[PlanContext, InteractionContext]:
|
500
|
+
) -> Union[PlanContext, InteractionContext, ErrorContext]:
|
484
501
|
"""Generate a plan to solve a vision task.
|
485
502
|
|
486
503
|
Parameters:
|
@@ -571,7 +588,7 @@ class VisionAgentPlannerV2(AgentPlanner):
|
|
571
588
|
for chat_elt in updated_chat:
|
572
589
|
self.update_callback(chat_elt.model_dump())
|
573
590
|
|
574
|
-
context: Union[PlanContext, InteractionContext]
|
591
|
+
context: Union[PlanContext, InteractionContext, ErrorContext]
|
575
592
|
if interaction:
|
576
593
|
context = InteractionContext(chat=int_chat)
|
577
594
|
else:
|
@@ -16,17 +16,29 @@ AGENT: <response>Yes, I can help you with that. I will write the code to detect
|
|
16
16
|
OBSERVATION:
|
17
17
|
<final_code>
|
18
18
|
from vision_agent.tools import load_image, owl_v2_image
|
19
|
-
def detect_dogs(image_path: str):
|
19
|
+
def detect_dogs(image_path: str) -> int:
|
20
20
|
image = load_image(image_path)
|
21
21
|
dogs = owl_v2_image(image)
|
22
|
-
return dogs
|
22
|
+
return len(dogs)
|
23
23
|
</final_code>
|
24
24
|
<final_test>
|
25
25
|
def test_detect_dogs():
|
26
26
|
dogs = detect_dogs("images/dogs.jpg")
|
27
|
-
assert
|
27
|
+
assert isinstance(dogs, int)
|
28
|
+
print(f"Number of dogs detected: {{dogs}}")
|
29
|
+
return dogs
|
28
30
|
</final_test>
|
29
31
|
|
32
|
+
OBSERVATION: ----- stdout -----
|
33
|
+
Number of dogs detected: 8
|
34
|
+
|
35
|
+
----- stderr -----
|
36
|
+
|
37
|
+
----- Intermediate output-----
|
38
|
+
None
|
39
|
+
----- Final output -----
|
40
|
+
8
|
41
|
+
|
30
42
|
AGENT: <response>Here is the code to detect dogs in the image.</response>
|
31
43
|
--- END EXAMPLE1 ---
|
32
44
|
|
@@ -11,6 +11,7 @@ from vision_agent.lmm import LMM
|
|
11
11
|
from vision_agent.models import (
|
12
12
|
AgentMessage,
|
13
13
|
CodeContext,
|
14
|
+
ErrorContext,
|
14
15
|
InteractionContext,
|
15
16
|
Message,
|
16
17
|
PlanContext,
|
@@ -27,7 +28,9 @@ CONFIG = Config()
|
|
27
28
|
|
28
29
|
|
29
30
|
def extract_conversation(
|
30
|
-
chat: List[AgentMessage],
|
31
|
+
chat: List[AgentMessage],
|
32
|
+
include_conv: bool = False,
|
33
|
+
include_errors: bool = False,
|
31
34
|
) -> Tuple[List[AgentMessage], Optional[str]]:
|
32
35
|
chat = copy.deepcopy(chat)
|
33
36
|
|
@@ -43,13 +46,18 @@ def extract_conversation(
|
|
43
46
|
elif chat_i.role == "coder":
|
44
47
|
if "<final_code>" in chat_i.content:
|
45
48
|
extracted_chat.append(chat_i)
|
49
|
+
elif chat_i.role == "final_observation":
|
50
|
+
extracted_chat.append(chat_i)
|
46
51
|
elif include_conv and chat_i.role == "conversation":
|
47
52
|
extracted_chat.append(chat_i)
|
53
|
+
elif include_errors and chat_i.role == "error_observation":
|
54
|
+
extracted_chat.append(chat_i)
|
48
55
|
|
49
|
-
# only keep the last <final_code
|
56
|
+
# only keep the last <final_code>, <final_test>
|
50
57
|
final_code = None
|
51
58
|
extracted_chat_strip_code: List[AgentMessage] = []
|
52
|
-
for chat_i in reversed(extracted_chat):
|
59
|
+
for chat_i in reversed((extracted_chat)):
|
60
|
+
# don't check role here because user could send updated <final_code>
|
53
61
|
if "<final_code>" in chat_i.content and final_code is None:
|
54
62
|
extracted_chat_strip_code = [chat_i] + extracted_chat_strip_code
|
55
63
|
final_code = extract_tag(chat_i.content, "final_code")
|
@@ -66,7 +74,12 @@ def extract_conversation(
|
|
66
74
|
|
67
75
|
|
68
76
|
def run_conversation(agent: LMM, chat: List[AgentMessage]) -> str:
|
69
|
-
|
77
|
+
# Include conversation and error messages. The error messages can come from one of
|
78
|
+
# the agents refusing to write a correctly formatted message, want to inform the
|
79
|
+
# conversation agent of this.
|
80
|
+
extracted_chat, _ = extract_conversation(
|
81
|
+
chat, include_conv=True, include_errors=True
|
82
|
+
)
|
70
83
|
|
71
84
|
conv = format_conversation(extracted_chat)
|
72
85
|
prompt = CONVERSATION.format(
|
@@ -101,7 +114,9 @@ def maybe_run_action(
|
|
101
114
|
if isinstance(context, CodeContext):
|
102
115
|
return [
|
103
116
|
AgentMessage(role="coder", content=format_code_context(context)),
|
104
|
-
AgentMessage(
|
117
|
+
AgentMessage(
|
118
|
+
role="final_observation", content=context.test_result.text()
|
119
|
+
),
|
105
120
|
]
|
106
121
|
elif isinstance(context, InteractionContext):
|
107
122
|
return [
|
@@ -110,6 +125,10 @@ def maybe_run_action(
|
|
110
125
|
content=json.dumps([elt.model_dump() for elt in context.chat]),
|
111
126
|
)
|
112
127
|
]
|
128
|
+
elif isinstance(context, ErrorContext):
|
129
|
+
return [
|
130
|
+
AgentMessage(role="error_observation", content=context.error),
|
131
|
+
]
|
113
132
|
elif action == "edit_code":
|
114
133
|
# We don't want to pass code in plan_context.code so the coder will generate
|
115
134
|
# new code from plan_context.plan
|
@@ -129,7 +148,7 @@ def maybe_run_action(
|
|
129
148
|
)
|
130
149
|
return [
|
131
150
|
AgentMessage(role="coder", content=format_code_context(context)),
|
132
|
-
AgentMessage(role="
|
151
|
+
AgentMessage(role="final_observation", content=context.test_result.text()),
|
133
152
|
]
|
134
153
|
elif action == "view_image":
|
135
154
|
pass
|
vision_agent/models/__init__.py
CHANGED
@@ -1,4 +1,10 @@
|
|
1
|
-
from .agent_types import
|
1
|
+
from .agent_types import (
|
2
|
+
AgentMessage,
|
3
|
+
CodeContext,
|
4
|
+
ErrorContext,
|
5
|
+
InteractionContext,
|
6
|
+
PlanContext,
|
7
|
+
)
|
2
8
|
from .lmm_types import Message, TextOrImage
|
3
9
|
from .tools_types import (
|
4
10
|
BboxInput,
|
@@ -29,11 +29,15 @@ class AgentMessage(BaseModel):
|
|
29
29
|
Literal["user"],
|
30
30
|
Literal["assistant"], # planner, coder and conversation are of type assistant
|
31
31
|
Literal["observation"],
|
32
|
+
Literal["final_observation"], # the observation from the final code output
|
33
|
+
Literal["error_observation"], # the observation from the error message
|
32
34
|
Literal["interaction"],
|
33
35
|
Literal["interaction_response"],
|
34
36
|
Literal["conversation"],
|
35
37
|
Literal["planner"],
|
36
|
-
Literal[
|
38
|
+
Literal[
|
39
|
+
"planner_update"
|
40
|
+
], # an intermediate update from the planner to show partial information
|
37
41
|
Literal["coder"],
|
38
42
|
]
|
39
43
|
content: str
|
@@ -75,3 +79,14 @@ class InteractionContext(BaseModel):
|
|
75
79
|
"""
|
76
80
|
|
77
81
|
chat: List[AgentMessage]
|
82
|
+
|
83
|
+
|
84
|
+
class ErrorContext(BaseModel):
|
85
|
+
"""ErrorContext is a data model that represents an error message. These errors can
|
86
|
+
happen in the planning phase when a model does not output correctly formatted
|
87
|
+
messages (often because it considers some response to be a safety issue).
|
88
|
+
|
89
|
+
error: The error message.
|
90
|
+
"""
|
91
|
+
|
92
|
+
error: str
|
vision_agent/utils/agent.py
CHANGED
@@ -159,11 +159,12 @@ def format_conversation(chat: List[AgentMessage]) -> str:
|
|
159
159
|
chat = copy.deepcopy(chat)
|
160
160
|
prompt = ""
|
161
161
|
for chat_i in chat:
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
elif chat_i.role == "user":
|
162
|
+
# we want to print user messages, final code, final code observations or errors
|
163
|
+
if chat_i.role in ["user", "coder", "final_observation", "error_observation"]:
|
164
|
+
if chat_i.role == "user":
|
166
165
|
prompt += f"USER: {chat_i.content}\n\n"
|
166
|
+
else:
|
167
|
+
prompt += f"OBSERVATION: {chat_i.content}\n\n"
|
167
168
|
elif chat_i.role == "conversation":
|
168
169
|
prompt += f"AGENT: {chat_i.content}\n\n"
|
169
170
|
return prompt
|
@@ -3,19 +3,19 @@ vision_agent/.sim_tools/embs.npy,sha256=pi7h3NHlrKncIGNR-oPn_XoTe2PzBb9-aFMi7qK0
|
|
3
3
|
vision_agent/__init__.py,sha256=EAb4-f9iyuEYkBrX4ag1syM8Syx8118_t0R6_C34M9w,57
|
4
4
|
vision_agent/agent/README.md,sha256=Q4w7FWw38qaWosQYAZ7NqWx8Q5XzuWrlv7nLhjUd1-8,5527
|
5
5
|
vision_agent/agent/__init__.py,sha256=M8CffavdIh8Zh-skznLHIaQkYGCGK7vk4dq1FaVkbs4,617
|
6
|
-
vision_agent/agent/agent.py,sha256=
|
6
|
+
vision_agent/agent/agent.py,sha256=o1Zuhl6h2R7uVwvUur0Aj38kak8U08plfeFWPst_ErM,1576
|
7
7
|
vision_agent/agent/vision_agent.py,sha256=4LqvwPTSsiuJEDwBbMx9Dg9ALJwNR6x1c63TZvOMm8A,23486
|
8
8
|
vision_agent/agent/vision_agent_coder.py,sha256=Ry6AiyAj3hsSeYPu_5guMcTzf2E4SoebPzpHyJtSPbQ,27360
|
9
9
|
vision_agent/agent/vision_agent_coder_prompts.py,sha256=D4RJxTWoxpl-WtYRvHNxaLSdWVHsdYb0jJIQ2ZCGU0A,12277
|
10
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=
|
11
|
+
vision_agent/agent/vision_agent_coder_v2.py,sha256=I4gWrneFIqhX6W-MxiaNyPKGk5tRKgC8xryV-YdeSZU,17289
|
12
12
|
vision_agent/agent/vision_agent_planner.py,sha256=rp_atRMDg35WFXNKOTkjUpGPrpSCsiMhcfZtqK-DIV4,18668
|
13
13
|
vision_agent/agent/vision_agent_planner_prompts.py,sha256=rYRdJthc-sQN57VgCBKrF09Sd73BSxcBdjNe6C4WNZ8,6837
|
14
14
|
vision_agent/agent/vision_agent_planner_prompts_v2.py,sha256=TiiF5BGnFVraFlQnDaeRU67927LvszvpcMUOgVgo0ps,35843
|
15
|
-
vision_agent/agent/vision_agent_planner_v2.py,sha256=
|
15
|
+
vision_agent/agent/vision_agent_planner_v2.py,sha256=GOhaTsVCh02X09IKkC4k9z79lsmU4VgRW7WJLKjdG1k,21755
|
16
16
|
vision_agent/agent/vision_agent_prompts.py,sha256=KaJwYPUP7_GvQsCPPs6Fdawmi3AQWmWajBUuzj7gTG4,13812
|
17
|
-
vision_agent/agent/vision_agent_prompts_v2.py,sha256=
|
18
|
-
vision_agent/agent/vision_agent_v2.py,sha256=
|
17
|
+
vision_agent/agent/vision_agent_prompts_v2.py,sha256=jTfu_heNTBaHj1UNI0XIyyFDgDOjPTPP83vrS-g3A1U,2961
|
18
|
+
vision_agent/agent/vision_agent_v2.py,sha256=QPAyDjnRRHUCD4Pw4TQYffWkucbn4WkEjYn8dBIWll4,11682
|
19
19
|
vision_agent/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
20
20
|
vision_agent/clients/http.py,sha256=k883i6M_4nl7zwwHSI-yP5sAgQZIDPM1nrKD6YFJ3Xs,2009
|
21
21
|
vision_agent/configs/__init__.py,sha256=Iu75-w9_nlPmnB_qKA7nYaaaHf7xtTrDmK8N4v2WV34,27
|
@@ -27,8 +27,8 @@ vision_agent/fonts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
|
|
27
27
|
vision_agent/fonts/default_font_ch_en.ttf,sha256=1YM0Z3XqLDjSNbF7ihQFSAIUdjF9m1rtHiNC_6QosTE,1594400
|
28
28
|
vision_agent/lmm/__init__.py,sha256=4qX2lmGnKWHeKftXueEi9xj_ieK2nQh_ipHf72nKGFk,84
|
29
29
|
vision_agent/lmm/lmm.py,sha256=XYp1frrqQ-6q-0y2IWwM8-EIH5UrFZ21SAhkcM32J9w,19355
|
30
|
-
vision_agent/models/__init__.py,sha256=
|
31
|
-
vision_agent/models/agent_types.py,sha256=
|
30
|
+
vision_agent/models/__init__.py,sha256=eIP0pD5dYog8zUA7uuTmUxCF6SIutbLRLRE0cmuCJgQ,326
|
31
|
+
vision_agent/models/agent_types.py,sha256=vBZ9-ns5lHDdFMO7ulCGGeZ6OwRo3gK4O3vN0814IWc,3064
|
32
32
|
vision_agent/models/lmm_types.py,sha256=v04h-NjbczHOIN8UWa1vvO5-1BDuZ4JQhD2mge1cXmw,305
|
33
33
|
vision_agent/models/tools_types.py,sha256=8hYf2OZhI58gvf65KGaeGkt4EQ56nwLFqIQDPHioOBc,2339
|
34
34
|
vision_agent/sim/__init__.py,sha256=Aouz6HEPPTYcLxR5_0fTYCL1OvPKAH1RMWAF90QXAlA,135
|
@@ -39,7 +39,7 @@ vision_agent/tools/planner_tools.py,sha256=orBTdJQz2NKoLuX9WE6XixaYuG305xz0UBYvZ
|
|
39
39
|
vision_agent/tools/prompts.py,sha256=V1z4YJLXZuUl_iZ5rY0M5hHc_2tmMEUKr0WocXKGt4E,1430
|
40
40
|
vision_agent/tools/tools.py,sha256=uhvgPeAzhOV2vfBa216vq-JVItqgzIRKs1JMBezj2Es,107631
|
41
41
|
vision_agent/utils/__init__.py,sha256=mANUs_84VL-3gpZbXryvV2mWU623eWnRlJCSUHtMjuw,122
|
42
|
-
vision_agent/utils/agent.py,sha256=
|
42
|
+
vision_agent/utils/agent.py,sha256=8z4Ei0q397lVWUga8v9nQKuenGAsh2wfkAKQOB8CwpI,14701
|
43
43
|
vision_agent/utils/exceptions.py,sha256=zis8smCbdEylBVZBTVfEUfAh7Rb7cWV3MSPambu6FsQ,1837
|
44
44
|
vision_agent/utils/execute.py,sha256=vOEP5Ys7S2lc0_7pOJbgk7OaWi85hrCNu9_8Bo3zk6I,29356
|
45
45
|
vision_agent/utils/image_utils.py,sha256=bJM2mEvB6E__M9pxi74yQYzAiZ7mu3KE2ptyVrp5vzQ,12533
|
@@ -48,7 +48,7 @@ vision_agent/utils/tools_doc.py,sha256=yFue6KSXoa_Z1ngCdBEc4SdPZOWF1rVLeaHu02I8W
|
|
48
48
|
vision_agent/utils/type_defs.py,sha256=BE12s3JNQy36QvauXHjwyeffVh5enfcvd4vTzSwvEZI,1384
|
49
49
|
vision_agent/utils/video.py,sha256=rjsQ1sKKisaQ6AVjJz0zd_G4g-ovRweS_rs4JEhenoI,5340
|
50
50
|
vision_agent/utils/video_tracking.py,sha256=eMIiWOG24bgXbqOy1DTtepO2gPo1ClW6Y0tdbEF_14k,12227
|
51
|
-
vision_agent-0.2.
|
52
|
-
vision_agent-0.2.
|
53
|
-
vision_agent-0.2.
|
54
|
-
vision_agent-0.2.
|
51
|
+
vision_agent-0.2.243.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
52
|
+
vision_agent-0.2.243.dist-info/METADATA,sha256=R1mAlqsjgXjmE8Okex12-on706FU16JeP4jNM3ZlFBQ,5712
|
53
|
+
vision_agent-0.2.243.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
|
54
|
+
vision_agent-0.2.243.dist-info/RECORD,,
|
File without changes
|
File without changes
|