Back to home@dingxin-tech

dsh-maxcompute

DSH (DeepSeek Harness) plugin for MaxCompute (ODPS): metadata browsing, cost-gated SQL execution, background jobs and result export.

Stars
0
Language
TypeScript
Created
Aug 31, 2026
Updated
Aug 31, 2026
GitHub repo

Introduction

dsh-maxcompute

MaxCompute (ODPS) data analysis plugin for DSH (DeepSeek Harness): metadata browsing, cost-gated SQL execution, background jobs and result export — all backed by the maxc CLI.

CI npm License: MIT

Architecture

┌─────────────────────────────────────────────────────┐
│  maxcompute-tools (consumer)                        │
│  9 model-facing tools + readonly guard + cost gate  │
├─────────────────────────────────────────────────────┤
│  maxcompute-maxc (provider)                         │
│  Implements MaxComputeService via maxc subprocess   │
├─────────────────────────────────────────────────────┤
│  maxcompute-core (contract)                         │
│  Pure types — zero runtime registration             │
└─────────────────────────────────────────────────────┘
                    ↓ execFile
              maxc <args> --json

Auth lives in maxc's own config — this plugin never sees credentials.

Prerequisites

# 1. Install maxc (Python CLI for MaxCompute)
pip install aliyun-odps-console

# 2. Authenticate once — OAuth (recommended), AK, or STS
maxc auth login --oauth        # browser-based, auto-refresh
maxc auth login --from-env     # or from ODPS_ACCESS_ID / ODPS_ACCESS_KEY

Install

npm install dsh-maxcompute

DSH reads the dsh.bundle.patch field in package.json and loads cordis.patch.yml, which wires the three layers. Each row can be replaced by id from a later patch layer (profile / home / --patch overlay).

Configuration

LayerKeyTypeDefaultDescription
maxcompute-maxcmaxcBinstringmaxcPath to the maxc binary
maxcompute-maxcprojectstringDefault project override (--project)
maxcompute-maxctimeoutMsnumber600000Kill a foreground maxc process after this many ms
maxcompute-toolsreadonlybooleantrueDeny DDL/DML/SET/TUNNEL at the guard layer
maxcompute-toolsdryRunScanGBThresholdnumber10Refuse mc_run_sql when estimated scan exceeds this
maxcompute-toolsmaxPreviewRowsnumber50Default row cap for previews returned to the model

The readonly guard is monotonic: once enabled it cannot be re-allowed by later listeners.

Tools

ToolDescription
mc_list_tablesList tables in a project, optional prefix filter
mc_describe_tableColumn schema, partition columns, size, comment
mc_list_partitionsList partition values for a partitioned table
mc_sample_tableRow-limited preview (always safe)
mc_explain_sqlDry-run cost estimate — call before expensive queries
mc_run_sqlExecute SQL (readonly guard + cost gate)
mc_job_statusPoll an async job's state / progress / logview
mc_job_resultFetch results, optionally export to file
mc_job_cancelCancel a running job

Example session

User:    帮我看看 odps_demo 项目里有哪些表
Model:   → mc_list_tables(project="odps_demo")
         found 42 tables: dwd_trade_detail, dws_user_profile, ...

User:    查一下 dwd_trade_detail 昨天的成交额
Model:   → mc_explain_sql(sql="SELECT ... WHERE dt='20260819'")
         estimated scan: 2.3 GB — under the 10 GB threshold
         → mc_run_sql(sql="SELECT ...", maxRows=50)
         total GMV: ¥1,234,567.89

Development

git clone https://github.com/dingxin-tech/dsh-maxcompute.git
cd dsh-maxcompute
npm install

npm run build      # tsc
npm run typecheck  # tsc --noEmit
npm test           # vitest

Replacing the provider

To swap maxc for an in-house gateway, create a patch layer that re-inserts row id maxcompute-maxc with your own module providing the same maxcompute service. The tools layer depends only on the service contract from maxcompute-core.

License

MIT