@szjy/ai-coms 0.1.10 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/README.md +43 -1
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.mjs +1809 -3425
  4. package/dist/index.umd.js +3 -2
  5. package/dist/packages/api/ai.d.ts +12 -7
  6. package/dist/packages/api/mock.d.ts +16 -0
  7. package/dist/packages/common/audio/recorder.d.ts +13 -4
  8. package/dist/packages/common/audio/transcript-sanitize.d.ts +16 -0
  9. package/dist/packages/common/audio/voice-manager.d.ts +5 -15
  10. package/dist/packages/components/AiChat/src/components/plugins/markdown.d.ts +2 -2
  11. package/dist/packages/components/AiChat/src/composables/useChatDeps.d.ts +6 -0
  12. package/dist/packages/components/AiChat/src/custom-ui/actions/postMessage.d.ts +12 -0
  13. package/dist/packages/components/AiChat/src/custom-ui/components/button.d.ts +9 -0
  14. package/dist/packages/components/AiChat/src/custom-ui/components/list.d.ts +8 -0
  15. package/dist/packages/components/AiChat/src/custom-ui/events.d.ts +27 -0
  16. package/dist/packages/components/AiChat/src/custom-ui/index.d.ts +7 -0
  17. package/dist/packages/components/AiChat/src/custom-ui/parse.d.ts +11 -0
  18. package/dist/packages/components/AiChat/src/custom-ui/registry.d.ts +8 -0
  19. package/dist/packages/components/AiChat/src/custom-ui/render.d.ts +18 -0
  20. package/dist/packages/components/AiChat/src/custom-ui/types.d.ts +84 -0
  21. package/dist/packages/components/AiChat/src/index.vue.d.ts +87 -4
  22. package/dist/packages/components/AiChat/src/transform/index.d.ts +14 -1
  23. package/dist/packages/components/AiChatPlain/index.d.ts +3 -0
  24. package/dist/packages/components/AiChatPlain/src/index.vue.d.ts +213 -0
  25. package/dist/packages/components/components.d.ts +1 -0
  26. package/dist/scripts/ai/README.md +8 -1
  27. package/dist/scripts/ai/whisper.worker.js +104 -13
  28. package/dist/style.css +2 -2
  29. package/package.json +1 -1
  30. package/dist/packages/common/audio/zh-simplified.d.ts +0 -8
@@ -8,12 +8,25 @@ export interface RecorderOptions {
8
8
  /** 每次采集到 16kHz PCM 分片时回调(与内部缓存共享引用,调用方如需 Transferable 请先拷贝) */
9
9
  onAudioChunk?: (chunk: Float32Array) => void;
10
10
  }
