feat(appkit): hooks for fetching chat history/messages#389
Open
hubertzub-db wants to merge 6 commits into
Open
feat(appkit): hooks for fetching chat history/messages#389hubertzub-db wants to merge 6 commits into
hubertzub-db wants to merge 6 commits into
Conversation
Signed-off-by: Hubert Zub <hubert.zub@databricks.com>
- responses-api-transport: normalize CRLF to LF in the SSE line parser
so the "\n\n" frame-boundary split works behind proxies that re-emit
events with CRLF line endings. Adds a CRLF-stream unit test.
- use-scroll-to-bottom: switch from useRef + listener-attach-on-mount
to a state-backed ref callback. The listener-attach effect now
re-runs when the container DOM node changes, so consumers that
conditionally render the scroll container (e.g. behind a loading
gate) still get auto-stick. The public ref type changes from
RefObject<T | null> to (node: T | null) => void; JSX
`ref={containerRef}` keeps working because React accepts both
shapes, and no consumer reads `.current` (verified across the repo).
Signed-off-by: Hubert Zub <hubert.zub@databricks.com>
Signed-off-by: Hubert Zub <hubert.zub@databricks.com>
Follow-up to the parent fix that switched `useScrollToBottom` from
`useRef` to a state-backed ref callback. `ChatMessages` previously
typed `containerRef` as `RefObject<HTMLDivElement | null>`, which no
longer matches the hook's return shape — the public type signature
needs to follow.
Behavior is unchanged at runtime since the prop is only ever forwarded
to a JSX `ref={...}`, which accepts both ref shapes.
Signed-off-by: Hubert Zub <hubert.zub@databricks.com>
Signed-off-by: Hubert Zub <hubert.zub@databricks.com>
- useChat: ref the `onFinish` callback and pass a stable wrapper to `useAiChat`, matching the pattern already used for `onData`/`onStreamPart`/`headers`. Consumers can keep passing callbacks bound via `useCallback(..., [list, …])` without worrying whether the AI SDK rebinds the callback per render. - agent.route: add a TODO comment on `seedMessages` documenting that hydration drops `tool`-role messages and only emits plain `text` parts — past tool invocations and approval cards therefore do not re-render when a thread is resumed. No behavior change here; the proper fix needs a shared Message → UIMessage converter that can be reused by `<ChatApp>` as well. Signed-off-by: Hubert Zub <hubert.zub@databricks.com>
63d1c8c to
749ee4b
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds three reusable hooks for working with chat history:
useThreadList,useThread, anduseThreadMessages. They let any app built on AppKit show a list of past conversations, load a specific one, and read its messages — without each app having to re-implement the fetching, loading states, and error handling on top of the/threadsendpoints.The dev playground gets a small showcase of the hooks: a thread history sidebar next to the chat. Past conversations appear there ordered by most recent activity, clicking one resumes it in the main panel with its full message history, the list refreshes automatically the moment a turn finishes, and a "+ New" button starts a fresh chat.
chathistory.mov
Try it
Open
/agentin the dev playground. Send a message and watch the new thread appear in the left panel. Start a few more chats with "+ New", then click any of them to jump back in and keep chatting.