@chat-lab/ui 0.1.0-beta.71 → 0.1.0-beta.74
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/dist/components/Chatkit/index.cjs +6 -4
- package/dist/components/Chatkit/index.cjs.map +1 -1
- package/dist/components/Chatkit/index.d.ts.map +1 -1
- package/dist/components/Chatkit/index.js +6 -4
- package/dist/components/Chatkit/index.js.map +1 -1
- package/dist/components/Chatkit/types.d.ts +1 -0
- package/dist/components/Chatkit/types.d.ts.map +1 -1
- package/dist/components/assistant-ui/markdown-text.cjs +17 -20
- package/dist/components/assistant-ui/markdown-text.cjs.map +1 -1
- package/dist/components/assistant-ui/markdown-text.d.ts +3 -1
- package/dist/components/assistant-ui/markdown-text.d.ts.map +1 -1
- package/dist/components/assistant-ui/markdown-text.js +19 -22
- package/dist/components/assistant-ui/markdown-text.js.map +1 -1
- package/dist/components/assistant-ui/thread.cjs +22 -11
- package/dist/components/assistant-ui/thread.cjs.map +1 -1
- package/dist/components/assistant-ui/thread.d.ts.map +1 -1
- package/dist/components/assistant-ui/thread.js +22 -11
- package/dist/components/assistant-ui/thread.js.map +1 -1
- package/dist/contexts/ChatkitContext.cjs.map +1 -1
- package/dist/contexts/ChatkitContext.d.ts +2 -0
- package/dist/contexts/ChatkitContext.d.ts.map +1 -1
- package/dist/contexts/ChatkitContext.js.map +1 -1
- package/dist/core/dist/index.cjs +10 -4
- package/dist/core/dist/index.cjs.map +1 -1
- package/dist/core/dist/index.js +10 -4
- package/dist/core/dist/index.js.map +1 -1
- package/dist/hooks/useClawChat/ClawProtocolAdaptor.cjs +11 -10
- package/dist/hooks/useClawChat/ClawProtocolAdaptor.cjs.map +1 -1
- package/dist/hooks/useClawChat/ClawProtocolAdaptor.d.ts.map +1 -1
- package/dist/hooks/useClawChat/ClawProtocolAdaptor.js +11 -10
- package/dist/hooks/useClawChat/ClawProtocolAdaptor.js.map +1 -1
- package/dist/hooks/useClawChat/clawCompletion.cjs +13 -7
- package/dist/hooks/useClawChat/clawCompletion.cjs.map +1 -1
- package/dist/hooks/useClawChat/clawCompletion.d.ts.map +1 -1
- package/dist/hooks/useClawChat/clawCompletion.js +13 -7
- package/dist/hooks/useClawChat/clawCompletion.js.map +1 -1
- package/dist/hooks/useClawChat/clawPlugin.cjs +24 -0
- package/dist/hooks/useClawChat/clawPlugin.cjs.map +1 -0
- package/dist/hooks/useClawChat/clawPlugin.d.ts +10 -0
- package/dist/hooks/useClawChat/clawPlugin.d.ts.map +1 -0
- package/dist/hooks/useClawChat/clawPlugin.js +22 -0
- package/dist/hooks/useClawChat/clawPlugin.js.map +1 -0
- package/dist/hooks/useClawChat/index.cjs +24 -8
- package/dist/hooks/useClawChat/index.cjs.map +1 -1
- package/dist/hooks/useClawChat/index.d.ts.map +1 -1
- package/dist/hooks/useClawChat/index.js +24 -8
- package/dist/hooks/useClawChat/index.js.map +1 -1
- package/dist/hooks/useClawChat/types.cjs +1 -1
- package/dist/hooks/useClawChat/types.cjs.map +1 -1
- package/dist/hooks/useClawChat/types.d.ts +12 -5
- package/dist/hooks/useClawChat/types.d.ts.map +1 -1
- package/dist/hooks/useClawChat/types.js +1 -1
- package/dist/hooks/useClawChat/types.js.map +1 -1
- package/dist/index.css +1 -1
- package/package.json +1 -1
- package/dist/assets/Attachment.cjs +0 -8
- package/dist/assets/Attachment.cjs.map +0 -1
- package/dist/assets/Attachment.js +0 -6
- package/dist/assets/Attachment.js.map +0 -1
- package/dist/assets/ClearIcon.cjs +0 -8
- package/dist/assets/ClearIcon.cjs.map +0 -1
- package/dist/assets/ClearIcon.js +0 -6
- package/dist/assets/ClearIcon.js.map +0 -1
- package/dist/assets/Download.cjs +0 -10
- package/dist/assets/Download.cjs.map +0 -1
- package/dist/assets/Download.js +0 -8
- package/dist/assets/Download.js.map +0 -1
- package/dist/assets/NewSession.cjs +0 -8
- package/dist/assets/NewSession.cjs.map +0 -1
- package/dist/assets/NewSession.js +0 -6
- package/dist/assets/NewSession.js.map +0 -1
- package/dist/assets/RefreshIcon.cjs +0 -8
- package/dist/assets/RefreshIcon.cjs.map +0 -1
- package/dist/assets/RefreshIcon.js +0 -6
- package/dist/assets/RefreshIcon.js.map +0 -1
- package/dist/assets/ThumbDownIcon.cjs +0 -8
- package/dist/assets/ThumbDownIcon.cjs.map +0 -1
- package/dist/assets/ThumbDownIcon.js +0 -6
- package/dist/assets/ThumbDownIcon.js.map +0 -1
- package/dist/assets/ThumbUpIcon.cjs +0 -8
- package/dist/assets/ThumbUpIcon.cjs.map +0 -1
- package/dist/assets/ThumbUpIcon.js +0 -6
- package/dist/assets/ThumbUpIcon.js.map +0 -1
|
@@ -22,23 +22,22 @@ class ClawProtocolAdaptor extends index.BaseProtocol {
|
|
|
22
22
|
parseChunk(chunk) {
|
|
23
23
|
const { message, response } = chunk;
|
|
24
24
|
const event = response;
|
|
25
|
-
console.log('event response ', event);
|
|
26
25
|
// 处理 stream-delta:delta 是文本全量,直接覆盖
|
|
27
26
|
if (types.isPushSteamDelta(event)) {
|
|
28
|
-
const deltaText = event.payload.data.
|
|
27
|
+
const deltaText = event.payload.data.delta || '';
|
|
29
28
|
// 查找最后一条 text 类型的 content
|
|
30
29
|
const existingTextIndex = lodashEs.findLastIndex(message.content, (c) => c.type === 'text');
|
|
31
30
|
let newContent;
|
|
32
31
|
if (existingTextIndex !== -1) {
|
|
33
32
|
// 替换最后一条 text
|
|
33
|
+
const currentTextContent = message.content[existingTextIndex];
|
|
34
|
+
currentTextContent.text += deltaText;
|
|
34
35
|
newContent = [...message.content];
|
|
35
|
-
newContent[existingTextIndex] = { type: 'text', text: deltaText };
|
|
36
36
|
}
|
|
37
37
|
else {
|
|
38
38
|
// 添加新的 text
|
|
39
39
|
newContent = [...message.content, { type: 'text', text: deltaText }];
|
|
40
40
|
}
|
|
41
|
-
console.log('newContent', JSON.stringify(newContent, null, 2), event.payload.data.text);
|
|
42
41
|
return {
|
|
43
42
|
...message,
|
|
44
43
|
status: index.MessageStatus.SENDING,
|
|
@@ -47,17 +46,19 @@ class ClawProtocolAdaptor extends index.BaseProtocol {
|
|
|
47
46
|
}
|
|
48
47
|
// 处理 stream-done:使用 message.content
|
|
49
48
|
if (types.isPushStreamDone(event)) {
|
|
50
|
-
const contents = event.payload?.message?.content.map(
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
49
|
+
// const contents: TextMessage[] = event.payload?.message?.content.map(
|
|
50
|
+
// (c: TextContent) => ({
|
|
51
|
+
// type: 'text',
|
|
52
|
+
// text: c.text,
|
|
53
|
+
// }),
|
|
54
|
+
// );
|
|
54
55
|
return {
|
|
55
56
|
...message,
|
|
56
|
-
content: contents,
|
|
57
|
+
// content: contents,
|
|
57
58
|
status: index.MessageStatus.SUCCESS,
|
|
58
59
|
metadata: {
|
|
59
60
|
...message.metadata,
|
|
60
|
-
stopReason: event.payload
|
|
61
|
+
stopReason: event.payload?.message?.stopReason,
|
|
61
62
|
},
|
|
62
63
|
};
|
|
63
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClawProtocolAdaptor.cjs","sources":["../../../src/hooks/useClawChat/ClawProtocolAdaptor.ts"],"sourcesContent":["import {\n BaseProtocol,\n ChatMessage,\n ProtocolOptions,\n ProtocolEnum,\n TextMessage,\n ReasoningMessage,\n Thread,\n MessageStatus,\n} from '@chat-lab/core';\nimport { findLastIndex } from 'lodash-es';\nimport { v4 as uuid } from 'uuid';\nimport {\n PushMessageImpl,\n isPushSteamDelta,\n isPushStreamDone,\n isPushStreamAborted,\n isPushStreamError,\n TextContent,\n} from './types';\n\n/**\n * Claw Protocol Adaptor\n * 用于解析 Claw/Gateway 协议\n */\nclass ClawProtocolAdaptor extends BaseProtocol<\n PushMessageImpl,\n Record<string, unknown>\n> {\n protocol = ProtocolEnum.CUSTOM;\n\n protocolName: string;\n\n constructor(options: ProtocolOptions) {\n super(options);\n this.protocolName = options.protocolName || 'Claw';\n }\n\n /**\n * 解析流式响应块\n * 将 Claw 的 PushMessage 转换为 ChatMessage\n */\n parseChunk<Response = PushMessageImpl>(chunk: {\n message: ChatMessage;\n response: Response;\n }): ChatMessage {\n const { message, response } = chunk;\n const event = response as PushMessageImpl;\n
|
|
1
|
+
{"version":3,"file":"ClawProtocolAdaptor.cjs","sources":["../../../src/hooks/useClawChat/ClawProtocolAdaptor.ts"],"sourcesContent":["import {\n BaseProtocol,\n ChatMessage,\n ProtocolOptions,\n ProtocolEnum,\n TextMessage,\n ReasoningMessage,\n Thread,\n MessageStatus,\n} from '@chat-lab/core';\nimport { findLastIndex } from 'lodash-es';\nimport { v4 as uuid } from 'uuid';\nimport {\n PushMessageImpl,\n isPushSteamDelta,\n isPushStreamDone,\n isPushStreamAborted,\n isPushStreamError,\n TextContent,\n} from './types';\n\n/**\n * Claw Protocol Adaptor\n * 用于解析 Claw/Gateway 协议\n */\nclass ClawProtocolAdaptor extends BaseProtocol<\n PushMessageImpl,\n Record<string, unknown>\n> {\n protocol = ProtocolEnum.CUSTOM;\n\n protocolName: string;\n\n constructor(options: ProtocolOptions) {\n super(options);\n this.protocolName = options.protocolName || 'Claw';\n }\n\n /**\n * 解析流式响应块\n * 将 Claw 的 PushMessage 转换为 ChatMessage\n */\n parseChunk<Response = PushMessageImpl>(chunk: {\n message: ChatMessage;\n response: Response;\n }): ChatMessage {\n const { message, response } = chunk;\n const event = response as PushMessageImpl;\n\n // 处理 stream-delta:delta 是文本全量,直接覆盖\n if (isPushSteamDelta(event)) {\n const deltaText = event.payload.data.delta || '';\n\n // 查找最后一条 text 类型的 content\n const existingTextIndex = findLastIndex(\n message.content,\n (c): c is TextMessage => c.type === 'text',\n );\n\n let newContent: ChatMessage['content'];\n if (existingTextIndex !== -1) {\n // 替换最后一条 text\n const currentTextContent = message.content[\n existingTextIndex\n ] as TextMessage;\n currentTextContent.text += deltaText;\n newContent = [...message.content];\n } else {\n // 添加新的 text\n newContent = [...message.content, { type: 'text', text: deltaText }];\n }\n\n return {\n ...message,\n status: MessageStatus.SENDING,\n content: newContent,\n };\n }\n\n // 处理 stream-done:使用 message.content\n if (isPushStreamDone(event)) {\n // const contents: TextMessage[] = event.payload?.message?.content.map(\n // (c: TextContent) => ({\n // type: 'text',\n // text: c.text,\n // }),\n // );\n\n return {\n ...message,\n // content: contents,\n status: MessageStatus.SUCCESS,\n metadata: {\n ...message.metadata,\n stopReason: event.payload?.message?.stopReason,\n },\n };\n }\n\n // 处理 stream-aborted\n if (isPushStreamAborted(event)) {\n return {\n ...message,\n content: event.payload?.message?.content.map((c) => {\n if (c.type === 'text') {\n return { type: 'text', text: c.text };\n }\n return { type: 'text', text: '' };\n }),\n status: MessageStatus.ABORTED,\n metadata: {\n ...message.metadata,\n stopReason: 'aborted',\n },\n };\n }\n\n // 处理 stream-error\n if (isPushStreamError(event)) {\n return {\n ...message,\n status: MessageStatus.ERROR,\n error: {\n message: event.payload.errorMessage,\n extra: {},\n },\n };\n }\n\n // 默认返回原消息\n return message;\n }\n\n /**\n * 生成请求体\n * 将 ChatMessage 转换为 Gateway 请求格式\n */\n generateRequestBody(request: {\n dynamicParams?: Record<string, unknown>;\n defaultParams?: Record<string, unknown>;\n userMessage: ChatMessage;\n thread: Thread;\n contextMessages: ChatMessage[];\n }): Record<string, unknown> {\n const {\n userMessage,\n thread,\n contextMessages,\n dynamicParams,\n defaultParams,\n } = request;\n\n // 转换当前用户消息\n const currentMessage = {\n role: 'user',\n content: userMessage.content.map((c) => {\n if (c.type === 'text') {\n return { type: 'text', text: (c as TextMessage).text };\n }\n return { type: 'text', text: '' };\n }) as TextContent[],\n timestamp: Date.now(),\n };\n\n return {\n // 基础参数\n sessionKey: thread.id,\n messageId: uuid(),\n\n // 消息内容\n history,\n message: currentMessage,\n\n // 扩展参数\n ...(defaultParams || {}),\n ...(dynamicParams || {}),\n };\n }\n}\n\nexport default ClawProtocolAdaptor;\n"],"names":["BaseProtocol","ProtocolEnum","isPushSteamDelta","findLastIndex","MessageStatus","isPushStreamDone","isPushStreamAborted","isPushStreamError","uuid"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClawProtocolAdaptor.d.ts","sourceRoot":"","sources":["../../../src/hooks/useClawChat/ClawProtocolAdaptor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,eAAe,EAIf,MAAM,EAEP,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,eAAe,EAMhB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,cAAM,mBAAoB,SAAQ,YAAY,CAC5C,eAAe,EACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACxB;IACC,QAAQ,WAAuB;IAE/B,YAAY,EAAE,MAAM,CAAC;gBAET,OAAO,EAAE,eAAe;IAKpC;;;OAGG;IACH,UAAU,CAAC,QAAQ,GAAG,eAAe,EAAE,KAAK,EAAE;QAC5C,OAAO,EAAE,WAAW,CAAC;QACrB,QAAQ,EAAE,QAAQ,CAAC;KACpB,GAAG,WAAW;
|
|
1
|
+
{"version":3,"file":"ClawProtocolAdaptor.d.ts","sourceRoot":"","sources":["../../../src/hooks/useClawChat/ClawProtocolAdaptor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,eAAe,EAIf,MAAM,EAEP,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,eAAe,EAMhB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,cAAM,mBAAoB,SAAQ,YAAY,CAC5C,eAAe,EACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACxB;IACC,QAAQ,WAAuB;IAE/B,YAAY,EAAE,MAAM,CAAC;gBAET,OAAO,EAAE,eAAe;IAKpC;;;OAGG;IACH,UAAU,CAAC,QAAQ,GAAG,eAAe,EAAE,KAAK,EAAE;QAC5C,OAAO,EAAE,WAAW,CAAC;QACrB,QAAQ,EAAE,QAAQ,CAAC;KACpB,GAAG,WAAW;IAwFf;;;OAGG;IACH,mBAAmB,CAAC,OAAO,EAAE;QAC3B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxC,WAAW,EAAE,WAAW,CAAC;QACzB,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,EAAE,WAAW,EAAE,CAAC;KAChC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAmC5B;AAED,eAAe,mBAAmB,CAAC"}
|
|
@@ -20,23 +20,22 @@ class ClawProtocolAdaptor extends BaseProtocols_default {
|
|
|
20
20
|
parseChunk(chunk) {
|
|
21
21
|
const { message, response } = chunk;
|
|
22
22
|
const event = response;
|
|
23
|
-
console.log('event response ', event);
|
|
24
23
|
// 处理 stream-delta:delta 是文本全量,直接覆盖
|
|
25
24
|
if (isPushSteamDelta(event)) {
|
|
26
|
-
const deltaText = event.payload.data.
|
|
25
|
+
const deltaText = event.payload.data.delta || '';
|
|
27
26
|
// 查找最后一条 text 类型的 content
|
|
28
27
|
const existingTextIndex = findLastIndex(message.content, (c) => c.type === 'text');
|
|
29
28
|
let newContent;
|
|
30
29
|
if (existingTextIndex !== -1) {
|
|
31
30
|
// 替换最后一条 text
|
|
31
|
+
const currentTextContent = message.content[existingTextIndex];
|
|
32
|
+
currentTextContent.text += deltaText;
|
|
32
33
|
newContent = [...message.content];
|
|
33
|
-
newContent[existingTextIndex] = { type: 'text', text: deltaText };
|
|
34
34
|
}
|
|
35
35
|
else {
|
|
36
36
|
// 添加新的 text
|
|
37
37
|
newContent = [...message.content, { type: 'text', text: deltaText }];
|
|
38
38
|
}
|
|
39
|
-
console.log('newContent', JSON.stringify(newContent, null, 2), event.payload.data.text);
|
|
40
39
|
return {
|
|
41
40
|
...message,
|
|
42
41
|
status: MessageStatus.SENDING,
|
|
@@ -45,17 +44,19 @@ class ClawProtocolAdaptor extends BaseProtocols_default {
|
|
|
45
44
|
}
|
|
46
45
|
// 处理 stream-done:使用 message.content
|
|
47
46
|
if (isPushStreamDone(event)) {
|
|
48
|
-
const contents = event.payload?.message?.content.map(
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
// const contents: TextMessage[] = event.payload?.message?.content.map(
|
|
48
|
+
// (c: TextContent) => ({
|
|
49
|
+
// type: 'text',
|
|
50
|
+
// text: c.text,
|
|
51
|
+
// }),
|
|
52
|
+
// );
|
|
52
53
|
return {
|
|
53
54
|
...message,
|
|
54
|
-
content: contents,
|
|
55
|
+
// content: contents,
|
|
55
56
|
status: MessageStatus.SUCCESS,
|
|
56
57
|
metadata: {
|
|
57
58
|
...message.metadata,
|
|
58
|
-
stopReason: event.payload
|
|
59
|
+
stopReason: event.payload?.message?.stopReason,
|
|
59
60
|
},
|
|
60
61
|
};
|
|
61
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClawProtocolAdaptor.js","sources":["../../../src/hooks/useClawChat/ClawProtocolAdaptor.ts"],"sourcesContent":["import {\n BaseProtocol,\n ChatMessage,\n ProtocolOptions,\n ProtocolEnum,\n TextMessage,\n ReasoningMessage,\n Thread,\n MessageStatus,\n} from '@chat-lab/core';\nimport { findLastIndex } from 'lodash-es';\nimport { v4 as uuid } from 'uuid';\nimport {\n PushMessageImpl,\n isPushSteamDelta,\n isPushStreamDone,\n isPushStreamAborted,\n isPushStreamError,\n TextContent,\n} from './types';\n\n/**\n * Claw Protocol Adaptor\n * 用于解析 Claw/Gateway 协议\n */\nclass ClawProtocolAdaptor extends BaseProtocol<\n PushMessageImpl,\n Record<string, unknown>\n> {\n protocol = ProtocolEnum.CUSTOM;\n\n protocolName: string;\n\n constructor(options: ProtocolOptions) {\n super(options);\n this.protocolName = options.protocolName || 'Claw';\n }\n\n /**\n * 解析流式响应块\n * 将 Claw 的 PushMessage 转换为 ChatMessage\n */\n parseChunk<Response = PushMessageImpl>(chunk: {\n message: ChatMessage;\n response: Response;\n }): ChatMessage {\n const { message, response } = chunk;\n const event = response as PushMessageImpl;\n
|
|
1
|
+
{"version":3,"file":"ClawProtocolAdaptor.js","sources":["../../../src/hooks/useClawChat/ClawProtocolAdaptor.ts"],"sourcesContent":["import {\n BaseProtocol,\n ChatMessage,\n ProtocolOptions,\n ProtocolEnum,\n TextMessage,\n ReasoningMessage,\n Thread,\n MessageStatus,\n} from '@chat-lab/core';\nimport { findLastIndex } from 'lodash-es';\nimport { v4 as uuid } from 'uuid';\nimport {\n PushMessageImpl,\n isPushSteamDelta,\n isPushStreamDone,\n isPushStreamAborted,\n isPushStreamError,\n TextContent,\n} from './types';\n\n/**\n * Claw Protocol Adaptor\n * 用于解析 Claw/Gateway 协议\n */\nclass ClawProtocolAdaptor extends BaseProtocol<\n PushMessageImpl,\n Record<string, unknown>\n> {\n protocol = ProtocolEnum.CUSTOM;\n\n protocolName: string;\n\n constructor(options: ProtocolOptions) {\n super(options);\n this.protocolName = options.protocolName || 'Claw';\n }\n\n /**\n * 解析流式响应块\n * 将 Claw 的 PushMessage 转换为 ChatMessage\n */\n parseChunk<Response = PushMessageImpl>(chunk: {\n message: ChatMessage;\n response: Response;\n }): ChatMessage {\n const { message, response } = chunk;\n const event = response as PushMessageImpl;\n\n // 处理 stream-delta:delta 是文本全量,直接覆盖\n if (isPushSteamDelta(event)) {\n const deltaText = event.payload.data.delta || '';\n\n // 查找最后一条 text 类型的 content\n const existingTextIndex = findLastIndex(\n message.content,\n (c): c is TextMessage => c.type === 'text',\n );\n\n let newContent: ChatMessage['content'];\n if (existingTextIndex !== -1) {\n // 替换最后一条 text\n const currentTextContent = message.content[\n existingTextIndex\n ] as TextMessage;\n currentTextContent.text += deltaText;\n newContent = [...message.content];\n } else {\n // 添加新的 text\n newContent = [...message.content, { type: 'text', text: deltaText }];\n }\n\n return {\n ...message,\n status: MessageStatus.SENDING,\n content: newContent,\n };\n }\n\n // 处理 stream-done:使用 message.content\n if (isPushStreamDone(event)) {\n // const contents: TextMessage[] = event.payload?.message?.content.map(\n // (c: TextContent) => ({\n // type: 'text',\n // text: c.text,\n // }),\n // );\n\n return {\n ...message,\n // content: contents,\n status: MessageStatus.SUCCESS,\n metadata: {\n ...message.metadata,\n stopReason: event.payload?.message?.stopReason,\n },\n };\n }\n\n // 处理 stream-aborted\n if (isPushStreamAborted(event)) {\n return {\n ...message,\n content: event.payload?.message?.content.map((c) => {\n if (c.type === 'text') {\n return { type: 'text', text: c.text };\n }\n return { type: 'text', text: '' };\n }),\n status: MessageStatus.ABORTED,\n metadata: {\n ...message.metadata,\n stopReason: 'aborted',\n },\n };\n }\n\n // 处理 stream-error\n if (isPushStreamError(event)) {\n return {\n ...message,\n status: MessageStatus.ERROR,\n error: {\n message: event.payload.errorMessage,\n extra: {},\n },\n };\n }\n\n // 默认返回原消息\n return message;\n }\n\n /**\n * 生成请求体\n * 将 ChatMessage 转换为 Gateway 请求格式\n */\n generateRequestBody(request: {\n dynamicParams?: Record<string, unknown>;\n defaultParams?: Record<string, unknown>;\n userMessage: ChatMessage;\n thread: Thread;\n contextMessages: ChatMessage[];\n }): Record<string, unknown> {\n const {\n userMessage,\n thread,\n contextMessages,\n dynamicParams,\n defaultParams,\n } = request;\n\n // 转换当前用户消息\n const currentMessage = {\n role: 'user',\n content: userMessage.content.map((c) => {\n if (c.type === 'text') {\n return { type: 'text', text: (c as TextMessage).text };\n }\n return { type: 'text', text: '' };\n }) as TextContent[],\n timestamp: Date.now(),\n };\n\n return {\n // 基础参数\n sessionKey: thread.id,\n messageId: uuid(),\n\n // 消息内容\n history,\n message: currentMessage,\n\n // 扩展参数\n ...(defaultParams || {}),\n ...(dynamicParams || {}),\n };\n }\n}\n\nexport default ClawProtocolAdaptor;\n"],"names":["BaseProtocol","uuid"],"mappings":"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"}
|
|
@@ -7,12 +7,11 @@ var types = require('./types.cjs');
|
|
|
7
7
|
*/
|
|
8
8
|
const createClawCompletion = (onAction, onAbort) => {
|
|
9
9
|
const onChunkRef = {
|
|
10
|
-
current:
|
|
11
|
-
console.log('error', chunk);
|
|
12
|
-
},
|
|
10
|
+
current: {},
|
|
13
11
|
};
|
|
14
12
|
const pushMessageImpl = (msg) => {
|
|
15
|
-
|
|
13
|
+
const runId = msg.payload.runId;
|
|
14
|
+
onChunkRef.current[runId]?.({
|
|
16
15
|
response: msg,
|
|
17
16
|
stop: () => { },
|
|
18
17
|
});
|
|
@@ -25,15 +24,20 @@ const createClawCompletion = (onAction, onAbort) => {
|
|
|
25
24
|
? params.requestOptions.meta?.shouldReceived
|
|
26
25
|
: true;
|
|
27
26
|
const { onChunk, requestOptions } = params;
|
|
27
|
+
const runId = requestOptions.meta?.runId;
|
|
28
28
|
const onChunkImpl = (chunk) => {
|
|
29
|
-
console.log('chunk impl', JSON.stringify(chunk, null, 2));
|
|
30
29
|
if (types.isPushStreamDone(chunk.response)) {
|
|
31
30
|
resolve();
|
|
31
|
+
if (onChunkRef.current[runId]) {
|
|
32
|
+
delete onChunkRef.current[runId];
|
|
33
|
+
}
|
|
32
34
|
}
|
|
33
35
|
// ChunkCallbackData<PushMessageImpl>
|
|
34
36
|
onChunk(chunk);
|
|
35
37
|
};
|
|
36
|
-
|
|
38
|
+
if (runId) {
|
|
39
|
+
onChunkRef.current[runId] = onChunkImpl;
|
|
40
|
+
}
|
|
37
41
|
const data = requestOptions.data;
|
|
38
42
|
if (shouldSendMessage) {
|
|
39
43
|
onAction({
|
|
@@ -47,8 +51,10 @@ const createClawCompletion = (onAction, onAbort) => {
|
|
|
47
51
|
});
|
|
48
52
|
if (!shouldReceivedMessage) {
|
|
49
53
|
resolve();
|
|
54
|
+
if (onChunkRef.current[runId]) {
|
|
55
|
+
delete onChunkRef.current[runId];
|
|
56
|
+
}
|
|
50
57
|
}
|
|
51
|
-
console.log('send message', data);
|
|
52
58
|
});
|
|
53
59
|
return { pushMessageImpl, clawCompletion };
|
|
54
60
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clawCompletion.cjs","sources":["../../../src/hooks/useClawChat/clawCompletion.ts"],"sourcesContent":["import { CompletionsParams } from '@chat-lab/core';\nimport { ChunkCallbackData } from '@chat-lab/core/src/types/ChatCompletion';\nimport { PushMessageImpl, isPushStreamDone } from './types';\n\n/**\n * 创建 Claw Completion\n */\nexport const createClawCompletion = (\n onAction: (action: {\n type: 'send';\n message: string;\n thinking?: 'none' | 'low' | 'medium' | 'high';\n attachments?: Array<{\n type: 'image';\n mimeType: string;\n content: string; // base64 or uri\n }>;\n }) => void,\n onAbort: () => void,\n) => {\n const onChunkRef: {\n current: (chunk: ChunkCallbackData<PushMessageImpl>) => void
|
|
1
|
+
{"version":3,"file":"clawCompletion.cjs","sources":["../../../src/hooks/useClawChat/clawCompletion.ts"],"sourcesContent":["import { CompletionsParams } from '@chat-lab/core';\nimport { ChunkCallbackData } from '@chat-lab/core/src/types/ChatCompletion';\nimport { PushMessageImpl, isPushStreamDone } from './types';\n\n/**\n * 创建 Claw Completion\n */\nexport const createClawCompletion = (\n onAction: (action: {\n type: 'send';\n message: string;\n thinking?: 'none' | 'low' | 'medium' | 'high';\n attachments?: Array<{\n type: 'image';\n mimeType: string;\n content: string; // base64 or uri\n }>;\n }) => void,\n onAbort: () => void,\n) => {\n const onChunkRef: {\n current: Record<\n string,\n (chunk: ChunkCallbackData<PushMessageImpl>) => void\n >;\n } = {\n current: {},\n };\n\n const pushMessageImpl = (msg: PushMessageImpl) => {\n const runId = msg.payload.runId as string;\n onChunkRef.current[runId]?.({\n response: msg,\n stop: () => {},\n });\n };\n const clawCompletion = async (params: CompletionsParams) => new Promise<void>((resolve, reject) => {\n const shouldSendMessage = typeof params.requestOptions.meta?.shouldSendMessage === 'boolean'\n ? params.requestOptions.meta?.shouldSendMessage\n : true;\n const shouldReceivedMessage = typeof params.requestOptions.meta?.shouldReceived === 'boolean'\n ? params.requestOptions.meta?.shouldReceived\n : true;\n const { onChunk, requestOptions } = params;\n const runId = requestOptions.meta?.runId as string;\n const onChunkImpl = (chunk: ChunkCallbackData<PushMessageImpl>) => {\n if (isPushStreamDone(chunk.response)) {\n resolve();\n if (onChunkRef.current[runId]) {\n delete onChunkRef.current[runId];\n }\n }\n // ChunkCallbackData<PushMessageImpl>\n onChunk(chunk as any);\n };\n if (runId) {\n onChunkRef.current[runId] = onChunkImpl;\n }\n\n const data = requestOptions.data as unknown as {\n message: {\n role: 'user';\n content: [\n {\n type: 'text';\n text: '1';\n },\n ];\n timestamp: 1772279195163;\n };\n };\n if (shouldSendMessage) {\n onAction({\n type: 'send',\n message: data?.message?.content?.map((c) => c.text).join('\\n'),\n thinking: 'none',\n });\n }\n params.abortController?.signal.addEventListener('abort', () => {\n onAbort();\n });\n if (!shouldReceivedMessage) {\n resolve();\n if (onChunkRef.current[runId]) {\n delete onChunkRef.current[runId];\n }\n }\n });\n\n return { pushMessageImpl, clawCompletion };\n};\n\nexport type ClawCompletion = ReturnType<typeof createClawCompletion>;\n"],"names":["isPushStreamDone"],"mappings":";;;;AAIA;;AAEG;MACU,oBAAoB,GAAG,CAClC,QASU,EACV,OAAmB,KACjB;AACF,IAAA,MAAM,UAAU,GAKZ;AACF,QAAA,OAAO,EAAE,EAAE;KACZ,CAAC;AAEF,IAAA,MAAM,eAAe,GAAG,CAAC,GAAoB,KAAI;AAC/C,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAe,CAAC;AAC1C,QAAA,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;AAC1B,YAAA,QAAQ,EAAE,GAAG;AACb,YAAA,IAAI,EAAE,MAAK,GAAG;AACf,SAAA,CAAC,CAAC;AACL,KAAC,CAAC;AACF,IAAA,MAAM,cAAc,GAAG,OAAO,MAAyB,KAAK,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;QAChG,MAAM,iBAAiB,GAAG,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB,KAAK,SAAS;AAC1F,cAAE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB;cAC7C,IAAI,CAAC;QACT,MAAM,qBAAqB,GAAG,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,KAAK,SAAS;AAC3F,cAAE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc;cAC1C,IAAI,CAAC;AACT,QAAA,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;AAC3C,QAAA,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,KAAe,CAAC;AACnD,QAAA,MAAM,WAAW,GAAG,CAAC,KAAyC,KAAI;AAChE,YAAA,IAAIA,sBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AACpC,gBAAA,OAAO,EAAE,CAAC;AACV,gBAAA,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC7B,oBAAA,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;iBAClC;aACF;;YAED,OAAO,CAAC,KAAY,CAAC,CAAC;AACxB,SAAC,CAAC;QACF,IAAI,KAAK,EAAE;AACT,YAAA,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC;SACzC;AAED,QAAA,MAAM,IAAI,GAAG,cAAc,CAAC,IAWzB,CAAC;QACJ,IAAI,iBAAiB,EAAE;AACrB,YAAA,QAAQ,CAAC;AACP,gBAAA,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9D,gBAAA,QAAQ,EAAE,MAAM;AACjB,aAAA,CAAC,CAAC;SACJ;QACD,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;AAC5D,YAAA,OAAO,EAAE,CAAC;AACZ,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,qBAAqB,EAAE;AAC1B,YAAA,OAAO,EAAE,CAAC;AACV,YAAA,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC7B,gBAAA,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;aAClC;SACF;AACH,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;AAC7C;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clawCompletion.d.ts","sourceRoot":"","sources":["../../../src/hooks/useClawChat/clawCompletion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAoB,MAAM,SAAS,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC/B,UAAU,CAAC,MAAM,EAAE;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9C,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,IAAI,EAAE,OAAO,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ,KAAK,IAAI,EACV,SAAS,MAAM,IAAI;
|
|
1
|
+
{"version":3,"file":"clawCompletion.d.ts","sourceRoot":"","sources":["../../../src/hooks/useClawChat/clawCompletion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAoB,MAAM,SAAS,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC/B,UAAU,CAAC,MAAM,EAAE;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9C,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,IAAI,EAAE,OAAO,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ,KAAK,IAAI,EACV,SAAS,MAAM,IAAI;2BAWW,eAAe;6BAOP,iBAAiB;CAsDxD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
|
|
@@ -5,12 +5,11 @@ import { isPushStreamDone } from './types.js';
|
|
|
5
5
|
*/
|
|
6
6
|
const createClawCompletion = (onAction, onAbort) => {
|
|
7
7
|
const onChunkRef = {
|
|
8
|
-
current:
|
|
9
|
-
console.log('error', chunk);
|
|
10
|
-
},
|
|
8
|
+
current: {},
|
|
11
9
|
};
|
|
12
10
|
const pushMessageImpl = (msg) => {
|
|
13
|
-
|
|
11
|
+
const runId = msg.payload.runId;
|
|
12
|
+
onChunkRef.current[runId]?.({
|
|
14
13
|
response: msg,
|
|
15
14
|
stop: () => { },
|
|
16
15
|
});
|
|
@@ -23,15 +22,20 @@ const createClawCompletion = (onAction, onAbort) => {
|
|
|
23
22
|
? params.requestOptions.meta?.shouldReceived
|
|
24
23
|
: true;
|
|
25
24
|
const { onChunk, requestOptions } = params;
|
|
25
|
+
const runId = requestOptions.meta?.runId;
|
|
26
26
|
const onChunkImpl = (chunk) => {
|
|
27
|
-
console.log('chunk impl', JSON.stringify(chunk, null, 2));
|
|
28
27
|
if (isPushStreamDone(chunk.response)) {
|
|
29
28
|
resolve();
|
|
29
|
+
if (onChunkRef.current[runId]) {
|
|
30
|
+
delete onChunkRef.current[runId];
|
|
31
|
+
}
|
|
30
32
|
}
|
|
31
33
|
// ChunkCallbackData<PushMessageImpl>
|
|
32
34
|
onChunk(chunk);
|
|
33
35
|
};
|
|
34
|
-
|
|
36
|
+
if (runId) {
|
|
37
|
+
onChunkRef.current[runId] = onChunkImpl;
|
|
38
|
+
}
|
|
35
39
|
const data = requestOptions.data;
|
|
36
40
|
if (shouldSendMessage) {
|
|
37
41
|
onAction({
|
|
@@ -45,8 +49,10 @@ const createClawCompletion = (onAction, onAbort) => {
|
|
|
45
49
|
});
|
|
46
50
|
if (!shouldReceivedMessage) {
|
|
47
51
|
resolve();
|
|
52
|
+
if (onChunkRef.current[runId]) {
|
|
53
|
+
delete onChunkRef.current[runId];
|
|
54
|
+
}
|
|
48
55
|
}
|
|
49
|
-
console.log('send message', data);
|
|
50
56
|
});
|
|
51
57
|
return { pushMessageImpl, clawCompletion };
|
|
52
58
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clawCompletion.js","sources":["../../../src/hooks/useClawChat/clawCompletion.ts"],"sourcesContent":["import { CompletionsParams } from '@chat-lab/core';\nimport { ChunkCallbackData } from '@chat-lab/core/src/types/ChatCompletion';\nimport { PushMessageImpl, isPushStreamDone } from './types';\n\n/**\n * 创建 Claw Completion\n */\nexport const createClawCompletion = (\n onAction: (action: {\n type: 'send';\n message: string;\n thinking?: 'none' | 'low' | 'medium' | 'high';\n attachments?: Array<{\n type: 'image';\n mimeType: string;\n content: string; // base64 or uri\n }>;\n }) => void,\n onAbort: () => void,\n) => {\n const onChunkRef: {\n current: (chunk: ChunkCallbackData<PushMessageImpl>) => void
|
|
1
|
+
{"version":3,"file":"clawCompletion.js","sources":["../../../src/hooks/useClawChat/clawCompletion.ts"],"sourcesContent":["import { CompletionsParams } from '@chat-lab/core';\nimport { ChunkCallbackData } from '@chat-lab/core/src/types/ChatCompletion';\nimport { PushMessageImpl, isPushStreamDone } from './types';\n\n/**\n * 创建 Claw Completion\n */\nexport const createClawCompletion = (\n onAction: (action: {\n type: 'send';\n message: string;\n thinking?: 'none' | 'low' | 'medium' | 'high';\n attachments?: Array<{\n type: 'image';\n mimeType: string;\n content: string; // base64 or uri\n }>;\n }) => void,\n onAbort: () => void,\n) => {\n const onChunkRef: {\n current: Record<\n string,\n (chunk: ChunkCallbackData<PushMessageImpl>) => void\n >;\n } = {\n current: {},\n };\n\n const pushMessageImpl = (msg: PushMessageImpl) => {\n const runId = msg.payload.runId as string;\n onChunkRef.current[runId]?.({\n response: msg,\n stop: () => {},\n });\n };\n const clawCompletion = async (params: CompletionsParams) => new Promise<void>((resolve, reject) => {\n const shouldSendMessage = typeof params.requestOptions.meta?.shouldSendMessage === 'boolean'\n ? params.requestOptions.meta?.shouldSendMessage\n : true;\n const shouldReceivedMessage = typeof params.requestOptions.meta?.shouldReceived === 'boolean'\n ? params.requestOptions.meta?.shouldReceived\n : true;\n const { onChunk, requestOptions } = params;\n const runId = requestOptions.meta?.runId as string;\n const onChunkImpl = (chunk: ChunkCallbackData<PushMessageImpl>) => {\n if (isPushStreamDone(chunk.response)) {\n resolve();\n if (onChunkRef.current[runId]) {\n delete onChunkRef.current[runId];\n }\n }\n // ChunkCallbackData<PushMessageImpl>\n onChunk(chunk as any);\n };\n if (runId) {\n onChunkRef.current[runId] = onChunkImpl;\n }\n\n const data = requestOptions.data as unknown as {\n message: {\n role: 'user';\n content: [\n {\n type: 'text';\n text: '1';\n },\n ];\n timestamp: 1772279195163;\n };\n };\n if (shouldSendMessage) {\n onAction({\n type: 'send',\n message: data?.message?.content?.map((c) => c.text).join('\\n'),\n thinking: 'none',\n });\n }\n params.abortController?.signal.addEventListener('abort', () => {\n onAbort();\n });\n if (!shouldReceivedMessage) {\n resolve();\n if (onChunkRef.current[runId]) {\n delete onChunkRef.current[runId];\n }\n }\n });\n\n return { pushMessageImpl, clawCompletion };\n};\n\nexport type ClawCompletion = ReturnType<typeof createClawCompletion>;\n"],"names":[],"mappings":";;AAIA;;AAEG;MACU,oBAAoB,GAAG,CAClC,QASU,EACV,OAAmB,KACjB;AACF,IAAA,MAAM,UAAU,GAKZ;AACF,QAAA,OAAO,EAAE,EAAE;KACZ,CAAC;AAEF,IAAA,MAAM,eAAe,GAAG,CAAC,GAAoB,KAAI;AAC/C,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAe,CAAC;AAC1C,QAAA,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;AAC1B,YAAA,QAAQ,EAAE,GAAG;AACb,YAAA,IAAI,EAAE,MAAK,GAAG;AACf,SAAA,CAAC,CAAC;AACL,KAAC,CAAC;AACF,IAAA,MAAM,cAAc,GAAG,OAAO,MAAyB,KAAK,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;QAChG,MAAM,iBAAiB,GAAG,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB,KAAK,SAAS;AAC1F,cAAE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB;cAC7C,IAAI,CAAC;QACT,MAAM,qBAAqB,GAAG,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,KAAK,SAAS;AAC3F,cAAE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc;cAC1C,IAAI,CAAC;AACT,QAAA,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;AAC3C,QAAA,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,KAAe,CAAC;AACnD,QAAA,MAAM,WAAW,GAAG,CAAC,KAAyC,KAAI;AAChE,YAAA,IAAI,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AACpC,gBAAA,OAAO,EAAE,CAAC;AACV,gBAAA,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC7B,oBAAA,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;iBAClC;aACF;;YAED,OAAO,CAAC,KAAY,CAAC,CAAC;AACxB,SAAC,CAAC;QACF,IAAI,KAAK,EAAE;AACT,YAAA,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC;SACzC;AAED,QAAA,MAAM,IAAI,GAAG,cAAc,CAAC,IAWzB,CAAC;QACJ,IAAI,iBAAiB,EAAE;AACrB,YAAA,QAAQ,CAAC;AACP,gBAAA,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9D,gBAAA,QAAQ,EAAE,MAAM;AACjB,aAAA,CAAC,CAAC;SACJ;QACD,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;AAC5D,YAAA,OAAO,EAAE,CAAC;AACZ,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,qBAAqB,EAAE;AAC1B,YAAA,OAAO,EAAE,CAAC;AACV,YAAA,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC7B,gBAAA,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;aAClC;SACF;AACH,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;AAC7C;;;;"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var index = require('../../core/dist/index.cjs');
|
|
4
|
+
|
|
5
|
+
const pluginName = 'ClawPlugin';
|
|
6
|
+
class ClawPlugin extends index.ChatkitPlugin {
|
|
7
|
+
constructor(options) {
|
|
8
|
+
super({ pluginName });
|
|
9
|
+
this.options = options;
|
|
10
|
+
}
|
|
11
|
+
apply(compiler) {
|
|
12
|
+
compiler.hooks.message.beforeSend.tap(pluginName, async (ctx) => {
|
|
13
|
+
this.options.onSend(ctx.userMessage.content[0].text);
|
|
14
|
+
return {
|
|
15
|
+
...ctx,
|
|
16
|
+
shouldSend: false,
|
|
17
|
+
shouldAddUserMessage: true,
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
exports.ClawPlugin = ClawPlugin;
|
|
24
|
+
//# sourceMappingURL=clawPlugin.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clawPlugin.cjs","sources":["../../../src/hooks/useClawChat/clawPlugin.ts"],"sourcesContent":["import {\n BaseProtocol,\n ChatkitPlugin,\n Compiler,\n AdkProtocol,\n} from '@chat-lab/core';\n\nexport type ClawPluginOptions = {\n onSend: (text: string) => void;\n};\n\nconst pluginName = 'ClawPlugin';\n\nexport class ClawPlugin extends ChatkitPlugin {\n private options: ClawPluginOptions;\n\n constructor(options: ClawPluginOptions) {\n super({ pluginName });\n this.options = options;\n }\n\n public apply(compiler: Compiler) {\n compiler.hooks.message.beforeSend.tap(pluginName, async (ctx: any) => {\n this.options.onSend(ctx.userMessage.content[0].text);\n return {\n ...ctx,\n shouldSend: false,\n shouldAddUserMessage: true,\n };\n });\n }\n}\n"],"names":["ChatkitPlugin"],"mappings":";;;;AAWA,MAAM,UAAU,GAAG,YAAY,CAAC;AAE1B,MAAO,UAAW,SAAQA,mBAAa,CAAA;AAG3C,IAAA,WAAA,CAAY,OAA0B,EAAA;AACpC,QAAA,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;AACtB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;KACxB;AAEM,IAAA,KAAK,CAAC,QAAkB,EAAA;AAC7B,QAAA,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,GAAQ,KAAI;AACnE,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACrD,OAAO;AACL,gBAAA,GAAG,GAAG;AACN,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,oBAAoB,EAAE,IAAI;aAC3B,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;AACF;;;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ChatkitPlugin, Compiler } from '@chat-lab/core';
|
|
2
|
+
export type ClawPluginOptions = {
|
|
3
|
+
onSend: (text: string) => void;
|
|
4
|
+
};
|
|
5
|
+
export declare class ClawPlugin extends ChatkitPlugin {
|
|
6
|
+
private options;
|
|
7
|
+
constructor(options: ClawPluginOptions);
|
|
8
|
+
apply(compiler: Compiler): void;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=clawPlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clawPlugin.d.ts","sourceRoot":"","sources":["../../../src/hooks/useClawChat/clawPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EACb,QAAQ,EAET,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC,CAAC;AAIF,qBAAa,UAAW,SAAQ,aAAa;IAC3C,OAAO,CAAC,OAAO,CAAoB;gBAEvB,OAAO,EAAE,iBAAiB;IAK/B,KAAK,CAAC,QAAQ,EAAE,QAAQ;CAUhC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ChatkitPlugin } from '../../core/dist/index.js';
|
|
2
|
+
|
|
3
|
+
const pluginName = 'ClawPlugin';
|
|
4
|
+
class ClawPlugin extends ChatkitPlugin {
|
|
5
|
+
constructor(options) {
|
|
6
|
+
super({ pluginName });
|
|
7
|
+
this.options = options;
|
|
8
|
+
}
|
|
9
|
+
apply(compiler) {
|
|
10
|
+
compiler.hooks.message.beforeSend.tap(pluginName, async (ctx) => {
|
|
11
|
+
this.options.onSend(ctx.userMessage.content[0].text);
|
|
12
|
+
return {
|
|
13
|
+
...ctx,
|
|
14
|
+
shouldSend: false,
|
|
15
|
+
shouldAddUserMessage: true,
|
|
16
|
+
};
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { ClawPlugin };
|
|
22
|
+
//# sourceMappingURL=clawPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clawPlugin.js","sources":["../../../src/hooks/useClawChat/clawPlugin.ts"],"sourcesContent":["import {\n BaseProtocol,\n ChatkitPlugin,\n Compiler,\n AdkProtocol,\n} from '@chat-lab/core';\n\nexport type ClawPluginOptions = {\n onSend: (text: string) => void;\n};\n\nconst pluginName = 'ClawPlugin';\n\nexport class ClawPlugin extends ChatkitPlugin {\n private options: ClawPluginOptions;\n\n constructor(options: ClawPluginOptions) {\n super({ pluginName });\n this.options = options;\n }\n\n public apply(compiler: Compiler) {\n compiler.hooks.message.beforeSend.tap(pluginName, async (ctx: any) => {\n this.options.onSend(ctx.userMessage.content[0].text);\n return {\n ...ctx,\n shouldSend: false,\n shouldAddUserMessage: true,\n };\n });\n }\n}\n"],"names":[],"mappings":";;AAWA,MAAM,UAAU,GAAG,YAAY,CAAC;AAE1B,MAAO,UAAW,SAAQ,aAAa,CAAA;AAG3C,IAAA,WAAA,CAAY,OAA0B,EAAA;AACpC,QAAA,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;AACtB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;KACxB;AAEM,IAAA,KAAK,CAAC,QAAkB,EAAA;AAC7B,QAAA,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,GAAQ,KAAI;AACnE,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACrD,OAAO;AACL,gBAAA,GAAG,GAAG;AACN,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,oBAAoB,EAAE,IAAI;aAC3B,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;AACF;;;;"}
|
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
var index = require('../../core/dist/index.cjs');
|
|
4
4
|
var React = require('react');
|
|
5
5
|
var ahooks = require('ahooks');
|
|
6
|
+
var lodashEs = require('lodash-es');
|
|
6
7
|
var types = require('./types.cjs');
|
|
7
8
|
var clawCompletion = require('./clawCompletion.cjs');
|
|
8
9
|
var ClawProtocolAdaptor = require('./ClawProtocolAdaptor.cjs');
|
|
9
10
|
var convertHistoryMessage = require('./convertHistoryMessage.cjs');
|
|
11
|
+
var clawPlugin = require('./clawPlugin.cjs');
|
|
10
12
|
|
|
11
13
|
/**
|
|
12
14
|
* useClawChat Hook
|
|
@@ -17,7 +19,8 @@ var convertHistoryMessage = require('./convertHistoryMessage.cjs');
|
|
|
17
19
|
*/
|
|
18
20
|
const useClawChat = ({ onAction, onAbort, }) => {
|
|
19
21
|
const controllerRef = React.useRef(null);
|
|
20
|
-
const currentRunIdRef = React.useRef(
|
|
22
|
+
const currentRunIdRef = React.useRef([]);
|
|
23
|
+
const clawPluginRef = React.useRef();
|
|
21
24
|
const pushMessageImplRef = React.useRef(() => { });
|
|
22
25
|
/**
|
|
23
26
|
* 推送消息到 Chat 组件
|
|
@@ -28,23 +31,26 @@ const useClawChat = ({ onAction, onAbort, }) => {
|
|
|
28
31
|
const thread = controllerRef.current?.getCurrentThread();
|
|
29
32
|
// 更新整个消息历史
|
|
30
33
|
if (types.isPushStreamStart(msg)) {
|
|
31
|
-
currentRunIdRef.current =
|
|
34
|
+
currentRunIdRef.current = lodashEs.uniq([
|
|
35
|
+
...currentRunIdRef.current,
|
|
36
|
+
msg.payload.runId,
|
|
37
|
+
]);
|
|
32
38
|
// 手动设置 sending 状态,显示小圆圈
|
|
33
39
|
if (thread) {
|
|
34
40
|
controllerRef.current?.setSending(thread.id, true);
|
|
35
41
|
}
|
|
36
|
-
|
|
42
|
+
debugger;
|
|
37
43
|
controllerRef.current?.triggerCompletion({
|
|
38
|
-
assistantMessage,
|
|
39
44
|
extraRequestOptions: {
|
|
40
|
-
meta: { shouldSendMessage: false },
|
|
45
|
+
meta: { shouldSendMessage: false, runId: msg.payload.runId },
|
|
41
46
|
},
|
|
42
47
|
});
|
|
43
48
|
}
|
|
44
49
|
if (types.isPushStreamAborted(msg)
|
|
45
50
|
|| types.isPushStreamDone(msg)
|
|
46
51
|
|| types.isPushStreamError(msg)) {
|
|
47
|
-
|
|
52
|
+
debugger;
|
|
53
|
+
currentRunIdRef.current = lodashEs.without(currentRunIdRef.current, msg.payload.runId);
|
|
48
54
|
// 手动设置 sending 状态,显示小圆圈
|
|
49
55
|
if (thread) {
|
|
50
56
|
controllerRef.current?.setSending(thread.id, false);
|
|
@@ -67,10 +73,19 @@ const useClawChat = ({ onAction, onAbort, }) => {
|
|
|
67
73
|
if (!controllerRef.current) {
|
|
68
74
|
const state = index.createThreadManagerStateWithDefault();
|
|
69
75
|
const storeManager = new index.ThreadMessageManager(state);
|
|
76
|
+
const clawPlugin$1 = new clawPlugin.ClawPlugin({
|
|
77
|
+
onSend: async (text) => {
|
|
78
|
+
await onAction({
|
|
79
|
+
message: text,
|
|
80
|
+
});
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
clawPluginRef.current = clawPlugin$1;
|
|
70
84
|
// 创建 completion 函数
|
|
71
85
|
const { clawCompletion: clawCompletion$1, pushMessageImpl } = clawCompletion.createClawCompletion(onAction, () => {
|
|
72
86
|
if (currentRunIdRef.current) {
|
|
73
|
-
|
|
87
|
+
debugger;
|
|
88
|
+
currentRunIdRef.current.forEach((runId) => onAbort(runId));
|
|
74
89
|
}
|
|
75
90
|
});
|
|
76
91
|
pushMessageImplRef.current = pushMessageImpl;
|
|
@@ -87,7 +102,7 @@ const useClawChat = ({ onAction, onAbort, }) => {
|
|
|
87
102
|
},
|
|
88
103
|
meta: {
|
|
89
104
|
shouldSendMessage: true,
|
|
90
|
-
shouldReceived:
|
|
105
|
+
shouldReceived: false,
|
|
91
106
|
},
|
|
92
107
|
// 使用自定义 completion
|
|
93
108
|
completions: clawCompletion$1,
|
|
@@ -101,6 +116,7 @@ const useClawChat = ({ onAction, onAbort, }) => {
|
|
|
101
116
|
metaData: index.createMetaData({
|
|
102
117
|
clawStatus: { status: false, reason: 'uninitialized' },
|
|
103
118
|
}),
|
|
119
|
+
plugins: [clawPlugin$1],
|
|
104
120
|
});
|
|
105
121
|
}
|
|
106
122
|
const handleClawChatStatus = ahooks.useMemoizedFn((status) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/hooks/useClawChat/index.ts"],"sourcesContent":["import {\n ChatController,\n createThreadManagerStateWithDefault,\n ThreadMessageManager,\n ProtocolEnum,\n createMetaData,\n} from '@chat-lab/core';\nimport { useRef, useState } from 'react';\nimport { useMemoizedFn } from 'ahooks';\nimport {\n UseClawChatReturn,\n OnAction,\n ClawChatStatus,\n PushMessageImpl,\n PushHistory,\n isPushStreamStart,\n isPushStreamDone,\n isPushStreamError,\n isPushStreamAborted,\n} from './types';\nimport { createClawCompletion } from './clawCompletion';\nimport ClawProtocolAdaptor from './ClawProtocolAdaptor';\nimport convertHistoryMessage from './convertHistoryMessage';\n\nexport * from './types';\nexport { default as ClawProtocolAdaptor } from './ClawProtocolAdaptor';\nexport * from './ClawProtocolAdaptor';\n\n/**\n * useClawChat Hook\n * 用于与 ClawClient 进行双向通信\n *\n * @param onAction - 处理来自 Chat 组件的用户操作\n * @returns {UseClawChatReturn} - 包含 controller、pushMessage 和 setClawChatStatus\n */\n\nexport const useClawChat = ({\n onAction,\n onAbort,\n}: {\n onAction: OnAction;\n onAbort: (runId: string) => void;\n}): UseClawChatReturn => {\n const controllerRef = useRef<ChatController | null>(null);\n const currentRunIdRef = useRef<string
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/hooks/useClawChat/index.ts"],"sourcesContent":["import {\n ChatController,\n createThreadManagerStateWithDefault,\n ThreadMessageManager,\n ProtocolEnum,\n createMetaData,\n} from '@chat-lab/core';\nimport { useRef, useState } from 'react';\nimport { useMemoizedFn } from 'ahooks';\nimport { uniq, without } from 'lodash-es';\nimport {\n UseClawChatReturn,\n OnAction,\n ClawChatStatus,\n PushMessageImpl,\n PushHistory,\n isPushStreamStart,\n isPushStreamDone,\n isPushStreamError,\n isPushStreamAborted,\n} from './types';\nimport { createClawCompletion } from './clawCompletion';\nimport ClawProtocolAdaptor from './ClawProtocolAdaptor';\nimport convertHistoryMessage from './convertHistoryMessage';\nimport { ClawPlugin } from './clawPlugin';\n\nexport * from './types';\nexport { default as ClawProtocolAdaptor } from './ClawProtocolAdaptor';\nexport * from './ClawProtocolAdaptor';\n\n/**\n * useClawChat Hook\n * 用于与 ClawClient 进行双向通信\n *\n * @param onAction - 处理来自 Chat 组件的用户操作\n * @returns {UseClawChatReturn} - 包含 controller、pushMessage 和 setClawChatStatus\n */\n\nexport const useClawChat = ({\n onAction,\n onAbort,\n}: {\n onAction: OnAction;\n onAbort: (runId: string) => void;\n}): UseClawChatReturn => {\n const controllerRef = useRef<ChatController | null>(null);\n const currentRunIdRef = useRef<string[]>([]);\n\n const clawPluginRef = useRef<ClawPlugin>();\n\n const pushMessageImplRef = useRef<(msg: PushMessageImpl) => void>(() => {});\n /**\n * 推送消息到 Chat 组件\n * 由 ClawClient 调用\n */\n const pushMessage = useMemoizedFn((msg: PushMessageImpl) => {\n // 获取当前线程\n const thread = controllerRef.current?.getCurrentThread();\n // 更新整个消息历史\n if (isPushStreamStart(msg)) {\n currentRunIdRef.current = uniq([\n ...currentRunIdRef.current,\n msg.payload.runId,\n ]);\n // 手动设置 sending 状态,显示小圆圈\n if (thread) {\n controllerRef.current?.setSending(thread.id, true);\n }\n debugger;\n controllerRef.current?.triggerCompletion({\n extraRequestOptions: {\n meta: { shouldSendMessage: false, runId: msg.payload.runId },\n },\n });\n }\n if (\n isPushStreamAborted(msg)\n || isPushStreamDone(msg)\n || isPushStreamError(msg)\n ) {\n debugger;\n currentRunIdRef.current = without(\n currentRunIdRef.current,\n msg.payload.runId,\n );\n // 手动设置 sending 状态,显示小圆圈\n if (thread) {\n controllerRef.current?.setSending(thread.id, false);\n controllerRef.current?.setLoading(thread.id, false);\n }\n }\n\n pushMessageImplRef.current(msg);\n });\n\n const pushHistory = useMemoizedFn((msg: PushHistory) => {\n // 更新整个消息历史\n // pushMessageImplRef.current(msg);\n const thread = controllerRef.current?.getCurrentThread();\n if (thread) {\n controllerRef.current?.updateThread(thread.id, {\n messages: convertHistoryMessage(msg),\n });\n }\n });\n\n // 初始化 ChatController\n if (!controllerRef.current) {\n const state = createThreadManagerStateWithDefault();\n const storeManager = new ThreadMessageManager(state);\n const clawPlugin = new ClawPlugin({\n onSend: async (text) => {\n await onAction({\n message: text,\n });\n },\n });\n clawPluginRef.current = clawPlugin;\n // 创建 completion 函数\n const { clawCompletion, pushMessageImpl } = createClawCompletion(\n onAction,\n () => {\n if (currentRunIdRef.current) {\n debugger;\n currentRunIdRef.current.forEach((runId) => onAbort(runId));\n }\n },\n );\n pushMessageImplRef.current = pushMessageImpl;\n\n // 创建 Claw Protocol Adaptor\n const clawProtocolAdaptor = new ClawProtocolAdaptor({\n protocol: ProtocolEnum.CUSTOM,\n protocolName: 'Claw',\n } as any);\n\n controllerRef.current = new ChatController({\n requestOptions: {\n api: 'default',\n headers: {\n Authorization: 'Bearer ',\n },\n meta: {\n shouldSendMessage: true,\n shouldReceived: false,\n },\n // 使用自定义 completion\n completions: clawCompletion,\n },\n protocolOptions: {\n protocol: ProtocolEnum.CUSTOM,\n protocolName: 'Claw',\n protocolAdaptor: clawProtocolAdaptor,\n } as any,\n storeManager,\n metaData: createMetaData({\n clawStatus: { status: false, reason: 'uninitialized' },\n }),\n plugins: [clawPlugin],\n });\n }\n\n const handleClawChatStatus = useMemoizedFn((status: ClawChatStatus) => {\n if (controllerRef.current) {\n controllerRef.current.metaData.clawStatus = status;\n }\n });\n\n return {\n controllerRef,\n pushMessage,\n pushHistory,\n setClawChatStatus: handleClawChatStatus,\n };\n};\n"],"names":["useRef","useMemoizedFn","isPushStreamStart","uniq","isPushStreamAborted","isPushStreamDone","isPushStreamError","without","createThreadManagerStateWithDefault","ThreadMessageManager","clawPlugin","ClawPlugin","clawCompletion","createClawCompletion","ProtocolEnum","ChatController","createMetaData"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/useClawChat/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/useClawChat/index.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,iBAAiB,EACjB,QAAQ,EAQT,MAAM,SAAS,CAAC;AAMjB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvE,cAAc,uBAAuB,CAAC;AAEtC;;;;;;GAMG;AAEH,eAAO,MAAM,WAAW,GAAI,wBAGzB;IACD,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC,KAAG,iBAkIH,CAAC"}
|