11
+ /**
12
+ * 跨 ScriptProcessor 缓冲的连续线性重采样,避免每片独立插值在边界产生断裂。
13
+ */
14
+ export declare class StreamResampler {
15
+ private ratio;
16
+ private leftover;
17
+ private fracOffset;
18
+ constructor(fromRate: number, toRate: number);
19
+ reset(): void;
20
+ process(chunk: Float32Array): Float32Array;
21
+ }
11
22
  export declare class AudioRecorder {
12
23
  private targetSampleRate;
13
24
  private audioContext;
14
25
  private mediaStream;
15
26
  private sourceNode;
16
27
  private processorNode;
28
+ private muteGain;
29
+ private resampler;
17
30
  private audioChunks;
18
31
  private onVolumeChange?;
19
32
  private onAudioChunk?;
@@ -33,10 +46,6 @@ export declare class AudioRecorder {
33
46
  */
34
47
  cancel(): void;
35
48
  private cleanup;
36
- /**
37
- * 线性插值音频重采样
38
- */
39
- private resampleAudio;
40
49
  }
41
50
  /**
42
51
  * 线性插值音频重采样
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Whisper 转写后处理:折叠重复、去掉短音频上的常见幻觉。
3
+ * 实时短分片被右侧补零到 30 秒时,模型常循环输出「三十分」一类时间词。
4
+ */
5
+ /**
6
+ * 折叠连续重复的短语与单字(「三十分三十分三十分」→「三十分」)
7
+ */
8
+ export declare function collapseRepeatedPhrases(text: string): string;
9
+ /**
10
+ * 按音频时长限制字数,挡住没被折叠掉的超长循环输出。
11
+ */
12
+ export declare function clampTranscriptToAudio(text: string, durationSec: number): string;
13
+ /**
14
+ * 清理单次推理结果。短音频上的纯幻觉直接丢弃。
15
+ */
16
+ export declare function sanitizeTranscript(text: string, durationSec?: number): string;
@@ -27,7 +27,7 @@ export interface VoiceManagerOptions {
27
27
  onProgress?: (info: VoiceProgressInfo) => void;
28
28
  onVolumeChange?: (volume: number) => void;
29
29
  onAudioRecorded?: (audioUrl: string, blob: Blob) => void;
30
- /** 流式中间文本(已确认分片 + 当前分片正在生成的字) */
30
+ /** 转写过程中的中间文本(录音结束后 / 上传文件时按 token 回推) */
31
31
  onPartial?: (text: string) => void;
32
32
  onResult?: (text: string) => void;
33
33
  onError?: (error: string) => void;
@@ -44,13 +44,8 @@ export declare class VoiceInputManager {
44
44
  private currentTaskId;
45
45
  private pcmParts;
46
46
  private pcmLength;
47
- private pcmSent;
48
- private streamBusy;
49
- private streamFinalPending;
50
47
  private streamChunkIndex;
51
48
  private committedText;
52
- private chunkPartialText;
53
- private streamPumpTimer;
54
49
  constructor(options?: VoiceManagerOptions);
55
50
  get currentStatus(): VoiceStatus;
56
51
  get ready(): boolean;
@@ -59,7 +54,7 @@ export declare class VoiceInputManager {
59
54
  */
60
55
  init(customBaseUrl?: string): Promise<void>;
61
56
  /**
62
- * 开始语音录入
57
+ * 开始语音录入(只采集,点「完成」后再转写)
63
58
  */
64
59
  startRecording(): Promise<void>;
65
60
  /**
@@ -90,20 +85,15 @@ export declare class VoiceInputManager {
90
85
  * 销毁并释放所有资源
91
86
  */
92
87
  destroy(): void;
93
- private startStreamPump;
94
- private stopStreamPump;
95
- private getNextChunkSize;
96
88
  private resetStreamState;
97
89
  private appendPcm;
98
90
  private mergePcm;
99
- private copyPcm;
100
- private emitLiveText;
91
+ private emitPartial;
101
92
  private finishStream;
102
93
  /**
103
- * 将未发送的 PCM 按固定窗口送给 Worker
104
- * isFinal=true 表示采集已结束,发完剩余尾巴后收口。
94
+ * 录音结束或上传:整段一次送入 Worker。超过 30s Worker 按重叠窗口切分。
105
95
  */
106
- private tryDispatchStreamChunk;
96
+ private dispatchFullAudio;
107
97
  private handleWorkerMessage;
108
98
  private setStatus;
109
99
  }
@@ -1,3 +1,3 @@
1
- declare let MarkdownInstance: null;
2
- export declare function genMarkdownIt(): null;
1
+ declare let MarkdownInstance: MarkdownItInstance | null;
2
+ export declare function genMarkdownIt(): MarkdownItInstance | null;
3
3
  export { MarkdownInstance };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 聊天运行时依赖加载(markdown-it / highlight.js)
3
+ * 挂件(sz-ai-chat)与嵌入式(sz-ai-chat-plain)两种外壳共用:
4
+ * 从 /scripts/ai/ 加载 markdown-it 与 highlight 脚本,完成后初始化全局 MarkdownIt 实例。
5
+ */
6
+ export declare function useChatDeps(): void;
@@ -0,0 +1,12 @@
1
+ import { SzjyUiActionContext } from '../types';
2
+
3
+ /**
4
+ * postMessage 动作:把 actionParams 原样作为消息体发送到目标窗口。
5
+ * 典型消息体即 BIM 沙盘外部通信协议:
6
+ * { type: 'BIM_SANDBOX', action: 'locateComponent', payload: { wbsCode } }
7
+ *
8
+ * 传输通道(customUi.postMessage.transport,默认 'auto'):
9
+ * - 同窗口/同源目标存在 window.$bimSandbox 时优先直调全局方法(同步返回、即时反馈);
10
+ * - 否则走 postMessage 并监听回执(跨域 iframe 场景)。
11
+ */
12
+ export declare function runPostMessageAction(ctx: SzjyUiActionContext): void;
@@ -0,0 +1,9 @@
1
+ import { SzjyUiNode, SzjyUiRenderContext } from '../types';
2
+
3
+ /**
4
+ * button 组件渲染器。
5
+ * props: { type?: 按钮类型, size?: 尺寸, content?: 按钮文案 }
6
+ * action / actionParams 由 renderActionAttrs 统一落到 data-* 属性。
7
+ * 内部固定包含 .szjy-ui-btn__status 状态位,供 postMessage 回执反馈就地展示。
8
+ */
9
+ export declare function renderButton(node: SzjyUiNode, _ctx: SzjyUiRenderContext): string;
@@ -0,0 +1,8 @@
1
+ import { SzjyUiBlock, SzjyUiRenderContext } from '../types';
2
+
3
+ /**
4
+ * list 容器组件渲染器。
5
+ * { title, type: 'list', gap, items: [节点...] }
6
+ * items 递归走组件注册表,天然支持未来嵌套其他容器。
7
+ */
8
+ export declare function renderList(node: SzjyUiBlock, ctx: SzjyUiRenderContext): string;
@@ -0,0 +1,27 @@
1
+ import { SzjyUiConfig } from './types';
2
+
3
+ export interface SzjyUiEventOptions {
4
+ /**
5
+ * 读取宿主 customUi 配置。支持 getter(推荐)——点击时求值,
6
+ * 避免宿主后续更新配置(如切换沙盘地址/targetOrigin)后仍用旧值导致消息被静默丢弃
7
+ */
8
+ getConfig?: () => SzjyUiConfig | null;
9
+ /**
10
+ * 宿主拦截钩子:动作执行前调用,返回 false 阻止内置动作执行
11
+ * (用于宿主自定义路由/改写消息体等场景),点击时求值
12
+ */
13
+ getInterceptor?: () => ((action: string, params: any, triggerEl: HTMLElement) => any) | null | undefined;
14
+ /** 动作触发通知(观察性质,不影响执行),随 ui-action 事件冒泡给宿主 */
15
+ onAction?: (payload: {
16
+ action: string;
17
+ params: any;
18
+ triggerEl: HTMLElement;
19
+ }) => void;
20
+ }
21
+ /**
22
+ * 在容器上绑定 szjy-ui 委托点击事件,返回解绑函数。
23
+ *
24
+ * 为什么用事件委托:打字机效果每帧用 v-html 整块重建消息内容,
25
+ * 直接绑定在按钮节点上的监听器会随之丢失;委托挂在稳定的容器上不受影响。
26
+ */
27
+ export declare function bindSzjyUiEvents(el: HTMLElement, options?: SzjyUiEventOptions): () => void;
@@ -0,0 +1,7 @@
1
+
2
+ export * from './types';
3
+ export { SZJY_UI_FENCE_LANG, parseSzjyUiFence } from './parse';
4
+ export { escapeHtml, renderSzjyUiBlock, renderSzjyUiNode, renderActionAttrs } from './render';
5
+ export { registerSzjyUiComponent, registerSzjyUiAction, getSzjyUiComponent, hasSzjyUiComponent, getSzjyUiAction, hasSzjyUiAction } from './registry';
6
+ export { bindSzjyUiEvents } from './events';
7
+ export type { SzjyUiEventOptions } from './events';
@@ -0,0 +1,11 @@
1
+ import { SzjyUiBlock } from './types';
2
+
3
+ /** szjy-ui 自定义 fence 的语言标识 */
4
+ export declare const SZJY_UI_FENCE_LANG = "szjy-ui";
5
+ /**
6
+ * 解析 szjy-ui fence 内容为块描述。
7
+ * 流式输出中 JSON 尚未输出完整、或结构不合法时返回 null,
8
+ * 调用方(markdown fence 规则)降级为普通代码块展示;
9
+ * 待流式推进、JSON 完整后下一次渲染自然切换为组件。
10
+ */
11
+ export declare function parseSzjyUiFence(content: string): SzjyUiBlock | null;
@@ -0,0 +1,8 @@
1
+ import { SzjyUiComponentRenderer, SzjyUiActionHandler } from './types';
2
+
3
+ export declare function registerSzjyUiComponent(type: string, renderer: SzjyUiComponentRenderer): void;
4
+ export declare function registerSzjyUiAction(name: string, handler: SzjyUiActionHandler): void;
5
+ export declare function getSzjyUiComponent(type: string): SzjyUiComponentRenderer | undefined;
6
+ export declare function hasSzjyUiComponent(type: string): boolean;
7
+ export declare function getSzjyUiAction(name: string): SzjyUiActionHandler | undefined;
8
+ export declare function hasSzjyUiAction(name: string): boolean;
@@ -0,0 +1,18 @@
1
+ import { SzjyUiBlock, SzjyUiNode, SzjyUiRenderContext } from './types';
2
+
3
+ /** 输出进入 v-html,所有动态文本必须经此转义 */
4
+ export declare function escapeHtml(text: unknown): string;
5
+ /**
6
+ * 渲染整个 szjy-ui 块为 HTML 字符串(含外层标识容器)。
7
+ * 块内未知类型的子节点在 renderSzjyUiNode 中被跳过,不影响其余节点。
8
+ */
9
+ export declare function renderSzjyUiBlock(block: SzjyUiBlock): string;
10
+ /** 按注册表分发渲染单个节点;未注册类型返回空字符串 */
11
+ export declare function renderSzjyUiNode(node: SzjyUiNode, ctx: SzjyUiRenderContext): string;
12
+ /**
13
+ * 构造节点上的动作属性(data-*),供事件委托读取。
14
+ * - 无 action:普通展示型组件
15
+ * - action 未注册:渲染为禁用态并提示,避免点击无反馈
16
+ * - actionParams 经 encodeURIComponent 存入 data 属性,规避引号/换行转义问题
17
+ */
18
+ export declare function renderActionAttrs(node: SzjyUiNode): string;
@@ -0,0 +1,84 @@
1
+ /**
2
+ * szjy-ui fence 块类型定义
3
+ *
4
+ * AI 响应中的 ```szjy-ui fence 块(JSON)经 parseSzjyUiFence 解析为 SzjyUiBlock,
5
+ * 再按组件注册表渲染为 HTML 字符串(v-html 输出),交互走容器级事件委托。
6
+ */
7
+ /** 动作参数。postMessage 动作下即消息体本身(如 BIM_SANDBOX 定位协议) */
8
+ export type SzjyUiActionParams = Record<string, any>;
9
+ /** 单个 UI 节点(button、未来的 card/tag 等) */
10
+ export interface SzjyUiNode {
11
+ type: string;
12
+ props?: Record<string, any>;
13
+ action?: string;
14
+ actionParams?: SzjyUiActionParams;
15
+ [key: string]: any;
16
+ }
17
+ /** 容器类节点(list 等),items 递归走组件注册表渲染 */
18
+ export interface SzjyUiBlock extends SzjyUiNode {
19
+ title?: string;
20
+ gap?: number | string;
21
+ items?: SzjyUiNode[];
22
+ }
23
+ /** 组件渲染上下文:当前节点所属的根块 */
24
+ export interface SzjyUiRenderContext {
25
+ block: SzjyUiBlock;
26
+ }
27
+ /**
28
+ * 组件渲染器:节点 → HTML 字符串。
29
+ * 输出会进入 v-html,渲染器必须对一切动态文本使用 escapeHtml 转义。
30
+ */
31
+ export type SzjyUiComponentRenderer = (node: SzjyUiNode, ctx: SzjyUiRenderContext) => string;
32
+ /** postMessage 动作配置(sz-ai-chat 的 customUi.postMessage) */
33
+ export interface SzjyUiPostMessageConfig {
34
+ /**
35
+ * 目标窗口:
36
+ * - 'self'(默认,聊天与 BIM 沙盘同窗口的部署形态)/ 'parent' / 'top'
37
+ * - Window 或 Window[](如沙盘 iframe 的 contentWindow)
38
+ * - 函数:发送前以消息体求值,返回 Window | Window[]
39
+ */
40
+ target?: 'self' | 'parent' | 'top' | Window | Window[] | ((message: SzjyUiActionParams) => Window | Window[]);
41
+ /** postMessage 的 targetOrigin,默认 '*';生产环境建议配置为沙盘真实源 */
42
+ targetOrigin?: string;
43
+ /**
44
+ * 传输通道:
45
+ * - 'auto'(默认):消息为 BIM_SANDBOX 协议且目标窗口存在 window.$bimSandbox 时
46
+ * 直调全局方法(同步返回、即时反馈,见《BIM沙盘全局方法调用文档》),否则回退 postMessage;
47
+ * 跨域 iframe 访问不到全局对象,自动回退
48
+ * - 'global':强制仅用全局方法,不可用时按钮报「全局方法不可用」
49
+ * - 'postMessage':强制仅用 postMessage(与《BIM沙盘外部通信文档》一致)
50
+ */
51
+ transport?: 'auto' | 'postMessage' | 'global';
52
+ /**
53
+ * 回执失败且原因匹配「未就绪/未加载」时的自动重试;
54
+ * 默认 { retries: 2, delay: 2000 },传 false 关闭
55
+ */
56
+ retry?: false | {
57
+ retries?: number;
58
+ delay?: number;
59
+ };
60
+ /** 是否监听回执并在按钮旁展示成功/失败反馈,默认 true */
61
+ feedback?: boolean;
62
+ }
63
+ /** sz-ai-chat / sz-ai-chat-plain 的 customUi prop 结构 */
64
+ export interface SzjyUiConfig {
65
+ postMessage?: SzjyUiPostMessageConfig;
66
+ /**
67
+ * 动作调试日志:点击时在 console 打印动作名、参数、消息体、目标窗口与回执结果,
68
+ * 默认 true;生产环境如需安静可传 false
69
+ */
70
+ debug?: boolean;
71
+ }
72
+ /** 动作执行上下文 */
73
+ export interface SzjyUiActionContext {
74
+ /** actionParams 解析结果 */
75
+ params: SzjyUiActionParams;
76
+ /** 触发动作的节点(按钮等),供反馈定位 */
77
+ node?: SzjyUiNode;
78
+ /** 宿主传入的 customUi 配置 */
79
+ config: SzjyUiConfig | null;
80
+ /** 触发动作的 DOM 元素,用于就地展示发送/成功/失败状态 */
81
+ triggerEl: HTMLElement;
82
+ }
83
+ /** 动作处理器 */
84
+ export type SzjyUiActionHandler = (ctx: SzjyUiActionContext) => void;
@@ -56,7 +56,46 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
56
56
  type: StringConstructor;
57
57
  default: string;
58
58
  };
59
- }>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
59
+ /**
60
+ * 是否显示麦克风语音输入入口,默认关闭
61
+ */
62
+ enableVoiceInput: {
63
+ type: BooleanConstructor;
64
+ default: boolean;
65
+ };
66
+ /**
67
+ * 是否显示上传音频/视频识别入口,默认关闭
68
+ */
69
+ enableVoiceUpload: {
70
+ type: BooleanConstructor;
71
+ default: boolean;
72
+ };
73
+ /**
74
+ * szjy-ui fence 自定义 UI 配置,透传给动作处理器。
75
+ * 例如:{ postMessage: { target: () => sandboxIframe.contentWindow, targetOrigin: 'http://...' } }
76
+ */
77
+ customUi: {
78
+ type: ObjectConstructor;
79
+ default: null;
80
+ };
81
+ /**
82
+ * szjy-ui 动作拦截钩子:(action, params, triggerEl) => false 可阻止内置动作执行
83
+ */
84
+ uiActionHandler: {
85
+ type: FunctionConstructor;
86
+ default: null;
87
+ };
88
+ /**
89
+ * Mock 响应内容:llmName 为 standard(模拟数据模型)时不请求真实后端,
90
+ * 将该内容流式输出,用于联调 szjy-ui fence / postMessage 动作
91
+ */
92
+ mockResponse: {
93
+ type: StringConstructor;
94
+ default: string;
95
+ };
96
+ }>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
97
+ "ui-action": (...args: any[]) => void;
98
+ }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
60
99
  token: {
61
100
  type: StringConstructor;
62
101
  default: string;
@@ -114,15 +153,59 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
114
153
  type: StringConstructor;
115
154
  default: string;
116
155
  };
