changedOutput schema / (root)
Previous value: -nullNew value: +{
+ "$defs": {
+ "PlainValue": {
+ "description": "A figure, tagged so a reader knows how to write it: amounts and quantities are exact decimal strings, never floats.",
+ "oneOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "amount": {
+ "type": "string"
+ },
+ "currency": {
+ "description": "An ISO 4217 code.",
+ "type": "string"
+ },
+ "kind": {
+ "const": "money"
+ }
+ },
+ "required": [
+ "kind",
+ "amount",
+ "currency"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "kind": {
+ "const": "quantity"
+ },
+ "places": {
+ "description": "How many decimal places the rounding rule keeps; pad to it, never round.",
+ "minimum": 0,
+ "type": "integer"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "kind",
+ "value",
+ "unit"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "kind": {
+ "const": "ratio"
+ },
+ "value": {
+ "description": "A fraction: 0.13 is 13 %.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "kind",
+ "value"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "base": {
+ "type": "string"
+ },
+ "kind": {
+ "const": "rate"
+ },
+ "per": {
+ "description": "`per` units of `base` cost `value` units of `quote`.",
+ "type": "string"
+ },
+ "quote": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "kind",
+ "value",
+ "base",
+ "quote",
+ "per"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "grouping": {
+ "const": false
+ },
+ "kind": {
+ "const": "count"
+ },
+ "value": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "kind",
+ "value"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "kind": {
+ "const": "code"
+ },
+ "value": {
+ "description": "A token from a fixed list the tool exports; the words for it are the copy key `<tool>.code.<value>`.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "kind",
+ "value"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "kind": {
+ "const": "date"
+ },
+ "value": {
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
+ "type": "string"
+ }
+ },
+ "required": [
+ "kind",
+ "value"
+ ],
+ "type": "object"
+ }
+ ]
+ },
+ "Provenance": {
+ "additionalProperties": false,
+ "description": "Where the figures in an answer come from. In every answer, errors included.",
+ "properties": {
+ "api": {
+ "const": "v1"
+ },
+ "datasets": {
+ "items": {
+ "$ref": "#/$defs/ProvenanceDataset"
+ },
+ "type": "array"
+ },
+ "generated_at": {
+ "description": "When the answer was made.",
+ "format": "date-time",
+ "type": "string"
+ },
+ "language": {
+ "description": "The language of the source lines.",
+ "enum": [
+ "zh-CN",
+ "en",
+ "ja",
+ "ko"
+ ]
+ },
+ "license": {
+ "additionalProperties": false,
+ "description": "The license as copy keys: which text applies. `status` was `draft` until the text was approved (2026-10-12) and is `approved` now.",
+ "properties": {
+ "ours": {
+ "type": "string"
+ },
+ "status": {
+ "enum": [
+ "draft",
+ "approved"
+ ]
+ },
+ "underlying": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "status",
+ "ours",
+ "underlying"
+ ],
+ "type": "object"
+ },
+ "notice": {
+ "description": "本站非官方渠道的说明:引用本站数据时请和来源行一起转述。 / The site’s own line that it is not an official channel: pass it on with the source line when you quote us.",
+ "type": "string"
+ },
+ "site": {
+ "description": "The site the data is published by.",
+ "type": "string"
+ },
+ "source_line": {
+ "description": "来源行:回复用户时请原样引用它,让读者知道数据出自哪里、有多新。 / The credit line to quote as it is when you answer: who the figures come from and how fresh they are (the newest publisher’s day among the datasets used, or the day the answer was made).",
+ "type": "string"
+ }
+ },
+ "required": [
+ "api",
+ "site",
+ "generated_at",
+ "language",
+ "source_line",
+ "notice",
+ "datasets",
+ "license"
+ ],
+ "type": "object"
+ },
+ "ProvenanceDataset": {
+ "additionalProperties": false,
+ "description": "A dataset version an answer drew on. An origin the register does not let the site show is named nowhere.",
+ "properties": {
+ "id": {
+ "description": "The dataset.",
+ "type": "string"
+ },
+ "origin": {
+ "description": "The origin’s id in the register; null when the site may not show it.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "published_at": {
+ "description": "The publisher’s own date (and time, with its offset, when it gives one).",
+ "type": "string"
+ },
+ "source": {
+ "description": "The publisher’s own source line, in the answer’s language; null when there is none to show.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "source_url": {
+ "description": "The publisher’s page, only where the register lets the site link to it.",
+ "type": "string"
+ },
+ "version": {
+ "description": "Its version, named after the publisher’s date.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "version",
+ "published_at",
+ "origin",
+ "source"
+ ],
+ "type": "object"
+ },
+ "QuoteDocument": {
+ "additionalProperties": false,
+ "description": "One seller’s quote to one buyer: prices and terms only, never the seller’s costs. Each field’s description names its counterpart in OASIS UBL 2.4 Quotation. `digest` is sha256 of the canonical JSON (UTF-8, keys sorted, no spaces) of the document without `digest`; `basis.rate` names the dated exchange rate the prices rest on, which a buyer can check at https://chukoudan.com/v1/datasets/central-parity.",
+ "properties": {
+ "basis": {
+ "additionalProperties": false,
+ "description": "The dated exchange rate the prices rest on, when the seller includes it, so a buyer can check it.",
+ "properties": {
+ "made_with": {
+ "const": "https://chukoudan.com"
+ },
+ "rate": {
+ "additionalProperties": false,
+ "properties": {
+ "base": {
+ "pattern": "^[A-Z]{3}$",
+ "type": "string"
+ },
+ "day": {
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
+ "type": "string"
+ },
+ "per": {
+ "enum": [
+ "1",
+ "100"
+ ],
+ "type": "string"
+ },
+ "quote": {
+ "const": "CNY"
+ },
+ "source": {
+ "description": "`central-parity`: the RMB central parity of `day`, from https://chukoudan.com/v1/datasets/central-parity; `given`: the seller’s own rate.",
+ "enum": [
+ "central-parity",
+ "given"
+ ],
+ "type": "string"
+ },
+ "value": {
+ "pattern": "^(0|[1-9]\\d*)(\\.\\d+)?$",
+ "type": "string"
+ }
+ },
+ "required": [
+ "base",
+ "quote",
+ "value",
+ "per",
+ "source"
+ ],
+ "type": "object"
+ }
+ },
+ "required": [
+ "made_with"
+ ],
+ "type": "object"
+ },
+ "buyer": {
+ "additionalProperties": false,
+ "description": "UBL: cac:OriginatorCustomerParty. country: ISO 3166-1 alpha-2.",
+ "properties": {
+ "contact": {
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "country": {
+ "pattern": "^[A-Z]{2}$",
+ "type": "string"
+ },
+ "name": {
+ "maxLength": 120,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "country"
+ ],
+ "type": "object"
+ },
+ "currency": {
+ "description": "ISO 4217 code of every price. UBL: cbc:PricingCurrencyCode.",
+ "pattern": "^[A-Z]{3}$",
+ "type": "string"
+ },
+ "digest": {
+ "description": "`sha256:` and the hex SHA-256 of this document’s canonical JSON without `digest`: UTF-8, keys sorted, no spaces, non-ASCII characters written as themselves (Python: json.dumps(doc, sort_keys=True, separators=(\",\", \":\"), ensure_ascii=False)).",
+ "pattern": "^sha256:[0-9a-f]{64}$",
+ "type": "string"
+ },
+ "issued": {
+ "description": "The day the quote is issued, YYYY-MM-DD. UBL: cbc:IssueDate.",
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
+ "type": "string"
+ },
+ "items": {
+ "description": "The goods. One line in v1. UBL: cac:QuotationLine/cac:LineItem.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "description": {
+ "description": "UBL: cac:Item/cbc:Description.",
+ "type": "string"
+ },
+ "hs_code": {
+ "description": "The seller’s HS code, digits only. UBL: cac:Item/cac:CommodityClassification/cbc:ItemClassificationCode.",
+ "type": "string"
+ },
+ "origin": {
+ "description": "Country of origin, ISO 3166-1 alpha-2. UBL: cac:Item/cac:OriginCountry.",
+ "pattern": "^[A-Z]{2}$",
+ "type": "string"
+ },
+ "packing": {
+ "description": "How the goods are packed, as the seller says it.",
+ "type": "string"
+ },
+ "quantity": {
+ "description": "A decimal string. UBL: cac:LineItem/cbc:Quantity.",
+ "pattern": "^(0|[1-9]\\d*)(\\.\\d+)?$",
+ "type": "string"
+ },
+ "unit": {
+ "description": "UN/ECE Recommendation 20 code: the quantity’s unitCode in UBL.",
+ "enum": [
+ "PCE",
+ "SET",
+ "CT",
+ "KGM"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "description",
+ "origin",
+ "quantity",
+ "unit"
+ ],
+ "type": "object"
+ },
+ "maxItems": 1,
+ "minItems": 1,
+ "type": "array"
+ },
+ "lead_time_days": {
+ "description": "Days from order to shipment, a whole number.",
+ "type": "integer"
+ },
+ "notes": {
+ "description": "UBL: cbc:Note.",
+ "type": "string"
+ },
+ "number": {
+ "description": "The seller’s quote number. UBL: cbc:ID.",
+ "type": "string"
+ },
+ "payment": {
+ "description": "Payment terms as the seller writes them (T/T, L/C at sight…). UBL: cac:PaymentTerms/cbc:Note.",
+ "type": "string"
+ },
+ "prices": {
+ "description": "One price per term offered. UBL quotes one set of delivery terms per document; this lists several side by side.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "commission_included": {
+ "description": "Whether the price includes the buying agent’s commission (含佣).",
+ "type": "boolean"
+ },
+ "place": {
+ "description": "The named place: port of loading for FOB, port of destination for CFR and CIF.",
+ "type": "string"
+ },
+ "term": {
+ "description": "Incoterms 2020 term. UBL: cac:Delivery/cac:DeliveryTerms/cbc:ID.",
+ "enum": [
+ "FOB",
+ "CFR",
+ "CIF"
+ ],
+ "type": "string"
+ },
+ "total": {
+ "description": "unit_price × quantity, a decimal string in `currency`. UBL: cbc:LineExtensionAmount.",
+ "pattern": "^(0|[1-9]\\d*)(\\.\\d+)?$",
+ "type": "string"
+ },
+ "unit_price": {
+ "description": "A decimal string in `currency`. UBL: cac:Price/cbc:PriceAmount.",
+ "pattern": "^(0|[1-9]\\d*)(\\.\\d+)?$",
+ "type": "string"
+ }
+ },
+ "required": [
+ "term",
+ "place",
+ "unit_price",
+ "total",
+ "commission_included"
+ ],
+ "type": "object"
+ },
+ "minItems": 1,
+ "type": "array"
+ },
+ "schema": {
+ "const": "https://chukoudan.com/schemas/quote/v1.json",
+ "description": "This schema’s address, which names its version."
+ },
+ "seller": {
+ "additionalProperties": false,
+ "description": "UBL: cac:SellerSupplierParty. country: ISO 3166-1 alpha-2.",
+ "properties": {
+ "contact": {
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "country": {
+ "pattern": "^[A-Z]{2}$",
+ "type": "string"
+ },
+ "name": {
+ "maxLength": 120,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "country"
+ ],
+ "type": "object"
+ },
+ "valid_until": {
+ "description": "The last day the quote holds. UBL: cac:ValidityPeriod/cbc:EndDate.",
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
+ "type": "string"
+ }
+ },
+ "required": [
+ "schema",
+ "issued",
+ "valid_until",
+ "seller",
+ "buyer",
+ "items",
+ "currency",
+ "prices",
+ "basis"
+ ],
+ "title": "Quote (chukoudan.com, v1)",
+ "type": "object"
+ },
+ "Step": {
+ "additionalProperties": false,
+ "description": "One line of the worked example: `id` is the copy key of its sentence, `values` fill it in.",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "message": {
+ "description": "这一步的一句话说明,数值已代入,用请求的语言。 / The step as one sentence in the language asked, its figures filled in. Absent when a sentence cannot be made whole.",
+ "type": "string"
+ },
+ "values": {
+ "additionalProperties": {
+ "$ref": "#/$defs/PlainValue"
+ },
+ "type": "object"
+ }
+ },
+ "required": [
+ "id",
+ "values"
+ ],
+ "type": "object"
+ },
+ "Warning": {
+ "additionalProperties": false,
+ "description": "Something a reader should know about a result; `code` is a copy key.",
+ "properties": {
+ "code": {
+ "type": "string"
+ },
+ "level": {
+ "description": "Absent means a caution.",
+ "enum": [
+ "note",
+ "hint"
+ ]
+ },
+ "message": {
+ "description": "这条提醒的一句话说明,数值已代入,用请求的语言:回复时请用它,不要自己编数字。 / The warning as one sentence in the language asked, its figures filled in: use it, do not make up figures. Absent when a sentence cannot be made whole.",
+ "type": "string"
+ },
+ "next": {
+ "description": "For a hint: the slug of the tool it points to.",
+ "type": "string"
+ },
+ "values": {
+ "additionalProperties": {
+ "$ref": "#/$defs/PlainValue"
+ },
+ "type": "object"
+ }
+ },
+ "required": [
+ "code",
+ "values"
+ ],
+ "type": "object"
+ }
+ },
+ "additionalProperties": false,
+ "properties": {
+ "internal": {
+ "description": "The seller’s own figures (cost, refund, profit, margin, break-even): never send these to the buyer.",
+ "properties": {
+ "do_not_send": {
+ "const": true
+ },
+ "outputs": {
+ "type": "object"
+ },
+ "steps": {
+ "items": {
+ "$ref": "#/$defs/Step"
+ },
+ "type": "array"
+ },
+ "warnings": {
+ "items": {
+ "$ref": "#/$defs/Warning"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "do_not_send",
+ "outputs",
+ "steps",
+ "warnings"
+ ],
+ "type": "object"
+ },
+ "provenance": {
+ "$ref": "#/$defs/Provenance"
+ },
+ "quote": {
+ "$ref": "#/$defs/QuoteDocument"
+ },
+ "text": {
+ "type": "string"
+ },
+ "tool": {
+ "const": "make_quote"
+ }
+ },
+ "required": [
+ "tool",
+ "quote",
+ "text",
+ "internal",
+ "provenance"
+ ],
+ "type": "object"
+}