quantalogic 0.60.0__py3-none-any.whl → 0.61.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.
Files changed (48) hide show
  1. quantalogic/agent_config.py +5 -5
  2. quantalogic/agent_factory.py +2 -2
  3. quantalogic/codeact/__init__.py +0 -0
  4. quantalogic/codeact/agent.py +499 -0
  5. quantalogic/codeact/cli.py +232 -0
  6. quantalogic/codeact/constants.py +9 -0
  7. quantalogic/codeact/events.py +78 -0
  8. quantalogic/codeact/llm_util.py +76 -0
  9. quantalogic/codeact/prompts/error_format.j2 +11 -0
  10. quantalogic/codeact/prompts/generate_action.j2 +26 -0
  11. quantalogic/codeact/prompts/generate_program.j2 +39 -0
  12. quantalogic/codeact/prompts/response_format.j2 +11 -0
  13. quantalogic/codeact/tools_manager.py +135 -0
  14. quantalogic/codeact/utils.py +135 -0
  15. quantalogic/coding_agent.py +2 -2
  16. quantalogic/python_interpreter/__init__.py +23 -0
  17. quantalogic/python_interpreter/assignment_visitors.py +63 -0
  18. quantalogic/python_interpreter/base_visitors.py +20 -0
  19. quantalogic/python_interpreter/class_visitors.py +22 -0
  20. quantalogic/python_interpreter/comprehension_visitors.py +172 -0
  21. quantalogic/python_interpreter/context_visitors.py +59 -0
  22. quantalogic/python_interpreter/control_flow_visitors.py +88 -0
  23. quantalogic/python_interpreter/exception_visitors.py +109 -0
  24. quantalogic/python_interpreter/exceptions.py +39 -0
  25. quantalogic/python_interpreter/execution.py +202 -0
  26. quantalogic/python_interpreter/function_utils.py +386 -0
  27. quantalogic/python_interpreter/function_visitors.py +209 -0
  28. quantalogic/python_interpreter/import_visitors.py +28 -0
  29. quantalogic/python_interpreter/interpreter_core.py +358 -0
  30. quantalogic/python_interpreter/literal_visitors.py +74 -0
  31. quantalogic/python_interpreter/misc_visitors.py +148 -0
  32. quantalogic/python_interpreter/operator_visitors.py +108 -0
  33. quantalogic/python_interpreter/scope.py +10 -0
  34. quantalogic/python_interpreter/visit_handlers.py +110 -0
  35. quantalogic/tools/__init__.py +5 -4
  36. quantalogic/tools/action_gen.py +366 -0
  37. quantalogic/tools/python_tool.py +13 -0
  38. quantalogic/tools/{search_definition_names.py → search_definition_names_tool.py} +2 -2
  39. quantalogic/tools/tool.py +116 -22
  40. quantalogic/tools/utils/generate_database_report.py +2 -2
  41. quantalogic/utils/__init__.py +0 -1
  42. quantalogic/utils/test_python_interpreter.py +119 -0
  43. {quantalogic-0.60.0.dist-info → quantalogic-0.61.1.dist-info}/METADATA +8 -2
  44. {quantalogic-0.60.0.dist-info → quantalogic-0.61.1.dist-info}/RECORD +47 -15
  45. quantalogic/utils/python_interpreter.py +0 -905
  46. {quantalogic-0.60.0.dist-info → quantalogic-0.61.1.dist-info}/LICENSE +0 -0
  47. {quantalogic-0.60.0.dist-info → quantalogic-0.61.1.dist-info}/WHEEL +0 -0
  48. {quantalogic-0.60.0.dist-info → quantalogic-0.61.1.dist-info}/entry_points.txt +0 -0
quantalogic/tools/tool.py CHANGED
@@ -38,7 +38,6 @@ class ToolArgument(BaseModel):
38
38
  )
39
39
  example: str | None = Field(default=None, description="An example value to illustrate the argument's usage.")
40
40
 
41
-
42
41
  class ToolDefinition(BaseModel):
43
42
  """Base class for defining tool configurations without execution logic.
44
43
 
@@ -46,6 +45,7 @@ class ToolDefinition(BaseModel):
46
45
  name: Unique name of the tool.
47
46
  description: Brief description of the tool's functionality.
48
47
  arguments: List of arguments the tool accepts.
48
+ return_type: The return type of the tool's execution method. Defaults to "str".
49
49
  need_validation: Flag to indicate if tool requires validation.
50
50
  """
51
51
 
@@ -54,6 +54,7 @@ class ToolDefinition(BaseModel):
54
54
  name: str = Field(..., description="The unique name of the tool.")
55
55
  description: str = Field(..., description="A brief description of what the tool does.")
56
56
  arguments: list[ToolArgument] = Field(default_factory=list, description="A list of arguments the tool accepts.")
