deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:maxmilian/dsh-odoo
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
dsh-odoo is a free, open-source, read-only DeepSeek Harness plugin for the Odoo external API.
It lets an agent inspect Odoo business data — contacts, quotations, sales orders, invoices,
project tasks, leads, stock — without changing Odoo state. One opt-in tool can create a
strictly limited draft record, and it is not even registered unless you enable it.
✅ Verified against Odoo 18 on 2026-08-27 — the official
odoo:18image reportingserver_version18.0-20260817. Most compatibility assumptions were checked on a live server; the results, and what is still unverified, are indocs/live-verification.md: only Odoo 18 was tested (8–17 and 19 were not), and only a Docker image reached directly — behind a reverse proxy, Odoo Online and Odoo.sh remain untested. The plugin speaks JSON-RPC only and needs/jsonrpcto be reachable (see Transport). When something breaks, please report the Odoo version and serie, how it is deployed (Odoo Online, Odoo.sh, self-hosted, container, and which reverse proxy sits in front), and the full output ofodoo_server_info.
| Tool | Purpose |
|---|---|
odoo_server_info |
Read the server version and the authenticated user id. |
odoo_describe_model |
List the queryable fields of one allow-listed model. |
odoo_search_read |
Run a restricted search_read on one allow-listed model. |
odoo_create_draft |
Create one draft record. Requires allowWrite: true; otherwise it is never registered. |
This plugin speaks JSON-RPC 2.0 to POST {baseUrl}/jsonrpc, so your Odoo server must expose
that endpoint (it is provided by the web module). If the endpoint is missing, redirected, or
intercepted by a proxy, every tool fails with a TRANSPORT_UNSUPPORTED error that says so.
XML-RPC is not implemented.
The 14 allow-listed models are not guaranteed to exist on every Odoo. Only the base models
are always present; the rest come from business modules a stock Odoo does not install.
| Module | Allow-listed models | Installed by default |
|---|---|---|
base |
res.partner, res.users, res.company |
yes |
product |
product.product, product.template |
no |
sale / sale_management |
sale.order, sale.order.line |
no |
purchase |
purchase.order |
no |
account |
account.move, account.move.line |
no |
project |
project.project, project.task |
no |
crm |
crm.lead |
no |
stock |
stock.quant |
no |
On a stock Odoo 18 with no business modules, querying sale.order fails with
ODOO_VALIDATION_ERROR carrying the upstream reason Object sale.order doesn't exist. Call
odoo_describe_model first to confirm a model is available on your instance.
@deepseek-ai/dsh-tools APIsEnvironment variables are recommended so credentials do not appear in a profile patch:
export ODOO_URL='https://odoo.example.com'
export ODOO_DB='production'
export ODOO_USERNAME='integration@example.com'
export ODOO_API_KEY='your-api-key'
Plugin config takes precedence over environment variables:
| Config | Environment fallback | Default |
|---|---|---|
baseUrl |
ODOO_URL |
required |
db |
ODOO_DB |
required |
username |
ODOO_USERNAME |
required |
apiKey |
ODOO_API_KEY |
required |
companyId |
ODOO_COMPANY_ID |
unset |
allowWrite |
none (deliberately) | false |
locale |
none | en (en / zh-TW / zh-CN / ja) |
defaultLimit |
none | 20 (1–100) |
requestTimeoutMs |
none | 30000 (1–300000) |
maxResponseBytes |
none | 1000000 (1–52428800) |
Credentials are only required when a tool actually runs: installing the plugin without filling
them in does not break profile loading. locale switches tool and parameter descriptions;
tool names and error messages always stay in English.
write, unlink, or workflow actions exist in this release.res.partner, res.users,
res.company, product.product, product.template, sale.order, sale.order.line,
purchase.order, account.move, account.move.line, project.project, project.task,
crm.lead, stock.quant.('partner_id','in',[ids]). This
keeps the allow list an actual capability boundary instead of a suggestion.binary are rejected, and default field sets
never include one.limit ≤ 100, offset + limit ≤ 10000,
single string values truncated at 2000 characters, and a hard byte cap on every response.active_test context is not exposed.sale.order is always created with state=draft;
project.task may not specify state or stage_id, so Odoo applies its own default stage.
Only an allow-listed subset of fields is accepted, and one-to-many commands are rejected.list_customers, list_quotations, …). They depend on field
assumptions that cannot be verified without a live Odoo, and a wrong assumption returns an
empty result instead of an error — the worst failure mode for an agent. Deferred to 0.2.bun install
bun run lint
bun run typecheck
bun run test
bun run build
scripts/smoke-odoo.sh runs a manual end-to-end check against a real server; it is deliberately
excluded from CI.
MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。