117
- }>> & Readonly<{}>, {
156
+ /**
157
+ * 是否显示麦克风语音输入入口,默认关闭
158
+ */
159
+ enableVoiceInput: {
160
+ type: BooleanConstructor;
161
+ default: boolean;
162
+ };
163
+ /**
164
+ * 是否显示上传音频/视频识别入口,默认关闭
165
+ */
166
+ enableVoiceUpload: {
167
+ type: BooleanConstructor;
168
+ default: boolean;
169
+ };
170
+ /**
171
+ * szjy-ui fence 自定义 UI 配置,透传给动作处理器。
172
+ * 例如:{ postMessage: { target: () => sandboxIframe.contentWindow, targetOrigin: 'http://...' } }
173
+ */
174
+ customUi: {
175
+ type: ObjectConstructor;
176
+ default: null;
177
+ };
178
+ /**
179
+ * szjy-ui 动作拦截钩子:(action, params, triggerEl) => false 可阻止内置动作执行
180
+ */
181
+ uiActionHandler: {
182
+ type: FunctionConstructor;
183
+ default: null;
184
+ };
185
+ /**
186
+ * Mock 响应内容:llmName 为 standard(模拟数据模型)时不请求真实后端,
187
+ * 将该内容流式输出,用于联调 szjy-ui fence / postMessage 动作
188
+ */
189
+ mockResponse: {
190
+ type: StringConstructor;
191
+ default: string;
192
+ };
193
+ }>> & Readonly<{
194
+ "onUi-action"?: ((...args: any[]) => any) | undefined;
195
+ }>, {
196
+ title: string;
197
+ baseUrl: string;
118
198
  token: string;
119
199
  identifier: string;
120
- baseUrl: string;
121
- title: string;
122
200
  llmName: string;
123
201
  messagePostRender: Function;
124
202
  extraConfig: Record<string, any>;
125
203
  soundBaseUrl: string;
126
204
  workerUrl: string;
205
+ enableVoiceInput: boolean;
206
+ enableVoiceUpload: boolean;
207
+ customUi: Record<string, any>;
208
+ uiActionHandler: Function;
209
+ mockResponse: string;
127
210
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
128
211
  export default _default;
@@ -1,17 +1,30 @@
1
1
  import { createSparkStylized } from '../../../../api/ai';
2
+ import { createMockStylized } from '../../../../api/mock';
2
3
 
3
4
  /**
4
5
  * 转义处理响应值为 data: 的 json 字符串
5
6
  * 如: 科大讯飞星火、Kimi Moonshot 等大模型的 response
6
7
  */
7
8
  export declare const parseJsonLikeData: (content: any) => any;
9
+ /**
10
+ * 从大模型原始输出中分离「思考过程」与「正文」,兼容两种格式:
11
+ * 1. 标准 <think>...</think> 包裹(DeepSeek R1 风格)
12
+ * 2. Dify 兼容口:思考内容直接输出在前,仅以 </think> 结尾(无开标签)
13
+ *
14
+ * isThinkingStreaming 表示流式输出尚未闭合(已出现 <think> 但还没等到 </think>)。
15
+ */
16
+ export declare const parseThinking: (raw: string) => {
17
+ thinking: string;
18
+ content: string;
19
+ isThinkingStreaming: boolean;
20
+ };
8
21
  /**
9
22
  * 大模型映射列表
10
23
  */
11
24
  export declare const LLMTypes: ({
12
25
  label: string;
13
26
  modelName: string;
14
- api: null;
27
+ api: typeof createMockStylized;
15
28
  } | {
16
29
  label: string;
17
30
  modelName: string;
@@ -0,0 +1,3 @@
1
+ import { default as SzAiChatPlain } from './src/index.vue';
2
+
3
+ export { SzAiChatPlain };