57
+ return_type: str = Field(default="str", description="The return type of the tool's execution method.")
57
58
  need_validation: bool = Field(
58
59
  default=False,
59
60
  description="When True, requires user confirmation before execution. Useful for tools that perform potentially destructive operations.",
@@ -85,6 +86,7 @@ class ToolDefinition(BaseModel):
85
86
  "name",
86
87
  "description",
87
88
  "arguments",
89
+ "return_type",
88
90
  "need_validation",
89
91
  "need_variables",
90
92
  "need_caller_context_memory",
@@ -123,10 +125,6 @@ class ToolDefinition(BaseModel):
123
125
  parameters = ""
124
126
  for arg in self.arguments:
125
127
  # Skip if parameter name matches an object property with non-None value
126
- # This enables automatic property injection during execution:
127
- # When an object has a property matching an argument name,
128
- # the agent will inject the property value at runtime,
129
- # reducing manual input and improving flexibility
130
128
  if properties_injectable.get(arg.name) is not None:
131
129
  continue
132
130
 
@@ -184,6 +182,58 @@ class ToolDefinition(BaseModel):
184
182
  # For ToolDefinition, it returns an empty dict since it has no execution context yet
185
183
  return {}
186
184
 
185
+ def to_docstring(self) -> str:
186
+ """Convert the tool definition into a Google-style docstring with function signature.
187
+
188
+ Returns:
189
+ A string formatted as a valid Python docstring representing the tool's configuration,
190
+ including the function signature and return type.
191
+ """
192
+ # Construct the function signature
193
+ signature_parts = []
194
+ for arg in self.arguments:
195
+ # Base argument: name and type
196
+ arg_str = f"{arg.name}: {arg.arg_type}"
197
+ # Add default value if present
198
+ if arg.default is not None:
199
+ arg_str += f" = {arg.default}"
200
+ signature_parts.append(arg_str)
201
+ signature = f"def {self.name}({', '.join(signature_parts)}) -> {self.return_type}:"
202
+
203
+ # Start with the signature and description
204
+ docstring = f'"""\n{signature}\n\n{self.description}\n\n'
205
+
206
+ # Add Arguments section if there are any
207
+ if self.arguments:
208
+ docstring += "Args:\n"
209
+ for arg in self.arguments:
210
+ # Base argument line: name and type
211
+ arg_line = f" {arg.name} ({arg.arg_type})"
212
+
213
+ # Add optional/required status and default/example if present
214
+ details = []
215
+ if not arg.required:
216
+ details.append("optional")
217
+ if arg.default is not None:
218
+ details.append(f"defaults to {arg.default}")
219
+ if arg.example is not None:
220
+ details.append(f"e.g., {arg.example}")
221
+ if details:
222
+ arg_line += f" [{', '.join(details)}]"
223
+
224
+ # Add description if present
225
+ if arg.description:
226
+ arg_line += f": {arg.description}"
227
+
228
+ docstring += f"{arg_line}\n"
229
+
230
+ # Add Returns section
231
+ docstring += f"Returns:\n {self.return_type}: The result of the tool execution.\n"
232
+
233
+ # Close the docstring
234
+ docstring += '"""'
235
+
236
+ return docstring
187
237
 
188
238
  class Tool(ToolDefinition):
189
239
  """Extended class for tools with execution capabilities.
@@ -261,7 +311,6 @@ class Tool(ToolDefinition):
261
311
  properties = self.get_properties(exclude=["arguments"])
262
312
  return {name: value for name, value in properties.items() if value is not None and name in argument_names}
263
313
 
264
-
265
314
  def create_tool(func: F) -> Tool:
266
315
  """Create a Tool instance from a Python function using AST analysis.
267
316
 
@@ -334,10 +383,14 @@ def create_tool(func: F) -> Tool:
334
383
  example=default if default else None
335
384
  ))
336
385
 
386
+ # Determine return type from type hints
387
+ return_type = type_hints.get("return", str)
388
+ return_type_str = type_map.get(return_type, "string")
389
+
337
390
  # Define Tool subclass
338
391
  class GeneratedTool(Tool):
339
392
  def __init__(self, *args: Any, **kwargs: Any):
340
- super().__init__(*args, name=name, description=description, arguments=arguments, **kwargs)
393
+ super().__init__(*args, name=name, description=description, arguments=arguments, return_type=return_type_str, **kwargs)
341
394
  self._func = func
342
395
 
343
396
  if is_async:
@@ -351,28 +404,48 @@ def create_tool(func: F) -> Tool:
351
404
 
352
405
  return GeneratedTool()
353
406
 
354
-
355
407
  if __name__ == "__main__":
356
- tool = Tool(name="my_tool", description="A simple tool", arguments=[ToolArgument(name="arg1", arg_type="string")])
408
+ # Basic tool with argument
409
+ tool = Tool(
410
+ name="my_tool",
411
+ description="A simple tool",
412
+ arguments=[ToolArgument(name="arg1", arg_type="string")]
413
+ )
414
+ print("Basic Tool Markdown:")
357
415
  print(tool.to_markdown())
416
+ print("Basic Tool Docstring:")
417
+ print(tool.to_docstring())
418
+ print()
358
419
 
420
+ # Tool with injectable field (undefined)
359
421
  class MyTool(Tool):
360
422
  field1: str | None = Field(default=None, description="Field 1 description")
361
423
 
362
424
  tool_with_fields = MyTool(
363
- name="my_tool1", description="A simple tool", arguments=[ToolArgument(name="field1", arg_type="string")]
425
+ name="my_tool1",
426
+ description="A simple tool with a field",
427
+ arguments=[ToolArgument(name="field1", arg_type="string")]
364
428
  )
429
+ print("Tool with Undefined Field Markdown:")
365
430
  print(tool_with_fields.to_markdown())
366
- print(tool_with_fields.get_injectable_properties_in_execution())
431
+ print("Injectable Properties (should be empty):", tool_with_fields.get_injectable_properties_in_execution())
432
+ print("Tool with Undefined Field Docstring:")
433
+ print(tool_with_fields.to_docstring())
434
+ print()
367
435
 
