ApiLogicServer 14.5.3__py3-none-any.whl → 14.5.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.
@@ -12,10 +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__ = "14.05.03" # last public release: 14.04.00
15
+ __version__ = "14.05.04" # last public release: 14.05.00
16
16
  recent_changes = \
17
17
  f'\n\nRecent Changes:\n' +\
18
- "\t05/19/2024 - 14.05.03: mcp filters with working date range (AND), email stub, use basic_demo custs for genai_demo \n"\
18
+ "\t05/20/2024 - 14.05.04: factored mcp filters with working date range (AND), email stub, use basic_demo custs for genai_demo \n"\
19
19
  "\t05/16/2024 - 14.05.00: safrs 3.1.7, running mcp preview \n"\
20
20
  "\t04/27/2024 - 14.04.00: Graphics preview, Vibe install fix, Improved IDE Chat Logic, MCP Exploration \n"\
21
21
  "\t03/30/2024 - 14.03.25: WebGenAI fixes for Kafka and Keycloak \n"\
@@ -1,3 +1,3 @@
1
- last_created_date: May 18, 2025 16:45:45
1
+ last_created_date: May 20, 2025 15:00:15
2
2
  last_created_project_name: ../../../servers/basic_demo
3
- last_created_version: 14.05.02
3
+ last_created_version: 14.05.03
@@ -74,6 +74,9 @@ class DBMLCreator(object):
74
74
  "tool_type": "json-api",
75
75
  "schema_version": "1.0",
76
76
  "base_url": "http://localhost:5656/api",
77
+ "query_params": "- JSON:API custom filtering using a filter array (e.g., filter=[{\"name\":\"date_shipped\",\"op\":\"gt\",\"val\":\"2023-07-14\"}])",
78
+ "expected_response": "Respond with a JSON object with tool_type, schema_version, base_url, and an array of resources including: path, method, query_params array or body, headers, expected_output.",
79
+ "email_services": "iff email is requested, Send email by issing a POST request to the Email endpoint, setting the customer_id and message in the body.",
77
80
  "description": f"API Logic Project: {self.mod_gen.project.project_name_last_node}",
78
81
  "resources": [
79
82
  ]
