@qfei-design/make-ai-assistant 0.2.16 → 0.3.1
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.
- package/PUBLIC_API.md +40 -0
- package/README.md +25 -11
- package/capabilities.json +27 -0
- package/dist/client-types.d.ts +1 -0
- package/dist/client.cjs +2 -2
- package/dist/client.mjs +46 -41
- package/dist/core/conversation-management.d.ts +1 -0
- package/dist/react/use-conversation-manager.d.ts +3 -0
- package/dist/react.cjs +6 -4
- package/dist/react.mjs +1339 -1311
- package/dist/styles.css +31 -14
- package/docs/make-app-integration.md +56 -1
- package/examples/make-app/README.md +21 -3
- package/package.ai.json +1 -1
- package/package.json +1 -1
package/dist/styles.css
CHANGED
|
@@ -385,15 +385,15 @@
|
|
|
385
385
|
.make-ai-assistant__task-list-icon {
|
|
386
386
|
display: block;
|
|
387
387
|
flex: 0 0 auto;
|
|
388
|
-
height:
|
|
389
|
-
width:
|
|
388
|
+
height: 14px;
|
|
389
|
+
width: 14px;
|
|
390
390
|
}
|
|
391
391
|
|
|
392
392
|
.make-ai-assistant__task-list-disclosure {
|
|
393
393
|
display: block;
|
|
394
394
|
flex: 0 0 auto;
|
|
395
|
-
height:
|
|
396
|
-
width:
|
|
395
|
+
height: 14px;
|
|
396
|
+
width: 14px;
|
|
397
397
|
}
|
|
398
398
|
|
|
399
399
|
.make-ai-assistant__header-title {
|
|
@@ -635,6 +635,7 @@
|
|
|
635
635
|
display: grid;
|
|
636
636
|
font-size: var(--make-ai-internal-font-size-markdown);
|
|
637
637
|
gap: var(--make-ai-internal-assistant-block-gap);
|
|
638
|
+
grid-template-columns: minmax(0, 1fr);
|
|
638
639
|
line-height: var(--make-ai-internal-line-height-body);
|
|
639
640
|
max-width: 100%;
|
|
640
641
|
white-space: normal;
|
|
@@ -644,8 +645,7 @@
|
|
|
644
645
|
.make-ai-assistant__assistant-text p,
|
|
645
646
|
.make-ai-assistant__assistant-text .make-ai-assistant__markdown-heading,
|
|
646
647
|
.make-ai-assistant__assistant-text ul,
|
|
647
|
-
.make-ai-assistant__assistant-text .make-ai-assistant__markdown-table-scroll
|
|
648
|
-
.make-ai-assistant__assistant-text pre {
|
|
648
|
+
.make-ai-assistant__assistant-text .make-ai-assistant__markdown-table-scroll {
|
|
649
649
|
margin: 0;
|
|
650
650
|
}
|
|
651
651
|
|
|
@@ -722,8 +722,11 @@
|
|
|
722
722
|
color: var(--make-ai-internal-text-secondary);
|
|
723
723
|
font-size: 1em;
|
|
724
724
|
line-height: 1.55;
|
|
725
|
+
margin: 0;
|
|
725
726
|
max-width: 100%;
|
|
726
|
-
|
|
727
|
+
min-width: 0;
|
|
728
|
+
overflow-x: auto;
|
|
729
|
+
overscroll-behavior-inline: contain;
|
|
727
730
|
padding: 9px 10px;
|
|
728
731
|
}
|
|
729
732
|
|
|
@@ -732,8 +735,15 @@
|
|
|
732
735
|
border: 0;
|
|
733
736
|
color: inherit;
|
|
734
737
|
display: block;
|
|
738
|
+
overflow-wrap: normal;
|
|
735
739
|
padding: 0;
|
|
736
740
|
white-space: pre;
|
|
741
|
+
word-break: normal;
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
.make-ai-assistant__assistant-text pre:focus-visible {
|
|
745
|
+
outline: 2px solid var(--make-ai-internal-accent);
|
|
746
|
+
outline-offset: 2px;
|
|
737
747
|
}
|
|
738
748
|
|
|
739
749
|
.make-ai-assistant__markdown-table-scroll {
|
|
@@ -933,8 +943,7 @@
|
|
|
933
943
|
display: flex;
|
|
934
944
|
gap: 10px;
|
|
935
945
|
list-style: none;
|
|
936
|
-
|
|
937
|
-
padding: 10px 12px;
|
|
946
|
+
padding: 8px 12px;
|
|
938
947
|
}
|
|
939
948
|
|
|
940
949
|
.make-ai-assistant__process summary:hover {
|
|
@@ -999,25 +1008,29 @@
|
|
|
999
1008
|
}
|
|
1000
1009
|
|
|
1001
1010
|
.make-ai-assistant__process-copy {
|
|
1002
|
-
|
|
1003
|
-
|
|
1011
|
+
align-items: center;
|
|
1012
|
+
display: flex;
|
|
1013
|
+
gap: 8px;
|
|
1004
1014
|
min-width: 0;
|
|
1005
1015
|
}
|
|
1006
1016
|
|
|
1007
1017
|
.make-ai-assistant__process-title {
|
|
1008
1018
|
color: var(--make-ai-internal-text);
|
|
1019
|
+
flex: 0 0 auto;
|
|
1009
1020
|
font-size: var(--make-ai-internal-font-size-ui);
|
|
1010
1021
|
font-weight: 700;
|
|
1011
|
-
line-height: var(--make-ai-internal-line-height-
|
|
1022
|
+
line-height: var(--make-ai-internal-line-height-caption);
|
|
1023
|
+
white-space: nowrap;
|
|
1012
1024
|
}
|
|
1013
1025
|
|
|
1014
1026
|
.make-ai-assistant__process .make-ai-assistant__process-latest {
|
|
1015
1027
|
color: var(--make-ai-internal-text-secondary);
|
|
1016
1028
|
display: block;
|
|
1017
|
-
flex:
|
|
1029
|
+
flex: 1 1 auto;
|
|
1018
1030
|
font-size: var(--make-ai-internal-font-size-meta);
|
|
1019
1031
|
line-height: var(--make-ai-internal-line-height-meta);
|
|
1020
1032
|
min-height: 0;
|
|
1033
|
+
min-width: 0;
|
|
1021
1034
|
overflow: hidden;
|
|
1022
1035
|
text-overflow: ellipsis;
|
|
1023
1036
|
white-space: nowrap;
|
|
@@ -1042,7 +1055,11 @@
|
|
|
1042
1055
|
gap: 8px;
|
|
1043
1056
|
list-style: none;
|
|
1044
1057
|
margin: 0;
|
|
1045
|
-
padding:
|
|
1058
|
+
padding: 8px 12px;
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
.make-ai-assistant__process > .make-ai-assistant__assistant-text {
|
|
1062
|
+
padding: 8px 12px;
|
|
1046
1063
|
}
|
|
1047
1064
|
|
|
1048
1065
|
.make-ai-assistant__process li {
|
|
@@ -11,16 +11,34 @@ const client = createMakeAgentClient({
|
|
|
11
11
|
scope: { appKey, identityKey },
|
|
12
12
|
transport: authenticatedTransport,
|
|
13
13
|
});
|
|
14
|
+
// 先由宿主通过 client.agents.list() 读完分页,确定唯一的应用内 Agent。
|
|
14
15
|
const assistantTransport = await createMakeAppAssistantTransport({ client, agentId });
|
|
15
16
|
// 将 assistantTransport 传入 AssistantPanel / MakeAiAssistant。
|
|
16
17
|
// App、用户或租户改变时,取消旧连接并 client.dispose(),重新创建实例。
|
|
17
18
|
```
|
|
18
19
|
|
|
20
|
+
## 应用内 Agent
|
|
21
|
+
|
|
22
|
+
一个应用只绑定一个应用内 Agent。宿主取得该 Agent 的 `agentId` 后,调用
|
|
23
|
+
`createMakeAppAssistantTransport({ client, agentId })`,并把返回的 `transport` 传给
|
|
24
|
+
`AssistantPanel` 或 `MakeAiAssistant`。包不提供 Agent 选择器,也不通过列表接口自行决定 Agent。
|
|
25
|
+
如果宿主尚未取得 `agentId`,应先完成自己的加载或错误处理,再挂载对话组件;App、用户或租户
|
|
26
|
+
变化时中止旧请求、释放旧 client 并创建新实例。`identityKey` 仅用于隔离客户端状态,不是授权凭据。
|
|
27
|
+
模型选择与 Agent 绑定不同;当前组件尚无模型选择合同,不能用 Agent 列表代替模型列表。
|
|
28
|
+
|
|
29
|
+
首次选取 Agent 必须由宿主调用 `client.agents.list()` 读取完整分页:
|
|
30
|
+
`createMakeAppAssistantTransport()` 创建时就要求 `agentId`,因此不能先创建 transport 再用
|
|
31
|
+
`transport.listAgents()` 做首次选取。两个列表方法都会保留可选的 `agentType`:已知值包括
|
|
32
|
+
`app_internal`、`channel`,未来新增的字符串值也会透传;旧响应未提供时该属性缺失。
|
|
33
|
+
SDK 不按类型筛选、不默认选中 Agent。需要应用内 Agent 的宿主应在读完分页后自行筛选
|
|
34
|
+
`agentType === "app_internal"`,对零个或多个匹配项分别给出未配置或配置冲突提示,不能用其他
|
|
35
|
+
类型顶替。选定后再用该 `agentId` 创建 transport;其他宿主可采用自己的选择规则。
|
|
36
|
+
|
|
19
37
|
`AuthenticatedTransport.request` 只执行一次已认证 I/O,返回 status、headers 和 AsyncIterable<Uint8Array>。`retryOwner: "sdk"` 由 SDK 按幂等语义做有限重试;`retryOwner: "transport"` 不叠加 SDK 重试。宿主沿正式 auth.api 处理登录、401/403 和 Cookie,SSE/二进制成功体不经过 JSON 或 text() 缓冲。SDK 不读取 Token、Cookie、LocalStorage 或 Provider key。
|
|
20
38
|
|
|
21
39
|
普通操作分组为 capabilities、agents、chats、messages、responses、feedback、uploads 和 content。所有分页 cursor 都是不透明字符串;末页 nextCursor 为空串。不要把 Session 事件序号或 Redis ID 拼进公开 cursor。消息 messageId、Chat requestId、Feedback requestId 和 Upload fileId 来自用户的一次真实意图;重试使用同一个 ID 和字节,不重新生成。
|
|
22
40
|
|
|
23
|
-
SDK
|
|
41
|
+
SDK 忽略其他新增响应元数据,但保留可选的 Agent `agentType`,并验证已知字段及归属。未知可选 SSE 事件产生 kind=unknown;未知输出 part 产生安全占位类型,不能用于输入或自动执行业务动作。已知字段损坏、跨 Response 帧和同一 cursor 已知语义字段冲突的重放均报 AI_PROTOCOL_ERROR。Response 的未知 status 按 terminal 决定是否结束;snapshotRevision 阻止旧快照覆盖新状态。
|
|
24
42
|
|
|
25
43
|
Chat.titlePending 缺失按 false;已知待摘要会话每秒通过同一 client.chats.get 刷新,摘要完成即显示,与正文终态独立。取消只走 responses.cancel;关闭迭代器/组件只停止本地读取。
|
|
26
44
|
|
|
@@ -33,3 +51,40 @@ capabilities 返回可选 feature、当前 modelInputKinds 和 limits。适配
|
|
|
33
51
|
chat.management 只控制改名、置顶和删除;缺失该可选 feature 时仍可创建、选择和读取会话。缺失 attachments.read 时不提供下载入口。
|
|
34
52
|
|
|
35
53
|
发生游标重置或采用权威快照后,后续恢复继续读取有界快照直到终态,避免把没有共同游标的确认视图与旧增量混合。
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
## 标准接入
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
import {
|
|
60
|
+
createMakeAgentClient,
|
|
61
|
+
type Scope,
|
|
62
|
+
type AuthenticatedTransport,
|
|
63
|
+
} from '@qfei-design/make-ai-assistant/client';
|
|
64
|
+
import { createMakeAppAssistantTransport } from '@qfei-design/make-ai-assistant/make-app';
|
|
65
|
+
|
|
66
|
+
async function connectAssistant(
|
|
67
|
+
scope: Scope,
|
|
68
|
+
agentId: string,
|
|
69
|
+
transport: AuthenticatedTransport,
|
|
70
|
+
signal: AbortSignal,
|
|
71
|
+
) {
|
|
72
|
+
const client = createMakeAgentClient({ scope, transport });
|
|
73
|
+
try {
|
|
74
|
+
const assistantTransport = await createMakeAppAssistantTransport({
|
|
75
|
+
client, agentId, signal,
|
|
76
|
+
});
|
|
77
|
+
return { transport: assistantTransport, dispose: () => client.dispose() };
|
|
78
|
+
} catch (error) {
|
|
79
|
+
client.dispose();
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
将返回的 transport 交给助手界面,在用户、租户、App 切换和宿主卸载时执行 dispose。适配器会读取 capabilities,因此工厂是异步函数。创建过程中传入 signal,防止身份切换后旧结果重新挂载。identityKey 只隔离客户端缓存,不能作为服务端授权凭据。
|
|
86
|
+
|
|
87
|
+
AuthenticatedTransport 提供一次正式认证的 HTTP 请求及原始字节流,明确 retryOwner。它沿用 Make App Auth 的登录与续期流程,不读取浏览器 Token 或 Cookie,不对 SSE 做 JSON 解包。服务代理保留方法、查询、二进制、AbortSignal、原始响应以及版本和请求 ID 头,不再次实现客户端状态机。
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
宿主只在正式身份可用后创建实例;初始化 signal 中止时不得把旧身份返回的 transport 挂到新页面。服务代理保留方法、查询、版本头、AbortSignal 与响应字节。
|
|
@@ -1,11 +1,29 @@
|
|
|
1
1
|
# Make App 接入示例
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本示例消费包公开的 `/client`、`/react`、`/make-app` 和样式入口,演示宿主如何为应用内唯一 Agent
|
|
4
|
+
创建 transport 并挂载对话组件;不复制包内部的状态机。源代码按接入顺序阅读:
|
|
5
|
+
|
|
6
|
+
1. [transport.ts](transport.ts):由宿主注入已认证的同源 HTTP 字节流请求,并用 `agentId` 创建 transport。
|
|
7
|
+
2. [main.tsx](main.tsx):读取当前宿主配置并挂载 React 示例。
|
|
4
8
|
|
|
5
9
|
先在仓库根目录执行 `corepack pnpm build`,再执行 `corepack pnpm make-app:build`。输出在本目录的 dist,仅供宿主服务托管或本地验收;本例不处理登录、不读取 Token,也不提供生产 BFF。
|
|
6
10
|
|
|
7
|
-
宿主提供同源 `GET /runtime-config
|
|
11
|
+
宿主提供同源 `GET /runtime-config`,响应包含以下内容:
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{"appKey":"当前 App Key","appName":"当前 App 名称","agentId":"应用内 Agent ID","identityKey":"当前用户和租户的非凭据标识"}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`identityKey` 在用户/租户变化时必须随之变化;它只隔离客户端状态,不是授权依据。示例
|
|
18
|
+
`transport.ts` 使用同源 `fetch` 展示请求形状,生产宿主应接入现有认证客户端及 Service/Make Gateway,
|
|
19
|
+
沿正式登录与鉴权链路处理 401/403,并透传 `AbortSignal` 和响应字节流。不得将 Token 放入
|
|
20
|
+
`/runtime-config`、`scopeKey`、日志或包内部。
|
|
21
|
+
|
|
22
|
+
一个应用只绑定一个应用内 Agent;宿主须在挂载对话组件前取得对应 `agentId`,而不是让包显示
|
|
23
|
+
Agent 选择器。App 或身份改变时应取消旧请求、释放旧 Client 并创建新实例,不能沿用旧会话。
|
|
24
|
+
模型切换属于不同能力,当前示例不提供模型选择界面。
|
|
8
25
|
|
|
9
26
|
当前 Make App 后端只支持文本模型输入;示例的 modelInputKinds 为 `["text"]`,但仍保留统一的“上传文件或图片”入口。服务端必须根据消息 parts 和实际模型能力校验媒体类型;不要以原件存储或读取能力判断模型已经支持输入。
|
|
10
27
|
|
|
11
|
-
|
|
28
|
+
完整属性、transport 功能门控见 [公共 API](../../PUBLIC_API.md#组件参数速查);更多协议与安全约束见
|
|
29
|
+
[接入说明](../../docs/make-app-integration.md)。正式发布仍由原仓库 GitLab CI 负责。
|
package/package.ai.json
CHANGED
package/package.json
CHANGED