@artmate/chat
Version:
**开箱即用的AI组件库(基于 Vue3 + ElementPlus)**
148 lines (147 loc) • 3.94 kB
JavaScript
import { ref as I, computed as P } from "vue";
import { useEventCallback as T } from "../hooks/useEventCallback.js";
import W from "./useSyncState.js";
function j(d) {
return Array.isArray(d) ? d : [d];
}
function G(d) {
const {
defaultMessages: _,
agent: y,
requestFallback: f,
requestPlaceholder: m,
parser: b,
transformMessage: A,
transformStream: x,
resolveAbortController: h
} = d, q = I(0), [R, l, v] = W(
() => (_ || []).map((r, s) => ({
id: `default_${s}`,
status: "local",
...r
}))
), p = (r, s) => {
const e = {
id: `msg_${q.value}`,
message: r,
status: s
};
return q.value += 1, e;
}, D = P(() => {
const r = [];
return R.value.forEach((s) => {
const e = b ? b(s.message) : s.message, g = j(e);
g.forEach((i, M) => {
let t = s.id;
g.length > 1 && (t = `${t}_${M}`), r.push({
id: t,
message: i,
status: s.status
});
});
}), r;
}), w = (r) => r.filter((s) => s.status !== "loading" && s.status !== "error").map((s) => s.message), E = () => w(v()), S = (r) => {
const { chunk: s, chunks: e, originMessage: g } = r;
if (typeof A == "function")
return A(r);
if (s)
return s;
if (Array.isArray(e)) {
const i = (e == null ? void 0 : e.length) > 0 ? e == null ? void 0 : e[(e == null ? void 0 : e.length) - 1] : void 0;
return g || i;
}
return e;
};
return {
onRequest: T(
(r) => {
if (!y)
throw new Error(
"The agent parameter is required when using the onRequest method in an agent generated by useArtAgent."
);
let s = null, e, g = {};
if (r && typeof r == "object" && "message" in r) {
const { message: t, ...a } = r;
e = t, g = a;
} else
e = r;
l((t) => {
let a = [...t, p(e, "local")];
if (m) {
let n;
typeof m == "function" ? n = m(e, {
messages: w(a)
}) : n = m;
const o = p(n, "loading");
s = o.id, a = [...a, o];
}
return a;
});
let i = null;
const M = (t, a, n) => {
let o = v().find((c) => c.id === i);
if (o)
l((c) => c.map((u) => {
if (u.id === i) {
const $ = S({
originMessage: u.message,
chunk: a,
chunks: n,
status: t
});
return {
...u,
message: $,
status: t
};
}
return u;
}));
else {
const c = S({ chunk: a, status: t, chunks: n });
o = p(c, t), l((u) => [...u.filter((F) => F.id !== s), o]), i = o.id;
}
return o;
};
y.request(
{
message: e,
messages: E(),
...g
},
{
onUpdate: (t) => {
M("loading", t, []);
},
onSuccess: (t) => {
M("success", void 0, t);
},
onError: async (t) => {
if (f) {
let a;
typeof f == "function" ? a = await f(e, {
error: t,
messages: E()
}) : a = f, l((n) => [
...n.filter((o) => o.id !== s && o.id !== i),
p(a, "error")
]);
} else
l((a) => a.filter((n) => n.id !== s && n.id !== i));
},
onStream: (t) => {
h == null || h(t);
}
},
x
);
}
),
messages: R,
parsedMessages: D,
setMessages: l
};
}
export {
G as default
};