ApiLogicServer 16.0.4__py3-none-any.whl → 16.0.5__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.
- api_logic_server_cli/api_logic_server.py +2 -1
- api_logic_server_cli/prototypes/base/database/system/SAFRSBaseX.py +2 -2
- api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/system/SAFRSBaseX.py +2 -2
- api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/docs/MCP-DB.png +0 -0
- api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/logic_discovery/check_credit.py +5 -21
- api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/readme_ai_mcp.md +446 -0
- api_logic_server_cli/prototypes/ont_app/ontimize_seed/package.json +4 -4
- {apilogicserver-16.0.4.dist-info → apilogicserver-16.0.5.dist-info}/METADATA +1 -3
- {apilogicserver-16.0.4.dist-info → apilogicserver-16.0.5.dist-info}/RECORD +13 -11
- {apilogicserver-16.0.4.dist-info → apilogicserver-16.0.5.dist-info}/WHEEL +0 -0
- {apilogicserver-16.0.4.dist-info → apilogicserver-16.0.5.dist-info}/entry_points.txt +0 -0
- {apilogicserver-16.0.4.dist-info → apilogicserver-16.0.5.dist-info}/licenses/LICENSE +0 -0
- {apilogicserver-16.0.4.dist-info → apilogicserver-16.0.5.dist-info}/top_level.txt +0 -0
|
@@ -12,9 +12,10 @@ ApiLogicServer CLI: given a database url, create [and run] customizable ApiLogic
|
|
|
12
12
|
Called from api_logic_server_cli.py, by instantiating the ProjectRun object.
|
|
13
13
|
'''
|
|
14
14
|
|
|
15
|
-
__version__ = "16.00.
|
|
15
|
+
__version__ = "16.00.05" # last public release: 16.00.04
|
|
16
16
|
recent_changes = \
|
|
17
17
|
f'\n\nRecent Changes:\n' +\
|
|
18
|
+
"\t01/05/2026 - 16.00.05: no pandas, for win11 Python 3.13 install \n"\
|
|
18
19
|
"\t12/11/2025 - 16.00.04: bug fix [106] - SqlServer autoinsert \n"\
|
|
19
20
|
"\t11/25/2025 - 16.00.03: Probabalistic logic (w/ fallback, cand*) - see basic_demo/readme_ai_mcp.md \n"\
|
|
20
21
|
"\t11/12/2025 - 15.04.03: Copilot rules on updates, tighter basic_demo startup, allow for demo_ai_mcp/then tutorial \n"\
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
from sqlalchemy.ext.declarative import declarative_base
|
|
3
|
-
from sqlalchemy import Column, DECIMAL, Date, ForeignKey, Integer, String
|
|
3
|
+
from sqlalchemy import Column, DECIMAL, Date, ForeignKey, Integer, String, and_
|
|
4
4
|
from safrs import SAFRSBase, ValidationError
|
|
5
5
|
from flask_login import UserMixin
|
|
6
6
|
import safrs, flask_sqlalchemy
|
|
@@ -119,7 +119,7 @@ class SAFRSBaseX(SAFRSBase, safrs.DB.Model):
|
|
|
119
119
|
expressions.append(op(attr, attr_val))
|
|
120
120
|
|
|
121
121
|
if len(filters) > 1:
|
|
122
|
-
return query.filter(
|
|
122
|
+
return query.filter(and_(*expressions))
|
|
123
123
|
else:
|
|
124
124
|
return query.filter(*expressions)
|
|
125
125
|
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/system/SAFRSBaseX.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
from sqlalchemy.ext.declarative import declarative_base
|
|
3
|
-
from sqlalchemy import Column, DECIMAL, Date, ForeignKey, Integer, String
|
|
3
|
+
from sqlalchemy import Column, DECIMAL, Date, ForeignKey, Integer, String, and_
|
|
4
4
|
from safrs import SAFRSBase, ValidationError
|
|
5
5
|
from flask_login import UserMixin
|
|
6
6
|
import safrs, flask_sqlalchemy
|
|
@@ -119,7 +119,7 @@ class SAFRSBaseX(SAFRSBase, safrs.DB.Model):
|
|
|
119
119
|
expressions.append(op(attr, attr_val))
|
|
120
120
|
|
|
121
121
|
if len(filters) > 1:
|
|
122
|
-
return query.filter(
|
|
122
|
+
return query.filter(and_(*expressions))
|
|
123
123
|
else:
|
|
124
124
|
return query.filter(*expressions)
|
|
125
125
|
|
|
@@ -24,24 +24,8 @@ def declare_logic():
|
|
|
24
24
|
5. The Item unit_price is copied from the Product unit_price
|
|
25
25
|
"""
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
Rule.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
# 2. The Customer's balance is the sum of the Order amount_total where date_shipped is null
|
|
33
|
-
Rule.sum(derive=models.Customer.balance,
|
|
34
|
-
as_sum_of=models.Order.amount_total,
|
|
35
|
-
where=lambda row: row.date_shipped is None)
|
|
36
|
-
|
|
37
|
-
# 3. The Order's amount_total is the sum of the Item amount
|
|
38
|
-
Rule.sum(derive=models.Order.amount_total,
|
|
39
|
-
as_sum_of=models.Item.amount)
|
|
40
|
-
|
|
41
|
-
# 4. The Item amount is the quantity * unit_price
|
|
42
|
-
Rule.formula(derive=models.Item.amount,
|
|
43
|
-
as_expression=lambda row: row.quantity * row.unit_price)
|
|
44
|
-
|
|
45
|
-
# 5. The Item unit_price is copied from the Product unit_price
|
|
46
|
-
Rule.copy(derive=models.Item.unit_price,
|
|
47
|
-
from_parent=models.Product.unit_price)
|
|
27
|
+
Rule.constraint(validate=models.Customer, as_condition=lambda row: row.balance <= row.credit_limit, error_msg="Customer balance exceeds credit limit")
|
|
28
|
+
Rule.sum(derive=models.Customer.balance, as_sum_of=models.Order.amount_total, where=lambda row: row.date_shipped is None)
|
|
29
|
+
Rule.sum(derive=models.Order.amount_total, as_sum_of=models.Item.amount)
|
|
30
|
+
Rule.formula(derive=models.Item.amount, as_expression=lambda row: row.quantity * row.unit_price)
|
|
31
|
+
Rule.copy(derive=models.Item.unit_price, from_parent=models.Product.unit_price)
|
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: MCP AI Example
|
|
3
|
+
notes: gold dource is docs
|
|
4
|
+
source: docs/Integration-MCP-AI-Example
|
|
5
|
+
do_process_code_block_titles: True
|
|
6
|
+
version: 0.1, for readme 11.09/25
|
|
7
|
+
---
|
|
8
|
+
<style>
|
|
9
|
+
-typeset h1,
|
|
10
|
+
-content__button {
|
|
11
|
+
display: none;
|
|
12
|
+
}
|
|
13
|
+
</style>
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
****Copilot** uses **MCP discovery** to create, interact with, and enforce logic in **GenAI-Logic projects****
|
|
18
|
+
|
|
19
|
+
##
|
|
20
|
+
**Prompt 1 (Create System):**
|
|
21
|
+
<img src="docs/MCP-DB.png" alt="MDP-DB" width="400" align="right">
|
|
22
|
+
*Create a system named basic_demo from samples/dbs/basic_demo.sqlite*
|
|
23
|
+
|
|
24
|
+
**Prompt 2 (Add NL Logic):**
|
|
25
|
+
|
|
26
|
+
*Use case: Check Credit:*<br>
|
|
27
|
+
|
|
28
|
+
*1. The Customer's balance is less than the credit limit*<br>
|
|
29
|
+
*2. The Customer's balance is the sum of the Order amount_total where date_shipped is null*<br>
|
|
30
|
+
*3. The Order's amount_total is the sum of the Item amount*<br>
|
|
31
|
+
*4. The Item amount is the quantity * unit_price*<br>
|
|
32
|
+
*5. The Product count suppliers is the sum of the Product Suppliers*<br>
|
|
33
|
+
*6. Item unit_price copied from the Product*<br>
|
|
34
|
+
|
|
35
|
+
*Use case: App Integration*
|
|
36
|
+
|
|
37
|
+
*1. Send the Order to Kafka topic 'order_shipping' if the date_shipped is not None.*
|
|
38
|
+
|
|
39
|
+
(Developers review this DSL before execution, providing a natural human-in-the-loop checkpoint.)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
**Prompt 3 (Test via MCP-discovered API):** *Constraint blocks bad data* -- as shown below: ️
|
|
43
|
+
|
|
44
|
+
*On Alice's first order, update the widget quantity to 100*
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+

|
|
48
|
+
|
|
49
|
+
The diagram above shows the final step of a complete system, built and tested by Copilot with no manual code edits.
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
## Step 1 – Create System
|
|
54
|
+
In the GenAI-Logic [Manager](https://apilogicserver.github.io/Docs/Manager.md), use Copilot to create an application from an existing database — complete with Admin App, API, and MCP discovery.
|
|
55
|
+
**Step 1: Create Project:**
|
|
56
|
+
```bash title='Step 1: Create Project'
|
|
57
|
+
create a system named basic_demo from samples/dbs/basic_demo.sqlite
|
|
58
|
+
```
|
|
59
|
+
This command:
|
|
60
|
+
|
|
61
|
+
* Creates a new project folder (`basic_demo`)
|
|
62
|
+
* Generates a full **JSON:API** with auto-discovered tables (Customer, Order, Item, Product)
|
|
63
|
+
|
|
64
|
+
* This sqlite sample database (Customers, Orders, Items and Products) is provided when you install GenAI-Logic
|
|
65
|
+
|
|
66
|
+
* Builds a **React Admin App** for instant data access
|
|
67
|
+
* Exposes **MCP metadata** at `/.well-known/mcp.json`, enabling Copilot or ChatGPT to automatically discover the schema and usage patterns
|
|
68
|
+
* Opens a new instance of VSCode on the project
|
|
69
|
+
|
|
70
|
+
The project is ready to run:
|
|
71
|
+
|
|
72
|
+
* In the new project, use Copilot: `start the server` (or click F5)
|
|
73
|
+
* You can explore the admin app and the API, then `stop the server` (or Shift/F5)
|
|
74
|
+
|
|
75
|
+
**Result:** a working three-tier system in under a minute — *database → API → web app → MCP discovery*.
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
## Step 2 – NL Logic
|
|
80
|
+
Copilot reads the MCP schema and responds to a natural-language instruction such as:
|
|
81
|
+
|
|
82
|
+
**Step 2: Declare Logic:**
|
|
83
|
+
```bash title='Step 2: Declare Logic'
|
|
84
|
+
Use case: Check Credit
|
|
85
|
+
1. The Customer's balance is less than the credit limit
|
|
86
|
+
2. The Customer's balance is the sum of the Order amount_total where date_shipped is null
|
|
87
|
+
3. The Order's amount_total is the sum of the Item amount
|
|
88
|
+
4. The Item amount is the quantity * unit_price
|
|
89
|
+
5. The Item unit_price is copied from the Product unit_price
|
|
90
|
+
|
|
91
|
+
Use case: App Integration
|
|
92
|
+
1. Send the Order to Kafka topic 'order_shipping' if the date_shipped is not None.
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
It then inserts the following rules into `logic/declare_logic.py`:
|
|
96
|
+
```python
|
|
97
|
+
Rule.constraint(validate=Customer, as_condition=lambda row: row.balance <= row.credit_limit)
|
|
98
|
+
Rule.sum(derive=Customer.balance, as_sum_of=Order.amount_total)
|
|
99
|
+
Rule.sum(derive=Order.amount_total, as_sum_of=Item.amount)
|
|
100
|
+
Rule.formula(derive=Item.amount, as_expression=lambda row: row.quantity * row.unit_price)
|
|
101
|
+
Rule.copy(derive=Item.unit_price, from_parent=Product)
|
|
102
|
+
```
|
|
103
|
+
These **five declarative lines** replace hundreds of lines of procedural code, automatically providing:
|
|
104
|
+
|
|
105
|
+
* Credit-limit validation
|
|
106
|
+
* Multi-table derivations
|
|
107
|
+
* Multi-table chaining
|
|
108
|
+
* Unit-price propagation
|
|
109
|
+
|
|
110
|
+
All enforced by the **LogicBank** engine during each API transaction.
|
|
111
|
+
|
|
112
|
+
> AI can get a bit frisky - e.g., it might import objects not used. Don't take any guff - make it fix any errors - it's quite good at that.
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
## Step 3 – Test with MCP
|
|
117
|
+
Copilot can now test the new rule using the MCP-discovered API — no manual coding required.
|
|
118
|
+
**Test with CoPilot and MCP Discovery:**
|
|
119
|
+
```bash title='Test with CoPilot and MCP Discovery'
|
|
120
|
+
Update Alice’s first order so that the quantity for the Widget is 100
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Copilot uses MCP discovery (`.well-known`) to construct and issue this JSON:API request:
|
|
124
|
+
**Copilot issues::**
|
|
125
|
+
```bash title='Copilot issues:'
|
|
126
|
+
curl -X PATCH http://localhost:5656/api/Item/2 -H "Content-Type: application/vnd.api+json" -d '{"data": {"type": "Item", "id": "2", "attributes": {"quantity": 100}}}'
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
> Tech Note: this is an *MCP-discovered API* — not yet a registered VS Code MCP tool; discovery alone enables this interaction.
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
### Multi-Table Logic Chaining
|
|
134
|
+
| Trigger | Effect |
|
|
135
|
+
|----------|---------|
|
|
136
|
+
| `Item.quantity` | Recalculates `Item.amount` |
|
|
137
|
+
| `Item.amount` | Updates `Order.amount_total` |
|
|
138
|
+
| `Order.amount_total` | Updates `Customer.balance` |
|
|
139
|
+
| `Customer.balance` | Fires credit-limit constraint |
|
|
140
|
+
|
|
141
|
+
**Outcome:** The logic engine detects that Alice’s balance would exceed her credit limit and **rejects the transaction automatically**.
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
### Runtime Trace
|
|
146
|
+
```
|
|
147
|
+
.Item[2] {update}
|
|
148
|
+
.Order[2] {update – Adjusting order.amount_total}
|
|
149
|
+
.Customer[1] {update – Adjusting customer.balance}
|
|
150
|
+
.Customer[1] {Constraint Failure: Customer balance > credit limit}
|
|
151
|
+
```
|
|
152
|
+
See the screen shot at the top of this page.
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
### Copilot’s Response
|
|
157
|
+
> *Business logic working correctly!*
|
|
158
|
+
> *Update prevented automatically to enforce credit limit.*
|
|
159
|
+
|
|
160
|
+
Copilot used MCP to discover the schema, executed the update, and interpreted the deterministic response — proof that **AI + Logic collaboration** can be both natural and reliable.
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
## Architecture Summary
|
|
165
|
+
| Layer | Role | Description |
|
|
166
|
+
|-------|------|-------------|
|
|
167
|
+
| **Database** | Existing model | e.g. `sample_ai.sqlite` |
|
|
168
|
+
| **GenAI-Logic** | Auto-generated API + Logic runtime | Declarative rules via LogicBank |
|
|
169
|
+
| **MCP** | Discovery protocol | Enables AI to understand and safely invoke APIs |
|
|
170
|
+
| **Copilot** | Natural-language interface | Adds and tests business logic |
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
## Connecting to MCP Integration
|
|
175
|
+
This example continues the flow described in [**MCP Integration**](../Integration-MCP/):
|
|
176
|
+
|
|
177
|
+
* **MCP Server Executors** = your logic-enabled APIs
|
|
178
|
+
* **MCP Client Executors** = AI agents like Copilot that translate NL requests into Tool Context Blocks
|
|
179
|
+
* **Declarative Logic** ensures every AI-driven transaction remains safe and auditable
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
## Related Docs
|
|
184
|
+
|
|
185
|
+
* [Integration: MCP](../Integration-MCP/)
|
|
186
|
+
* [Logic: Rule Types](../Logic/)
|
|
187
|
+
* [Sample: Basic Demo](../Sample-Basic-Demo/)
|
|
188
|
+
* [Study: Declarative vs. Procedural GenAI - A/B Comparison](https://apilogicserver.github.io/Docs/Logic-Why-Declarative-GenAI)
|
|
189
|
+
|
|
190
|
+
_This example illustrates the **Business Logic Agent** pattern — Copilot supplies intent, GenAI-Logic guarantees deterministic execution._
|
|
191
|
+
|
|
192
|
+
<br>
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Study: Why Not Just CodeGen?
|
|
197
|
+
|
|
198
|
+
Some months back, we asked a question you might have wondered about...
|
|
199
|
+
> Instead of **NL → DSL → Engine**, why not just have GenAI code it all?
|
|
200
|
+
|
|
201
|
+
<details markdown>
|
|
202
|
+
|
|
203
|
+
<summary>We ran an A/B Test, Did Some Reseach... Here's What We Found</summary>
|
|
204
|
+
|
|
205
|
+
Our [**complete study is here**](https://apilogicserver.github.io/Docs/Logic-Why-Declarative-GenAI), summarized below.
|
|
206
|
+
|
|
207
|
+
<br>
|
|
208
|
+
|
|
209
|
+
<details markdown>
|
|
210
|
+
|
|
211
|
+
<summary>1. We Tried It: an A/B Test</summary>
|
|
212
|
+
|
|
213
|
+
<br>We tried: we asked Claude Sonnet 4-5 to translate **five rules** into code
|
|
214
|
+
|
|
215
|
+
* ~200 lines → **2 correctness bugs** + performance hit
|
|
216
|
+
|
|
217
|
+
Then something remarkable happened:
|
|
218
|
+
|
|
219
|
+
* After finding the second bug, [**AI itself wrote a review**](https://github.com/ApiLogicServer/ApiLogicServer-src/blob/main/api_logic_server_cli/prototypes/basic_demo/logic/procedural/declarative-vs-procedural-comparison#what-happened-here) explaining why procedural logic *cannot* be correct for dependency graphs.
|
|
220
|
+
**→ Bugs came from transitive dependencies, not weak prompts.**
|
|
221
|
+
It recognized the problem was structural — not model quality.
|
|
222
|
+
|
|
223
|
+
</details>
|
|
224
|
+
|
|
225
|
+
<br>
|
|
226
|
+
|
|
227
|
+
<details markdown>
|
|
228
|
+
|
|
229
|
+
<summary>2. We Researched It: Alice et al</summary>
|
|
230
|
+
|
|
231
|
+
<br>Complex dependencies are a *well-known boundary* for code generation.
|
|
232
|
+
|
|
233
|
+
Paths can be tested, never proven complete.
|
|
234
|
+
|
|
235
|
+
1. LLMs show consistent weaknesses in multi-step reasoning and state tracking—the same failure mode seen in dependency propagation. See: **“Alice in Wonderland: Simple Tasks Showing Complete Reasoning Breakdown in State-Of-the-Art Large Language Models”** ([arXiv:2406.02061](https://arxiv.org/abs/2406.02061)).
|
|
236
|
+
|
|
237
|
+
2. A study titled “LMs: Understanding Code Syntax and Semantics for Code Analysis” found that while large language models (LLMs) excel at syntax, they struggle with semantics — especially dynamic semantics, which includes behavior over time, dependencies and state changes. [Click here](https://arxiv.org/abs/2305.12138?utm_source=chatgpt.com).
|
|
238
|
+
|
|
239
|
+
3. A survey of AI usage in business found that AI still has limits in understanding domain-specific business rules, complex dependencies, verifying all cases, etc. [Click here](https://www.sciencedirect.com/science/article/pii/S219985312400132X?utm_source=chatgpt.com).
|
|
240
|
+
|
|
241
|
+
4. Industry commentary (e.g., from SonarSource) states explicitly: “AI models have limitations in understanding complex business logic or domain-specific requirements.” [Click here](https://www.sonarsource.com/resources/library/ai-code-generation-benefits-risks/?utm_source=chatgpt.com).
|
|
242
|
+
|
|
243
|
+
</details>
|
|
244
|
+
|
|
245
|
+
<br>
|
|
246
|
+
|
|
247
|
+
<details markdown>
|
|
248
|
+
|
|
249
|
+
<summary>3. We Reflected: Evolution Remains a Challenge</summary>
|
|
250
|
+
|
|
251
|
+
<br>Procedural glue is opaque, and every change forces full regeneration for dependency management — risking new bugs each time.
|
|
252
|
+
|
|
253
|
+
Declarative rules avoid this.
|
|
254
|
+
|
|
255
|
+
Rules are **self-organizing**: on startup, the engine discovers dependencies and guarantees ordering, propagation, and constraints. This allows:
|
|
256
|
+
|
|
257
|
+
* Add or change **one rule at a time**
|
|
258
|
+
* Place new rules anywhere that makes sense - the engine recomputes the dependency graph automatically
|
|
259
|
+
* Existing logic remains correct without regeneration
|
|
260
|
+
|
|
261
|
+
This mirrors SQL: you don’t re-emit the entire schema to add one new query.
|
|
262
|
+
|
|
263
|
+
Declarative logic turns iterative change from a **rewrite problem** into an **append problem** — exactly what long-lived systems require for business agility.
|
|
264
|
+
|
|
265
|
+
</details>
|
|
266
|
+
|
|
267
|
+
<br>
|
|
268
|
+
|
|
269
|
+
<details markdown>
|
|
270
|
+
|
|
271
|
+
<summary>4. Intuitively... sql vs dbms</summary>
|
|
272
|
+
|
|
273
|
+
<br>You expect a natural-language **query to call a DBMS**, not **create one.**
|
|
274
|
+
|
|
275
|
+
Likewise, NL business logic should **call a rules engine**, not emit procedural code.
|
|
276
|
+
|
|
277
|
+
You want AI to *help* you with your spreadsheet, not *be excel*.
|
|
278
|
+
|
|
279
|
+
> AI can *help* with most anything, but it doesn't need to *be* everything.
|
|
280
|
+
|
|
281
|
+
</details>
|
|
282
|
+
<br>
|
|
283
|
+
|
|
284
|
+
<details markdown>
|
|
285
|
+
|
|
286
|
+
<summary>5. Finally - Governable Intent</summary>
|
|
287
|
+
|
|
288
|
+
<br> **AI → DSL → Engine**
|
|
289
|
+
|
|
290
|
+
- **AI (probabilistic):** NL intent → rules / DSL
|
|
291
|
+
- **DSL (deterministic):** human in the loop
|
|
292
|
+
- **Engine (runtime execution):** rules → ordering, propagation, constraints, debug, logging
|
|
293
|
+
- **Guardrails:** deterministic rules define *when* AI runs and how outputs are governed
|
|
294
|
+
|
|
295
|
+
> AI expresses intent; the engine enforces correctness.
|
|
296
|
+
|
|
297
|
+
</details>
|
|
298
|
+
|
|
299
|
+
</details>
|
|
300
|
+
|
|
301
|
+
<br>
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## Business Logic Agent: A Unified Model of Governable Creativity
|
|
306
|
+
|
|
307
|
+
But AI provides creativity that businesses want... how do we provide that, *with goverance?*
|
|
308
|
+
|
|
309
|
+
<details markdown>
|
|
310
|
+
|
|
311
|
+
<summary>Unified Deterministic and Probabilistic Logic</summary>
|
|
312
|
+
|
|
313
|
+
<br>Enterprises want the best of both: the creativity of probabalistic logic, *with* the governability of deterministic logic -- all in one unified Business Logic Agent. Here's an example, and we then generalize.
|
|
314
|
+
|
|
315
|
+
<br>
|
|
316
|
+
|
|
317
|
+
<details markdown>
|
|
318
|
+
|
|
319
|
+
<summary>A. Example: Choose Supplier, based on current world conditions</summary>
|
|
320
|
+
|
|
321
|
+
Agentic systems are evolving quickly, and a clearer architectural picture is forming:
|
|
322
|
+
|
|
323
|
+
> Not AI *vs* Rules — **AI and Rules together.**
|
|
324
|
+
|
|
325
|
+
Different kinds of logic naturally call for different tools, as in this unified example:
|
|
326
|
+
|
|
327
|
+
* **Deterministic Logic** — logic that must always be correct, consistent, and governed.
|
|
328
|
+
*Example:* “Customer balance must not exceed credit limit.”
|
|
329
|
+
|
|
330
|
+
* **Creative Logic** — logic that benefits from exploration, adaptation, and probabilistic reasoning.
|
|
331
|
+
*Example:* “Which supplier can still deliver if shipping lanes are disrupted?”
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
* **Creative reasoning needs boundaries.<br>Deterministic rules supply the guardrails that keep outcomes correct, consistent, and governed.**
|
|
335
|
+
|
|
336
|
+
**Declare Logic: Deterministic and Probabilistic:**
|
|
337
|
+
```bash title='Declare Logic: Deterministic and Probabilistic'
|
|
338
|
+
Use case: Check Credit:
|
|
339
|
+
|
|
340
|
+
1. The Customer's balance is less than the credit limit
|
|
341
|
+
2. The Customer's balance is the sum of the Order amount_total where date_shipped is null
|
|
342
|
+
3. The Order's amount_total is the sum of the Item amount
|
|
343
|
+
4. The Item amount is the quantity * unit_price
|
|
344
|
+
5. The Product count suppliers is the sum of the Product Suppliers
|
|
345
|
+
6. Use AI to Set Item field unit_price by finding the optimal Product Supplier
|
|
346
|
+
based on cost, lead time, and world conditions
|
|
347
|
+
|
|
348
|
+
Use case: App Integration
|
|
349
|
+
1. Send the Order to Kafka topic 'order_shipping' if the date_shipped is not None.
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
And then, test via MCP-discovered API:** *Constraint blocks bad data*: ️
|
|
353
|
+
**Test Logic with MCP Discovery:**
|
|
354
|
+
```bash title='Test Logic with MCP Discovery'
|
|
355
|
+
On Alice's first order, include 100 Egyptian Cotton Sheets
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
<details markdown>
|
|
359
|
+
|
|
360
|
+
<summary>Data Model, including AI Audit Trail</summary>
|
|
361
|
+
|
|
362
|
+
<br>
|
|
363
|
+
|
|
364
|
+

|
|
365
|
+
|
|
366
|
+
</details>
|
|
367
|
+
|
|
368
|
+
</details>
|
|
369
|
+
|
|
370
|
+
<br>
|
|
371
|
+
|
|
372
|
+
<details markdown>
|
|
373
|
+
|
|
374
|
+
<summary>B. The Business Logic Agent</summary>
|
|
375
|
+
|
|
376
|
+
<br> **The Business Logic Agent** processes a *declarative NL requests:*
|
|
377
|
+
|
|
378
|
+
- At declaration time (e.g., in Copilot):
|
|
379
|
+
|
|
380
|
+
* **D1:** Accepts a unified declarative NL request
|
|
381
|
+
* **D2.** Uses GenAI to create
|
|
382
|
+
* Rules (in Python DSL: Domain Specific Logic) for deterministic Logic
|
|
383
|
+
* LLM calls for Probablistic
|
|
384
|
+
|
|
385
|
+
- At runtime
|
|
386
|
+
|
|
387
|
+
* **R1:** DSL is executed by the Rules Engine (deterministic - no NL pocessing occurs)
|
|
388
|
+
* **R2:** LLM calls
|
|
389
|
+
|
|
390
|
+

|
|
391
|
+
|
|
392
|
+
**Agentic systems become far more compelling when probabilistic intent is paired with deterministic enforcement.**
|
|
393
|
+
|
|
394
|
+
This "governable intent" model aligns with enterprise expectations —
|
|
395
|
+
adaptive where helpful, reliable where essential.
|
|
396
|
+
|
|
397
|
+
**The Business Logic Agent unifies probabilistic intent with deterministic enforcement in a single model**
|
|
398
|
+
|
|
399
|
+
</details>
|
|
400
|
+
|
|
401
|
+
<br>
|
|
402
|
+
|
|
403
|
+
<details markdown>
|
|
404
|
+
|
|
405
|
+
<summary>C. Echoes Modern Thinking</summary>
|
|
406
|
+
|
|
407
|
+
<br>Lamanna: *"Sometimes customers don't want the model to freestyle…
|
|
408
|
+
They want hard-coded business rules."*
|
|
409
|
+
→ Exactly this hybrid: **probabilistic intent + deterministic enforcement**
|
|
410
|
+
|
|
411
|
+
> Governable AI
|
|
412
|
+
|
|
413
|
+
</details>
|
|
414
|
+
|
|
415
|
+
</details>
|
|
416
|
+
|
|
417
|
+
<br>
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
## Heads-Up: AI-Enabled Projects
|
|
422
|
+
|
|
423
|
+
<details markdown>
|
|
424
|
+
|
|
425
|
+
<summary>Copilot can help you understand, learn, and do... here's how</summary>
|
|
426
|
+
|
|
427
|
+
<br>
|
|
428
|
+
|
|
429
|
+
GenAI-Logic projects are already **AI-enabled**, meaning they come with built-in training materials that help assistants like **GitHub Copilot**, **Claude**, or **ChatGPT** understand your project context. For more information, see [AI-Enabled Projects Overview](https://apilogicserver.github.io/Docs/Project-AI-Enabled.md).
|
|
430
|
+
|
|
431
|
+
Once you’ve completed this demo, try engaging your AI assistant directly — it already knows about your project’s structure, rules, and examples.
|
|
432
|
+
|
|
433
|
+
*Understand* GenAI-Logic by **asking Copilot questions** such as:
|
|
434
|
+
|
|
435
|
+
- “Where are the declarative business rules defined?”
|
|
436
|
+
- “Explain how credit-limit validation works in this project.”
|
|
437
|
+
- “Show me how to add a new rule for discount calculation.”
|
|
438
|
+
- “Walk me through the AI Guided Tour.”
|
|
439
|
+
|
|
440
|
+
*Learn* about GenAI-Logic with the *AI-Guided Tour*. **Just ask Copilot: *guide me through***.
|
|
441
|
+
|
|
442
|
+
- note: you should first delete `logic/logic_discovery/check_credit.py`)
|
|
443
|
+
|
|
444
|
+
In addition to all the things CoPilot can do natively, we've taught it about GenAI-Logic. **Just ask Copilot: *what can you help me with?***
|
|
445
|
+
|
|
446
|
+
</details>
|
|
@@ -30,10 +30,10 @@
|
|
|
30
30
|
"@angular/router": "^15.2.10",
|
|
31
31
|
"@angular/service-worker": "^15.2.10",
|
|
32
32
|
"@angular/upgrade": "^15.2.10",
|
|
33
|
-
"ontimize-web-ngx": "15.
|
|
34
|
-
"ontimize-web-ngx-charts": "15.2.
|
|
35
|
-
"ontimize-web-ngx-filemanager": "^15.1.
|
|
36
|
-
"ontimize-web-ngx-map": "15.0.
|
|
33
|
+
"ontimize-web-ngx": "15.7.1",
|
|
34
|
+
"ontimize-web-ngx-charts": "15.2.1",
|
|
35
|
+
"ontimize-web-ngx-filemanager": "^15.1.1",
|
|
36
|
+
"ontimize-web-ngx-map": "15.0.1",
|
|
37
37
|
"ontimize-web-ngx-report": "15.1.0-next.3",
|
|
38
38
|
"ontimize-web-ngx-keycloak": "15.0.0",
|
|
39
39
|
"rxjs": "~7.8.0",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ApiLogicServer
|
|
3
|
-
Version: 16.0.
|
|
3
|
+
Version: 16.0.5
|
|
4
4
|
Author-email: Val Huber <apilogicserver@gmail.com>
|
|
5
5
|
License-Expression: BSD-3-Clause
|
|
6
6
|
Project-URL: Homepage, https://www.genai-logic.com
|
|
@@ -63,8 +63,6 @@ Requires-Dist: behave==1.2.6
|
|
|
63
63
|
Requires-Dist: alembic==1.7.7
|
|
64
64
|
Requires-Dist: python-ulid==2.7.0
|
|
65
65
|
Requires-Dist: psutil==6.0.0
|
|
66
|
-
Requires-Dist: pandas==2.2.2
|
|
67
|
-
Requires-Dist: openpyxl==3.1.5
|
|
68
66
|
Requires-Dist: GeoAlchemy2==0.12.5
|
|
69
67
|
Requires-Dist: confluent-kafka==2.6.0
|
|
70
68
|
Requires-Dist: translate==3.6.1
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
api_logic_server_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
api_logic_server_cli/api_logic_server.py,sha256=
|
|
2
|
+
api_logic_server_cli/api_logic_server.py,sha256=WAp_gKxezrCLjsnUaQmYMdOgM3-LqxzfVBNXNKIip14,105321
|
|
3
3
|
api_logic_server_cli/api_logic_server_info.yaml,sha256=99QQaYQFR0kerupFvyUdYGahGyE8Q_DffKa6ESNOUF4,133
|
|
4
4
|
api_logic_server_cli/cli.py,sha256=xAqTOhq-OnXU2HEQgzsGC9yKrGcAgKUt_8b9U2bV5No,87831
|
|
5
5
|
api_logic_server_cli/cli_args_base.py,sha256=7cVM6BeizwttYAwUu1FUyuLuvWufvgt0TFeA8FI6tu0,3304
|
|
@@ -472,7 +472,7 @@ api_logic_server_cli/prototypes/base/database/alembic/versions/readme.md,sha256=
|
|
|
472
472
|
api_logic_server_cli/prototypes/base/database/database_discovery/authentication_models.py,sha256=8IGpWyNzr3BavktFP85gtsWcorTznR2DFeQb-9yCLZ4,6772
|
|
473
473
|
api_logic_server_cli/prototypes/base/database/database_discovery/auto_discovery.py,sha256=m-LFznTdM581n7xkisamzHIQZ3fEiY9RPKd4wzB6wYo,978
|
|
474
474
|
api_logic_server_cli/prototypes/base/database/db_debug/db_debug.py,sha256=ctcwksnM89597LUAme5Sn044r-xgRh47wSSe3MioPH4,3259
|
|
475
|
-
api_logic_server_cli/prototypes/base/database/system/SAFRSBaseX.py,sha256=
|
|
475
|
+
api_logic_server_cli/prototypes/base/database/system/SAFRSBaseX.py,sha256=vMrJEaeqCVinJOAY1jhFhB-Ro372S_2lZlIsP9arMN4,5391
|
|
476
476
|
api_logic_server_cli/prototypes/base/database/test_data/alp_init.py,sha256=C7yqHB7KoOgwvzRsI3DVk9O_QHPu4SYioChv0Jz5xXY,1203
|
|
477
477
|
api_logic_server_cli/prototypes/base/database/test_data/readme.md,sha256=IDKVMagnjobf5IigYCkQkUMM_iLvBdhK9grMNImSOKg,694
|
|
478
478
|
api_logic_server_cli/prototypes/base/database/test_data/response2code.py,sha256=PTeAXHU-r6r0EBknSGXnbkdySAAzch_3gOuRlyUyVF8,4414
|
|
@@ -823,6 +823,7 @@ api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/.gitignore,sha
|
|
|
823
823
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/_config.yml,sha256=KIUQQpjgj7hP_Z2Fksq90E52UnbKnyom-v9L_eIfqZo,170
|
|
824
824
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/api_logic_server_run.py,sha256=Lvr_sihD9tuqGktSK3HhCKjwrcHkwkNaHWW-wSCglrg,6994
|
|
825
825
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/readme.md,sha256=YjvVHYlMAyD9YTaloIUBrOzHh48mYUwgnSTmLlrFDe4,18602
|
|
826
|
+
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/readme_ai_mcp.md,sha256=nXiwHFO7I_N202nEjdbeMXjh2eYd9BkLsWeMDlsBU7M,16748
|
|
826
827
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/readme_project.md,sha256=sGJuNF_Qt5ripZBXfTi0OmoV4fUxe7ySxrqcKs7DwOk,1186
|
|
827
828
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/readme_standard.md,sha256=Vw7oXyJnvLVVfa-wBuzGUBu3czXi9_U7d5IftGF5x5g,18329
|
|
828
829
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/readme_vibe.md,sha256=ovlSTlsZfYjQ5NiHqMbo1oldaXGPKIo7nZyUImEF7fg,13374
|
|
@@ -943,7 +944,7 @@ api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/alemb
|
|
|
943
944
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/database_discovery/authentication_models.py,sha256=8IGpWyNzr3BavktFP85gtsWcorTznR2DFeQb-9yCLZ4,6772
|
|
944
945
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/database_discovery/auto_discovery.py,sha256=m-LFznTdM581n7xkisamzHIQZ3fEiY9RPKd4wzB6wYo,978
|
|
945
946
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/db_debug/db_debug.py,sha256=ctcwksnM89597LUAme5Sn044r-xgRh47wSSe3MioPH4,3259
|
|
946
|
-
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/system/SAFRSBaseX.py,sha256=
|
|
947
|
+
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/system/SAFRSBaseX.py,sha256=Sx3191vMs8ochEv48AnvB-xsKZU8zSuCfPvbZ4qXEMY,5392
|
|
947
948
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/test_data/alp_init.py,sha256=C7yqHB7KoOgwvzRsI3DVk9O_QHPu4SYioChv0Jz5xXY,1203
|
|
948
949
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/test_data/readme.md,sha256=IDKVMagnjobf5IigYCkQkUMM_iLvBdhK9grMNImSOKg,694
|
|
949
950
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/test_data/response2code.py,sha256=PTeAXHU-r6r0EBknSGXnbkdySAAzch_3gOuRlyUyVF8,4414
|
|
@@ -983,6 +984,7 @@ api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/devops/keycloa
|
|
|
983
984
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/devops/keycloak/unused/auth_provider.py,sha256=e8PoH9Ck4nrMe-QY99Lh0G02gzn2ubnMauFVEpNbeQ8,2771
|
|
984
985
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/devops/keycloak/unused/unused-docker-compose-keycloak.sh,sha256=YvYRD4ID8v7znslXKOlzu3hpN17h0O_zwGPkFYy1G20,353
|
|
985
986
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/devops/python-anywhere/python_anywhere_wsgi.py,sha256=CAvz31yoXUwNl6ZKtKA6cflJMPFZcFFvDic3VIOBxyc,3889
|
|
987
|
+
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/docs/MCP-DB.png,sha256=FIQ-gjUQYw2NiRM3NzyDGHXAk-Y3rMBo0oduqOZ0OEg,26745
|
|
986
988
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/docs/db.dbml,sha256=ddG3q_CxcbjbQ61CbqK5OT5YEhTRBVf9pyQlRrqi_YQ,875
|
|
987
989
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/docs/models-not-code.png,sha256=XvndgzHphsAbpxfV1D5q8XvJfjK8NVHwDWj59HuQ1Ic,381811
|
|
988
990
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/docs/runtime engines.png,sha256=l9OCqVXZuALVhPQEBERtZDFdqgqojixm66cIKSZyNj0,105414
|
|
@@ -1033,7 +1035,7 @@ api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/load_ver
|
|
|
1033
1035
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/readme_logic.md,sha256=teXyg9-7b-1OAj_kLC7gQ37zNllTRFnovdq2LGsyg6E,10178
|
|
1034
1036
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/logic_discovery/app_integration.py,sha256=wy8MXTKbYRhv-N5Jm5Q-mW4UtFrk6Q2y1ZeGbUoUVas,863
|
|
1035
1037
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/logic_discovery/auto_discovery.py,sha256=m97W6DYi6ouTDuFCiU1rPq1UqzJuNnVePyOeLU33D1s,2645
|
|
1036
|
-
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/logic_discovery/check_credit.py,sha256=
|
|
1038
|
+
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/logic_discovery/check_credit.py,sha256=GnWg3OZVZWo09EFRvnzjuLwaQXrHbmjmIeaKu6wAIt8,1687
|
|
1037
1039
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/logic_discovery/mcp_client_executor_request.py,sha256=X6jlA_xcR7RpbFgc5uY5yDFTCKp0eGHnVubIT2M0AbU,2184
|
|
1038
1040
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/logic_discovery/readme_logic_discovery.md,sha256=SRg3Hrq3vCjqtAL1XijcbPGvfLLgkqsODLtIKfZUEaI,396
|
|
1039
1041
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/logic_discovery/use_case.py,sha256=M3TQZwBaAtgEyNjP_Hl8s35x_zEpzpnIrtxmD7sL1NY,916
|
|
@@ -2615,7 +2617,7 @@ api_logic_server_cli/prototypes/ont_app/ontimize_seed/docker-compose-ontimize.ym
|
|
|
2615
2617
|
api_logic_server_cli/prototypes/ont_app/ontimize_seed/karma.conf.js,sha256=Q7cZOkcrjCTxX69D5MqQ3PI8eTP0nxV36fIDu_xGylM,1037
|
|
2616
2618
|
api_logic_server_cli/prototypes/ont_app/ontimize_seed/ngsw-config.json,sha256=glcgrz-2KB2haUlGFyjmobH1kKAq5ZWf1xoAOyOWJ9w,620
|
|
2617
2619
|
api_logic_server_cli/prototypes/ont_app/ontimize_seed/package-lock.json,sha256=G7q3FYtAH9VX1p8fMIJvC9Ot7hnOur980ersbTXnEss,577163
|
|
2618
|
-
api_logic_server_cli/prototypes/ont_app/ontimize_seed/package.json,sha256=
|
|
2620
|
+
api_logic_server_cli/prototypes/ont_app/ontimize_seed/package.json,sha256=NP8Y2PpT5Owaq-ciYOXPh7f6BssZQHaBzwUekQz33e8,2262
|
|
2619
2621
|
api_logic_server_cli/prototypes/ont_app/ontimize_seed/tsconfig.app.json,sha256=hyYKRbyu1xs_xaJGVOPu5jcEek2oP8DMIeKN5X6Yla0,272
|
|
2620
2622
|
api_logic_server_cli/prototypes/ont_app/ontimize_seed/tsconfig.json,sha256=gx_giKrzvilZmNVRkJ0LYQPBQCIgYbSIfQwQx5yXQbk,568
|
|
2621
2623
|
api_logic_server_cli/prototypes/ont_app/ontimize_seed/tsconfig.spec.json,sha256=vV38h43m3prBlu4Wm_e2ZSYh6eV1vZayMH6zeU8PTcM,270
|
|
@@ -2872,9 +2874,9 @@ api_logic_server_cli/tools/mini_skel/database/system/SAFRSBaseX.py,sha256=p8C7AF
|
|
|
2872
2874
|
api_logic_server_cli/tools/mini_skel/database/system/TestDataBase.py,sha256=U02SYqThsbY5g3DX7XGaiMxjZBuOpzvtPS6RfI1WQFg,371
|
|
2873
2875
|
api_logic_server_cli/tools/mini_skel/logic/declare_logic.py,sha256=fTrlHyqMeZsw_TyEXFa1VlYBL7fzjZab5ONSXO7aApo,175
|
|
2874
2876
|
api_logic_server_cli/tools/mini_skel/logic/load_verify_rules.py,sha256=Rr5bySJpYCZmNPF2h-phcPJ53nAOPcT_ohZpCD93-a0,7530
|
|
2875
|
-
apilogicserver-16.0.
|
|
2876
|
-
apilogicserver-16.0.
|
|
2877
|
-
apilogicserver-16.0.
|
|
2878
|
-
apilogicserver-16.0.
|
|
2879
|
-
apilogicserver-16.0.
|
|
2880
|
-
apilogicserver-16.0.
|
|
2877
|
+
apilogicserver-16.0.5.dist-info/licenses/LICENSE,sha256=67BS7VC-Z8GpaR3wijngQJkHWV04qJrwQArVgn9ldoI,1485
|
|
2878
|
+
apilogicserver-16.0.5.dist-info/METADATA,sha256=_ChrME40ux4Z4SGn5gXiiRXOYp-yYRnQqvnkiuwquoY,26401
|
|
2879
|
+
apilogicserver-16.0.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
2880
|
+
apilogicserver-16.0.5.dist-info/entry_points.txt,sha256=W9EVNvf09h8n6rJChmVj2gzxVQ6BXXZa2x3wri0lFGc,259
|
|
2881
|
+
apilogicserver-16.0.5.dist-info/top_level.txt,sha256=-r0AT_GEApleihg-jIh0OMvzzc0BO1RuhhOpE91H5qI,21
|
|
2882
|
+
apilogicserver-16.0.5.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|