@@ -62,49 +62,6 @@ def add_service(app, api, project_dir, swagger_host: str, PORT: str, method_deco
62
62
  pass
63
63
 
64
64
 
65
- @app.route('/mcp_server_executor', methods=['GET'])
66
- def mcp_server_executor(path=None):
67
- ''' sample response printed in mcp_client_executor.py:
68
- FIXME - incorrect.
69
- But do provide: https://localhost:5656/.well-known/mcp.json
70
- ```
71
- MCP MCP Response (simulated):
72
- {
73
- "get_json": {
74
- "filter": {
75
- "filter": {
76
- "credit_limit": {
77
- "gt": 4000
78
- }
79
- },
80
- "headers": {
81
- "Accept": "application/vnd.api+json",
82
- "Authorization": "Bearer your_token"
83
- },
84
- "type": "Customer",
85
- "url": "http://localhost:5656/api/Customer"
86
- }
87
- },
88
- "name": "mcp_server_executor",
89
- "openapiUrl": "TUNNEL_URL/api/openapi.json",
90
- "serverUrl": "TUNNEL_URL/api"
91
- }
92
- ```
93
- '''
94
- get_json = request.get_json()
95
- app_logger.info(f"mcp_server_executor sees mcp request: \n{json.dumps(get_json, indent=4)}")
96
-
97
- # process verb, filter here (stub for now)
98
- filter_json = get_json['filter'] # {"credit_limit": {"gt": 4000}} # todo: bunch'o parsing here
99
-
100
- filter_json = {"name": "credit_limit", "op": "gt", "val":4000} # https://github.com/thomaxxl/safrs/wiki/JsonApi-filtering
101
- filter = json.dumps(filter_json) # {"name": "credit_limit", "op": "gt", "val": 4000}
102
- get_uri = get_json['url'] + '?filter=' + filter # get_uri = "http://localhost:5656/api/Customer?filter[credit_limit]=1000"
103
- response = requests.get(url=get_uri, headers= request.headers)
104
-
105
- return response.json(), 200, {'Content-Type': 'application/json; charset=utf-8'}
106
-
107
-
108
65
  @app.route('/.well-known/mcp.json', methods=['GET'])
109
66
  def mcp_discovery(path=None):
110
67
  ''' called by mcp_client_executor for discovery, eg:
@@ -118,7 +118,10 @@ class SAFRSBaseX(SAFRSBase, safrs.DB.Model):
118
118
  op = getattr(operator, op_name)
119
119
  expressions.append(op(attr, attr_val))
120
120
 
121
- return query.filter(operator.and_(*expressions))
121
+ if len(filters) > 1:
122
+ return query.filter(operator.and_(*expressions))
123
+ else:
124
+ return query.filter(*expressions)
122
125
 
123
126
 
124
127
  class TestBase(Base):
@@ -10,12 +10,6 @@ Notes:
10
10
  * See: integration/mcp/README_mcp.md
11
11
  * python api_logic_server_run.py
12
12
 
13
- ToDo - email example is incomplete:
14
- 1. Add email event handler (ala nw_sample/logic/declare_logic.py#send_n8n_message())
15
- 2. And, respect the customer email_opt_out
16
- 3. Needs to use date range
17
- 4. Data incomplete
18
-
19
13
  """
20
14
 
21
15
  import json
@@ -85,35 +79,19 @@ def discover_mcp_servers():
85
79
 
86
80
  def get_user_nl_query():
87
81
  """ Get the natural language query from the user.
82
+ Add instructions for the LLM to generate a tool context block.
88
83
 
89
84
  """
90
85
 
91
86
  global test_type
92
87
 
93
- default_request = "List the orders created more than 30 days ago, and send a discount email to the customer for each one."
94
- # eg, curl -qg 'http://localhost:5656/api/Order?filter=[{"name":"date_shipped","op":"gt","val":"2023-07-14"}]'
95
- # eg, curl -qg 'http://localhost:5656/api/Order?filter=[{"name":"date_shipped","op":"eq","val":null}]'
96
- # eg, curl -qg 'http://localhost:5656/api/Order?filter=[{"name":"date_shipped","op":"eq","val":null},{"name":"CreatedOn","op":"lt","val":"2023-07-14"}]'
97
- # eg, curl -qg 'http://localhost:5656/api/Customer?filter=[{"name":"credit_limit","op":"gt","val":"1000"}]'
98
-
99
- # curl -qg 'http://localhost:5656/api/Order?filter=[{"name":%20"date_shipped",%20"op":%20"eq",%20"val":%20null},%20{"name":%20"CreatedOn",%20"op":%20"lt",%20"val":%20"2023-07-14"}]'
100
-
101
- default_request = "List the orders for customer 5, and send a discount email to the customer for each one."
102
- default_request = "List the unshipped orders created before 2023-07-14, and send a discount email to the customer for each one."
103
-
104
- if test_type != 'orchestration':
105
- default_request = "List customers with credit over 1000"
106
-
107
- query = sys.argv[1] if len(sys.argv) > 1 else default_request
108
-
109
- query += """
110
- Respond with a JSON array of tool context blocks using:
111
- - tool: 'json-api'
112
- - JSON:API custom filtering (e.g., filter=[{"name":"date_shipped","op":"gt","val":"2023-07-14"}])
113
- - Use {{ order.customer_id }} as a placeholder in the second step.
114
- - Include method, url, query_params or body, headers, expected_output.
115
- """
116
- return query
88
+ if len(sys.argv) > 1 and sys.argv[1] != 'go':
89
+ request = sys.argv[1]
90
+ else:
91
+ request = "List the unshipped orders created before 2023-07-14, and send a discount email to the customer for each one."
92
+ if test_type != 'orchestration':
93
+ request = "List customers with credit over 1000"
94
+ return request
117
95
 
118
96
 
119
97
  def query_llm_with_nl(nl_query):
@@ -138,14 +116,17 @@ def query_llm_with_nl(nl_query):
138
116
 
139
117
  # setup default tool_context to bypass LLM call and save 2-3 secs in testing
140
118
  if test_type == 'orchestration': # orchestration: emails to pending orders
119
+
141
120
  tool_context = \
142
- [
143
- {
144
- "tool": "json-api",
145
- "method": "GET",
146
- "url": "http://localhost:5656/api/Order",
147
- "query_params": {
148
- "filter": [
121
+ {
122
+ "tool_type": "json-api",
123
+ "schema_version": "1.0",
124
+ "base_url": "http://localhost:5656/api",
125
+ "resources": [
126
+ {
127
+ "path": "/Order",
128
+ "method": "GET",
129
+ "query_params": [
149
130
  {
150
131
  "name": "date_shipped",
151
132
  "op": "eq",
@@ -156,46 +137,42 @@ def query_llm_with_nl(nl_query):
156
137
  "op": "lt",
157
138
  "val": "2023-07-14"
158
139
  }
159
- ]
160
- },
161
- "headers": {
162
- "Content-Type": "application/json"
140
+ ],
141
+ "headers": [],
142
+ "expected_output": []
163
143
  },
164
- "expected_output": "JSON array of unshipped orders created before 2023-07-14"
165
- },
166
- {
167
- "tool": "email",
168
- "method": "POST",
169
- "url": "http://localhost:5656/api/sendEmail",
170
- "body": {
171
- "customer_id": "{{ order.customer_id }}",
172
- "subject": "Discount Offer",
173
- "message": "You have a new discount offer for your unshipped order."
174
- },
175
- "headers": {
176
- "Content-Type": "application/json"
177
- },
178
- "expected_output": "Confirmation of email sent"
179
- }
180
- ]
181
- else: # simple get request - list customers with credit over 4000
144
+ {
145
+ "path": "/Email",
146
+ "method": "POST",
147
+ "body": {
148
+ "customer_id": "{{ order.customer_id }}",
149
+ "message": "You have a discount on your unshipped order."
150
+ },
151
+ "headers": [],
152
+ "expected_output": []
153
+ }
154
+ ]
155
+ }
156
+ else: # simple get request - list customers with credit over 1000
182
157
  tool_context = \
183
- [
184
- {
185
- "tool": "json-api",
186
- "method": "GET",
187
- "url": "http://localhost:5656/api/Customer",
188
- "query_params": {
189
- "filter[credit_limit][gt]": 1000
190
- },
191
- "headers": {
192
- "Content-Type": "application/vnd.api+json"
193
- },
194
- "expected_output": "JSON array of customers with credit limit over 1000"
195
- }
196
- ]
197
-
198
- # Call the OpenAI API to generate the tool context
158
+ {
159
+ "tool_type": "json-api",
160
+ "schema_version": "1.0",
161
+ "base_url": "http://localhost:5656/api",
162
+ "resources": [
163
+ {
164
+ "path": "/Customer",
165
+ "method": "GET",
166
+ "query_params": [
167
+ {
168
+ "name": "credit_limit",
169
+ "op": "gt",
170
+ "val": "1000"
171
+ }
172
+ ]
173
+ }
174
+ ]
175
+ } # Call the OpenAI API to generate the tool context
199
176
  if create_tool_context_from_llm: # saves 2-3 seconds...
200
177
  response = openai.chat.completions.create(
201
178
  model="gpt-4",
@@ -204,13 +181,17 @@ def query_llm_with_nl(nl_query):
204
181
  )
205
182
 
206
183
  tool_context_str = response.choices[0].message.content
184
+ tool_context_str_no_cr = tool_context_str.replace("\n", '') # convert single quotes to double quotes
207
185
  try:
208
- tool_context = json.loads(tool_context_str)
186
+ tool_context = json.loads(tool_context_str_no_cr)
209
187
  except json.JSONDecodeError:
210
188
  print("Failed to decode JSON from response:", tool_context_str)
211
189
  return None
212
190
 
213
- print("\n2. generated tool context from LLM:\n", json.dumps(tool_context, indent=4))
191
+ print("\n\n2a. LLM request:\n", json.dumps(messages, indent=4))
192
+ print("\n2b. NL Query:\n", nl_query)
193
+ print("\n2c. schema_text: \n", json.dumps(json.loads(schema_text), indent=4)) #schema_text[0:100])
194
+ print("\n2d. generated tool context from LLM:\n", json.dumps(tool_context, indent=4))
214
195
  return tool_context
215
196
 
216
197
 
@@ -232,104 +213,81 @@ def process_tool_context(tool_context):
232
213
  def get_query_param_filter(query_params):
233
214
  """ return json:api filter
234
215
 
235
- see api_logic_server_cli/prototypes/base/api/system/expression_parser.py (doc?)
236
-
237
216
  eg
238
- curl -qg 'http://localhost:5656/api/Order?filter=[{"name":"date_shipped","op":"eq","val":null},{"name":"CreatedOn","op":"gt","val":"2023-07-14"}]'
217
+ curl -qg 'http://localhost:5656/api/Order?filter=[{"name":"date_shipped","op":"eq","val":null},{"name":"CreatedOn","op":"lt","val":"2023-07-14"}]'
218
+
219
+ curl -qg 'http://localhost:5656/api/Order?filter=[{"name":"date_shipped","op":"gt","val":"2023-07-14"}]'
220
+ curl -qg 'http://localhost:5656/api/Order?filter=[{"name":"date_shipped","op":"eq","val":null}]'
221
+ curl -qg 'http://localhost:5656/api/Customer?filter=[{"name":"credit_limit","op":"gt","val":"1000"}]'
239
222
 
240
223
  query_params might be simple:
241
- "query_params": {
242
- "filter[credit_limit][gt]": 1000 }
224
+ "query_params": [ {"name": "credit_limit", "op": "gt", "val": "1000"} ]
243
225
  ==> ?filter=[{"name":"credit_limit","op":"gt","val":"1000"}]
226
+
244
227
  or a list:
245
- "query_params": {
246
- "filter": [
247
- {
248
- "name": "date_shipped",
249
- "op": "eq",
250
- "val": null
251
- },
252
- {
253
- "name": "date_created",
254
- "op": "lt",
255
- "val": "2023-07-14"
256
- }
257
- ]
258
- },
228
+ "query_params": [
229
+ {
230
+ "name": "date_shipped",
231
+ "op": "eq",
232
+ "val": None
233
+ },
234
+ {
235
+ "name": "date_created",
236
+ "op": "lt",
237
+ "val": "2023-07-14"
238
+ }
239
+ ],
240
+
259
241
  """
260
242
 
261
243
  added_rows = 0
262
244
 
263
245
  query_param_filter = ''
264
- if isinstance(query_params, dict):
265
- if "filter" not in query_params: # simple - "query_params": {"filter[credit_limit][gt]": 1000 }
266
- for each_key, each_value in query_params.items():
267
- assert not isinstance(each_value, dict), "Unexpected dict in simple query_params"
268
- # convert {"filter[credit_limit][gt]": 1000 } to ?filter=[{"name":"credit_limit","op":"gt","val":"1000"}]
269
- match = re.match(r"filter\[(\w+)\]\[(\w+)\]", each_key)
270
- if match:
271
- name, op = match.groups()
272
- filter_json = json.dumps([{"name": name, "op": op, "val": str(each_value)}])
273
- query_param_filter += f"&filter={filter_json}"
274
- else:
275
- query_param_filter += f"&{each_key}={each_value}"
276
-
277
- else: # complex - "query_params": {"filter": ...
278
- assert isinstance(query_params["filter"], list), "Query Params filter expected to be a list"
279
- query_param_filter = 'filter=' + str(query_params["filter"])
280
- # use urlencode to convert to JSON:API format...
281
- # val urllib.parse.quote() or urllib.parse.urlencode()
282
- # tool instructions... filtering, email etc
283
- query_param_filter = query_param_filter.replace("'", '"') # convert single quotes to double quotes
284
- query_param_filter = query_param_filter.replace("None", 'null')
285
- query_param_filter = query_param_filter.replace("date_created", 'CreatedOn') # TODO - why this name?
286
- # query_params = ''
287
- else:
288
- assert False, "Query Params not a dict"
289
- return query_param_filter
290
-
291
-
292
- if isinstance(tool_context, dict):
293
- query_params = tool_context["query_params"]
294
- query_param_filter = get_query_param_filter(query_params)
295
- mcp_response = requests.get(
296
- tool_context["url"],
297
- headers=tool_context["headers"],
298
- params=query_param_filter
299
- )
300
- elif isinstance(tool_context, list):
301
- context_data = {}
302
- added_rows = 0
303
-
304
- for each_block in tool_context:
305
- if each_block["tool"] in ["json-api", "email"]:
306
- if each_block["method"] == "GET":
307
- query_param_filter = get_query_param_filter(each_block["query_params"])
308
- mcp_response = requests.get(
309
- url = each_block["url"],
310
- headers=each_block["headers"],
311
- params=query_param_filter
246
+ assert isinstance(query_params, list), "Query Params filter expected to be a list"
247
+ query_param_filter = 'filter=' + str(query_params)
248
+ # use urlencode to convert to JSON:API format...
249
+ # val urllib.parse.quote() or urllib.parse.urlencode()
250
+ # tool instructions... filtering, email etc
251
+ query_param_filter = query_param_filter.replace("'", '"') # convert single quotes to double quotes
252
+ query_param_filter = query_param_filter.replace("None", 'null')
253
+ query_param_filter = query_param_filter.replace("date_created", 'CreatedOn') # TODO - why this name?
254
+ return query_param_filter # end get_query_param_filter
255
+
256
+ assert isinstance(tool_context, (dict, list)), "Tool context expected to be a dictionary"
257
+ context_data = {}
258
+ added_rows = 0
259
+
260
+ for each_block in tool_context["resources"]:
261
+ if True: # TODO - add check for "tool": "json-api"
262
+ if each_block["method"] == "GET":
263
+ query_param_filter = get_query_param_filter(each_block["query_params"])
264
+ headers = {"Content-Type": "application/vnd.api+json"}
265
+ if "headers" in each_block:
266
+ headers.update(each_block["headers"])
267
+ mcp_response = requests.get(
268
+ url = tool_context["base_url"] + each_block["path"],
269
+ headers=headers,
270
+ params=query_param_filter
271
+ )
272
+ context_data = mcp_response.json()['data'] # result rows...
273
+ elif each_block["method"] in ["POST"]:
274
+ for each_order in context_data:
275
+ url = tool_context["base_url"] + each_block["path"]
276
+ json_update_data = { 'data': {"type": "Email", 'attributes': {} } }
277
+ json_update_data_attributes = json_update_data["data"]["attributes"]
278
+ json_update_data_attributes["customer_id"] = context_data[0]['attributes']["customer_id"] # TODO - fix
279
+ json_update_data_attributes["message"] = each_block["body"]["message"]
280
+ # eg: POST http://localhost:5656/api/Email {'data': {'type': 'Email', 'attributes': {'customer_id': 5, 'message': {'to': '{{ order.customer_id }}', 'subject': 'Discount for your order', 'body': 'Dear customer, you have a discount for your recent order. Thank you for shopping with us.'}}}}
281
+ headers = {"Content-Type": "application/vnd.api+json"}
282
+ if "headers" in each_block:
283
+ headers.update(each_block["headers"])
284
+ mcp_response = requests.post(
285
+ url=url,
286
+ headers=headers,
287
+ json=json_update_data
312
288
  )
313
- context_data = mcp_response.json()['data'] # result rows...
314
- elif each_block["method"] in ["POST"]:
315
- for each_order in context_data:
316
- url = each_block["url"]
317
- url = url.replace("sendEmail", "Email") # TODO name fix
318
- json_update_data = { 'data': {"type": "Email", 'attributes': {} } }
319
- json_update_data_attributes = json_update_data["data"]["attributes"]
320
- json_update_data_attributes["customer_id"] = context_data[0]['attributes']["customer_id"] # TODO - fix
321
- json_update_data_attributes["message"] = each_block["body"]["message"]
322
- # eg: POST http://localhost:5656/api/Email {'data': {'type': 'Email', 'attributes': {'customer_id': 5, 'message': {'to': '{{ order.customer_id }}', 'subject': 'Discount for your order', 'body': 'Dear customer, you have a discount for your recent order. Thank you for shopping with us.'}}}}
323
- mcp_response = requests.post(
324
- url=url,
325
- headers=each_block["headers"],
326
- json=json_update_data
327
- )
328
- added_rows += 1
329
- pass
330
- else:
331
- print("Invalid tool context format. Expected a dictionary or a list.")
332
- return None
289
+ added_rows += 1
290
+ pass
333
291
  print("\n3. MCP Server (als) Response:\n", mcp_response.text)
334
292
  if added_rows > 0:
335
293
  print(f"...Added {added_rows} rows to the database; last row (only) shown above.")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ApiLogicServer
3
- Version: 14.5.3
3
+ Version: 14.5.4
4
4
  Author-email: Val Huber <apilogicserver@gmail.com>
5
5
  License: BSD-3-Clause
6
6
  Project-URL: Homepage, https://www.genai-logic.com
@@ -1,6 +1,6 @@
1
1
  api_logic_server_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- api_logic_server_cli/api_logic_server.py,sha256=MDpVrep3II9xFrADlAdbhN0nuGW2WYURxfzD78llVk4,103450
3
- api_logic_server_cli/api_logic_server_info.yaml,sha256=ae2s1H47bWBmuYY5QuWLXIyhLGUoUR90HLRGjnWrxf0,127
2
+ api_logic_server_cli/api_logic_server.py,sha256=OHqr-j3QJ8Tb1EoZ7VsVC2vaDBdHB0dE9HTm38k4syk,103459
3
+ api_logic_server_cli/api_logic_server_info.yaml,sha256=IvDL2v5t7-wMjc9LnmowvQ-HYvLcY0WAmYNmMp3WfIg,127
4
4
  api_logic_server_cli/cli.py,sha256=AT1cWszOygHWIbpxDoXFhaTeSai3Tf5SbGoXvN4h510,83134
5
5
  api_logic_server_cli/cli_args_base.py,sha256=lr27KkOB7_WpZwTs7LgiK8LKDIHMKQkoZCTnE99BFxw,3280
6
6
  api_logic_server_cli/cli_args_project.py,sha256=I5no_fGRV_ZsK3SuttVDAaQYI4Q5zCjx6LojGkM024w,4645
@@ -13,7 +13,7 @@ api_logic_server_cli/create_from_model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JC
13
13
  api_logic_server_cli/create_from_model/api_expose_api_models_creator.py,sha256=V-u3Hm404doztw66YuD2A043RCFmtw5QF5tMioC_1b0,7900
14
14
  api_logic_server_cli/create_from_model/api_logic_server_utils.py,sha256=64rPLahX-FUu_1AhZlpHf4ljjWnQsYP0g-Ikhjd5pO8,25863
15
15
  api_logic_server_cli/create_from_model/create_db_from_model.py,sha256=2H7slGnk39XOSnvL7vxrg6Ewx4bxeBJBgLo8fcXHTB4,4382
16
- api_logic_server_cli/create_from_model/dbml.py,sha256=fuNWpoRXh1V9VznUM4gLO6Wrs4Ul5jnta7cXMzrdnzI,10971
16
+ api_logic_server_cli/create_from_model/dbml.py,sha256=mNI0ga6e9paPOodt1Ora5wKOuOQT4-yPaECnud-9WGc,11520
17
17
  api_logic_server_cli/create_from_model/meta_model.py,sha256=ERf7tSgnSJSeRMVyggkdg-lvORQZSbfK0KMpL63qSEY,5837
18
18
  api_logic_server_cli/create_from_model/model_creation_services.py,sha256=B86ljgUR98H_dCaxqiw-flrbvc05-XXtkC5It2BSezs,41479
19
19
  api_logic_server_cli/create_from_model/ont_build.py,sha256=5BcmM0xW-0vjr9J_u1o0_3joLfKhcLeDWP31dcy5dzI,67028
@@ -24,7 +24,7 @@ api_logic_server_cli/create_from_model/__pycache__/__init__.cpython-312.pyc,sha2
24
24
  api_logic_server_cli/create_from_model/__pycache__/api_expose_api_models_creator.cpython-312.pyc,sha256=3wtCiVHOjOgIonZOgnCsF2p01zcXIapx1_Tq2LwzY6Q,6989
25
25
  api_logic_server_cli/create_from_model/__pycache__/api_logic_server_utils.cpython-312.pyc,sha256=oaOOqBJogGZdW5nVn93zqOY552sumaX5fGANDN42eCQ,26691
26
26
  api_logic_server_cli/create_from_model/__pycache__/create_db_from_model.cpython-312.pyc,sha256=5eE8pIEa-OoUOk0xn_b78cCc9dSmxjTMn3HGJbxbFY4,4799
27
- api_logic_server_cli/create_from_model/__pycache__/dbml.cpython-312.pyc,sha256=8kXgynb1JC1EXsPhVIFTDwP70FyxN3GYiPV3Vgb-EzQ,11926
27
+ api_logic_server_cli/create_from_model/__pycache__/dbml.cpython-312.pyc,sha256=MBYbBeyx-uApkD5Nyz1NDWdRoH6QDuEjvKDMaEiGCz4,12418
28
28
  api_logic_server_cli/create_from_model/__pycache__/meta_model.cpython-312.pyc,sha256=BH5Cflj8YKf0CVkHpIZ_3eBbHXhwIWbwsrzM7DsEikE,7098
29
29
  api_logic_server_cli/create_from_model/__pycache__/model_creation_services.cpython-312.pyc,sha256=_pJPTvkJL22Eu1BWM48VfXcyapD366OnXBqHGn-wtO0,36462
30
30
  api_logic_server_cli/create_from_model/__pycache__/ont_build.cpython-312.pyc,sha256=Hni6k7GidAkkz-YO2kvmQOMYdCdCWvGWxX3HIPjj1eE,75285
@@ -691,17 +691,17 @@ api_logic_server_cli/prototypes/base/venv_setup/venv.ps1,sha256=_-LfKkLw5HOkZsF5
691
691
  api_logic_server_cli/prototypes/base/venv_setup/venv.sh,sha256=aWX9fa8fe6aO9ifBIZEgGY5UGh4I0arOoCwBzDsxgU8,893
692
692
  api_logic_server_cli/prototypes/basic_demo/README.md,sha256=COAWgXJGu0Xn6BHTeLyn9I39xcYHCKBslix7L2Xrodw,13487
693
693
  api_logic_server_cli/prototypes/basic_demo/customizations/api/.DS_Store,sha256=6F7pphfwiMhILhl_J6yVhDZFYXmar5V92iLCzSkfnyA,6148
694
- api_logic_server_cli/prototypes/basic_demo/customizations/api/api_discovery/mcp_discovery.py,sha256=C_uOn3QlFVF2OYRs2oAQEpCnjUWpZ9J8WKJUClnXIcw,5589
694
+ api_logic_server_cli/prototypes/basic_demo/customizations/api/api_discovery/mcp_discovery.py,sha256=mj9TCcijmjpkEE1MyCy-pWF4W5YZqgwuzPE_I-OgEuM,3738
695
695
  api_logic_server_cli/prototypes/basic_demo/customizations/api/api_discovery/openapi.py,sha256=kLQ7Fn1J7tzuNJHBXF2AiwtzvQ-0JxJ6z-MfFryAtLk,3887
696
696
  api_logic_server_cli/prototypes/basic_demo/customizations/config/default.env,sha256=-rjXJrjR4vjMr9YCVYVchaJw7qMBlbvQ3KfR_wri_XM,412
697
697
  api_logic_server_cli/prototypes/basic_demo/customizations/config/server_setup.py,sha256=bV48ou0jSEm2o5yhTVgms1w7rqU9Ccf_2yfZip3ivJk,15441
698
698
  api_logic_server_cli/prototypes/basic_demo/customizations/database/db.sqlite,sha256=VAhzjdz9_LTQNE6lVprZuliyHBGjQOggulM099cinSQ,24576
699
699
  api_logic_server_cli/prototypes/basic_demo/customizations/database/models.py,sha256=Hi4m_ivLPE3i2HNfC-rXEADE_toWBHcLelYAQBzV_oA,4499
700
- api_logic_server_cli/prototypes/basic_demo/customizations/database/system/SAFRSBaseX.py,sha256=8OBZT1rsTsLbCpgvE8AxC-GTOmXzaN7MwmjssNvOhlE,5284
700
+ api_logic_server_cli/prototypes/basic_demo/customizations/database/system/SAFRSBaseX.py,sha256=RbYTrB5X-WvsqXQRjl0gk4KvUziRLU7hbljlIzd_N3g,5377
701
701
  api_logic_server_cli/prototypes/basic_demo/customizations/integration/.DS_Store,sha256=nfyHG63vXNerWIrSwk76tTujqqB25mRZZZ04VJmxlCQ,6148
702
702
  api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
703
703
  api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/README_mcp.md,sha256=ZXLgtvqQCcGouxFE_7pu6OA3Qu1Qm3Jh-gcQxuFKb_w,1216
704
- api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/mcp_client_executor.py,sha256=-2-IAJpn559uiuEjOq0In6jeZ_RzyAjK8vKNPHG3vEo,15328
704
+ api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/mcp_client_executor.py,sha256=xvjsT90ADAE3CgH6rRkIudl6n1dLzIQ92y7VyDQjKhg,12906
705
705
  api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/mcp_schema.txt,sha256=qmov7e0NdYiQTCxNJU2xzxf9HnYeXFej-c8GSB-y6MM,1143
706
706
  api_logic_server_cli/prototypes/basic_demo/customizations/integration/mcp/mcp_server_discovery.json,sha256=TUyInb67AWoGw7XFE9iDZxmM8UEID-ahQmdmzpF9AmQ,188
707
707
  api_logic_server_cli/prototypes/basic_demo/customizations/integration/openai_function/3_executor_test_agent.py,sha256=vH-3wJvQE99LDt9ID3wWtVw1EOv8yJJNipPGgYINAus,1251
@@ -6092,9 +6092,9 @@ api_logic_server_cli/tools/mini_skel/database/system/SAFRSBaseX.py,sha256=p8C7AF
6092
6092
  api_logic_server_cli/tools/mini_skel/database/system/TestDataBase.py,sha256=U02SYqThsbY5g3DX7XGaiMxjZBuOpzvtPS6RfI1WQFg,371
6093
6093
  api_logic_server_cli/tools/mini_skel/logic/declare_logic.py,sha256=fTrlHyqMeZsw_TyEXFa1VlYBL7fzjZab5ONSXO7aApo,175
6094
6094
  api_logic_server_cli/tools/mini_skel/logic/load_verify_rules.py,sha256=Rr5bySJpYCZmNPF2h-phcPJ53nAOPcT_ohZpCD93-a0,7530
6095
- apilogicserver-14.5.3.dist-info/licenses/LICENSE,sha256=67BS7VC-Z8GpaR3wijngQJkHWV04qJrwQArVgn9ldoI,1485
6096
- apilogicserver-14.5.3.dist-info/METADATA,sha256=4qOWJhc-99yDNepZGK9-ca-1PBQwTBag6IQbkyEc8Ho,6524
6097
- apilogicserver-14.5.3.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
6098
- apilogicserver-14.5.3.dist-info/entry_points.txt,sha256=KiLloZJ3c_RW-nIDqBtoE0WEsQTnZ3dELwHLWi23LMA,103
6099
- apilogicserver-14.5.3.dist-info/top_level.txt,sha256=-r0AT_GEApleihg-jIh0OMvzzc0BO1RuhhOpE91H5qI,21
6100
- apilogicserver-14.5.3.dist-info/RECORD,,
6095
+ apilogicserver-14.5.4.dist-info/licenses/LICENSE,sha256=67BS7VC-Z8GpaR3wijngQJkHWV04qJrwQArVgn9ldoI,1485
6096
+ apilogicserver-14.5.4.dist-info/METADATA,sha256=o8jWHHSSx1vHUi4gHUrrvTT6ckmIkrvQbiXR_UFAOEc,6524
6097
+ apilogicserver-14.5.4.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
6098
+ apilogicserver-14.5.4.dist-info/entry_points.txt,sha256=KiLloZJ3c_RW-nIDqBtoE0WEsQTnZ3dELwHLWi23LMA,103
6099
+ apilogicserver-14.5.4.dist-info/top_level.txt,sha256=-r0AT_GEApleihg-jIh0OMvzzc0BO1RuhhOpE91H5qI,21
6100
+ apilogicserver-14.5.4.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.7.1)
2
+ Generator: setuptools (80.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5