[{"data":1,"prerenderedAt":1939},["ShallowReactive",2],{"docs-nav:docs_zh":3,"docs-page:\u002Fdocs\u002Freference\u002Fapi":155,"docs-surround:\u002Fdocs\u002Freference\u002Fapi":1934},[4],{"title":5,"path":6,"stem":7,"children":8,"page":70},"Docs","\u002Fdocs","docs",[9,71,130],{"title":10,"icon":11,"path":12,"stem":13,"children":14,"page":70},"指南","i-lucide-book-open","\u002Fdocs\u002Fguides","docs\u002F1.guides",[15,20,25,30,35,40,45,50,55,60,65],{"title":16,"path":17,"stem":18,"icon":19},"简介","\u002Fdocs\u002Fguides\u002Fintroduction","docs\u002F1.guides\u002F01.introduction","i-lucide-info",{"title":21,"path":22,"stem":23,"icon":24},"快速上手","\u002Fdocs\u002Fguides\u002Fquick-start","docs\u002F1.guides\u002F02.quick-start","i-lucide-play",{"title":26,"path":27,"stem":28,"icon":29},"把办公室的电脑加进来","\u002Fdocs\u002Fguides\u002Foffice","docs\u002F1.guides\u002F03.office","i-lucide-building-2",{"title":31,"path":32,"stem":33,"icon":34},"在 GPU 租用平台渲染","\u002Fdocs\u002Fguides\u002Fcloud","docs\u002F1.guides\u002F04.cloud","i-lucide-cloud",{"title":36,"path":37,"stem":38,"icon":39},"配置 Cloudflare R2 存储","\u002Fdocs\u002Fguides\u002Fr2","docs\u002F1.guides\u002F05.r2","i-lucide-database",{"title":41,"path":42,"stem":43,"icon":44},"把主机放到 NAS 上","\u002Fdocs\u002Fguides\u002Fnas","docs\u002F1.guides\u002F06.nas","i-lucide-hard-drive",{"title":46,"path":47,"stem":48,"icon":49},"设备不在一处","\u002Fdocs\u002Fguides\u002Fremote","docs\u002F1.guides\u002F07.remote","i-lucide-globe",{"title":51,"path":52,"stem":53,"icon":54},"拿到成片","\u002Fdocs\u002Fguides\u002Ffilm","docs\u002F1.guides\u002F08.film","i-lucide-film",{"title":56,"path":57,"stem":58,"icon":59},"改了文件怎么办","\u002Fdocs\u002Fguides\u002Fupdate","docs\u002F1.guides\u002F09.update","i-lucide-refresh-cw",{"title":61,"path":62,"stem":63,"icon":64},"主机坏了或要换主机","\u002Fdocs\u002Fguides\u002Fhost","docs\u002F1.guides\u002F10.host","i-lucide-server-cog",{"title":66,"path":67,"stem":68,"icon":69},"常见问题","\u002Fdocs\u002Fguides\u002Ffaq","docs\u002F1.guides\u002F11.faq","i-lucide-circle-help",false,{"title":72,"icon":73,"path":74,"stem":75,"children":76,"page":70},"概念","i-lucide-box","\u002Fdocs\u002Fconcepts","docs\u002F2.concepts",[77,82,86,91,96,101,105,110,115,120,125],{"title":78,"path":79,"stem":80,"icon":81},"工作区和主机","\u002Fdocs\u002Fconcepts\u002Fworkspace","docs\u002F2.concepts\u002F01.workspace","i-lucide-network",{"title":83,"path":84,"stem":85,"icon":44},"存储","\u002Fdocs\u002Fconcepts\u002Fstorage","docs\u002F2.concepts\u002F02.storage",{"title":87,"path":88,"stem":89,"icon":90},"资产、解包与按需拉取","\u002Fdocs\u002Fconcepts\u002Fassets","docs\u002F2.concepts\u002F03.assets","i-lucide-images",{"title":92,"path":93,"stem":94,"icon":95},"项目、任务和版本","\u002Fdocs\u002Fconcepts\u002Ftasks","docs\u002F2.concepts\u002F04.tasks","i-lucide-list-checks",{"title":97,"path":98,"stem":99,"icon":100},"镜头和分段","\u002Fdocs\u002Fconcepts\u002Fshots","docs\u002F2.concepts\u002F05.shots","i-lucide-clapperboard",{"title":102,"path":103,"stem":104,"icon":54},"成片","\u002Fdocs\u002Fconcepts\u002Ffilm","docs\u002F2.concepts\u002F06.film",{"title":106,"path":107,"stem":108,"icon":109},"Blender 和 FFmpeg","\u002Fdocs\u002Fconcepts\u002Fruntimes","docs\u002F2.concepts\u002F07.runtimes","i-lucide-package",{"title":111,"path":112,"stem":113,"icon":114},"加入与权限","\u002Fdocs\u002Fconcepts\u002Fjoining","docs\u002F2.concepts\u002F08.joining","i-lucide-key-round",{"title":116,"path":117,"stem":118,"icon":119},"渲染名额","\u002Fdocs\u002Fconcepts\u002Fseats","docs\u002F2.concepts\u002F09.seats","i-lucide-gauge",{"title":121,"path":122,"stem":123,"icon":124},"备份和接管","\u002Fdocs\u002Fconcepts\u002Fbackup","docs\u002F2.concepts\u002F10.backup","i-lucide-life-buoy",{"title":126,"path":127,"stem":128,"icon":129},"插件","\u002Fdocs\u002Fconcepts\u002Fplugins","docs\u002F2.concepts\u002F11.plugins","i-lucide-puzzle",{"title":131,"icon":132,"path":133,"stem":134,"children":135,"page":70},"参考","i-lucide-library","\u002Fdocs\u002Freference","docs\u002F3.reference",[136,141,146,151],{"title":137,"path":138,"stem":139,"icon":140},"命令行","\u002Fdocs\u002Freference\u002Fcli","docs\u002F3.reference\u002F1.cli","i-lucide-terminal",{"title":142,"path":143,"stem":144,"icon":145},"本机配置","\u002Fdocs\u002Freference\u002Fconfig","docs\u002F3.reference\u002F2.config","i-lucide-sliders",{"title":147,"path":148,"stem":149,"icon":150},"HTTP 接口","\u002Fdocs\u002Freference\u002Fapi","docs\u002F3.reference\u002F3.api","i-lucide-code-xml",{"title":152,"path":153,"stem":154,"icon":129},"插件开发","\u002Fdocs\u002Freference\u002Fplugins","docs\u002F3.reference\u002F4.plugins",{"id":156,"title":147,"body":157,"description":1928,"extension":1929,"meta":1930,"navigation":1931,"path":148,"seo":1932,"stem":149,"__hash__":1933},"docs_zh\u002Fdocs\u002F3.reference\u002F3.api.md",{"type":158,"value":159,"toc":1912},"minimark",[160,164,172,176,232,240,243,246,261,332,339,342,444,469,476,530,541,544,551,593,619,815,818,876,879,914,921,924,932,969,991,1002,1005,1123,1126,1130,1133,1229,1246,1257,1268,1277,1280,1283,1287,1343,1346,1590,1593,1705,1707,1819,1822,1825,1901,1908],[161,162,163],"p",{},"danio 自己的界面、命令行、Blender 扩展、插件，以及加入工作区的设备，调用的是同一套 HTTP 接口。你写的脚本也可以用它。",[161,165,166,167,171],{},"接口都在 ",[168,169,170],"code",{},"\u002Fapi\u002Fv1\u002F"," 下，数据用 JSON。每个接口的参数、返回值和所需权限，都在 OpenAPI 描述里，本页只讲约定和最常用的接口。",[173,174,175],"h2",{"id":175},"地址",[177,178,179,194],"table",{},[180,181,182],"thead",{},[183,184,185,188,191],"tr",{},[186,187,175],"th",{},[186,189,190],{},"谁用",[186,192,193],{},"令牌",[195,196,197,221],"tbody",{},[183,198,199,205,218],{},[200,201,202],"td",{},[168,203,204],{},"http:\u002F\u002F127.0.0.1:7421",[200,206,207,208,212,213,217],{},"这台电脑上的程序。端口被占用时往上找，:ui",[209,210,211],"span",{},"设置"," → ",[214,215,216],"ui",{},"接口"," 里显示实际地址",[200,219,220],{},"本机令牌",[183,222,223,226,229],{},[200,224,225],{},"主机的工作区地址，默认端口 7420",[200,227,228],{},"其他电脑上的设备和脚本。主机要先对其他设备开放这个端口",[200,230,231],{},"工作区令牌",[161,233,234,235,239],{},"端口的设置见",[236,237,142],"a",{"href":238},"\u002Fdocs\u002Freference\u002Fconfig#%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F","。",[173,241,242],{"id":242},"令牌和权限",[161,244,245],{},"请求带上令牌：",[247,248,253],"pre",{"className":249,"code":250,"language":251,"meta":252,"style":252},"language-http shiki shiki-themes material-theme-palenight","Authorization: Bearer \u003C令牌>\n","http","",[168,254,255],{"__ignoreMap":252},[209,256,259],{"class":257,"line":258},"line",1,[209,260,250],{},[177,262,263,275],{},[180,264,265],{},[183,266,267,269,272],{},[186,268,193],{},[186,270,271],{},"能做什么",[186,273,274],{},"从哪来",[195,276,277,295,318],{},[183,278,279,281,284],{},[200,280,220],{},[200,282,283],{},"这台电脑的引擎能做的一切，包括只在本机的接口",[200,285,286,212,288,290,291,294],{},[214,287,211],{},[214,289,220],{}," 里看；也可以用 ",[168,292,293],{},"DANIO_TOKEN"," 固定",[183,296,297,300,308],{},[200,298,299],{},"集成令牌",[200,301,302,303,307],{},"只有你选的",[236,304,306],{"href":305},"\u002Fdocs\u002Fconcepts\u002Fjoining#%E6%9D%83%E9%99%90","权限","级别",[200,309,310,311,314,315],{},"工作区详情的 ",[214,312,313],{},"插件与集成"," 页，或 ",[168,316,317],{},"danio workspace token add \u003C名称> --access \u003C级别> --integration",[183,319,320,323,326],{},[200,321,322],{},"设备令牌",[200,324,325],{},"设备加入工作区、渲染用，也带一个权限级别",[200,327,328,329],{},"添加设备时生成，见",[236,330,193],{"href":331},"\u002Fdocs\u002Fconcepts\u002Fjoining#%E4%BB%A4%E7%89%8C",[161,333,334,335,338],{},"集成令牌只在生成时显示一次，用 ",[214,336,337],{},"轮换"," 换新，旧的立即失效。",[161,340,341],{},"工作区权限有 9 项，权限级别是它们的组合：",[177,343,344,352],{},[180,345,346],{},[183,347,348,350],{},[186,349,306],{},[186,351,271],{},[195,353,354,364,374,384,394,404,414,424,434],{},[183,355,356,361],{},[200,357,358],{},[168,359,360],{},"workspace.view",[200,362,363],{},"查看项目、任务、进度、预览、设备、用量",[183,365,366,371],{},[200,367,368],{},[168,369,370],{},"output.download",[200,372,373],{},"下载成片和各镜头的片段",[183,375,376,381],{},[200,377,378],{},[168,379,380],{},"job.submit",[200,382,383],{},"提交任务；更新、暂停、继续、取消、重渲、删除自己提交的任务",[183,385,386,391],{},[200,387,388],{},[168,389,390],{},"job.manage",[200,392,393],{},"控制所有人的任务，改队列顺序和镜头分配",[183,395,396,401],{},[200,397,398],{},[168,399,400],{},"project.edit",[200,402,403],{},"新建、修改、删除项目",[183,405,406,411],{},[200,407,408],{},[168,409,410],{},"device.manage",[200,412,413],{},"添加设备、批准加入申请、改设备的权限和设置、拉黑",[183,415,416,421],{},[200,417,418],{},[168,419,420],{},"storage.manage",[200,422,423],{},"存储、资源包、回收",[183,425,426,431],{},[200,427,428],{},[168,429,430],{},"plugin.manage",[200,432,433],{},"插件和集成令牌",[183,435,436,441],{},[200,437,438],{},[168,439,440],{},"workspace.manage",[200,442,443],{},"工作区设置、备份、接管",[161,445,446,447,450,451,454,455,458,459,461,462,464,465,468],{},"级别 ",[214,448,449],{},"无"," 没有权限，:ui",[209,452,453],{},"查看"," 有前两项，:ui",[209,456,457],{},"工作站"," 再加 ",[168,460,380],{}," 和 ",[168,463,400],{},"，:ui",[209,466,467],{},"管理"," 是全部。",[161,470,471,472,475],{},"OpenAPI 里每个接口的 ",[168,473,474],{},"x-required-permission"," 写着它要哪一项。除了上面 9 项，还有四种写法：",[177,477,478,488],{},[180,479,480],{},[183,481,482,485],{},[186,483,484],{},"写法",[186,486,487],{},"含义",[195,489,490,500,510,520],{},[183,491,492,497],{},[200,493,494],{},[168,495,496],{},"public",[200,498,499],{},"不要令牌，设备加入时用",[183,501,502,507],{},[200,503,504],{},[168,505,506],{},"token",[200,508,509],{},"任何带有效令牌的请求",[183,511,512,517],{},[200,513,514],{},[168,515,516],{},"device",[200,518,519],{},"只有设备令牌",[183,521,522,527],{},[200,523,524],{},[168,525,526],{},"local",[200,528,529],{},"只有本机令牌",[161,531,532,533,536,537,540],{},"权限不够时返回 403，错误码是 ",[168,534,535],{},"forbidden","，说明缺哪一项。",[168,538,539],{},"GET \u002Fapi\u002Fv1\u002Fme"," 返回当前令牌的身份和权限。",[173,542,543],{"id":543},"错误",[161,545,546,547,550],{},"出错时返回 ",[168,548,549],{},"application\u002Fproblem+json","：",[247,552,556],{"className":553,"code":554,"language":555,"meta":252,"style":252},"language-json shiki shiki-themes material-theme-palenight","{\n  \"type\": \"urn:danio:error:version-conflict\",\n  \"title\": \"Conflict\",\n  \"status\": 409,\n  \"detail\": \"…\"\n}\n","json",[168,557,558,563,569,575,581,587],{"__ignoreMap":252},[209,559,560],{"class":257,"line":258},[209,561,562],{},"{\n",[209,564,566],{"class":257,"line":565},2,[209,567,568],{},"  \"type\": \"urn:danio:error:version-conflict\",\n",[209,570,572],{"class":257,"line":571},3,[209,573,574],{},"  \"title\": \"Conflict\",\n",[209,576,578],{"class":257,"line":577},4,[209,579,580],{},"  \"status\": 409,\n",[209,582,584],{"class":257,"line":583},5,[209,585,586],{},"  \"detail\": \"…\"\n",[209,588,590],{"class":257,"line":589},6,[209,591,592],{},"}\n",[161,594,595,598,599,602,603,606,607,610,611,614,615,618],{},[168,596,597],{},"type"," 是稳定的错误码，程序按它判断；",[168,600,601],{},"detail"," 给人看，语言跟请求的 ",[168,604,605],{},"Accept-Language","，没写这个头或以 ",[168,608,609],{},"zh"," 开头是中文，其余是英文。校验不过的字段列在 ",[168,612,613],{},"errors"," 里；提交检查没通过时，原因列在 ",[168,616,617],{},"checks"," 里。",[177,620,621,634],{},[180,622,623],{},[183,624,625,628,631],{},[186,626,627],{},"错误码",[186,629,630],{},"状态",[186,632,633],{},"什么时候",[195,635,636,649,662,674,687,700,712,728,741,753,766,778,790,802],{},[183,637,638,643,646],{},[200,639,640],{},[168,641,642],{},"invalid-request",[200,644,645],{},"400",[200,647,648],{},"请求本身不对",[183,650,651,656,659],{},[200,652,653],{},[168,654,655],{},"unauthorized",[200,657,658],{},"401",[200,660,661],{},"没带令牌，或令牌无效",[183,663,664,668,671],{},[200,665,666],{},[168,667,535],{},[200,669,670],{},"403",[200,672,673],{},"权限不够，或这个来源不被允许",[183,675,676,681,684],{},[200,677,678],{},[168,679,680],{},"not-found",[200,682,683],{},"404",[200,685,686],{},"找不到",[183,688,689,694,697],{},[200,690,691],{},[168,692,693],{},"conflict",[200,695,696],{},"409",[200,698,699],{},"和现状冲突",[183,701,702,707,709],{},[200,703,704],{},[168,705,706],{},"version-conflict",[200,708,696],{},[200,710,711],{},"有人先更新了任务",[183,713,714,719,722],{},[200,715,716],{},[168,717,718],{},"precondition-failed",[200,720,721],{},"412",[200,723,724,727],{},[168,725,726],{},"If-Match"," 对不上",[183,729,730,735,738],{},[200,731,732],{},[168,733,734],{},"validation-failed",[200,736,737],{},"422",[200,739,740],{},"字段没通过校验",[183,742,743,748,750],{},[200,744,745],{},[168,746,747],{},"check-failed",[200,749,737],{},[200,751,752],{},"提交的检查没通过",[183,754,755,760,763],{},[200,756,757],{},[168,758,759],{},"too-many-requests",[200,761,762],{},"429",[200,764,765],{},"请求太多",[183,767,768,773,775],{},[200,769,770],{},[168,771,772],{},"render-limit",[200,774,670],{},[200,776,777],{},"同时渲染的设备数已达工作区的上限",[183,779,780,785,787],{},[200,781,782],{},[168,783,784],{},"lease-ended",[200,786,696],{},[200,788,789],{},"设备领的段已结束",[183,791,792,797,799],{},[200,793,794],{},[168,795,796],{},"lease-taken",[200,798,696],{},[200,800,801],{},"设备领的段已交给别的设备",[183,803,804,809,812],{},[200,805,806],{},[168,807,808],{},"internal",[200,810,811],{},"500",[200,813,814],{},"danio 内部出错",[173,816,817],{"id":817},"重试和并发",[819,820,821,841,852,862],"ul",{},[822,823,824,825,828,829,832,833,836,837,840],"li",{},"提交任务（",[168,826,827],{},"POST \u002Fapi\u002Fv1\u002Fjobs","）、更新任务（",[168,830,831],{},"POST \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Fversions","）和比对草稿（",[168,834,835],{},"POST \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Fversions\u002Fdraft","）可以带 ",[168,838,839],{},"Idempotency-Key","，自己取一个值。24 小时内用同一个键重试，返回第一次的结果，不会重复登记。只有成功的结果会被记住，失败后重试会重新执行。",[822,842,843,844,847,848,851],{},"同样这三个接口可以带 ",[168,845,846],{},"X-Danio-Request","，自己取一个 ID。提交进度事件 ",[168,849,850],{},"submit.progress"," 带着它，你可以认出哪条是自己的。",[822,853,854,855,858,859,861],{},"更新任务时带 ",[168,856,857],{},"baseVersion","。已有更新的版本时返回 409，错误码 ",[168,860,706],{},"，请基于最新版本重新比对。",[822,863,864,865,868,869,872,873,875],{},"项目的读取返回 ",[168,866,867],{},"ETag","，修改（",[168,870,871],{},"PATCH \u002Fapi\u002Fv1\u002Fprojects\u002F{id}","）时用 ",[168,874,726],{}," 带回去。别人先改过就返回 412。",[173,877,878],{"id":878},"列表",[161,880,881,461,884,887,888,891,892,895,896,239,899,901,902,905,906,909,910,913],{},[168,882,883],{},"GET \u002Fapi\u002Fv1\u002Fjobs",[168,885,886],{},"GET \u002Fapi\u002Fv1\u002Fprojects"," 分页：用 ",[168,889,890],{},"limit"," 指定每页多少条，返回里的 ",[168,893,894],{},"next"," 填进下一次请求的 ",[168,897,898],{},"cursor",[168,900,894],{}," 为空就是最后一页。任务列表还能用 ",[168,903,904],{},"project","（项目 ID）、",[168,907,908],{},"name","（任务名，只在项目内唯一）和 ",[168,911,912],{},"blend","（Blend 文件 ID）过滤。",[161,915,916,917,920],{},"路径里的 ",[168,918,919],{},"{id}"," 只接受 ID。按名称找，用查询参数。",[173,922,923],{"id":923},"事件流",[161,925,926,929,930,550],{},[168,927,928],{},"GET \u002Fapi\u002Fv1\u002Fevents"," 是 Server-Sent Events 长连接，需要 ",[168,931,360],{},[247,933,937],{"className":934,"code":935,"language":936,"meta":252,"style":252},"language-bash shiki shiki-themes material-theme-palenight","curl -N -H \"Authorization: Bearer $TOKEN\" http:\u002F\u002F127.0.0.1:7421\u002Fapi\u002Fv1\u002Fevents\n","bash",[168,938,939],{"__ignoreMap":252},[209,940,941,945,949,952,956,959,963,966],{"class":257,"line":258},[209,942,944],{"class":943},"s5Dmg","curl",[209,946,948],{"class":947},"sfyAc"," -N",[209,950,951],{"class":947}," -H",[209,953,955],{"class":954},"sAklC"," \"",[209,957,958],{"class":947},"Authorization: Bearer ",[209,960,962],{"class":961},"s0W1g","$TOKEN",[209,964,965],{"class":954},"\"",[209,967,968],{"class":947}," http:\u002F\u002F127.0.0.1:7421\u002Fapi\u002Fv1\u002Fevents\n",[161,970,971,972,975,976,979,980,983,984,986,987,990],{},"每个事件有 ",[168,973,974],{},"id","、",[168,977,978],{},"event","（类型）和 ",[168,981,982],{},"data","（JSON）。",[168,985,974],{}," 是字符串，不要当数字比较。连接每 15 秒发一行 ",[168,988,989],{},": ping"," 注释，用来保活。",[161,992,993,994,997,998,1001],{},"断线重连时，带上最后收到的 ",[168,995,996],{},"Last-Event-ID","，danio 补发错过的事件。它保留最近 1024 个事件；补不上时（danio 重启过，或断开太久）先发一个 ",[168,999,1000],{},"reset"," 事件，这时请重新读取状态。",[161,1003,1004],{},"OpenAPI 里列出的事件：",[177,1006,1007,1016],{},[180,1008,1009],{},[183,1010,1011,1014],{},[186,1012,1013],{},"事件",[186,1015,633],{},[195,1017,1018,1034,1044,1054,1064,1074,1084,1094,1104,1114],{},[183,1019,1020,1024],{},[200,1021,1022],{},[168,1023,850],{},[200,1025,1026,1027,1030,1031,1033],{},"提交的进度。",[168,1028,1029],{},"request"," 字段是你在 ",[168,1032,846],{}," 里给的 ID",[183,1035,1036,1041],{},[200,1037,1038],{},[168,1039,1040],{},"render.progress",[200,1042,1043],{},"这台电脑渲染的进度和状态变化",[183,1045,1046,1051],{},[200,1047,1048],{},[168,1049,1050],{},"queue.changed",[200,1052,1053],{},"排队变了：有任务加入，或顺序变了",[183,1055,1056,1061],{},[200,1057,1058],{},[168,1059,1060],{},"device.room",[200,1062,1063],{},"设备磁盘空间不足、已满或已恢复",[183,1065,1066,1071],{},[200,1067,1068],{},[168,1069,1070],{},"workspace.devices",[200,1072,1073],{},"设备列表变了：有设备加入、离开，或改了设置、名称、权限、拉黑",[183,1075,1076,1081],{},[200,1077,1078],{},[168,1079,1080],{},"workspace.join-request",[200,1082,1083],{},"局域网里有设备申请加入",[183,1085,1086,1091],{},[200,1087,1088],{},[168,1089,1090],{},"workspace.license",[200,1092,1093],{},"授权导入或移除了",[183,1095,1096,1101],{},[200,1097,1098],{},[168,1099,1100],{},"notice",[200,1102,1103],{},"这台设备的窗口程序要弹的提示",[183,1105,1106,1111],{},[200,1107,1108],{},[168,1109,1110],{},"window.show",[200,1112,1113],{},"danio 窗口要打开某一页",[183,1115,1116,1120],{},[200,1117,1118],{},[168,1119,1000],{},[200,1121,1122],{},"错过的事件补不上，请重新读取状态",[161,1124,1125],{},"流里还会有别的事件。不认识的事件类型，忽略就行。",[173,1127,1129],{"id":1128},"openapi-描述","OpenAPI 描述",[161,1131,1132],{},"完整的接口描述是 OpenAPI 3.1 的 JSON，有两种拿法：",[247,1134,1136],{"className":934,"code":1135,"language":936,"meta":252,"style":252},"# 命令行输出，默认中文\ndanio openapi > openapi.json\n\n# 英文\ndanio openapi --lang en > openapi.json\n\n# 从运行中的 danio 取，带任意有效令牌\ncurl -H \"Authorization: Bearer $TOKEN\" \\\n  \"http:\u002F\u002F127.0.0.1:7421\u002Fapi\u002Fopenapi.json?lang=en\" -o openapi.json\n",[168,1137,1138,1144,1158,1164,1169,1185,1189,1195,1213],{"__ignoreMap":252},[209,1139,1140],{"class":257,"line":258},[209,1141,1143],{"class":1142},"saEQR","# 命令行输出，默认中文\n",[209,1145,1146,1149,1152,1155],{"class":257,"line":565},[209,1147,1148],{"class":943},"danio",[209,1150,1151],{"class":947}," openapi",[209,1153,1154],{"class":954}," >",[209,1156,1157],{"class":947}," openapi.json\n",[209,1159,1160],{"class":257,"line":571},[209,1161,1163],{"emptyLinePlaceholder":1162},true,"\n",[209,1165,1166],{"class":257,"line":577},[209,1167,1168],{"class":1142},"# 英文\n",[209,1170,1171,1173,1175,1178,1181,1183],{"class":257,"line":583},[209,1172,1148],{"class":943},[209,1174,1151],{"class":947},[209,1176,1177],{"class":947}," --lang",[209,1179,1180],{"class":947}," en",[209,1182,1154],{"class":954},[209,1184,1157],{"class":947},[209,1186,1187],{"class":257,"line":589},[209,1188,1163],{"emptyLinePlaceholder":1162},[209,1190,1192],{"class":257,"line":1191},7,[209,1193,1194],{"class":1142},"# 从运行中的 danio 取，带任意有效令牌\n",[209,1196,1198,1200,1202,1204,1206,1208,1210],{"class":257,"line":1197},8,[209,1199,944],{"class":943},[209,1201,951],{"class":947},[209,1203,955],{"class":954},[209,1205,958],{"class":947},[209,1207,962],{"class":961},[209,1209,965],{"class":954},[209,1211,1212],{"class":961}," \\\n",[209,1214,1216,1219,1222,1224,1227],{"class":257,"line":1215},9,[209,1217,1218],{"class":954},"  \"",[209,1220,1221],{"class":947},"http:\u002F\u002F127.0.0.1:7421\u002Fapi\u002Fopenapi.json?lang=en",[209,1223,965],{"class":954},[209,1225,1226],{"class":947}," -o",[209,1228,1157],{"class":947},[161,1230,1231,1234,1235,1238,1239,1242,1243,1245],{},[168,1232,1233],{},"lang"," 可以是 ",[168,1236,1237],{},"zh-CN"," 或 ",[168,1240,1241],{},"en","。不写时按 ",[168,1244,605],{}," 选，规则和错误信息一样。",[161,1247,1248,1249,1252,1253,1256],{},"命令行输出里的 ",[168,1250,1251],{},"info.version"," 是 ",[168,1254,1255],{},"dev","，运行中的 danio 给的是它自己的版本。",[161,1258,1259,212,1261,1263,1264,1267],{},[214,1260,211],{},[214,1262,216],{}," 里的 ",[214,1265,1266],{},"接口文档"," 在界面里打开同一份描述，能直接浏览。",[161,1269,1270,1271,975,1274,239],{},"用 OpenAPI 的通用工具就能生成客户端，如 ",[168,1272,1273],{},"openapi-typescript",[168,1275,1276],{},"openapi-python-client",[173,1278,1279],{"id":1279},"常用接口",[161,1281,1282],{},"下表的权限是用工作区令牌调用时需要的。本机令牌不受限制。完整的列表和参数看 OpenAPI。",[1284,1285,1286],"h3",{"id":1286},"状态和身份",[177,1288,1289,1300],{},[180,1290,1291],{},[183,1292,1293,1295,1297],{},[186,1294,216],{},[186,1296,306],{},[186,1298,1299],{},"作用",[195,1301,1302,1316,1329],{},[183,1303,1304,1309,1313],{},[200,1305,1306],{},[168,1307,1308],{},"GET \u002Fapi\u002Fv1\u002Fhealth",[200,1310,1311],{},[168,1312,506],{},[200,1314,1315],{},"引擎是否在运行，返回版本和启动时间",[183,1317,1318,1322,1326],{},[200,1319,1320],{},[168,1321,539],{},[200,1323,1324],{},[168,1325,506],{},[200,1327,1328],{},"当前令牌的身份和权限",[183,1330,1331,1336,1340],{},[200,1332,1333],{},[168,1334,1335],{},"GET \u002Fapi\u002Fv1\u002Fworkspace",[200,1337,1338],{},[168,1339,360],{},[200,1341,1342],{},"这台电脑当主机的工作区：名称、设置、监听的地址",[1284,1344,1345],{"id":1345},"项目和任务",[177,1347,1348,1358],{},[180,1349,1350],{},[183,1351,1352,1354,1356],{},[186,1353,216],{},[186,1355,306],{},[186,1357,1299],{},[195,1359,1360,1373,1387,1403,1418,1431,1444,1458,1472,1486,1500,1514,1527,1540,1558,1572],{},[183,1361,1362,1366,1370],{},[200,1363,1364],{},[168,1365,886],{},[200,1367,1368],{},[168,1369,360],{},[200,1371,1372],{},"项目列表",[183,1374,1375,1380,1384],{},[200,1376,1377],{},[168,1378,1379],{},"POST \u002Fapi\u002Fv1\u002Fprojects",[200,1381,1382],{},[168,1383,400],{},[200,1385,1386],{},"新建项目",[183,1388,1389,1394,1398],{},[200,1390,1391],{},[168,1392,1393],{},"GET \u002Fapi\u002Fv1\u002Fprojects\u002F{id}",[200,1395,1396],{},[168,1397,360],{},[200,1399,1400,1401],{},"项目，返回 ",[168,1402,867],{},[183,1404,1405,1409,1413],{},[200,1406,1407],{},[168,1408,871],{},[200,1410,1411],{},[168,1412,400],{},[200,1414,1415,1416],{},"修改项目的设置，带 ",[168,1417,726],{},[183,1419,1420,1424,1428],{},[200,1421,1422],{},[168,1423,883],{},[200,1425,1426],{},[168,1427,360],{},[200,1429,1430],{},"任务列表，新的在前",[183,1432,1433,1437,1441],{},[200,1434,1435],{},[168,1436,827],{},[200,1438,1439],{},[168,1440,380],{},[200,1442,1443],{},"提交任务，一个场景一个任务",[183,1445,1446,1451,1455],{},[200,1447,1448],{},[168,1449,1450],{},"GET \u002Fapi\u002Fv1\u002Fjobs\u002F{id}",[200,1452,1453],{},[168,1454,360],{},[200,1456,1457],{},"任务详情",[183,1459,1460,1465,1469],{},[200,1461,1462],{},[168,1463,1464],{},"DELETE \u002Fapi\u002Fv1\u002Fjobs\u002F{id}",[200,1466,1467],{},[168,1468,380],{},[200,1470,1471],{},"删除任务",[183,1473,1474,1479,1483],{},[200,1475,1476],{},[168,1477,1478],{},"POST \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Fpause",[200,1480,1481],{},[168,1482,380],{},[200,1484,1485],{},"暂停，已渲染的帧保留",[183,1487,1488,1493,1497],{},[200,1489,1490],{},[168,1491,1492],{},"POST \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Fresume",[200,1494,1495],{},[168,1496,380],{},[200,1498,1499],{},"继续",[183,1501,1502,1507,1511],{},[200,1503,1504],{},[168,1505,1506],{},"POST \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Fcancel",[200,1508,1509],{},[168,1510,380],{},[200,1512,1513],{},"取消",[183,1515,1516,1520,1524],{},[200,1517,1518],{},[168,1519,835],{},[200,1521,1522],{},[168,1523,380],{},[200,1525,1526],{},"和最新版本比对，出更新的草稿",[183,1528,1529,1533,1537],{},[200,1530,1531],{},[168,1532,831],{},[200,1534,1535],{},[168,1536,380],{},[200,1538,1539],{},"更新任务，生成新版本",[183,1541,1542,1547,1551],{},[200,1543,1544],{},[168,1545,1546],{},"GET \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Fpreview",[200,1548,1549],{},[168,1550,360],{},[200,1552,1553,1554,1557],{},"一帧的预览，JPEG，",[168,1555,1556],{},"frame"," 不写为最新一帧",[183,1559,1560,1565,1569],{},[200,1561,1562],{},[168,1563,1564],{},"GET \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Ffilms",[200,1566,1567],{},[168,1568,360],{},[200,1570,1571],{},"各版本的成片",[183,1573,1574,1579,1583],{},[200,1575,1576],{},[168,1577,1578],{},"GET \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Ffilm",[200,1580,1581],{},[168,1582,370],{},[200,1584,1585,1586,1589],{},"下载成片，",[168,1587,1588],{},"version"," 不写为当前版本；还没生成时返回 404",[1284,1591,1592],{"id":1592},"设备和令牌",[177,1594,1595,1605],{},[180,1596,1597],{},[183,1598,1599,1601,1603],{},[186,1600,216],{},[186,1602,306],{},[186,1604,1299],{},[195,1606,1607,1621,1635,1649,1663,1677,1691],{},[183,1608,1609,1614,1618],{},[200,1610,1611],{},[168,1612,1613],{},"GET \u002Fapi\u002Fv1\u002Fdevices",[200,1615,1616],{},[168,1617,360],{},[200,1619,1620],{},"设备列表",[183,1622,1623,1628,1632],{},[200,1624,1625],{},[168,1626,1627],{},"PATCH \u002Fapi\u002Fv1\u002Fdevices\u002F{id}",[200,1629,1630],{},[168,1631,410],{},[200,1633,1634],{},"改名称、权限，拉黑或解除拉黑",[183,1636,1637,1642,1646],{},[200,1638,1639],{},[168,1640,1641],{},"DELETE \u002Fapi\u002Fv1\u002Fdevices\u002F{id}",[200,1643,1644],{},[168,1645,410],{},[200,1647,1648],{},"移除设备",[183,1650,1651,1656,1660],{},[200,1652,1653],{},[168,1654,1655],{},"GET \u002Fapi\u002Fv1\u002Ftokens",[200,1657,1658],{},[168,1659,410],{},[200,1661,1662],{},"令牌列表",[183,1664,1665,1670,1674],{},[200,1666,1667],{},[168,1668,1669],{},"POST \u002Fapi\u002Fv1\u002Ftokens",[200,1671,1672],{},[168,1673,410],{},[200,1675,1676],{},"生成令牌，完整的令牌只在这次返回",[183,1678,1679,1684,1688],{},[200,1680,1681],{},[168,1682,1683],{},"POST \u002Fapi\u002Fv1\u002Ftokens\u002F{id}\u002Frotate",[200,1685,1686],{},[168,1687,410],{},[200,1689,1690],{},"轮换集成令牌",[183,1692,1693,1698,1702],{},[200,1694,1695],{},[168,1696,1697],{},"DELETE \u002Fapi\u002Fv1\u002Ftokens\u002F{id}",[200,1699,1700],{},[168,1701,410],{},[200,1703,1704],{},"作废令牌",[1284,1706,126],{"id":126},[177,1708,1709,1719],{},[180,1710,1711],{},[183,1712,1713,1715,1717],{},[186,1714,216],{},[186,1716,306],{},[186,1718,1299],{},[195,1720,1721,1735,1749,1763,1777,1791,1805],{},[183,1722,1723,1728,1732],{},[200,1724,1725],{},[168,1726,1727],{},"GET \u002Fapi\u002Fv1\u002Fplugins",[200,1729,1730],{},[168,1731,430],{},[200,1733,1734],{},"插件列表",[183,1736,1737,1742,1746],{},[200,1738,1739],{},[168,1740,1741],{},"POST \u002Fapi\u002Fv1\u002Fplugins",[200,1743,1744],{},[168,1745,430],{},[200,1747,1748],{},"安装插件，装好后是停用的",[183,1750,1751,1756,1760],{},[200,1752,1753],{},[168,1754,1755],{},"POST \u002Fapi\u002Fv1\u002Fplugins\u002F{id}\u002Fenable",[200,1757,1758],{},[168,1759,430],{},[200,1761,1762],{},"启用，要带上它声明的权限",[183,1764,1765,1770,1774],{},[200,1766,1767],{},[168,1768,1769],{},"POST \u002Fapi\u002Fv1\u002Fplugins\u002F{id}\u002Fdisable",[200,1771,1772],{},[168,1773,430],{},[200,1775,1776],{},"停用",[183,1778,1779,1784,1788],{},[200,1780,1781],{},[168,1782,1783],{},"PUT \u002Fapi\u002Fv1\u002Fplugins\u002F{id}\u002Fsettings",[200,1785,1786],{},[168,1787,430],{},[200,1789,1790],{},"改设置",[183,1792,1793,1798,1802],{},[200,1794,1795],{},[168,1796,1797],{},"GET \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Fhandovers",[200,1799,1800],{},[168,1801,360],{},[200,1803,1804],{},"成片交给插件的情况",[183,1806,1807,1812,1816],{},[200,1808,1809],{},[168,1810,1811],{},"POST \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Fhandovers\u002F{plugin}\u002Fretry",[200,1813,1814],{},[168,1815,380],{},[200,1817,1818],{},"重新交给插件",[173,1820,1821],{"id":1821},"例子",[161,1823,1824],{},"列出任务，再暂停其中一个：",[247,1826,1828],{"className":934,"code":1827,"language":936,"meta":252,"style":252},"curl -H \"Authorization: Bearer $TOKEN\" \"http:\u002F\u002F192.168.1.20:7420\u002Fapi\u002Fv1\u002Fjobs?limit=20\"\n\ncurl -X POST -H \"Authorization: Bearer $TOKEN\" \\\n  http:\u002F\u002F192.168.1.20:7420\u002Fapi\u002Fv1\u002Fjobs\u002F\u003C任务 ID>\u002Fpause\n",[168,1829,1830,1852,1856,1878],{"__ignoreMap":252},[209,1831,1832,1834,1836,1838,1840,1842,1844,1846,1849],{"class":257,"line":258},[209,1833,944],{"class":943},[209,1835,951],{"class":947},[209,1837,955],{"class":954},[209,1839,958],{"class":947},[209,1841,962],{"class":961},[209,1843,965],{"class":954},[209,1845,955],{"class":954},[209,1847,1848],{"class":947},"http:\u002F\u002F192.168.1.20:7420\u002Fapi\u002Fv1\u002Fjobs?limit=20",[209,1850,1851],{"class":954},"\"\n",[209,1853,1854],{"class":257,"line":565},[209,1855,1163],{"emptyLinePlaceholder":1162},[209,1857,1858,1860,1863,1866,1868,1870,1872,1874,1876],{"class":257,"line":571},[209,1859,944],{"class":943},[209,1861,1862],{"class":947}," -X",[209,1864,1865],{"class":947}," POST",[209,1867,951],{"class":947},[209,1869,955],{"class":954},[209,1871,958],{"class":947},[209,1873,962],{"class":961},[209,1875,965],{"class":954},[209,1877,1212],{"class":961},[209,1879,1880,1883,1886,1889,1892,1895,1898],{"class":257,"line":577},[209,1881,1882],{"class":947},"  http:\u002F\u002F192.168.1.20:7420\u002Fapi\u002Fv1\u002Fjobs\u002F",[209,1884,1885],{"class":954},"\u003C",[209,1887,1888],{"class":947},"任务",[209,1890,1891],{"class":947}," I",[209,1893,1894],{"class":961},"D",[209,1896,1897],{"class":954},">",[209,1899,1900],{"class":947},"\u002Fpause\n",[161,1902,1903,1904,1907],{},"这里的 ",[168,1905,1906],{},"192.168.1.20:7420"," 换成你主机的工作区地址。",[1909,1910,1911],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s5Dmg, html code.shiki .s5Dmg{--shiki-default:#FFCB6B}html pre.shiki code .sfyAc, html code.shiki .sfyAc{--shiki-default:#C3E88D}html pre.shiki code .sAklC, html code.shiki .sAklC{--shiki-default:#89DDFF}html pre.shiki code .s0W1g, html code.shiki .s0W1g{--shiki-default:#BABED8}html pre.shiki code .saEQR, html code.shiki .saEQR{--shiki-default:#676E95;--shiki-default-font-style:italic}",{"title":252,"searchDepth":565,"depth":571,"links":1913},[1914,1915,1916,1917,1918,1919,1920,1921,1927],{"id":175,"depth":565,"text":175},{"id":242,"depth":565,"text":242},{"id":543,"depth":565,"text":543},{"id":817,"depth":565,"text":817},{"id":878,"depth":565,"text":878},{"id":923,"depth":565,"text":923},{"id":1128,"depth":565,"text":1129},{"id":1279,"depth":565,"text":1279,"children":1922},[1923,1924,1925,1926],{"id":1286,"depth":571,"text":1286},{"id":1345,"depth":571,"text":1345},{"id":1592,"depth":571,"text":1592},{"id":126,"depth":571,"text":126},{"id":1821,"depth":565,"text":1821},"danio 的 HTTP 接口：地址、令牌与权限、错误格式、事件流、OpenAPI 描述，以及常用接口。","md",{},{"icon":150},{"title":147,"description":1928},"HDW52cYm3nkITAce1nPMkO71-_GKpWScTXo2gP1krrc",[1935,1937],{"title":142,"path":143,"stem":144,"description":1936,"icon":145,"children":-1},"danio.toml 里每一项设置的含义、可选值和默认值，以及 danio 读取的环境变量。",{"title":152,"path":153,"stem":154,"description":1938,"icon":129,"children":-1},"怎么写 danio 插件：包的结构、权限和设置、ctx 里有什么、事件和成片投递两个钩子，以及怎么安装调试。",1794619223479]