ApiLogicServer 14.3.20__py3-none-any.whl → 14.4.0__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 +5 -14
- api_logic_server_cli/api_logic_server_info.yaml +3 -3
- api_logic_server_cli/cli.py +52 -5
- api_logic_server_cli/create_from_model/__pycache__/create_db_from_model.cpython-312.pyc +0 -0
- api_logic_server_cli/create_from_model/__pycache__/ont_build.cpython-312.pyc +0 -0
- api_logic_server_cli/create_from_model/__pycache__/ont_create.cpython-312.pyc +0 -0
- api_logic_server_cli/create_from_model/create_db_from_model.py +2 -0
- api_logic_server_cli/create_from_model/ont_build.py +19 -14
- api_logic_server_cli/create_from_model/ont_create.py +5 -5
- api_logic_server_cli/create_from_model/safrs-react-admin-npm-build/static/.DS_Store +0 -0
- api_logic_server_cli/database/nw-gold-fix.sql +62 -0
- api_logic_server_cli/database/nw-gold.sqlite +0 -0
- api_logic_server_cli/fragments/docker-compose.yml +27 -0
- api_logic_server_cli/genai/genai.py +43 -11
- api_logic_server_cli/genai/genai_graphics.py +379 -0
- api_logic_server_cli/genai/genai_logic_builder.py +2 -2
- api_logic_server_cli/genai/genai_svcs.py +24 -8
- api_logic_server_cli/manager.py +19 -10
- api_logic_server_cli/prototypes/.DS_Store +0 -0
- api_logic_server_cli/prototypes/base/.DS_Store +0 -0
- api_logic_server_cli/prototypes/base/.vscode/launch.json +19 -0
- api_logic_server_cli/prototypes/base/api/expose_api_models.py +3 -1
- api_logic_server_cli/prototypes/base/api_logic_server_run.py +5 -2
- api_logic_server_cli/prototypes/base/config/activate_logicbank.py +1 -0
- api_logic_server_cli/prototypes/base/config/config.py +95 -24
- api_logic_server_cli/prototypes/base/config/logging.yml +1 -0
- api_logic_server_cli/prototypes/base/config/server_setup.py +33 -1
- api_logic_server_cli/prototypes/base/database/test_data/readme.md +3 -1
- api_logic_server_cli/prototypes/base/devops/docker-standard-image/docker-compose-standard-image.yml +7 -2
- api_logic_server_cli/prototypes/base/docs/graphics/readme.md +12 -0
- api_logic_server_cli/prototypes/base/docs/training/logic_bank_api.prompt +314 -0
- api_logic_server_cli/prototypes/base/docs/training/logic_example.py +41 -0
- api_logic_server_cli/prototypes/base/integration/kafka/kafka_producer.py +7 -3
- api_logic_server_cli/prototypes/base/integration/system/FlaskKafka.py +5 -1
- api_logic_server_cli/prototypes/base/security/authentication_provider/keycloak/auth_provider.py +1 -1
- api_logic_server_cli/prototypes/base/security/declare_security.py +4 -0
- api_logic_server_cli/prototypes/base/ui/admin/admin_loader.py +3 -1
- api_logic_server_cli/prototypes/base/ui/templates/bar_chart.jinja +64 -0
- api_logic_server_cli/prototypes/genai_demo/ui/admin/admin.yaml +1 -1
- api_logic_server_cli/prototypes/manager/README.md +56 -5
- api_logic_server_cli/prototypes/manager/system/genai/.DS_Store +0 -0
- api_logic_server_cli/prototypes/manager/system/genai/examples/.DS_Store +0 -0
- api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/.DS_Store +0 -0
- api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo.prompt +0 -8
- api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo.response_example +90 -60
- api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_docs_logic/docs/002_create_db_models.prompt +4 -4
- api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_docs_logic/docs/003_create_db_models.response +77 -47
- api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_informal.prompt +1 -1
- api_logic_server_cli/prototypes/manager/system/genai/graphics_templates/dashboard_services.jinja +83 -0
- api_logic_server_cli/prototypes/manager/system/genai/graphics_templates/graphics_dashboard_WIP.py +34 -0
- api_logic_server_cli/prototypes/manager/system/genai/graphics_templates/graphics_services_api_xxx.py +32 -0
- api_logic_server_cli/prototypes/manager/system/genai/graphics_templates/graphics_services_db.jinja +46 -0
- api_logic_server_cli/prototypes/manager/system/genai/graphics_templates/graphics_services_db_each_method.jinja +36 -0
- api_logic_server_cli/prototypes/manager/system/genai/graphics_templates/html_template.jinja +76 -0
- api_logic_server_cli/prototypes/manager/system/genai/graphics_templates/index.html +19 -0
- api_logic_server_cli/prototypes/manager/system/genai/graphics_templates/sales_by_region.jinja +63 -0
- api_logic_server_cli/prototypes/manager/system/genai/prompt_inserts/graphics.prompt +22 -0
- api_logic_server_cli/prototypes/manager/system/genai/prompt_inserts/graphics_request.prompt +5 -0
- api_logic_server_cli/prototypes/manager/system/genai/prompt_inserts/response_format.prompt +15 -0
- api_logic_server_cli/prototypes/manager/system/genai/prompt_inserts/sqlite_inserts.prompt +2 -0
- api_logic_server_cli/prototypes/manager/system/install-ApiLogicServer-dev/install-ApiLogicServer-dev.ps1 +100 -0
- api_logic_server_cli/prototypes/manager/system/install-ApiLogicServer-dev/install-ApiLogicServer-dev.sh +116 -0
- api_logic_server_cli/prototypes/manager/system/install-ApiLogicServer-dev/readme.md +7 -0
- api_logic_server_cli/prototypes/manager/system/style-guide.yaml +2 -2
- api_logic_server_cli/prototypes/manager/webgenai/README.md +6 -0
- api_logic_server_cli/prototypes/nw/docs/graphics/count_orders_by_category.prompt +1 -0
- api_logic_server_cli/prototypes/nw/docs/graphics/order_count_by_month.prompt +1 -0
- api_logic_server_cli/prototypes/nw/docs/graphics/request copy.json +892 -0
- api_logic_server_cli/prototypes/nw/docs/graphics/request.json +6 -0
- api_logic_server_cli/prototypes/nw/docs/graphics/response.json +17 -0
- api_logic_server_cli/prototypes/nw/docs/graphics/response.yaml +59 -0
- api_logic_server_cli/prototypes/nw/docs/graphics/sales_by_category.prompt +1 -0
- api_logic_server_cli/prototypes/nw/ui/admin/home.js +5 -4
- api_logic_server_cli/prototypes/nw/ui/app_model_custom.yaml +851 -1082
- api_logic_server_cli/prototypes/nw_no_cust/docs/graphics/count_orders_by_category.prompt +1 -0
- api_logic_server_cli/prototypes/nw_no_cust/docs/graphics/request copy.json +892 -0
- api_logic_server_cli/prototypes/nw_no_cust/docs/graphics/request.json +6 -0
- api_logic_server_cli/prototypes/nw_no_cust/docs/graphics/response.json +17 -0
- api_logic_server_cli/prototypes/nw_no_cust/docs/graphics/response.yaml +59 -0
- api_logic_server_cli/prototypes/nw_no_cust/docs/graphics/sales_by_category.prompt +1 -0
- api_logic_server_cli/prototypes/nw_no_cust/docs/graphics/sales_by_employee.prompt +1 -0
- api_logic_server_cli/prototypes/nw_no_cust/integration/mcp/1_langchain_loader.py +19 -0
- api_logic_server_cli/prototypes/nw_no_cust/integration/mcp/2_gpt_mcp_prompt.txt +19 -0
- api_logic_server_cli/prototypes/nw_no_cust/integration/mcp/3_executor_test_agent.py +38 -0
- api_logic_server_cli/prototypes/nw_no_cust/integration/mcp/README.md +17 -0
- api_logic_server_cli/prototypes/nw_no_cust/integration/mcp/resources/curl.txt +4 -0
- api_logic_server_cli/prototypes/nw_no_cust/integration/mcp/resources/nw_swagger_3.yaml +16660 -0
- api_logic_server_cli/prototypes/nw_no_cust/integration/mcp/run_executor.py +23 -0
- api_logic_server_cli/prototypes/ont_app/ontimize_seed/nginx/nginx.conf +2 -2
- api_logic_server_cli/prototypes/ont_app/ontimize_seed/package.json +6 -6
- api_logic_server_cli/prototypes/ont_app/ontimize_seed/src/app/app.config.ts +2 -1
- api_logic_server_cli/prototypes/ont_app/ontimize_seed/src/environments/environment.prod.ts +5 -5
- api_logic_server_cli/prototypes/ont_app/ontimize_seed/src/environments/environment.ts +5 -5
- api_logic_server_cli/prototypes/ont_app/templates/app_config.jinja +1 -1
- api_logic_server_cli/prototypes/ont_app/templates/detail_template.html +1 -1
- api_logic_server_cli/prototypes/ont_app/templates/new_template.html +16 -16
- apilogicserver-14.4.0.dist-info/METADATA +76 -0
- {apilogicserver-14.3.20.dist-info → apilogicserver-14.4.0.dist-info}/RECORD +102 -59
- {apilogicserver-14.3.20.dist-info → apilogicserver-14.4.0.dist-info}/WHEEL +1 -1
- api_logic_server_cli/prototypes/manager/system/genai/prompt_inserts/zsqlite_inserts_iterations.prompt +0 -29
- api_logic_server_cli/prototypes/manager/webgenai/docker-compose-webg.yml +0 -33
- api_logic_server_cli/prototypes/manager/webgenai/webg_config/license.json +0 -6
- api_logic_server_cli/prototypes/manager/webgenai/webg_config/web_genai.txt +0 -13
- apilogicserver-14.3.20.dist-info/METADATA +0 -167
- {apilogicserver-14.3.20.dist-info → apilogicserver-14.4.0.dist-info}/entry_points.txt +0 -0
- {apilogicserver-14.3.20.dist-info → apilogicserver-14.4.0.dist-info}/licenses/LICENSE +0 -0
- {apilogicserver-14.3.20.dist-info → apilogicserver-14.4.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"role": "user",
|
|
4
|
+
"content": "You are a data modelling expert and python software architect who expands on user input ideas. \n\n<responseFormat>\nclass Rule(BaseModel):\n name: str\n description: str\n use_case: str # specified use case or requirement name (use 'General' if missing)\n entity: str # the entity being constrained or derived\n code: str # logicbank rule code\n \nclass Model(BaseModel):\n classname: str\n code: str # sqlalchemy model code\n sqlite_create: str # sqlite create table statement\n description: str\n name: str\n\nclass TestDataRow(BaseModel):\n test_data_row_variable: str # the Python test data row variable\n code: str # Python code to create a test data row instance\n\nclass Graphic(BaseModel):\n sqlalchemy_query: str # sqlalchemy query using group by, returns result = { \"result\": [ (\"name\", \"value\") ] }\n sql_query: str # sql query using group by, returns result = { \"result\": [ (\"name\", \"value\") ] }\n classes_used: str # comma-delimited list of classes used in sqlalchemy_query\n name: str # suggested Python name for sqlalchemy_query\n html_code: str # create a java script app to show a bar chart from sqlalchemy_query result\n\nclass WGResult(BaseModel): # must match system/genai/prompt_inserts/response_format.prompt\n # response: str # result\n models : List[Model] # list of sqlalchemy classes in the response\n rules : List[Rule] # list rule declarations\n graphics: List[Graphic] # list of Graphic objects\n test_data: str\n test_data_rows: List[TestDataRow] # list of test data rows\n test_data_sqlite: str # test data as sqlite INSERT statements\n name: str # suggest a short name for the project\n\nFormat the response as a WGResult.\n\n</responseFormat>\n\n\nCreate WGResult Graphics for prompts like 'graph sales by region'.\n * use 'sales by region' to create a WGResult Graphic.sqlalchemy_query\n * Be sure to use class names, not table names\n * for example, using Northwind:\n # SQLAlchemy query for Sales by Category\n sales_by_category = (\n session.query(\n Category.CategoryName,\n func.sum(OrderDetail.Quantity * OrderDetail.UnitPrice * (1 - OrderDetail.Discount)).label(\"TotalSales\")\n )\n .join(Product, category.Id == Product.CategoryId)\n .join(OrderDetail, Product.Id == OrderDetail.ProductId)\n .join(Order, OrderDetail.OrderId == Order.Id)\n .filter(Order.ShippedDate.isnot(None)) # Consider only shipped orders\n .group_by(Category.CategoryName)\n .order_by(func.sum(OrderDetail.Quantity * OrderDetail.UnitPrice * (1 - OrderDetail.Discount)).desc())\n )\n\n# coding: utf-8\n\nfrom sqlalchemy import DECIMAL, DateTime # API Logic Server GenAI assist\n\nfrom sqlalchemy import Boolean, Column, DECIMAL, Date, Double, ForeignKey, ForeignKeyConstraint, Integer, String, Table, Text, text\n\nfrom sqlalchemy.orm import relationship\n\nfrom sqlalchemy.ext.declarative import declarative_base\n\n\n\n########################################################################################################################\n\n# Classes describing database for SqlAlchemy ORM, initially created by schema introspection.\n\n#\n\n# Alter this file per your database maintenance policy\n\n# See https://apilogicserver.github.io/Docs/Project-Rebuild/#rebuilding\n\n#\n\n# Created: March 25, 2025 19:54:24\n\n# Database: sqlite:////Users/val/dev/ApiLogicServer/ApiLogicServer-dev/build_and_test/ApiLogicServer/samples/nw_sample_nocust/database/db.sqlite\n\n# Dialect: sqlite\n\n#\n\n# mypy: ignore-errors\n\n########################################################################################################################\n\n \n\nfrom database.system.SAFRSBaseX import SAFRSBaseX, TestBase\n\nfrom flask_login import UserMixin\n\nimport safrs, flask_sqlalchemy, os\n\nfrom safrs import jsonapi_attr\n\nfrom flask_sqlalchemy import SQLAlchemy\n\nfrom sqlalchemy.orm import relationship\n\nfrom sqlalchemy.orm import Mapped\n\nfrom sqlalchemy.sql.sqltypes import NullType\n\nfrom typing import List\n\n\n\ndb = SQLAlchemy() \n\nBase = declarative_base() # type: flask_sqlalchemy.model.DefaultMeta\n\nmetadata = Base.metadata\n\n\n\n#NullType = db.String # datatype fixup\n\n#TIMESTAMP= db.TIMESTAMP\n\n\n\nfrom sqlalchemy.dialects.sqlite import *\n\n\n\nif os.getenv('APILOGICPROJECT_NO_FLASK') is None or os.getenv('APILOGICPROJECT_NO_FLASK') == 'None':\n\n Base = SAFRSBaseX # enables rules to be used outside of Flask, e.g., test data loading\n\nelse:\n\n Base = TestBase # ensure proper types, so rules work for data loading\n\n print('*** Models.py Using TestBase ***')\n\n\n\n\n\n\n\nclass Category(Base): # type: ignore\n\n __tablename__ = 'CategoryTableNameTest'\n\n _s_collection_name = 'Category' # type: ignore\n\n\n\n Id = Column(Integer, primary_key=True)\n\n CategoryName_ColumnName = Column(String(8000))\n\n Description = Column(String(8000))\n\n Client_id = Column(Integer)\n\n\n\n # parent relationships (access parent)\n\n\n\n # child relationships (access children)\n\n\n\n\n\n\n\nclass Customer(Base): # type: ignore\n\n __tablename__ = 'Customer'\n\n _s_collection_name = 'Customer' # type: ignore\n\n\n\n Id = Column(String(8000), primary_key=True)\n\n CompanyName = Column(String(8000))\n\n ContactName = Column(String(8000))\n\n ContactTitle = Column(String(8000))\n\n Address = Column(String(8000))\n\n City = Column(String(8000))\n\n Region = Column(String(8000))\n\n PostalCode = Column(String(8000))\n\n Country = Column(String(8000))\n\n Phone = Column(String(8000))\n\n Fax = Column(String(8000))\n\n Balance : DECIMAL = Column(DECIMAL)\n\n CreditLimit : DECIMAL = Column(DECIMAL)\n\n OrderCount = Column(Integer, server_default=text(\"0\"))\n\n UnpaidOrderCount = Column(Integer, server_default=text(\"0\"))\n\n Client_id = Column(Integer)\n\n allow_client_generated_ids = True\n\n\n\n # parent relationships (access parent)\n\n\n\n # child relationships (access children)\n\n OrderList : Mapped[List[\"Order\"]] = relationship(back_populates=\"Customer\")\n\n\n\n\n\n\n\nclass CustomerDemographic(Base): # type: ignore\n\n __tablename__ = 'CustomerDemographic'\n\n _s_collection_name = 'CustomerDemographic' # type: ignore\n\n\n\n Id = Column(String(8000), primary_key=True)\n\n CustomerDesc = Column(String(8000))\n\n allow_client_generated_ids = True\n\n\n\n # parent relationships (access parent)\n\n\n\n # child relationships (access children)\n\n\n\n\n\n\n\nclass Department(Base): # type: ignore\n\n __tablename__ = 'Department'\n\n _s_collection_name = 'Department' # type: ignore\n\n\n\n Id = Column(Integer, primary_key=True)\n\n DepartmentId = Column(ForeignKey('Department.Id'))\n\n DepartmentName = Column(String(100))\n\n SecurityLevel = Column(Integer, server_default=text(\"0\"))\n\n\n\n # parent relationships (access parent)\n\n Department : Mapped[\"Department\"] = relationship(remote_side=[Id], back_populates=(\"DepartmentList\"))\n\n\n\n # child relationships (access children)\n\n DepartmentList : Mapped[List[\"Department\"]] = relationship(back_populates=\"Department\")\n\n EmployeeList : Mapped[List[\"Employee\"]] = relationship(foreign_keys='[Employee.OnLoanDepartmentId]', back_populates=\"OnLoanDepartment\")\n\n WorksForEmployeeList : Mapped[List[\"Employee\"]] = relationship(foreign_keys='[Employee.WorksForDepartmentId]', back_populates=\"WorksForDepartment\")\n\n\n\n\n\n\n\nclass Location(Base): # type: ignore\n\n __tablename__ = 'Location'\n\n _s_collection_name = 'Location' # type: ignore\n\n\n\n country = Column(String(50), primary_key=True)\n\n city = Column(String(50), primary_key=True)\n\n notes = Column(String(256))\n\n allow_client_generated_ids = True\n\n\n\n # parent relationships (access parent)\n\n\n\n # child relationships (access children)\n\n OrderList : Mapped[List[\"Order\"]] = relationship(back_populates=\"Location\")\n\n\n\n\n\n\n\nclass Product(Base): # type: ignore\n\n __tablename__ = 'Product'\n\n _s_collection_name = 'Product' # type: ignore\n\n\n\n Id = Column(Integer, primary_key=True)\n\n ProductName = Column(String(8000))\n\n SupplierId = Column(Integer, nullable=False)\n\n CategoryId = Column(Integer, nullable=False)\n\n QuantityPerUnit = Column(String(8000))\n\n UnitPrice : DECIMAL = Column(DECIMAL, nullable=False)\n\n UnitsInStock = Column(Integer, nullable=False)\n\n UnitsOnOrder = Column(Integer, nullable=False)\n\n ReorderLevel = Column(Integer, nullable=False)\n\n Discontinued = Column(Integer, nullable=False)\n\n UnitsShipped = Column(Integer)\n\n\n\n # parent relationships (access parent)\n\n\n\n # child relationships (access children)\n\n OrderDetailList : Mapped[List[\"OrderDetail\"]] = relationship(back_populates=\"Product\")\n\n\n\n\n\n\n\nt_ProductDetails_View = Table(\n\n 'ProductDetails_View', metadata,\n\n Column('Id', Integer),\n\n Column('ProductName', String(8000)),\n\n Column('SupplierId', Integer),\n\n Column('CategoryId', Integer),\n\n Column('QuantityPerUnit', String(8000)),\n\n Column('UnitPrice', DECIMAL),\n\n Column('UnitsInStock', Integer),\n\n Column('UnitsOnOrder', Integer),\n\n Column('ReorderLevel', Integer),\n\n Column('Discontinued', Integer),\n\n Column('UnitsShipped', Integer),\n\n Column('CategoryName_ColumnName', String(8000)),\n\n Column('CategoryDescription', String(8000)),\n\n Column('SupplierName', String(8000)),\n\n Column('SupplierRegion', String(8000))\n\n)\n\n\n\n\n\nclass Region(Base): # type: ignore\n\n __tablename__ = 'Region'\n\n _s_collection_name = 'Region' # type: ignore\n\n\n\n Id = Column(Integer, primary_key=True)\n\n RegionDescription = Column(String(8000))\n\n\n\n # parent relationships (access parent)\n\n\n\n # child relationships (access children)\n\n\n\n\n\n\n\nclass SampleDBVersion(Base): # type: ignore\n\n __tablename__ = 'SampleDBVersion'\n\n _s_collection_name = 'SampleDBVersion' # type: ignore\n\n\n\n Id = Column(Integer, primary_key=True)\n\n Notes = Column(String(800))\n\n\n\n # parent relationships (access parent)\n\n\n\n # child relationships (access children)\n\n\n\n\n\n\n\nclass Shipper(Base): # type: ignore\n\n __tablename__ = 'Shipper'\n\n _s_collection_name = 'Shipper' # type: ignore\n\n\n\n Id = Column(Integer, primary_key=True)\n\n CompanyName = Column(String(8000))\n\n Phone = Column(String(8000))\n\n\n\n # parent relationships (access parent)\n\n\n\n # child relationships (access children)\n\n\n\n\n\n\n\nclass Supplier(Base): # type: ignore\n\n __tablename__ = 'Supplier'\n\n _s_collection_name = 'Supplier' # type: ignore\n\n\n\n Id = Column(Integer, primary_key=True)\n\n CompanyName = Column(String(8000))\n\n ContactName = Column(String(8000))\n\n ContactTitle = Column(String(8000))\n\n Address = Column(String(8000))\n\n City = Column(String(8000))\n\n Region = Column(String(8000))\n\n PostalCode = Column(String(8000))\n\n Country = Column(String(8000))\n\n Phone = Column(String(8000))\n\n Fax = Column(String(8000))\n\n HomePage = Column(String(8000))\n\n\n\n # parent relationships (access parent)\n\n\n\n # child relationships (access children)\n\n\n\n\n\n\n\nclass Territory(Base): # type: ignore\n\n __tablename__ = 'Territory'\n\n _s_collection_name = 'Territory' # type: ignore\n\n\n\n Id = Column(String(8000), primary_key=True)\n\n TerritoryDescription = Column(String(8000))\n\n RegionId = Column(Integer, nullable=False)\n\n allow_client_generated_ids = True\n\n\n\n # parent relationships (access parent)\n\n\n\n # child relationships (access children)\n\n EmployeeTerritoryList : Mapped[List[\"EmployeeTerritory\"]] = relationship(back_populates=\"Territory\")\n\n\n\n\n\n\n\nclass Union(Base): # type: ignore\n\n __tablename__ = 'Union'\n\n _s_collection_name = 'Union' # type: ignore\n\n\n\n Id = Column(Integer, primary_key=True)\n\n Name = Column(String(80))\n\n\n\n # parent relationships (access parent)\n\n\n\n # child relationships (access children)\n\n EmployeeList : Mapped[List[\"Employee\"]] = relationship(back_populates=\"Union\")\n\n\n\n\n\n\n\nclass Employee(Base): # type: ignore\n\n __tablename__ = 'Employee'\n\n _s_collection_name = 'Employee' # type: ignore\n\n\n\n Id = Column(Integer, primary_key=True)\n\n LastName = Column(String(8000))\n\n FirstName = Column(String(8000))\n\n Title = Column(String(8000))\n\n TitleOfCourtesy = Column(String(8000))\n\n BirthDate = Column(String(8000))\n\n HireDate = Column(String(8000))\n\n Address = Column(String(8000))\n\n City = Column(String(8000))\n\n Region = Column(String(8000))\n\n PostalCode = Column(String(8000))\n\n Country = Column(String(8000))\n\n HomePhone = Column(String(8000))\n\n Extension = Column(String(8000))\n\n Notes = Column(String(8000))\n\n ReportsTo = Column(Integer, index=True)\n\n PhotoPath = Column(String(8000))\n\n EmployeeType = Column(String(16), server_default=text(\"Salaried\"))\n\n Salary : DECIMAL = Column(DECIMAL)\n\n WorksForDepartmentId = Column(ForeignKey('Department.Id'))\n\n OnLoanDepartmentId = Column(ForeignKey('Department.Id'))\n\n UnionId = Column(ForeignKey('Union.Id'))\n\n Dues : DECIMAL = Column(DECIMAL)\n\n Email = Column(Text)\n\n\n\n # parent relationships (access parent)\n\n OnLoanDepartment : Mapped[\"Department\"] = relationship(foreign_keys='[Employee.OnLoanDepartmentId]', back_populates=(\"EmployeeList\"))\n\n Union : Mapped[\"Union\"] = relationship(back_populates=(\"EmployeeList\"))\n\n WorksForDepartment : Mapped[\"Department\"] = relationship(foreign_keys='[Employee.WorksForDepartmentId]', back_populates=(\"WorksForEmployeeList\"))\n\n\n\n # child relationships (access children)\n\n EmployeeAuditList : Mapped[List[\"EmployeeAudit\"]] = relationship(back_populates=\"Employee\")\n\n EmployeeTerritoryList : Mapped[List[\"EmployeeTerritory\"]] = relationship(back_populates=\"Employee\")\n\n OrderList : Mapped[List[\"Order\"]] = relationship(back_populates=\"Employee\")\n\n\n\n\n\n\n\nclass EmployeeAudit(Base): # type: ignore\n\n __tablename__ = 'EmployeeAudit'\n\n _s_collection_name = 'EmployeeAudit' # type: ignore\n\n\n\n Id = Column(Integer, primary_key=True)\n\n Title = Column(String)\n\n Salary : DECIMAL = Column(DECIMAL)\n\n LastName = Column(String)\n\n FirstName = Column(String)\n\n EmployeeId = Column(ForeignKey('Employee.Id'))\n\n CreatedOn = Column(Text)\n\n UpdatedOn = Column(Text)\n\n CreatedBy = Column(Text)\n\n UpdatedBy = Column(Text)\n\n\n\n # parent relationships (access parent)\n\n Employee : Mapped[\"Employee\"] = relationship(back_populates=(\"EmployeeAuditList\"))\n\n\n\n # child relationships (access children)\n\n\n\n\n\n\n\nclass EmployeeTerritory(Base): # type: ignore\n\n __tablename__ = 'EmployeeTerritory'\n\n _s_collection_name = 'EmployeeTerritory' # type: ignore\n\n\n\n Id = Column(String(8000), primary_key=True)\n\n EmployeeId = Column(ForeignKey('Employee.Id'), nullable=False)\n\n TerritoryId = Column(ForeignKey('Territory.Id'))\n\n allow_client_generated_ids = True\n\n\n\n # parent relationships (access parent)\n\n Employee : Mapped[\"Employee\"] = relationship(back_populates=(\"EmployeeTerritoryList\"))\n\n Territory : Mapped[\"Territory\"] = relationship(back_populates=(\"EmployeeTerritoryList\"))\n\n\n\n # child relationships (access children)\n\n\n\n\n\n\n\nclass Order(Base): # type: ignore\n\n __tablename__ = 'Order'\n\n _s_collection_name = 'Order' # type: ignore\n\n __table_args__ = (\n\n ForeignKeyConstraint(['Country', 'City'], ['Location.country', 'Location.city']),\n\n )\n\n\n\n Id = Column(Integer, primary_key=True)\n\n CustomerId = Column(ForeignKey('Customer.Id'), nullable=False, index=True)\n\n EmployeeId = Column(ForeignKey('Employee.Id'), nullable=False, index=True)\n\n OrderDate = Column(String(8000))\n\n RequiredDate = Column(Date)\n\n ShippedDate = Column(String(8000))\n\n ShipVia = Column(Integer)\n\n Freight : DECIMAL = Column(DECIMAL, server_default=text(\"0\"))\n\n ShipName = Column(String(8000))\n\n ShipAddress = Column(String(8000))\n\n ShipCity = Column(String(8000))\n\n ShipRegion = Column(String(8000))\n\n ShipPostalCode = Column(String(8000))\n\n ShipCountry = Column(String(8000))\n\n AmountTotal : DECIMAL = Column(DECIMAL(10, 2))\n\n Country = Column(String(50))\n\n City = Column(String(50))\n\n Ready = Column(Boolean)\n\n OrderDetailCount = Column(Integer, server_default=text(\"0\"))\n\n CloneFromOrder = Column(ForeignKey('Order.Id'))\n\n\n\n # parent relationships (access parent)\n\n Order : Mapped[\"Order\"] = relationship(remote_side=[Id], back_populates=(\"OrderList\"))\n\n Location : Mapped[\"Location\"] = relationship(back_populates=(\"OrderList\"))\n\n Customer : Mapped[\"Customer\"] = relationship(back_populates=(\"OrderList\"))\n\n Employee : Mapped[\"Employee\"] = relationship(back_populates=(\"OrderList\"))\n\n\n\n # child relationships (access children)\n\n OrderList : Mapped[List[\"Order\"]] = relationship(back_populates=\"Order\")\n\n OrderDetailList : Mapped[List[\"OrderDetail\"]] = relationship(back_populates=\"Order\")\n\n\n\n\n\n\n\nclass OrderDetail(Base): # type: ignore\n\n __tablename__ = 'OrderDetail'\n\n _s_collection_name = 'OrderDetail' # type: ignore\n\n\n\n Id = Column(Integer, primary_key=True)\n\n OrderId = Column(ForeignKey('Order.Id'), nullable=False, index=True)\n\n ProductId = Column(ForeignKey('Product.Id'), nullable=False, index=True)\n\n UnitPrice : DECIMAL = Column(DECIMAL)\n\n Quantity = Column(Integer, server_default=text(\"1\"), nullable=False)\n\n Discount = Column(Double, server_default=text(\"0\"))\n\n Amount : DECIMAL = Column(DECIMAL)\n\n ShippedDate = Column(String(8000))\n\n\n\n # parent relationships (access parent)\n\n Order : Mapped[\"Order\"] = relationship(back_populates=(\"OrderDetailList\"))\n\n Product : Mapped[\"Product\"] = relationship(back_populates=(\"OrderDetailList\"))\n\n\n\n # child relationships (access children)\n\nGraph Sales by Category"
|
|
5
|
+
}
|
|
6
|
+
]
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"models": [],
|
|
3
|
+
"rules": [],
|
|
4
|
+
"graphics": [
|
|
5
|
+
{
|
|
6
|
+
"sqlalchemy_query": "sales_by_region = (\n session.query(\n Region.RegionDescription,\n func.sum(OrderDetail.Quantity * OrderDetail.UnitPrice * (1 - OrderDetail.Discount)).label(\"TotalSales\")\n )\n .join(Order, Order.ShipRegion == Region.RegionDescription)\n .join(OrderDetail, OrderDetail.OrderId == Order.Id)\n .filter(Order.ShippedDate.isnot(None)) # Consider only shipped orders\n .group_by(Region.RegionDescription)\n .order_by(func.sum(OrderDetail.Quantity * OrderDetail.UnitPrice * (1 - OrderDetail.Discount)).desc())\n)",
|
|
7
|
+
"sql_query": "SELECT Region.RegionDescription, SUM(OrderDetail.Quantity * OrderDetail.UnitPrice * (1 - OrderDetail.Discount)) AS TotalSales\nFROM Order\nJOIN Region ON Order.ShipRegion = Region.RegionDescription\nJOIN OrderDetail ON OrderDetail.OrderId = Order.Id\nWHERE Order.ShippedDate IS NOT NULL\nGROUP BY Region.RegionDescription\nORDER BY TotalSales DESC;",
|
|
8
|
+
"classes_used": "Order, Region, OrderDetail",
|
|
9
|
+
"name": "sales_by_region_query",
|
|
10
|
+
"html_code": "<script src=\"https://cdn.jsdelivr.net/npm/chart.js\"></script>\n<canvas id=\"salesByRegionChart\" width=\"400\" height=\"400\"></canvas>\n<script>\n const ctx = document.getElementById('salesByRegionChart').getContext('2d');\n const data = {\n labels: [], // Populate with Region description\n datasets: [{\n label: 'Sales by Region',\n data: [], // Populate with total sales\n backgroundColor: 'rgba(75, 192, 192, 0.2)',\n borderColor: 'rgba(75, 192, 192, 1)',\n borderWidth: 1\n }]\n };\n const salesByRegionChart = new Chart(ctx, {\n type: 'bar',\n data: data,\n options: {\n scales: {\n y: {\n beginAtZero: true\n }\n }\n }\n });\n</script>"
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"test_data": "",
|
|
14
|
+
"test_data_rows": [],
|
|
15
|
+
"test_data_sqlite": "",
|
|
16
|
+
"name": "SalesByRegionAnalysis"
|
|
17
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"graphics":
|
|
2
|
+
- "classes_used": |-
|
|
3
|
+
Order, Region, OrderDetail
|
|
4
|
+
"html_code": |-
|
|
5
|
+
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
|
6
|
+
<canvas id="salesByRegionChart" width="400" height="400"></canvas>
|
|
7
|
+
<script>
|
|
8
|
+
const ctx = document.getElementById('salesByRegionChart').getContext('2d');
|
|
9
|
+
const data = {
|
|
10
|
+
labels: [], // Populate with Region description
|
|
11
|
+
datasets: [{
|
|
12
|
+
label: 'Sales by Region',
|
|
13
|
+
data: [], // Populate with total sales
|
|
14
|
+
backgroundColor: 'rgba(75, 192, 192, 0.2)',
|
|
15
|
+
borderColor: 'rgba(75, 192, 192, 1)',
|
|
16
|
+
borderWidth: 1
|
|
17
|
+
}]
|
|
18
|
+
};
|
|
19
|
+
const salesByRegionChart = new Chart(ctx, {
|
|
20
|
+
type: 'bar',
|
|
21
|
+
data: data,
|
|
22
|
+
options: {
|
|
23
|
+
scales: {
|
|
24
|
+
y: {
|
|
25
|
+
beginAtZero: true
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
</script>
|
|
31
|
+
"name": |-
|
|
32
|
+
sales_by_region_query
|
|
33
|
+
"sql_query": |-
|
|
34
|
+
SELECT Region.RegionDescription, SUM(OrderDetail.Quantity * OrderDetail.UnitPrice * (1 - OrderDetail.Discount)) AS TotalSales
|
|
35
|
+
FROM Order
|
|
36
|
+
JOIN Region ON Order.ShipRegion = Region.RegionDescription
|
|
37
|
+
JOIN OrderDetail ON OrderDetail.OrderId = Order.Id
|
|
38
|
+
WHERE Order.ShippedDate IS NOT NULL
|
|
39
|
+
GROUP BY Region.RegionDescription
|
|
40
|
+
ORDER BY TotalSales DESC;
|
|
41
|
+
"sqlalchemy_query": |-
|
|
42
|
+
sales_by_region = (
|
|
43
|
+
session.query(
|
|
44
|
+
Region.RegionDescription,
|
|
45
|
+
func.sum(OrderDetail.Quantity * OrderDetail.UnitPrice * (1 - OrderDetail.Discount)).label("TotalSales")
|
|
46
|
+
)
|
|
47
|
+
.join(Order, Order.ShipRegion == Region.RegionDescription)
|
|
48
|
+
.join(OrderDetail, OrderDetail.OrderId == Order.Id)
|
|
49
|
+
.filter(Order.ShippedDate.isnot(None)) # Consider only shipped orders
|
|
50
|
+
.group_by(Region.RegionDescription)
|
|
51
|
+
.order_by(func.sum(OrderDetail.Quantity * OrderDetail.UnitPrice * (1 - OrderDetail.Discount)).desc())
|
|
52
|
+
)
|
|
53
|
+
"models": []
|
|
54
|
+
"name": |-
|
|
55
|
+
SalesByRegionAnalysis
|
|
56
|
+
"rules": []
|
|
57
|
+
"test_data": ""
|
|
58
|
+
"test_data_rows": []
|
|
59
|
+
"test_data_sqlite": ""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Graph Sales by Category
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Graph Sales by Employee, for Dashboard
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from langchain.tools.openapi.utils.openapi_utils import OpenAPISpec
|
|
2
|
+
from langchain.tools.openapi.tool import OpenAPITool
|
|
3
|
+
|
|
4
|
+
# Load your OpenAPI spec
|
|
5
|
+
spec = OpenAPISpec.from_file("nw_swagger_3.yaml")
|
|
6
|
+
|
|
7
|
+
# Create LangChain tool from a specific endpoint
|
|
8
|
+
customer_tool = OpenAPITool.from_openapi_spec(
|
|
9
|
+
spec=spec,
|
|
10
|
+
operation_id="getCustomer", # use actual operationId from your spec
|
|
11
|
+
verbose=True
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
# Run a test call
|
|
15
|
+
result = customer_tool.run({
|
|
16
|
+
"filter[Country]": "USA",
|
|
17
|
+
"page[limit]": 3
|
|
18
|
+
})
|
|
19
|
+
print(result)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
You are an AI planner that builds tool_context blocks for a JSON:API server using OpenAPI 3.0.
|
|
2
|
+
|
|
3
|
+
Use this OpenAPI file: [insert contents of nw_swagger_3.yaml]
|
|
4
|
+
|
|
5
|
+
Given the goal: "List all customers from Germany, limited to 2 results", generate a JSON MCP tool_context like this:
|
|
6
|
+
|
|
7
|
+
{
|
|
8
|
+
"tool": "json-api",
|
|
9
|
+
"method": "GET",
|
|
10
|
+
"url": "https://your-api-domain.com/Customer",
|
|
11
|
+
"query_params": {
|
|
12
|
+
"filter[Country]": "Germany",
|
|
13
|
+
"page[limit]": 2
|
|
14
|
+
},
|
|
15
|
+
"headers": {
|
|
16
|
+
"Accept": "application/vnd.api+json"
|
|
17
|
+
},
|
|
18
|
+
"expected_output": "List of customer records"
|
|
19
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import requests
|
|
2
|
+
|
|
3
|
+
# MCP-style tool_context
|
|
4
|
+
'''
|
|
5
|
+
tool_context = {
|
|
6
|
+
"method": "GET",
|
|
7
|
+
"url": "http://localhost:5656/api/Customer",
|
|
8
|
+
"query_params": {
|
|
9
|
+
"filter[Country]": "Germany",
|
|
10
|
+
"page[limit]": 2
|
|
11
|
+
},
|
|
12
|
+
"headers": {
|
|
13
|
+
"Accept": "application/vnd.api+json"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
'''
|
|
17
|
+
tool_context = {
|
|
18
|
+
"method": "GET",
|
|
19
|
+
"url": "http://localhost:5656/api/Customer",
|
|
20
|
+
"query_params": {
|
|
21
|
+
"filter[Country]": "Germany"
|
|
22
|
+
},
|
|
23
|
+
"headers": {
|
|
24
|
+
"Accept": "application/vnd.api+json"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# Execute as a simulated MCP executor
|
|
30
|
+
response = requests.get(
|
|
31
|
+
tool_context["url"],
|
|
32
|
+
headers=tool_context["headers"],
|
|
33
|
+
params=tool_context["query_params"]
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
# Display result
|
|
37
|
+
print(response.status_code)
|
|
38
|
+
print(response.json())
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
Model Context Protocol is a way for Chat agents to discover and call external servers, be they databases, APIs, file systems, etc, and call their services. And, for multiple such servers to be choreographed in a chain of calls.
|
|
2
|
+
|
|
3
|
+
For more information:
|
|
4
|
+
|
|
5
|
+
* [see here](https://modelcontextprotocol.io/introduction){:target="_blank" rel="noopener"}
|
|
6
|
+
* [and here](https://apilogicserver.github.io/Docs/Integration-MCP/){:target="_blank" rel="noopener"}
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
> Status: Technology Exploration
|
|
10
|
+
|
|
11
|
+
## ChatGPT testing
|
|
12
|
+
|
|
13
|
+
In the Manager, open `samples/nw_sample_nocust`, and explore `integration/mcp`. This has been successfully used to invoke the server.
|
|
14
|
+
|
|
15
|
+
This is just an initial experiment, without automation such as creation of openAI version 3 from version 2. Many substantive issues need to be addressed, including but not limited to security, update, etc.
|
|
16
|
+
|
|
17
|
+
We welcome participation in this exploration. Please contact us via [discord](https://discord.gg/HcGxbBsgRF){:target="_blank" rel="noopener"}.
|