Skip to content

自定义面板 (DIY Dashboard) 与 Adaptive Cards 设计规范指南

本文档定义了 AiCode 在聊天输入框上方「自定义面板 (DIY Dashboard)」中支持的 Adaptive Cards 声明式微模板规范

AI 助手与开发者可以依据此规范,编写面板脚本(Python / Node / Shell)输出结构化卡片 JSON,从而完全自定义面板在收起态(Compact)与展开态(Expanded)下的排版、配色、进度条、指标卡片及明细信息。


1. 脚本存放路径与管理方式

1.1 默认存放路径

  • 统一脚本目录~/.aicode/scripts/(容器绝对路径为 /root/.aicode/scripts/)。
  • 持久化说明:该目录映射至宿主 App 数据目录,在容器升级重装时保留,不会丢失。

1.2 脚本编写与语言支持

脚本只需将标准 JSON 结果输出到标准输出 (stdout) 即可:

  • Python 脚本.py 后缀):底层自动调用 python3 <script_path> 执行;
  • NodeJS 脚本.js 后缀):底层自动调用 node <script_path> 执行;
  • Shell 脚本.sh / .bash 后缀):底层自动调用 bash <script_path> 执行;
  • 二进制 / 可执行脚本:如果具备可执行权限(chmod +x),底层直接执行。

1.3 路径解析规则

在提供商设置项「面板脚本」中,支持以下几种路径填写方式:

  1. 纯文件名(推荐,如 demo_balance.py):自动在 ~/.aicode/scripts/ 目录下查找;
  2. 相对路径(如 scripts/my_panel.py.aicode/scripts/my_panel.py):自动从 ~/.aicode/ 展开;
  3. 波浪号路径(如 ~/.aicode/scripts/my_panel.py~/my_script.py):自动展开为 /root/ 对应路径;
  4. 容器内绝对路径(如 /root/workspace/scripts/quota.py)。

2. 脚本运行环境与注入的环境变量

执行面板脚本时,AiCode 会自动注入以下环境变量,供脚本自由消费并构建动态面板:

Token 类变量

关于「输入 Token」的说明LAST_INPUT_TOKENSTOTAL_INPUT_TOKENS 均为 API 返回的总输入 Token(即 input_tokens / prompt_tokens / promptTokenCount),已包含缓存命中部分LAST_CACHED_TOKENS 是其中命中服务端缓存的部分(子集)。因此,纯新增输入 = LAST_INPUT_TOKENS - LAST_CACHED_TOKENS

