memra 0.2.3__py3-none-any.whl → 0.2.4__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.
- memra/execution.py +10 -0
- memra/tool_registry.py +8 -0
- {memra-0.2.3.dist-info → memra-0.2.4.dist-info}/METADATA +45 -1
- memra-0.2.4.dist-info/RECORD +58 -0
- memra-0.2.4.dist-info/licenses/LICENSE +0 -0
- memra-0.2.4.dist-info/top_level.txt +4 -0
- memra-ops/app.py +710 -0
- memra-ops/config/config.py +25 -0
- memra-ops/config.py +34 -0
- memra-ops/scripts/release.py +133 -0
- memra-ops/scripts/start_memra.py +334 -0
- memra-ops/scripts/stop_memra.py +132 -0
- memra-ops/server_tool_registry.py +188 -0
- memra-ops/tests/test_llm_text_to_sql.py +115 -0
- memra-ops/tests/test_llm_vs_pattern.py +130 -0
- memra-ops/tests/test_mcp_schema_aware.py +124 -0
- memra-ops/tests/test_schema_aware_sql.py +139 -0
- memra-ops/tests/test_schema_aware_sql_simple.py +66 -0
- memra-ops/tests/test_text_to_sql_demo.py +140 -0
- memra-ops/tools/mcp_bridge_server.py +851 -0
- memra-sdk/examples/accounts_payable.py +215 -0
- memra-sdk/examples/accounts_payable_client.py +217 -0
- memra-sdk/examples/accounts_payable_mcp.py +200 -0
- memra-sdk/examples/ask_questions.py +123 -0
- memra-sdk/examples/invoice_processing.py +116 -0
- memra-sdk/examples/propane_delivery.py +87 -0
- memra-sdk/examples/simple_text_to_sql.py +158 -0
- memra-sdk/memra/__init__.py +31 -0
- memra-sdk/memra/discovery.py +15 -0
- memra-sdk/memra/discovery_client.py +49 -0
- memra-sdk/memra/execution.py +481 -0
- memra-sdk/memra/models.py +99 -0
- memra-sdk/memra/tool_registry.py +343 -0
- memra-sdk/memra/tool_registry_client.py +106 -0
- memra-sdk/scripts/release.py +133 -0
- memra-sdk/setup.py +52 -0
- memra-workflows/accounts_payable/accounts_payable.py +215 -0
- memra-workflows/accounts_payable/accounts_payable_client.py +216 -0
- memra-workflows/accounts_payable/accounts_payable_mcp.py +200 -0
- memra-workflows/accounts_payable/accounts_payable_smart.py +221 -0
- memra-workflows/invoice_processing/invoice_processing.py +116 -0
- memra-workflows/invoice_processing/smart_invoice_processor.py +220 -0
- memra-workflows/logic/__init__.py +1 -0
- memra-workflows/logic/file_tools.py +50 -0
- memra-workflows/logic/invoice_tools.py +501 -0
- memra-workflows/logic/propane_agents.py +52 -0
- memra-workflows/mcp_bridge_server.py +230 -0
- memra-workflows/propane_delivery/propane_delivery.py +87 -0
- memra-workflows/text_to_sql/complete_invoice_workflow_with_queries.py +208 -0
- memra-workflows/text_to_sql/complete_text_to_sql_system.py +266 -0
- memra-workflows/text_to_sql/file_discovery_demo.py +156 -0
- memra-0.2.3.dist-info/RECORD +0 -12
- memra-0.2.3.dist-info/top_level.txt +0 -1
- {memra-0.2.3.dist-info → memra-0.2.4.dist-info}/WHEEL +0 -0
- {memra-0.2.3.dist-info → memra-0.2.4.dist-info}/entry_points.txt +0 -0
memra/execution.py
CHANGED
@@ -368,6 +368,16 @@ class ExecutionEngine:
|
|
368
368
|
not tool_data.get("_mock", False) # Not mock data
|
369
369
|
)
|
370
370
|
|
371
|
+
elif tool_name == "SQLExecutor":
|
372
|
+
# Real work if it actually executed SQL and returned real results
|
373
|
+
return (
|
374
|
+
"query" in tool_data and
|
375
|
+
"results" in tool_data and
|
376
|
+
isinstance(tool_data["results"], list) and
|
377
|
+
"row_count" in tool_data and
|
378
|
+
not tool_data.get("_mock", False) # Not mock data
|
379
|
+
)
|
380
|
+
|
371
381
|
# Default to mock work
|
372
382
|
return False
|
373
383
|
|
memra/tool_registry.py
CHANGED
@@ -128,24 +128,32 @@ class ToolRegistry:
|
|
128
128
|
last_error = None
|
129
129
|
for endpoint in endpoints_to_try:
|
130
130
|
try:
|
131
|
+
logger.info(f"Trying endpoint: {endpoint}")
|
131
132
|
with httpx.Client(timeout=60.0) as client:
|
132
133
|
response = client.post(endpoint, json=payload, headers=headers)
|
133
134
|
|
135
|
+
logger.info(f"Response status for {endpoint}: {response.status_code}")
|
136
|
+
|
134
137
|
if response.status_code == 200:
|
135
138
|
result = response.json()
|
136
139
|
logger.info(f"MCP tool {tool_name} executed successfully via {endpoint}")
|
137
140
|
return result
|
138
141
|
elif response.status_code == 404:
|
142
|
+
logger.info(f"Endpoint {endpoint} returned 404, trying next...")
|
139
143
|
continue # Try next endpoint
|
140
144
|
else:
|
145
|
+
logger.error(f"Endpoint {endpoint} returned {response.status_code}: {response.text}")
|
141
146
|
response.raise_for_status()
|
142
147
|
|
143
148
|
except httpx.HTTPStatusError as e:
|
144
149
|
if e.response.status_code == 404:
|
150
|
+
logger.info(f"Endpoint {endpoint} returned 404, trying next...")
|
145
151
|
continue # Try next endpoint
|
152
|
+
logger.error(f"HTTP error for {endpoint}: {e.response.status_code} - {e.response.text}")
|
146
153
|
last_error = e
|
147
154
|
continue
|
148
155
|
except Exception as e:
|
156
|
+
logger.error(f"Exception for {endpoint}: {str(e)}")
|
149
157
|
last_error = e
|
150
158
|
continue
|
151
159
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: memra
|
3
|
-
Version: 0.2.
|
3
|
+
Version: 0.2.4
|
4
4
|
Summary: Declarative framework for enterprise workflows with MCP integration - Client SDK
|
5
5
|
Home-page: https://github.com/memra/memra-sdk
|
6
6
|
Author: Memra
|
@@ -19,6 +19,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
19
19
|
Classifier: Programming Language :: Python :: 3.11
|
20
20
|
Requires-Python: >=3.8
|
21
21
|
Description-Content-Type: text/markdown
|
22
|
+
License-File: LICENSE
|
22
23
|
Requires-Dist: pydantic>=1.8.0
|
23
24
|
Requires-Dist: httpx>=0.24.0
|
24
25
|
Requires-Dist: typing-extensions>=4.0.0
|
@@ -33,6 +34,7 @@ Provides-Extra: mcp
|
|
33
34
|
Requires-Dist: psycopg2-binary>=2.9.0; extra == "mcp"
|
34
35
|
Dynamic: author
|
35
36
|
Dynamic: home-page
|
37
|
+
Dynamic: license-file
|
36
38
|
Dynamic: requires-python
|
37
39
|
|
38
40
|
# Memra SDK
|
@@ -96,6 +98,48 @@ See the `examples/` directory for basic usage examples:
|
|
96
98
|
|
97
99
|
For detailed documentation, visit [docs.memra.co](https://docs.memra.co)
|
98
100
|
|
101
|
+
Documentation is also available locally in the `examples/` directory.
|
102
|
+
|
103
|
+
## Example: Propane Delivery Workflow
|
104
|
+
|
105
|
+
See the `examples/propane_delivery.py` file for a complete example of how to use Memra to orchestrate a propane delivery workflow.
|
106
|
+
|
107
|
+
## 🔍 Smart File Discovery
|
108
|
+
|
109
|
+
Memra includes intelligent file discovery and management capabilities:
|
110
|
+
|
111
|
+
### File Discovery Tools
|
112
|
+
- **FileDiscovery**: Automatically scan directories for files matching patterns
|
113
|
+
- **FileCopy**: Copy files from external locations to standard processing directories
|
114
|
+
- **Smart Routing**: Automatically handle file paths and directory management
|
115
|
+
|
116
|
+
### Example: Smart Invoice Processing
|
117
|
+
```python
|
118
|
+
from memra import Agent
|
119
|
+
|
120
|
+
# Smart agent that discovers and processes files automatically
|
121
|
+
smart_parser = Agent(
|
122
|
+
role="Smart Invoice Parser",
|
123
|
+
job="Discover and process invoice files intelligently",
|
124
|
+
tools=[
|
125
|
+
{"name": "FileDiscovery", "hosted_by": "memra"},
|
126
|
+
{"name": "FileCopy", "hosted_by": "memra"},
|
127
|
+
{"name": "InvoiceExtractionWorkflow", "hosted_by": "memra"}
|
128
|
+
]
|
129
|
+
)
|
130
|
+
|
131
|
+
# Three modes of operation:
|
132
|
+
# 1. Auto-discovery: Scan invoices/ directory
|
133
|
+
# 2. External file: Copy from Downloads to invoices/
|
134
|
+
# 3. Specific file: Process exact file path
|
135
|
+
```
|
136
|
+
|
137
|
+
See `examples/accounts_payable_smart.py` for a complete implementation.
|
138
|
+
|
139
|
+
## Contributing
|
140
|
+
|
141
|
+
We welcome contributions! Please see our [contributing guide](CONTRIBUTING.md) for details.
|
142
|
+
|
99
143
|
## License
|
100
144
|
|
101
145
|
MIT License - see LICENSE file for details.
|
@@ -0,0 +1,58 @@
|
|
1
|
+
memra/__init__.py,sha256=zVO29fnEDclBI9x9SFVzF9uJYAKhPDTNrMFMWuw6JC8,787
|
2
|
+
memra/discovery.py,sha256=yJIQnrDQu1nyzKykCIuzG_5SW5dIXHCEBLLKRWacIoY,480
|
3
|
+
memra/discovery_client.py,sha256=AbnKn6qhyrf7vmOvknEeDzH4tiGHsqPHtDaein_qaW0,1271
|
4
|
+
memra/execution.py,sha256=oA66YKds6-8YXQJ7ppCj39C09xuXG1z8GWfF9Tm8Ml0,23861
|
5
|
+
memra/models.py,sha256=sXMPRnMB_mUVtJdBFyd0ElCf_uh1yqx7iLssIYNm0vI,3333
|
6
|
+
memra/tool_registry.py,sha256=PDuWtiX_LX-vhKnx4JeL_ndUwG-oJ6bdhGe6iQeCDBw,15361
|
7
|
+
memra/tool_registry_client.py,sha256=uzMQ4COvRams9vuPLcqcdljUpDlAYU_tyFxrRhrA0Lc,4009
|
8
|
+
memra-0.2.4.dist-info/licenses/LICENSE,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
9
|
+
memra-ops/app.py,sha256=eyswUTeTvKdPSVy5RHMDW9ijUXdBfYB1qDtwCdkDGDM,26057
|
10
|
+
memra-ops/config.py,sha256=6mBbS_stoEIhJDBqdJOalryAnyWeHbDy81mU1j08ids,969
|
11
|
+
memra-ops/server_tool_registry.py,sha256=LYiLUL08M72Poaqt_rWt11BGMFlZKSSWjbW9SnfynEI,8212
|
12
|
+
memra-ops/config/config.py,sha256=7dcT9W5b_nWrVAylbdeOaA60_NJlhv2YLyEILTcNKtI,600
|
13
|
+
memra-ops/scripts/release.py,sha256=riQ-jz7-vnd1cSfQdU1eUZmVDyuWym1nmZW65lGetiI,4218
|
14
|
+
memra-ops/scripts/start_memra.py,sha256=VR7WESQXgvPuzZEFMhtmABSR7IzYixsnpgtoPcECLK0,11987
|
15
|
+
memra-ops/scripts/stop_memra.py,sha256=yyTu4jxjUbxTrvobQ-UhpNk-eWB8bCFjcBPGW1scIJg,4591
|
16
|
+
memra-ops/tests/test_llm_text_to_sql.py,sha256=IDL7FEzlm2Dr9pRCcJQ6SGddF9VBDfHonwztrDpxBGU,4099
|
17
|
+
memra-ops/tests/test_llm_vs_pattern.py,sha256=ZATV1fS7C6Jn-N4-UB5LzuRjbiO1ctZq3gNoIud2RWc,4880
|
18
|
+
memra-ops/tests/test_mcp_schema_aware.py,sha256=H5NmGxS3LWo9xoodqVeliJyHco7ZjGOtHg80ep1SHzw,4537
|
19
|
+
memra-ops/tests/test_schema_aware_sql.py,sha256=b_XPtv7eldR2ARBVlriTHMA1nwqYUcMgthL8mHpewuM,4645
|
20
|
+
memra-ops/tests/test_schema_aware_sql_simple.py,sha256=8f8zijkTwvIqVHM3B5oVviRfFS-U6bfC43fk9hcWsoE,2309
|
21
|
+
memra-ops/tests/test_text_to_sql_demo.py,sha256=5mmpSwXZ8r8sj3J9iCYkFx0SgwyXPe-7Prie1hL6cis,5092
|
22
|
+
memra-ops/tools/mcp_bridge_server.py,sha256=IKUNusZovPdR0_6Bv_XejmAk27lnHrM1uOE8xPVnM8s,35051
|
23
|
+
memra-sdk/setup.py,sha256=ZeDcO25CHXm1rHoDZbWI2BE6B7s7LUa9XvFmUu_YEtk,1513
|
24
|
+
memra-sdk/examples/accounts_payable.py,sha256=PfpXKrGOUu6NpkNcHy6cN6TtsXfnsJZhUv-KGlOvDqY,7990
|
25
|
+
memra-sdk/examples/accounts_payable_client.py,sha256=tLHHCydEpasLHTHd4YULhSxFy6zs81X5PZHav0dlQ2I,7816
|
26
|
+
memra-sdk/examples/accounts_payable_mcp.py,sha256=lOgwDfMVKxifQi70GmeXQnpZiIFrZnNj5_JSZ9qsdBw,7344
|
27
|
+
memra-sdk/examples/ask_questions.py,sha256=jek7EVXXZ_vODlMy_hQGQCkN9vYBfaW7SOWsIQRV2GY,3830
|
28
|
+
memra-sdk/examples/invoice_processing.py,sha256=STe3ri65WH_Ss84qiRWuGZTpDZke5GoJf8LEqOAc5ys,3980
|
29
|
+
memra-sdk/examples/propane_delivery.py,sha256=ryvIxDjM9GJY9T6fFIqJgHOcX2PEMkfF_t_3E5CyZW4,2539
|
30
|
+
memra-sdk/examples/simple_text_to_sql.py,sha256=NnpKo9nFpmPQ089zcSx4wwG6_tSHTmGJSS7LPs55NA0,5314
|
31
|
+
memra-sdk/memra/__init__.py,sha256=zVO29fnEDclBI9x9SFVzF9uJYAKhPDTNrMFMWuw6JC8,787
|
32
|
+
memra-sdk/memra/discovery.py,sha256=yJIQnrDQu1nyzKykCIuzG_5SW5dIXHCEBLLKRWacIoY,480
|
33
|
+
memra-sdk/memra/discovery_client.py,sha256=AbnKn6qhyrf7vmOvknEeDzH4tiGHsqPHtDaein_qaW0,1271
|
34
|
+
memra-sdk/memra/execution.py,sha256=P7tAur0SEMtX6uLlfxTfCZBgMLIRj6Wl3dsv2EA9fHc,23443
|
35
|
+
memra-sdk/memra/models.py,sha256=sXMPRnMB_mUVtJdBFyd0ElCf_uh1yqx7iLssIYNm0vI,3333
|
36
|
+
memra-sdk/memra/tool_registry.py,sha256=P2TafpiqV19yzi0jVrQQrXFGBpQkbmePbRfEW_ai24M,14700
|
37
|
+
memra-sdk/memra/tool_registry_client.py,sha256=uzMQ4COvRams9vuPLcqcdljUpDlAYU_tyFxrRhrA0Lc,4009
|
38
|
+
memra-sdk/scripts/release.py,sha256=riQ-jz7-vnd1cSfQdU1eUZmVDyuWym1nmZW65lGetiI,4218
|
39
|
+
memra-workflows/mcp_bridge_server.py,sha256=6K9fedZiwNpkT7wGAS6IW-HgMYBUC94zu8ppUgftqDg,8528
|
40
|
+
memra-workflows/accounts_payable/accounts_payable.py,sha256=rRpviqKZ-g0KPEnI98GbXy-KnyTrN1dLkj0HP9PKlYs,8012
|
41
|
+
memra-workflows/accounts_payable/accounts_payable_client.py,sha256=kNu2EQ8d6T6qcKn68FznnMGBeoqtXFbN4PHDVDImapk,7813
|
42
|
+
memra-workflows/accounts_payable/accounts_payable_mcp.py,sha256=kySt7PKyIgLbG1Q3jPY1kFPQK8o_3aAmL9vJG2Qcnxc,7366
|
43
|
+
memra-workflows/accounts_payable/accounts_payable_smart.py,sha256=g_V6-1qPsLiIOFw-eLT4w-RoljjErF65SuKRzkEeSck,8004
|
44
|
+
memra-workflows/invoice_processing/invoice_processing.py,sha256=STe3ri65WH_Ss84qiRWuGZTpDZke5GoJf8LEqOAc5ys,3980
|
45
|
+
memra-workflows/invoice_processing/smart_invoice_processor.py,sha256=Ct3ZjNujK4VTlCDgwMWXn6Y7b1dg0a_eIbRP-xm-p3g,7203
|
46
|
+
memra-workflows/logic/__init__.py,sha256=kLTdniFpBqOusmRng8W2LSIAmgj-jfM3Agjl_vXYTl8,76
|
47
|
+
memra-workflows/logic/file_tools.py,sha256=n6uDwInPZcr74zAJJbA9iZajWgRcKoHYtEKX_lbzsik,1586
|
48
|
+
memra-workflows/logic/invoice_tools.py,sha256=wLTI0JqkMYMlFv1z_DPwliIvKbpFBcYh5SnEnhU13Co,20366
|
49
|
+
memra-workflows/logic/propane_agents.py,sha256=ZF1RSccn73a5XZVa-1nxgjvubcYzf62g9lr9PoTbGl4,1804
|
50
|
+
memra-workflows/propane_delivery/propane_delivery.py,sha256=ryvIxDjM9GJY9T6fFIqJgHOcX2PEMkfF_t_3E5CyZW4,2539
|
51
|
+
memra-workflows/text_to_sql/complete_invoice_workflow_with_queries.py,sha256=x4wq3o_ogFnnrI6MQwEhqIiNH-NNwS5SXQUoKd_br7U,7428
|
52
|
+
memra-workflows/text_to_sql/complete_text_to_sql_system.py,sha256=Izj4ucXDXTWFY29SWr2YrEf3ZyXH4QCDEljNk4jlpI0,8991
|
53
|
+
memra-workflows/text_to_sql/file_discovery_demo.py,sha256=4R_QN0Y6OtHmnX6CvtwDXen122XCDrk-MRBOzxb_x_k,5306
|
54
|
+
memra-0.2.4.dist-info/METADATA,sha256=YDEg2IxnhDLka_MA0Ge_cKx_yO2HMFphcGNxnH85t84,4203
|
55
|
+
memra-0.2.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
56
|
+
memra-0.2.4.dist-info/entry_points.txt,sha256=LBVjwWoxWJRzNLgeByPn6xUvWFIRnqnemvAZgIoSt08,41
|
57
|
+
memra-0.2.4.dist-info/top_level.txt,sha256=IviXF9qSQY_BidRYund9zFaV-q1VMl6CuizwTAggQks,42
|
58
|
+
memra-0.2.4.dist-info/RECORD,,
|
File without changes
|