@assistant-ui/react-ai-sdk 1.3.13 → 1.3.14

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/index.d.ts CHANGED
@@ -1,7 +1,11 @@
1
1
  /// <reference types="@assistant-ui/core/store" />
2
2
  /// <reference types="@assistant-ui/core/react" />
3
- export * from "./ui/index.js";
3
+ export { useAISDKRuntime } from "./ui/use-chat/useAISDKRuntime.js";
4
+ export { useChatRuntime } from "./ui/use-chat/useChatRuntime.js";
5
+ export type { UseChatRuntimeOptions } from "./ui/use-chat/useChatRuntime.js";
6
+ export { AssistantChatTransport } from "./ui/use-chat/AssistantChatTransport.js";
4
7
  export { frontendTools } from "./frontendTools.js";
8
+ export { injectQuoteContext } from "./injectQuoteContext.js";
5
9
  export type { ThreadTokenUsage, TokenUsageExtractableMessage } from "./usage.js";
6
10
  export { getThreadMessageTokenUsage, useThreadTokenUsage } from "./usage.js";
7
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,8BAAqB;AACrB,OAAO,EAAE,aAAa,EAAE,2BAAwB;AAChD,YAAY,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,mBAAgB;AAC9E,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,mBAAgB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,yCAAsC;AAChE,OAAO,EAAE,cAAc,EAAE,wCAAqC;AAC9D,YAAY,EAAE,qBAAqB,EAAE,wCAAqC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,gDAA6C;AAC9E,OAAO,EAAE,aAAa,EAAE,2BAAwB;AAChD,OAAO,EAAE,kBAAkB,EAAE,gCAA6B;AAC1D,YAAY,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,mBAAgB;AAC9E,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,mBAAgB"}
package/dist/index.js CHANGED
@@ -1,6 +1,9 @@
1
1
  /// <reference types="@assistant-ui/core/store" />
2
2
  /// <reference types="@assistant-ui/core/react" />
3
- export * from "./ui/index.js";
3
+ export { useAISDKRuntime } from "./ui/use-chat/useAISDKRuntime.js";
4
+ export { useChatRuntime } from "./ui/use-chat/useChatRuntime.js";
5
+ export { AssistantChatTransport } from "./ui/use-chat/AssistantChatTransport.js";
4
6
  export { frontendTools } from "./frontendTools.js";
7
+ export { injectQuoteContext } from "./injectQuoteContext.js";
5
8
  export { getThreadMessageTokenUsage, useThreadTokenUsage } from "./usage.js";
