Files
ttstd-infinite-canvas/web/src/components/model-protocol-browser.tsx
huiku 7466119867 feat(image): 以插件声明统一图片参数、尺寸选择与定价合同 (#760)
* feat(image): 图片参数 - 统一插件声明配置与生成合同

* docs(image): 图片参数 - 说明声明合同与验证边界

* fix(plugins): 图片声明 - 保留内联素材支持并同步制品文档

* fix(image): 参数合同 - 对齐审批意图和尺寸预检调用方

* fix(image): 调用链 - 保留公开意图并接通独立分辨率

* fix(image): 图片参数 - 补齐分辨率接线与目录价格投影
2026-10-13 19:18:21 +08:00

37 lines
1.4 KiB
TypeScript

import { ChoiceBrowser } from "./choice-browser";
import type { ModelProtocolDefinition, ProtocolCapability } from "@/lib/model-protocols";
export function ModelProtocolBrowser({
capability,
protocols,
...props
}: {
capability?: ProtocolCapability;
protocols: ModelProtocolDefinition[];
value?: string;
onChange?: (value: string) => void;
loading?: boolean;
error?: string;
disabled?: boolean;
id?: string;
}) {
const options = protocols
.filter((protocol) => (!capability || protocol.capability === capability) && protocol.enabled !== false)
.map((protocol) => ({
value: protocol.value,
label: protocol.label,
subtitle: protocol.create,
vendor: protocol.vendor,
searchText: protocol.value,
details: [
{ label: "请求", value: <code>{protocol.create}</code> },
{ label: "请求体", value: protocol.contentType },
{ label: "响应", value: protocol.poll ? "异步轮询" : "同步响应" },
{ label: "来源", value: protocol.media },
...(protocol.imageParameters ? [{ label: "图片参数", value: protocol.imageParameters.map((p) => p.label).join("、") }] : []),
],
}));
return <ChoiceBrowser key={capability || "all"} {...props} label="调用协议" placeholder="搜索协议名称、厂商或请求路径" options={options} />;
}