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.
- quantalogic/agent_config.py +5 -5
- quantalogic/agent_factory.py +2 -2
- quantalogic/codeact/__init__.py +0 -0
- quantalogic/codeact/agent.py +499 -0
- quantalogic/codeact/cli.py +232 -0
- quantalogic/codeact/constants.py +9 -0
- quantalogic/codeact/events.py +78 -0
- quantalogic/codeact/llm_util.py +76 -0
- quantalogic/codeact/prompts/error_format.j2 +11 -0
- quantalogic/codeact/prompts/generate_action.j2 +26 -0
- quantalogic/codeact/prompts/generate_program.j2 +39 -0
- quantalogic/codeact/prompts/response_format.j2 +11 -0
- quantalogic/codeact/tools_manager.py +135 -0
- quantalogic/codeact/utils.py +135 -0
- quantalogic/coding_agent.py +2 -2
- quantalogic/python_interpreter/__init__.py +23 -0
- quantalogic/python_interpreter/assignment_visitors.py +63 -0
- quantalogic/python_interpreter/base_visitors.py +20 -0
- quantalogic/python_interpreter/class_visitors.py +22 -0
- quantalogic/python_interpreter/comprehension_visitors.py +172 -0
- quantalogic/python_interpreter/context_visitors.py +59 -0
- quantalogic/python_interpreter/control_flow_visitors.py +88 -0
- quantalogic/python_interpreter/exception_visitors.py +109 -0
- quantalogic/python_interpreter/exceptions.py +39 -0
- quantalogic/python_interpreter/execution.py +202 -0
- quantalogic/python_interpreter/function_utils.py +386 -0
- quantalogic/python_interpreter/function_visitors.py +209 -0
- quantalogic/python_interpreter/import_visitors.py +28 -0
- quantalogic/python_interpreter/interpreter_core.py +358 -0
- quantalogic/python_interpreter/literal_visitors.py +74 -0
- quantalogic/python_interpreter/misc_visitors.py +148 -0
- quantalogic/python_interpreter/operator_visitors.py +108 -0
- quantalogic/python_interpreter/scope.py +10 -0
- quantalogic/python_interpreter/visit_handlers.py +110 -0
- quantalogic/tools/__init__.py +5 -4
- quantalogic/tools/action_gen.py +366 -0
- quantalogic/tools/python_tool.py +13 -0
- quantalogic/tools/{search_definition_names.py → search_definition_names_tool.py} +2 -2
- quantalogic/tools/tool.py +116 -22
- quantalogic/tools/utils/generate_database_report.py +2 -2
- quantalogic/utils/__init__.py +0 -1
- quantalogic/utils/test_python_interpreter.py +119 -0
- {quantalogic-0.60.0.dist-info → quantalogic-0.61.1.dist-info}/METADATA +8 -2
- {quantalogic-0.60.0.dist-info → quantalogic-0.61.1.dist-info}/RECORD +47 -15
- quantalogic/utils/python_interpreter.py +0 -905
- {quantalogic-0.60.0.dist-info → quantalogic-0.61.1.dist-info}/LICENSE +0 -0
- {quantalogic-0.60.0.dist-info → quantalogic-0.61.1.dist-info}/WHEEL +0 -0
- {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
|
-
|
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",
|
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
|
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("
|
479
|
+
print("Asynchronous Tool Markdown:")
|
405
480
|
print(async_tool.to_markdown())
|
406
|
-
print("
|
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
|
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(
|
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")
|
quantalogic/utils/__init__.py
CHANGED
@@ -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.
|
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.
|
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=
|
4
|
-
quantalogic/agent_factory.py,sha256=
|
5
|
-
quantalogic/
|
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=
|
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=
|
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/
|
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=
|
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=
|
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=
|
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.
|
181
|
-
quantalogic-0.
|
182
|
-
quantalogic-0.
|
183
|
-
quantalogic-0.
|
184
|
-
quantalogic-0.
|
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,,
|