Opinionated paranoid text spacing: automatically inserts whitespace between CJK (Chinese, Japanese, Korean) and ANS (alphabetical letters, numerical digits and symbols).
- pangu.js
- pangu.py
- pangu.go
- pangu.java
- pangu.space (Website and HTTP API)
Try it at pangu.space: paste text on the left, get the spaced text on the right, with every added or removed space highlighted.
https://api.pangu.space/text
Use GET with query strings.
$ curl --get https://api.pangu.space/text --data-urlencode "text=當你凝視著bug,bug也凝視著你"
{"text":"當你凝視著 bug,bug 也凝視著你","lib":"pangu-js","version":"10.4.0"}Use QUERY if you want to use a JSON body. Content-Type is optional; if provided, it must be application/json.
$ curl --request QUERY https://api.pangu.space/text --header "Content-Type: application/json" --data '{"text": "與PM戰鬥的人,應當小心自己不要成為PM"}'
{"text":"與 PM 戰鬥的人,應當小心自己不要成為 PM","lib":"pangu-js","version":"10.4.0"}Same as QUERY, for convenience.
$ curl https://api.pangu.space/text --header "Content-Type: application/json" --data '{"text": "與PM戰鬥的人,應當小心自己不要成為PM"}'
{"text":"與 PM 戰鬥的人,應當小心自己不要成為 PM","lib":"pangu-js","version":"10.4.0"}Regex rules can't tell a minus sign from a separator, so add feature=ai-spacing to the query string and an LLM decides. Works with GET, QUERY, and POST.
$ curl --get "https://api.pangu.space/text?feature=ai-spacing" --data-urlencode "text=女朋友今天的氣溫是-273.15度"
{
"text": "女朋友今天的氣溫是 -273.15 度",
"lib": "pangu-js",
"version": "10.4.0",
"model": "@cf/google/gemma-4-26b-a4b-it",
"promptVersions": { "hyphen-digit": "v29-zh", "digit-plus": "v18-en-real-examples" },
"candidates": [{ "kind": "hyphen-digit", "sentence": "女朋友今天的氣溫是-273.15度", "at": 9, "label": "signed-number" }]
}candidates: every symbol the model was asked about.atis the symbol's index insentencelabel: the model's answer.nullmeans the model failed, and that symbol keeps the regex spacing
Errors come with a code you can check:
missing_text(400): notextin the query string, or no stringtextin the JSON bodyinvalid_json(400): the QUERY or POST body is not valid JSONunsupported_media_type(415): QUERY or POST provides a content type other thanapplication/jsonunknown_feature(400): anyfeatureother thanai-spacingtoo_many_candidates(413): the text has more than 20 ambiguous spots. Split it into smaller requestsai_quota_exceeded(429): the daily AI quota is used up. It resets at 00:00 UTC, andRetry-Aftertells you how many seconds are leftmethod_not_allowed(405): any method other than GET, QUERY, POST, and OPTIONSnot_found(404): any path other than/text
{
"error": {
"code": "missing_text",
"message": "missing query parameter: text"
}
}$ npm install
$ npm run dev -w web # the website, http://localhost:5566
$ npm run dev -w api # the API, http://localhost:8787
$ npm test -w apiThe website has no bundler. web/scripts/vendor.mjs copies pangu.js into web/public/vendor/, and both dev and deploy run it first.
$ npm run deploy -w web
$ npm run deploy -w apiDesign tokens live in web/public/tokens.css. The design boards and their generators live in design/.