环境变量名示例值说明
AICODE_MODELclaude-3-7-sonnet当前选中的生效模型名称
AICODE_SESSION_IDsess_98a7bc21当前会话 ID
AICODE_LAST_INPUT_TOKENS1420最近一次单次 LLM 请求的输入 Token(API 返回的总输入,含缓存命中
AICODE_LAST_OUTPUT_TOKENS365最近一次单次 LLM 请求生成的输出 Token
AICODE_LAST_CACHED_TOKENS1024最近一次请求中命中服务端缓存的部分(如 OpenAI cached_tokens / Anthropic cache_read_input_tokens)。是 LAST_INPUT_TOKENS 的子集,取不到时为 0
AICODE_TOTAL_INPUT_TOKENS28540当前会话累计的输入 Token(API 返回的总输入,含缓存命中
AICODE_TOTAL_OUTPUT_TOKENS5420当前会话累计生成的输出 Token
AICODE_MODEL_CONTEXT_TOKENS200000当前模型的上下文窗口大小(Token)。若模型元数据未获取到则为 0
AICODE_MODEL_MAX_INPUT_TOKENS200000模型最大输入 Token 限制。未获取到则为 0
AICODE_MODEL_MAX_OUTPUT_TOKENS8192模型最大输出 Token 限制。未获取到则为 0
AICODE_MODEL_INPUT_COST_USD_PER_M3.0模型输入单价(美元 / 百万 Token)。未获取到则为 0
AICODE_MODEL_OUTPUT_COST_USD_PER_M15.0模型输出单价(美元 / 百万 Token)。未获取到则为 0
AICODE_MODEL_CACHE_READ_COST_USD_PER_M0.3模型缓存读取单价(美元 / 百万 Token)。未获取到则为 0
AICODE_MODEL_SUPPORTS_TOOLStrue模型是否支持工具调用(true / false
AICODE_MODEL_SUPPORTS_VISIONfalse模型是否支持图片输入(true / false
AICODE_MODEL_SUPPORTS_REASONINGtrue模型是否支持思考/推理模式(true / false
AICODE_MESSAGE_COUNT12当前会话的消息总数(含用户和助手消息)

会话状态变量

环境变量名示例值说明
AICODE_AGENT_STATEstreaming当前 Agent 工作状态:idle(空闲)/ loading(加载中)/ streaming(流式输出中)/ result(完成)/ error(出错)
AICODE_SESSION_MODEbuild当前会话模式:build(构建)/ plan(计划)/ auto(自动)
AICODE_REASONING_EFFORThigh当前思考强度档位:none / minimal / low / medium / high / xhigh / max
AICODE_REFRESH_REASONllm本次面板刷新的触发原因:session(进入/切换会话)、llm(LLM 请求返回后自动刷新)、manual(手动点击刷新/错误重试)、button(卡片内刷新按钮触发)

工作区变量

环境变量名示例值说明
AICODE_WORKSPACE/root/workspace/my-app当前项目的工作区绝对路径
AICODE_WORKSPACE_NAMEmy-app工作区目录名

提供商变量

环境变量名示例值说明
AICODE_PROVIDER_NAMEOpenAI API提供商名称
AICODE_PROVIDER_TYPEOPENAI协议类型(OPENAI / ANTHROPIC / GEMINI)
AICODE_PROVIDER_API_KEYsk-...提供商 API Key
AICODE_PROVIDER_BASE_URLhttps://api.openai.com/提供商 Base URL

3. 设计理念与架构原则

  • 声明式描述 (Declarative UI):脚本仅负责通过标准输出吐出 JSON 描述树,不侵入 Android 原生绘制代码。
  • 纯原生 Compose 渲染:由原生 Jetpack Compose 组件树进行解析与绘制,保持流畅的展开/折叠动效。
  • 自动主题适配:所有语义化颜色(如 Good, Warning, Attention, Accent, Subtle)会自动跟随 App 的明亮/暗黑主题智能变色,无需硬编码多套主题。
  • 双态支持 (Dual-State Architecture)
    • 收起态 (Compact View):位于输入框上方的紧凑单行条目(高度约 28dp~34dp),用于常驻展示核心余量或状态。
    • 展开态 (Expanded View):点击展开后的丰富卡片面板(自适应高度),支持多列网格、明细账单、大字指标块及操作按钮。
  • 事件驱动的实时刷新机制
    • 每次 LLM 请求返回时即时刷新:在 Agent 工作流中,每一次单次 API 请求完成(获得最新 input/output Tokens 时),App 会自动带上最新上下文重新执行脚本并刷新面板;
    • 进入页面与手动刷新:首次进入会话、在设置中修改脚本、或点击面板刷新按钮均会即时触发刷新。

4. 根结构定义 (Root Card Schema)

面板脚本的标准输出应输出如下根结构:

json
{
  "type": "AdaptiveCard",
  "version": "1.5",
  "compact": {
    "type": "Row",
    "items": [ ... ]
  },
  "body": [ ... ]
}

根字段属性说明

字段类型必填默认值说明
typeString-固定为 "AdaptiveCard"
versionString"1.5"规范版本号,推荐 "1.5"
compactContainernull收起态内容定义(单行紧凑容器)。若缺省,系统将自动从 body 提取前 2~3 个主要指标智能生成
bodyArray[]展开态卡片主体容器与组件树列表。按钮等交互元素也需放在 body 中(见下方 ActionButton

5. 组件与容器全集规范 (Elements Reference)

5.1 容器与排版类组件

通用属性 visible:所有组件均可传 "visible": false 隐藏该元素,解析时直接跳过不渲染。适合根据环境变量动态控制显隐。

ColumnSet(多列网格容器)

将子元素按横向多列并排排布,是构建多周期指标、左右对比卡片的核心容器。

  • 属性说明
    属性类型默认值说明
    typeString固定 "ColumnSet"-
    columnsArray<Column>[]包含的列对象列表
    spacingString / Number"Medium"列间距枚举或数字(如 8"10dp"
    gapNumber / Stringnull列与列之间的精确间距(如 8"12dp",优先级高于 spacing
    paddingNumber / Array / Objectnull容器内边距(如 8[4, 8]{ "top": 4, "right": 8 }
    marginNumber / Array / Objectnull容器外边距
    minHeightNumber / Stringnull最小高度约束(如 48"48dp"
    horizontalAlignmentString"Left"水平对齐:"Left", "Center", "Right"

Column(单个列)

ColumnSet 的子元素,内部垂直堆叠各个内容组件。

  • 属性说明
    属性类型默认值说明
    typeString固定 "Column"-
    widthString / Number"stretch"宽度模式:
    "auto":根据内容自适应最小宽度
    "stretch":均分剩余可用空间
    "1", "2", "3" 等数字:弹性权重比例
    "50px", "50dp":固定宽度
    separatorBooleanfalsetrue 时与前一列之间显示垂直细分割线
    spacingString"None"列内子元素纵向间距枚举:"None", "Small", "Medium", "Large"
    gapNumber / Stringnull列内子元素精确纵向间距(如 4"6dp",优先级高于 spacing
    paddingNumber / Array / Objectnull列内边距(如 4[2, 4] 等)
    minHeight / maxHeightNumber / Stringnull最小/最大高度约束
    minWidth / maxWidthNumber / Stringnull最小/最大宽度约束
    verticalContentAlignmentString"Top"列内纵向对齐:"Top", "Center", "Bottom"
    itemsArray<Element>[]列内垂直排列的组件列表

Container(通用块级容器)

用于将若干元素打包成一个独立的卡片、高亮区块或分组背景。

  • 属性说明
    属性类型默认值说明
    typeString固定 "Container"-
    styleString"Default"容器风格:"Default", "Subtle", "Emphasis", "Good", "Warning", "Attention", "Accent"
    bleedBooleanfalse是否扩展至父容器边缘
    spacingString / Number"None"容器与上方元素的间距
    gapNumber / Stringnull容器内子元素的纵向间隔(如 6"8dp"
    paddingNumber / Array / Objectnull容器内边距
    marginNumber / Array / Objectnull容器外边距
    cornerRadiusNumber / Stringnull自定义背景和边框圆角半径(如 8"8dp"
    minHeight / maxHeightNumber / Stringnull容器高度约束
    minWidth / maxWidthNumber / Stringnull容器宽度约束
    itemsArray<Element>[]容器内的子组件树

Row(单行水平排列)

用于将多个小元素(如标签 + 状态点 + 文字)在同一行紧凑横向排布,常用于 compact 收起态。

  • 属性说明
    属性类型默认值说明
    typeString固定 "Row"-
    spacingString / Number"Small"行内子元素间距枚举或数值
    gapNumber / Stringnull子元素间精确间距(如 4"6dp"
    padding / marginNumber / Array / Objectnull内/外边距
    verticalAlignmentString"Center"纵向对齐方式:"Top", "Center", "Bottom"
    itemsArray<Element>[]水平排列的子元素列表

Row 子元素 weight:Row 中每个子元素可额外传 "weight" 数值属性控制弹性宽度比例。例如 { "type": "TextBlock", "text": "...", "weight": 2 } 让该文本块占 2 份宽度。未指定 weight 的 Column / ColumnSet 默认 weight=1,其他类型默认不拉伸。

Spacer(空白占位)

显式插入空白间距,用于在 Row / Column / Container 中精确控制元素间距。

  • 属性说明
    属性类型默认值说明
    typeString固定 "Spacer"-
    heightNumber / Stringnull固定高度(dp),在 Column / Container 中生效
    widthNumber / Stringnull固定宽度(dp),在 Row 中生效

两者均缺省时默认占 Small 高度。如需在 Row 中弹性占位,请使用 Row 子元素的 weight 属性。

FlowRow(自动换行流式布局)

子元素横向排列并自动换行,适合 Badge 群、标签列表等数量不固定的场景。

  • 属性说明
    属性类型默认值说明
    typeString固定 "FlowRow"-
    itemsArray<Element>[]子元素列表
    gapNumber / Stringnull水平间距(dp)
    verticalGapNumber / Stringnull换行后的垂直间距(dp)
    padding / marginNumber / Array / Objectnull内/外边距
    minHeight / maxHeightNumber / Stringnull高度约束

ScrollRow(横向滚动容器)

子元素横向排列且可滑动滚动,适合内容超出屏宽时使用。

  • 属性说明
    属性类型默认值说明
    typeString固定 "ScrollRow"-
    itemsArray<Element>[]子元素列表
    gapNumber / Stringnull子元素间距(dp)
    padding / marginNumber / Array / Objectnull内/外边距
    minHeight / maxHeightNumber / Stringnull高度约束

TabSet(标签页容器)

在有限空间内通过 Tab 切换展示多组内容,适合将余量、Token、费用等信息分页展示。

  • 属性说明

    属性类型默认值说明
    typeString固定 "TabSet"-
    tabsArray<Tab>[]标签页数组
    tabPositionString"top"标签栏位置:"top"(上方)/ "bottom"(下方)
    tabStyleString"primary"标签栏样式:"primary"(Material 指示条)/ "pills"(胶囊按钮)
    indicatorColorStringnull选中态强调色(语义色或 Hex),影响指示条/胶囊/选中文字
    tabBackgroundColorStringnull标签栏背景色(语义色或 Hex)
    tabContentColorStringnull未选中标签的文字颜色(语义色或 Hex)
    cornerRadiusNumber / Stringnullpills 样式下胶囊的圆角半径(dp)
    padding / marginNumber / Array / Objectnull内/外边距
  • Tab 子元素属性

    属性类型默认值说明
    typeString固定 "Tab"-
    labelString""标签页标题文本
    iconStringnull标签页图标名称(如 "external-link""copy""help"
    badgeStringnull标签右上角小徽章文本(如 "3""!"
    colorStringnull该标签选中时的强调色(语义色或 Hex,优先于 TabSet 的 indicatorColor
    itemsArray<Element>[]该标签页下的子组件列表

收起态行为:compact 态下 TabSet 不渲染 Tab 栏,只展示第一个 Tab 的内容。


5.2 核心展示组件

TextBlock(文本块)

最基础也是最常用的文本排版组件。

  • 属性说明
    属性类型默认值说明
    typeString固定 "TextBlock"-
    textString""文本内容(支持加粗 **text** 与行内代码 `code` 等轻量语法)
    sizeString / Number"Default"字号:
    • 语义档位:"Micro"(10sp), "Small"(12sp), "Default"(14sp), "Medium"(16sp), "Large"(18sp), "ExtraLarge"(22sp)
    • 任意数值:支持直接传入 1524"24sp"
    lineHeightNumber / Stringnull行高:支持 20"20sp",方便多行排版或与图标垂直居中
    weightString"Default"字重:"Lighter" (细), "Default" (常规), "Bolder" (加粗)
    colorString"Default"文字颜色:语义色或 #10B981 等 Hex 颜色
    isSubtleBooleanfalsetrue 时自动降低透明度,呈现次要文字灰度效果
    maxLinesIntnull最大行数限制,超出自动显示省略号(...
    horizontalAlignmentString"Left"对齐:"Left", "Center", "Right", "Justify"
    padding / marginNumber / Array / Objectnull内/外边距

ProgressBar(进度条)

直观展示配额使用率、时间倒计时或 Token 消耗进度。

  • 属性说明
    属性类型默认值说明
    typeString固定 "ProgressBar"-
    valueFloat / Int0当前百分比数值(0 ~ 100)。支持浮点数如 82.5
    colorString"Accent"进度条高亮条填充色(语义色或 Hex 自定义颜色)
    trackColorStringnull进度条底部背景轨道颜色。默认自动使用半透明灰色
    heightInt / String6进度条粗细(dp),收起态建议 3~4,展开态建议 6~8
    animatedBooleantrue是否在数值变动时播放平滑过渡动画
    cornerRadiusInt / Stringnull轨道圆角半径(dp),缺省为全圆胶囊(CircleShape
    showPercentBooleanfalse是否在进度条轨道内居中显示百分比数值
    textStringnull在进度条轨道内居中显示的自定义文本(如 "已用 80%"
    textColorStringnull轨道内嵌文本颜色(默认自适应底色)

Metric(指标数值卡片 / StatBlock)

专为面板设计的大字数据组件,内置规范的「标题 + 大字主数值 + 变化/单位 + 副文本」组合。

  • 属性说明
    属性类型默认值说明
    typeString固定 "Metric"-
    labelString""上方小标签标题(如 "5h 余量", "当前余额"
    valueString""中间核心大字(如 "$12.45", "80%"
    unitString""紧随数值的小单位/后缀(如 "CNY", "Tokens", "/ 5h"
    subTextString""底部副文本(如 "≈ ¥89.32", "今日消耗 $0.83"
    percentFloatnull若传入百分比,会在数值下方自动附带圆角进度条
    colorString"Default"主题色(影响数值与进度条高亮)
    trendStringnull趋势标记:"Up" (▲ 绿色), "Down" (▼ 红色), "Neutral"

Badge / Tag(胶囊徽章)

用于展示状态标签(如 "按量计费", "企业版", "额度充足", "即将重置")。

  • 属性说明
    属性类型默认值说明
    typeString固定 "Badge"-
    textString""徽章内的短文本
    styleString"Default"风格:"Good" (浅绿底绿字), "Warning" (浅黄底黄字), "Attention" (浅红底红字), "Accent" (浅蓝底蓝字), "Subtle" (灰底黑字)
    iconStringnull徽章前置小图标名称

StatusDot(状态呼吸小圆点)

极简的状态指示圆点,常用于收起态中快速指示连通性与余额健康度。

  • 属性说明
    属性类型默认值说明
    typeString固定 "StatusDot"-
    colorString"Good"圆点颜色("Good", "Warning", "Attention", 或 Hex)
    sizeInt6圆点直径(dp,默认 6dp)

FactSet(键值对明细列表)

用于整齐展示多项细则数据(如重置时间、RPM/TPM 限额、账单明细)。

  • 属性说明
    属性类型默认值说明
    typeString固定 "FactSet"-
    factsArray<Fact>[]键值对数组,每项为 { "title": "标题", "value": "内容" }

Image(图标元素)

渲染内置矢量图标。当前支持以下图标名称(不区分大小写):external-linkcopyhelp

  • 属性说明
    属性类型默认值说明
    typeString固定 "Image"-
    iconStringnull图标名称(如 "external-link""copy""help"
    sizeInt16图标尺寸(dp)
    colorString"Default"图标颜色(语义色或 Hex)
    padding / marginNumber / Array / Objectnull内/外边距

Divider(分割线)

横向分隔线,用于划分卡片的不同内容区块。

  • 属性说明
    属性类型默认值说明
    typeString固定 "Divider"-
    spacingString"Medium"分割线上下外边距:"Small", "Medium", "Large"

5.3 交互动作类 (Actions)

5.3 交互按钮类 (ActionButton)

按钮可作为普通元素放在 body 任意位置(Row / Column / Container / FlowRow 等),替代旧的根级 actions 字段。

ActionButton(可点击按钮)

点击打开外部链接或复制文本到剪贴板。

  • 属性说明: | 属性 | 类型 | 必填 | 默认值 | 说明 | | :--- | :--- | :--- | :--- | | type | String | 是 | - | 固定 "ActionButton"(别名 "button""action") | | title | String | 是 | - | 按钮文本(如 "前往充值", "复制卡密") | | action | String | 否 | "openUrl" | 行为类型:"openUrl"(打开链接)/ "copy"(复制文本)/ "refresh"(刷新面板) | | url | String | 条件 | - | action=openUrl 时必填,完整的 HTTP/HTTPS 链接 | | value | String | 条件 | - | action=copy 时必填,要复制的文本内容 | | icon | String | 否 | null | 按钮前置图标名称(如 "external-link""copy") | | style | String | 否 | "Default" | 按钮背景风格:"Default"(纯色淡底)、"Subtle""Good""Warning""Attention""Accent" | | color | String | 否 | "Accent" | 按钮文字/图标颜色(语义色或 Hex) | | padding / margin | Number / Array / Object | 否 | null | 内/外边距 |

示例:

json
{
  "type": "Row",
  "items": [
    { "type": "TextBlock", "text": "余额不足?", "weight": 1 },
    {
      "type": "ActionButton",
      "title": "前往充值",
      "action": "openUrl",
      "url": "https://api.openai.com",
      "icon": "external-link",
      "style": "Accent",
      "color": "Accent"
    }
  ]
}

6. 色彩规范与主题映射表

Adaptive Cards 使用语义色彩系统,确保在亮色模式(Light Mode)与深色模式(Dark Mode)下均具备优秀的对比度与视觉美感:

语义颜色 (Color Key)浅色主题视觉呈现深色主题视觉呈现适用业务场景
Good翠绿 #10B981清新亮绿 #34D399余额充足、配额充裕、服务正常
Warning琥珀橙 #F59E0B明亮橙黄 #FBBF24额度低于 20%、即将触发限频
Attention玫红/警报红 #EF4444浅警报红 #F87171配额耗尽、欠费停机、脚本查询异常
Accent品牌蓝/科技紫 #3B82F6浅科技蓝 #60A5FA主指标高亮、次要周期、普通进度
Default深灰黑 #1F2937纯白灰 #F3F4F6主标题、核心大字金额
Subtle弱化灰 #6B7280次要浅灰 #9CA3AF辅助单位、副说明、折算汇率

7. 经典实战模板全景示例

场景 A:订阅制多周期面板(5h 快速周期 + 7d 周期 + 1m 月度包)

json
{
  "type": "AdaptiveCard",
  "version": "1.5",
  "compact": {
    "type": "ColumnSet",
    "spacing": "Medium",
    "columns": [
      {
        "type": "Column",
        "width": "stretch",
        "items": [
          { "type": "TextBlock", "text": "5h 80%", "size": "Small", "weight": "Bolder", "color": "Good" },
          { "type": "ProgressBar", "value": 80, "color": "Good", "height": 3 }
        ]
      },
      {
        "type": "Column",
        "width": "stretch",
        "items": [
          { "type": "TextBlock", "text": "7d 65%", "size": "Small", "weight": "Bolder", "color": "Accent" },
          { "type": "ProgressBar", "value": 65, "color": "Accent", "height": 3 }
        ]
      },
      {
        "type": "Column",
        "width": "stretch",
        "items": [
          { "type": "TextBlock", "text": "1m 92%", "size": "Small", "weight": "Bolder", "color": "Subtle" },
          { "type": "ProgressBar", "value": 92, "color": "Subtle", "height": 3 }
        ]
      }
    ]
  },
  "body": [
    {
      "type": "ColumnSet",
      "columns": [
        {
          "type": "Column",
          "width": "stretch",
          "items": [
            { "type": "TextBlock", "text": "5h 周期", "size": "Small", "isSubtle": true },
            { "type": "TextBlock", "text": "80%", "size": "Medium", "weight": "Bolder", "color": "Good" },
            { "type": "ProgressBar", "value": 80, "color": "Good" },
            { "type": "TextBlock", "text": "4.0 / 5.0 小时", "size": "Small", "isSubtle": true }
          ]
        },
        {
          "type": "Column",
          "width": "stretch",
          "separator": true,
          "items": [
            { "type": "TextBlock", "text": "7d 周期", "size": "Small", "isSubtle": true },
            { "type": "TextBlock", "text": "65%", "size": "Medium", "weight": "Bolder", "color": "Accent" },
            { "type": "ProgressBar", "value": 65, "color": "Accent" },
            { "type": "TextBlock", "text": "4.5 / 7.0 天", "size": "Small", "isSubtle": true }
          ]
        },
        {
          "type": "Column",
          "width": "stretch",
          "separator": true,
          "items": [
            { "type": "TextBlock", "text": "1m 周期", "size": "Small", "isSubtle": true },
            { "type": "TextBlock", "text": "92%", "size": "Medium", "weight": "Bolder", "color": "#8B5CF6" },
            { "type": "ProgressBar", "value": 92, "color": "#8B5CF6" },
            { "type": "TextBlock", "text": "27.6 / 30 天", "size": "Small", "isSubtle": true }
          ]
        }
      ]
    }
  ]
}

场景 B:消费账单 + 模型/Token 动态看板

json
{
  "type": "AdaptiveCard",
  "version": "1.5",
  "compact": {
    "type": "Row",
    "items": [
      { "type": "StatusDot", "color": "Good" },
      { "type": "TextBlock", "text": "可用余额 $18.42", "weight": "Bolder" },
      { "type": "TextBlock", "text": "(今日 $0.45)", "size": "Small", "isSubtle": true }
    ]
  },
  "body": [
    {
      "type": "ColumnSet",
      "columns": [
        {
          "type": "Column",
          "width": "stretch",
          "items": [
            { "type": "TextBlock", "text": "当前可用余额", "size": "Small", "isSubtle": true },
            { "type": "TextBlock", "text": "$18.42", "size": "ExtraLarge", "weight": "Bolder", "color": "Good" },
            { "type": "TextBlock", "text": "≈ ¥132.60 CNY", "size": "Small", "isSubtle": true }
          ]
        },
        {
          "type": "Column",
          "width": "stretch",
          "separator": true,
          "items": [
            { "type": "TextBlock", "text": "本月累计消费", "size": "Small", "isSubtle": true },
            { "type": "TextBlock", "text": "$6.58", "size": "ExtraLarge", "weight": "Bolder", "color": "Accent" },
            { "type": "TextBlock", "text": "今日消耗 $0.45", "size": "Small", "isSubtle": true }
          ]
        }
      ]
    },
    { "type": "Divider" },
    {
      "type": "FactSet",
      "facts": [
        { "title": "当前模型", "value": "claude-3-7-sonnet" },
        { "title": "本次请求 Token", "value": "↑ 1,420 / ↓ 365" },
        { "title": "会话累计 Token", "value": "28,540" }
      ]
    },
    {
      "type": "Row",
      "items": [
        { "type": "TextBlock", "text": "", "weight": 1 },
        {
          "type": "ActionButton",
          "title": "管理控制台",
          "action": "openUrl",
          "url": "https://api.openai.com",
          "icon": "external-link"
        }
      ]
    }
  ]
}

8. AI 助手编写面板脚本的设计建议

  1. 利用传入的环境变量: 通过 os.environ.get("AICODE_LAST_INPUT_TOKENS", "0") 等读取每次单次请求的真实 Token 数据,无缝拼装出当次请求的 Token 消耗、缓存命中率或费用估算。
  2. 信息分层
    • compact 保持单行精炼(如 [🟢 正常] 5h: 80% | $18.42);
    • body 提供多列展开、账单细则与操作按钮。
  3. 异常兜底: 当网络超时或 API 错误时,输出带 StatusDot(color="Attention") 的卡片,友好提示异常。

场景 C:多排标签流式布局 + 横向滚动指标

json
{
  "type": "AdaptiveCard",
  "version": "1.5",
  "compact": {
    "type": "Row",
    "items": [
      { "type": "StatusDot", "color": "Good" },
      { "type": "TextBlock", "text": "正常", "weight": "Bolder" },
      { "type": "TextBlock", "text": "", "weight": 1 },
      { "type": "Badge", "text": "Pro", "style": "Accent", "icon": "external-link" }
    ]
  },
  "body": [
    {
      "type": "Container",
      "style": "Subtle",
      "cornerRadius": 8,
      "items": [
        { "type": "TextBlock", "text": "可用模型", "weight": "Bolder", "size": "Medium" },
        { "type": "Spacer", "height": 4 },
        {
          "type": "FlowRow",
          "gap": 6,
          "verticalGap": 4,
          "items": [
            { "type": "Badge", "text": "GPT-4o", "style": "Accent" },
            { "type": "Badge", "text": "Claude 3.7", "style": "Good" },
            { "type": "Badge", "text": "Gemini 2.0", "style": "Warning" },
            { "type": "Badge", "text": "DeepSeek", "style": "Subtle" }
          ]
        }
      ]
    },
    { "type": "Spacer", "height": 8 },
    {
      "type": "ScrollRow",
      "gap": 12,
      "items": [
        { "type": "Metric", "label": "余额", "value": "$18.42", "color": "Good" },
        { "type": "Metric", "label": "今日", "value": "$0.45", "color": "Accent" },
        { "type": "Metric", "label": "本月", "value": "$6.58", "color": "Warning" },
        { "type": "Metric", "label": "配额", "value": "82%", "color": "Attention" }
      ]
    }
  ]
}

基于 GPL-3.0 协议开源