optexity 0.1.5__py3-none-any.whl → 0.1.5.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
optexity/__init__.py CHANGED
@@ -1,7 +1,13 @@
1
1
  import logging
2
2
  import sys
3
+ from importlib.metadata import PackageNotFoundError, version
3
4
  from pathlib import Path
4
5
 
6
+ try:
7
+ __version__ = version("optexity")
8
+ except PackageNotFoundError:
9
+ __version__ = "0.0.0"
10
+
5
11
  logging.basicConfig(
6
12
  level=logging.WARNING, # Default level for root logger
7
13
  format="%(asctime)s [%(levelname)s] %(name)s.%(funcName)s: %(message)s",
@@ -23,12 +23,13 @@ automation_json = {
23
23
  "click_element": {
24
24
  "prompt_instructions": "Click on the link with the name of the stock equivalent for {stock_ticker[0]}."
25
25
  }
26
- }
26
+ },
27
+ "before_sleep_time": 1,
27
28
  },
28
29
  {
29
30
  "extraction_action": {
30
31
  "llm": {
31
- "source": ["screenshot"],
32
+ "source": ["screenshot", "axtree"],
32
33
  "extraction_format": {
33
34
  "stock_name": "str",
34
35
  "stock_price": "str",
@@ -154,7 +154,10 @@ def get_app_with_endpoints(is_aws: bool, child_id: int):
154
154
 
155
155
  await task_queue.put(task)
156
156
  return JSONResponse(
157
- content={"success": True, "message": "Task has been allocated"},
157
+ content={
158
+ "success": True,
159
+ "message": "Task has been allocated. Check its status and output at https://dashboard.optexity.com/tasks",
160
+ },
158
161
  status_code=202,
159
162
  )
160
163
  except Exception as e:
@@ -192,7 +195,7 @@ def get_app_with_endpoints(is_aws: bool, child_id: int):
192
195
  return JSONResponse(
193
196
  content={
194
197
  "success": True,
195
- "message": "Task has been allocated",
198
+ "message": "Task has been allocated. Check its status and output at https://dashboard.optexity.com/tasks",
196
199
  "task_id": task.task_id,
197
200
  },
198
201
  status_code=202,
@@ -53,7 +53,7 @@ async def click_element_index(
53
53
 
54
54
  try:
55
55
  index = await get_index_from_prompt(
56
- memory, click_element_action.prompt_instructions, browser
56
+ memory, click_element_action.prompt_instructions, browser, task
57
57
  )
58
58
  if index is None:
59
59
  return
@@ -67,7 +67,9 @@ async def command_based_action_with_retry(
67
67
  url=browser_state_summary.url,
68
68
  screenshot=browser_state_summary.screenshot,
69
69
  title=browser_state_summary.title,
70
- axtree=browser_state_summary.dom_state.llm_representation(),
70
+ axtree=browser_state_summary.dom_state.llm_representation(
71
+ remove_empty_nodes=task.automation.remove_empty_nodes_in_axtree
72
+ ),
71
73
  )
72
74
 
73
75
  if isinstance(action, ClickElementAction):
@@ -48,15 +48,18 @@ async def handle_input_text(
48
48
  logger.debug(
49
49
  f"Executing prompt-based action: {input_text_action.__class__.__name__}"
50
50
  )
51
- await input_text_index(input_text_action, browser, memory)
51
+ await input_text_index(input_text_action, browser, memory, task)
52
52
 
53
53
 
54
54
  async def input_text_index(
55
- input_text_action: InputTextAction, browser: Browser, memory: Memory
55
+ input_text_action: InputTextAction, browser: Browser, memory: Memory, task: Task
56
56
  ):
57
57
  try:
58
58
  index = await get_index_from_prompt(
59
- memory, input_text_action.prompt_instructions, browser
59
+ memory,
60
+ input_text_action.prompt_instructions,
61
+ browser,
62
+ task,
60
63
  )
61
64
  if index is None:
62
65
  return
@@ -60,7 +60,7 @@ async def select_option_index(
60
60
  try:
61
61
 
62
62
  index = await get_index_from_prompt(
63
- memory, select_option_action.prompt_instructions, browser
63
+ memory, select_option_action.prompt_instructions, browser, task
64
64
  )
65
65
  if index is None:
66
66
  return
@@ -36,16 +36,16 @@ async def handle_upload_file(
36
36
  logger.debug(
37
37
  f"Executing prompt-based action: {upload_file_action.__class__.__name__}"
38
38
  )
39
- await upload_file_index(upload_file_action, browser, memory)
39
+ await upload_file_index(upload_file_action, browser, memory, task)
40
40
 
41
41
 
42
42
  async def upload_file_index(
43
- upload_file_action: UploadFileAction, browser: Browser, memory: Memory
43
+ upload_file_action: UploadFileAction, browser: Browser, memory: Memory, task: Task
44
44
  ):
45
45
 
46
46
  try:
47
47
  index = await get_index_from_prompt(
48
- memory, upload_file_action.prompt_instructions, browser
48
+ memory, upload_file_action.prompt_instructions, browser, task
49
49
  )
50
50
  if index is None:
51
51
  return
@@ -18,14 +18,16 @@ index_prediction_agent = ActionPredictionLocatorAxtree()
18
18
 
19
19
 
20
20
  async def get_index_from_prompt(
21
- memory: Memory, prompt_instructions: str, browser: Browser
21
+ memory: Memory, prompt_instructions: str, browser: Browser, task: Task
22
22
  ):
23
23
  browser_state_summary = await browser.get_browser_state_summary()
24
24
  memory.browser_states[-1] = BrowserState(
25
25
  url=browser_state_summary.url,
26
26
  screenshot=browser_state_summary.screenshot,
27
27
  title=browser_state_summary.title,
28
- axtree=browser_state_summary.dom_state.llm_representation(),
28
+ axtree=browser_state_summary.dom_state.llm_representation(
29
+ remove_empty_nodes=task.automation.remove_empty_nodes_in_axtree
30
+ ),
29
31
  )
30
32
 
31
33
  try:
@@ -6,6 +6,7 @@ from optexity.inference.infra.browser import Browser
6
6
  from optexity.inference.models import GeminiModels, get_llm_model
7
7
  from optexity.schema.actions.assertion_action import AssertionAction, LLMAssertion
8
8
  from optexity.schema.memory import Memory
9
+ from optexity.schema.task import Task
9
10
 
10
11
  logger = logging.getLogger(__name__)
11
12
 
@@ -13,14 +14,17 @@ llm_model = get_llm_model(GeminiModels.GEMINI_2_5_FLASH, True)
13
14
 
14
15
 
15
16
  async def run_assertion_action(
16
- assertion_action: AssertionAction, memory: Memory, browser: Browser
17
+ assertion_action: AssertionAction,
18
+ memory: Memory,
19
+ browser: Browser,
20
+ task: Task,
17
21
  ):
18
22
  logger.debug(
19
23
  f"---------Running assertion action {assertion_action.model_dump_json()}---------"
20
24
  )
21
25
 
22
26
  if assertion_action.llm:
23
- await handle_llm_assertion(assertion_action.llm, memory, browser)
27
+ await handle_llm_assertion(assertion_action.llm, memory, browser, task)
24
28
  elif assertion_action.network_call:
25
29
  raise ValueError("Network call assertions are not supported yet")
26
30
  # await handle_network_call_assertion(
@@ -34,7 +38,7 @@ async def run_assertion_action(
34
38
 
35
39
 
36
40
  async def handle_llm_assertion(
37
- llm_assertion: LLMAssertion, memory: Memory, browser: Browser
41
+ llm_assertion: LLMAssertion, memory: Memory, browser: Browser, task: Task
38
42
  ):
39
43
  extra_instruction = """You are a helpful assistant that verifies if the condition is met.
40
44
  Use the info supplied below to verify the condition.
@@ -45,7 +49,7 @@ async def handle_llm_assertion(
45
49
  llm_assertion_new.extraction_instructions = (
46
50
  extra_instruction + "\n" + llm_assertion_new.extraction_instructions
47
51
  )
48
- output_data = await handle_llm_extraction(llm_assertion_new, memory, browser)
52
+ output_data = await handle_llm_extraction(llm_assertion_new, memory, browser, task)
49
53
 
50
54
  if output_data.json_data["assertion_result"]:
51
55
  return True
@@ -209,7 +209,9 @@ async def run_final_logging(
209
209
  url=browser_state_summary.url,
210
210
  screenshot=browser_state_summary.screenshot,
211
211
  title=browser_state_summary.title,
212
- axtree=browser_state_summary.dom_state.llm_representation(),
212
+ axtree=browser_state_summary.dom_state.llm_representation(
213
+ remove_empty_nodes=task.automation.remove_empty_nodes_in_axtree
214
+ ),
213
215
  )
214
216
  )
215
217
 
@@ -279,7 +281,9 @@ async def run_action_node(
279
281
  action_node.python_script_action, memory, browser
280
282
  )
281
283
  elif action_node.assertion_action:
282
- await run_assertion_action(action_node.assertion_action, memory, browser)
284
+ await run_assertion_action(
285
+ action_node.assertion_action, memory, browser, task
286
+ )
283
287
 
284
288
  except Exception as e:
285
289
  logger.error(f"Error running node {memory.automation_state.step_index}: {e}")
@@ -37,7 +37,11 @@ async def run_extraction_action(
37
37
 
38
38
  if extraction_action.llm:
39
39
  await handle_llm_extraction(
40
- extraction_action.llm, memory, browser, extraction_action.unique_identifier
40
+ extraction_action.llm,
41
+ memory,
42
+ browser,
43
+ task,
44
+ extraction_action.unique_identifier,
41
45
  )
42
46
  elif extraction_action.network_call:
43
47
  await handle_network_call_extraction(
@@ -108,6 +112,7 @@ async def handle_llm_extraction(
108
112
  llm_extraction: LLMExtraction,
109
113
  memory: Memory,
110
114
  browser: Browser,
115
+ task: Task,
111
116
  unique_identifier: str | None = None,
112
117
  ):
113
118
  browser_state_summary = await browser.get_browser_state_summary()
@@ -115,7 +120,9 @@ async def handle_llm_extraction(
115
120
  url=browser_state_summary.url,
116
121
  screenshot=browser_state_summary.screenshot,
117
122
  title=browser_state_summary.title,
118
- axtree=browser_state_summary.dom_state.llm_representation(),
123
+ axtree=browser_state_summary.dom_state.llm_representation(
124
+ remove_empty_nodes=task.automation.remove_empty_nodes_in_axtree
125
+ ),
119
126
  )
120
127
 
121
128
  # TODO: fix this double calling of screenshot and axtree
@@ -131,8 +138,8 @@ async def handle_llm_extraction(
131
138
 
132
139
  system_instruction = f"""
133
140
  You are an expert in extracting information from a website. You will be given an axtree of a webpage.
134
- Your task is to extract the information from the webpage and return it in the format specified by the instructions.
135
- {llm_extraction.extraction_instructions}
141
+ Your task is to extract the information from the webpage and return it in the format specified by the instructions. You will be first provided the instructions and then the axtree.
142
+ Instructions: {llm_extraction.extraction_instructions}
136
143
  """
137
144
 
138
145
  prompt = f"""
@@ -163,6 +170,8 @@ async def handle_llm_extraction(
163
170
  memory.token_usage += token_usage
164
171
  memory.variables.output_data.append(output_data)
165
172
 
173
+ memory.browser_states[-1].final_prompt = f"{system_instruction}\n{prompt}"
174
+
166
175
  if llm_extraction.output_variable_names is not None:
167
176
  for output_variable_name in llm_extraction.output_variable_names:
168
177
  v = response_dict[output_variable_name]
@@ -219,7 +219,9 @@ async def handle_assert_locator_presence_error(
219
219
  url=browser_state_summary.url,
220
220
  screenshot=browser_state_summary.screenshot,
221
221
  title=browser_state_summary.title,
222
- axtree=browser_state_summary.dom_state.llm_representation(),
222
+ axtree=browser_state_summary.dom_state.llm_representation(
223
+ remove_empty_nodes=task.automation.remove_empty_nodes_in_axtree
224
+ ),
223
225
  )
224
226
  final_prompt, response, token_usage = error_handler_agent.classify_error(
225
227
  error.command, memory.browser_states[-1].screenshot
@@ -311,6 +311,7 @@ class Parameters(BaseModel):
311
311
  class Automation(BaseModel):
312
312
  browser_channel: Literal["chromium", "chrome"] = "chromium"
313
313
  expected_downloads: int = 0
314
+ remove_empty_nodes_in_axtree: bool = True
314
315
  url: str
315
316
  parameters: Parameters
316
317
  nodes: list[
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: optexity
3
- Version: 0.1.5
3
+ Version: 0.1.5.1
4
4
  Summary: Optexity is a platform for building and running browser and computer agents.
5
5
  Author-email: Optexity <founders@optexity.com>
6
6
  Requires-Python: >=3.11
@@ -83,6 +83,7 @@ Install Optexity directly from PyPI:
83
83
 
84
84
  ```bash
85
85
  pip install optexity
86
+ optexity install-browsers
86
87
  ```
87
88
 
88
89
  **OR**
@@ -95,6 +96,7 @@ If you want to clone and edit from source:
95
96
  git clone git@github.com:Optexity/optexity.git
96
97
  cd optexity
97
98
  pip install -e .
99
+ optexity install-browsers
98
100
  ```
99
101
 
100
102
  ## Set required environment variables:
@@ -107,14 +109,6 @@ DEPLOYMENT=dev # or "prod" in production
107
109
 
108
110
  You can get your free Google Gemini API key from the [Google AI Studio Console](https://aistudio.google.com).
109
111
 
110
- ## Install required browsers:
111
-
112
- Install playwright and patchright browsers:
113
-
114
- ```bash
115
- optexity install-browsers
116
- ```
117
-
118
112
  ## Recording Your First Automation
119
113
 
120
114
  The fastest way to create an automation is by recording your actions directly in the browser.
@@ -1,4 +1,4 @@
1
- optexity/__init__.py,sha256=dqh4tGEzruZnkvRLjPYKyc2-FVlXLx1Dj-JNy5fy7U8,459
1
+ optexity/__init__.py,sha256=rQAAQJLgccSNz-w3RTaFK8qdVlHHfcKyRNAQsqhz6l0,619
2
2
  optexity/cli.py,sha256=2g_p2Qh7jzFFG5T0aTDiZ7Celh-KycEMJ873whiXFXE,2237
3
3
  optexity/exceptions.py,sha256=j4QxbcnAl5RmEJPJ0MWZ0iM38HvW-r8xmxtDxZ1ceSY,269
4
4
  optexity/onepassword_integration.py,sha256=_1sQ8sRGVdDnA7384FXiXYRVntPB-ZQAu8W7ICX7_VQ,1047
@@ -6,14 +6,14 @@ optexity/test.py,sha256=pMSZwwA8tj6jAfFUJ3OUHGnTPriqkv4eDGGHqdAdrsA,2797
6
6
  optexity/examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  optexity/examples/add_example.py,sha256=jVPd2pQ9lnmdwsVsld52CkRafYcF60SrQyDU3QFKTwY,2474
8
8
  optexity/examples/download_pdf_url.py,sha256=mB1Kp0UC4AuHeIiyxMt5tlNK5urNPUosHjmUvV67qdM,829
9
- optexity/examples/extract_price_stockanalysis.py,sha256=oUMAXW0TKFjJO6KCDIsThaMwNNC_Zx5_ZfkuYTo9xmE,1520
9
+ optexity/examples/extract_price_stockanalysis.py,sha256=RGc71h3xpKPpShTHwYDy-jz50jBtKiada-EvSbijiRc,1567
10
10
  optexity/examples/file_upload.py,sha256=Ep9wxjZFjlcWVufkhLt_RufZMbC8BJ8amASFO7uKGCk,2030
11
11
  optexity/examples/i94.py,sha256=QB-Vo6jB03wOovsNh6_TsdxvdJf3MbnxVeUlEoVtUhA,4534
12
12
  optexity/examples/i94_travel_history.py,sha256=PbU-xg3xVoEgRPaZQfC5JPNcHA6ClTu8X7650TK1_dc,4573
13
13
  optexity/examples/peachstate_medicaid.py,sha256=0PQN3SI5NGw0m95ODm-bHYgF0xwpA83_9xflnN8P4mM,8290
14
14
  optexity/examples/supabase_login.py,sha256=_j5VZi0HkqpWl0xguMoHc3gfkf3FiJWnQPs8D_QARN4,2349
15
15
  optexity/inference/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- optexity/inference/child_process.py,sha256=0-HoM9yUtYf7BzfCeKS_uUO4NfrdAESryuHaKYRwEoY,8098
16
+ optexity/inference/child_process.py,sha256=0trTwuE9cr0hIaLS_1tKnfCVMWwbNTI2XsDKiXya9lY,8295
17
17
  optexity/inference/run_local.py,sha256=P-ghDcNhHESuG7Q6Qp6xdl6r0g2lAyDkIhKsyaLBcPs,6743
18
18
  optexity/inference/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  optexity/inference/agents/error_handler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -30,23 +30,23 @@ optexity/inference/agents/two_fa_extraction/prompt.py,sha256=eAqz_InZeyTnFqPMeYm
30
30
  optexity/inference/agents/two_fa_extraction/two_fa_extraction.py,sha256=UcBo_Iyx6Kqas-fUZpJgos5R-t2hQ2PZUFjtHmO9Rh0,1444
31
31
  optexity/inference/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
32
  optexity/inference/core/logging.py,sha256=Zq2KL6XWlPIgsJjprxv-BLsnP5MAAKS2ciNMNkQrfBU,13870
33
- optexity/inference/core/run_assertion.py,sha256=8ydAkSA2E0VajwKZlY2z4Xxxyzo49UsFIZ7ej_l0Cy8,2224
34
- optexity/inference/core/run_automation.py,sha256=aXsEj3M7BN_VlpDZgZdScsQHB7jfukCAKGvyBSjUMjA,16708
35
- optexity/inference/core/run_extraction.py,sha256=TaUfFCcKxuMEJELDhcYMjpbyxgRrdVMHNIX6pjo7l5U,7576
36
- optexity/inference/core/run_interaction.py,sha256=Rs6Sa4cqTpR1jNNPh2IRYfj4sKcFgtWbjTaQN-wRICs,9248
33
+ optexity/inference/core/run_assertion.py,sha256=cHI_A_ffe-T7XeTfTqiF3i_KIRe9ioYKSEM1rKZmq0o,2311
34
+ optexity/inference/core/run_automation.py,sha256=8X8IEBplOjiCqv7SsUWEMEUPfwDdgUgx1eY2WWx9zms,16853
35
+ optexity/inference/core/run_extraction.py,sha256=aA51UMU9gYMa0YD03KVf26fM5bYCrcpbf5lnmMGgjfY,7891
36
+ optexity/inference/core/run_interaction.py,sha256=nUmlq4OfUQuTjDklngQ--EbrRZ0xSCzdbrkpLFak1R0,9341
37
37
  optexity/inference/core/run_python_script.py,sha256=WjnCmckZz7YmoLTGBLZeFWhhS1s_x0-kgyKYTM17JHI,547
38
38
  optexity/inference/core/run_two_fa.py,sha256=m1lxPefJHtXqMYBB0oONxd5f7XX8AI5eUkjjjs5y0Z0,4010
39
39
  optexity/inference/core/interaction/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
40
  optexity/inference/core/interaction/handle_agentic_task.py,sha256=MSURLDM-2Hw37sipa3lqUBh1NNFrGmx2DPGJsBGYTDg,2617
41
41
  optexity/inference/core/interaction/handle_check.py,sha256=_LEA5V6h4x8fozAvPsGrFUZUaO0uU34z2R9VzGIOdio,1489
42
- optexity/inference/core/interaction/handle_click.py,sha256=IhdYjj-oNGoJInN9XK6ppqW6JQgCNm7t2COymv5T9O8,2249
43
- optexity/inference/core/interaction/handle_command.py,sha256=nkteOZ8-at03s1MurVAYeGVIexMukbss8A4ooX81czE,8341
44
- optexity/inference/core/interaction/handle_input.py,sha256=UGALiQLUgjgg5Z-vj4lEoEs4_GXCirUBgONUulKs0oU,2256
42
+ optexity/inference/core/interaction/handle_click.py,sha256=G9ZYylql5YjHQHSuRQYXMZRK_6RI0iUwKPSTPfmXNXo,2255
43
+ optexity/inference/core/interaction/handle_command.py,sha256=Xj7eWYoVi60tFcjseAHD33EByStiKoMsuKXaAmyVPxs,8450
44
+ optexity/inference/core/interaction/handle_input.py,sha256=-Yug3fBWumCp0xQt1UVX8dqCHKs_535VheMjOHMlv2Q,2317
45
45
  optexity/inference/core/interaction/handle_keypress.py,sha256=Ig-U7qoMQ1GIaxeS2TnSTe4N3Jj64WcVc1rwl7Z-0So,466
46
- optexity/inference/core/interaction/handle_select.py,sha256=1nTm-hyaG4xDnItdulW1--b0zj20FdJq7qks5X-aNKU,3236
46
+ optexity/inference/core/interaction/handle_select.py,sha256=z-HoFqcuvsfW_fxJrmsz9RASlqef8HA7zJUErBs-9_o,3242
47
47
  optexity/inference/core/interaction/handle_select_utils.py,sha256=gJnIvBNPFwIkFjYiaVSB-91k95leahrSnlq8fgDcWbQ,4114
48
- optexity/inference/core/interaction/handle_upload.py,sha256=cIe9lcgA8_jT1KMGcImfqq_PEEVY-Fy5YZjrX2GA8As,1818
49
- optexity/inference/core/interaction/utils.py,sha256=iWKfn7cF-8duQoMvGfmGV05oOuQEyKPgOdMJe_Hk4KM,2745
48
+ optexity/inference/core/interaction/handle_upload.py,sha256=Yrt9KZ-rmgJ-DK5IntIXWG-jcw7mbVYs5iSrZUMkRvc,1842
49
+ optexity/inference/core/interaction/utils.py,sha256=_TMt0XBIIJi2K7nVQGf4PMZ-c9SCDehcMIEGPQx1GS8,2842
50
50
  optexity/inference/core/two_factor_auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
51
  optexity/inference/infra/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
52
  optexity/inference/infra/browser.py,sha256=GpECOdxhpe5AbwU2FnRmR7jevKUiHHEZCq7PgpMI8t0,15955
@@ -56,7 +56,7 @@ optexity/inference/models/gemini.py,sha256=ToncY6Ft4kOgIm6qREBVsScT8FG-JCrdWsBxY
56
56
  optexity/inference/models/human.py,sha256=K2X6Ohg7xeTWDYkJY6lOAwS9T3nX7YST-cvd8nL1Ydw,394
57
57
  optexity/inference/models/llm_model.py,sha256=nZvcrQs4XDI07ckFUf6o-TzvyqW-I4WIbos7WEo4hz8,7211
58
58
  optexity/schema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
- optexity/schema/automation.py,sha256=by9pcgCpG1yDEowBQGeVa30vQ3hO-GCtTiJdcSf4RKY,16121
59
+ optexity/schema/automation.py,sha256=b-Suy9ro_bxZCIv6LU7Hnzht_DCQq-NzANqXoiuavRs,16167
60
60
  optexity/schema/callback.py,sha256=MlN41A6oKG7QX01_w0tsxyAFKWnoCVsu_mjpWzPMYuE,519
61
61
  optexity/schema/inference.py,sha256=8mP49IRU-cRxbsC4NnoGZhd5isvdocCuMVspPBOQV9o,2864
62
62
  optexity/schema/memory.py,sha256=e3AMDAivCF_KnKbeDugqVLib8UN_6dr3ksUCiWaeIGM,3072
@@ -72,9 +72,9 @@ optexity/schema/actions/two_fa_action.py,sha256=OzzTDX3fZObWJiw8hvNgr96PBcvpDh1u
72
72
  optexity/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
73
  optexity/utils/settings.py,sha256=h6StXzYslRgZf0c8k43-kOxoa77dOgDvSOvfQUi5yI8,1864
74
74
  optexity/utils/utils.py,sha256=QgVeKK3jAq-TLgP_RYiCXRAOEbuypFox0RxYEjruoTA,2565
75
- optexity-0.1.5.dist-info/licenses/LICENSE,sha256=WpSBqSAcwd68PmS3zRsfACJOz-u-UfTzftsEnzp4ZCY,1065
76
- optexity-0.1.5.dist-info/METADATA,sha256=B4OeiBwV8-TX1GvQJTl4scKzkaLHO97xyT40mx1tSiA,9887
77
- optexity-0.1.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
78
- optexity-0.1.5.dist-info/entry_points.txt,sha256=hcn77ooRr6a_N8fo0vij3Fpo6waqc9ijpaScQ7Kj35k,47
79
- optexity-0.1.5.dist-info/top_level.txt,sha256=OZEtBX8IabC8EnBrNW98z7NzdGQsjFhHleSthhjjEMM,9
80
- optexity-0.1.5.dist-info/RECORD,,
75
+ optexity-0.1.5.1.dist-info/licenses/LICENSE,sha256=WpSBqSAcwd68PmS3zRsfACJOz-u-UfTzftsEnzp4ZCY,1065
76
+ optexity-0.1.5.1.dist-info/METADATA,sha256=ahKdSBPKViREzUaF_ufITJoaq8yytad_uKZe2kjIQ9I,9826
77
+ optexity-0.1.5.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
78
+ optexity-0.1.5.1.dist-info/entry_points.txt,sha256=hcn77ooRr6a_N8fo0vij3Fpo6waqc9ijpaScQ7Kj35k,47
79
+ optexity-0.1.5.1.dist-info/top_level.txt,sha256=OZEtBX8IabC8EnBrNW98z7NzdGQsjFhHleSthhjjEMM,9
80
+ optexity-0.1.5.1.dist-info/RECORD,,