quantalogic 0.2.16__py3-none-any.whl → 0.2.17__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/__init__.py +3 -2
- quantalogic/agent.py +57 -36
- quantalogic/agent_config.py +18 -13
- quantalogic/coding_agent.py +6 -2
- quantalogic/{print_event.py → console_print_events.py} +1 -3
- quantalogic/console_print_token.py +16 -0
- quantalogic/docs_cli.py +50 -0
- quantalogic/generative_model.py +80 -77
- quantalogic/main.py +81 -15
- quantalogic/server/agent_server.py +2 -2
- quantalogic/tools/llm_tool.py +52 -11
- quantalogic/tools/llm_vision_tool.py +23 -7
- quantalogic/xml_parser.py +109 -49
- {quantalogic-0.2.16.dist-info → quantalogic-0.2.17.dist-info}/METADATA +18 -147
- {quantalogic-0.2.16.dist-info → quantalogic-0.2.17.dist-info}/RECORD +18 -16
- quantalogic-0.2.17.dist-info/entry_points.txt +6 -0
- quantalogic-0.2.16.dist-info/entry_points.txt +0 -3
- {quantalogic-0.2.16.dist-info → quantalogic-0.2.17.dist-info}/LICENSE +0 -0
- {quantalogic-0.2.16.dist-info → quantalogic-0.2.17.dist-info}/WHEEL +0 -0
quantalogic/xml_parser.py
CHANGED
@@ -7,6 +7,7 @@ with support for handling malformed XML and CDATA sections.
|
|
7
7
|
import html
|
8
8
|
import re
|
9
9
|
from collections import defaultdict
|
10
|
+
from functools import lru_cache
|
10
11
|
from typing import Self
|
11
12
|
|
12
13
|
from loguru import logger
|
@@ -51,15 +52,38 @@ class ToleranceXMLParser:
|
|
51
52
|
edge cases such as incomplete tags and CDATA sections.
|
52
53
|
"""
|
53
54
|
|
55
|
+
# Default mappings for element name normalization
|
56
|
+
DEFAULT_NAME_MAP = {
|
57
|
+
"o": "output",
|
58
|
+
"i": "input",
|
59
|
+
"opt": "optional"
|
60
|
+
}
|
61
|
+
|
54
62
|
def __init__(self: Self) -> None:
|
55
63
|
"""Initialize the parser with regex patterns for matching XML-like elements."""
|
56
|
-
# Pattern for matching individual XML elements
|
57
|
-
|
58
|
-
|
64
|
+
# Pattern for matching individual XML elements with better whitespace handling
|
65
|
+
self.element_pattern = re.compile(
|
66
|
+
r"<\s*([^/>]+?)\s*>(.*?)(?:</\s*\1\s*>|<\s*\1\s*>)",
|
67
|
+
re.DOTALL
|
68
|
+
)
|
59
69
|
# Pattern for matching CDATA sections
|
60
70
|
self.cdata_pattern = re.compile(r"<!\[CDATA\[(.*?)]]>", re.DOTALL)
|
61
71
|
logger.debug("Initialized ToleranceXMLParser with regex patterns")
|
62
72
|
|
73
|
+
def _validate_input(self, text: str) -> None:
|
74
|
+
"""Validate input text before processing.
|
75
|
+
|
76
|
+
Args:
|
77
|
+
text: Input text to validate.
|
78
|
+
|
79
|
+
Raises:
|
80
|
+
ValueError: If input text is invalid.
|
81
|
+
"""
|
82
|
+
if not text or not isinstance(text, str):
|
83
|
+
raise ValueError("Input text must be a non-empty string")
|
84
|
+
if len(text.strip()) == 0:
|
85
|
+
raise ValueError("Input text cannot be whitespace only")
|
86
|
+
|
63
87
|
def _extract_and_remove_cdata(self: Self, content: str, preserve_cdata: bool = False) -> tuple[str, list[str]]:
|
64
88
|
"""Extract CDATA sections from content.
|
65
89
|
|
@@ -96,6 +120,7 @@ class ToleranceXMLParser:
|
|
96
120
|
# Only unescape HTML entities, preserve everything else exactly as is
|
97
121
|
return html.unescape(content)
|
98
122
|
|
123
|
+
@lru_cache(maxsize=128)
|
99
124
|
def _map_element_name(self: Self, name: str) -> str:
|
100
125
|
"""Map element names to their canonical form.
|
101
126
|
|
@@ -105,9 +130,82 @@ class ToleranceXMLParser:
|
|
105
130
|
Returns:
|
106
131
|
Canonical element name.
|
107
132
|
"""
|
108
|
-
|
109
|
-
|
110
|
-
|
133
|
+
return self.DEFAULT_NAME_MAP.get(name.strip(), name.strip())
|
134
|
+
|
135
|
+
def _build_element_pattern(self, element_name: str) -> re.Pattern[str]:
|
136
|
+
"""Build regex pattern for finding specific XML elements.
|
137
|
+
|
138
|
+
Args:
|
139
|
+
element_name: Name of the element to match.
|
140
|
+
|
141
|
+
Returns:
|
142
|
+
Compiled regex pattern for matching the element.
|
143
|
+
"""
|
144
|
+
non_cdata = r"(?:(?!<!\[CDATA\[|]]>).)*?"
|
145
|
+
cdata_section = r"(?:<!\[CDATA\[.*?]]>)?"
|
146
|
+
content_pattern = f"({non_cdata}{cdata_section}{non_cdata})"
|
147
|
+
closing_pattern = "(?:</\1>|<\1>)"
|
148
|
+
|
149
|
+
return re.compile(
|
150
|
+
f"<{element_name}>{content_pattern}{closing_pattern}",
|
151
|
+
re.DOTALL
|
152
|
+
)
|
153
|
+
|
154
|
+
def _find_all_elements(self, text: str) -> list[tuple[str, str]]:
|
155
|
+
"""Find all XML elements in text.
|
156
|
+
|
157
|
+
Args:
|
158
|
+
text: Input text to search.
|
159
|
+
|
160
|
+
Returns:
|
161
|
+
List of tuples containing element names and their content.
|
162
|
+
"""
|
163
|
+
return [(match.group(1), match.group(2) or "")
|
164
|
+
for match in self.element_pattern.finditer(text)]
|
165
|
+
|
166
|
+
def _process_element_content(self, content: str, preserve_cdata: bool) -> str:
|
167
|
+
"""Process content of a single element.
|
168
|
+
|
169
|
+
Args:
|
170
|
+
content: Raw element content.
|
171
|
+
preserve_cdata: Whether to preserve CDATA sections.
|
172
|
+
|
173
|
+
Returns:
|
174
|
+
Processed content string.
|
175
|
+
"""
|
176
|
+
content, cdata_sections = self._extract_and_remove_cdata(content, preserve_cdata)
|
177
|
+
content = self._clean_content(content)
|
178
|
+
|
179
|
+
# If content is empty but we have CDATA sections and we're not preserving them
|
180
|
+
if not content.strip() and cdata_sections and not preserve_cdata:
|
181
|
+
return cdata_sections[0]
|
182
|
+
return content
|
183
|
+
|
184
|
+
def _process_elements(
|
185
|
+
self,
|
186
|
+
elements: list[tuple[str, str]],
|
187
|
+
preserve_cdata: bool
|
188
|
+
) -> dict[str, str]:
|
189
|
+
"""Process found elements and handle CDATA sections.
|
190
|
+
|
191
|
+
Args:
|
192
|
+
elements: List of element name and content tuples.
|
193
|
+
preserve_cdata: Whether to preserve CDATA sections.
|
194
|
+
|
195
|
+
Returns:
|
196
|
+
Dictionary mapping element names to their processed content.
|
197
|
+
"""
|
198
|
+
result: dict[str, str] = defaultdict(str)
|
199
|
+
for name, content in elements:
|
200
|
+
name = self._map_element_name(name)
|
201
|
+
result[name] = self._process_element_content(content, preserve_cdata)
|
202
|
+
|
203
|
+
# Handle nested elements
|
204
|
+
nested_elements = self._find_all_elements(content)
|
205
|
+
nested_results = self._process_elements(nested_elements, preserve_cdata)
|
206
|
+
result.update(nested_results)
|
207
|
+
|
208
|
+
return dict(result)
|
111
209
|
|
112
210
|
def _extract_element_content(self: Self, text: str, preserve_cdata: bool = False) -> dict[str, str]:
|
113
211
|
"""Extract content from nested XML elements.
|
@@ -119,35 +217,8 @@ class ToleranceXMLParser:
|
|
119
217
|
Returns:
|
120
218
|
Dictionary mapping element names to their content values.
|
121
219
|
"""
|
122
|
-
elements
|
123
|
-
|
124
|
-
# Process each match
|
125
|
-
for match in self.element_pattern.finditer(text):
|
126
|
-
name = match.group(1)
|
127
|
-
content = match.group(2) or ""
|
128
|
-
|
129
|
-
# Map element name to canonical form
|
130
|
-
name = self._map_element_name(name)
|
131
|
-
|
132
|
-
# Extract and handle CDATA sections
|
133
|
-
content, cdata_sections = self._extract_and_remove_cdata(content, preserve_cdata)
|
134
|
-
|
135
|
-
# Clean and normalize content
|
136
|
-
content = self._clean_content(content)
|
137
|
-
|
138
|
-
# If the content is empty but we have CDATA sections and we're
|
139
|
-
# not preserving them
|
140
|
-
if not content.strip() and cdata_sections and not preserve_cdata:
|
141
|
-
content = cdata_sections[0]
|
142
|
-
|
143
|
-
# Store the element content
|
144
|
-
elements[name] = content
|
145
|
-
|
146
|
-
# Extract nested elements from the content
|
147
|
-
nested_elements = self._extract_element_content(content, preserve_cdata)
|
148
|
-
elements.update(nested_elements)
|
149
|
-
|
150
|
-
return dict(elements) # Convert defaultdict to regular dict
|
220
|
+
elements = self._find_all_elements(text)
|
221
|
+
return self._process_elements(elements, preserve_cdata)
|
151
222
|
|
152
223
|
def extract_elements(
|
153
224
|
self: Self,
|
@@ -172,9 +243,7 @@ class ToleranceXMLParser:
|
|
172
243
|
ValueError: If the input text is invalid or contains malformed XML.
|
173
244
|
"""
|
174
245
|
try:
|
175
|
-
|
176
|
-
raise ValueError("Input text must be a non-empty string")
|
177
|
-
|
246
|
+
self._validate_input(text)
|
178
247
|
logger.debug(f"Extracting elements: {element_names or 'all'}")
|
179
248
|
|
180
249
|
# Extract all elements and their content
|
@@ -206,18 +275,9 @@ class ToleranceXMLParser:
|
|
206
275
|
ValueError: If the input text is invalid or contains malformed XML.
|
207
276
|
"""
|
208
277
|
try:
|
209
|
-
|
210
|
-
raise ValueError("Input text must be a non-empty string")
|
211
|
-
|
278
|
+
self._validate_input(text)
|
212
279
|
elements: list[XMLElement] = []
|
213
|
-
pattern =
|
214
|
-
f"<{element_name}>"
|
215
|
-
r"((?:(?!<!\[CDATA\[|]]>).)*?"
|
216
|
-
r"(?:<!\[CDATA\[.*?]]>)?"
|
217
|
-
r"(?:(?!<!\[CDATA\[|]]>).)*?)"
|
218
|
-
f"(?:</\1>|<\1>)",
|
219
|
-
re.DOTALL,
|
220
|
-
)
|
280
|
+
pattern = self._build_element_pattern(element_name)
|
221
281
|
|
222
282
|
for match in pattern.finditer(text):
|
223
283
|
content = match.group(1)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: quantalogic
|
3
|
-
Version: 0.2.
|
3
|
+
Version: 0.2.17
|
4
4
|
Summary: QuantaLogic ReAct Agents
|
5
5
|
Author: Raphaël MANSUY
|
6
6
|
Author-email: raphael.mansuy@gmail.com
|
@@ -15,11 +15,20 @@ Requires-Dist: fastapi (>=0.115.6,<0.116.0)
|
|
15
15
|
Requires-Dist: google-auth (>=2.20.0,<3.0.0)
|
16
16
|
Requires-Dist: google-search-results (>=2.4.2,<3.0.0)
|
17
17
|
Requires-Dist: litellm (>=1.56.4,<2.0.0)
|
18
|
+
Requires-Dist: llmlingua (>=0.2.2,<0.3.0)
|
18
19
|
Requires-Dist: loguru (>=0.7.3,<0.8.0)
|
19
20
|
Requires-Dist: markitdown (>=0.0.1a3,<0.0.2)
|
21
|
+
Requires-Dist: mkdocs-git-revision-date-localized-plugin (>=1.2.0,<2.0.0)
|
22
|
+
Requires-Dist: mkdocs-macros-plugin (>=1.0.4,<2.0.0)
|
23
|
+
Requires-Dist: mkdocs-material[imaging] (>=9.5.49,<10.0.0)
|
24
|
+
Requires-Dist: mkdocs-mermaid2-plugin (>=1.1.1,<2.0.0)
|
25
|
+
Requires-Dist: mkdocs-minify-plugin (>=0.7.1,<0.8.0)
|
26
|
+
Requires-Dist: mkdocstrings (>=0.24.0,<0.25.0)
|
27
|
+
Requires-Dist: mkdocstrings-python (>=1.7.0,<2.0.0)
|
20
28
|
Requires-Dist: pathspec (>=0.12.1,<0.13.0)
|
21
29
|
Requires-Dist: prompt-toolkit (>=3.0.48,<4.0.0)
|
22
30
|
Requires-Dist: pydantic (>=2.10.4,<3.0.0)
|
31
|
+
Requires-Dist: pymdown-extensions (>=10.3.1,<11.0.0)
|
23
32
|
Requires-Dist: rich (>=13.9.4,<14.0.0)
|
24
33
|
Requires-Dist: serpapi (>=0.1.5,<0.2.0)
|
25
34
|
Requires-Dist: tenacity (>=9.0.0,<10.0.0)
|
@@ -43,7 +52,7 @@ Description-Content-Type: text/markdown
|
|
43
52
|
|
44
53
|
[](https://opensource.org/licenses/Apache-2.0)
|
45
54
|
[](https://www.python.org/downloads/)
|
46
|
-
[]()
|
55
|
+
[](https://quantalogic.github.io/quantalogic/)
|
47
56
|
|
48
57
|
QuantaLogic is a ReAct (Reasoning & Action) framework for building advanced AI agents.
|
49
58
|
|
@@ -51,6 +60,8 @@ It seamlessly integrates large language models (LLMs) with a robust tool system,
|
|
51
60
|
|
52
61
|
The `cli` version include coding capabilities comparable to Aider.
|
53
62
|
|
63
|
+
[📖 Documentation](https://quantalogic.github.io/quantalogic/)
|
64
|
+
|
54
65
|
|
55
66
|
## Why QuantaLogic?
|
56
67
|
|
@@ -80,6 +91,7 @@ We created [QuantaLogic](https://www.quantalogic.app) because we saw a significa
|
|
80
91
|
- [Development](#-development)
|
81
92
|
- [Contributing](#-contributing)
|
82
93
|
- [License](#-license)
|
94
|
+
- [Documentation Development](#-documentation-development)
|
83
95
|
|
84
96
|
## 📦 Installation
|
85
97
|
|
@@ -128,9 +140,9 @@ Usage: quantalogic [OPTIONS] COMMAND [ARGS]...
|
|
128
140
|
Options:
|
129
141
|
--version Show version information.
|
130
142
|
--model-name TEXT Specify the text model to use (litellm format,
|
131
|
-
e.g. "openrouter/deepseek-chat").
|
143
|
+
e.g. "openrouter/deepseek/deepseek-chat").
|
132
144
|
--vision-model-name TEXT Specify the vision model to use (litellm format,
|
133
|
-
e.g. "openrouter/
|
145
|
+
e.g. "openrouter/openai/gpt-4o-mini").
|
134
146
|
--log [info|debug|warning] Set logging level (info/debug/warning).
|
135
147
|
--verbose Enable verbose output.
|
136
148
|
--max-iterations INTEGER Maximum iterations for task solving (default: 30).
|
@@ -251,7 +263,7 @@ from quantalogic.tools import PythonTool, ReadFileTool
|
|
251
263
|
|
252
264
|
# Create agent with specific tools
|
253
265
|
agent = Agent(
|
254
|
-
model_name="openrouter/deepseek-chat",
|
266
|
+
model_name="openrouter/deepseek/deepseek-chat",
|
255
267
|
tools=[
|
256
268
|
PythonTool(),
|
257
269
|
ReadFileTool()
|
@@ -844,148 +856,7 @@ print(results)
|
|
844
856
|
```
|
845
857
|
```
|
846
858
|
|
847
|
-
#### Creating Custom Tools
|
848
|
-
|
849
|
-
```python
|
850
|
-
from quantalogic.tools import Tool, ToolArgument
|
851
|
-
|
852
|
-
class DatabaseTool(Tool):
|
853
|
-
name: str = "database_tool"
|
854
|
-
description: str = "Execute database operations"
|
855
|
-
need_validation: bool = True
|
856
|
-
|
857
|
-
arguments: list[ToolArgument] = [
|
858
|
-
ToolArgument(
|
859
|
-
name="query",
|
860
|
-
arg_type="string",
|
861
|
-
description="SQL query to execute",
|
862
|
-
required=True
|
863
|
-
)
|
864
|
-
]
|
865
|
-
|
866
|
-
def execute(self, query: str) -> str:
|
867
|
-
# Tool implementation
|
868
|
-
return "Query results"
|
869
859
|
```
|
870
|
-
|
871
|
-
|
872
|
-
## 🌐 Web Interface
|
873
|
-
|
874
|
-
Features:
|
875
|
-
- Real-time event visualization
|
876
|
-
- Task submission and monitoring
|
877
|
-
- Interactive validation dialogs
|
878
|
-
- Model selection
|
879
|
-
- Event filtering and search
|
880
|
-
|
881
|
-
### API Endpoints
|
882
|
-
|
883
|
-
| Endpoint | Method | Description |
|
884
|
-
| ------------------ | ------ | --------------- |
|
885
|
-
| `/tasks` | POST | Submit tasks |
|
886
|
-
| `/tasks/{task_id}` | GET | Task status |
|
887
|
-
| `/events` | GET | SSE endpoint |
|
888
|
-
| `/validate` | POST | Task validation |
|
889
|
-
|
890
|
-
|
891
|
-
## 📖 Examples
|
892
|
-
|
893
|
-
### Python Tool Integration Example
|
894
|
-
|
895
|
-
```python
|
896
|
-
import os
|
897
|
-
|
898
|
-
from quantalogic import Agent, console_print_events
|
899
|
-
from quantalogic.tools import (
|
900
|
-
PythonTool,
|
901
|
-
)
|
902
|
-
|
903
|
-
# Verify API key is set - required for authentication with DeepSeek's API
|
904
|
-
# This check ensures the agent won't fail during runtime due to missing credentials
|
905
|
-
if not os.environ.get("DEEPSEEK_API_KEY"):
|
906
|
-
raise ValueError("DEEPSEEK_API_KEY environment variable is not set")
|
907
|
-
|
908
|
-
# Initialize agent with DeepSeek model and Python tool
|
909
|
-
agent = Agent(model_name="deepseek/deepseek-chat", tools=[PythonTool()])
|
910
|
-
|
911
|
-
# Configure comprehensive event monitoring system
|
912
|
-
# Tracks all agent activities including:
|
913
|
-
# - Code execution steps
|
914
|
-
# - Tool interactions
|
915
|
-
# - Error conditions
|
916
|
-
# Essential for debugging and performance optimization
|
917
|
-
agent.event_emitter.on(
|
918
|
-
"*",
|
919
|
-
console_print_events,
|
920
|
-
)
|
921
|
-
|
922
|
-
# Execute a precision mathematics task demonstrating:
|
923
|
-
# - High-precision calculations
|
924
|
-
# - PythonTool integration
|
925
|
-
# - Real-time monitoring capabilities
|
926
|
-
result = agent.solve_task("1. Calculate PI with 10000 decimal places.")
|
927
|
-
print(result)
|
928
|
-
```
|
929
|
-
|
930
|
-
### Agent with Event Monitoring
|
931
|
-
|
932
|
-
```python
|
933
|
-
import os
|
934
|
-
|
935
|
-
from quantalogic import Agent, console_print_events
|
936
|
-
from quantalogic.tools import (
|
937
|
-
LLMTool,
|
938
|
-
)
|
939
|
-
|
940
|
-
# Verify API key is set - required for authentication with DeepSeek's API
|
941
|
-
# This check ensures the agent won't fail during runtime due to missing credentials
|
942
|
-
if not os.environ.get("DEEPSEEK_API_KEY"):
|
943
|
-
raise ValueError("DEEPSEEK_API_KEY environment variable is not set")
|
944
|
-
|
945
|
-
# Initialize agent with DeepSeek model and LLM tool
|
946
|
-
# The LLM tool serves dual purpose:
|
947
|
-
# 1. As a reasoning engine for the agent's cognitive processes
|
948
|
-
# 2. As a latent space explorer, enabling the agent to:
|
949
|
-
# - Discover novel solution paths
|
950
|
-
# - Generate creative combinations of concepts
|
951
|
-
# - Explore alternative reasoning strategies
|
952
|
-
# Using the same model ensures consistent behavior across both roles
|
953
|
-
agent = Agent(model_name="deepseek/deepseek-chat", tools=[LLMTool(model_name="deepseek/deepseek-chat")])
|
954
|
-
|
955
|
-
# Set up event monitoring to track agent's lifecycle
|
956
|
-
# This helps in debugging and understanding the agent's behavior
|
957
|
-
agent.event_emitter.on(
|
958
|
-
[
|
959
|
-
"task_complete",
|
960
|
-
"task_think_start",
|
961
|
-
"task_think_end",
|
962
|
-
"tool_execution_start",
|
963
|
-
"tool_execution_end",
|
964
|
-
"error_max_iterations_reached",
|
965
|
-
"memory_full",
|
966
|
-
"memory_compacted",
|
967
|
-
"memory_summary",
|
968
|
-
],
|
969
|
-
console_print_events,
|
970
|
-
)
|
971
|
-
|
972
|
-
# Execute a multi-step task showcasing agent's capabilities
|
973
|
-
# Demonstrates:
|
974
|
-
# 1. Creative content generation
|
975
|
-
# 2. Language translation
|
976
|
-
# 3. Style adaptation
|
977
|
-
# 4. Multi-step reasoning and execution
|
978
|
-
result = agent.solve_task(
|
979
|
-
"1. Write a poem in English about a dog. "
|
980
|
-
"2. Translate the poem into French. "
|
981
|
-
"3. Choose 2 French authors"
|
982
|
-
"4. Rewrite the translated poem with the style of the chosen authors. "
|
983
|
-
)
|
984
|
-
print(result)
|
985
|
-
```
|
986
|
-
|
987
|
-
|
988
|
-
|
989
860
|
### Project Documentation
|
990
861
|
|
991
862
|
```python
|
@@ -993,7 +864,7 @@ from quantalogic import Agent
|
|
993
864
|
from quantalogic.tools import MarkitdownTool, ReadFileTool
|
994
865
|
|
995
866
|
agent = Agent(
|
996
|
-
model_name="openrouter/deepseek-chat",
|
867
|
+
model_name="openrouter/deepseek/deepseek-chat",
|
997
868
|
tools=[MarkitdownTool(), ReadFileTool()]
|
998
869
|
)
|
999
870
|
|
@@ -1,18 +1,20 @@
|
|
1
|
-
quantalogic/__init__.py,sha256=
|
2
|
-
quantalogic/agent.py,sha256=
|
3
|
-
quantalogic/agent_config.py,sha256=
|
4
|
-
quantalogic/coding_agent.py,sha256=
|
1
|
+
quantalogic/__init__.py,sha256=kX0c_xmD9OslWnAE92YHMGuD7xZcTo8ZOF_5R64HKps,784
|
2
|
+
quantalogic/agent.py,sha256=w4ljI0ccOagTioJLFWQH05M7P304qe-NB6Cca_JIjgU,27900
|
3
|
+
quantalogic/agent_config.py,sha256=zS7uPPPJ7sxKy4iBY5lkgDdDZR7H6mEGy4Q605-4oXs,5516
|
4
|
+
quantalogic/coding_agent.py,sha256=NDXZyGBwxnjy3E5MmZ43axA1IIq7uFH14DpbNRVLWzM,3899
|
5
|
+
quantalogic/console_print_events.py,sha256=KB-DGi52As8M96eUs1N_vgNqKIFtqv_H8NTOd3TLTgQ,2163
|
6
|
+
quantalogic/console_print_token.py,sha256=qSU-3kmoZk4T5-1ybrEBi8tIXDPcz7eyWKhGh3E8uIg,395
|
7
|
+
quantalogic/docs_cli.py,sha256=3giVbUpespB9ZdTSJ955A3BhcOaBl5Lwsn1AVy9XAeY,1663
|
5
8
|
quantalogic/event_emitter.py,sha256=jqot2g4JRXc88K6PW837Oqxbf7shZfO-xdPaUWmzupk,7901
|
6
|
-
quantalogic/generative_model.py,sha256=
|
9
|
+
quantalogic/generative_model.py,sha256=DcLFYNS9H588dPfIL5s4pajG9EVpdPN0Mp36waQIFRk,12294
|
7
10
|
quantalogic/interactive_text_editor.py,sha256=kYeTA2qej5kxtPvAUHy_Dr2MhrGQAyenLFpW9mU9Rmw,6855
|
8
|
-
quantalogic/main.py,sha256=
|
11
|
+
quantalogic/main.py,sha256=rHctMiV9-XRf6O-PIisjOdaF2y1SQNclUJQ53KPdh9A,14138
|
9
12
|
quantalogic/memory.py,sha256=zbtRuM05jaS2lJll-92dt5JfYVLERnF_m_9xqp2x-k0,6304
|
10
13
|
quantalogic/model_names.py,sha256=UZlz25zG9B2dpfwdw_e1Gw5qFsKQ7iME9FJh9Ts4u6s,938
|
11
|
-
quantalogic/print_event.py,sha256=nl1aRdYnsU72SRezafePF82zKtrqGfY8OoTx2QfbdE8,2206
|
12
14
|
quantalogic/prompts.py,sha256=jRAm9YYvwx8KAx42Ak2H7y2p_1jIVuL1e3Wsd2Y81Cc,3548
|
13
15
|
quantalogic/search_agent.py,sha256=Jy-Zw77giZOlON_bDO0u3ppfRxv_O0EGcGmN4QuuLmQ,1944
|
14
16
|
quantalogic/server/__init__.py,sha256=8sz_PYAUCrkM6JM5EAUeIzNM4NPW6j6UT72JVkc21WQ,91
|
15
|
-
quantalogic/server/agent_server.py,sha256=
|
17
|
+
quantalogic/server/agent_server.py,sha256=JNginXlkgBfJLqgKffoTBSvBWI8ZO1uXUgTOqLINk_g,22517
|
16
18
|
quantalogic/server/models.py,sha256=nVUGWElOsUw8QnRCGJylk25wCew_5gohe6nldYighUA,1322
|
17
19
|
quantalogic/server/routes.py,sha256=00nFe6s0T4Gv8vCp0wQFjWGo1tC8FViH8h0koAJdWs4,4216
|
18
20
|
quantalogic/server/state.py,sha256=TwtL0BTp_LT-fynF1IR4k8WVXuxXWtSv3NgWG9fuUME,7369
|
@@ -39,8 +41,8 @@ quantalogic/tools/language_handlers/rust_handler.py,sha256=t_AqKVa3KVk6SVkq_UjUU
|
|
39
41
|
quantalogic/tools/language_handlers/scala_handler.py,sha256=wr-cWOIFOc0UYwODmEtT6rV63Qf1NyNB_BLo23GLrvk,1281
|
40
42
|
quantalogic/tools/language_handlers/typescript_handler.py,sha256=L4vuJMYxKO3_83dQhdwZ9fogauIV7rwoicRT0xLGfkQ,1738
|
41
43
|
quantalogic/tools/list_directory_tool.py,sha256=8Hy38DelSh-mRqS_uDLpeBYoHLtEy5ji77xI-TJu3Ms,4176
|
42
|
-
quantalogic/tools/llm_tool.py,sha256=
|
43
|
-
quantalogic/tools/llm_vision_tool.py,sha256=
|
44
|
+
quantalogic/tools/llm_tool.py,sha256=m9OyF38QQ0afWKtmbwrGxpt1p3T-ZWAkgwRp2ScToiI,6877
|
45
|
+
quantalogic/tools/llm_vision_tool.py,sha256=eVDIrANxxZCHxYp9xaAN8hLdFhlYm7bUu2tX9-1xUbI,5496
|
44
46
|
quantalogic/tools/markitdown_tool.py,sha256=lpbJBLx43_x2DjiZAV1HSidkHeqkkV0KvgeLG2fphK4,4339
|
45
47
|
quantalogic/tools/nodejs_tool.py,sha256=zdnE0VFj_5786uR2L0o-SKR0Gk8L-U7rdj7xGHJYIq0,19905
|
46
48
|
quantalogic/tools/python_tool.py,sha256=70HLbfU2clOBgj4axDOtIKzXwEBMNGEAX1nGSf-KNNQ,18156
|
@@ -66,10 +68,10 @@ quantalogic/utils/git_ls.py,sha256=_aXg2TwqYv9CoOrhQ1gqHCqu1j8wOVigQNWbGncSDlM,4
|
|
66
68
|
quantalogic/utils/read_file.py,sha256=tSRVHk8dIP4nNLL89v5kRki4hOTjVyjbmuEb2zwvwCY,2077
|
67
69
|
quantalogic/utils/read_http_text_content.py,sha256=n3IayT5KcqctIVVF2gOQQAMf3Ow6eenlVgfXTpLcQbw,4410
|
68
70
|
quantalogic/version.py,sha256=ea_cRutaQk5_lwlLbUUvPFuOT7Of7-gAsDl7wdveS-g,107
|
69
|
-
quantalogic/xml_parser.py,sha256=
|
71
|
+
quantalogic/xml_parser.py,sha256=uMLQNHTRCg116FwcjRoquZmSwVtE4LEH-6V2E3RD-dA,11466
|
70
72
|
quantalogic/xml_tool_parser.py,sha256=lsVzClZBrZan7wjCuCKnGHWzksXI3VMy_vWthxu2_bo,3738
|
71
|
-
quantalogic-0.2.
|
72
|
-
quantalogic-0.2.
|
73
|
-
quantalogic-0.2.
|
74
|
-
quantalogic-0.2.
|
75
|
-
quantalogic-0.2.
|
73
|
+
quantalogic-0.2.17.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
74
|
+
quantalogic-0.2.17.dist-info/METADATA,sha256=0RCGjrnGzipu7eGuYGEgmd1jDFWetzPCjzHHBMHDS_o,38574
|
75
|
+
quantalogic-0.2.17.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
76
|
+
quantalogic-0.2.17.dist-info/entry_points.txt,sha256=h74O_Q3qBRCrDR99qvwB4BpBGzASPUIjCfxHq6Qnups,183
|
77
|
+
quantalogic-0.2.17.dist-info/RECORD,,
|
File without changes
|
File without changes
|