From d814bff2dad795ac412894bfa5b0d65c68b698be Mon Sep 17 00:00:00 2001 From: Paul Lizer Date: Wed, 8 Apr 2026 16:16:59 -0400 Subject: [PATCH 1/5] fixed github pages --- application/single_app/config.py | 2 +- docs/_layouts/libdoc/page.html | 5 +++++ .../fixes/v0.241.001/NEW_FOUNDRY_UI_VISIBILITY_FIX.md | 2 +- .../v0.241.001/SINGLE_APP_TEMPLATE_JSON_BOOTSTRAP_FIX.md | 4 ++-- docs/explanation/running_simplechat_azure_production.md | 2 +- docs/explanation/running_simplechat_locally.md | 2 +- 6 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 docs/_layouts/libdoc/page.html diff --git a/application/single_app/config.py b/application/single_app/config.py index 87fb07e7..624ae367 100644 --- a/application/single_app/config.py +++ b/application/single_app/config.py @@ -94,7 +94,7 @@ EXECUTOR_TYPE = 'thread' EXECUTOR_MAX_WORKERS = 30 SESSION_TYPE = 'filesystem' -VERSION = "0.241.001" +VERSION = "0.241.002" SECRET_KEY = os.getenv('SECRET_KEY', 'dev-secret-key-change-in-production') diff --git a/docs/_layouts/libdoc/page.html b/docs/_layouts/libdoc/page.html new file mode 100644 index 00000000..83935c1a --- /dev/null +++ b/docs/_layouts/libdoc/page.html @@ -0,0 +1,5 @@ +--- +layout: page +--- + +{{ content }} \ No newline at end of file diff --git a/docs/explanation/fixes/v0.241.001/NEW_FOUNDRY_UI_VISIBILITY_FIX.md b/docs/explanation/fixes/v0.241.001/NEW_FOUNDRY_UI_VISIBILITY_FIX.md index 2056127f..ec11c7a3 100644 --- a/docs/explanation/fixes/v0.241.001/NEW_FOUNDRY_UI_VISIBILITY_FIX.md +++ b/docs/explanation/fixes/v0.241.001/NEW_FOUNDRY_UI_VISIBILITY_FIX.md @@ -10,7 +10,7 @@ New Foundry had already been wired into backend fetch and streaming paths, but t ## Root Cause -- The New Foundry agent type radio in `_agent_modal.html` was wrapped in a disabled `{% if false %}` block. +- The New Foundry agent type radio in `_agent_modal.html` was wrapped in a disabled {% raw %}{% if false %}{% endraw %} block. - `_multiendpoint_modal.html` only exposed `aoai` and classic Foundry in the provider selector. - `is_frontend_visible_model_endpoint_provider()` in `functions_settings.py` still treated `new_foundry` as unsupported for frontend use. diff --git a/docs/explanation/fixes/v0.241.001/SINGLE_APP_TEMPLATE_JSON_BOOTSTRAP_FIX.md b/docs/explanation/fixes/v0.241.001/SINGLE_APP_TEMPLATE_JSON_BOOTSTRAP_FIX.md index 02baafc4..c72f8338 100644 --- a/docs/explanation/fixes/v0.241.001/SINGLE_APP_TEMPLATE_JSON_BOOTSTRAP_FIX.md +++ b/docs/explanation/fixes/v0.241.001/SINGLE_APP_TEMPLATE_JSON_BOOTSTRAP_FIX.md @@ -4,7 +4,7 @@ Fixed/Implemented in version: **0.240.020** ## Issue Description -Several `single_app` templates were still bootstrapping server-side JSON with patterns such as `JSON.parse('{{ value|tojson }}')`. That left workspace and admin pages vulnerable to the same control-character and quoting failures already fixed in the chat template. +Several `single_app` templates were still bootstrapping server-side JSON with patterns such as `JSON.parse('{% raw %}{{ value|tojson }}{% endraw %}')`. That left workspace and admin pages vulnerable to the same control-character and quoting failures already fixed in the chat template. ## Root Cause Analysis @@ -47,4 +47,4 @@ Several `single_app` templates were still bootstrapping server-side JSON with pa - The affected templates now emit direct JavaScript literals from Jinja `tojson` output. - Escaped values remain encoded within the serialized payload instead of being reinterpreted by an intermediate JavaScript string literal. -- The added regression tests help prevent `JSON.parse('{{ ...|tojson ... }}')` from being reintroduced in these templates. \ No newline at end of file +- The added regression tests help prevent `JSON.parse('{% raw %}{{ ...|tojson ... }}{% endraw %}')` from being reintroduced in these templates. \ No newline at end of file diff --git a/docs/explanation/running_simplechat_azure_production.md b/docs/explanation/running_simplechat_azure_production.md index 7e6e3841..b3042591 100644 --- a/docs/explanation/running_simplechat_azure_production.md +++ b/docs/explanation/running_simplechat_azure_production.md @@ -8,7 +8,7 @@ category: Explanation This guide explains the supported production startup patterns for Simple Chat in Azure. -Current documentation version: 0.239.139 +Current documentation version: 0.241.002 ## Default Azure Production Model in This Repo diff --git a/docs/explanation/running_simplechat_locally.md b/docs/explanation/running_simplechat_locally.md index 163c728f..cc0d2537 100644 --- a/docs/explanation/running_simplechat_locally.md +++ b/docs/explanation/running_simplechat_locally.md @@ -8,7 +8,7 @@ category: Explanation This guide explains the recommended local developer workflow for Simple Chat. -Current documentation version: 0.240.002 +Current documentation version: 0.241.002 ## VS Code Python 3.12 Setup From 0165727e6657314630a37eacade18335cc86a914 Mon Sep 17 00:00:00 2001 From: Paul Lizer Date: Wed, 8 Apr 2026 16:23:28 -0400 Subject: [PATCH 2/5] Update config.py --- application/single_app/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/single_app/config.py b/application/single_app/config.py index 624ae367..87fb07e7 100644 --- a/application/single_app/config.py +++ b/application/single_app/config.py @@ -94,7 +94,7 @@ EXECUTOR_TYPE = 'thread' EXECUTOR_MAX_WORKERS = 30 SESSION_TYPE = 'filesystem' -VERSION = "0.241.002" +VERSION = "0.241.001" SECRET_KEY = os.getenv('SECRET_KEY', 'dev-secret-key-change-in-production') From 334d5290550ef55161b67a191a7babb5392ccf1d Mon Sep 17 00:00:00 2001 From: Paul Lizer Date: Wed, 8 Apr 2026 17:04:06 -0400 Subject: [PATCH 3/5] retry and edit message fix --- application/single_app/config.py | 2 +- application/single_app/route_backend_chats.py | 134 +- .../single_app/route_backend_settings.py | 3 +- application/single_app/support_menu_config.py | 38 +- application/single_app/templates/profile.html | 1101 ++--------------- .../templates/support_send_feedback.html | 2 +- .../SUPPORT_APPLICATION_TITLE_COPY_FIX.md | 51 + ...EAM_RETRY_MULTI_ENDPOINT_RESOLUTION_FIX.md | 53 + .../PROFILE_FACT_MEMORY_SCRIPT_DEDUP_FIX.md | 48 + .../CHAT_RETRY_THOUGHT_TRACKER_INIT_FIX.md | 47 + ...est_chat_retry_thought_tracker_init_fix.py | 111 ++ ...ream_retry_multiendpoint_resolution_fix.py | 123 ++ .../test_profile_fact_memory_script_dedup.py | 67 + .../test_support_app_title_personalization.py | 115 ++ .../test_support_menu_user_feature.py | 3 +- ui_tests/test_profile_fact_memory_editor.py | 33 +- ...est_support_latest_features_image_modal.py | 6 + ...t_support_send_feedback_field_selection.py | 9 +- 18 files changed, 874 insertions(+), 1072 deletions(-) create mode 100644 docs/explanation/fixes/v0.241.002/SUPPORT_APPLICATION_TITLE_COPY_FIX.md create mode 100644 docs/explanation/fixes/v0.241.003/CHAT_STREAM_RETRY_MULTI_ENDPOINT_RESOLUTION_FIX.md create mode 100644 docs/explanation/fixes/v0.241.003/PROFILE_FACT_MEMORY_SCRIPT_DEDUP_FIX.md create mode 100644 docs/explanation/fixes/v0.241.004/CHAT_RETRY_THOUGHT_TRACKER_INIT_FIX.md create mode 100644 functional_tests/test_chat_retry_thought_tracker_init_fix.py create mode 100644 functional_tests/test_chat_stream_retry_multiendpoint_resolution_fix.py create mode 100644 functional_tests/test_profile_fact_memory_script_dedup.py create mode 100644 functional_tests/test_support_app_title_personalization.py diff --git a/application/single_app/config.py b/application/single_app/config.py index 87fb07e7..0f46400c 100644 --- a/application/single_app/config.py +++ b/application/single_app/config.py @@ -94,7 +94,7 @@ EXECUTOR_TYPE = 'thread' EXECUTOR_MAX_WORKERS = 30 SESSION_TYPE = 'filesystem' -VERSION = "0.241.001" +VERSION = "0.241.004" SECRET_KEY = os.getenv('SECRET_KEY', 'dev-secret-key-change-in-production') diff --git a/application/single_app/route_backend_chats.py b/application/single_app/route_backend_chats.py index cac4ee8d..c6e99a62 100644 --- a/application/single_app/route_backend_chats.py +++ b/application/single_app/route_backend_chats.py @@ -578,6 +578,33 @@ def _load_user_message_response_context( return response_context +def _initialize_assistant_response_tracking( + conversation_id, + user_message_id, + current_user_thread_id, + previous_thread_id, + retry_thread_attempt, + is_retry, + user_id, +): + """Create assistant response tracking state for both new and retry/edit flows.""" + assistant_message_id = f"{conversation_id}_assistant_{int(time.time())}_{random.randint(1000,9999)}" + thought_tracker = ThoughtTracker( + conversation_id=conversation_id, + message_id=assistant_message_id, + thread_id=current_user_thread_id, + user_id=user_id, + ) + assistant_thread_attempt = retry_thread_attempt if is_retry and retry_thread_attempt is not None else 1 + response_message_context = _load_user_message_response_context( + conversation_id=conversation_id, + user_message_id=user_message_id, + fallback_thread_id=current_user_thread_id, + fallback_previous_thread_id=previous_thread_id, + ) + return assistant_message_id, thought_tracker, assistant_thread_attempt, response_message_context + + def _build_safety_message_doc( conversation_id, message_id, @@ -5383,6 +5410,29 @@ def resolve_foundry_scope_for_auth(auth_settings, endpoint=None): return 'https://ai.azure.com/.default' +def get_foundry_api_version_candidates(primary_version, settings): + """Return distinct Foundry API versions to try for inference compatibility.""" + settings = settings or {} + candidates = [ + str(primary_version or '').strip(), + str(settings.get('azure_openai_gpt_api_version') or '').strip(), + '2024-10-01-preview', + '2024-07-01-preview', + '2024-05-01-preview', + '2024-02-01', + ] + + unique_candidates = [] + seen_candidates = set() + for candidate in candidates: + if not candidate or candidate in seen_candidates: + continue + seen_candidates.add(candidate) + unique_candidates.append(candidate) + + return unique_candidates + + def build_streaming_multi_endpoint_client(auth_settings, provider, endpoint, api_version): """Create an inference client for a resolved streaming model endpoint.""" auth_settings = auth_settings or {} @@ -5990,21 +6040,16 @@ def result_requires_message_reload(result: Any) -> bool: ) try: multi_endpoint_config = None - if should_use_default_model: - try: - multi_endpoint_config = resolve_default_model_gpt_config(settings) - if multi_endpoint_config: - debug_print("[GPTClient] Using default multi-endpoint model for agent request.") - except Exception as default_exc: - log_event( - f"[GPTClient] Default model selection unavailable: {default_exc}", - level=logging.WARNING, - exceptionTraceback=True - ) - if multi_endpoint_config is None and request_agent_info: - debug_print("[GPTClient] Skipping multi-endpoint resolution because agent_info is provided.") - elif multi_endpoint_config is None: - multi_endpoint_config = resolve_multi_endpoint_gpt_config(settings, data, enable_gpt_apim) + if settings.get('enable_multi_model_endpoints', False): + multi_endpoint_config = resolve_streaming_multi_endpoint_gpt_config( + settings, + data, + user_id, + active_group_ids=active_group_ids, + allow_default_selection=should_use_default_model, + ) + if multi_endpoint_config and should_use_default_model and not data.get('model_endpoint_id'): + debug_print("[GPTClient] Using default multi-endpoint model for agent request.") if multi_endpoint_config: gpt_client, gpt_model, gpt_provider, gpt_endpoint, gpt_auth, gpt_api_version = multi_endpoint_config elif enable_gpt_apim: @@ -6487,26 +6532,18 @@ def result_requires_message_reload(result: Any) -> bool: conversation_item['last_updated'] = datetime.utcnow().isoformat() cosmos_conversations_container.upsert_item(conversation_item) # Update timestamp and potentially title - # Generate assistant_message_id early for thought tracking - assistant_message_id = f"{conversation_id}_assistant_{int(time.time())}_{random.randint(1000,9999)}" - - # Initialize thought tracker - thought_tracker = ThoughtTracker( - conversation_id=conversation_id, - message_id=assistant_message_id, - thread_id=current_user_thread_id, - user_id=user_id - ) - assistant_thread_attempt = retry_thread_attempt if is_retry else 1 - response_message_context = _load_user_message_response_context( - conversation_id=conversation_id, - user_message_id=user_message_id, - fallback_thread_id=current_user_thread_id, - fallback_previous_thread_id=previous_thread_id, - ) - user_info_for_assistant = response_message_context.get('user_info') - user_thread_id = response_message_context.get('thread_id') - user_previous_thread_id = response_message_context.get('previous_thread_id') + assistant_message_id, thought_tracker, assistant_thread_attempt, response_message_context = _initialize_assistant_response_tracking( + conversation_id=conversation_id, + user_message_id=user_message_id, + current_user_thread_id=current_user_thread_id, + previous_thread_id=previous_thread_id, + retry_thread_attempt=retry_thread_attempt, + is_retry=is_retry, + user_id=user_id, + ) + user_info_for_assistant = response_message_context.get('user_info') + user_thread_id = response_message_context.get('thread_id') + user_previous_thread_id = response_message_context.get('previous_thread_id') # region 3 - Content Safety # --------------------------------------------------------------------- @@ -8417,7 +8454,12 @@ def invoke_gpt_fallback(): continue try: debug_print(f"[SKChat] Foundry retry api_version={candidate}") - retry_client = build_multi_endpoint_client(gpt_auth or {}, gpt_provider, gpt_endpoint, candidate) + retry_client = build_streaming_multi_endpoint_client( + gpt_auth or {}, + gpt_provider, + gpt_endpoint, + candidate, + ) response = retry_client.chat.completions.create(**api_params) break except Exception as retry_exc: @@ -9405,22 +9447,14 @@ def generate(publish_background_event=None): conversation_item['last_updated'] = datetime.utcnow().isoformat() cosmos_conversations_container.upsert_item(conversation_item) - # Generate assistant_message_id early for thought tracking - assistant_message_id = f"{conversation_id}_assistant_{int(time.time())}_{random.randint(1000,9999)}" - - # Initialize thought tracker for streaming path - thought_tracker = ThoughtTracker( - conversation_id=conversation_id, - message_id=assistant_message_id, - thread_id=current_user_thread_id, - user_id=user_id - ) - assistant_thread_attempt = retry_thread_attempt if is_retry else 1 - response_message_context = _load_user_message_response_context( + assistant_message_id, thought_tracker, assistant_thread_attempt, response_message_context = _initialize_assistant_response_tracking( conversation_id=conversation_id, user_message_id=user_message_id, - fallback_thread_id=current_user_thread_id, - fallback_previous_thread_id=previous_thread_id, + current_user_thread_id=current_user_thread_id, + previous_thread_id=previous_thread_id, + retry_thread_attempt=retry_thread_attempt, + is_retry=is_retry, + user_id=user_id, ) user_info_for_assistant = response_message_context.get('user_info') user_thread_id = response_message_context.get('thread_id') diff --git a/application/single_app/route_backend_settings.py b/application/single_app/route_backend_settings.py index 34c9f8d1..3ad09217 100644 --- a/application/single_app/route_backend_settings.py +++ b/application/single_app/route_backend_settings.py @@ -542,7 +542,8 @@ def send_support_feedback_email(): user_email = user.get('preferred_username', user.get('email', reporter_email)) feedback_label = 'Bug Report' if feedback_type == 'bug_report' else 'Feature Request' - subject_line = f'[SimpleChat User Support] {feedback_label} - {organization}' + application_title = str(settings.get('app_title') or '').strip() or 'Simple Chat' + subject_line = f'[{application_title} User Support] {feedback_label} - {organization}' log_user_support_feedback_email_submission( user_id=user_id, diff --git a/application/single_app/support_menu_config.py b/application/single_app/support_menu_config.py index d020daa8..fa5411da 100644 --- a/application/single_app/support_menu_config.py +++ b/application/single_app/support_menu_config.py @@ -7,6 +7,29 @@ _SUPPORT_LATEST_FEATURE_DOCS_SETTING_KEY = 'enable_support_latest_feature_documentation_links' +def _resolve_support_application_title(settings): + """Return the application title used for user-facing support copy.""" + app_title = str((settings or {}).get('app_title') or '').strip() + return app_title or 'Simple Chat' + + +def _apply_support_application_title(value, app_title): + """Replace hard-coded product naming in user-facing support metadata.""" + if isinstance(value, str): + return value.replace('{app_title}', app_title).replace('SimpleChat', app_title) + + if isinstance(value, list): + return [_apply_support_application_title(item, app_title) for item in value] + + if isinstance(value, dict): + return { + key: _apply_support_application_title(item, app_title) + for key, item in value.items() + } + + return value + + _SUPPORT_LATEST_FEATURE_CATALOG = [ { 'id': 'guided_tutorials', @@ -145,7 +168,7 @@ 'title': 'Tabular Analysis', 'icon': 'bi-table', 'summary': 'Spreadsheet and table workflows continue to improve for exploration, filtering, and grounded follow-up questions.', - 'details': 'Tabular Analysis improves how SimpleChat works with CSV and spreadsheet files for filtering, comparisons, and grounded follow-up questions.', + 'details': 'Tabular Analysis improves how {app_title} works with CSV and spreadsheet files for filtering, comparisons, and grounded follow-up questions.', 'why': 'You get the most value after the file is uploaded, because the assistant can reason over the stored rows and columns instead of only whatever is pasted into one message.', 'guidance': [ 'Upload your CSV or XLSX to Personal Workspace if it is enabled, or add the file directly to Chat when you want a quicker one-off analysis.', @@ -501,7 +524,7 @@ 'id': 'send_feedback', 'title': 'Send Feedback', 'icon': 'bi-envelope-paper', - 'summary': 'End users can prepare bug reports and feature requests for their SimpleChat admins directly from the Support menu.', + 'summary': 'End users can prepare bug reports and feature requests for their {app_title} admins directly from the Support menu.', 'details': 'Send Feedback opens a guided, text-only email draft workflow so you can report issues or request improvements without leaving the app.', 'why': 'That gives your admins a cleaner starting point for triage than a vague message without context or reproduction details.', 'guidance': [ @@ -577,7 +600,7 @@ 'icon': 'bi-download', 'summary': 'Export one or multiple conversations from Chat in JSON or Markdown without carrying internal-only metadata into the downloaded package.', 'details': 'Conversation Export adds a guided workflow for choosing format, packaging, and download options when you need to reuse or archive chat history outside the app.', - 'why': 'This matters because users often need to share, archive, or reuse a conversation without copying raw chat text by hand or exposing internal metadata that should stay inside SimpleChat.', + 'why': 'This matters because users often need to share, archive, or reuse a conversation without copying raw chat text by hand or exposing internal metadata that should stay inside {app_title}.', 'guidance': [ 'Open an existing conversation from Chat when you want to export content that already has enough context to share.', 'Choose JSON when you want a machine-readable export and Markdown when you want something easier for people to review directly.', @@ -975,6 +998,7 @@ def get_visible_support_latest_features(settings): normalized_visibility = normalize_support_latest_features_visibility( (settings or {}).get('support_latest_features_visibility', {}) ) + app_title = _resolve_support_application_title(settings) visible_items = [] for item in _SUPPORT_LATEST_FEATURE_CATALOG: @@ -984,6 +1008,7 @@ def get_visible_support_latest_features(settings): action for action in visible_item.get('actions', []) if _action_enabled(action, settings) ] + visible_item = _apply_support_application_title(visible_item, app_title) _normalize_feature_media(visible_item) visible_items.append(visible_item) @@ -995,6 +1020,7 @@ def get_visible_support_latest_feature_groups(settings): normalized_visibility = normalize_support_latest_features_visibility( (settings or {}).get('support_latest_features_visibility', {}) ) + app_title = _resolve_support_application_title(settings) visible_groups = [] for feature_group in _SUPPORT_LATEST_FEATURE_RELEASE_GROUPS: @@ -1008,12 +1034,14 @@ def get_visible_support_latest_feature_groups(settings): action for action in visible_feature.get('actions', []) if _action_enabled(action, settings) ] + visible_feature = _apply_support_application_title(visible_feature, app_title) _normalize_feature_media(visible_feature) visible_features.append(visible_feature) if visible_features: visible_group = deepcopy(feature_group) visible_group['features'] = visible_features + visible_group = _apply_support_application_title(visible_group, app_title) visible_groups.append(visible_group) return visible_groups @@ -1022,6 +1050,7 @@ def get_visible_support_latest_feature_groups(settings): def get_support_latest_feature_release_groups_for_settings(settings): """Return grouped latest-feature metadata with actions filtered for the current settings.""" filtered_groups = deepcopy(_SUPPORT_LATEST_FEATURE_RELEASE_GROUPS) + app_title = _resolve_support_application_title(settings) for feature_group in filtered_groups: for feature in feature_group.get('features', []): @@ -1029,8 +1058,11 @@ def get_support_latest_feature_release_groups_for_settings(settings): action for action in feature.get('actions', []) if _action_enabled(action, settings) ] + feature.update(_apply_support_application_title(feature, app_title)) _normalize_feature_media(feature) + feature_group.update(_apply_support_application_title(feature_group, app_title)) + return filtered_groups diff --git a/application/single_app/templates/profile.html b/application/single_app/templates/profile.html index 5e6dd0a9..42826cde 100644 --- a/application/single_app/templates/profile.html +++ b/application/single_app/templates/profile.html @@ -135,52 +135,6 @@ animation: spin 1s linear infinite; } - .preference-card-icon { - align-items: center; - background: linear-gradient(135deg, rgba(13, 110, 253, 0.12), rgba(13, 202, 240, 0.18)); - border-radius: 14px; - color: var(--bs-primary); - display: inline-flex; - font-size: 1.25rem; - height: 52px; - justify-content: center; - width: 52px; - } - - .preference-status { - min-height: 1.5rem; - } - - .fact-memory-summary-card { - background: linear-gradient(135deg, rgba(13, 110, 253, 0.08), rgba(13, 202, 240, 0.12)); - border: 1px solid rgba(13, 110, 253, 0.14); - border-radius: 16px; - padding: 1.25rem; - } - - .fact-memory-count { - font-size: 2rem; - font-weight: 700; - line-height: 1; - } - - .fact-memory-modal-list { - max-height: 55vh; - overflow-y: auto; - } - - .fact-memory-modal-card { - border: 1px solid var(--bs-border-color); - border-radius: 14px; - padding: 1rem; - background: var(--bs-body-bg); - } - - .fact-memory-pagination-summary { - min-height: 1.5rem; - } - - .preference-card-icon { align-items: center; background: linear-gradient(135deg, rgba(13, 110, 253, 0.12), rgba(13, 202, 240, 0.18)); @@ -498,117 +452,6 @@
Fact Memory
-
-
-
- - - -
-
Tutorial Preferences
-