436
+ # Tool with defined injectable field
368
437
  tool_with_fields_defined = MyTool(
369
438
  name="my_tool2",
370
- description="A simple tool2",
439
+ description="A simple tool with a defined field",
371
440
  field1="field1_value",
372
- arguments=[ToolArgument(name="field1", arg_type="string")],
441
+ arguments=[ToolArgument(name="field1", arg_type="string")]
373
442
  )
443
+ print("Tool with Defined Field Markdown:")
374
444
  print(tool_with_fields_defined.to_markdown())
375
- print(tool_with_fields_defined.get_injectable_properties_in_execution())
445
+ print("Injectable Properties (should include field1):", tool_with_fields_defined.get_injectable_properties_in_execution())
446
+ print("Tool with Defined Field Docstring:")
447
+ print(tool_with_fields_defined.to_docstring())
448
+ print()
376
449
 
377
450
  # Test create_tool with synchronous function
378
451
  def add(a: int, b: int = 0) -> int:
@@ -384,6 +457,14 @@ if __name__ == "__main__":
384
457
  """
385
458
  return a + b
386
459
 
460
+ sync_tool = create_tool(add)
461
+ print("Synchronous Tool Markdown:")
462
+ print(sync_tool.to_markdown())
463
+ print("Synchronous Tool Docstring:")
464
+ print(sync_tool.to_docstring())
465
+ print("Execution result:", sync_tool.execute(a=5, b=3))
466
+ print()
467
+
387
468
  # Test create_tool with asynchronous function
388
469
  async def greet(name: str) -> str:
389
470
  """Greet a person.
@@ -394,13 +475,26 @@ if __name__ == "__main__":
394
475
  await asyncio.sleep(0.1) # Simulate async work
395
476
  return f"Hello, {name}"
396
477
 
397
- # Create and test tools
398
- sync_tool = create_tool(add)
399
- print("\nSynchronous Tool:")
400
- print(sync_tool.to_markdown())
401
- print("Execution result:", sync_tool.execute(a=5, b=3))
402
-
403
478
  async_tool = create_tool(greet)
404
- print("\nAsynchronous Tool:")
479
+ print("Asynchronous Tool Markdown:")
405
480
  print(async_tool.to_markdown())
406
- print("Execution result:", asyncio.run(async_tool.async_execute(name="Alice")))
481
+ print("Asynchronous Tool Docstring:")
482
+ print(async_tool.to_docstring())
483
+ print("Execution result:", asyncio.run(async_tool.async_execute(name="Alice")))
484
+ print()
485
+
486
+ # Comprehensive tool for to_docstring demonstration with custom return type
487
+ docstring_tool = Tool(
488
+ name="sample_tool",
489
+ description="A sample tool for testing docstring generation.",
490
+ arguments=[
491
+ ToolArgument(name="x", arg_type="int", description="The first number", required=True),
492
+ ToolArgument(name="y", arg_type="float", description="The second number", default="0.0", example="1.5"),
493
+ ToolArgument(name="verbose", arg_type="boolean", description="Print extra info", default="False")
494
+ ],
495
+ return_type="int" # Custom return type
496
+ )
497
+ print("Comprehensive Tool Markdown:")
498
+ print(docstring_tool.to_markdown())
499
+ print("Comprehensive Tool Docstring with Custom Return Type:")
500
+ print(docstring_tool.to_docstring())
@@ -1,4 +1,4 @@
1
- from datetime import UTC, datetime
1
+ from datetime import timezone, datetime # noqa: I001
2
2
  from typing import Dict, List
3
3
 
4
4
  import networkx as nx
