正在开一份新的…
这是 Dilin Studio 的「表格」编辑器(编辑器代号 sheets):免登录,在用户自己的浏览器里跑;一个网址就是一份作品。用户把这页网址交给你,是想请你帮他用这个编辑器做东西或改东西。请先用一两句大白话跟他说明你打算怎么做,再动手。
一份工程=project.json(工程内容,纯 JSON)+ assets/(素材原文件,可以没有)。页面右边的「下载到电脑」会把目前这一份存成一个 zip,里面就是 project.json+assets/。
有三条路,先问用户要哪一条再动手:①在他自己的电脑跑单机版(下载开源单机版、双击启动文件;资料留在他的电脑,不经任何服务器);②就在这个网页(https://dilinai.cn/studio/sheets)里做:编辑器在他的浏览器里跑,作品存在浏览器本地存储(OPFS),不上传——能直接操作页面的 AI 用页面上的「导入」递素材、再改工程;只能产网址的 AI 给他一个带着工程的网址(#p=,写法见下面甲;# 后面的部分不会发到服务器);③拿短网址(https://dilinai.cn/s/<码>,用 https://dilinai.cn/api/studio-share 建立):会把作品与素材上传到 https://dilinai.cn 的服务器暂存,要先跟他讲明、他同意了才调用接口。
③ 拿短网址(会上传):用网站的建立接口把作品放上去,交给用户一个短网址。这会把作品与素材上传到 https://dilinai.cn 的服务器暂存——先跟用户讲明、他同意了再调用。接口全部免登录、收发 JSON(Content-Type: application/json);要票的那几个接口带请求头 Authorization: Bearer <token>。
一、你自己做好作品时:POST https://dilinai.cn/api/studio-share,body={"app":"sheets","by":"ai","project":<整份 project.json 对象>},回 {"code","url","token","version":1}。token 是你这份的 AI 编辑凭证(写入票):存下来,之后每次写入都带它;自己留着、别给用户。
素材(assets/ 里的图片、视频、声音等文件)一个一个传:POST https://dilinai.cn/api/studio-share/<code>/assets/init(带票),body={"name":"<文件名>","size":<字节数>,"contentType":"<MIME>"},回 {"uploadId","partSize","parts":[{"partNumber","url"}]};把文件按 partSize 切段,第 n 段(partNumber=n,从 1 起)用 PUT 直接传到那一段的 url,记下响应头的 ETag;全部传完 POST https://dilinai.cn/api/studio-share/<code>/assets/complete(带票),body={"name","uploadId","parts":[{"PartNumber":n,"ETag":"<那段的 ETag>"}]}。project.json 里按格式用文件名引用它。
交给用户的网址=https://dilinai.cn/s/<code>,他点开就是做好的成品,能直接再改。之后要再改:带票 PUT https://dilinai.cn/api/studio-share/<code>/project,body={"base_version":<你手上的版本>,"project":<新的整份 project.json>},回 {"version":<新版本>},他开着的那页几秒内会跟着更新。回 409(body 是现在的 {"version"})=这中间用户改过:先 GET 最新的再改,用新的 version 重发。
改的时候一步一步来:每改好一小处(加一段字、换一张图、剪一刀、改一格)就写回一次(PUT 新版,或存回那份 project.json),用户开着的页面会跟着一步一步变;别在自己那边全部做完才一次写回,那样他只会看到整份突然换掉。
二、用户给你的是 https://dilinai.cn/s/<code> 这种短网址时:
读:GET https://dilinai.cn/api/studio-share/<code>(免票),回 {"app","version","project","assets":{"<文件名>":"<下载网址>"},"claimed","ai_paired"}(作品文件很大时 project 是 null、改给 "project_url",再 GET 那个网址拿作品,回的若是 {"__studio_share_version","project"} 就取 project);app 是编辑器代号,那个编辑器的格式要点在 https://dilinai.cn/studio/<app> 那页的这段说明里。回 404=已经过期或被删除。只看不用验证码。
要改作品时:请别用浏览器(或云浏览器)打开这个编辑页来改——用户那边已开着这份,你开的那页只能看、改了存不回去;也不必找堤麟连接器(MCP),访客短网址用不到。直接用下面的接口发请求:手上有凭证就直接 PUT 新版;没有才 pair-request、等用户把页面上的 6 位验证码告诉你、pair-confirm 拿票、再 PUT。你若在自带网络白名单的云端沙箱里(例如一些 AI 网页版的代码环境),请求 dilinai.com 被你自己那边的代理挡下,就请用户打开这个会话的环境设置,在 Network access 的 Allowed domains 加上 dilinai.com 后再试;也请不要叫用户把作品复制粘贴给你。
要改:手上已有这份的 AI 编辑凭证(建立时或上次配对拿到的 token)就直接带着 PUT,不必再配对;配对一次就一直有效(直到用户点「收回 AI 编辑权」或作品被删),只有凭证弄丢了才重新配对。配对要你自己发请求:POST https://dilinai.cn/api/studio-share/<code>/pair-request(免票),回 {"request_id"};用户开着的那页几秒内会跳出 6 位验证码(5 分钟内有效),请他把验证码告诉你;再 POST https://dilinai.cn/api/studio-share/<code>/pair-confirm,body={"request_id":"<刚才那个>","code":"<6 位数字>"},回 {"token"},就是你这份的写入票,存下来,之后每次写入都带它。pair-request 回 409(no_open_tab)=他没开着那页,请他先打开;pair-confirm 回 401=验证码不对(连错 5 次要重新 pair-request)。拿到票后按上面 PUT(带 base_version;409 先 GET 再改)。用户随时可以在页面上点「收回 AI 编辑权」,票就失效。你若只能读网址、自己发不出 POST:别叫用户等验证码(你没发 pair-request,页面不会出码),改给他一个带着改好工程的网址 https://dilinai.cn/studio/<app>#p=<资料>(写法见那个编辑器页的这段说明),他点开就是新的一份。
注意:短网址的作品只是暂存——用户关掉编辑页后会删除,建立后没人打开过的 24 小时后也会失效。请提醒他重要的作品点左边「下载到电脑」留一份。
② 在网页里做、只能产网址的 AI(连不上上面的建立接口时也用这个):把作品塞进网址,或放在公开网址让网页读进来。用这两种不必把作品上传到网站,用户点开后作品只存在他的浏览器里:
甲、小作品(只有 project.json、没有图片视频等素材文件,整个网址不超过 32000 字):回他一个网址=https://dilinai.cn/studio/sheets#p=<资料>,他点开就是做好的成品。<资料>=project.json 经 JSON.stringify(不缩进)转成 UTF-8,用 deflate-raw 压缩(与浏览器 CompressionStream("deflate-raw") 同一种),再转成 base64url(不补 =)。放在 # 后面,不会发到任何服务器。聊天软件、短信常把太长的链接截断,所以整个网址请别超过 32000 字;网页最多只收 #p= 后面 60000 字,超过会显示「链接太长」。
・图片、视频、声音这类素材一律不塞进网址:project.json 里只放引用,「表格」可以直接写素材的 https:// 网址;要用素材文件就走下面乙的做法。
乙、大的或带素材的作品:把 project.json 和 assets/ 压成 zip(project.json 放在最上层,或整包只有一层文件夹、project.json 在那一层里;素材直接放在 assets/ 第一层,不收子文件夹,文件名不可含 / 或 \;只有 project.json 也可以直接给那一个文件),放到公开、免登录就能直接下载的 https 网址,交给用户的网址=https://dilinai.cn/studio/sheets?import=<URL 编码后的那个 https 网址>。文件上限 50 MB;网页抓文件不带任何登录信息。你没办法把文件放到公开网址时,先用甲给不含素材的版本,请用户打开后在编辑器里自己放进素材。
用户点开后,作品会存成他浏览器里新的一份并打开编辑页(一个网址就是一份),之后可以直接手动改,或点左边「下载到电脑」留一份。
其他编辑器:这页网址里(以及建立时 body 的 app)写的是 sheets;要做别种作品,就把它换成 docs(文件)、sheets(表格)、slides(简报)、video(剪辑)、paint(画板),格式各看各的。
另外,要改用户开着的这一份时:
・在用户电脑上跑的 AI 程序助手:请用户点页面右边「交给你的 AI」那块的「选择工程文件存放位置」(电脑版 Chrome、Edge 才有),这一份就存进那个文件夹:project.json+assets/。你直接改那份 project.json,开着的页面约 1.5 秒内自己跟上;素材先拷进 assets/。
・能操作浏览器的 AI(浏览器插件或代理模式):也可以直接在这个页面上操作编辑器,像人一样点选、输入。用户电脑上的素材,可以用页面上的导入(例如剪辑的「导入」)递进来再改工程;文件留在他的浏览器里,不必上传到网站。
没建立短网址的作品只存在用户这个浏览器里(浏览器本地存储 OPFS 的 dilin-studio/<编辑器代号>/<网址里的工程编号>/,里面就是 project.json+assets/),不在服务器上;换浏览器或清掉浏览器数据就看不到了。登录堤麟后可以用云盘。
先教用户的事:①成品是一个网址,点开就能看、能再改;②要你改他开着的这一份,就把网址给你,页面跳出 6 位验证码时再告诉你;③关掉页面作品就会删除,重要的记得点「下载到电脑」留一份。用大白话一两句讲,别把接口规格丢给他。
「表格」工程文件格式要点:
project.json 格式(表格):{"format":"dilin-studio/sheets","version":1,"name":"<工程名>","sheets":[{"id":"s1","name":"Sheet1","content":{…}}]} ・sheets 依序就是底下的分页;id 只用英数、_、-,不要重复。 ・content.cells 以格名为键(A1、B2…,列最多 ZZZ、行最多 999999):{"v":"原文","f":"=SUM(A1:A3)","s":{格式}}。v 一律写成字符串(数字也是 "12.5"),有 f 的格 v 写 "",网页会自己算(公式只能引用同一张表)。 ・s 常用:b/i/u/s(粗斜下划删除·true)、size(字号 pt)、fg/bg(#rrggbb)、align(left|center|right)、valign(top|middle|bottom)、wrap、numFmt({"t":"number|currency|percent|date…","d":小数位,"k":千分位})。 ・其他可选:merges(["A1:B2"])、colWidths({"A":120})、rowHeights({"1":32})、images([{"id","url":"assets/文件名","cell":"C3","w","h"}],图片放 assets/)、freeze、filter、validations、condFormats(条件格式,如数据条 [{"id":"r1","ranges":["B2:B20"],"type":"data_bar"}];color_scale/data_bar 的 colors 可省,用默认色、长短按范围内最小到最大自动算)、charts、print(打印设置)。 ・不认得的键与坏值会被丢掉;改完保存,网页约 1.5 秒内自动重新载入。
正在开一份新的…