@antdv-next/x-sdk 0.0.1 → 0.0.3
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/LICENSE +21 -0
- package/dist/_util/resolveMaybeRef.d.ts +2 -0
- package/dist/_util/resolveMaybeRef.js +7 -0
- package/dist/_util/types.js +0 -0
- package/dist/chat-providers/AbstractChatProvider.d.ts +2 -2
- package/dist/chat-providers/AbstractChatProvider.js +42 -0
- package/dist/chat-providers/DeepSeekChatProvider.d.ts +2 -2
- package/dist/chat-providers/DeepSeekChatProvider.js +59 -0
- package/dist/chat-providers/DefaultChatProvider.d.ts +2 -2
- package/dist/chat-providers/DefaultChatProvider.js +26 -0
- package/dist/chat-providers/OpenAIChatProvider.d.ts +2 -2
- package/dist/chat-providers/OpenAIChatProvider.js +49 -0
- package/dist/chat-providers/index.js +4 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +7 -3
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/expect/index.js +1467 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/pretty-format/index.js +884 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/runner/chunk-artifact.js +1513 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/snapshot/index.js +661 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/spy/index.js +384 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/utils/chunk-pathe.M-eThtNZ.js +80 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/utils/diff.js +1304 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/utils/display.js +556 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/utils/error.js +27 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/utils/helpers.js +179 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/utils/offset.js +25 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/utils/serialize.js +75 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/utils/source-map.js +371 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/utils/timers.js +35 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/chunks/_commonjsHelpers.D26ty3Ew.js +4 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/chunks/rpc.MzXet3jl.js +50 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/chunks/test.CBQUpOM3.js +2645 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/chunks/utils.BX5Fg8C4.js +42 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/vendor/chai.js +2872 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/vendor/magic-string.js +1009 -0
- package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/vendor/tinyrainbow.js +84 -0
- package/dist/x-chat/__tests__/index.test.d.ts +1 -0
- package/dist/x-chat/__tests__/index.test.js +258 -0
- package/dist/x-chat/index.d.ts +14 -23
- package/dist/x-chat/index.js +85 -67
- package/dist/x-chat/store.d.ts +2 -0
- package/dist/{store-C1diHqNH.js → x-chat/store.js} +15 -9
- package/dist/x-conversations/__tests__/index.test.d.ts +1 -0
- package/dist/x-conversations/__tests__/index.test.js +36 -0
- package/dist/x-conversations/index.d.ts +4 -4
- package/dist/x-conversations/index.js +37 -1
- package/dist/{x-conversations-BrKWhj5r.js → x-conversations/store.js} +2 -31
- package/dist/x-request/__tests__/index.test.d.ts +1 -0
- package/dist/x-request/__tests__/index.test.js +90 -0
- package/dist/x-request/index.d.ts +36 -11
- package/dist/x-request/index.js +246 -1
- package/dist/x-request/x-fetch.js +18 -0
- package/dist/x-stream/__tests__/index.test.d.ts +1 -0
- package/dist/x-stream/__tests__/index.test.js +62 -0
- package/dist/x-stream/index.js +16 -5
- package/package.json +2 -1
- package/dist/chat-providers-5x9Va7p5.js +0 -167
- package/dist/x-request-BSFGaKND.js +0 -234
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
//#region ../../node_modules/.pnpm/@voidzero-dev+vite-plus-test@0.1.14_@types+node@24.12.0_@voidzero-dev+vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/vendor/tinyrainbow.mjs
|
|
2
|
+
var d = {
|
|
3
|
+
reset: [0, 0],
|
|
4
|
+
bold: [
|
|
5
|
+
1,
|
|
6
|
+
22,
|
|
7
|
+
"\x1B[22m\x1B[1m"
|
|
8
|
+
],
|
|
9
|
+
dim: [
|
|
10
|
+
2,
|
|
11
|
+
22,
|
|
12
|
+
"\x1B[22m\x1B[2m"
|
|
13
|
+
],
|
|
14
|
+
italic: [3, 23],
|
|
15
|
+
underline: [4, 24],
|
|
16
|
+
inverse: [7, 27],
|
|
17
|
+
hidden: [8, 28],
|
|
18
|
+
strikethrough: [9, 29],
|
|
19
|
+
black: [30, 39],
|
|
20
|
+
red: [31, 39],
|
|
21
|
+
green: [32, 39],
|
|
22
|
+
yellow: [33, 39],
|
|
23
|
+
blue: [34, 39],
|
|
24
|
+
magenta: [35, 39],
|
|
25
|
+
cyan: [36, 39],
|
|
26
|
+
white: [37, 39],
|
|
27
|
+
gray: [90, 39],
|
|
28
|
+
bgBlack: [40, 49],
|
|
29
|
+
bgRed: [41, 49],
|
|
30
|
+
bgGreen: [42, 49],
|
|
31
|
+
bgYellow: [43, 49],
|
|
32
|
+
bgBlue: [44, 49],
|
|
33
|
+
bgMagenta: [45, 49],
|
|
34
|
+
bgCyan: [46, 49],
|
|
35
|
+
bgWhite: [47, 49],
|
|
36
|
+
blackBright: [90, 39],
|
|
37
|
+
redBright: [91, 39],
|
|
38
|
+
greenBright: [92, 39],
|
|
39
|
+
yellowBright: [93, 39],
|
|
40
|
+
blueBright: [94, 39],
|
|
41
|
+
magentaBright: [95, 39],
|
|
42
|
+
cyanBright: [96, 39],
|
|
43
|
+
whiteBright: [97, 39],
|
|
44
|
+
bgBlackBright: [100, 49],
|
|
45
|
+
bgRedBright: [101, 49],
|
|
46
|
+
bgGreenBright: [102, 49],
|
|
47
|
+
bgYellowBright: [103, 49],
|
|
48
|
+
bgBlueBright: [104, 49],
|
|
49
|
+
bgMagentaBright: [105, 49],
|
|
50
|
+
bgCyanBright: [106, 49],
|
|
51
|
+
bgWhiteBright: [107, 49]
|
|
52
|
+
};
|
|
53
|
+
function g(e) {
|
|
54
|
+
return String(e);
|
|
55
|
+
}
|
|
56
|
+
g.open = "";
|
|
57
|
+
g.close = "";
|
|
58
|
+
function h() {
|
|
59
|
+
let e = typeof process != "undefined" ? process : void 0, n = (e == null ? void 0 : e.env) || {}, a = n.FORCE_TTY !== "false", i = (e == null ? void 0 : e.argv) || [];
|
|
60
|
+
return !("NO_COLOR" in n || i.includes("--no-color")) && ("FORCE_COLOR" in n || i.includes("--color") || (e == null ? void 0 : e.platform) === "win32" || a && n.TERM !== "dumb" || "CI" in n) || typeof window != "undefined" && !!window.chrome;
|
|
61
|
+
}
|
|
62
|
+
function f() {
|
|
63
|
+
let e = h(), n = (r, t, u, o) => {
|
|
64
|
+
let l = "", s = 0;
|
|
65
|
+
do
|
|
66
|
+
l += r.substring(s, o) + u, s = o + t.length, o = r.indexOf(t, s);
|
|
67
|
+
while (~o);
|
|
68
|
+
return l + r.substring(s);
|
|
69
|
+
}, a = (r, t, u = r) => {
|
|
70
|
+
let o = (l) => {
|
|
71
|
+
let s = String(l), b = s.indexOf(t, r.length);
|
|
72
|
+
return ~b ? r + n(s, t, u, b) + t : r + s + t;
|
|
73
|
+
};
|
|
74
|
+
return o.open = r, o.close = t, o;
|
|
75
|
+
}, i = { isColorSupported: e }, c = (r) => `\x1B[${r}m`;
|
|
76
|
+
for (let r in d) {
|
|
77
|
+
let t = d[r];
|
|
78
|
+
i[r] = e ? a(c(t[0]), c(t[1]), t[2]) : g;
|
|
79
|
+
}
|
|
80
|
+
return i;
|
|
81
|
+
}
|
|
82
|
+
var C = f();
|
|
83
|
+
//#endregion
|
|
84
|
+
export { f as createColors, C as default, h as isSupported };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import AbstractChatProvider from "../../chat-providers/AbstractChatProvider.js";
|
|
2
|
+
import { AbstractXRequestClass } from "../../x-request/index.js";
|
|
3
|
+
import { chatMessagesStoreHelper } from "../store.js";
|
|
4
|
+
import useXChat from "../index.js";
|
|
5
|
+
import { h as describe, m as it } from "../../node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/runner/chunk-artifact.js";
|
|
6
|
+
import { g as globalExpect, v as vi } from "../../node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/chunks/test.CBQUpOM3.js";
|
|
7
|
+
import { computed, effectScope, nextTick, reactive, readonly, ref } from "vue";
|
|
8
|
+
//#region src/x-chat/__tests__/index.test.ts
|
|
9
|
+
var MockManualRequest = class extends AbstractXRequestClass {
|
|
10
|
+
shouldFail;
|
|
11
|
+
_asyncHandler = Promise.resolve();
|
|
12
|
+
_state = reactive({
|
|
13
|
+
isTimeout: false,
|
|
14
|
+
isStreamTimeout: false,
|
|
15
|
+
isRequesting: false
|
|
16
|
+
});
|
|
17
|
+
constructor(shouldFail) {
|
|
18
|
+
super("https://mock.request", { manual: true });
|
|
19
|
+
this.shouldFail = shouldFail;
|
|
20
|
+
}
|
|
21
|
+
get asyncHandler() {
|
|
22
|
+
return this._asyncHandler;
|
|
23
|
+
}
|
|
24
|
+
get isTimeout() {
|
|
25
|
+
return this._state.isTimeout;
|
|
26
|
+
}
|
|
27
|
+
get isStreamTimeout() {
|
|
28
|
+
return this._state.isStreamTimeout;
|
|
29
|
+
}
|
|
30
|
+
get isRequesting() {
|
|
31
|
+
return this._state.isRequesting;
|
|
32
|
+
}
|
|
33
|
+
get manual() {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
get state() {
|
|
37
|
+
return readonly(this._state);
|
|
38
|
+
}
|
|
39
|
+
run(params) {
|
|
40
|
+
const callbacks = this.options.callbacks;
|
|
41
|
+
this._state.isRequesting = true;
|
|
42
|
+
this._asyncHandler = new Promise((resolve) => {
|
|
43
|
+
setTimeout(() => {
|
|
44
|
+
const headers = new Headers({ "content-type": "application/json" });
|
|
45
|
+
if (this.shouldFail.value) callbacks?.onError?.(/* @__PURE__ */ new Error("MockError"), { error: { message: "mock failed" } }, headers);
|
|
46
|
+
else {
|
|
47
|
+
const chunk = `echo:${params?.input || ""}`;
|
|
48
|
+
callbacks?.onUpdate?.(chunk, headers);
|
|
49
|
+
callbacks?.onSuccess?.([chunk], headers);
|
|
50
|
+
}
|
|
51
|
+
this._state.isRequesting = false;
|
|
52
|
+
resolve();
|
|
53
|
+
}, 0);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
abort() {
|
|
57
|
+
this._state.isRequesting = false;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
var MockProvider = class extends AbstractChatProvider {
|
|
61
|
+
transformParams(requestParams) {
|
|
62
|
+
return { input: requestParams.input || "" };
|
|
63
|
+
}
|
|
64
|
+
transformLocalMessage(requestParams) {
|
|
65
|
+
return requestParams.input || "";
|
|
66
|
+
}
|
|
67
|
+
transformMessage(info) {
|
|
68
|
+
if (info.chunk) return info.chunk;
|
|
69
|
+
if (Array.isArray(info.chunks) && info.chunks.length > 0) return info.chunks[info.chunks.length - 1];
|
|
70
|
+
return info.originMessage || "";
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
var DeferredManualRequest = class extends AbstractXRequestClass {
|
|
74
|
+
_state = reactive({
|
|
75
|
+
isTimeout: false,
|
|
76
|
+
isStreamTimeout: false,
|
|
77
|
+
isRequesting: false
|
|
78
|
+
});
|
|
79
|
+
callbacks;
|
|
80
|
+
params;
|
|
81
|
+
constructor() {
|
|
82
|
+
super("https://mock.request", { manual: true });
|
|
83
|
+
}
|
|
84
|
+
get asyncHandler() {
|
|
85
|
+
return Promise.resolve();
|
|
86
|
+
}
|
|
87
|
+
get isTimeout() {
|
|
88
|
+
return this._state.isTimeout;
|
|
89
|
+
}
|
|
90
|
+
get isStreamTimeout() {
|
|
91
|
+
return this._state.isStreamTimeout;
|
|
92
|
+
}
|
|
93
|
+
get isRequesting() {
|
|
94
|
+
return this._state.isRequesting;
|
|
95
|
+
}
|
|
96
|
+
get manual() {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
get state() {
|
|
100
|
+
return readonly(this._state);
|
|
101
|
+
}
|
|
102
|
+
run(params) {
|
|
103
|
+
this.params = params;
|
|
104
|
+
this.callbacks = this.options.callbacks;
|
|
105
|
+
this._state.isRequesting = true;
|
|
106
|
+
}
|
|
107
|
+
resolve() {
|
|
108
|
+
const headers = new Headers({ "content-type": "application/json" });
|
|
109
|
+
const chunk = `echo:${this.params?.input || ""}`;
|
|
110
|
+
this.callbacks?.onUpdate?.(chunk, headers);
|
|
111
|
+
this.callbacks?.onSuccess?.([chunk], headers);
|
|
112
|
+
this._state.isRequesting = false;
|
|
113
|
+
}
|
|
114
|
+
abort() {
|
|
115
|
+
this._state.isRequesting = false;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
describe("useXChat", () => {
|
|
119
|
+
it("uses reactive requestPlaceholder and requestFallback refs", async () => {
|
|
120
|
+
vi.useFakeTimers();
|
|
121
|
+
const shouldFail = ref(false);
|
|
122
|
+
const request = new MockManualRequest(shouldFail);
|
|
123
|
+
const provider = new MockProvider({ request });
|
|
124
|
+
const requestPlaceholder = ref("Thinking #1");
|
|
125
|
+
const requestFallback = ref("Fallback #1");
|
|
126
|
+
const scope = effectScope();
|
|
127
|
+
const chat = scope.run(() => useXChat({
|
|
128
|
+
provider,
|
|
129
|
+
requestPlaceholder,
|
|
130
|
+
requestFallback
|
|
131
|
+
}));
|
|
132
|
+
globalExpect(chat).toBeTruthy();
|
|
133
|
+
if (!chat) return;
|
|
134
|
+
chat.onRequest({ input: "hello" });
|
|
135
|
+
globalExpect(chat.messages.value.at(-1)?.status).toBe("loading");
|
|
136
|
+
globalExpect(chat.messages.value.at(-1)?.message).toBe("Thinking #1");
|
|
137
|
+
await vi.runAllTimersAsync();
|
|
138
|
+
await request.asyncHandler;
|
|
139
|
+
requestPlaceholder.value = "Thinking #2";
|
|
140
|
+
chat.onRequest({ input: "again" });
|
|
141
|
+
globalExpect(chat.messages.value.at(-1)?.status).toBe("loading");
|
|
142
|
+
globalExpect(chat.messages.value.at(-1)?.message).toBe("Thinking #2");
|
|
143
|
+
await vi.runAllTimersAsync();
|
|
144
|
+
await request.asyncHandler;
|
|
145
|
+
shouldFail.value = true;
|
|
146
|
+
chat.onRequest({ input: "error" });
|
|
147
|
+
await vi.runAllTimersAsync();
|
|
148
|
+
await request.asyncHandler;
|
|
149
|
+
globalExpect(chat.messages.value.at(-1)?.status).toBe("error");
|
|
150
|
+
globalExpect(chat.messages.value.at(-1)?.message).toBe("Fallback #1");
|
|
151
|
+
requestFallback.value = "Fallback #2";
|
|
152
|
+
chat.onRequest({ input: "error-again" });
|
|
153
|
+
await vi.runAllTimersAsync();
|
|
154
|
+
await request.asyncHandler;
|
|
155
|
+
globalExpect(chat.messages.value.at(-1)?.status).toBe("error");
|
|
156
|
+
globalExpect(chat.messages.value.at(-1)?.message).toBe("Fallback #2");
|
|
157
|
+
scope.stop();
|
|
158
|
+
vi.useRealTimers();
|
|
159
|
+
});
|
|
160
|
+
it("refreshes default messages when defaultMessages ref changes", async () => {
|
|
161
|
+
const defaultMessages = ref([{ message: "history-1" }]);
|
|
162
|
+
const scope = effectScope();
|
|
163
|
+
const chat = scope.run(() => useXChat({ defaultMessages }));
|
|
164
|
+
globalExpect(chat).toBeTruthy();
|
|
165
|
+
if (!chat) return;
|
|
166
|
+
await Promise.resolve();
|
|
167
|
+
await nextTick();
|
|
168
|
+
globalExpect(chat.messages.value.map((item) => item.message)).toEqual(["history-1"]);
|
|
169
|
+
defaultMessages.value = [{ message: "history-2" }];
|
|
170
|
+
await nextTick();
|
|
171
|
+
await Promise.resolve();
|
|
172
|
+
globalExpect(chat.messages.value.map((item) => item.message)).toEqual(["history-2"]);
|
|
173
|
+
scope.stop();
|
|
174
|
+
});
|
|
175
|
+
it("accepts computed provider refs", async () => {
|
|
176
|
+
vi.useFakeTimers();
|
|
177
|
+
const shouldFail = ref(false);
|
|
178
|
+
const provider = computed(() => new MockProvider({ request: new MockManualRequest(shouldFail) }));
|
|
179
|
+
const scope = effectScope();
|
|
180
|
+
const chat = scope.run(() => useXChat({ provider }));
|
|
181
|
+
globalExpect(chat).toBeTruthy();
|
|
182
|
+
if (!chat) return;
|
|
183
|
+
chat.onRequest({ input: "provider" });
|
|
184
|
+
await vi.runAllTimersAsync();
|
|
185
|
+
globalExpect(chat.messages.value.at(-1)?.status).toBe("success");
|
|
186
|
+
scope.stop();
|
|
187
|
+
vi.useRealTimers();
|
|
188
|
+
});
|
|
189
|
+
it("derives parsedMessages from parser output", async () => {
|
|
190
|
+
vi.useFakeTimers();
|
|
191
|
+
const scope = effectScope();
|
|
192
|
+
const chat = scope.run(() => useXChat({ parser: (message) => [message.toUpperCase(), `${message}!`] }));
|
|
193
|
+
globalExpect(chat).toBeTruthy();
|
|
194
|
+
if (!chat) return;
|
|
195
|
+
await Promise.resolve();
|
|
196
|
+
await nextTick();
|
|
197
|
+
chat.setMessages([{
|
|
198
|
+
id: "msg_1",
|
|
199
|
+
message: "hello",
|
|
200
|
+
status: "success"
|
|
201
|
+
}]);
|
|
202
|
+
await vi.advanceTimersByTimeAsync(60);
|
|
203
|
+
await nextTick();
|
|
204
|
+
globalExpect(chat.parsedMessages.value).toEqual([{
|
|
205
|
+
id: "msg_1_0",
|
|
206
|
+
message: "HELLO",
|
|
207
|
+
status: "success"
|
|
208
|
+
}, {
|
|
209
|
+
id: "msg_1_1",
|
|
210
|
+
message: "hello!",
|
|
211
|
+
status: "success"
|
|
212
|
+
}]);
|
|
213
|
+
scope.stop();
|
|
214
|
+
vi.useRealTimers();
|
|
215
|
+
});
|
|
216
|
+
it("keeps streaming updates isolated to the request conversation after switching", async () => {
|
|
217
|
+
const activeConversationKey = ref("a");
|
|
218
|
+
const requestA = new DeferredManualRequest();
|
|
219
|
+
const requestB = new DeferredManualRequest();
|
|
220
|
+
const providers = {
|
|
221
|
+
a: new MockProvider({ request: requestA }),
|
|
222
|
+
b: new MockProvider({ request: requestB })
|
|
223
|
+
};
|
|
224
|
+
const scope = effectScope();
|
|
225
|
+
const chat = scope.run(() => useXChat({
|
|
226
|
+
provider: computed(() => providers[activeConversationKey.value]),
|
|
227
|
+
conversationKey: activeConversationKey
|
|
228
|
+
}));
|
|
229
|
+
globalExpect(chat).toBeTruthy();
|
|
230
|
+
if (!chat) return;
|
|
231
|
+
await Promise.resolve();
|
|
232
|
+
await nextTick();
|
|
233
|
+
chat.onRequest({ input: "from-a" });
|
|
234
|
+
globalExpect(chat.messages.value.map((item) => item.message)).toEqual(["from-a"]);
|
|
235
|
+
activeConversationKey.value = "b";
|
|
236
|
+
await nextTick();
|
|
237
|
+
globalExpect(chat.messages.value).toEqual([]);
|
|
238
|
+
requestA.resolve();
|
|
239
|
+
await nextTick();
|
|
240
|
+
globalExpect(chat.messages.value).toEqual([]);
|
|
241
|
+
globalExpect(chatMessagesStoreHelper.getMessages("a")?.map((item) => ({
|
|
242
|
+
message: item.message,
|
|
243
|
+
status: item.status
|
|
244
|
+
}))).toEqual([{
|
|
245
|
+
message: "from-a",
|
|
246
|
+
status: "local"
|
|
247
|
+
}, {
|
|
248
|
+
message: "echo:from-a",
|
|
249
|
+
status: "success"
|
|
250
|
+
}]);
|
|
251
|
+
globalExpect(chatMessagesStoreHelper.getMessages("b")).toEqual([]);
|
|
252
|
+
activeConversationKey.value = "a";
|
|
253
|
+
await nextTick();
|
|
254
|
+
globalExpect(chat.messages.value.map((item) => item.message)).toEqual(["from-a", "echo:from-a"]);
|
|
255
|
+
scope.stop();
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
//#endregion
|
package/dist/x-chat/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MaybeRef } from 'vue';
|
|
2
2
|
import { AnyObject } from '../_util/types';
|
|
3
3
|
import { ConversationData } from '../x-conversations';
|
|
4
4
|
import { SSEOutput } from '../x-stream';
|
|
@@ -26,18 +26,19 @@ type RequestFallbackFn<Input, MessageInfoType, Message> = (requestParams: Partia
|
|
|
26
26
|
export type RequestParams<Message> = {
|
|
27
27
|
[Key: PropertyKey]: Message;
|
|
28
28
|
} & AnyObject;
|
|
29
|
-
type
|
|
29
|
+
type ParserFn<ChatMessage, BubbleMessage> = (message: ChatMessage) => BubbleMessage | BubbleMessage[];
|
|
30
|
+
type DefaultMessagesFn<ChatMessage extends SimpleType> = ((info: {
|
|
31
|
+
conversationKey?: ConversationData["key"];
|
|
32
|
+
}) => Promise<DefaultMessageInfo<ChatMessage>[]>) | ((info?: {
|
|
33
|
+
conversationKey?: ConversationData["key"];
|
|
34
|
+
}) => DefaultMessageInfo<ChatMessage>[]);
|
|
30
35
|
export interface XChatConfig<ChatMessage extends SimpleType = string, BubbleMessage extends SimpleType = ChatMessage, Input = ChatMessage, Output = ChatMessage> {
|
|
31
|
-
provider?: AbstractChatProvider<ChatMessage, Input, Output
|
|
36
|
+
provider?: MaybeRef<AbstractChatProvider<ChatMessage, Input, Output>>;
|
|
32
37
|
conversationKey?: MaybeRef<ConversationData["key"] | undefined>;
|
|
33
|
-
defaultMessages?: DefaultMessageInfo<ChatMessage>[] |
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}) => DefaultMessageInfo<ChatMessage>[]);
|
|
38
|
-
parser?: (message: ChatMessage) => BubbleMessage | BubbleMessage[];
|
|
39
|
-
requestPlaceholder?: ChatMessage | RequestPlaceholderFn<Input, ChatMessage>;
|
|
40
|
-
requestFallback?: ChatMessage | RequestFallbackFn<Input, MessageInfo<ChatMessage>, ChatMessage>;
|
|
38
|
+
defaultMessages?: MaybeRef<DefaultMessageInfo<ChatMessage>[]> | DefaultMessagesFn<ChatMessage>;
|
|
39
|
+
parser?: ParserFn<ChatMessage, BubbleMessage> | undefined;
|
|
40
|
+
requestPlaceholder?: MaybeRef<ChatMessage> | RequestPlaceholderFn<Input, ChatMessage>;
|
|
41
|
+
requestFallback?: MaybeRef<ChatMessage> | RequestFallbackFn<Input, MessageInfo<ChatMessage>, ChatMessage>;
|
|
41
42
|
}
|
|
42
43
|
export interface MessageInfo<Message extends SimpleType> {
|
|
43
44
|
id: number | string;
|
|
@@ -58,18 +59,8 @@ export default function useXChat<ChatMessage extends SimpleType = string, Parsed
|
|
|
58
59
|
readonly onRequest: (requestParams: Partial<Input>, opts?: {
|
|
59
60
|
extraInfo: AnyObject;
|
|
60
61
|
}) => void;
|
|
61
|
-
readonly isDefaultMessagesRequesting: Ref<boolean, boolean
|
|
62
|
-
readonly messages:
|
|
63
|
-
id: number | string;
|
|
64
|
-
message: import('vue').UnwrapRef<ChatMessage>;
|
|
65
|
-
status: MessageStatus;
|
|
66
|
-
extraInfo?: AnyObject | undefined;
|
|
67
|
-
}[], MessageInfo<ChatMessage>[] | {
|
|
68
|
-
id: number | string;
|
|
69
|
-
message: import('vue').UnwrapRef<ChatMessage>;
|
|
70
|
-
status: MessageStatus;
|
|
71
|
-
extraInfo?: AnyObject | undefined;
|
|
72
|
-
}[]>;
|
|
62
|
+
readonly isDefaultMessagesRequesting: Readonly<import('vue').Ref<boolean, boolean>>;
|
|
63
|
+
readonly messages: import('vue').ShallowRef<MessageInfo<ChatMessage>[], MessageInfo<ChatMessage>[]>;
|
|
73
64
|
readonly parsedMessages: import('vue').ComputedRef<MessageInfo<ParsedMessage>[]>;
|
|
74
65
|
readonly setMessages: (updater: MessageInfo<ChatMessage>[] | ((ori: MessageInfo<ChatMessage>[]) => MessageInfo<ChatMessage>[])) => boolean;
|
|
75
66
|
readonly removeMessage: (id: string | number) => boolean;
|