@@ -127,7 +127,7 @@ def generate_markdown_report(
127
127
  md.append(f"**Database Type**: {db_metadata['dialect'].capitalize()}\n")
128
128
  md.append(f"**Database Name**: {db_metadata['name']}\n")
129
129
  md.append(f"**Total Tables**: {len(db_metadata['tables'])}\n")
130
- md.append(f"**Generated At**: {datetime.now(UTC).strftime('%Y-%m-%d %H:%M:%S UTC')}\n\n")
130
+ md.append(f"**Generated At**: {datetime.now(timezone.utc).strftime('%Y-%m-%d %H:%M:%S UTC')}\n\n")
131
131
 
132
132
  # ERD Section
133
133
  md.append("## Entity Relationship Diagram\n")
@@ -6,7 +6,6 @@ from .get_environment import get_environment
6
6
  from .get_coding_environment import get_coding_environment
7
7
  from .get_quantalogic_rules_content import get_quantalogic_rules_file_content
8
8
  from .lm_studio_model_info import get_model_list
9
- from .python_interpreter import interpret_ast
10
9
 
11
10
  __all__ = [
12
11
  "download_http_file",
@@ -0,0 +1,119 @@
1
+ import asyncio
2
+
3
+ from quantalogic.python_interpreter import AsyncExecutionResult, execute_async
4
+
5
+
6
+ async def test_square_calculation() -> None:
7
+ """Test the square calculation using execute_async with entry_point."""
8
+ # Python code as a string that defines multiple functions
9
+ square_code = """
10
+ def calculate_square(x):
11
+ return x * x
12
+
13
+ async def async_square(x, delay=0.1):
14
+ await asyncio.sleep(delay)
15
+ return x * x
16
+ """
17
+
18
+ # Test synchronous function with entry_point
19
+ sync_result = await execute_async(
20
+ code=square_code,
21
+ entry_point="calculate_square",
22
+ args=(5,),
23
+ timeout=5.0,
24
+ allowed_modules=['asyncio']
25
+ )
26
+ print("Synchronous Square Test:")
27
+ print_execution_result(sync_result)
28
+
29
+ # Test asynchronous function with entry_point
30
+ async_result = await execute_async(
31
+ code=square_code,
32
+ entry_point="async_square",
33
+ args=(5,),
34
+ kwargs={"delay": 0.2},
35
+ timeout=5.0,
36
+ allowed_modules=['asyncio']
37
+ )
38
+ print("Asynchronous Square Test:")
39
+ print_execution_result(async_result)
40
+
41
+
42
+ async def test_arithmetic_operations() -> None:
43
+ """Test arithmetic operations with multiple arguments."""
44
+ # Python code with a function taking multiple arguments
45
+ arithmetic_code = """
46
+ def add_and_multiply(a, b, c=2):
47
+ return (a + b) * c
48
+
49
+ async def async_add_and_multiply(a, b, c=2, delay=0.1):
50
+ await asyncio.sleep(delay)
51
+ return (a + b) * c
52
+ """
53
+
54
+ # Test synchronous function
55
+ sync_result = await execute_async(
56
+ code=arithmetic_code,
57
+ entry_point="add_and_multiply",
58
+ args=(3, 4),
59
+ kwargs={"c": 5},
60
+ timeout=5.0,
61
+ allowed_modules=['asyncio']
62
+ )
63
+ print("Synchronous Add and Multiply Test:")
64
+ print_execution_result(sync_result)
65
+
66
+ # Test asynchronous function
67
+ async_result = await execute_async(
68
+ code=arithmetic_code,
69
+ entry_point="async_add_and_multiply",
70
+ args=(3, 4),
71
+ kwargs={"c": 5, "delay": 0.15},
72
+ timeout=5.0,
73
+ allowed_modules=['asyncio']
74
+ )
75
+ print("Asynchronous Add and Multiply Test:")
76
+ print_execution_result(async_result)
77
+
78
+
79
+ async def test_module_execution() -> None:
80
+ """Test execution of the entire module without an entry_point."""
81
+ # Python code that runs top-level statements
82
+ module_code = """
83
+ x = 1 + 2
84
+ y = x * 3
85
+ result = y
86
+ """
87
+
88
+ # Execute without specifying an entry_point
89
+ result = await execute_async(
90
+ code=module_code,
91
+ timeout=5.0,
92
+ allowed_modules=['asyncio']
93
+ )
94
+ print("Module Execution Test (no entry_point):")
95
+ print_execution_result(result)
96
+
97
+
98
+ def print_execution_result(result: AsyncExecutionResult) -> None:
99
+ """Print detailed information about an execution result."""
100
+ print("===== Execution Result =====")
101
+ if result.error:
102
+ print(f"❌ Error: {result.error}")
103
+ else:
104
+ print("✅ Execution successful!")
105
+ print(f"Result type: {type(result.result).__name__}")
106
+ print(f"Result value: {result.result}")
107
+ print(f"Execution time: {result.execution_time:.4f} seconds")
108
+ print("============================")
109
+
110
+
111
+ async def main() -> None:
112
+ """Run all tests."""
113
+ await test_square_calculation()
114
+ await test_arithmetic_operations()
115
+ await test_module_execution()
116
+
117
+
118
+ if __name__ == '__main__':
119
+ asyncio.run(main())
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: quantalogic
3
- Version: 0.60.0
3
+ Version: 0.61.1
4
4
  Summary: QuantaLogic ReAct Agents
5
5
  Author: Raphaël MANSUY
6
6
  Author-email: raphael.mansuy@gmail.com
@@ -10,7 +10,10 @@ Classifier: Programming Language :: Python :: 3.10
10
10
  Classifier: Programming Language :: Python :: 3.11
11
11
  Classifier: Programming Language :: Python :: 3.12
12
12
  Classifier: Programming Language :: Python :: 3.13
13
+ Requires-Dist: aiofiles (>=24.1.0,<25.0.0)
13
14
  Requires-Dist: beautifulsoup4 (>=4.12.3,<5.0.0)
15
+ Requires-Dist: boto3 (>=1.34.0,<2.0.0)
16
+ Requires-Dist: botocore (>=1.29.123,<2.0.0)
14
17
  Requires-Dist: click (>=8.1.8,<9.0.0)
15
18
  Requires-Dist: duckduckgo-search (>=7.2.1,<8.0.0)
16
19
  Requires-Dist: faker (>=36.1.1,<37.0.0)
@@ -19,14 +22,17 @@ Requires-Dist: google-search-results (>=2.4.2,<3.0.0)
19
22
  Requires-Dist: html2text (>=2024.2.26,<2025.0.0)
20
23
  Requires-Dist: instructor (>=1.7.2,<2.0.0)
21
24
  Requires-Dist: jinja2 (>=3.1.5,<4.0.0)
22
- Requires-Dist: litellm (>=1.56.4,<2.0.0)
25
+ Requires-Dist: litellm (>=1.59.0,<2.0.0)
23
26
  Requires-Dist: loguru (>=0.7.3,<0.8.0)
24
27
  Requires-Dist: markdownify (>=0.14.1,<0.15.0)
25
28
  Requires-Dist: markitdown (>=0.0.1a3,<0.0.2)
26
29
  Requires-Dist: networkx (>=3.2.1,<4.0.0)
30
+ Requires-Dist: openai (>=1.68.0,<2.0.0)
27
31
  Requires-Dist: pathspec (>=0.12.1,<0.13.0)
28
32
  Requires-Dist: prompt-toolkit (>=3.0.48,<4.0.0)
33
+ Requires-Dist: psutil (>=7.0.0,<8.0.0)
29
34
  Requires-Dist: pydantic (>=2.10.4,<3.0.0)
35
+ Requires-Dist: pytest-asyncio (>=0.25.3,<0.26.0)
30
36
  Requires-Dist: python-dotenv (>=1.0.1,<2.0.0)
31
37
  Requires-Dist: requests (>=2.32.3,<3.0.0)
32
38
  Requires-Dist: rich (>=13.9.4,<14.0.0)
@@ -1,8 +1,20 @@
1
1
  quantalogic/__init__.py,sha256=qFbvfHOd_chAu536pH816E3uo6CdyAgXCpQOwMXXVnY,1076
2
2
  quantalogic/agent.py,sha256=VChZXFLEsIIrBtXVQZ-FGZ72GCUXDL3g9br8Vo1t5V8,75072
3
- quantalogic/agent_config.py,sha256=fPyMfm77BzimyfyFkTzb2ZdyZtGlr2fq5aTRETu77Vs,8202
4
- quantalogic/agent_factory.py,sha256=NrgN7cSppmwh7QkP4Tak9f9TmRZAoAOUbRb3_bUgGq8,6870
5
- quantalogic/coding_agent.py,sha256=A-firiPWQjMC56B329Ne606_v2GsoF5-nxcuz3rVbYM,5496
3
+ quantalogic/agent_config.py,sha256=65dvgJ1rwC0eEysMtTv_Dsjln4WS0IvAIcn6r39Zq4k,8222
4
+ quantalogic/agent_factory.py,sha256=soActorasOqs5g6NmlyeEjRYbJceIGGg7wuUS-vA898,6878
5
+ quantalogic/codeact/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ quantalogic/codeact/agent.py,sha256=oajib7OsfBp230sg_IjmknqYsFz_lSURC39fj5brsP4,22454
7
+ quantalogic/codeact/cli.py,sha256=FBqnqPUobq6ySuTL9oTLyXSenHC6V7wsCWAbNDK_xec,10810
8
+ quantalogic/codeact/constants.py,sha256=_xJ2QwP5wUE9vwSDm0JTSMC4GVjXAaxHTwcZBjDCoKk,244
9
+ quantalogic/codeact/events.py,sha256=4itxGsz54Te9vim13JC8QhacnLQ8cqtOOIyOWUrKFi0,1530
10
+ quantalogic/codeact/llm_util.py,sha256=9HqN0prWyAgdt6FYtdzjWoIoPpDavHQ7EIIfJr2Fi8w,2749
11
+ quantalogic/codeact/prompts/error_format.j2,sha256=_8fNWxDr3U1Fq8SdzwRIBNsNG1WvPL9IAaos9Enf1C0,258
12
+ quantalogic/codeact/prompts/generate_action.j2,sha256=v0LXFxz6L2EwIPesu_mYSVqyNctjHOCIfdawHCb2rtc,1289
13
+ quantalogic/codeact/prompts/generate_program.j2,sha256=05_1bAwIJLLBKt4o9c7sRWLHIoiHPyGl9OquieMZT5g,2048
14
+ quantalogic/codeact/prompts/response_format.j2,sha256=TwO43dEG-3justNigpX4yyzGR1TGS3YDlpJQq8Z5Vf4,355
15
+ quantalogic/codeact/tools_manager.py,sha256=l2cpHLuQP-MW0uP8d2e6IdMToeveaIOdilwDGPjPciY,4464
16
+ quantalogic/codeact/utils.py,sha256=B7Xowk4id6Sgoyl0eBJsi6JiKa-BAwnj0a5z70vrV1M,5308
17
+ quantalogic/coding_agent.py,sha256=i4QYY1Q7AXfJFCVfrowxukH33nuqByUOX6bt-hAcGDE,5504
6
18
  quantalogic/config.py,sha256=bmPI2rvQ9M8Zdl1H7K588JgJdnkxSE0L5_i5aBqsagA,564
7
19
  quantalogic/console_print_events.py,sha256=yDtfOr7s5r_gLTgwkl_XoKSkUqNRZhqqq4hwR_oJsUw,2050
8
20
  quantalogic/console_print_token.py,sha256=5IRVoPhwWZtSc4LpNoAsCQhCB_RnAW9chycGgyD3_5U,437
@@ -45,6 +57,25 @@ quantalogic/prompts/task_summary_prompt.j2,sha256=fcjV96nqi6jsfR8l6uyep20rCaOi-z
45
57
  quantalogic/prompts/tools_prompt.j2,sha256=ZjvTAZtAk-FmzDb1QuyDJg1hzo-FqayQ7wN_ytHAi2s,385
46
58
  quantalogic/prompts/variables_prompt.j2,sha256=N3OsMbzy3PfEUqYZVF_34wVidhh2ghVToSgdRCv2qgM,231
47
59
  quantalogic/prompts.py,sha256=zqmyosq4hdYpzHI-FG0m5CKV2wQnjgyMJf6Vo1ZaLW4,1982
60
+ quantalogic/python_interpreter/__init__.py,sha256=cNYxH9jy5QEAPZo44zmJzy3Kci14e0lL2h20Cbrs7RQ,675
61
+ quantalogic/python_interpreter/assignment_visitors.py,sha256=t6ttdYuwjcz8VtqJS5vMaaUUG6GbEhoNmnNDUj8dZiI,2771
62
+ quantalogic/python_interpreter/base_visitors.py,sha256=aD1pc3DbdlPdjQ3yJTYhBqNpN6tant7NOHXShts8coo,765
63
+ quantalogic/python_interpreter/class_visitors.py,sha256=FUgBVg_TmpAdLdLlYlPnruSm8iViijW3gTBQveJjkpI,862
64
+ quantalogic/python_interpreter/comprehension_visitors.py,sha256=AdPn047QUeoG5D1VD4wU2JuXS2KBTwLOIGbApmx9s7A,8468
65
+ quantalogic/python_interpreter/context_visitors.py,sha256=_4-Xfk0wzsla2rSIJZYEyYK4yIK7yRZWX6-HNBFSWTs,2137
66
+ quantalogic/python_interpreter/control_flow_visitors.py,sha256=trJ0Led1pPWKyseQF7BbIF5LFopkOiRDSVHz9Hi7-hI,3662
67
+ quantalogic/python_interpreter/exception_visitors.py,sha256=dbRuk2CaEZN-tYrzcRxZQh_UdLfpcW7wwrG8iQoGeE8,4571
68
+ quantalogic/python_interpreter/exceptions.py,sha256=mL4G9a0PZrvW_hAjkweMohvN8ryZsZOiIOolZUDSq9Y,1296
69
+ quantalogic/python_interpreter/execution.py,sha256=bggzv-GMnFe0Pkt00T4IlPUnDMsuqcHO1Qo0Wq6rEbs,8420
70
+ quantalogic/python_interpreter/function_utils.py,sha256=1LCEqCDt0p0uBTeC6rcre84r_j06jc6HuWLZ5Fc8m8M,18133
71
+ quantalogic/python_interpreter/function_visitors.py,sha256=WcGBWXZ_A7vekkrejL2XTuVPyqsKymK4svJr6-kR-OI,11317
72
+ quantalogic/python_interpreter/import_visitors.py,sha256=AgqFM8SO1wuJluDRsDGBwm-FQ5K374pQrXgbXXEBgPI,1331
73
+ quantalogic/python_interpreter/interpreter_core.py,sha256=PV_XFx0xhUG9ACvhz3FGat2FSaXK3C031HjRizHbox0,16646
74
+ quantalogic/python_interpreter/literal_visitors.py,sha256=TX9-02rn093OFTDvKkhp0PbTsXqIU1voBfbxs-TXfu0,3715
75
+ quantalogic/python_interpreter/misc_visitors.py,sha256=_olOaGD04icqKDqeEFUPIY5Nq0cH5pdGkq-8T6xbilM,6758
76
+ quantalogic/python_interpreter/operator_visitors.py,sha256=WTf4EfwE88lMoTKjuL8UBNpbwJ8Z6DTdrwvVffVw-Ic,4048
77
+ quantalogic/python_interpreter/scope.py,sha256=HSSbtDAMeDbE5LjSckTHvFlhcOUGv8UzxpI4NgUbp5U,257
78
+ quantalogic/python_interpreter/visit_handlers.py,sha256=dGh7BxwGArnBnmwxVzpV6l_uXQ5J6esUm2xKtXne30M,2610
48
79
  quantalogic/quantlitellm.py,sha256=nf-awyOxP0ANoAPGHNvHfdLu8gNn65L39gl7x4saIQc,5550
49
80
  quantalogic/search_agent.py,sha256=tr0cwscJ4wu_G1aumjFyvGHQ0eQv5OL5sxj17s6Ocls,2470
50
81
  quantalogic/server/__init__.py,sha256=8sz_PYAUCrkM6JM5EAUeIzNM4NPW6j6UT72JVkc21WQ,91
@@ -58,7 +89,8 @@ quantalogic/server/templates/index.html,sha256=nDnXJoQEm1vXbhXtgaYk0G5VXj0wwzE6K
58
89
  quantalogic/task_file_reader.py,sha256=oPcB4vTxJ__Y8o7VVABIPOkVw3tGDMdQYwdK27PERlE,1440
59
90
  quantalogic/task_runner.py,sha256=NB7TqNuwCstCAsTkjGcJSQRapNk8-iXe7d_2qf-fs1s,15815
60
91
  quantalogic/tool_manager.py,sha256=vNA7aBKgdU3wpw_goom6i9rg_64pNZapNxvg4cUhhCI,6983
61
- quantalogic/tools/__init__.py,sha256=5OAPYyER-a6KSk4WAIsQ7-1ze6KErfq-gZhxyAKR4_s,2344
92
+ quantalogic/tools/__init__.py,sha256=NU_M6VYYaAbSUtb2Qdu1lsYaDh0G3f_8jnrZTsBD0eY,2390
93
+ quantalogic/tools/action_gen.py,sha256=M16voPq7tMR1qiCKTaZAusmVchFbBIluuBbLQH9kEG4,15580
62
94
  quantalogic/tools/agent_tool.py,sha256=MXCXxWHRch7VK4UWhtRP1jeI8Np9Ne2CUGo8vm1oZiM,3064
63
95
  quantalogic/tools/composio/__init__.py,sha256=Yo9ygNx0qQILVhIfRgqpO8fgnCgp5WoZMd3Hm5D20GY,429
64
96
  quantalogic/tools/composio/composio.py,sha256=icVHA_Scr1pViBhahGGBGBRBl9JSB3hGSqpgQzAIUH8,17627
@@ -125,7 +157,7 @@ quantalogic/tools/presentation_tools/presentation_llm_tool.py,sha256=5fuUDE1IzeA
125
157
  quantalogic/tools/product_hunt/__init__.py,sha256=v729REf13ioQNg4SH6ZTkAMo5TfgAawcUEIz1sKwIcA,446
126
158
  quantalogic/tools/product_hunt/product_hunt_tool.py,sha256=vtjnV6v46BcNYlxudUCq5JIkjznQFUt8Kx9VD4KEPa8,8533
127
159
  quantalogic/tools/product_hunt/services.py,sha256=ym10ZW4q8w03wIkZDnwl9d_nCoOz2WAj3N6C0qY0dfI,2280
128
- quantalogic/tools/python_tool.py,sha256=70HLbfU2clOBgj4axDOtIKzXwEBMNGEAX1nGSf-KNNQ,18156
160
+ quantalogic/tools/python_tool.py,sha256=ae-OeXOafGoRVUp1leBhRgz2fVt0Q-WVcjlVQO60tlE,18619
129
161
  quantalogic/tools/rag_tool/__init__.py,sha256=OzQ7_MxMvHupkt-1XAm5hAK8Saz2u2LxEH_v0k6yJSA,406
130
162
  quantalogic/tools/rag_tool/document_rag_sources_.py,sha256=WYtiAZA0P546pBYtz0pCmN8SizsUA7PIrp9dKKp7naw,28575
131
163
  quantalogic/tools/rag_tool/ocr_pdf_markdown.py,sha256=SqHvAWToSM0nLLLor5jVElPC6dBm94_ihio-Z-Q2WTI,5479
@@ -135,13 +167,13 @@ quantalogic/tools/read_html_tool.py,sha256=KmXTeSrQZj0L-OAwl3xZQybdAhhyAeK3wgblh
135
167
  quantalogic/tools/replace_in_file_tool.py,sha256=gux6uCXk4gvIMynw7NMAGPvdWKuSIc9JWTWZyuR5OgQ,13853
136
168
  quantalogic/tools/ripgrep_tool.py,sha256=sRzHaWac9fa0cCGhECJN04jw_Ko0O3u45KDWzMIYcvY,14291
137
169
  quantalogic/tools/safe_python_interpreter_tool.py,sha256=eqwI0sHNt4mTvd8witCc0cecydKJNXNN3HNFfr4sCkI,8036
138
- quantalogic/tools/search_definition_names.py,sha256=zqtaqq8aS5jdDQOkbd4wMUPFyL6Bq-4q9NWyLKdXL1E,18771
170
+ quantalogic/tools/search_definition_names_tool.py,sha256=uoQC7oXNNmesxYAll5TXx9HckYHgHCp3BVjo1KvWidQ,18779
139
171
  quantalogic/tools/sequence_tool.py,sha256=Hb2FSjWWACvXZX7rmJXPk5lnnnqaDeRTbhQQRtCd8hI,11169
140
172
  quantalogic/tools/serpapi_search_tool.py,sha256=sX-Noch77kGP2XiwislPNFyy3_4TH6TwMK6C81L3q9Y,5316
141
173
  quantalogic/tools/sql_query_tool.py,sha256=jEDZLlxOsB2bzsWlEqsqvTKiyovnRuk0XvgtwW7-WSQ,6055
142
174
  quantalogic/tools/task_complete_tool.py,sha256=L8tuyVoN07Q2hOsxx17JTW0C5Jd_N-C0i_0PtCUQUKU,929
143
175
  quantalogic/tools/terminal_capture_tool.py,sha256=I3Ik9JSgHUPb5eV7ArZv9PISofkWWLh_7fCqX4RJRAg,10567
144
- quantalogic/tools/tool.py,sha256=I0eTKf45andzQOcQ-6Bh4xB5aympbhwfhhUGGLyRmbU,15802
176
+ quantalogic/tools/tool.py,sha256=q94f1b5k44taJTckTJegTRkP_QNN4YB6xhz_0TExvWU,19731
145
177
  quantalogic/tools/unified_diff_tool.py,sha256=o7OiYnCM5MjbPlQTpB2OmkMQRI9zjdToQmgVkhiTvOI,14148
146
178
  quantalogic/tools/utilities/__init__.py,sha256=cOsQLYzJDnTY7mUjYaMSF_jmb5kez34MQc9xCWxm2NE,733
147
179
  quantalogic/tools/utilities/csv_processor_tool.py,sha256=Mu_EPVj6iYAclNaVX_vbkekxcNwPYwy7dW1SCY22EwY,9023
@@ -152,12 +184,12 @@ quantalogic/tools/utilities/selenium_tool.py,sha256=UrfQSF62UoADPuRPqP8x9_jIL6Yy
152
184
  quantalogic/tools/utilities/vscode_tool.py,sha256=M248_464I3FWHuvrTVPbrF6czXe0n45_o315TFRD-6U,4363
153
185
  quantalogic/tools/utils/__init__.py,sha256=-NtMSwxRt_G79Oo_DcDaCdLU2vLvuXIoCd34TOYEUmI,334
154
186
  quantalogic/tools/utils/create_sample_database.py,sha256=h5c_uxv3eztQvHlloTZxzWt5gEzai8zfnR8-_QrUqxU,3724
155
- quantalogic/tools/utils/generate_database_report.py,sha256=3PT34ClMvZ2O62-24cp_5lOyZHY_pBjVObMHpfyVi-s,10140
187
+ quantalogic/tools/utils/generate_database_report.py,sha256=IU_XGTDNXfJXxzpHR1F4cAV5ggmiTs2hj-WyfWRe9Tk,10168
156
188
  quantalogic/tools/web_navigation/__init__.py,sha256=O7SkVqbGwN4zt8Sm3H8AHF9451FSgI5h0J3fDj1rFS4,142
157
189
  quantalogic/tools/web_navigation/web_tool.py,sha256=AxAxQLUNwCElqxP2ceOOjHVY80ck-Md-uNsjHdR9ErA,4721
158
190
  quantalogic/tools/wikipedia_search_tool.py,sha256=LXQSPH8961Efw2QNxKe-cD5ZiIYD3ufEgrxH4y5uB74,5180
159
191
  quantalogic/tools/write_file_tool.py,sha256=qyRhDwE77rakRb_CuAC00V0E2vqIRNxwKD4PHLGgyW8,5230
160
- quantalogic/utils/__init__.py,sha256=hsS3hXH5lsBQcZh2QBANY1Af2Zs1jtrgxA7kXJEWi58,680
192
+ quantalogic/utils/__init__.py,sha256=E442CJQuTohKzgI0Wrd4NZEpKascFjz6F4Vy8Y1c_0Y,634
161
193
  quantalogic/utils/ask_user_validation.py,sha256=kSr7TXPTpsLR9zgwpGWgvffx8-cKAC_rdFRdLqwC22A,1176
162
194
  quantalogic/utils/async_utils.py,sha256=FOizWRbHdsZwoD36dNErzunfwPlE7zDprS6RXcWuWSo,963
163
195
  quantalogic/utils/check_version.py,sha256=aDTEvIn5XNNBIQ0tVOqcY3hcoznRmpsnNuwES6je1MQ,1133
@@ -168,17 +200,17 @@ quantalogic/utils/get_environment.py,sha256=7wWruSHYTUlnQWW27qU3WFYZnncqqqdofsxA
168
200
  quantalogic/utils/get_quantalogic_rules_content.py,sha256=fnEFTyClXzpI0MLaM-gB9R6l4CJlu2NnaYiR09ciJC8,673
169
201
  quantalogic/utils/git_ls.py,sha256=hJLAoFyx1MgaFJKu6ZO7NEA5xvvqIcpfJ2g9DFCPR5c,5776
170
202
  quantalogic/utils/lm_studio_model_info.py,sha256=74LrRljuVAIzgFHqO-l9jRuawx8nu3UdDeGoO_bLJwI,1792
171
- quantalogic/utils/python_interpreter.py,sha256=H08GpYQshcob_W7e8GmgdKYFAbBhWAR6pGR83tviOM4,36430
172
203
  quantalogic/utils/read_file.py,sha256=tSRVHk8dIP4nNLL89v5kRki4hOTjVyjbmuEb2zwvwCY,2077
173
204
  quantalogic/utils/read_http_text_content.py,sha256=n3IayT5KcqctIVVF2gOQQAMf3Ow6eenlVgfXTpLcQbw,4410
205
+ quantalogic/utils/test_python_interpreter.py,sha256=Mw3dB11AGCqU8Ff70mg1M91l2TrC6z4fHvno74FkyOA,3393
174
206
  quantalogic/utils/xml_utility.py,sha256=gLB0vpbpxbfc297Fy37Zd3O_-sbt6DoRUZrSkhPq4FU,5345
175
207
  quantalogic/version.py,sha256=ea_cRutaQk5_lwlLbUUvPFuOT7Of7-gAsDl7wdveS-g,107
176
208
  quantalogic/version_check.py,sha256=JyQFTNMDWtpHCLnN-BiakzB2cyXf6kUFsTjvmSruZi4,1623
177
209
  quantalogic/welcome_message.py,sha256=o4tHdgabNuIV9kbIDPgS3_2yzJhayK30oKad2UouYDc,3020
178
210
  quantalogic/xml_parser.py,sha256=bLLwIwO-VEHWF3heNS7nuPC8wgdYw9F_fVZZNW1figY,11728
179
211
  quantalogic/xml_tool_parser.py,sha256=hGHA1q20JUoTNTbZYmi4FTdA5I25-AGEIP8DwZgQCNA,3897
180
- quantalogic-0.60.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
181
- quantalogic-0.60.0.dist-info/METADATA,sha256=vAoFMMiPBk9bTKcDLMU1zBpM9a4gj-sKof24Ngo6SLo,32744
182
- quantalogic-0.60.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
183
- quantalogic-0.60.0.dist-info/entry_points.txt,sha256=h74O_Q3qBRCrDR99qvwB4BpBGzASPUIjCfxHq6Qnups,183
184
- quantalogic-0.60.0.dist-info/RECORD,,
212
+ quantalogic-0.61.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
213
+ quantalogic-0.61.1.dist-info/METADATA,sha256=k40t7hc00o09Fz4lEn4bqdk4XIOQRKIrRg6Jg3U0QoU,32998
214
+ quantalogic-0.61.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
215
+ quantalogic-0.61.1.dist-info/entry_points.txt,sha256=h74O_Q3qBRCrDR99qvwB4BpBGzASPUIjCfxHq6Qnups,183
216
+ quantalogic-0.61.1.dist-info/RECORD,,