Control whether the floating guided tutorial buttons appear on Chat and Personal Workspace for your account.

-

These launchers are shown by default. You can hide them now and turn them back on later from this page.

-
-
- {% if app_settings.enable_support_menu and app_settings.enable_support_latest_features and app_settings.support_latest_features_has_visible_items %} - - View Latest Feature Notes - - {% endif %} -
- -
-
-
- - - Turn this off if you already know the interface and want to remove the floating walkthrough launchers. -
-
-
- -
-
- -
-
- -
-
-
- - - -
-
Fact Memory
-

Save durable facts for your account, then manage the full memory list from a compact popup editor.

- {% if app_settings.enable_fact_memory_plugin %} - Enabled by admin - Supported chat and mini-SK flows can use these memories when fact memory is enabled. - {% else %} - Disabled by admin - You can still manage saved memories here. They will stay inactive until an administrator turns fact memory back on. - {% endif %} -
-
-
- -
-
- - -
-
- - -
-
- Use instruction memories for durable preferences like tone or formatting. Use fact memories for details about you that the model should recall only when relevant. - -
-
-
-
-
Saved Memories
-
0
-
No memories saved yet.
-
0 instructions, 0 facts
-
-
- - -
- Use the popup editor for search, paging, and updates. -
-
-
- -
-
- {% if app_settings.enable_retention_policy_personal %}
@@ -961,88 +804,6 @@
- - - - - - - {% endblock %} diff --git a/application/single_app/templates/support_send_feedback.html b/application/single_app/templates/support_send_feedback.html index 7ac3e021..a31314cd 100644 --- a/application/single_app/templates/support_send_feedback.html +++ b/application/single_app/templates/support_send_feedback.html @@ -8,7 +8,7 @@

Send Feedback

-

Prepare a support email for your SimpleChat administrators. This opens a text-only draft in your local mail client.

+

Prepare a support email for your {{ app_settings.app_title }} administrators. This opens a text-only draft in your local mail client.