feat(analyzeWorkOrder): 重构工单分析MCP技能模块并更新业务查询配置
- 将项目名称从 lzwcai-mcp-sqlexecutor 重命名为 lzwcai-mcpskills-analyzeWorkOrder - 更新 README.md 中的安装命令、使用说明和配置示例 - 本地化业务查询名称,将中文业务名称改为英文,如"查询列表"改为"QueryList" - 优化SQL模板,移除中文列别名,使用英文字段名 - 新增销售订单相关查询功能,包括订单列表、订单详情、交付风险预测 - 添加部门人效产值损耗三维仪表盘查询 - 更新包的初始化信息和版本号
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
# lzwcai-mcp-sqlexecutor
|
# lzwcai-mcpskills-analyzeWorkOrder
|
||||||
|
|
||||||
一个基于 MCP (Model Context Protocol) 的 SQL 查询执行服务器,支持从 JSON 配置文件动态生成查询工具。
|
一个基于 MCP (Model Context Protocol) 的 SQL 查询执行服务器,支持从 JSON 配置文件动态生成查询工具。
|
||||||
|
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
### 使用 pip 安装
|
### 使用 pip 安装
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pip install lzwcai-mcp-sqlexecutor
|
pip install lzwcai-mcpskills-analyzeWorkOrder
|
||||||
```
|
```
|
||||||
|
|
||||||
### 从源码安装
|
### 从源码安装
|
||||||
@@ -28,7 +28,7 @@ pip install -e .
|
|||||||
### 使用 uv 安装(推荐)
|
### 使用 uv 安装(推荐)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
uv pip install lzwcai-mcp-sqlexecutor
|
uv pip install lzwcai-mcpskills-analyzeWorkOrder
|
||||||
```
|
```
|
||||||
|
|
||||||
## 使用方法
|
## 使用方法
|
||||||
@@ -38,7 +38,7 @@ uv pip install lzwcai-mcp-sqlexecutor
|
|||||||
安装后,可以直接通过命令启动:
|
安装后,可以直接通过命令启动:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
lzwcai-mcp-sqlexecutor
|
lzwcai-mcpskills-analyzeWorkOrder
|
||||||
```
|
```
|
||||||
|
|
||||||
### 作为 Python 模块运行
|
### 作为 Python 模块运行
|
||||||
@@ -55,7 +55,7 @@ python -m lzwcai_mcp_sqlexecutor.main
|
|||||||
{
|
{
|
||||||
"mcpServers": {
|
"mcpServers": {
|
||||||
"lzwcai-sqlexecutor": {
|
"lzwcai-sqlexecutor": {
|
||||||
"command": "lzwcai-mcp-sqlexecutor"
|
"command": "lzwcai-mcpskills-analyzeWorkOrder"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# lzwcai-mcp-sqlexecutor
|
# lzwcai-mcpskills-analyzeWorkOrder
|
||||||
|
|
||||||
一个基于 MCP (Model Context Protocol) 的 SQL 查询执行服务器,支持从 JSON 配置文件动态生成查询工具。
|
一个基于 MCP (Model Context Protocol) 的 SQL 查询执行服务器,支持从 JSON 配置文件动态生成查询工具。
|
||||||
|
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
### 使用 pip 安装
|
### 使用 pip 安装
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pip install lzwcai-mcp-sqlexecutor
|
pip install lzwcai-mcpskills-analyzeWorkOrder
|
||||||
```
|
```
|
||||||
|
|
||||||
### 从源码安装
|
### 从源码安装
|
||||||
@@ -28,7 +28,7 @@ pip install -e .
|
|||||||
### 使用 uv 安装(推荐)
|
### 使用 uv 安装(推荐)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
uv pip install lzwcai-mcp-sqlexecutor
|
uv pip install lzwcai-mcpskills-analyzeWorkOrder
|
||||||
```
|
```
|
||||||
|
|
||||||
## 使用方法
|
## 使用方法
|
||||||
@@ -38,7 +38,7 @@ uv pip install lzwcai-mcp-sqlexecutor
|
|||||||
安装后,可以直接通过命令启动:
|
安装后,可以直接通过命令启动:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
lzwcai-mcp-sqlexecutor
|
lzwcai-mcpskills-analyzeWorkOrder
|
||||||
```
|
```
|
||||||
|
|
||||||
### 作为 Python 模块运行
|
### 作为 Python 模块运行
|
||||||
@@ -55,7 +55,7 @@ python -m lzwcai_mcp_sqlexecutor.main
|
|||||||
{
|
{
|
||||||
"mcpServers": {
|
"mcpServers": {
|
||||||
"lzwcai-sqlexecutor": {
|
"lzwcai-sqlexecutor": {
|
||||||
"command": "lzwcai-mcp-sqlexecutor"
|
"command": "lzwcai-mcpskills-analyzeWorkOrder"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
"""
|
"""
|
||||||
lzwcai-mcp-sqlexecutor - MCP server for executing business SQL queries
|
lzwcai-mcpskills-analyzeWorkOrder - MCP server for executing business SQL queries
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__version__ = "0.1.2"
|
__version__ = "0.1.2"
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -94,7 +94,7 @@ def generate_tool_schema_from_query(query: dict) -> types.Tool:
|
|||||||
|
|
||||||
|
|
||||||
# 创建 MCP 服务器实例
|
# 创建 MCP 服务器实例
|
||||||
server = Server("lzwcai-mcp-sqlexecutor")
|
server = Server("lzwcai-mcpskills-analyzeWorkOrder")
|
||||||
|
|
||||||
# 缓存查询配置,避免重复加载
|
# 缓存查询配置,避免重复加载
|
||||||
_queries_cache = None
|
_queries_cache = None
|
||||||
@@ -226,16 +226,30 @@ async def handle_call_tool(
|
|||||||
api_response = test_sql_with_schema(request_data)
|
api_response = test_sql_with_schema(request_data)
|
||||||
mcp_logger.info("测试SQL API调用成功")
|
mcp_logger.info("测试SQL API调用成功")
|
||||||
|
|
||||||
# 只返回 API 响应结果
|
# 返回包含 data 字段的结果
|
||||||
result_text = json.dumps(api_response, ensure_ascii=False, indent=2)
|
result = {
|
||||||
|
"success": True,
|
||||||
|
"data": api_response
|
||||||
|
}
|
||||||
|
result_text = json.dumps(result, ensure_ascii=False, indent=2)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
error_msg = f"调用测试SQL API失败: {str(e)}"
|
error_msg = f"调用测试SQL API失败: {str(e)}"
|
||||||
mcp_logger.error(error_msg, exc_info=True)
|
mcp_logger.error(error_msg, exc_info=True)
|
||||||
result_text = json.dumps({"error": error_msg}, ensure_ascii=False, indent=2)
|
result = {
|
||||||
|
"success": False,
|
||||||
|
"error": error_msg,
|
||||||
|
"data": None
|
||||||
|
}
|
||||||
|
result_text = json.dumps(result, ensure_ascii=False, indent=2)
|
||||||
else:
|
else:
|
||||||
error_msg = f"未找到工具 {name} 对应的配置"
|
error_msg = f"未找到工具 {name} 对应的配置"
|
||||||
result_text = json.dumps({"error": error_msg}, ensure_ascii=False, indent=2)
|
result = {
|
||||||
|
"success": False,
|
||||||
|
"error": error_msg,
|
||||||
|
"data": None
|
||||||
|
}
|
||||||
|
result_text = json.dumps(result, ensure_ascii=False, indent=2)
|
||||||
|
|
||||||
mcp_logger.debug(f"工具调用结果: {result_text}")
|
mcp_logger.debug(f"工具调用结果: {result_text}")
|
||||||
|
|
||||||
@@ -297,7 +311,7 @@ async def async_main():
|
|||||||
"""MCP 服务器异步主函数"""
|
"""MCP 服务器异步主函数"""
|
||||||
try:
|
try:
|
||||||
mcp_logger.info("=" * 60)
|
mcp_logger.info("=" * 60)
|
||||||
mcp_logger.info("正在启动 MCP 服务器: lzwcai-mcp-sqlexecutor")
|
mcp_logger.info("正在启动 MCP 服务器: lzwcai-mcpskills-analyzeWorkOrder")
|
||||||
mcp_logger.info("版本: 0.1.0")
|
mcp_logger.info("版本: 0.1.0")
|
||||||
mcp_logger.info("=" * 60)
|
mcp_logger.info("=" * 60)
|
||||||
|
|
||||||
@@ -318,7 +332,7 @@ async def async_main():
|
|||||||
read_stream,
|
read_stream,
|
||||||
write_stream,
|
write_stream,
|
||||||
InitializationOptions(
|
InitializationOptions(
|
||||||
server_name="lzwcai-mcp-sqlexecutor",
|
server_name="lzwcai-mcpskills-analyzeWorkOrder",
|
||||||
server_version="0.1.0",
|
server_version="0.1.0",
|
||||||
capabilities=server.get_capabilities(
|
capabilities=server.get_capabilities(
|
||||||
notification_options=NotificationOptions(),
|
notification_options=NotificationOptions(),
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ requires = ["hatchling"]
|
|||||||
build-backend = "hatchling.build"
|
build-backend = "hatchling.build"
|
||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "lzwcai-mcp-sqlexecutor"
|
name = "lzwcai-mcpskills-analyzeWorkOrder"
|
||||||
version = "0.1.6"
|
version = "0.1.10"
|
||||||
description = "MCP server for executing business SQL queries with dynamic tool generation"
|
description = "MCP server for executing business SQL queries with dynamic tool generation"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.13"
|
requires-python = ">=3.13"
|
||||||
@@ -26,10 +26,10 @@ dependencies = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[project.scripts]
|
[project.scripts]
|
||||||
lzwcai-mcp-sqlexecutor = "lzwcai_mcp_sqlexecutor.main:main"
|
lzwcai-mcpskills-analyzeWorkOrder = "lzwcai_mcpskills_analyzeWorkOrder.main:main"
|
||||||
|
|
||||||
[tool.hatch.build.targets.wheel]
|
[tool.hatch.build.targets.wheel]
|
||||||
packages = ["lzwcai_mcp_sqlexecutor"]
|
packages = ["lzwcai_mcpskills_analyzeWorkOrder"]
|
||||||
|
|
||||||
[tool.hatch.build.targets.wheel.force-include]
|
[tool.hatch.build.targets.wheel.force-include]
|
||||||
"lzwcai_mcp_sqlexecutor/businessQueries.json" = "lzwcai_mcp_sqlexecutor/businessQueries.json"
|
"lzwcai_mcpskills_analyzeWorkOrder/businessQueries.json" = "lzwcai_mcpskills_analyzeWorkOrder/businessQueries.json"
|
||||||
|
|||||||
@@ -0,0 +1,169 @@
|
|||||||
|
-- =====================================================
|
||||||
|
-- 交付风险预测:延迟概率与红/黄/绿预警等级
|
||||||
|
-- 基于历史订单的生产周期、物流延误、设备故障等特征
|
||||||
|
-- =====================================================
|
||||||
|
|
||||||
|
WITH
|
||||||
|
-- 1. 全局生产特征(汇总所有工单)
|
||||||
|
global_production AS (
|
||||||
|
SELECT
|
||||||
|
COUNT(*) AS total_wo_count,
|
||||||
|
AVG(CASE WHEN planned_qty > 0 THEN completed_qty / planned_qty ELSE 0 END) AS avg_completion_rate,
|
||||||
|
SUM(CASE WHEN status IN ('OPEN', 'STARTED') THEN 1 ELSE 0 END) AS pending_wo_count,
|
||||||
|
SUM(CASE WHEN status = 'CLOSED' THEN 1 ELSE 0 END) AS closed_wo_count
|
||||||
|
FROM fact_work_order
|
||||||
|
),
|
||||||
|
|
||||||
|
-- 2. 全局质检特征
|
||||||
|
global_quality AS (
|
||||||
|
SELECT
|
||||||
|
COUNT(*) AS total_inspection_count,
|
||||||
|
SUM(COALESCE(pass_qty, 0)) AS total_pass_qty,
|
||||||
|
SUM(COALESCE(fail_qty, 0)) AS total_fail_qty,
|
||||||
|
CASE WHEN SUM(COALESCE(pass_qty, 0) + COALESCE(fail_qty, 0)) > 0
|
||||||
|
THEN SUM(COALESCE(pass_qty, 0))::FLOAT / SUM(COALESCE(pass_qty, 0) + COALESCE(fail_qty, 0))
|
||||||
|
ELSE 1 END AS qc_pass_rate
|
||||||
|
FROM fact_quality_inspection
|
||||||
|
),
|
||||||
|
|
||||||
|
-- 3. 全局工序不良特征
|
||||||
|
global_operation AS (
|
||||||
|
SELECT
|
||||||
|
COUNT(*) AS total_task_count,
|
||||||
|
SUM(COALESCE(good_qty, 0)) AS total_good_qty,
|
||||||
|
SUM(COALESCE(bad_qty, 0)) AS total_bad_qty,
|
||||||
|
CASE WHEN SUM(COALESCE(good_qty, 0) + COALESCE(bad_qty, 0)) > 0
|
||||||
|
THEN SUM(COALESCE(bad_qty, 0))::FLOAT / SUM(COALESCE(good_qty, 0) + COALESCE(bad_qty, 0))
|
||||||
|
ELSE 0 END AS operation_defect_rate
|
||||||
|
FROM fact_operation_task
|
||||||
|
),
|
||||||
|
|
||||||
|
-- 4. 客户级别发货统计
|
||||||
|
customer_shipment AS (
|
||||||
|
SELECT
|
||||||
|
customer_id,
|
||||||
|
COUNT(*) AS shipment_count,
|
||||||
|
SUM(COALESCE(amount, 0)) AS total_shipment_amount
|
||||||
|
FROM fact_sales_shipment
|
||||||
|
GROUP BY customer_id
|
||||||
|
),
|
||||||
|
|
||||||
|
-- 5. 客户级别退货统计
|
||||||
|
customer_return AS (
|
||||||
|
SELECT
|
||||||
|
customer_id,
|
||||||
|
COUNT(*) AS return_count,
|
||||||
|
SUM(COALESCE(amount, 0)) AS total_return_amount
|
||||||
|
FROM fact_sales_return
|
||||||
|
GROUP BY customer_id
|
||||||
|
),
|
||||||
|
|
||||||
|
-- 6. 订单风险评估
|
||||||
|
order_risk AS (
|
||||||
|
SELECT
|
||||||
|
so.sales_order_id,
|
||||||
|
so.sales_order_number,
|
||||||
|
c.customer_name,
|
||||||
|
so.order_date_utc,
|
||||||
|
so.deal_amount,
|
||||||
|
so.payment_status,
|
||||||
|
|
||||||
|
-- 全局生产指标
|
||||||
|
gp.avg_completion_rate AS production_completion_rate,
|
||||||
|
gp.pending_wo_count,
|
||||||
|
gp.total_wo_count AS work_order_count,
|
||||||
|
|
||||||
|
-- 全局质检指标
|
||||||
|
gq.qc_pass_rate,
|
||||||
|
gq.total_fail_qty,
|
||||||
|
|
||||||
|
-- 全局工序指标
|
||||||
|
go.operation_defect_rate,
|
||||||
|
|
||||||
|
-- 客户级别指标
|
||||||
|
COALESCE(cs.shipment_count, 0) AS shipment_count,
|
||||||
|
COALESCE(cr.return_count, 0) AS return_count,
|
||||||
|
CASE WHEN COALESCE(cs.shipment_count, 0) > 0
|
||||||
|
THEN COALESCE(cr.return_count, 0)::FLOAT / cs.shipment_count
|
||||||
|
ELSE 0 END AS return_rate
|
||||||
|
|
||||||
|
FROM fact_sales_order so
|
||||||
|
LEFT JOIN dim_customer c ON so.customer_id = c.customer_id AND c.is_current = true
|
||||||
|
CROSS JOIN global_production gp
|
||||||
|
CROSS JOIN global_quality gq
|
||||||
|
CROSS JOIN global_operation go
|
||||||
|
LEFT JOIN customer_shipment cs ON so.customer_id = cs.customer_id
|
||||||
|
LEFT JOIN customer_return cr ON so.customer_id = cr.customer_id
|
||||||
|
)
|
||||||
|
|
||||||
|
-- 7. 最终输出
|
||||||
|
SELECT
|
||||||
|
sales_order_id,
|
||||||
|
sales_order_number,
|
||||||
|
customer_name,
|
||||||
|
order_date_utc,
|
||||||
|
deal_amount,
|
||||||
|
payment_status,
|
||||||
|
|
||||||
|
-- 风险特征
|
||||||
|
work_order_count,
|
||||||
|
ROUND(production_completion_rate::NUMERIC, 2) AS production_completion_rate,
|
||||||
|
pending_wo_count,
|
||||||
|
ROUND(qc_pass_rate::NUMERIC, 2) AS qc_pass_rate,
|
||||||
|
ROUND(operation_defect_rate::NUMERIC, 4) AS operation_defect_rate,
|
||||||
|
return_count,
|
||||||
|
ROUND(return_rate::NUMERIC, 4) AS return_rate,
|
||||||
|
|
||||||
|
-- 延迟概率
|
||||||
|
ROUND((
|
||||||
|
CASE WHEN production_completion_rate < 0.3 THEN 0.30
|
||||||
|
WHEN production_completion_rate < 0.5 THEN 0.20
|
||||||
|
WHEN production_completion_rate < 0.8 THEN 0.10
|
||||||
|
ELSE 0 END
|
||||||
|
+ CASE WHEN qc_pass_rate < 0.8 THEN 0.25
|
||||||
|
WHEN qc_pass_rate < 0.9 THEN 0.15
|
||||||
|
WHEN qc_pass_rate < 0.95 THEN 0.08
|
||||||
|
ELSE 0 END
|
||||||
|
+ CASE WHEN operation_defect_rate > 0.1 THEN 0.20
|
||||||
|
WHEN operation_defect_rate > 0.05 THEN 0.12
|
||||||
|
WHEN operation_defect_rate > 0.02 THEN 0.05
|
||||||
|
ELSE 0 END
|
||||||
|
+ CASE WHEN return_rate > 0.1 THEN 0.15
|
||||||
|
WHEN return_rate > 0.05 THEN 0.08
|
||||||
|
WHEN return_rate > 0.02 THEN 0.03
|
||||||
|
ELSE 0 END
|
||||||
|
+ CASE WHEN payment_status = 'UNPAID' THEN 0.10
|
||||||
|
WHEN payment_status = 'PARTIAL' THEN 0.05
|
||||||
|
ELSE 0 END
|
||||||
|
)::NUMERIC, 2) AS delay_probability,
|
||||||
|
|
||||||
|
-- 红/黄/绿预警
|
||||||
|
CASE
|
||||||
|
WHEN (
|
||||||
|
CASE WHEN production_completion_rate < 0.3 THEN 0.30 WHEN production_completion_rate < 0.5 THEN 0.20 WHEN production_completion_rate < 0.8 THEN 0.10 ELSE 0 END
|
||||||
|
+ CASE WHEN qc_pass_rate < 0.8 THEN 0.25 WHEN qc_pass_rate < 0.9 THEN 0.15 WHEN qc_pass_rate < 0.95 THEN 0.08 ELSE 0 END
|
||||||
|
+ CASE WHEN operation_defect_rate > 0.1 THEN 0.20 WHEN operation_defect_rate > 0.05 THEN 0.12 WHEN operation_defect_rate > 0.02 THEN 0.05 ELSE 0 END
|
||||||
|
+ CASE WHEN return_rate > 0.1 THEN 0.15 WHEN return_rate > 0.05 THEN 0.08 WHEN return_rate > 0.02 THEN 0.03 ELSE 0 END
|
||||||
|
+ CASE WHEN payment_status = 'UNPAID' THEN 0.10 WHEN payment_status = 'PARTIAL' THEN 0.05 ELSE 0 END
|
||||||
|
) >= 0.50 THEN 'RED'
|
||||||
|
WHEN (
|
||||||
|
CASE WHEN production_completion_rate < 0.3 THEN 0.30 WHEN production_completion_rate < 0.5 THEN 0.20 WHEN production_completion_rate < 0.8 THEN 0.10 ELSE 0 END
|
||||||
|
+ CASE WHEN qc_pass_rate < 0.8 THEN 0.25 WHEN qc_pass_rate < 0.9 THEN 0.15 WHEN qc_pass_rate < 0.95 THEN 0.08 ELSE 0 END
|
||||||
|
+ CASE WHEN operation_defect_rate > 0.1 THEN 0.20 WHEN operation_defect_rate > 0.05 THEN 0.12 WHEN operation_defect_rate > 0.02 THEN 0.05 ELSE 0 END
|
||||||
|
+ CASE WHEN return_rate > 0.1 THEN 0.15 WHEN return_rate > 0.05 THEN 0.08 WHEN return_rate > 0.02 THEN 0.03 ELSE 0 END
|
||||||
|
+ CASE WHEN payment_status = 'UNPAID' THEN 0.10 WHEN payment_status = 'PARTIAL' THEN 0.05 ELSE 0 END
|
||||||
|
) >= 0.25 THEN 'YELLOW'
|
||||||
|
ELSE 'GREEN'
|
||||||
|
END AS risk_level,
|
||||||
|
|
||||||
|
-- 风险原因
|
||||||
|
CONCAT_WS(' | ',
|
||||||
|
CASE WHEN production_completion_rate < 0.5 THEN '生产进度滞后' END,
|
||||||
|
CASE WHEN qc_pass_rate < 0.9 THEN '质检通过率低' END,
|
||||||
|
CASE WHEN operation_defect_rate > 0.05 THEN '工序不良率高' END,
|
||||||
|
CASE WHEN return_rate > 0.05 THEN '历史退货率高' END,
|
||||||
|
CASE WHEN payment_status = 'UNPAID' THEN '未付款' END
|
||||||
|
) AS risk_reasons
|
||||||
|
|
||||||
|
FROM order_risk
|
||||||
|
ORDER BY delay_probability DESC, deal_amount DESC;
|
||||||
@@ -146,7 +146,7 @@ wheels = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lzwcai-mcp-sqlexecutor"
|
name = "lzwcai-mcpskills-analyzeWorkOrder"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = { virtual = "." }
|
source = { virtual = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
"""
|
"""
|
||||||
Entry point for lzwcai-mcp-sqlexecutor
|
Entry point for lzwcai-mcpskills-analyzeWorkOrder
|
||||||
Runs the MCP server for SQL query execution
|
Runs the MCP server for SQL query execution
|
||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "lzwcai-mcpskills-analyzeWorkOrder"
|
name = "lzwcai-mcpskills-analyzeWorkOrder"
|
||||||
version = "0.1.8"
|
version = "0.1.12"
|
||||||
description = "MCP server for executing business SQL queries with dynamic tool generation"
|
description = "MCP server for executing business SQL queries with dynamic tool generation"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.13"
|
requires-python = ">=3.13"
|
||||||
|
|||||||
Reference in New Issue
Block a user