2.1.0 Release#85
Merged
Merged
Conversation
* Cursor-implemented solution to the open issue * Refactor to remove `setup.py` added just for checking version * Clean up Cursor-generated tests * Refactor module patching to prevent changing sys.modules for other tests * Work with Cursor to refactor version test cases * Refactor test config patching by Cursor * Remove extra `setuptools` installation from Release GHA
* Upgraded onboarding experience by adding OnboardingTour component and related configuration.Using Reactour each indivual component is highlighted. Updated package.json to include @reactour/tour for onboarding functionality. Introduced TESTING_ONBOARDING flag in App.js to control tour visibility during development this allows for quick and easy changes. * Refactor onboarding logic to utilize environment variable for TESTING_ONBOARDING flag in App.js. Enhanced OnboardingTour component by integrating dynamic feature and advisor data from AppConfigContext, improving the onboarding experience with customizable content based on backend configuration. * Add onboarding and canvas configurations to YAML files and backend models - Introduced onboarding features for both PhD and undergraduate configurations, including AI advisor advice, conversation saving, document uploads, and progress tracking. - Added canvas configurations with tour titles and descriptions for PhD and undergraduate journeys. - Updated backend models to include new onboarding and canvas configurations, ensuring they are integrated into the application settings. * Pass `REACT_APP_TESTING_ONBOARDING` envvar to frontend container * Rebase Complete * Update App.js * Refactor onboarding configuration by removing canvas settings - Removed the CanvasConfig from the onboarding configuration in both the YAML and backend model files. - Updated the OnboardingTour component to reference the onboarding configuration for tour titles and bodies instead of the removed canvas settings, streamlining the onboarding experience. --------- Co-authored-by: Daniel McKnight <daniel@neon.ai>
* Frontend made for turning on and off advisors * added system-level whitelist to config. * added persona filtering function. * added per-user advisor preferences with API endpoints. * wired persona filtering into chat-stream orchestrator. * update system-level config to not even show disabled advisors to the frontend. * added unit tests for the new advisor preferences endpoints. * added docstrings to the new endpoints in preferences.py. * Enhance advisor preferences management in SettingsModal and AppConfigContext - Added useEffect to hydrate advisor preferences on modal open. - Introduced setAllAdvisorsEnabled function for bulk enabling/disabling advisors. - Updated AppConfigContext to handle fetching and persisting advisor preferences from the backend. - Improved local state management for disabled advisors with optimistic updates. * removed unnecessary set conversion in persona_filter.py. * throw exception of empty allowed_advisors list at startup. * unset allowed_advisors list in phd_config.yaml so all personas are loaded by default. * Added warning * implemented check to handle race condition when all selected advisors become unavaliable. * persist the no advisor avilable error to db for consistent chat history. --------- Co-authored-by: Charlie Bailey <charlie@neon.ai>
* deprecated old_routes.py * fixed the race condition in ChatPage.js which resulted in null chat_session_id being passed to backend.
* added BrainForge configuration schema to LLMConfig. * added brainforge auth manager with login, refresh and health check. * added brainforge LLM client using the openai compatible endpoint. * added brainforge persona sync to register brainforge advisors. * added brainforge persona sync to merge brainforge personas with the hardcoded yaml config personas on app startup. * added periodic brainforge persona sync to check for new/stale personas at the brainforge endpoint. checking every 10 minutes. * made fixes to the periodic sync function downstream effects and cleaned up some unused code. * fixed orchestrator attempting to use brainforge llm for persona selection and added guard against stale personas causing a crash in chat stream. * added unit test for brainforge auth, client and persona sync. * removed BrainForgeConfig api_url envvar fallback and updated sync_interval name to include seconds label. * Updated brainforge prompt to be bare minimum length which produces best results so far for Neon AI assistant model. * passed structured_output json as an extra_body parameter and got improved model responses. * added a response maxLength the brainforge JSON schema to allow responses to be passed though _ensure_compact_shape without truncation. * doubled max_tokens for brainforge to prevent JSON truncation. * updated brainforge tests to factor in double max_tokens in payload. * refactor PERSONA_ID_PREFIX variable name to be more self documenting. * refactor SKIP_PERSONA_NAMES to be private. * use orchestrator LLM fo needs_clarification_improved instead of persona LLM so BrainForge is never called to handle clarification requests. * added admin script to list all avaliable advisors (including BrainForge) so config can easily be updated. * filter BrainForge advisors through whitelist before showing them on frontend.
* persist advisor responses to db in /chat-stream endpoint.
* persist reply messages to db in /reply-to-advisor
* persist expanded messages to db in /chat/{persona_id}.
* persist document upload notifications to db in /upload-document.
* deleted saveMessageToSession function and all call site from ChatPage.js to remove all frontend message persistence.
* bug fix to /chat/{persona_id} endpoint to reuse the existing chat session.
* added TODO to deprecate /chat-sessions/{session_id}/messages endpoint once we confirm changes work.
* added PersistMessage Pydantic model to validate chat messages.
* persist errors on the backend where they were previously being persisted on the frontend by saveMessageToSession.
* deprecated the /chat-sessions/{session_id}/messages endpoint.
* fix advisorName mapping on frontend for messages loaded from the db.
* revert back to creating a fresh session for the expand function (same implementation prior to this feature).
* rename PersistMessage persona_name to advisorName to match what the frontend expects.
* added model validation for advisor and clarification and small additional model for replyTo.
* added model validator to verify replyTo exists when isReply is True.
* fixed sidebar counter to refresh on all messages and added replyTo metadata to advisor replies.
* fixed sidebar counter to increment when user sends reply or expands message.
* feat(hybrid): add Hybrid provider option to ProviderDropdown (UI scaffold)
Adds a 4th "Hybrid" option to the provider dropdown with a purple
"Mixed" badge and dark-mode fix, plus a Settings2 configure button
on the selected hybrid row. Passes new `defaultBackend` and
`backendLocked` (BrainForge) fields from `/api/config` personas
through AppConfigContext for the upcoming mapping UI.
Backend needs:
- `default_backend` + `brainforge` flags on persona config
- accept "hybrid" on POST /switch-provider
- GET/POST /hybrid-config for { orchestrator, personas{} } map
- per-persona inference routing; BrainForge hard-pinned
* added per-user llm backend selection with uniform (all same provider) and hybird (different llm per persona/orchestrator) modes.
* Enhance ChatPage with hybrid LLM configuration support
- Added HybridConfigModal for configuring hybrid LLM settings.
- Refactored state management to support both uniform and hybrid modes.
-Each adviosr can now have its own model
* added filter for avaliable backends with health status check set to ping every 300 seconds.
* added unit tests for the available backends filter and health check.
* Pending changes to build backend the menus will be moved to the welcome screens and settigns pages once merges are completed.
* fixed bootstrap.py import causing test_available_backends failure.
* added conftest.py to simplify mock module imports and unit tests for LLM provider config.
* restored needs_clarification_improved function lost during rebase.
* Enhance SettingsModal with user profile and account management features
- Added functionality for updating user profile information (first name, last name).
- Implemented password change and account deletion processes with confirmation.
- Improved modal behavior to prevent accidental closure during text selection.
- Updated ChatPage to integrate new SettingsModal features, including user update and sign-out callbacks.
* fix stubbing issue in conftest.py from rebase.
* fix backend config values to lock brainforge models on frontend and prevent their underlying models from being changed.
* added admin-level enabled toggle to each provider and set default backend dynamically.
* replaced frontend hardcoded gemini fallback with dynamic defaults.
* fallback to default_backend when hybrid mode has no overrides.
* add test case for gemini missing.
* added configurable default_backend parameter to config.yaml.
* Fixed the black on black text and added the default option
---------
Co-authored-by: Neon:ryan <ryan@neon.ai>
* Enhance chat functionality with response mode toggle
- Added a response mode toggle in EnhancedChatInput to switch between 'panel' and 'aggregated' response modes.
- Updated ChatPage to manage response mode state and handle message synthesis in aggregated mode.
- Enhanced advisor avatar handling in MessageBubble for improved visual representation.
- Updated AppConfigContext to include a synthetic persona for aggregated responses.
This update improves user experience by allowing for a more cohesive response from advisors.
* Implement response mode persistence and on-demand synthesis in ChatPage
- Enhanced ChatPage to persist user-selected response mode ('panel' or 'aggregated') across sessions using localStorage.
- Introduced functionality for on-demand synthesis of advisor responses, allowing users to toggle between individual and aggregated views for specific exchanges.
- Added error handling for streaming chat responses and improved state management for group views and synthesizing groups.
This update enhances user experience by providing a more flexible and cohesive chat interaction.
* added aggreagted response mode schema and an orchestrator synthesis method for aggregated responses.
* wired aggregated response mode into /chat-stream endpoints.
* wired frontend to backend aggregated response mode.
* bug fixes to aggregate response quality, panel toggle, and brief panel message flash.
* fix tests to match bug fixes.
* added /synthesize endpoint for on-demand aggregated responses if panel mode is selected first from the main chat UI.
* hid reply/expand on aggregated responses and cleaned up persona name to better match rest of UI.
* rename SynthesizeRequest to RequestAggregatedResponse.
* rename aggregated persona display name from Generalized to Orchestrator.
* refactor text input response mode toggle to match toggle above replies and change Generalized to Aggregated.
* fix on demand aggregation request from appending to end of chat history.
* fix to prevent a React key collision when legacy and new exchanges share a chat session.
* fix to hide the Panel/Aggregated toggle on legacy exchanges that don't have a responseGroupId.
---------
Co-authored-by: Charlie Bailey <charlie@neon.ai>
…which was throwing 400 error when not filtered out of registry. (#84)
Comment on lines
+23
to
35
| async def persist_message(session_id: str, message: PersistMessage): | ||
| """Write a single message to a MongoDB chat session.""" | ||
| db = get_database() | ||
| msg = message.copy() | ||
| msg = message.model_dump(exclude_none=True) | ||
| if "timestamp" not in msg: | ||
| msg["timestamp"] = datetime.utcnow().isoformat() | ||
| await db.chat_sessions.update_one( | ||
| {"_id": ObjectId(session_id)}, | ||
| { | ||
| "$push": {"messages": msg}, | ||
| "$set": {"updated_at": datetime.utcnow()} | ||
| } | ||
| ) |
Collaborator
There was a problem hiding this comment.
Not a show stopper, but Codex review identified that we should be cross-referencing user_id here in addition to session_id to validate message ownership.
Member
Author
There was a problem hiding this comment.
Seems like session_id should be a unique ID already, but an additional check might catch a misbehaving client application
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.
Changelog
2.0.1a11 (2026-06-09)
Full Changelog
Fixed bugs:
Merged pull requests:
2.0.1a10 (2026-06-09)
Full Changelog
Fixed bugs:
Merged pull requests:
2.0.1a9 (2026-06-09)
Full Changelog
Implemented enhancements:
Merged pull requests:
2.0.1a8 (2026-06-05)
Full Changelog
Implemented enhancements:
Merged pull requests:
2.0.1a7 (2026-05-30)
Full Changelog
Implemented enhancements:
Merged pull requests:
2.0.1a6 (2026-05-29)
Full Changelog
Implemented enhancements:
Merged pull requests:
2.0.1a5 (2026-05-29)
Full Changelog
Implemented enhancements:
Merged pull requests:
2.0.1a4 (2026-05-28)
Full Changelog
Implemented enhancements:
Merged pull requests:
2.0.1a3 (2026-05-21)
Full Changelog
Merged pull requests:
2.0.1a2 (2026-05-19)
Full Changelog
Implemented enhancements:
Fixed bugs:
Closed issues:
Merged pull requests:
* This Changelog was automatically generated by github_changelog_generator