6
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,kDAAkD;AAElD,8BAAqB;AACrB,OAAO,EAAE,aAAa,EAAE,2BAAwB;AAEhD,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,mBAAgB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,kDAAkD;AAElD,OAAO,EAAE,eAAe,EAAE,yCAAsC;AAChE,OAAO,EAAE,cAAc,EAAE,wCAAqC;AAE9D,OAAO,EAAE,sBAAsB,EAAE,gDAA6C;AAC9E,OAAO,EAAE,aAAa,EAAE,2BAAwB;AAChD,OAAO,EAAE,kBAAkB,EAAE,gCAA6B;AAE1D,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,mBAAgB"}
@@ -0,0 +1,24 @@
1
+ import type { UIMessage } from "ai";
2
+ /**
3
+ * Injects quote context into messages as markdown blockquotes.
4
+ *
5
+ * Use this in your route handler before `convertToModelMessages` so the LLM
6
+ * sees the quoted text that the user is referring to.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { convertToModelMessages, streamText } from "ai";
11
+ * import { injectQuoteContext } from "@assistant-ui/react-ai-sdk";
12
+ *
13
+ * export async function POST(req: Request) {
14
+ * const { messages } = await req.json();
15
+ * const result = streamText({
16
+ * model: myModel,
17
+ * messages: await convertToModelMessages(injectQuoteContext(messages)),
18
+ * });
19
+ * return result.toUIMessageStreamResponse();
20
+ * }
21
+ * ```
22
+ */
23
+ export declare function injectQuoteContext(messages: UIMessage[]): UIMessage[];
24
+ //# sourceMappingURL=injectQuoteContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectQuoteContext.d.ts","sourceRoot":"","sources":["../src/injectQuoteContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAepC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAyBrE"}
@@ -0,0 +1,58 @@
1
+ const getQuoteText = (metadata) => {
2
+ if (!metadata || typeof metadata !== "object")
3
+ return undefined;
4
+ const custom = metadata.custom;
5
+ if (!custom || typeof custom !== "object")
6
+ return undefined;
7
+ const quote = custom.quote;
8
+ if (!quote || typeof quote !== "object")
9
+ return undefined;
10
+ const text = quote.text;
11
+ return typeof text === "string" ? text : undefined;
12
+ };
13
+ /**
14
+ * Injects quote context into messages as markdown blockquotes.
15
+ *
16
+ * Use this in your route handler before `convertToModelMessages` so the LLM
17
+ * sees the quoted text that the user is referring to.
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * import { convertToModelMessages, streamText } from "ai";
22
+ * import { injectQuoteContext } from "@assistant-ui/react-ai-sdk";
23
+ *
24
+ * export async function POST(req: Request) {
25
+ * const { messages } = await req.json();
26
+ * const result = streamText({
27
+ * model: myModel,
28
+ * messages: await convertToModelMessages(injectQuoteContext(messages)),
29
+ * });
30
+ * return result.toUIMessageStreamResponse();
31
+ * }
32
+ * ```
33
+ */
34
+ export function injectQuoteContext(messages) {
35
+ return messages.map((msg) => {
36
+ if (msg.role !== "user")
37
+ return msg;
38
+ const text = getQuoteText(msg.metadata);
39
+ if (!text)
40
+ return msg;
41
+ const blockquote = text
42
+ .split(/\r?\n/)
43
+ .map((line) => `> ${line}`)
44
+ .join("\n");
45
+ const alreadyInjected = msg.parts[0]?.type === "text" &&
46
+ msg.parts[0].text === `${blockquote}\n\n`;
47
+ if (alreadyInjected)
48
+ return msg;
49
+ return {
50
+ ...msg,
51
+ parts: [
52
+ { type: "text", text: `${blockquote}\n\n` },
53
+ ...(msg.parts ?? []),
54
+ ],
55
+ };
56
+ });
57
+ }
58
+ //# sourceMappingURL=injectQuoteContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectQuoteContext.js","sourceRoot":"","sources":["../src/injectQuoteContext.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAG,CAAC,QAAiB,EAAsB,EAAE;IAC7D,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEhE,MAAM,MAAM,GAAI,QAAoC,CAAC,MAAM,CAAC;IAC5D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAE5D,MAAM,KAAK,GAAI,MAAkC,CAAC,KAAK,CAAC;IACxD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAE1D,MAAM,IAAI,GAAI,KAAiC,CAAC,IAAI,CAAC;IACrD,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAqB;IACtD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,GAAG,CAAC;QAEpC,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI;YAAE,OAAO,GAAG,CAAC;QAEtB,MAAM,UAAU,GAAG,IAAI;aACpB,KAAK,CAAC,OAAO,CAAC;aACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;aAC1B,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,eAAe,GACnB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM;YAC7B,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,UAAU,MAAM,CAAC;QAC5C,IAAI,eAAe;YAAE,OAAO,GAAG,CAAC;QAEhC,OAAO;YACL,GAAG,GAAG;YACN,KAAK,EAAE;gBACL,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,GAAG,UAAU,MAAM,EAAE;gBACpD,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;aACrB;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { useChat } from "@ai-sdk/react";
3
- import { useCloudThreadListAdapter as unstable_useCloudThreadListAdapter, useRemoteThreadListRuntime as unstable_useRemoteThreadListRuntime, } from "@assistant-ui/core/react";
3
+ import { useCloudThreadListAdapter, useRemoteThreadListRuntime, } from "@assistant-ui/core/react";
4
4
  import { useAuiState } from "@assistant-ui/store";
