Rancher Genie MCP服务器
一个全面的模型上下文协议(MCP)服务器,支持以下功能:
- 空间管理 -创建、更新、列出和删除Genie空间
- 会话查询 -通过自动轮询提问并获取SQL结果
- AI友好配置模式 -可发现的JSON模式和模板,用于AI助手生成有效配置
- 对话能力 -具有引导设置、智能对话跟踪和健康监控的高级工作流程
快速开始
5分钟后开始:
先决条件
- Python 3.10或更高版本
- 启用Genie的copula工作区
- SQL仓库ID
- 身份验证凭据(PAT或OAuth M2M)
快速安装
使用自动安装脚本:
# Clone the repository
cd genie-mcp-server
# Run the install script (handles everything)
./install.sh脚本将:
- 检查Python版本
- 创建虚拟环境
- 安装依赖项
- 交互式配置copula身份验证
- 自动检测并从您的copula CLI配置文件中选择
- 设置.env配置文件
- 验证安装
快速配置
如果已安装,请随时配置:
./configure.sh这将交互式地指导您完成以下操作:
- 选择身份验证方法(CLI/PAT/OAuth)
- 输入工作区URL
- 设置凭据
- 配置超时和端点
测试与验证
# Activate virtual environment
source .venv/bin/activate
# Check imports
python -c "from genie_mcp_server import config; print('Config OK')"第一个查询
设置后,问克劳德:
“列出我工作区中的所有Genie空间”
克劳德将使用 list_genie_spaces 工具自动。
特性
会话技巧(4个提示)
将常见操作捆绑到易于使用的对话界面中的高级工作流:
/create-space-通过自动仓库发现和验证反馈引导空间创建
- 快速模式(即时创建)、引导模式(验证反馈)、专家模式(手动编辑) - 域模板(最小、销售、客户、库存、财务、人力资源) - 质量评分和建议
/ask-具有自动对话跟踪功能的自然问答
- 智能空间选择(按ID、名称或上次使用时间) - 30分钟对话连续性(无需跟踪对话ID) - 自适应结果格式(表、摘要、SQL) - 速率限制和超时处理
/inspect-空间分析和配置管理
- 健康检查(配置质量+活动指标) - 导出(将配置保存为JSON以进行备份/克隆) - Diff(并排比较两个空格) - 查找(按表或关键字搜索空间)
/bulk-在多个空间上进行批量操作
- 更新(在多个空格中添加说明/表格) - 删除(与模拟运行预览匹配的图案) - 安全干式运行模式
空间管理(5个工具)
create_genie_space-从JSON配置创建新的Genie空间list_genie_spaces-列出工作区中的所有Genie空间get_genie_space-获取特定空间的详细信息update_genie_space-更新现有空间delete_genie_space-删除空格(软删除)
对话/查询(5个工具)
ask_genie-提问并等待结果(有速率限制和轮询)continue_conversation-在现有对话中发送后续问题get_query_results-从已完成的消息中获取查询结果list_conversations-列出空间中的对话get_conversation_history-获取对话线程中的所有消息
配置生成(5个工具)
get_config_schema-获取用于创建配置的JSON模式和文档get_config_template-获取特定于域的配置模板(销售、客户、库存等)validate_space_config-验证配置的错误和质量extract_table_metadata-提取Unity Catalog表元数据以获取上下文generate_space_config-(已弃用)基于传统LLM的生成
关键能力:
- 自动速率限制(5个请求/分钟)
- 长时间运行的查询的异步轮询
- 多层配置验证
- AI助手的模式驱动配置生成(无需外部端点)
安装
快速安装(推荐)
使用自动安装脚本:
# Clone the repository
cd genie-mcp-server
# Run the install script
./install.sh该脚本处理:Python版本检查、虚拟环境创建、依赖关系安装,以及使用copula CLI配置文件检测进行交互式配置设置。
手动安装
如果您更喜欢手动安装:
# Clone the repository
cd genie-mcp-server
# Create virtual environment
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install package
pip install -e .
# For development
pip install -e ".[dev]"
# Copy environment template
cp .env.example .env非交互式设置
对于CI/CD或自动设置,请创建 .env 跑步前:
cat > .env 访问令牌
- 增添 `.env`: `DATABRICKS_TOKEN=dapi...`
**OAuth M2M服务负责人**
- 用于生产/自动化工作流程
- 细粒度权限和审计日志记录
- 需要在copula中设置服务主体
- 增添 `.env`: `DATABRICKS_CLIENT_ID` 和 `DATABRICKS_CLIENT_SECRET`
## 使用克劳德桌面/Claude代码
### 配置文件位置
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **视窗**: `%APPDATA%\Claude\claude_desktop_config.json`
- **克劳德代码**: `~/.claude/claude_code_config.json` (或使用 `claude mcp add`)
### 选项1:uvx(推荐)
不需要本地克隆或虚拟环境。只需添加到您的配置中:
**从git URL:**
{ "mcpServers": { "genie": { "command": "uvx", "args": ["--from", "git+https://github.com/Aiden-Jeon/genie-lamp-mcp.git", "genie-mcp-server"], "env": { "DATABRICKS_HOST": "https://your-workspace.cloud.databricks.com", "DATABRICKS_TOKEN": "dapi..." } } } }
**如果发布到PyPI:**
{ "mcpServers": { "genie": { "command": "uvx", "args": ["genie-mcp-server"], "env": { "DATABRICKS_HOST": "https://your-workspace.cloud.databricks.com", "DATABRICKS_TOKEN": "dapi..." } } } }
### 方案2:当地venv(用于发展)
如果您克隆了仓库并在本地安装:
{ "mcpServers": { "genie": { "command": "/absolute/path/to/genie-lamp-mcp/.venv/bin/genie-mcp-server", "env": { "DATABRICKS_HOST": "https://your-workspace.cloud.databricks.com", "DATABRICKS_TOKEN": "dapi..." } } } }
### 重新启动并验证
1. 重新启动克劳德桌面(或重新加载克劳德代码)
1. 验证工具是否可用-您应该在Claude中看到15个Genie工具
1. 测试:“列出我工作区中的所有Genie空间”
## 技能使用指南
### `/create-space` -空间创建向导
**基本用法** -创建具有自动仓库发现功能的空间:
create_space( catalog_name="main", schema_name="sales", table_names="orders,customers,products" )
**快速模式** -跳过验证并立即创建:
create_space( catalog_name="main", schema_name="sales", table_names="orders", domain="sales", quick=True )
**专家模式** -获取配置JSON以进行手动编辑:
create_space( catalog_name="main", schema_name="sales", table_names="orders", expert=True )
**使用自定义设置:**
create_space( catalog_name="main", schema_name="finance", table_names="transactions,accounts,invoices", warehouse_id="581ed75401284b97", domain="financial", space_name="Q4 Financial Analytics" )
**可用域名:** `minimal` (默认), `sales`, `customer`, `inventory`, `financial`, `hr`
### `/ask` -问答助理
**基本用法:**
ask( question="What is the total revenue for last month?", space_id="01234567-89ab-cdef-0123-456789abcdef" )
**按空间名称:**
ask( question="Show top 10 customers by revenue", space_name="Sales Analytics" )
**后续问题** -该技能会自动继续对话:
First question (starts new conversation)
ask(question="What is total revenue?", space_id="abc123")
Follow-up (continues same conversation automatically)
ask(question="Show breakdown by product category")
Another follow-up (still same conversation)
ask(question="Filter to last quarter only")
**开始新对话:**
ask( question="Different topic: show inventory levels", space_id="abc123", new_conversation=True )
**详细模式** -显示所有行(不仅仅是前10行):
ask(question="List all products", space_id="abc123", verbose=True)
**自定义超时** -对于复杂的查询:
ask(question="Complex aggregation", space_id="abc123", timeout=600)
### `/inspect` -太空检查员
**健康检查** -分析空间配置和活动:
inspect(space_id="abc123", mode="health")
输出包括:总体健康评分(0-100)、配置指标、活动指标、可操作建议。
**导出配置:**
inspect(space_id="abc123", mode="export") inspect(space_id="abc123", mode="export", output_file="config.json")
**比较空间:**
inspect(space_id="abc123", mode="diff", compare_with="def456")
**查找空间** 按表或关键字:
inspect(space_id="", mode="find", search_tables="orders,customers") inspect(space_id="", mode="find", search_keywords="sales,revenue")
### `/bulk` -批量操作
**更新多个空格:**
Dry run first (preview changes)
bulk( operation="update", space_ids="abc123,def456,ghi789", add_instructions="Always use fiscal year dates", dry_run=True )
Apply changes
bulk( operation="update", space_ids="abc123,def456,ghi789", add_instructions="Always use fiscal year dates", dry_run=False )
**删除多个空格:**
By explicit IDs (dry run first)
bulk(operation="delete", space_ids="test1,test2,test3", dry_run=True)
By pattern matching
bulk(operation="delete", pattern="test-*", dry_run=True) bulk(operation="delete", pattern="*-dev", dry_run=True) bulk(operation="delete", pattern="*staging*", dry_run=True)
> **警告:** 总是使用 `dry_run=True` 首先预览删除!
### 常见工作流
**创建和验证空间:**
1. Create space with guided mode
create_space(catalog_name="main", schema_name="sales", table_names="orders,customers", domain="sales")
2. Check health
inspect(space_id="", mode="health")
3. Test with questions
ask(question="What tables are available?", space_id="")
**克隆和修改空间:**
1. Export existing space config
inspect(space_id="original-space-id", mode="export", output_file="original_config.json")
2. Edit the config file manually
3. Create new space with modified config using create_genie_space tool
**批处理空间管理:**
1. Find all spaces using a specific table
inspect(space_id="", mode="find", search_tables="main.sales.transactions")
2. Add common instruction to all found spaces
bulk(operation="update", space_ids="space1,space2,space3", add_instructions="Always filter to last 365 days", dry_run=True)
3. Verify changes
inspect(space_id="space1", mode="health")
## api参考
### 工具概述
|工具|类别|描述|
|------|----------|-------------|
| `create_genie_space` |空间管理|从JSON配置创建新的Genie空间|
| `list_genie_spaces` |空间管理|列出工作区中的所有Genie空间|
| `get_genie_space` |空间管理|获取特定空间的详细信息|
| `update_genie_space` |空间管理|更新现有空间|
| `delete_genie_space` |空间管理|删除空间(软删除)|
| `ask_genie` |对话/查询|提问并等待结果(有速率限制)|
| `continue_conversation` |对话/查询|在现有对话中发送后续问题|
| `get_query_results` |对话/查询|从已完成的消息中获取查询结果|
| `list_conversations` |对话/查询|列出空间中的对话|
| `get_conversation_history` |对话/查询|获取对话线程中的所有消息|
| `get_config_schema` |配置生成|获取用于创建配置的JSON模式和文档|
| `get_config_template` |配置生成|获取特定于域的配置模板|
| `validate_space_config` |配置生成|验证配置的错误和质量|
| `extract_table_metadata` |配置生成|提取Unity目录表元数据以获取上下文|
| `generate_space_config` |配置生成|(已弃用)基于传统LLM的生成|
Detailed Tool Documentation (click to expand)
### 空间管理工具
#### create_genie_space
从GenieSpaceConfig JSON创建一个新的Genie空间。
这是配置工作流程的最后一步:
1. `get_config_schema` -获取JSON模式以进行验证
1. `get_config_template` -获取特定于域的模板(可选)
1. `validate_space_config` -验证您的配置
1. `create_genie_space` -创建空间(此工具)
**参数:**
- `warehouse_id` (字符串,必填):用于执行查询的SQL仓库ID
- `config_json` (string,必填):带GenieSpaceConfig的JSON字符串(指令、表、示例、SQL代码段)
- `title` (字符串,可选):空格标题(默认为config.Space_name)
- `description` (字符串,可选):空间描述(默认为config.description)
- `parent_path` (字符串,可选):工作区中的父路径
**退货:** JSON,包含创建的空间详细信息,包括 `space_id`
**注:** 配置在内部会自动转换为ConnectionProtobuf格式。配置包括:
- 空间中应包含的表格
- Genie AI的纯文本指令
- SQL查询示例
- SQL代码段(度量值、表达式、筛选器)
- 表之间的连接规范
- 测试基准问题
#### list_genie_spaces
列出工作区中的所有Genie空间。
**参数:**
- `page_size` (int,可选):每页返回的空格数
- `page_token` (字符串,可选):分页标记
**退货:** JSON,带有空间摘要数组和可选 `next_page_token`
#### get_genie_space
获取特定精灵空间的详细信息。
**参数:**
- `space_id` (字符串,必填):空间的唯一标识符
- `include_config` (bool,可选):是否包含完整的Protobuf配置(默认值:false)
**退货:** 带空格详细信息的JSON
**注:** 当 `include_config=true`,the `serialized_space` 字段包含具有数据源(表)、示例问题和文本指令的copula Protobuf格式。
#### update_genie_space
更新现有的Genie空间。
**参数:**
- `space_id` (字符串,必填):空间的唯一标识符
- `config_json` (string,可选):新建GenieSpaceConfig为JSON字符串
- `title` (字符串,可选):新标题
- `description` (字符串,可选):新描述
- `warehouse_id` (字符串,可选):新建SQL仓库ID
**退货:** 更新了空间详细信息的JSON
**注:** 使用与相同的GenieSpaceConfig格式 `create_genie_space`.
#### delete_genie_space
删除精灵空间(软删除-移动到垃圾箱)。
**参数:**
- `space_id` (字符串,必填):要删除的空间的唯一标识符
**退货:** JSON成功确认
### 对话/查询工具
#### ask_genie
向Genie提问并等待回复。自动应用速率限制(每分钟5个查询)并轮询,直到查询完成或超时。
**参数:**
- `space_id` (string,必填):Genie空间的唯一标识符
- `question` (string,必填):要问的自然语言问题
- `timeout_seconds` (int,可选):等待响应的最长时间(默认值:300)
- `poll_interval_seconds` (int,可选):状态检查之间的时间间隔(默认值:2)
**退货:** 包含对话详细信息、响应、SQL查询和结果的JSON
#### 继续对话
用后续问题继续现有的对话。
**参数:**
- `space_id` (string,必填):Genie空间的唯一标识符
- `conversation_id` (string,必填):要继续的对话的ID
- `question` (字符串,必填):后续问题
- `timeout_seconds` (int,可选):最长等待时间(默认值:300)
- `poll_interval_seconds` (int,可选):检查间隔时间(默认值:2)
**退货:** 带有消息详细信息和结果的JSON(格式与 `ask_genie`)
#### get_query_results
从已完成的消息中获取查询结果数据。
**参数:**
- `space_id` (string,必填):Genie空间的唯一标识符
- `conversation_id` (string,必填):对话的ID
- `message_id` (string,必填):包含查询结果的消息的ID
- `attachment_id` (字符串,可选):可选的特定附件ID
**退货:** 带查询结果的JSON(最多5000行)
#### list_conversations
列出Genie空间中的对话。
**参数:**
- `space_id` (string,必填):Genie空间的唯一标识符
- `page_size` (int,可选):要返回的对话数(默认值:50)
- `page_token` (字符串,可选):分页标记
**退货:** 带有对话摘要的JSON
#### get_对话_历史
获取对话中的所有消息。
**参数:**
- `space_id` (string,必填):Genie空间的唯一标识符
- `conversation_id` (string,必填):对话的ID
**退货:** 带有完整对话线程的JSON
### 配置生成工具
#### get_config模式
获取Genie空间配置的JSON模式和文档。这是人工智能助手了解如何生成有效配置的推荐方式。
**参数:** 无
**退货:** JSON,包含全面的模式文档,包括:
- Pydantic模型的完整JSON模式
- 必填字段与可选字段
- 验证规则和评分标准
- 最佳做法和准则
- 完成示例配置
- 使用说明和工作流程
#### get_config模板
获取特定域的预配置配置模板。模板包括适用于域的指令、示例查询和用于自定义的占位符。
**参数:**
- `domain` (字符串,可选):分析空间的类型(默认值:“minimal”)
- `minimal` -最低有效配置(得分~70)
- `sales` -收入跟踪、交易分析、基于时间的指标
- `customer` -用户行为、细分、留存分析
- `inventory` -库存水平、仓库运营
- `financial` -预算、费用、损益报告
- `hr` -员工人数、薪酬、绩效
**退货:** 带占位符的JSON模板: `[CATALOG]`, `[SCHEMA]`, `[TABLE_NAME]`
#### generate_space_config(已弃用)
> **此工具已弃用。** 使用 `get_config_schema()` 和 `get_config_template()` 相反。
使用外部LLM服务端点根据自然语言要求生成完整的Genie空间配置。
**参数:**
- `requirements` (字符串,必填):所需Genie空间的自然语言描述
- `warehouse_id` (字符串,必填):用于执行查询的SQL仓库ID
- `catalog_name` (字符串,必填):要使用的Unity目录名称
- `serving_endpoint_name` (字符串,可选):服务端点名称(如果未提供,则使用默认值)
- `validate_sql` (bool,可选):是否验证SQL语法(默认值:true)
**退货:** 带有生成的配置、推理、置信度评分和验证报告的JSON
#### validate_space_config
使用多层验证验证Genie空间配置。
**验证层:**
1. 模式验证(Pydantic模型)
1. SQL语法验证(sqlparse)
1. 教学质量评分
1. 完整性检查
**参数:**
- `config` (string,必填):包含Genie空间配置的JSON字符串
- `validate_sql` (bool,可选):是否验证SQL语法(默认值:true)
- `catalog_name` (字符串,可选):上下文的目录名称
**退货:** 带有验证结果的JSON
**分数细分:**
- 90-100:卓越的配置
- 80-89:配置良好,略有改进
- 70-79:可接受,但有一些警告
- 60-69:需要改进
- \
## 使用示例
### 空间管理
**列出空间:**
List all Genie spaces
**获取空间详细信息:**
Get details for space ID 01ef...
**创建空间:**
config = { "space_name": "Sales Analytics", "description": "Natural language queries for sales data", "tables": [ { "catalog_name": "main", "schema_name": "sales", "table_name": "transactions" } ], "instructions": [ { "content": "Use transaction_date for date filtering", "priority": 1 } ] }
create_genie_space( warehouse_id="abc123", config_json=json.dumps(config), title="Sales Analytics" )
### 会话查询
**问一个问题:**
result = await ask_genie( space_id="01ef...", question="What were the top 10 selling products last week?", timeout_seconds=300 )
在克劳德桌面中:
Ask space [space_id]: "What were total sales last month?"
**继续对话:**
result = await continue_conversation( space_id="01ef...", conversation_id="conv123", question="Show me the revenue for those products" )
### 配置生成
**让克劳德创建一个精灵空间:**
Create a Genie space for my sales data in main.sales.transactions
在幕后,克劳德将:
1. 呼叫 `get_config_schema()` 了解格式
1. 呼叫 `get_config_template(domain="sales")` 找到一个起点
1. 通过用表信息替换占位符来生成配置
1. 呼叫 `validate_space_config()` 检查质量
1. 呼叫 `create_genie_space()` 创造空间
## 建筑
MCP Server (stdio) ├── Space Management Tools (CRUD via Databricks SDK) ├── Conversation Tools (async polling, rate limiting) ├── Config Generation Tools (schema-driven) └── Skills (high-level workflow prompts) ├── /create-space → Space Orchestrator + Warehouse Discovery ├── /ask → Conversation Manager + Result Formatter ├── /inspect → Config Analyzer └── /bulk → Batch Operations
### 关键组件
- **fastmcp** -基于装饰器的Python MCP框架
- **Databricks SDK** -用于API访问的官方Python SDK
- **派丹蒂克** -数据验证和设置管理
- **sqlparse** -SQL语法验证
- **异步** -长时间运行的查询的异步轮询
### 内部:配置转换
服务器会自动在两种格式之间转换:
- **面向用户:** `GenieSpaceConfig` (Pydantic模型,对开发人员友好)
- **API格式:** Protobuf JSON v2(Rancher内部格式)
转换在内部透明地发生 `create_genie_space` 和 `update_genie_space`用户总是使用更简单的 `GenieSpaceConfig` 格式。
### 速率限制
Genie API限值: **每分钟5个查询** (公开预览)
服务器自动执行以下操作:
- 在滑动窗口中跟踪请求
- 达到限制时阻塞
- 等待窗口滑动
### 已知限制
- **批量更新:** 构建修改后的配置,但需要 `warehouse_id` 这可能不可用。解决方法:导出配置,修改,然后使用 `update_genie_space` 直接。
- **克隆操作:** 尚未实施 `/bulk`.改用导出+修改+创建工作流。
- **仅预览模式:** 这 `/ask` 参数存在,但尚未实现。
## 故障排除
### 身份验证错误
AuthenticationError: Authentication failed
**解决方案**:检查您的凭据 `.env`:
- 验证 `DATABRICKS_HOST` 正确(包括https://)
- 确保 `DATABRICKS_TOKEN` 有效(或CLIENT_ID/机密)
- 测试用 `databricks workspace ls /` 使用CLI
### 未找到模块
ModuleNotFoundError: No module named 'genie_mcp_server'
**解决方案**:
- 确保虚拟环境已激活
- 重新运行: `pip install -e .`
### 速率限制错误
RateLimitError: Rate limit exceeded
**解决方案**:Genie允许5次查询/分钟。等待60秒或降低查询频率。工具自动处理速率限制。
### 超时错误
TimeoutError: Operation timed out after 300 seconds
**解决方案**:增加 `timeout_seconds` 用于复杂查询的参数或在中设置 `.env`: `DATABRICKS_TIMEOUT_SECONDS=600`
### 未找到空间
SpaceNotFoundError: Resource not found
**解决方案**:验证space_id是否存在 `list_genie_spaces`.
### 配置文件问题(CLI身份验证)
**未找到配置文件:**
databricks auth login ./configure.sh
**配置文件显示(未配置):**
databricks auth login --profile YOUR_PROFILE_NAME
### “未提供空间ID,也未找到最近的对话”
**解决方案:** 提供 `space_id` 或 `space_name` 明确地:
ask(question="What is revenue?", space_id="abc123")
### “验证分数低”
**解决方案:** 审查建议并改进配置:
result = create_space(catalog_name="main", schema_name="sales", table_names="orders", expert=True)
Add more instructions, examples, SQL snippets, then create manually
## 发展
### 运行测试
pytest tests/
### 代码格式化
black src/ tests/ ruff check src/ tests/ mypy src/
### 项目结构
genie-mcp-server/ ├── src/genie_mcp_server/ │ ├── server.py # Main MCP server entry point │ ├── config.py # Configuration management │ ├── auth.py # Databricks authentication │ ├── tools/ │ │ ├── space_tools.py # Space CRUD operations │ │ ├── conversation_tools.py # Query/conversation tools │ │ └── config_gen_tools.py # Config generation tools │ ├── skills/ │ │ ├── create_space_skill.py # /create-space workflow │ │ ├── ask_skill.py # /ask workflow │ │ ├── inspect_skill.py # /inspect workflow │ │ ├── bulk_skill.py # /bulk workflow │ │ └── utils/ │ │ ├── warehouse_discovery.py # Auto warehouse selection │ │ ├── conversation_manager.py# Conversation state tracking │ │ ├── result_formatter.py # Adaptive result formatting │ │ ├── space_orchestrator.py # Multi-step creation workflows │ │ └── config_analyzer.py # Config quality analysis │ ├── client/ │ │ ├── genie_client.py # Databricks API wrapper │ │ └── polling.py # Async polling utilities │ ├── generators/ │ │ ├── space_config_generator.py # LLM config generation │ │ ├── validator.py # Config validation │ │ └── prompts.py # LLM prompt templates │ ├── models/ │ │ ├── space.py # Pydantic models │ │ ├── protobuf_format.py # Config Protobuf transformer │ │ └── responses.py # API response models │ └── utils/ │ ├── error_handling.py # Error translation │ └── rate_limiter.py # Rate limiting ├── tests/ ├── examples/ ├── pyproject.toml └── README.md
## 贡献
欢迎投稿!拜托:
1. 克隆该仓库
1. 创建要素分支
1. 添加新功能的测试
1. 提交拉取请求
## 许可证
Apache许可证2.0
## 支持
对于问题和疑问:
- GitHub问题: [创建问题](https://github.com/databricks-field-eng/genie-mcp-server/issues)
- 文档: [Databricks Genie文档](https://docs.databricks.com/genie/)
## 参考文献
- [Databricks精灵API](https://docs.databricks.com/api/workspace/genie)
- [精灵对话API](https://docs.databricks.com/aws/en/genie/conversation-api)
- [模型上下文协议](https://modelcontextprotocol.io)
- [fastmcp](https://github.com/jlowin/fastmcp)
- [OpenJDK Python](https://docs.databricks.com/dev-tools/sdk-python)