URL 格式
AISCouncil 将机器人配置直接编码到 URL 片段(# 后面的部分)中。这意味着分享机器人就像分享链接一样简单 —— 无需服务器、无需数据库、无需账户。URL 就是机器人。
机器人 URL 如何工作
当您分享机器人时,应用程序获取整个机器人配置 —— 名称、提供商、模型、系统提示词、温度和所有其他设置 —— 并将其压缩成一个紧凑的字符串,存在于 URL 片段中。
https://aiscouncil.net/#B{base80_payload}
浏览器永远不会将片段发送到任何服务器(这是 HTTP 规范的一部分),因此配置完全保留在客户端。
URL 结构
机器人 URL 有三部分:
| 部分 | 示例 | 用途 |
|---|---|---|
| 基础 URL | https://aiscouncil.net/ | 应用程序本身 |
# | # | 片段分隔符(不发送到服务器) |
| VLQ 前缀 + 负载 | BeLT1Qx9k... | 版本字节 + 压缩配置 |
VLQ 版本前缀
片段的第一个字符使用可变长度数量 (VLQ) 编码标识编码版本:
| 前缀 | 版本 | 内容类型 |
|---|---|---|
A | 0 | 编辑器内容(由 aiscouncil.net/s/ 使用) |
B | 1 | 机器人配置 |
C | 2 | PDL 页面规格 |
B 前缀告诉应用程序"这是用编解码器版本 1 编码的机器人配置"。未来版本可以添加新格式而不破坏现有 URL。
Base80 编码
在版本前缀之后,负载使用自定义 Base80 字母表编码。选择此字母表是为了最大化 URL 密度,同时仅使用在 URL 片段中安全而无需百分比编码的字符:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~$&'()*+,;=:@/?
Base80 比 Base64 对于 URL 片段更高效,因为它使用 80 个字符而不是 64 个,每个字符打包更多数据。
压缩
在 Base80 编码之前,机器人配置 JSON 使用 deflate-raw 压缩(通过浏览器原生的 CompressionStream API)。这通常将机器人配置减少到其原始大小的 30-60%。压缩是无损的,解压缩使用浏览器原生的 DecompressionStream。
编码管道
机器人配置 (JSON) --> UTF-8 字节 --> Deflate-raw 压缩 --> Base80 编码 --> VLQ 前缀
分步:
- 机器人配置对象序列化为 JSON
- JSON 字符串编码为 UTF-8 字节
- 字节用 deflate-raw 压缩(原生
CompressionStream) - 压缩字节编码为 Base80 字符
- 添加 VLQ 版本前缀(
B)
解码完全相反地执行该过程。
机器人配置架构
配置使用短单字母键以最小化压缩大小:
| 键 | 类型 | 描述 | 默认值 |
|---|---|---|---|
n | string | 机器人显示名称 | "New Bot" |
p | string | 提供商 ID(anthropic、openai、xai、gemini、openrouter、ollama 等) | 必需 |
m | string | 模型 ID(例如 claude-sonnet-4-20250514、gpt-4o) | 必需 |
s | string | 系统提示词 | "" |
t | number | 温度 (0-2) | 0.7 |
x | integer | 最大输出 token | 4096 |
re | string | 推理投入(low、medium、high、max 或数值预算) | — |
tp | number | Top P (0-1) | 1 |
fp | number | 频率惩罚 (0-2) | 0 |
pp | number | 存在惩罚 (0-2) | 0 |
se | integer | 种子(用于可重复输出) | — |
st | array | 停止序列 | — |
rf | string | 响应格式(text 或 json) | "text" |
auth | integer | 访问控制:1 = 公开(无需登录) | — |
icon | string | 机器人图标(表情符号) | — |
d | string | 机器人描述 | — |
color | string | 机器人强调色(十六进制) | "#7c3aed" |
k | string | 每机器人 API 密钥(本地存储,从不在 URL 中) | — |
c | object | 委员会配置(用于多模型机器人) | — |
pf | string | 配置文件引用 ID | — |
cl | integer | 上下文长度(消息历史限制) | — |
sm | boolean | 启用流式传输 | true |
at | boolean | 自动标题对话 | false |
mr | boolean | 启用 Markdown 渲染 | true |
stc | boolean | 显示 token 计数 | false |
只有非默认值包含在配置中以最小化 URL 长度。
什么不在 URL 中
API 密钥从不包含在 URL 中。k(每机器人 API 密钥)字段在 URL 编码期间被剥离。密钥仅存储在浏览器的 localStorage 中,仅发送到 LLM 提供商的 API 端点。
以下内容从分享的 URL 中排除:
- API 密钥 —— 接收者必须提供自己的
- 聊天历史 —— 只分享机器人配置
- 记忆条目 —— 每机器人持久记忆保留在本地
- 使用统计 —— 跟踪数据是设备本地的
编辑器 URL
aiscouncil.net/s/ 的 Web 编辑器使用相同的编码系统,但使用不同的版本前缀:
https://aiscouncil.net/s/#A{base80_payload}
A 前缀表示版本 0(编辑器内容)。负载包含压缩的文档内容而不是机器人配置。
编程编码和解码
您可以使用浏览器控制台中的 AIS.Codec 模块以编程方式编码和解码机器人配置:
解码 URL
// 从 URL hash 解码
const hash = location.hash.slice(1); // 移除 '#'
const config = await AIS.Codec.decodeBotConfig(hash);
console.log(config);
// { n: "My Bot", p: "anthropic", m: "claude-sonnet-4-20250514", s: "You are helpful.", t: 0.7, x: 4096 }
编码配置
const config = {
n: "Research Assistant",
p: "anthropic",
m: "claude-sonnet-4-20250514",
s: "You are a thorough research assistant. Cite sources.",
t: 0.3,
x: 8192,
};
const hash = await AIS.Codec.encodeBotConfig(config);
const url = location.origin + "/#" + hash;
console.log(url);
// https://aiscouncil.net/#BeLT1Qx9k...
检查架构
console.log(AIS.Codec.CONFIG_SCHEMA);
// 返回机器人配置的 JSON Schema 定义
URL 长度限制
大多数现代浏览器支持至少 2,000 个字符的 URL 长度,许多支持 8,000+ 个字符。但是,某些中介(电子邮件客户端、社交媒体平台、URL 缩短器)可能会截断长 URL。
实际限制取决于系统提示词长度:
| 系统提示词长度 | 大约 URL 长度 | 兼容性 |
|---|---|---|
| < 500 字符 | 约 300-500 字符 | 到处安全 |
| 500-2,000 字符 | 约 500-1,200 字符 | 在浏览器和大多数平台安全 |
| 2,000-5,000 字符 | 约 1,200-2,500 字符 | 在浏览器中工作,可能在电子邮件/SMS 中失败 |
| > 5,000 字符 | 2,500+ 字符 | 仅浏览器,可能在其他地方被截断 |
如果您的系统提示词非常长,请考虑:
- 缩短或总结提示词
- 使用保留片段的 URL 缩短器
- 改为将机器人配置作为 JSON 文件分享(通过导出)
主页行为
当您直接加载 aiscouncil.net(URL 中没有 hash)时,应用程序不会将您的机器人配置编码到 URL 中。URL 编码仅在页面从分享的机器人 URL 加载时激活(即,URL 已包含 #B... 片段)。这保持主页 URL 干净。