5
5
  import { useAISDKRuntime, } from "./useAISDKRuntime.js";
6
6
  import { AssistantChatTransport } from "./AssistantChatTransport.js";
@@ -39,8 +39,8 @@ const useChatThreadRuntime = (options) => {
39
39
  return runtime;
40
40
  };
41
41
  export const useChatRuntime = ({ cloud, ...options } = {}) => {
42
- const cloudAdapter = unstable_useCloudThreadListAdapter({ cloud });
43
- return unstable_useRemoteThreadListRuntime({
42
+ const cloudAdapter = useCloudThreadListAdapter({ cloud });
43
+ return useRemoteThreadListRuntime({
44
44
  runtimeHook: function RuntimeHook() {
45
45
  return useChatThreadRuntime(options);
46
46
  },
@@ -1 +1 @@
1
- {"version":3,"file":"useChatRuntime.js","sourceRoot":"","sources":["../../../src/ui/use-chat/useChatRuntime.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,OAAO,EAAkB,MAAM,eAAe,CAAC;AAGxD,OAAO,EACL,yBAAyB,IAAI,kCAAkC,EAC/D,0BAA0B,IAAI,mCAAmC,GAClE,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EACL,eAAe,GAGhB,6BAA0B;AAE3B,OAAO,EAAE,sBAAsB,EAAE,oCAAiC;AAClE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AASnD,MAAM,uBAAuB,GAAG,CAC9B,SAAoC,EACT,EAAE;IAC7B,MAAM,YAAY,GAAG,MAAM,CAA4B,SAAS,CAAC,CAAC;IAClE,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,OAAO,GAAG,SAAS,CAAC;IACnC,CAAC,CAAC,CAAC;IACH,MAAM,gBAAgB,GAAG,OAAO,CAC9B,GAAG,EAAE,CACH,IAAI,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE;QAC9B,GAAG,CAAC,CAAC,EAAE,IAAI;YACT,MAAM,GAAG,GACP,YAAY,CAAC,OAAO,CAAC,IAAuC,CAAC,CAAC;YAChE,OAAO,OAAO,GAAG,KAAK,UAAU;gBAC9B,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;gBAChC,CAAC,CAAC,GAAG,CAAC;QACV,CAAC;KACF,CAAC,EACJ,EAAE,CACH,CAAC;IACF,OAAO,gBAAgB,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAC3B,OAA2C,EACzB,EAAE;IACpB,MAAM,EACJ,QAAQ,EACR,SAAS,EAAE,gBAAgB,EAC3B,eAAe,EACf,GAAG,WAAW,EACf,GAAG,OAAO,IAAI,EAAE,CAAC;IAElB,MAAM,SAAS,GAAG,uBAAuB,CACvC,gBAAgB,IAAI,IAAI,sBAAsB,EAAE,CACjD,CAAC;IAEF,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC;QACnB,GAAG,WAAW;QACd,EAAE;QACF,SAAS;KACV,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE;QACpC,QAAQ;QACR,GAAG,CAAC,eAAe,IAAI,EAAE,eAAe,EAAE,CAAC;KAC5C,CAAC,CAAC;IAEH,IAAI,SAAS,YAAY,sBAAsB,EAAE,CAAC;QAChD,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAA2C,EACvE,KAAK,EACL,GAAG,OAAO,KAC2B,EAAE,EAAoB,EAAE;IAC7D,MAAM,YAAY,GAAG,kCAAkC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACnE,OAAO,mCAAmC,CAAC;QACzC,WAAW,EAAE,SAAS,WAAW;YAC/B,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,EAAE,YAAY;QACrB,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"useChatRuntime.js","sourceRoot":"","sources":["../../../src/ui/use-chat/useChatRuntime.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,OAAO,EAAkB,MAAM,eAAe,CAAC;AAGxD,OAAO,EACL,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EACL,eAAe,GAGhB,6BAA0B;AAE3B,OAAO,EAAE,sBAAsB,EAAE,oCAAiC;AAClE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AASnD,MAAM,uBAAuB,GAAG,CAC9B,SAAoC,EACT,EAAE;IAC7B,MAAM,YAAY,GAAG,MAAM,CAA4B,SAAS,CAAC,CAAC;IAClE,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,OAAO,GAAG,SAAS,CAAC;IACnC,CAAC,CAAC,CAAC;IACH,MAAM,gBAAgB,GAAG,OAAO,CAC9B,GAAG,EAAE,CACH,IAAI,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE;QAC9B,GAAG,CAAC,CAAC,EAAE,IAAI;YACT,MAAM,GAAG,GACP,YAAY,CAAC,OAAO,CAAC,IAAuC,CAAC,CAAC;YAChE,OAAO,OAAO,GAAG,KAAK,UAAU;gBAC9B,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;gBAChC,CAAC,CAAC,GAAG,CAAC;QACV,CAAC;KACF,CAAC,EACJ,EAAE,CACH,CAAC;IACF,OAAO,gBAAgB,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAC3B,OAA2C,EACzB,EAAE;IACpB,MAAM,EACJ,QAAQ,EACR,SAAS,EAAE,gBAAgB,EAC3B,eAAe,EACf,GAAG,WAAW,EACf,GAAG,OAAO,IAAI,EAAE,CAAC;IAElB,MAAM,SAAS,GAAG,uBAAuB,CACvC,gBAAgB,IAAI,IAAI,sBAAsB,EAAE,CACjD,CAAC;IAEF,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC;QACnB,GAAG,WAAW;QACd,EAAE;QACF,SAAS;KACV,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE;QACpC,QAAQ;QACR,GAAG,CAAC,eAAe,IAAI,EAAE,eAAe,EAAE,CAAC;KAC5C,CAAC,CAAC;IAEH,IAAI,SAAS,YAAY,sBAAsB,EAAE,CAAC;QAChD,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAA2C,EACvE,KAAK,EACL,GAAG,OAAO,KAC2B,EAAE,EAAoB,EAAE;IAC7D,MAAM,YAAY,GAAG,yBAAyB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,OAAO,0BAA0B,CAAC;QAChC,WAAW,EAAE,SAAS,WAAW;YAC/B,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,EAAE,YAAY;QACrB,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"convertMessage.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/convertMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/D,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,0BAA0B,CAAC;AAYlC,MAAM,MAAM,6BAA6B,GACvC,2BAA2B,CAAC,QAAQ,GAAG;IACrC,qBAAqB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;CAC5D,CAAC;AAmNJ,eAAO,MAAM,qBAAqB;;;;;;;;wHA7MO,qDACtB;uHAIjB,qDACM;;;CAiQP,CAAC"}
1
+ {"version":3,"file":"convertMessage.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/convertMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/D,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,0BAA0B,CAAC;AAYlC,MAAM,MAAM,6BAA6B,GACvC,2BAA2B,CAAC,QAAQ,GAAG;IACrC,qBAAqB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;CAC5D,CAAC;AAmNJ,eAAO,MAAM,qBAAqB;;;;;;;;wHA7MU,qDACvB;uHAInB,qDACQ;;;CAiQT,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@assistant-ui/react-ai-sdk",
3
- "version": "1.3.13",
3
+ "version": "1.3.14",
4
4
  "description": "Vercel AI SDK adapter for assistant-ui",
5
5
  "keywords": [
6
6
  "ai-sdk",
@@ -32,21 +32,18 @@
32
32
  "sideEffects": false,
33
33
  "dependencies": {
34
34
  "@ai-sdk/react": "^3.0.118",
35
- "ai": "^6.0.116"
35
+ "@assistant-ui/core": "^0.1.6",
36
+ "@assistant-ui/store": "^0.2.3",
37
+ "ai": "^6.0.116",
38
+ "assistant-cloud": "*"
36
39
  },
37
40
  "peerDependencies": {
38
- "@assistant-ui/core": "^0.1.3",
39
- "@assistant-ui/store": "^0.2.2",
40
41
  "@types/react": "*",
41
- "assistant-cloud": "*",
42
42
  "react": "^18 || ^19"
43
43
  },
44
44
  "peerDependenciesMeta": {
45
45
  "@types/react": {
46
46
  "optional": true
47
- },
48
- "assistant-cloud": {
49
- "optional": true
50
47
  }
51
48
  },
52
49
  "devDependencies": {
@@ -56,11 +53,9 @@
56
53
  "@types/react-dom": "^19.2.3",
57
54
  "jsdom": "^28.1.0",
58
55
  "react": "^19.2.4",
59
- "vitest": "^4.0.18",
60
- "@assistant-ui/core": "0.1.3",
61
- "@assistant-ui/store": "0.2.2",
62
- "@assistant-ui/x-buildutils": "0.0.2",
63
- "assistant-stream": "0.3.4"
56
+ "vitest": "^4.1.0",
57
+ "@assistant-ui/x-buildutils": "0.0.3",
58
+ "assistant-stream": "0.3.6"
64
59
  },
65
60
  "publishConfig": {
66
61
  "access": "public",
package/src/index.ts CHANGED
@@ -1,7 +1,11 @@
1
1
  /// <reference types="@assistant-ui/core/store" />
2
2
  /// <reference types="@assistant-ui/core/react" />
3
3
 
4
- export * from "./ui";
4
+ export { useAISDKRuntime } from "./ui/use-chat/useAISDKRuntime";
5
+ export { useChatRuntime } from "./ui/use-chat/useChatRuntime";
6
+ export type { UseChatRuntimeOptions } from "./ui/use-chat/useChatRuntime";
7
+ export { AssistantChatTransport } from "./ui/use-chat/AssistantChatTransport";
5
8
  export { frontendTools } from "./frontendTools";
9
+ export { injectQuoteContext } from "./injectQuoteContext";
6
10
  export type { ThreadTokenUsage, TokenUsageExtractableMessage } from "./usage";
7
11
  export { getThreadMessageTokenUsage, useThreadTokenUsage } from "./usage";
@@ -0,0 +1,62 @@
1
+ import type { UIMessage } from "ai";
2
+
3
+ const getQuoteText = (metadata: unknown): string | undefined => {
4
+ if (!metadata || typeof metadata !== "object") return undefined;
5
+
6
+ const custom = (metadata as Record<string, unknown>).custom;
7
+ if (!custom || typeof custom !== "object") return undefined;
8
+
9
+ const quote = (custom as Record<string, unknown>).quote;
10
+ if (!quote || typeof quote !== "object") return undefined;
11
+
12
+ const text = (quote as Record<string, unknown>).text;
13
+ return typeof text === "string" ? text : undefined;
14
+ };
15
+
16
+ /**
17
+ * Injects quote context into messages as markdown blockquotes.
18
+ *
19
+ * Use this in your route handler before `convertToModelMessages` so the LLM
20
+ * sees the quoted text that the user is referring to.
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * import { convertToModelMessages, streamText } from "ai";
25
+ * import { injectQuoteContext } from "@assistant-ui/react-ai-sdk";
26
+ *
27
+ * export async function POST(req: Request) {
28
+ * const { messages } = await req.json();
29
+ * const result = streamText({
30
+ * model: myModel,
31
+ * messages: await convertToModelMessages(injectQuoteContext(messages)),
32
+ * });
33
+ * return result.toUIMessageStreamResponse();
34
+ * }
35
+ * ```
36
+ */
37
+ export function injectQuoteContext(messages: UIMessage[]): UIMessage[] {
38
+ return messages.map((msg) => {
39
+ if (msg.role !== "user") return msg;
40
+
41
+ const text = getQuoteText(msg.metadata);
42
+ if (!text) return msg;
43
+
44
+ const blockquote = text
45
+ .split(/\r?\n/)
46
+ .map((line) => `> ${line}`)
47
+ .join("\n");
48
+
49
+ const alreadyInjected =
50
+ msg.parts[0]?.type === "text" &&
51
+ msg.parts[0].text === `${blockquote}\n\n`;
52
+ if (alreadyInjected) return msg;
53
+
54
+ return {
55
+ ...msg,
56
+ parts: [
57
+ { type: "text" as const, text: `${blockquote}\n\n` },
58
+ ...(msg.parts ?? []),
59
+ ],
60
+ };
61
+ });
62
+ }
@@ -4,8 +4,8 @@ import { useChat, type UIMessage } from "@ai-sdk/react";
4
4
  import type { AssistantCloud } from "assistant-cloud";
5
5
  import type { AssistantRuntime } from "@assistant-ui/core";
6
6
  import {
7
- useCloudThreadListAdapter as unstable_useCloudThreadListAdapter,
8
- useRemoteThreadListRuntime as unstable_useRemoteThreadListRuntime,
7
+ useCloudThreadListAdapter,
8
+ useRemoteThreadListRuntime,
9
9
  } from "@assistant-ui/core/react";
10
10
  import { useAuiState } from "@assistant-ui/store";
11
11
  import {
@@ -84,8 +84,8 @@ export const useChatRuntime = <UI_MESSAGE extends UIMessage = UIMessage>({
84
84
  cloud,
85
85
  ...options
86
86
  }: UseChatRuntimeOptions<UI_MESSAGE> = {}): AssistantRuntime => {
87
- const cloudAdapter = unstable_useCloudThreadListAdapter({ cloud });
88
- return unstable_useRemoteThreadListRuntime({
87
+ const cloudAdapter = useCloudThreadListAdapter({ cloud });
88
+ return useRemoteThreadListRuntime({
89
89
  runtimeHook: function RuntimeHook() {
90
90
  return useChatThreadRuntime(options);
91
91
  },
@@ -1,5 +0,0 @@
1
- export { useAISDKRuntime } from "./use-chat/useAISDKRuntime.js";
2
- export { useChatRuntime } from "./use-chat/useChatRuntime.js";
3
- export type { UseChatRuntimeOptions } from "./use-chat/useChatRuntime.js";
4
- export { AssistantChatTransport } from "./use-chat/AssistantChatTransport.js";
5
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,sCAAmC;AAC7D,OAAO,EAAE,cAAc,EAAE,qCAAkC;AAC3D,YAAY,EAAE,qBAAqB,EAAE,qCAAkC;AACvE,OAAO,EAAE,sBAAsB,EAAE,6CAA0C"}
package/dist/ui/index.js DELETED
@@ -1,4 +0,0 @@
1
- export { useAISDKRuntime } from "./use-chat/useAISDKRuntime.js";
2
- export { useChatRuntime } from "./use-chat/useChatRuntime.js";
3
- export { AssistantChatTransport } from "./use-chat/AssistantChatTransport.js";
4
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,sCAAmC;AAC7D,OAAO,EAAE,cAAc,EAAE,qCAAkC;AAE3D,OAAO,EAAE,sBAAsB,EAAE,6CAA0C"}
package/src/ui/index.ts DELETED
@@ -1,4 +0,0 @@
1
- export { useAISDKRuntime } from "./use-chat/useAISDKRuntime";
2
- export { useChatRuntime } from "./use-chat/useChatRuntime";
3
- export type { UseChatRuntimeOptions } from "./use-chat/useChatRuntime";
4
- export { AssistantChatTransport } from "./use-chat/AssistantChatTransport";