Compare commits

...

2475 Commits

Author SHA1 Message Date
Enrico Ros 6ba1afa540 ChatDrawer: virtualize scroll (for very numerous chats) 2025-01-15 00:49:43 -08:00
Enrico Ros 04e54d898e ChatDrawer: optimize hook 2025-01-15 00:18:41 -08:00
Enrico Ros 20a85a5dfb Web Links: per-link options 2025-01-14 22:17:04 -08:00
Enrico Ros 849eb58a8f AIX: un-race-cond, debug-last-request 2025-01-14 21:50:56 -08:00
Enrico Ros 558d73a858 AIX: only stream 'conversation' messages in dev mode 2025-01-14 21:24:49 -08:00
Enrico Ros e6948d4186 Clarify 'Link Message' 2025-01-14 21:02:28 -08:00
Enrico Ros 55e2e09797 Restore non-relaxed URL casting. Only cast it on the WIM. 2025-01-14 20:56:51 -08:00
Enrico Ros b2a3b78d44 Improve the dark mode toggle 2025-01-14 09:38:53 -08:00
Enrico Ros 135c957b7e Fix half px 2025-01-14 09:38:39 -08:00
Enrico Ros 624b99c8fe Browse: more informative 2025-01-14 09:24:19 -08:00
Enrico Ros fef0b27a33 Browse/Google: copy 2025-01-14 09:22:38 -08:00
Enrico Ros 75897cc162 Settings: improve icons 2025-01-14 09:22:22 -08:00
Enrico Ros 26733d6fea Remove /browse since we have better support 2025-01-14 09:06:26 -08:00
Enrico Ros 2a29ccdcf5 Browse: improve messaging 2025-01-14 09:01:17 -08:00
Enrico Ros efdcf26c10 Browse: improve desc 2025-01-14 08:48:48 -08:00
Enrico Ros 89d915a266 Move auto-speak to the right section 2025-01-14 08:46:12 -08:00
Enrico Ros 31c9b5c516 Settings: style more 2025-01-14 08:45:56 -08:00
Enrico Ros b9563eaac9 Settings: style 2025-01-14 08:12:08 -08:00
Enrico Ros 396abe01ec GCE: add site restriction 2025-01-14 07:47:20 -08:00
Enrico Ros 6880ba8651 Tool.Search: return 10 items. 2025-01-14 07:47:16 -08:00
Enrico Ros 4aa0d4a8ae Improved the Clean HTML function 2025-01-12 03:28:58 -08:00
Enrico Ros 50ede8baa8 misc 2025-01-12 03:28:55 -08:00
Enrico Ros 685edd12b9 o1: option to restore markdown 2025-01-12 01:11:46 -08:00
Enrico Ros 213241eae9 Web Input: multiball 2025-01-12 00:13:59 -08:00
Enrico Ros 2b9a5b5746 Improve URL validations 2025-01-12 00:13:59 -08:00
Enrico Ros 6ea0347a06 YT: don't clog the console 2025-01-12 00:13:59 -08:00
Enrico Ros 0df68444b3 Web Input Modal 2025-01-12 00:13:59 -08:00
Enrico Ros 290fd285c5 Fix composer icons stretch 2025-01-11 21:04:36 -08:00
Enrico Ros bd0b60ad26 Attach web pages 2025-01-11 21:03:48 -08:00
Enrico Ros d3c7daac50 Puppeteer: client with mostly unsupported downloads (disabled by default) 2025-01-11 20:43:53 -08:00
Enrico Ros c7805566ae Puppeteer: allow file download 2025-01-11 20:20:26 -08:00
Enrico Ros 6be3f274ed Browsing: fix timeouts with streaming results conversion 2025-01-11 20:18:15 -08:00
Enrico Ros 40d05771c1 Doc edit pane: improve edit buttons, swap the order for assistant segments 2025-01-11 16:12:43 -08:00
Enrico Ros dfec14620d CodePanelFrame: remove visual-flow-breaking borders 2025-01-11 16:09:45 -08:00
Enrico Ros 27f57d6f22 BlockEdit_TextFragment: support square top rad 2025-01-11 15:51:44 -08:00
Enrico Ros 78db633f25 Attachments: new attach buttons 2025-01-11 15:43:54 -08:00
Enrico Ros 440f368c36 CodePanelFrame: selected border 2025-01-11 15:43:49 -08:00
Enrico Ros 78186ad442 useAttachmentDrafts: support direct URL attachments, rather than through pastes or drag/drop 2025-01-11 15:43:46 -08:00
Enrico Ros 75182df441 YouTube URLs - improve matching, incl regional, shortlinks, etc. 2025-01-11 15:43:43 -08:00
Enrico Ros 213de18ecc AIX: dispatchers reuse the same doc wrapping 2025-01-10 03:50:01 -08:00
Enrico Ros 08437f1e8d AIX: broaden Docs support 2025-01-10 03:49:57 -08:00
Enrico Ros 3ba9200d0c AIX: skip Anthropic cache-control on empty system messages 2025-01-10 01:16:54 -08:00
Enrico Ros 1ad20a1579 AIX: Gemini: assumption fix 2025-01-10 01:16:50 -08:00
Enrico Ros 1a53484064 AIX: Gemini: multi-key support. Fixes #653 2025-01-10 00:58:10 -08:00
Enrico Ros bdcbf7ebc8 AIX: Gemini: pre-fix protocol wire 2025-01-10 00:41:45 -08:00
Enrico Ros 25b0cb47ac Fix a disabled menu option 2025-01-10 00:40:11 -08:00
Enrico Ros a1fa8d6480 AIX: update Gemini's wires 2025-01-10 00:40:01 -08:00
Enrico Ros 3240e527e8 Gemini: add 'OFF' safety filtering. Fixes #718, Fixes #720 2025-01-10 00:34:58 -08:00
Enrico Ros fa80848dd5 Attachments: show caption in tooltip 2025-01-09 22:49:16 -08:00
Enrico Ros 085f97b10c LFS: support missing callbacks 2025-01-09 21:49:13 -08:00
Enrico Ros d96937a92f DocAttachmentFragment: auto-disable when outside a workspaceId provider 2025-01-09 21:42:22 -08:00
Enrico Ros e2cd16d5d2 ScrollToBottom: allow use outside of a provider 2025-01-09 21:41:38 -08:00
Enrico Ros 9a783ebe6d Doc Attachments: improve lines 2025-01-09 21:41:35 -08:00
Enrico Ros 1db98ea0b0 Don't crash here also 2025-01-09 19:12:37 -08:00
Enrico Ros 775808c472 Don't crash here 2025-01-09 19:12:29 -08:00
Enrico Ros 251f57372c LLMAttachments: allow files wrapping 2025-01-09 19:12:28 -08:00
Enrico Ros 32b0ac2fa1 LLMAttachments: allow absence of inlining ops 2025-01-09 19:12:28 -08:00
Enrico Ros dc5b338914 Fragments: quick out 2025-01-09 19:12:24 -08:00
Enrico Ros 473a73d2c5 Fragments: splitting utility function 2025-01-09 19:12:24 -08:00
Enrico Ros d303a24300 Fragments: move buckets hook 2025-01-09 19:12:20 -08:00
Enrico Ros c8cbeffda3 LLMAttachments: made the AGI prompts optional 2025-01-09 17:18:44 -08:00
Enrico Ros b1d94e790f AttachmentDraftsStoreApi: improve typing 2025-01-09 17:18:43 -08:00
Enrico Ros 59966546cf Uniform Attach buttons 2025-01-09 16:06:08 -08:00
Enrico Ros 31eac468bc Add .disabled 2025-01-09 16:06:06 -08:00
Enrico Ros 672cc4801b Attachments: document the main hook 2025-01-09 16:06:03 -08:00
Enrico Ros 9e7b950cda Attachments: rename enableLoadURLsOnPaste 2025-01-09 16:06:00 -08:00
Enrico Ros 21e0180e88 Attachments: single vanilla store option 2025-01-09 16:05:58 -08:00
Enrico Ros e2801a0fef Attachments: rename slice 2025-01-09 16:05:55 -08:00
Enrico Ros 9ae9170ddb DLLMs: ModelConfigurations 2025-01-09 13:11:36 -08:00
Enrico Ros 7a092a9140 DLLMs: Config: pad context window 2025-01-09 04:42:03 -08:00
Enrico Ros d453adc438 DLLMs: Options: Visual indication of overrides over the baseline 2025-01-09 04:42:03 -08:00
Enrico Ros e5e9f489d3 DLLMs: Recyclable Parameters configurator 2025-01-09 02:33:42 -08:00
Enrico Ros 792f3f20f7 Confirmation Modal: remove warning 2025-01-09 00:44:26 -08:00
Enrico Ros 2581632f4b Roll packages 2025-01-08 22:27:31 -08:00
Enrico Ros 7c4df2cbf5 DLLMs: improve param typing on store-llms, for decoupling 2025-01-08 22:20:43 -08:00
Enrico Ros 5af67e4be8 LLM Select: miniscule change 2025-01-08 22:20:41 -08:00
Enrico Ros eaa534d590 Improve useLLM() 2025-01-08 22:20:38 -08:00
Enrico Ros f8630e3213 Optima Dropdowns: fix labels and decorators 2025-01-08 19:25:54 -08:00
Enrico Ros 48c64aed9f DLLMs: fix fallback value 2025-01-08 19:25:15 -08:00
Enrico Ros e7e5d2b901 Merge pull request #719 from Jonathan523/v2-dev
fix(gemini): fix FormHelperText for safety settings visibility
2025-01-08 09:30:07 -08:00
Jonathan Zhang 1051d6461c fix(gemini): make FormHelperText for safety settings invisible when advanced is not activated 2025-01-08 22:31:42 +08:00
Enrico Ros baec2b8a3a Use puppeteer-core for browsing instead of @cloudflare/puppeteer 2025-01-07 22:41:50 -08:00
Enrico Ros bfa5c510ef Fix punycode on eslint 2025-01-07 21:59:45 -08:00
Enrico Ros 970d024c10 Disable prisma hints 2025-01-07 20:59:19 -08:00
Enrico Ros bc74c97ca2 Revert "Improve useRef"
This reverts commit f593cb6b04.
2025-01-07 20:51:52 -08:00
Enrico Ros a5b92ec93a Lints 2025-01-07 20:33:55 -08:00
Enrico Ros f593cb6b04 Improve useRef 2025-01-07 20:33:55 -08:00
Enrico Ros 50717b339f Use @dnd-kit, remove the deprecated react-beautiful-dnd (thanks). Fixes #713 2025-01-07 19:23:38 -08:00
Enrico Ros 4400f33209 Roll pdfjs 2025-01-07 17:00:07 -08:00
Enrico Ros b2d21d3426 Image OCR: w/ text 2025-01-07 16:58:09 -08:00
Enrico Ros f9b102ffb8 Roll Tesseract (image OCR) 2025-01-07 16:55:47 -08:00
Enrico Ros 20d7d6b2ee Roll packages deep 2025-01-07 16:33:46 -08:00
Enrico Ros f947a650b0 Roll packages 2025-01-07 16:31:17 -08:00
Enrico Ros da2be7be50 Gemini: improve the chat message labels 2025-01-07 01:44:46 -08:00
Enrico Ros f1257556f3 Small cleanup post #716 2025-01-07 01:40:33 -08:00
Enrico Ros df3c4b5971 Merge pull request #716
feat: add custom API endpoint support for Google Gemini
2025-01-07 01:39:17 -08:00
Enrico Ros 403f5795f8 LLMOptions: restore the flame - Fixes #717 2025-01-07 01:15:56 -08:00
Jonathan Zhang e971db1c60 Merge branch 'enricoros:v2-dev' into v2-dev 2025-01-07 10:40:09 +08:00
Jonathan Zhang 9411cd4f9b fix: set advanced mode default to false in GeminiServiceSetup 2025-01-07 10:39:56 +08:00
Enrico Ros 271e5f3fc9 Grok: update models 2025-01-06 13:47:42 -08:00
Enrico Ros ce58fb5419 Together: update models 2025-01-06 13:05:05 -08:00
Jonathan Zhang ceca769a20 feat: add custom API endpoint support for Google Gemini 2025-01-06 14:20:15 +08:00
Enrico Ros 473f73c23f Optima Headings: _styles & Mobile 2024-12-31 15:00:06 -08:00
Enrico Ros aab84f6e67 PMix: renames 2024-12-31 04:39:21 -08:00
Enrico Ros 95e988dc9a PMix: parameters propagate 2024-12-31 03:10:09 -08:00
Enrico Ros 3cb9183cc0 PMix: parameters 2024-12-31 03:08:55 -08:00
Enrico Ros 79119c4770 PMix: remove former description 2024-12-31 03:08:09 -08:00
Enrico Ros 64933bea7e Recognize Emojis 2024-12-31 03:08:06 -08:00
Enrico Ros bae15f3bb6 Popups: improvements v2 2024-12-30 19:56:59 -08:00
Enrico Ros 35733e86b9 UI - Mobile: Nav 2024-12-30 19:56:59 -08:00
Enrico Ros e42dc3a755 UI - improve Mobile layout 2024-12-30 19:56:59 -08:00
Enrico Ros 215c45c823 UI - Chat Panels 2024-12-30 19:56:56 -08:00
Enrico Ros 6d68f599df UI - Panes & Mobile 2024-12-30 19:55:22 -08:00
Enrico Ros c5b4dadb83 Mermaid: stick errors 2024-12-30 17:27:29 -08:00
Enrico Ros 5d942eec41 Mermaid: update to 11.4.1 2024-12-30 16:40:09 -08:00
Enrico Ros 613665665d Beam: disable auto-stick on Mobile 2024-12-30 14:55:36 -08:00
Enrico Ros b14e28e03b Update icons 2024-12-30 14:42:26 -08:00
Enrico Ros 9969ccb530 getConversation: reduce usage 2024-12-30 14:19:23 -08:00
Enrico Ros ec9243b8dd Rename throwing head 2024-12-30 13:50:08 -08:00
Enrico Ros 8584a56a6d Beam: begin history rationalization 2024-12-30 13:41:00 -08:00
Enrico Ros af78068f48 Beam Fusion: sticky header 2024-12-30 12:42:46 -08:00
Enrico Ros 0a002a0d78 Beam Ray: edit with sticky header 2024-12-30 12:34:51 -08:00
Enrico Ros 66572a970f New Voice Chat intent 2024-12-30 12:03:13 -08:00
Enrico Ros ff1d3686b6 Call icon on Manifest 2024-12-30 11:32:38 -08:00
Enrico Ros 7626b48b70 AIX: suppress warning on completion_tokens=0 2024-12-30 10:59:54 -08:00
Enrico Ros 9bfcb50735 DeepSeek: cache pricing support 2024-12-29 23:54:54 -08:00
Enrico Ros c18be131a1 DeepSeek: V3 models 2024-12-29 23:54:42 -08:00
Enrico Ros 692a1ef90e Roll packages 2024-12-29 22:24:10 -08:00
Enrico Ros 3c3fae6039 Roll packages 2024-12-29 21:41:12 -08:00
Enrico Ros c090334093 require node 20+. fixes #710 2024-12-27 15:05:56 -08:00
Enrico Ros a2942a32e6 AIX: OpenAI: latest models 2024-12-24 20:49:55 -08:00
Enrico Ros 1bd327e410 AIX: OpenAI: wire support for Audio-input, Audio-output (non-streaming only), and Prediction (rewrite acceleration) modes. 2024-12-24 20:06:58 -08:00
Enrico Ros 557886f93f Support for per-model OpenAI Reasoning Effort settings. #698 2024-12-24 18:31:25 -08:00
Enrico Ros f52e35029c AIX: server-side Top-P 2024-12-24 18:17:33 -08:00
Enrico Ros b2d66af440 DLLMs: client-side OAI reasoning effort 2024-12-24 18:12:04 -08:00
Enrico Ros 897d7fb7e0 Optimize LLM Dropdown (skip rendering on invisible changes) 2024-12-24 17:29:59 -08:00
Enrico Ros 0407d228fb Merge pull request #706 from jayrepo/patch-1
link ssl3 for latest alpine
2024-12-23 23:13:59 -08:00
Enrico Ros a58f703744 DLLMs: o-models reasoning efforts 2024-12-23 02:48:34 -08:00
Enrico Ros 5186df3748 DLLMs: server-side-driven par-specs 2024-12-23 02:48:11 -08:00
Enrico Ros a5f0527eec DLLMs: keep user edits by default 2024-12-23 02:14:27 -08:00
Enrico Ros 6e851713b9 DLLMs: dynamic parameters system 2024-12-23 02:09:23 -08:00
Enrico Ros b4a586fab2 Optima page heading: add end deco 2024-12-22 23:00:18 -08:00
Enrico Ros cb2d6dbfd4 +react-hook-form 2024-12-22 23:00:15 -08:00
Enrico Ros 4162158413 useLLMSelect: optimize 2024-12-22 23:00:04 -08:00
Enrico Ros 18234ec199 ConfirmationModal: relax 2024-12-22 23:00:01 -08:00
Jay Chen 18dbf916ef link ssl3 2024-12-23 13:39:47 +08:00
Enrico Ros 26df5bc889 Optima: no gap dropdown 2024-12-20 01:47:16 -08:00
Enrico Ros 0f33ae1a8d AIX: demuxer dev message 2024-12-20 00:44:53 -08:00
Enrico Ros e7a463399f Gemini: another removed model 2024-12-20 00:42:27 -08:00
Enrico Ros 632efafcbd Anthropic: dynamic models list - still need hardcoded details 2024-12-20 00:39:58 -08:00
Enrico Ros bfbfe4d122 Gemini: roll models 2024-12-19 17:05:58 -08:00
Enrico Ros 21f42159c8 OpenAI: o1 support: image inputs, dev messages, reasoning, etc. 2024-12-19 16:32:29 -08:00
Enrico Ros b750a2bb9b AIX: OpenAI: server-side dispatch developer message 2024-12-19 16:32:29 -08:00
Enrico Ros 475ff1e88e AIX: client-side HotFixes 2024-12-19 16:18:58 -08:00
Enrico Ros c2a577bf65 LLMs: update model interfaces 2024-12-19 16:18:22 -08:00
Enrico Ros 12f4fdde93 AIX: OpenAI wire: support 'developer' messages 2024-12-19 16:17:50 -08:00
Enrico Ros db0aa36ccb UI: Add breadcrumbs support 2024-12-19 14:26:27 -08:00
Enrico Ros 69192689b8 Optima Page heading: made tagline optional 2024-12-19 14:26:27 -08:00
Enrico Ros 078c6400ba Update heading 2024-12-19 11:23:14 -08:00
Enrico Ros 6074a5bb16 Gemini: update wiretypes 2024-12-19 01:11:54 -08:00
Enrico Ros 79c71a1740 Optima: page heading 2024-12-19 00:35:47 -08:00
Enrico Ros caa9cb6a16 Hook for uiComplexityMode 2024-12-19 00:35:47 -08:00
Enrico Ros 795126ccde roll packages 2024-12-18 11:19:41 -08:00
Enrico Ros 7728efebad Continue system message encapsulation 2024-12-17 12:07:02 -08:00
Enrico Ros a896cb827a v2-dev: begin docker build 2024-12-16 23:51:21 -08:00
Enrico Ros b9c62b45f9 Merge pull request #695 from matrix303/matrix303/issue694
[BUG] DockerFile Build -- suggest update to node:22-alpile
2024-12-16 23:07:24 -08:00
Enrico Ros 9e2f815e1e Relocate helpers 2024-12-16 22:50:30 -08:00
Enrico Ros f88c18ddde Helper for system instruction split 2024-12-16 21:31:00 -08:00
matrix303 2de70fa87d [BUG] DockerFile Build -- suggest update to node:22-alpile
Fixes #694
2024-12-16 18:03:21 +00:00
Enrico Ros eb49717065 UI Bits 2024-12-15 21:45:22 -08:00
Enrico Ros 268b1d8a19 Conversation Zero state 2024-12-15 21:10:32 -08:00
Enrico Ros 8768d9e946 Fix helper 2024-12-15 20:33:42 -08:00
Enrico Ros d83d29054d Drawer: show where to remove but don't do it - makes transitions slow 2024-12-15 19:51:16 -08:00
Enrico Ros c39e378235 systemInstruction: support null 2024-12-15 15:04:19 -08:00
Enrico Ros 7be72acff3 Helper for conceptual system instruction split 2024-12-15 12:53:18 -08:00
Enrico Ros 41a2f1e526 Actile: improve, multi-provider, label attachments 2024-12-15 12:04:37 -08:00
Enrico Ros 36eda51789 Conceptually split the system Instruction with the rest of the history 2024-12-12 17:59:37 -08:00
Enrico Ros 6ffcb731a3 Personas: allow to switch out null personas 2024-12-12 17:41:40 -08:00
Enrico Ros ce9fcbd4a1 Typeshift: prework 1 2024-12-11 15:38:22 -08:00
Enrico Ros 022cdd0b37 disable dead protocol code 2024-12-11 15:38:09 -08:00
Enrico Ros ab5b6f1769 Fix: store-chats: don't partialize if there's a single chat 2024-12-11 15:04:10 -08:00
Enrico Ros 1811e31ea5 Gemini: update models, including 2.0 Flash 2024-12-11 14:47:58 -08:00
Enrico Ros b0430b0a18 Mobile llm options fix 2024-12-11 14:47:32 -08:00
Enrico Ros 122d6c9da5 Show Free models 2024-12-11 14:47:22 -08:00
Enrico Ros 480aaed108 remove optional package 2024-12-11 14:31:01 -08:00
Enrico Ros bf312265de more roll packages 2024-12-11 14:23:50 -08:00
Enrico Ros ea15d8e0e9 roll pdfjs 2024-12-11 14:07:21 -08:00
Enrico Ros 0947100b13 roll packages 2024-12-11 14:05:44 -08:00
Enrico Ros c0dca032e4 Cleanup after AIX migration 2024-12-11 14:00:52 -08:00
Enrico Ros f0df743f12 Remove messageSingleTextOrThrow 2024-12-11 14:00:52 -08:00
Enrico Ros b6ee04e140 Persona Viewer: fix 2024-12-11 01:03:20 -08:00
Enrico Ros 75333df458 OpenRouter: update models sorting 2024-12-10 22:43:15 -08:00
Enrico Ros f980bffd11 Ollama: default context to 4096 2024-12-10 22:24:39 -08:00
Enrico Ros 8aeb4dce76 Ollama: doc PNG images 2024-12-10 22:15:29 -08:00
Enrico Ros 24e8539b3e Ollama: update dispatch, Fixes #678 2024-12-10 22:00:41 -08:00
Enrico Ros 8bc118c060 Ollama: update models 2024-12-10 21:35:18 -08:00
Enrico Ros f0e595b3ff Gemini: forcefully delete the models replaced without official comms/updates. Fixes #690 2024-12-10 21:10:50 -08:00
Enrico Ros 44b9eebe1c Don't use GitHub as CDN - Fixes #691 2024-12-10 20:49:45 -08:00
Enrico Ros 68630a0bd5 Persona Creator: correct display. #685 2024-12-10 20:39:54 -08:00
Enrico Ros 3bf0c10b42 AIX: calls: no system messages 2024-12-10 20:39:54 -08:00
Enrico Ros 6fcd87aba7 AIX: misc 2024-12-10 20:39:54 -08:00
Enrico Ros 4183e1e2c5 AIX: remove llms's legacy VChatMessage and llmStreamingChatGenerate 2024-12-10 20:39:54 -08:00
Enrico Ros 2506d60058 AIX: port Telephone (aixCGR_fromHistory) 2024-12-10 20:39:54 -08:00
Enrico Ros 7221151f2f AIX: port Persona Creator (LLMChain) 2024-12-10 18:53:30 -08:00
Enrico Ros 4c259eb9e5 AIX: port FlattenerModal (useStreamChatText) 2024-12-10 17:51:21 -08:00
Enrico Ros 334b3aba86 idUtils: nanoId -> uuidv4 2024-12-09 17:26:03 -08:00
Enrico Ros 83e601ad3a idUtils: add uuidV4 2024-12-09 17:25:54 -08:00
Enrico Ros 6e8a25bc23 Beam: remove /beam, it's not really a command 2024-12-09 17:22:41 -08:00
Enrico Ros 70764e9ca2 Gemini: support for 1206 2024-12-06 12:17:34 -08:00
Enrico Ros 148eba8feb OpenAI: o1: re-enable streaming 2024-12-06 12:17:34 -08:00
Enrico Ros 0ee2d04d48 OpenAI: resort 2024-12-06 12:17:34 -08:00
Enrico Ros 311b91788b OpenAI: wire notes 2024-12-06 12:17:34 -08:00
Enrico Ros ab30bf213c OpenAI: update models 2024-12-06 12:17:34 -08:00
Enrico Ros f0cb5c63cf Models list: more compact on mobile 2024-12-06 12:17:34 -08:00
Enrico Ros b8f4ad674b Vector Clocks implementation 2024-12-02 23:07:13 -08:00
Enrico Ros 0a27544db3 DConversation: converters update 2024-12-02 23:06:44 -08:00
Enrico Ros fa8501b73d Sherpa/chats: delay GC to delay loading the conversations store 2024-11-30 23:52:45 -08:00
Enrico Ros 8074be9b2e Type normalization Metrics 2024-11-30 23:02:55 -08:00
Enrico Ros 2e2a664c82 Normalize PricingChatGenerate 2024-11-30 23:02:55 -08:00
Enrico Ros 88ed387b75 .gitignore 2024-11-30 23:02:55 -08:00
Enrico Ros 1006d8041e roll packages 2024-11-30 22:29:39 -08:00
Enrico Ros 004b26bff4 Add Beauty 2024-11-30 22:26:34 -08:00
Enrico Ros eb41a245e8 Theme update 2024-11-30 22:06:23 -08:00
Enrico Ros 22a219f1e4 Update min width 2024-11-30 19:45:55 -08:00
Enrico Ros 6435619fba Sync: add DeviceID, stored 2024-11-30 18:50:54 -08:00
Enrico Ros 68ca331e02 Gemini: add 1121 2024-11-30 18:48:29 -08:00
Enrico Ros bf1c734101 Smaller panes 2024-11-30 18:48:14 -08:00
Enrico Ros e5870e43ce Lint: thanks typescript 2024-11-30 18:47:00 -08:00
Enrico Ros 1cda4d443a Roll packages 2024-11-30 18:45:57 -08:00
Enrico Ros cdc3fe38ca Enable Node 22 2024-11-30 18:45:57 -08:00
Enrico Ros f5cb3150b1 Add the "2 days ago" option 2024-11-30 18:42:59 -08:00
Enrico Ros 38f700b383 Tryfix RenderCode (was all vertical) 2024-11-21 23:28:06 -08:00
Enrico Ros dc46497dfe AIX: disable comments in the demuxer parse 2024-11-21 22:55:37 -08:00
Enrico Ros cf0ca2a17e AIX: support forwarded OpenRouter errors 2024-11-21 22:46:09 -08:00
Enrico Ros 0df17ec7bf Support .sh files 2024-11-21 03:23:44 -08:00
Enrico Ros 26d6924ba1 Gemini: update models 2024-11-21 00:42:40 -08:00
Enrico Ros aef56df7a3 Gemini: code execution flags 2024-11-21 00:38:59 -08:00
Enrico Ros 25a6f1fd5c Roll packages. 2024-11-21 00:38:32 -08:00
Enrico Ros 010de2b1f1 SVG: improve detection 2024-11-21 00:14:14 -08:00
Enrico Ros c498c31050 UI: Fix Beam ctrl+enter 2024-11-21 00:12:11 -08:00
Enrico Ros ea9aaa6524 tRPC: relocate 2024-11-20 22:44:48 -08:00
Enrico Ros dfcd590fb3 tRPC: rename rooters 2024-11-20 22:43:13 -08:00
Enrico Ros 5d8b06c928 Exclusions 2024-11-18 12:07:18 -08:00
Enrico Ros a10ddbe103 Unused, comment 2024-11-18 12:01:25 -08:00
Enrico Ros b439180d4e roll packages 2024-11-18 10:33:25 -08:00
Enrico Ros 629dc3c3b8 UI: Persona Icons in Drawer: off by default 2024-11-18 10:10:08 -08:00
Enrico Ros 99a8f900df Nav: change names 2024-11-18 09:21:27 -08:00
Enrico Ros d713edfcab Beam: start all/stop all shortcuts 2024-11-14 14:11:33 -08:00
Enrico Ros cfead98e01 Beam: ctrl+up/down 2024-11-14 14:11:32 -08:00
Enrico Ros 85242d2417 Improve shadow 2024-11-14 14:11:32 -08:00
Enrico Ros 3682a86b49 xAI: fix inversion 2024-11-14 13:24:37 -08:00
Enrico Ros 7c418966f0 _fetchFromTRPC: types for PUT and DELETE 2024-11-14 13:22:43 -08:00
Enrico Ros f773910846 Hide costs counter when < $0.0001 (initial visual clutter) 2024-11-14 13:10:52 -08:00
Enrico Ros cfbc1160ab ChatMessage: menu within screen bounds 2024-11-14 13:08:58 -08:00
Enrico Ros 2d11873af8 Fix react dep 2024-11-13 18:39:04 -08:00
Enrico Ros ee322b45eb Incognito: visual indicator 2024-11-13 18:39:04 -08:00
Enrico Ros c472fbad1c Remove empty chats from the history (don't even save them until we have content) 2024-11-13 18:25:23 -08:00
Enrico Ros b62932ac9c Sherpa: add modal 2024-11-10 23:36:51 -08:00
Enrico Ros bd35be8e13 Icons: Google and GitHub
The icons are from the Authjs project.
2024-11-10 23:34:50 -08:00
Enrico Ros b5eff8b2da Tryfix reload for clipboardUtils 2024-11-10 23:34:35 -08:00
Enrico Ros 6bf0b7c83a Backend debug 2024-11-10 23:34:27 -08:00
Enrico Ros 3a5dc71fc0 Roll packages 2024-11-10 14:33:55 -08:00
Enrico Ros bddd1474c4 xAI: full support 2024-11-08 23:00:53 -08:00
Enrico Ros b90b71bb58 Bits 2024-11-08 23:00:49 -08:00
Enrico Ros d75307691f BackendCaps: refresh on reconnect 2024-11-07 16:22:25 -08:00
Enrico Ros acc3bc4403 Simplify: remove backend analytics 2024-11-07 14:14:02 -08:00
Enrico Ros 4c1b1213b1 ElevenLabs: tRPC streaming - supports new v2 and Turbo 2.5 models 2024-11-07 03:13:30 -08:00
Enrico Ros 40850dde0a AudioLivePlayer: convert for buffers 2024-11-07 03:11:59 -08:00
Enrico Ros 10d5fca3b3 UrlUtils: b64 2024-11-07 03:11:57 -08:00
Enrico Ros 71085408a5 roll packages 2024-11-07 00:06:14 -08:00
Enrico Ros 52cdc95103 Aix - misc 2024-11-06 17:19:37 -08:00
Enrico Ros 638977cc74 DSV: speed 2024-11-06 17:11:26 -08:00
Enrico Ros 5e7e838714 Remove @sanity's diff library (slow, old). 2024-11-06 17:11:26 -08:00
Enrico Ros 965e3282a8 Roll packages (incl. pdfjs) 2024-11-06 17:03:22 -08:00
Enrico Ros 7a1d9cc352 DataStreamViz: speed 2024-11-06 16:29:32 -08:00
Enrico Ros 07dfc8ee07 Config: TOS 2024-11-06 16:29:24 -08:00
Enrico Ros 414250f5d0 Bits 2024-11-06 04:59:17 -08:00
Enrico Ros e6854ab946 Inform about the issue dragging from Obsidian 2024-11-05 21:59:38 -08:00
Enrico Ros 026d2fbc40 SQL highlight 2024-11-05 21:39:51 -08:00
Enrico Ros 66a557a7e1 Anthropic: add Haiku 3.5 2024-11-05 03:20:17 -08:00
Enrico Ros 28ae055c28 More Aggregate Error unpacking 2024-11-03 19:44:03 -08:00
Enrico Ros 0f8fda5c43 Unpack Aggregate Errors 2024-11-03 16:09:06 -08:00
Enrico Ros 9bacedb48c Mobile: don't blur the TextArea when the mic is pressed 2024-11-03 16:09:04 -08:00
Enrico Ros 9894684784 Tools: FC Invocations: support no inputs 2024-11-03 01:47:55 -08:00
Enrico Ros 741b9dae41 Tools: Definitions: support no-params 2024-11-03 01:47:55 -08:00
Enrico Ros 45b4deb7c7 Visual indication of incognito 2024-11-02 19:32:39 -07:00
Enrico Ros 38bdbfeee3 Messages: fix missing text replacement 2024-11-02 19:32:39 -07:00
Enrico Ros 4e3386f589 Fix: Data sanitization 2024-11-02 19:32:39 -07:00
Enrico Ros 88999fe3f5 Incognito (Shift + click on New) 2024-11-02 19:32:39 -07:00
Enrico Ros ce1b5b73b7 Mic: add 5s 2024-11-02 19:32:39 -07:00
Enrico Ros 864eaa7a02 Anthropic: 2024-10-22 changes 2024-11-02 19:32:38 -07:00
Enrico Ros 8848b13f33 Roll packages 2024-11-02 19:15:32 -07:00
Enrico Ros 147da2bc95 Set TenantId 2024-11-02 19:12:44 -07:00
Enrico Ros f94edc7543 Fix URLs 2024-11-01 16:23:03 -07:00
Enrico Ros 9439007f2b Beam: update urls for branch switches 2024-11-01 16:19:45 -07:00
Enrico Ros fa80b7278f Update branch names 2024-10-28 20:15:53 -07:00
Enrico Ros a7af365dc2 v1: document branch names 2024-10-28 20:15:49 -07:00
Enrico Ros 013d952092 Roll Eventsource-parser. 2024-10-28 17:11:25 -07:00
Enrico Ros 0182f9885d Add diff 2024-10-28 15:44:09 -07:00
Enrico Ros 5934a715ee Upgrade to next15 2024-10-28 15:28:17 -07:00
Enrico Ros 41b21af3c3 Roll packages 2024-10-28 15:27:58 -07:00
Enrico Ros 4db42c5f91 Fragments: safer duplication (would rather crash here than later) 2024-10-26 17:17:12 -07:00
Enrico Ros f05472baea GoodModal: definitely need another update lol 2024-10-25 12:19:08 -07:00
Enrico Ros 72b0e77168 Lint 2024-10-25 09:26:01 -07:00
Enrico Ros aa06ac4756 Fix Players 2024-10-25 09:25:41 -07:00
Enrico Ros 2ff060ba38 Ctrl+Up/Down message navigation: improve 3 2024-10-25 09:15:14 -07:00
Enrico Ros 9468f29aae GoodModal: improve theming 2024-10-25 08:58:50 -07:00
Enrico Ros c4b894ec65 Ctrl+Up/Down message navigation: improve 2 2024-10-25 08:58:18 -07:00
Enrico Ros b774073c7f Update Video player 2024-10-24 23:16:42 -07:00
Enrico Ros 911bf97a38 GoodModal: themeable 2024-10-24 23:12:11 -07:00
Enrico Ros e91e0f273a Ctrl+Up/Down message navigation: improve 2024-10-24 21:44:06 -07:00
Enrico Ros 4279e94499 Ctrl+Up/Down message navigation 2024-10-24 21:29:01 -07:00
Enrico Ros ec34f3a6b1 Speech Recognition: fix abstraction 2024-10-24 19:48:43 -07:00
Enrico Ros 86fed99288 Misc 2024-10-24 15:52:49 -07:00
Enrico Ros 934f29dcfd Doc Part/Aix: support version 2024-10-24 15:50:21 -07:00
Enrico Ros b3cf624a39 AppChat: Dev debug test 2024-10-24 15:28:29 -07:00
Enrico Ros f4463e0113 DevBuild: single place support 2024-10-24 15:28:06 -07:00
Enrico Ros 57ca1270e6 Refetch after a long idle in case of a new version. 2024-10-23 22:50:54 -07:00
Enrico Ros 03417c5186 Speech Recognition: Engines abstraction 2024-10-23 22:16:37 -07:00
Enrico Ros 9bcbe58f4a Versioning system update 2024-10-22 13:51:04 -07:00
Enrico Ros 8d66e1c804 Anthropic: update models
Haiku 3.5 coming later this month
2024-10-22 13:20:31 -07:00
Enrico Ros 089ddee9de Optima fixes 2024-10-21 14:29:24 -07:00
Enrico Ros 12965b81c7 News: show build date 2024-10-21 14:26:29 -07:00
Enrico Ros 62b64ac1bd Beam: copy/use all #660 2024-10-20 19:29:58 -07:00
Enrico Ros 9fecbe1005 Beam: keep the header on mobile 2024-10-20 19:29:48 -07:00
Enrico Ros 0c90b296f9 CHandler: cleanup 2024-10-20 04:39:09 -07:00
Enrico Ros 1bc38e3760 Composer: min size 2024-10-20 04:16:35 -07:00
Enrico Ros 32497dbb7b UI bits 2024-10-19 20:38:27 -07:00
Enrico Ros 0a07f2a447 Ephemerals: improve layout 2024-10-19 20:38:10 -07:00
Enrico Ros fbc6265543 Prompt template: support ternaries 2024-10-19 20:38:01 -07:00
Enrico Ros 82c0ed475b Aix: responsive and lighter decimation, relieving pressure. 2024-10-18 04:03:41 -07:00
Enrico Ros e9add70f8a Storage: new delayed serialization backend. 2024-10-18 04:00:35 -07:00
Enrico Ros f3bd5e4d58 Selective Search 2024-10-18 04:00:31 -07:00
Enrico Ros a525b7437a Blocks: disable Enhanced rendering for untitled, below 3 lines 2024-10-17 17:29:15 -07:00
Enrico Ros 915bc6cc89 Booting sequence activated. 2024-10-17 14:40:03 -07:00
Enrico Ros 51fdf2705d Warn if the application version is desynced. 2024-10-17 14:00:41 -07:00
Enrico Ros 5d814c6bb5 Optimize Boot. 2024-10-17 14:00:30 -07:00
Enrico Ros e379526f14 Confirmation without Close 2024-10-17 14:00:00 -07:00
Enrico Ros c9057f0c25 Composer: minimize 2024-10-17 13:59:28 -07:00
Enrico Ros c3c65ea3d3 Tools: render fragments 2024-10-17 12:48:36 -07:00
Enrico Ros ddee6aecfb Tools: edit invocation/responses 2024-10-17 12:48:33 -07:00
Enrico Ros 1a6f56ef62 OpenAI: Fix 3.5 2024-10-17 12:48:07 -07:00
Enrico Ros 680e031be6 Edit: tool in/out 2024-10-16 21:15:07 -07:00
Enrico Ros a7ab95e905 Fragments: ITCF. 2024-10-16 20:10:13 -07:00
Enrico Ros 57bb1edcfc Fragments: Void. 2024-10-16 20:07:06 -07:00
Enrico Ros 216fe20e52 Fragments: cleanup 2024-10-16 19:13:37 -07:00
Enrico Ros a27669fd63 Gemini: update models 2024-10-16 15:41:10 -07:00
Enrico Ros 5034ecc4df Attachments: view Docs 2024-10-16 15:41:03 -07:00
Enrico Ros 55700d5218 Attachments: bits. 2024-10-16 15:40:00 -07:00
Enrico Ros 35c03e5b44 Aix: constrain tool_response.function_call.result to be JSON-parseable objects for now
This is done as it seems to be the only supported input for Gemini's functionResponse
2024-10-16 14:01:16 -07:00
Enrico Ros cfb3a071c8 Docs. 2024-10-16 13:59:11 -07:00
Enrico Ros 677645b81c Aix: Fix Gemini functionResponse 2024-10-16 13:58:46 -07:00
Enrico Ros 297f93b8ad Aix: Tool Responses 2024-10-16 13:58:40 -07:00
Enrico Ros 765eec0492 Aix: cleanup CGR creation 2024-10-16 13:58:19 -07:00
Enrico Ros da32c2c59a Improve Aix debugger. 2024-10-16 02:40:35 -07:00
Enrico Ros 091f1b1936 Versioning System 2024-10-16 01:52:17 -07:00
Enrico Ros e9dc735989 Cleanup Stores. [server] 2024-10-15 23:54:40 -07:00
Enrico Ros 4d01f8620a bits 2024-10-15 23:45:55 -07:00
Enrico Ros 3edf89d98f GSearch: misc. 2024-10-15 23:45:44 -07:00
Enrico Ros 7681ff3f3e GoodModal: optimize 2024-10-15 16:43:13 -07:00
Enrico Ros 42d947f13e Composer: disable call when responding 2024-10-15 03:24:31 -07:00
Enrico Ros b5772f3765 Composer: complete dictation then send, and disable while sending (even early stages) 2024-10-15 02:25:46 -07:00
Enrico Ros 639f02346e Attachments: skip text-less PDFs 2024-10-15 00:13:58 -07:00
Enrico Ros cf1cb7b112 bits 2024-10-14 23:05:17 -07:00
Enrico Ros 1b60f1062f Aix: push down throttling. 2024-10-14 23:04:44 -07:00
Enrico Ros d105e28ca8 Z5: stabilize the transport access object in useServiceSetup 2024-10-14 20:56:45 -07:00
Enrico Ros 3ff88fffe5 Update Debug Hooks to detect changes 2024-10-14 20:41:08 -07:00
Enrico Ros d87d0aa146 Z5: Stabilize useWorkspaceContentsMetadata 2024-10-14 20:19:36 -07:00
Enrico Ros c7c43780a3 Soft-update the version number. 2024-10-14 18:08:00 -07:00
Enrico Ros bc24afe859 Upgrade to Zustand 5 (released 5h ago) 2024-10-14 13:03:26 -07:00
Enrico Ros e25f46b5c0 Anthropic: fix build. 2024-10-14 02:17:29 -07:00
Enrico Ros 3907449ec0 Anthropic: try fix functions. 2024-10-14 02:12:54 -07:00
Enrico Ros 8230eafe25 Roll deps. 2024-10-13 04:32:18 -07:00
Enrico Ros a43e83d9ed Roll pdfjs. 2024-10-13 04:32:18 -07:00
Enrico Ros fce3b6e538 Aider glue. 2024-10-13 04:32:18 -07:00
Enrico Ros f7decf8210 Search: optimize. 2024-10-13 04:06:20 -07:00
Enrico Ros 6d6c9afe97 Merge remote-tracking branch 'opensource/big-agi-2' into big-agi-2-OPEN 2024-10-13 03:12:41 -07:00
Enrico Ros 6876390456 Search: fix instability 2024-10-13 03:12:33 -07:00
Enrico Ros 1e95ec6154 Search: count for > 10 2024-10-13 02:47:02 -07:00
Enrico Ros 6756e4e027 Attachments: copy name 2024-10-12 19:52:12 -07:00
Enrico Ros c0573c56c4 Attachments: View Preview, View on Click 2024-10-12 19:52:12 -07:00
Enrico Ros 1338014942 Attachments: scraping timestamps 2024-10-12 19:52:12 -07:00
Enrico Ros 011b76f8e2 Update Ephemerals 2024-10-12 19:52:12 -07:00
Enrico Ros b2c07471d8 bits 2024-10-12 19:43:18 -07:00
Enrico Ros 950e1c8779 Build and lint fixes. 2024-10-12 19:38:39 -07:00
Enrico Ros 61df9819e6 SpeechReco: improve casts. 2024-10-11 22:15:36 -07:00
Enrico Ros 5afc8ad69b Tall screen support for panes. 2024-10-11 22:15:18 -07:00
Enrico Ros a472c618a3 Abort: explore solutions 2024-10-11 22:15:18 -07:00
Enrico Ros 9f00772dd4 [DEV] ICE: Text parts cleanup 2024-10-11 22:15:18 -07:00
Enrico Ros 478d792565 ReAct: disable calculate (arbitrary code execution) 2024-10-11 22:15:18 -07:00
Enrico Ros b20f1667f7 Improve command execution. 2024-10-11 22:15:18 -07:00
Enrico Ros 899695e32c Snackbar: center-title and unexpected 2024-10-11 22:13:00 -07:00
Enrico Ros 56e99785ea Tables: copy as markdown 2024-10-11 22:12:43 -07:00
Enrico Ros a778165ee7 This branch is 1242 commits on top of main :) 2024-10-11 21:59:39 -07:00
Enrico Ros dc55be87d2 Merge remote-tracking branch 'opensource/main' into big-agi-2-OPEN 2024-10-11 21:58:38 -07:00
Enrico Ros 8eb7d7f80b Big-AGI 2 is coming with loads of features. 2024-10-11 21:57:50 -07:00
Enrico Ros ee01085f8e Merge remote-tracking branch 'opensource/main-stable' 2024-10-11 21:56:09 -07:00
Enrico Ros 1adff7481b Dev survey for Big-AGI 2. 2024-10-11 21:55:46 -07:00
Enrico Ros 054a8d9050 Aix: +Diagram 2024-10-10 17:56:45 -07:00
Enrico Ros ed98829869 Aix: re-fix for o1 2024-10-10 17:43:35 -07:00
Enrico Ros 4810975148 Aix: unified chat-generate context 2024-10-10 17:37:35 -07:00
Enrico Ros a99895166c Aix: adapt downstream. 2024-10-10 16:39:52 -07:00
Enrico Ros cf62128095 Aix: Absorb Complexity - simpler T2T API. 2024-10-10 15:42:38 -07:00
Enrico Ros 2a5d418425 Aix: rename CGRs 2024-10-10 15:20:25 -07:00
Enrico Ros 3e865d68dc Aix: +select-Draw 2024-10-10 15:19:20 -07:00
Enrico Ros e882358af4 Aix: +auto-UI, +auto-Diagram 2024-10-10 15:15:40 -07:00
Enrico Ros f86649fe02 Aix: Titles (simplify) 2024-10-10 15:15:34 -07:00
Enrico Ros 3892f0c82a Aix: rationalize non_abortable 2024-10-10 15:15:32 -07:00
Enrico Ros da2266fcfe ReAct: port to V2 - now Stops, all llms, proper error handling, llm in state, works great! 2024-10-10 15:15:05 -07:00
Enrico Ros 7bf6c9c77a AIX: remove undefined from outgoing superjson's 2024-10-10 15:14:31 -07:00
Enrico Ros 27f031eb57 Notify: remember state for new messages. 2024-10-09 16:51:14 -07:00
Enrico Ros 7ce58fb594 TimeUtils: fix buckets 2024-10-09 16:51:14 -07:00
Enrico Ros bc0f6a4cd2 BlockPartError: un-bold 2024-10-08 23:58:05 -07:00
Enrico Ros 0b3b2860bb Fix fenced block parsing. 2024-10-08 20:07:08 -07:00
Enrico Ros a21342384e Anthropic: update models. 2024-10-08 16:51:03 -07:00
Enrico Ros 79bb6f07c9 AutoBlocks: relax end-of-block parser, removing spaces and tabs, but not newlines 2024-10-08 16:50:58 -07:00
Enrico Ros 80f77aee4e Show that a message Stopped on !Zen 2024-10-08 16:50:52 -07:00
Enrico Ros b0b3bcbf61 Anthropic: auto-caching indicators only on Extra 2024-10-08 16:50:29 -07:00
Enrico Ros f83d6ca4ac Smallfixes 2024-10-08 16:50:09 -07:00
Enrico Ros 2c6a9fbea6 Dev: rewrite conventions. 2024-10-08 16:49:55 -07:00
Enrico Ros df945dc36b RenderImage: support onClick 2024-10-06 21:02:07 -07:00
Enrico Ros b6eccbf860 Attachment Menu Chips: fix div 2024-10-06 21:00:27 -07:00
Enrico Ros 4332d21637 Onboard: unfilter models selector 2024-10-06 20:59:57 -07:00
Enrico Ros b0809734aa Fix mimetype change on conversions 2024-10-06 20:59:28 -07:00
Enrico Ros 74ed8c9e5e Code: option to show line numbers also in 'Pro', not just 'Extra' 2024-10-06 20:53:20 -07:00
Enrico Ros 98b1d5068b AIX: update context wiretypes 2024-10-06 20:53:06 -07:00
Enrico Ros 07cc34ba2b Radically improve model preference. 2024-10-05 08:53:30 -07:00
Enrico Ros 239867d8c5 Roll packages 2024-10-05 08:27:44 -07:00
Enrico Ros aa31d92986 autotitle: clear when clearing usertitle 2024-10-04 11:26:26 -07:00
Enrico Ros f012b99b17 Adjust all Vendors ranks 2024-10-04 11:26:22 -07:00
Enrico Ros d5fd66f07c AutoConf w/ rerank of Vendors 2024-10-04 11:26:19 -07:00
Enrico Ros f07c19f69c View images: improve margin 2024-10-04 11:25:56 -07:00
Enrico Ros 5541a4e531 Anim: enter Models Modal 2024-10-04 11:25:24 -07:00
Enrico Ros 3055fe9347 Anim: reorg 2024-10-04 11:25:14 -07:00
Enrico Ros 369324ad5d Container Layout 2024-10-04 11:24:59 -07:00
Enrico Ros 4e5b1f1306 Sync scores 2024-10-04 11:24:35 -07:00
Enrico Ros 81c70b21b9 Roll packages 2024-10-04 11:23:37 -07:00
Enrico Ros 44a00df49d Move to user-defined personas configuration. 2024-10-04 11:23:05 -07:00
Enrico Ros 8754bbada9 Will be replaced. 2024-10-04 11:22:13 -07:00
Enrico Ros f37cdcb20c Need to fix this. 2024-10-04 11:16:34 -07:00
Enrico Ros 393e19dda9 Vercel: fix timeout 2024-10-03 12:37:21 -07:00
Enrico Ros 766cc06206 Vercel: fix timeout 2024-10-03 12:34:26 -07:00
Enrico Ros 710f03d037 OpenAI: remove gpt4 list ref 2024-10-02 19:51:50 -07:00
Enrico Ros ec956da51c Progressive Disclosure: increase time 2024-10-02 19:50:51 -07:00
Enrico Ros da3dddf502 RenderImageURL: adjust shadow 2024-10-02 19:50:21 -07:00
Enrico Ros 77efabb883 Disable filters for now 2024-10-02 19:49:59 -07:00
Enrico Ros 116415b238 Fullscreen render code line numbers. 2024-10-02 19:49:52 -07:00
Enrico Ros dd33e3ea28 Fix. 2024-10-01 23:50:18 -07:00
Enrico Ros ad703f9483 Remove FuncLLM. 2024-10-01 23:49:28 -07:00
Enrico Ros 9058c2d2fa Integrate Aider prompts: Convert to JavaScript and add Apache 2.0 licensing. 2024-10-01 23:49:08 -07:00
Enrico Ros 3cd2b29a37 Prod: fixes 2024-10-01 18:50:11 -07:00
Enrico Ros 51cd6a7e07 Text 2024-10-01 18:05:54 -07:00
Enrico Ros 30fe814eb1 Show costs wherever available. 2024-10-01 18:04:00 -07:00
Enrico Ros ff0ea188c1 OpenAI: support for costs and saving calculation 2024-10-01 17:38:42 -07:00
Enrico Ros 34c6129d25 OpenAI: update wiretypes 2024-10-01 16:16:14 -07:00
Enrico Ros 0378eb8f1e OpenAI: add caching info 2024-10-01 14:54:18 -07:00
Enrico Ros d09d4455aa Improve Fast LLM auto-select (py price) 2024-10-01 14:19:15 -07:00
Enrico Ros dcce5a5b1d OpenAI: update Elos. 2024-10-01 12:56:58 -07:00
Enrico Ros 2f856e64bb OpenAI: add realtime 2024-10-01 12:41:49 -07:00
Enrico Ros cd8c931df8 OpenAI: update models 2024-10-01 12:41:42 -07:00
Enrico Ros cefe208abd OpenAI: mark the prompt caching models 2024-10-01 11:25:11 -07:00
Enrico Ros 0e566edf42 OpenAI: extract models 2024-10-01 11:12:46 -07:00
Enrico Ros 8c735e971e Group labels fix. 2024-09-29 14:17:27 -07:00
Enrico Ros 48740c7183 Improve regex 2024-09-29 02:56:39 -07:00
Enrico Ros 1ec2acd250 Improve Steam. 2024-09-28 14:48:30 -07:00
Enrico Ros b572c6d962 Improve Steam. 2024-09-28 14:21:44 -07:00
Enrico Ros 01197952f4 Screenshare on Safari: add notices about a 60 seconds processing bug (no upstream safari reference yet). 2024-09-28 12:36:01 -07:00
Enrico Ros f94240110d Charts: try-expand 2024-09-28 11:32:43 -07:00
Enrico Ros 7a139e50c5 Aix: improve FC error messaging 2024-09-28 11:32:43 -07:00
Enrico Ros d11a38db83 Proper transparent BG 2024-09-28 11:14:06 -07:00
Enrico Ros 9f10ed1930 Revert "FF: Tryzoom"
This reverts commit 98f8117b
2024-09-28 10:51:01 -07:00
Enrico Ros 8a9e2151b8 Bits 2024-09-28 10:50:44 -07:00
Enrico Ros 98f8117b50 FF: Tryzoom 2024-09-28 10:45:30 -07:00
Enrico Ros 21d2d7be30 FF: Fixup shift to omit background 2024-09-28 10:24:44 -07:00
Enrico Ros 3a644ec4d5 FF: Fixup with Chat llm 2024-09-28 10:13:47 -07:00
Enrico Ros 4cd7936bf3 Fix edit mode for Fixmode 2024-09-27 18:49:29 -07:00
Enrico Ros 19769c8238 Fix chart copy on Safari 2024-09-27 18:30:04 -07:00
Enrico Ros 7ecd1aa371 Misc 2024-09-27 18:29:19 -07:00
Enrico Ros 9cd5194629 Shortcuts: priorities 2024-09-27 18:01:57 -07:00
Enrico Ros a2cda7e791 DataStreamViz: clear canvas 2024-09-27 17:48:09 -07:00
Enrico Ros 1084e3d5e2 DMessage: duplicate without Placeholders 2024-09-27 17:47:53 -07:00
Enrico Ros 7aa02e91c8 Capy 2024-09-27 17:28:11 -07:00
Enrico Ros 35b9bbf0e6 Gemini: fix parsing 2024-09-27 17:28:11 -07:00
Enrico Ros 2ae834366c Messaging 2024-09-27 17:28:11 -07:00
Enrico Ros cdd08b5df3 Fixup: allow thinking before fixing 2024-09-27 17:28:11 -07:00
Enrico Ros 3d566aa102 Clipboard: explain copy errors 2024-09-27 17:28:11 -07:00
Enrico Ros b110580123 Data: updata proompt 2024-09-27 17:28:11 -07:00
Enrico Ros 7df767119b AIX: Temperature override 2024-09-27 17:28:11 -07:00
Enrico Ros 17008c30f6 Disable opacity, as the colors already are sort of premultiplied 2024-09-27 17:28:11 -07:00
Enrico Ros 1efd9bc55a Steam Viz. 2024-09-27 00:28:05 -07:00
Enrico Ros 1e7b77928f Attachments: view images better 2024-09-26 22:27:45 -07:00
Enrico Ros fc8c984cd4 Attachments: view images 2024-09-26 22:16:08 -07:00
Enrico Ros 23cf01d4b4 Attachments: allow to delete a single fragment 2024-09-26 19:54:02 -07:00
Enrico Ros 8dde79c607 Swap 2024-09-26 18:36:35 -07:00
Enrico Ros 78f409b056 Python: open in Colab 2024-09-26 18:35:00 -07:00
Enrico Ros fd4f1ae0c0 Blocks: reduce ABR usage. 2024-09-26 18:21:15 -07:00
Enrico Ros 93797afa7a Blocks: rationalize, reduce PH usage and ABR usage. 2024-09-26 18:14:29 -07:00
Enrico Ros 5242d09b53 Reduce CPPH 2024-09-26 15:54:14 -07:00
Enrico Ros d9cb9e6aed Improve Open in external editors. 2024-09-26 14:42:39 -07:00
Enrico Ros 913fa45e73 Increase FS contrast. 2024-09-26 13:34:16 -07:00
Enrico Ros b21bd47ea5 Minutiae 2024-09-26 13:28:20 -07:00
Enrico Ros 340c298572 FS and presenter mode 2024-09-26 13:21:38 -07:00
Enrico Ros 06e899343b Cleaner chat message menu 2024-09-26 12:35:40 -07:00
Enrico Ros 104b95a5a4 Fix send of partial while mic'ing 2024-09-26 12:19:28 -07:00
Enrico Ros 1d9b309552 Clean icons 2024-09-26 12:11:18 -07:00
Enrico Ros 7c3d7a8596 Proper edit mentions 2024-09-26 12:00:56 -07:00
Enrico Ros 966f57cb0e Proper reset on Beam/Merge 2024-09-26 11:53:08 -07:00
Enrico Ros 36260aaf8d Message stats on Beam/Merge 2024-09-26 11:34:47 -07:00
Enrico Ros 3158d5b340 Gemini 1.5 - also allow latest 2024-09-26 03:23:31 -07:00
Enrico Ros 938a896de3 Gemini 1.5 002 - Fix #648 2024-09-26 03:21:13 -07:00
Enrico Ros 7573f014d0 Gemini: update models 2024-09-26 03:16:10 -07:00
Enrico Ros 76b8a1582b LLMAttachmentButton: moved explanation 2024-09-26 01:43:53 -07:00
Enrico Ros 96acd7a307 LLMAttachmentButton: reduce ellipses 2024-09-26 01:43:53 -07:00
Enrico Ros a41688f378 LLMAttachmentButton: reorder 2024-09-26 01:43:52 -07:00
Enrico Ros ff9b1650f9 Bits 2024-09-26 01:43:52 -07:00
Enrico Ros 116bdcdd43 Chart: shift to add background 2024-09-25 22:26:56 -07:00
Enrico Ros bb8e7a283c Chart: good boy 2024-09-25 22:07:01 -07:00
Enrico Ros 825c565a24 Chart: improve fixup 2024-09-25 21:35:44 -07:00
Enrico Ros fe35c2ec82 Chart: apply theme 2024-09-25 21:35:38 -07:00
Enrico Ros 21451af9b3 Download/Copy chart images 2024-09-25 20:15:47 -07:00
Enrico Ros 0852dc5dc9 Add Download utils 2024-09-25 20:08:48 -07:00
Enrico Ros e90b71b2c2 Improve Camera & Screen capture format deliberacy. 2024-09-25 20:08:37 -07:00
Enrico Ros 6ea2674f35 Camera: switch to JPEG from PNG (4x smaller, neglegible loss, as it's a noisy source, and also rescaled) 2024-09-25 20:05:14 -07:00
Enrico Ros 62f809a8d3 Extract canvasUtils 2024-09-25 17:50:55 -07:00
Enrico Ros 0eb04a3f6a Misc 2024-09-25 17:44:35 -07:00
Enrico Ros 367894abc9 Charting @2x. 2024-09-25 17:36:43 -07:00
Enrico Ros febf758aa7 Typo 2024-09-25 16:54:10 -07:00
Enrico Ros a2407157d1 Undo partially. 2024-09-25 16:50:18 -07:00
Enrico Ros 6eccdf74d1 Charts: DPR*2 test 2024-09-25 16:26:09 -07:00
Enrico Ros 57ebb8f9fb AIX/tRPC: disable batching to stay under 1MB (Vercel limitation) 2024-09-25 15:14:36 -07:00
Enrico Ros 1d02079b09 Zustand: stabilize 2024-09-25 15:14:36 -07:00
Enrico Ros 6a7e9ea131 useDeep. 2024-09-25 02:23:30 -07:00
Enrico Ros 8c5a8d2044 Charts: removed devDependency 2024-09-25 02:04:09 -07:00
Enrico Ros 6d47b6024a Charts: User Fix. 2024-09-25 01:40:58 -07:00
Enrico Ros e7bd6f6746 Agi Code Fixup Framework 2024-09-25 01:19:18 -07:00
Enrico Ros d3a7e2a310 Blocks: propagate an inner replacement function 2024-09-24 23:27:20 -07:00
Enrico Ros d901cafe82 Roll implicits 2024-09-24 23:26:53 -07:00
Enrico Ros 77e374b92b Roll prisma 2024-09-24 23:26:53 -07:00
Enrico Ros 0989796f87 EnhancedRenderCode: auto-open 2024-09-24 20:24:13 -07:00
Enrico Ros 1e61998b50 ChartJS: improvements 2024-09-24 20:11:37 -07:00
Enrico Ros 4a896be01b ChartJS: defaults 2024-09-24 16:27:25 -07:00
Enrico Ros a44408c87c Aix: express the error 2024-09-24 16:16:54 -07:00
Enrico Ros 504d2b7c5a ChartJS: compress the generation code 2024-09-24 16:08:09 -07:00
Enrico Ros 9446f0b23d Improve ChartJS handling 2024-09-24 15:40:20 -07:00
Enrico Ros 671ba95975 Notification avatar. 2024-09-24 14:00:16 -07:00
Enrico Ros 6fc5acfeb9 Drop the charts module as-is, will fix later. 2024-09-24 10:03:15 -07:00
Enrico Ros 1236d7c1ac Fix shift+ctrl+enter on system/assistant messages. 2024-09-23 22:59:06 -07:00
Enrico Ros ef2ee9280d More visible tooltips 2024-09-23 15:36:03 -07:00
Enrico Ros 3e05f751e3 presentErrorToDevelopers 2024-09-23 14:08:56 -07:00
Enrico Ros b0f2ad6742 Drag in conversations 2024-09-23 14:06:59 -07:00
Enrico Ros 63a82a6da6 Drag in conversations 2024-09-23 14:01:44 -07:00
Enrico Ros 57082b23d8 Debug errors. 2024-09-23 12:31:19 -07:00
Enrico Ros 361511fc5d Roll packages. 2024-09-23 08:43:45 -07:00
Enrico Ros f81beb5cae Camera: done for real. 2024-09-22 15:36:55 -07:00
Enrico Ros 2318cd3329 Camera: done. 2024-09-22 15:34:48 -07:00
Enrico Ros 0fa3ea0ff6 Camera: flip better 2024-09-22 15:29:37 -07:00
Enrico Ros 00093e42be Camera: style 2024-09-22 15:29:32 -07:00
Enrico Ros cfa7ce2019 Camera: flip 2024-09-22 15:15:40 -07:00
Enrico Ros f1397eff4a Camera: final render 2024-09-22 14:59:11 -07:00
Enrico Ros 67a4a79a6c Camera: darker render 2024-09-22 14:37:20 -07:00
Enrico Ros 29fba943de Camera: lighter render 2024-09-22 14:23:11 -07:00
Enrico Ros 69e6fb4dbd Camera: lighter render 2024-09-22 12:55:27 -07:00
Enrico Ros 96cbd95996 Camera: relist devices on permissions change and devices change 2024-09-22 12:39:50 -07:00
Enrico Ros e88180a6f5 Camera: add button 2024-09-22 12:19:34 -07:00
Enrico Ros 6b817cde0a Camera: improve 2024-09-22 11:21:30 -07:00
Enrico Ros b7b7dfb4af Roll deps 2024-09-22 10:43:59 -07:00
Enrico Ros afdfb83fc8 Lints 2024-09-22 10:42:22 -07:00
Enrico Ros f3a1fa624a Fix 2024-09-22 10:35:17 -07:00
Enrico Ros 90c05ba2d9 .ignore 2024-09-22 10:33:55 -07:00
Enrico Ros de3aa4a5f7 Double-mode attachments 2024-09-22 10:33:14 -07:00
Enrico Ros 2258dee8c7 Change Models/Personas 2024-09-22 02:45:01 -07:00
Enrico Ros feec32b3ac Bits 2024-09-22 02:14:54 -07:00
Enrico Ros e189f30285 Notify on responses 2024-09-22 02:14:50 -07:00
Enrico Ros 58e97d20fd Dropdowns: shortcuts 2024-09-22 00:17:07 -07:00
Enrico Ros 378948e522 Optima Dropdowns: controllable 2024-09-22 00:11:17 -07:00
Enrico Ros a19804d450 Bits 2024-09-21 23:56:03 -07:00
Enrico Ros c445c36f84 Composer: improve showing actions 2024-09-21 23:36:23 -07:00
Enrico Ros fa9886e2dc Composer: quality cleanup 2024-09-21 23:29:41 -07:00
Enrico Ros b7c7609ac4 Attachment Compatibility: Send & Beam 2024-09-21 23:03:17 -07:00
Enrico Ros 217a40c19c Keep the image attachments while editing text 2024-09-21 03:24:31 -07:00
Enrico Ros 5cb568023b Correct duplication. 2024-09-21 02:44:00 -07:00
Enrico Ros 8ced2593ff Safari: preliminary workaround for WebP encoding issues 2024-09-20 15:48:57 -07:00
Enrico Ros 4db373e46e Disambiguate Clone and Branch 2024-09-20 15:00:18 -07:00
Enrico Ros 79a870a752 Aix: potentially fix a beam issue 2024-09-20 03:44:23 -07:00
Enrico Ros e6d68a4970 Aix: debug abort status 2024-09-20 03:44:03 -07:00
Enrico Ros 3087e2316f Aix: debug abort status 2024-09-20 03:43:54 -07:00
Enrico Ros c59a7cc0bc Aix: remove stopped empty messages 2024-09-20 03:43:40 -07:00
Enrico Ros c948b58eb5 Aix: all for a dot-dot-dot 2024-09-20 03:05:12 -07:00
Enrico Ros fde57ca12d Aix: push throttling down a level 2024-09-20 02:44:00 -07:00
Enrico Ros e9cebe435a Pricing: note on Perplexity's per-request 2024-09-20 01:40:14 -07:00
Enrico Ros 3280a58dd0 Perplexity: updated models. Fixes #642. 2024-09-20 01:38:52 -07:00
Enrico Ros 597214b955 Perplexity: move models. 2024-09-20 01:32:10 -07:00
Enrico Ros d43f84e31e Docs: begin a Tips & Tricks (will add to it over time) 2024-09-20 01:26:13 -07:00
Enrico Ros 7ad118d51b Aix: push down the pendingIncomplete 2024-09-20 01:00:22 -07:00
Enrico Ros d980d97227 Aix: continue cleanup 2024-09-20 00:32:28 -07:00
Enrico Ros ee7c1cc12b Metrics: cleanups 2024-09-20 00:28:13 -07:00
Enrico Ros 94200cfc6d Aix: continued client renaming 2024-09-19 23:24:26 -07:00
Enrico Ros 8c5a2bce0d Aix: improve Low-Level 2024-09-19 23:08:36 -07:00
Enrico Ros 259505190b More uniform configuration 2024-09-19 21:38:57 -07:00
Enrico Ros e407eba674 Aix: move code away from the client 2024-09-19 21:37:09 -07:00
Enrico Ros 13462b6b71 Fix order of precedence of esc for chat stop vs mic 2024-09-19 20:52:53 -07:00
Enrico Ros 15661b3b8c User-Attach data personas: Fix auto-select of the first converter. 2024-09-19 20:34:00 -07:00
Enrico Ros b97c4c5a43 FF: PDF multimodal 2024-09-19 18:04:20 -07:00
Enrico Ros aeda478d51 FF: Fix Safari Attachment appearance 2024-09-19 16:05:05 -07:00
Enrico Ros 9bd6b12789 Unzero. 2024-09-19 15:01:57 -07:00
Enrico Ros 476a212ee8 LiveFile: doc update2 2024-09-19 13:38:13 -07:00
Enrico Ros 0470285338 LiveFile: doc update 2024-09-19 13:34:13 -07:00
Enrico Ros ab28ae2940 LiveFile: doc 2024-09-19 13:31:55 -07:00
Enrico Ros 169fa86ec4 Composer: mic: autoscroll and perfect match 2024-09-19 12:10:27 -07:00
Enrico Ros cafd491e35 Merge remote-tracking branch 'origin/main' into big-agi-2
# Conflicts:
#	docs/README.md
#	docs/environment-variables.md
2024-09-19 11:35:38 -07:00
Enrico Ros b8ae9648e6 LiveFile: unsupported on Safari 2024-09-19 11:23:59 -07:00
Enrico Ros 0de8d5dd1c Sel: resilient and not logging 2024-09-19 11:22:15 -07:00
Enrico Ros 356b15a3ea Sel: resilient 2024-09-19 11:20:22 -07:00
Enrico Ros 2002255c07 o1: port refer to 2024-09-19 11:08:47 -07:00
Enrico Ros b19a4be485 Sel fixes 2024-09-19 11:08:36 -07:00
Enrico Ros eec845486d FF: Mic Placeholder 2024-09-19 04:22:00 -07:00
Enrico Ros 29f7224b22 Roll deps 2024-09-19 01:56:31 -07:00
Enrico Ros e7a4c92e61 FF: Open Files debug 2024-09-19 01:56:09 -07:00
Enrico Ros 4d59ba6797 Mistral: update models 2024-09-18 21:05:07 -07:00
Enrico Ros acae4c31ab Editing: Don't disappear docs 2024-09-18 20:40:03 -07:00
Enrico Ros f1449b60e2 Mistral: update models and pricing 2024-09-18 20:29:24 -07:00
Enrico Ros 32739fa15c Mistral: update models and pricing 2024-09-18 20:28:45 -07:00
Enrico Ros fff385b5e8 Pmix supports a {{LowRL:...}} for models to deeply steer 2024-09-18 20:07:44 -07:00
Enrico Ros 40faa35678 Roll Mermaid 10 -> 11 2024-09-18 20:06:15 -07:00
Enrico Ros 78af46ed4a Perfect Data Analyst 2024-09-18 18:31:31 -07:00
Enrico Ros ea94fc2185 Perfect Data Analyst 2024-09-18 18:27:27 -07:00
Enrico Ros c8abb75194 Reorder Data Analyst 2024-09-18 18:10:51 -07:00
Enrico Ros 6a59ad338d Prompt Examples can require user attachments. This includes a neat files-auto-convert-to-fragments immediate pipeline. 2024-09-18 18:06:20 -07:00
Enrico Ros 40aa737480 Personas: auto-expand examples on Extra 2024-09-18 18:01:49 -07:00
Enrico Ros 717a6c90ef openFilesForAttaching: await completion (may mean full conversion and AI processing) 2024-09-18 17:53:47 -07:00
Enrico Ros f4b1b292b7 Data Analysis persona 2024-09-18 17:49:43 -07:00
Enrico Ros 446df24f5a HTML pmix 2024-09-18 17:49:14 -07:00
Enrico Ros 39ab5cabf1 Personas: allow for user-action personas 2024-09-18 17:06:13 -07:00
Enrico Ros 2671ff1228 Examples: improve on mobile 2024-09-18 17:05:40 -07:00
Enrico Ros 1932c31c35 Move Modals 2024-09-18 15:59:45 -07:00
Enrico Ros 9b1b6ebceb Roll next 2024-09-18 14:51:29 -07:00
Enrico Ros f683d263ad o1 hotfix for images 2024-09-18 14:13:32 -07:00
Enrico Ros 53c87cc560 Typo 2024-09-18 14:13:07 -07:00
Enrico Ros 63c90dc70d LLM shortnames 2024-09-18 13:54:48 -07:00
Enrico Ros 20927d4da6 Shiftclick on llm 2024-09-18 13:54:19 -07:00
Enrico Ros e1664458c5 Edit: shift-doubleclick to quickly edit any fragment 2024-09-18 12:43:18 -07:00
Enrico Ros 09da682bcf Better shiftlogs 2024-09-18 12:42:52 -07:00
Enrico Ros ac70a7d8c2 Edit: margin 2024-09-18 12:16:28 -07:00
Enrico Ros 638155eae7 Edit: consistent placement 2024-09-18 12:16:21 -07:00
Enrico Ros 782c0cf172 Link help-feature-microphone to the README 2024-09-17 16:22:17 -07:00
Enrico Ros c3b907f94c Improve bubble 2024-09-17 15:49:11 -07:00
Enrico Ros 78a773dec7 support for strikethrough 2024-09-17 15:43:55 -07:00
Enrico Ros b1ffe04ccb show Free (local) chats 2024-09-17 14:51:56 -07:00
Enrico Ros cf9568aaa0 Fix thinking message 2024-09-17 14:51:40 -07:00
Enrico Ros 5e2d609332 Roll packages, incl. pdfjs, tesseract 2024-09-17 14:19:25 -07:00
Enrico Ros 1962f119e5 FF: Speech reco Typo. 2024-09-17 13:43:25 -07:00
Enrico Ros 06d2bf2ba5 Update help-feature-microphone.md 2024-09-17 11:30:39 -07:00
Enrico Ros 9b902e0f8b Update help-feature-microphone.md 2024-09-17 11:29:50 -07:00
Enrico Ros 05e74a7cd8 Update help-feature-microphone.md 2024-09-17 02:50:04 -07:00
Enrico Ros 4ea0d3b974 FF: Safari fix. 2024-09-17 01:59:40 -07:00
Enrico Ros 0b1a914015 FF: Speech reco comments. 2024-09-17 01:56:15 -07:00
Enrico Ros 6c405c3807 FF: Speech reco fixes. 2024-09-17 01:53:54 -07:00
Enrico Ros 49cbda39b8 Improve Browser/OS clustering 2024-09-17 01:53:46 -07:00
Enrico Ros f9d511c4b4 FF: Microphone update. 2024-09-16 16:47:13 -07:00
Enrico Ros 30c7421877 FF: Microphone help. 2024-09-16 13:47:20 -07:00
Enrico Ros 91a5878460 Help: microphone troubleshooting. 2024-09-16 13:08:36 -07:00
Enrico Ros 1af77749e9 FF: Microphone support. More debuggable. 2024-09-16 13:07:51 -07:00
Enrico Ros d3fdd5f85a FF: Sidebar: Better Icon 2024-09-15 23:59:42 -07:00
Enrico Ros f5c819f576 Cam ok. 2024-09-15 23:26:34 -07:00
Enrico Ros 4640b13195 Fix chat bubble and camera 2024-09-15 23:12:53 -07:00
Enrico Ros 52a89c3d76 Proper highlight 2024-09-15 22:18:09 -07:00
Enrico Ros a92b605c25 Note on #631. 2024-09-15 20:08:13 -07:00
Enrico Ros 2de8a8f2c0 Bits. 2024-09-15 20:07:52 -07:00
Enrico Ros 9e5f332dc6 Untangle #596 2024-09-15 20:00:01 -07:00
Enrico Ros fce21ad8eb Merge pull request #629 from darshmashru/patch-1
Fixed a redirection link typo
2024-09-15 00:12:51 -07:00
Enrico Ros 36b4ee9589 Reasoning costs breakdown for o1-preview, o1-mini support. 2024-09-14 13:37:41 -07:00
Enrico Ros ec24b70d81 Full o1-preview, o1-mini support. 2024-09-14 12:57:04 -07:00
Enrico Ros b3c2794a60 Attach: Camera icon smaller on mobile 2024-09-13 22:20:26 -07:00
Enrico Ros 194115231a Roll tiktoken and zustand 2024-09-13 17:19:36 -07:00
Enrico Ros 175015eade Roll packages 2024-09-13 17:15:58 -07:00
Enrico Ros 6ce3cf9e29 Roll next 2024-09-13 17:08:31 -07:00
Enrico Ros 8358949c9b FF: Roll tRPC to fix the "invalid response or stream interrupted." issue - bug: unstable_httpBatchStreamLink gets broken when resolver returns null 2024-09-13 17:05:31 -07:00
Enrico Ros 78d8b69bc7 Attach: restart on non-assistant 2024-09-13 17:02:22 -07:00
Enrico Ros 80a5cca30e Attach: File 2024-09-13 17:02:13 -07:00
Enrico Ros 21e7756a74 Attach: Camera icon just under the mic on mobile 2024-09-13 16:43:55 -07:00
Enrico Ros b1b23e7c4e Merge branch 'main' into big-agi-2
# Conflicts:
#	src/modules/llms/server/openai/models.data.ts
2024-09-13 14:14:41 -07:00
Enrico Ros bfa73ec6c5 Merge branch 'main-stable' 2024-09-13 14:10:08 -07:00
Enrico Ros 39c5c7c9ba Call out to Big-AGI 2 2024-09-13 14:06:12 -07:00
Enrico Ros e64a5e59ef 1.16.8 Release 2024-09-13 13:50:00 -07:00
Enrico Ros 574c2cf0e3 Call out to Big-AGI 2 2024-09-13 13:49:11 -07:00
Enrico Ros 1d3321b336 OpenAI: o1 support label 2024-09-13 11:02:33 -07:00
Enrico Ros de25e5822d OpenAI: o1 relabel 2024-09-13 10:59:40 -07:00
Enrico Ros 6a904c9f37 OpenAI: 3.5 non legacy 2024-09-13 10:59:32 -07:00
Enrico Ros 30c3283572 OpenAI: add o1 2024-09-13 10:53:42 -07:00
Enrico Ros 10bba19079 OpenAI: add ChatGPT-4o-latest 2024-09-13 10:53:32 -07:00
Enrico Ros 713079f2f2 OpenAI: bits 2024-09-13 10:53:20 -07:00
Enrico Ros 6e16e989ac OpenAI: move 4o-mini 2024-09-13 10:53:09 -07:00
Enrico Ros 4e89e0b1e4 OpenAI: clean IDs 2024-09-13 10:52:19 -07:00
Enrico Ros 6067c289ab OpenAI: remove vision previews 2024-09-13 10:52:00 -07:00
Enrico Ros 508c4bf80c Merge branch 'main' into big-agi-2
# Conflicts:
#	src/modules/llms/server/openai/models.data.ts
2024-09-13 10:24:47 -07:00
Enrico Ros 93b03bf87c Merge branch 'main-stable' 2024-09-13 10:21:27 -07:00
Enrico Ros 32ebfea9cb OpenAI: reorder 2024-09-13 10:20:52 -07:00
Darsh Mashru f1f28bca61 Fixed a redirection link typo
Changed "config-local-ollama" to "config-local-ollama.md" in link
2024-08-27 22:32:11 +05:30
Enrico Ros 1960e0bb3a Prod: fix titles 2024-08-27 03:07:35 -07:00
Enrico Ros 362eb46a7a Prod: document notImplemented() 2024-08-26 01:08:38 -07:00
Enrico Ros 9d86c30267 Prod: Better Pane 2024-08-26 01:04:56 -07:00
Enrico Ros 7a34fb4aba Prod: Chat Pane 2024-08-26 00:07:25 -07:00
Enrico Ros f3ccb46570 Prod: More panel improvements 2024-08-25 23:52:27 -07:00
Enrico Ros 2c60571702 Prod: Improve Panel 2024-08-25 23:29:24 -07:00
Enrico Ros 4c073202c0 Prod: Improve Restart & messaging 2024-08-25 23:29:04 -07:00
Enrico Ros 015534dbeb Optima: route the app menu to the optima panel, on mobile and when the app requests it 2024-08-25 03:57:56 -07:00
Enrico Ros 2ca0f0fc1c Optima: More Panel 2024-08-25 03:00:21 -07:00
Enrico Ros 7bea2a8191 Optima: Panel 2024-08-25 02:42:31 -07:00
Enrico Ros e828aa8580 Optima: appMenu rename, add panel 2024-08-25 02:21:35 -07:00
Enrico Ros b4285832e5 Optima: reorg 2024-08-25 02:07:41 -07:00
Enrico Ros f5a2313e46 Arrow 2024-08-24 21:01:14 -07:00
Enrico Ros 1ae14e94ae Prod: avatar label tooltip 2024-08-24 16:31:30 -07:00
Enrico Ros f396ce189a Prod: txt 2024-08-24 15:02:48 -07:00
Enrico Ros e83ae9150c Prod: fix share icons 2024-08-24 15:01:16 -07:00
Enrico Ros a93f99d5a2 Reorder 2024-08-24 05:24:21 -07:00
Enrico Ros fb055b6cf6 LFS: mention patch, but don't show it 2024-08-24 05:22:31 -07:00
Enrico Ros ce2f327b79 Allow for Bold edits 2024-08-24 05:12:49 -07:00
Enrico Ros 15694a59ba Improve PlantUML/Mermaid error messages 2024-08-24 05:03:46 -07:00
Enrico Ros 54e890b8e2 Anthropic: default to saving money 2024-08-24 04:44:27 -07:00
Enrico Ros efbbc8ec43 LiveEnhance: false by default 2024-08-24 04:41:12 -07:00
Enrico Ros cec3065830 Beam: fix generators 2024-08-24 04:40:55 -07:00
Enrico Ros 9b98c43b92 --!AIX;
remove much pre-AIX code.
2024-08-24 04:39:53 -07:00
Enrico Ros 0603a48e1e Beam: multimodal output, re-beam the correct model 2024-08-24 04:32:53 -07:00
Enrico Ros e001fc5449 Beam: port to AIX 2024-08-24 03:44:51 -07:00
Enrico Ros b0c46f4fe8 Improve render code menu 2024-08-24 03:35:46 -07:00
Enrico Ros f2f9365d64 Nothing 2024-08-23 00:40:59 -07:00
Enrico Ros c62423d7e3 Agi: what can I do? (I've been thinking about you) 2024-08-22 17:11:42 -07:00
Enrico Ros f4e488d658 Aix: disable different abort checks 2024-08-22 15:23:55 -07:00
Enrico Ros 87b57ff8ac Metrics: type 2024-08-22 04:34:12 -07:00
Enrico Ros e13070e15c Metrics: display Anthropic savings 2024-08-22 04:24:25 -07:00
Enrico Ros c4ce659c88 Aix: fix warning on abort while fetching hasn't completed 2024-08-22 04:12:45 -07:00
Enrico Ros 3e4a6432f0 Aix: fix Anthropic cached metrics presence 2024-08-22 02:28:40 -07:00
Enrico Ros 721fc0a33f Aix: fix full-stack 2024-08-22 02:28:40 -07:00
Enrico Ros 7354ff4023 Aix: select metrics for Aix CG 2024-08-21 23:15:30 -07:00
Enrico Ros a70e31e199 Fix Fred's demo 2024-08-21 23:01:02 -07:00
Enrico Ros 2958b2a96a AIX: large Client API improvement. Add DMessageGenerator (Aix)
Fix a number of bugs, including the last packet from the reassembler being ignored.
2024-08-21 04:37:25 -07:00
Enrico Ros a4ccd53ccc Support hiding messages from the AI 2024-08-20 17:15:29 -07:00
Enrico Ros dd428f433c Aix: begin clean 2024-08-20 15:40:28 -07:00
Enrico Ros 8f577396d5 Vnd.Ant.Cache: done 2024-08-20 14:47:15 -07:00
Enrico Ros 4ca7b60162 Vnd.Ant.Cache: only when > 1000 tokens 2024-08-20 14:38:07 -07:00
Enrico Ros 48b85edf20 Vnd.Ant.Cache: explain auto-cache in the menu 2024-08-19 22:43:46 -07:00
Enrico Ros f9980deac4 Vnd.Ant.Cache: proper Auto-Caching: in-proto, pre-submit, w/+manual, immediate setting, any-submit, remove pmix time 2024-08-19 15:22:03 -07:00
Enrico Ros 9dda4ff241 reduce usage of useModelsStore 2024-08-19 13:57:48 -07:00
Enrico Ros 3ad83f79ff Debug 2024-08-19 13:12:36 -07:00
Enrico Ros 3361fb3921 Aix: User Breakpoint full support. Supported by Anthropic. 2024-08-18 03:14:52 -07:00
Enrico Ros 25b88237a0 Anthropic cache breakpoint: UI and DMessage support (as a User Flag) 2024-08-18 02:06:47 -07:00
Enrico Ros bb20234a74 Vendors: instanceLimit optional, and 1 by default 2024-08-18 02:01:24 -07:00
Enrico Ros 88bf939d23 ChatMessage: Try ListItem -> Box 2024-08-18 02:01:24 -07:00
Enrico Ros 7c1d2cad66 Begin of Metrics 2024-08-18 02:01:24 -07:00
Enrico Ros 71f5ab96d4 Models: support breakpoints 2024-08-18 02:01:24 -07:00
Enrico Ros 746dd0ad05 DConversation: min 2024-08-17 23:43:41 -07:00
Enrico Ros d4324a8ba9 DMessage: cleanups 2024-08-17 23:42:19 -07:00
Enrico Ros 2550f345fc DMessage: flag 2024-08-17 23:30:13 -07:00
Enrico Ros 8d6ae13d65 Close post-dialog 2024-08-17 23:26:09 -07:00
Enrico Ros 1df31946c2 Come on 2024-08-17 23:13:14 -07:00
Enrico Ros 79108537d7 Even more vars update 2024-08-17 23:03:25 -07:00
Enrico Ros 5f61ccb6c3 More vars update 2024-08-17 23:00:49 -07:00
Enrico Ros 02739a9951 Tokens: update vars 2024-08-17 22:59:17 -07:00
Enrico Ros af49ee72b6 ERC: Save As 2024-08-17 20:05:40 -07:00
Enrico Ros 47b146aa38 fix padding 2024-08-17 16:26:18 -07:00
Enrico Ros 9ae8542100 ERC: /all 2024-08-17 16:18:21 -07:00
Enrico Ros 77596ffdfb Share: shorter IDs 2024-08-17 16:12:11 -07:00
Enrico Ros 07665ece59 Share: fix workspace 2024-08-17 16:12:11 -07:00
Enrico Ros c1fbd72785 Cleanup rate limiter 2024-08-17 15:46:22 -07:00
Enrico Ros ae43a1d8af Good metrics for non-streaming too: 2024-08-17 15:30:22 -07:00
Enrico Ros 6265868658 Chat Generation metrics: 2024-08-17 15:20:35 -07:00
Enrico Ros c6d4f2834e Non-linear pricing support. 2024-08-17 03:26:59 -07:00
Enrico Ros 77777da122 Rewind (no one's got time for this) 2024-08-17 02:52:40 -07:00
Enrico Ros 93ac4d59a3 Try to centralize - yet doesn't build 2024-08-17 02:42:17 -07:00
Enrico Ros e483050608 AIX: Define ListModels' output, and use it everywhere 2024-08-17 02:15:36 -07:00
Enrico Ros 4f1afc3221 Models Pricing: update all 2024-08-17 02:06:14 -07:00
Enrico Ros c098afe818 React deps 2024-08-16 23:53:59 -07:00
Enrico Ros 21045f5e72 Refactor: Source to Service, and move the store 2024-08-16 23:53:02 -07:00
Enrico Ros e827e9810a Gfx bug 2024-08-16 04:39:22 -07:00
Enrico Ros 9bc6fd6ad1 AIX: Anthropic: update pricing #623 2024-08-16 04:12:32 -07:00
Enrico Ros 590843f2a5 AIX: Anthropic: Disable breakpoint on the system message. Too short for typical chats (for now). #623 2024-08-16 04:11:50 -07:00
Enrico Ros d4bba26a2b AIX: Anthropic: Model-Driven Auto-Prompt-Caching. Fixes #623
Note: if there aren't enough tokens in the chat, the Anthropic API will throw. Nothing to do there for now.
We will wait for Anthropic to step in and fix the issue before fixing something on our end that's clearly not our issue.
2024-08-16 03:48:29 -07:00
Enrico Ros b591e1ab64 FormLabel: tooltips: top & arrow 2024-08-16 03:20:31 -07:00
Enrico Ros 245add3e15 Revert "Anthropic: fix #618" - Anthropic came out with Caching/Cost reduction and this gets in the way.
This reverts commit dfe6d3cf72.
2024-08-16 03:08:34 -07:00
Enrico Ros 42c8095665 Style fix 2024-08-16 02:21:26 -07:00
Enrico Ros 17f7057ec3 ChatMessage: bits 2024-08-16 00:05:31 -07:00
Enrico Ros c4a6f60562 ChatMessage: marking done 2024-08-16 00:00:35 -07:00
Enrico Ros 0faf0c4422 ChatMessage: improve selection matching 2024-08-15 23:29:34 -07:00
Enrico Ros e6163d227a ChatMessage: add highlighting 2024-08-15 22:53:25 -07:00
Enrico Ros 81bbd9f4f5 ChatMessage: improve sel matching 2024-08-15 22:52:46 -07:00
Enrico Ros 380e5fa664 ChatMessage: improve fragments bucket splitting 2024-08-15 22:52:26 -07:00
Enrico Ros ebfc67ed4a Fix render bug 2024-08-15 21:19:09 -07:00
Enrico Ros 1a215390e2 Render of highlighted Markdown 2024-08-15 20:33:47 -07:00
Enrico Ros 8f9d5cd5d7 Markdown: reorder renderers 2024-08-15 19:42:21 -07:00
Enrico Ros 128b259288 LFS: Overwrite (simple) 2024-08-15 18:12:41 -07:00
Enrico Ros e96c9247c3 Prioritize shortcut matching by level 2024-08-14 13:51:10 -07:00
Enrico Ros a7812b7bb9 Esc to cancel gen 2024-08-14 13:47:53 -07:00
Enrico Ros 2f7de4f43b Fix shift+ctrl+enter, big times 2024-08-14 13:30:37 -07:00
Enrico Ros cbcdb8a572 Mimes: add Python Notebooks support 2024-08-14 12:53:19 -07:00
Enrico Ros 6ed57cca24 ERC x LFS: extract patching hook 2024-08-14 02:42:59 -07:00
Enrico Ros 8fa7181a6d Rename folder 2024-08-14 02:05:46 -07:00
Enrico Ros 7400a03ee8 ERC x LFS: begin process 2024-08-14 01:53:51 -07:00
Enrico Ros 1df2b82c56 ERC x LFS: patch box 2024-08-14 01:40:41 -07:00
Enrico Ros 136dcbcd4c ERC x LFS: begin wire 2024-08-14 01:30:54 -07:00
Enrico Ros 29f9f22eff ERC x LFS: UX update2 2024-08-14 01:10:34 -07:00
Enrico Ros b5308caea1 ERC x LFS: UX update 2024-08-14 00:59:09 -07:00
Enrico Ros 0bb4fd4517 ERC x LFS: workspace supports d/d 2024-08-14 00:44:46 -07:00
Enrico Ros c745aae281 ERC x LFS: pick an additional file 2024-08-14 00:06:12 -07:00
Enrico Ros 9194b3b5f5 ERC x LFS: select new files 2024-08-13 23:48:55 -07:00
Enrico Ros 12c5c0a058 ERC x LFS: microstrings 2024-08-13 23:33:10 -07:00
Enrico Ros 04a96e47d7 ERC x LFS: superstrings 2024-08-13 23:32:07 -07:00
Enrico Ros 4ddaa75880 ERC x LFS: strings 2024-08-13 23:27:27 -07:00
Enrico Ros 085ff56654 ERC x LFS: disable auto-pick 2024-08-13 23:24:43 -07:00
Enrico Ros 5251232319 Draw: disclaimer 2024-08-13 23:11:41 -07:00
Enrico Ros 72fb677087 OpenPipe: updated the models list endpoint 2024-08-13 22:55:20 -07:00
Enrico Ros 23be99aef7 LF: note about the former 500ms coalesce idea 2024-08-13 22:52:11 -07:00
Enrico Ros 9f5093bf32 LF: reload from disk 2024-08-13 15:05:40 -07:00
Enrico Ros f386cf9b1b Fix code buttons on mobile 2024-08-13 15:02:32 -07:00
Enrico Ros 6e1bb66dbf LFS: disable on iPhone 2024-08-13 14:40:29 -07:00
Enrico Ros 1c0b8120e5 LFS: disable on Android. 2024-08-13 14:40:05 -07:00
Enrico Ros d342220b09 LFS: debug on Android. 2024-08-13 14:28:26 -07:00
Enrico Ros 1c09786d37 EnhancedRenderCode x LiveFileSync: move picker 2024-08-13 02:35:04 -07:00
Enrico Ros 694cd7483e EnhancedRenderCode x LiveFileSync: Apply To 2024-08-13 02:18:26 -07:00
Enrico Ros aeb6aa52e8 EnhancedRenderCode x LiveFileSync: update 2024-08-13 01:58:59 -07:00
Enrico Ros 04938c80f2 EnhancedRenderCode x LiveFileSync: extract WorkspaceLiveFilePicker 2024-08-13 01:49:27 -07:00
Enrico Ros f99c266255 EnhancedRenderCode x LiveFileSync: starts to look neat 2024-08-13 01:30:06 -07:00
Enrico Ros 830f972c43 EnhancedRenderCode x LiveFileSync: patch icon 2024-08-13 01:03:13 -07:00
Enrico Ros b07d7b81a7 EnhancedRenderCode x LiveFileSync: workspace File selection 2024-08-13 00:56:29 -07:00
Enrico Ros 859453fc02 EnhancedRenderCode x LiveFileSync: glue 2024-08-13 00:04:00 -07:00
Enrico Ros 7810445c39 AutoBlocks: move enhanced-code 2024-08-12 23:47:12 -07:00
Enrico Ros f7f1b5ad21 AutoBlocks: organize code 2024-08-12 23:45:42 -07:00
Enrico Ros bee7ee406d LiveFileSync: restrict to DocAttachmentFragment 2024-08-12 23:42:40 -07:00
Enrico Ros b035b85b15 LFS: begin ERC sync 2024-08-12 22:42:43 -07:00
Enrico Ros 908712045c isMobile: consistency 2024-08-12 22:31:29 -07:00
Enrico Ros 5a4715e608 Uniformly use isMobile: boolean 2024-08-12 22:24:28 -07:00
Enrico Ros 433354e938 LFS: rename 2024-08-12 22:02:28 -07:00
Enrico Ros 3d1efea655 Dynamic LiveFile support (tied to FS API) 2024-08-12 21:54:18 -07:00
Enrico Ros 5b6cb644ae EnhancedRenderCodeMenu: option to disable livefile 2024-08-12 21:37:16 -07:00
Enrico Ros b1abff01ea Rename Livefile hooks 2024-08-12 21:29:37 -07:00
Enrico Ros 4c221f89cc Make the code icon reflect the expand/collapse 2024-08-12 21:20:45 -07:00
Enrico Ros 9ffbd45961 Correct the gap of InReferenceTo (list) 2024-08-12 21:09:51 -07:00
Enrico Ros 8b88d4afe7 OpenPipe: fix (openpipe.name:aix.id) mapping. #615 2024-08-12 17:20:04 -07:00
Enrico Ros 0061fb4c30 OpenPipe: deployed is the default state 2024-08-12 17:03:37 -07:00
Enrico Ros 2f3977ca8d OpenPipe: small adjustment 2024-08-12 16:41:01 -07:00
Enrico Ros 915c876cd4 OpenPipe: add discovery and qualification of fine-tune models. #615 2024-08-12 16:30:23 -07:00
Enrico Ros 42d9d70bdc OpenPipe: fix validity 2024-08-12 15:26:47 -07:00
Enrico Ros 336819a2dd Also #617 2024-08-12 15:21:50 -07:00
Enrico Ros 0ec261f7ca Add error details for #617 2024-08-12 15:20:45 -07:00
Enrico Ros dfe6d3cf72 Anthropic: fix #618 2024-08-12 15:03:33 -07:00
Enrico Ros 8ab35a5fab Prod: fix search... menu on Mobile 2024-08-12 13:22:43 -07:00
Enrico Ros f6c71d98f5 Prod: fix tooltip items v-alignment 2024-08-12 12:29:00 -07:00
Enrico Ros 973e15363f Prod: switch to min cost on mobile 2024-08-12 12:25:56 -07:00
Enrico Ros 0a7a1b7a5f EnhancedRenderCode: on mobile, use the single-tap-collapse/expand 2024-08-12 12:18:34 -07:00
Enrico Ros beb415213a EnhancedRenderCode: expand/collapse done 2024-08-12 12:15:06 -07:00
Enrico Ros 7087d45b62 EnhancedRenderCode: improve expand/collapse 2024-08-12 11:56:56 -07:00
Enrico Ros 395d977e97 EnhancedRenderCode: expand/collapse all 2024-08-12 11:42:39 -07:00
Enrico Ros 6db608e2c8 EnhancedRenderCode: collapse from header 2024-08-12 11:16:16 -07:00
Enrico Ros 2ca025818a EnhancedRenderCode: enhance 2024-08-12 02:02:26 -07:00
Enrico Ros 5dab98bef9 EnhancedRenderCode: extract Menu 2024-08-12 01:29:22 -07:00
Enrico Ros ce29954c6e EnhancedRenderCode: improvements 2024-08-12 01:17:51 -07:00
Enrico Ros cd62e101c1 EnhancedRenderCode: option to turn it off 2024-08-11 23:10:57 -07:00
Enrico Ros 187d85db1f Continue the EnhancedRenderCode 2024-08-11 22:55:44 -07:00
Enrico Ros ad85f743b1 Enhance RenderCodePanelFrame 2024-08-11 22:38:37 -07:00
Enrico Ros 30300a2134 Extract RenderCodePanelFrame 2024-08-11 21:45:34 -07:00
Enrico Ros c9bf43e444 ChatMessage: update Editors 2024-08-11 20:37:13 -07:00
Enrico Ros 8a8e42c01d Confirm bar removal 2024-08-11 19:00:47 -07:00
Enrico Ros 78db1091ac GoodTooltip: outlined 2024-08-11 18:43:27 -07:00
Enrico Ros b4fdf4c7c4 AutoBlocks: introduce EnhancedRenderCode 2024-08-11 01:01:15 -07:00
Enrico Ros 227e51a97d AutoBlocks: improve variants 2024-08-11 00:44:20 -07:00
Enrico Ros b0ca462998 AutoBlocks: pass the semiStableId 2024-08-10 23:48:20 -07:00
Enrico Ros 7187e55afa Message > ContentFragments > ContentPartText_AutoBlocks 2024-08-10 23:41:07 -07:00
Enrico Ros 419c53322d Shortcuts: show when editing 2024-08-10 23:38:19 -07:00
Enrico Ros c86bd3088a AutoBlocks: remove useRef 2024-08-10 22:57:04 -07:00
Enrico Ros b943352569 Workspace: more usages 2024-08-10 22:34:09 -07:00
Enrico Ros 962619de47 Workspace: use an ID provider to remove prop-drilling 2024-08-10 22:24:45 -07:00
Enrico Ros 0fb408af8c Reduce noise. 2024-08-10 21:51:35 -07:00
Enrico Ros f9262e0f1f SuperJSON: This hack is actually still needed. 2024-08-10 21:50:48 -07:00
Enrico Ros 2c3f237ccc SuperJSON: The NextJS-immutability hack doesn't seem to be needed anymore.
With this hack, deserialization of `json` arrays (rather than objects) was also broken,
and would break the downstream tRPC streaming functionality.
2024-08-10 17:16:59 -07:00
Enrico Ros 1680ba4223 Aix Client debugging in Dev 2024-08-10 17:10:43 -07:00
Enrico Ros 14c0e23b75 Test this. 2024-08-10 17:10:18 -07:00
Enrico Ros bc6d9d5de1 Ignore this. 2024-08-10 16:37:55 -07:00
Enrico Ros 973ba8669f Roll deps - not cloudflare/puppeteer, which keeps getting broken 2024-08-10 15:19:59 -07:00
Enrico Ros 37a38c3c89 AutoBlocks: mega dirty prop drill 2024-08-09 05:23:05 -07:00
Enrico Ros 816d97e7d1 AutoBlocks: Code: extract extra buttons hooks 2024-08-09 04:54:55 -07:00
Enrico Ros 89965d09cf AutoBlocks: rename Code renderers 2024-08-09 04:46:40 -07:00
Enrico Ros da10e3214a bits 2024-08-09 04:41:34 -07:00
Enrico Ros 5a29b17b27 LFS: Really ugly prop drill. 2024-08-09 04:41:20 -07:00
Enrico Ros 2f00921698 AutoBlocks: give (and stabilize) and Id 2024-08-09 04:15:54 -07:00
Enrico Ros b2cd19a7e0 AutoBlocks: give (and stabilize) and Id 2024-08-09 04:15:46 -07:00
Enrico Ros d69bd91aca Mermaid: more resilient. 2024-08-09 04:14:52 -07:00
Enrico Ros 2ac84a0b2f Messages: fix layout 2024-08-09 02:01:53 -07:00
Enrico Ros e7c38c3785 RenderBlocks: extract hooks 2024-08-09 01:25:46 -07:00
Enrico Ros c903c7f7ed RenderBlocks: improve 2024-08-09 00:53:28 -07:00
Enrico Ros 9d1c87b3f2 Stabilize some 2024-08-08 23:20:29 -07:00
Enrico Ros 929f419760 Shortcuts: cleanups 2024-08-08 22:54:56 -07:00
Enrico Ros c31662e528 Ephemerals: port as Conversation Handler Overlay Store Slice 2024-08-08 22:46:31 -07:00
Enrico Ros 79151c0528 Workspace: prop-drill to ChatMessage 2024-08-08 21:31:17 -07:00
Enrico Ros d125b97d97 More Style Memos 2024-08-08 21:30:42 -07:00
Enrico Ros 65d9fc1dc7 Styles 2024-08-08 21:01:55 -07:00
Enrico Ros ef30a45388 AppChat: prop-drill Workspace Contents 2024-08-08 20:42:04 -07:00
Enrico Ros c3565d99fa Ephemerals: cleanups 2024-08-08 20:15:19 -07:00
Enrico Ros 1a6fbea8c7 MessageSelectionHeader: sticky 2024-08-08 20:06:43 -07:00
Enrico Ros ab386079b1 Workspace: store 2024-08-08 19:17:34 -07:00
Enrico Ros 448169563c LiveFile: workspace associations 2024-08-08 16:28:01 -07:00
Enrico Ros 1647a528a3 LiveFile: update 2024-08-08 15:41:57 -07:00
Enrico Ros eb78713cc3 LiveFile: cleanups 2024-08-08 15:21:19 -07:00
Enrico Ros ee71013f93 AudioGenerator: TR909 2024-08-08 14:53:25 -07:00
Enrico Ros d2ffec2d4e Adding ViewTransitionUtils: not well supported by React (we have too many state updates and async flows to use this).
Note: this worked in the InReferenceToBubble, migrating it from the composer to the last user message.
2024-08-08 02:31:06 -07:00
Enrico Ros 0132df0bf2 Roll prisma 2024-08-08 01:03:02 -07:00
Enrico Ros bf269ecbac LFS: actions in the Attachment TitleBar 2024-08-07 16:03:29 -07:00
Enrico Ros 8af6ac853b LFS: update expander menu 2024-08-07 15:35:13 -07:00
Enrico Ros aff50499a2 LFS: confirmation before overwrite 2024-08-07 15:25:17 -07:00
Enrico Ros c30fa2aafb LFS: improvements 2024-08-07 15:03:16 -07:00
Enrico Ros 02d6f5c10e LFS: perfect button in the toolbar 2024-08-07 14:43:42 -07:00
Enrico Ros b99869544f LFS: full DND pairing 2024-08-07 13:55:54 -07:00
Enrico Ros e07b5aa988 LFS: pairing 1 2024-08-07 13:42:10 -07:00
Enrico Ros bd873b84c9 Attachment: extract getDataTransferFilesOrPromises 2024-08-07 13:39:45 -07:00
Enrico Ros f28b7ebeb9 DragDrop: extraction done 2024-08-07 13:14:46 -07:00
Enrico Ros cfcffa9a65 LFS: extract LFSB 2024-08-07 13:04:46 -07:00
Enrico Ros 226e4b0f8b useDragDropDataTransfer: improve 2024-08-07 12:55:58 -07:00
Enrico Ros 8b9a103fd3 Extract useDragDropDataTransfer 2024-08-07 12:32:41 -07:00
Enrico Ros 6a0a76df92 LFS: button 2024-08-07 12:03:45 -07:00
Enrico Ros 3d81f2a814 Merge branch 'refs/heads/main' into big-agi-2 2024-08-07 02:53:36 -07:00
Enrico Ros 1aab4a6e51 Merge branch 'refs/heads/main-stable' 2024-08-07 02:52:28 -07:00
Enrico Ros dec280d54d 1.16.7 Release
(cherry picked from commit 22b32d571d)
2024-08-07 02:51:59 -07:00
Enrico Ros 4823e97783 Mapping doc, for the future.
(cherry picked from commit a416cafc4e)
2024-08-07 02:51:59 -07:00
Enrico Ros 6a5685995f OpenAI: update models
(cherry picked from commit 5f5efe6133)
2024-08-07 02:51:59 -07:00
Enrico Ros 22b32d571d 1.16.7 Release 2024-08-07 02:50:10 -07:00
Enrico Ros a416cafc4e Mapping doc, for the future. 2024-08-07 02:46:33 -07:00
Enrico Ros 5f5efe6133 OpenAI: update models 2024-08-07 02:39:41 -07:00
Enrico Ros d066aba00e Style cleanups. 2024-08-07 01:45:09 -07:00
Enrico Ros 83e9965254 useAgiAttachmentPrompts: just. perfect. 2024-08-07 00:39:58 -07:00
Enrico Ros ce4e447032 useAgiAttachmentPrompts: good button, finally 2024-08-07 00:34:02 -07:00
Enrico Ros 568b16d2cf bits 2024-08-07 00:33:13 -07:00
Enrico Ros be2d857f82 useAgiAttachmentPrompts: deaggro 2024-08-07 00:06:07 -07:00
Enrico Ros c4c2fb9d39 useAgiAttachmentPrompts: improved hook 2024-08-06 22:37:09 -07:00
Enrico Ros 79f5d24e2f useAgiAttachmentPrompts: hook 2024-08-06 21:57:03 -07:00
Enrico Ros a69944c019 LiveFile: fix window refocus sync 2024-08-06 21:55:41 -07:00
Enrico Ros e4bb546442 LiveFile: update on window refocus (smart) 2024-08-06 20:36:14 -07:00
Enrico Ros 04ff184c23 Overlays: reject existing in case we are creating a new one. Should not happen, but enables great shortcut behaviors (x d d d x d..) 2024-08-06 19:57:36 -07:00
Enrico Ros 4718e26f96 Overlays: port more 2024-08-06 19:46:21 -07:00
Enrico Ros bd808594cb Overlays: overlay framework 2024-08-06 18:36:41 -07:00
Enrico Ros 00c2186106 Snackbar: clean 2024-08-06 13:57:41 -07:00
Enrico Ros a788b7a41b agiAttachmentPrompts: lower requirement to 1 2024-08-06 13:45:15 -07:00
Enrico Ros 024489939e agiAttachmentPrompts: update microcode2 2024-08-06 02:12:37 -07:00
Enrico Ros 33a0bd2d72 agiAttachmentPrompts: update microcode 2024-08-06 02:05:51 -07:00
Enrico Ros 029bcc7980 Attachments: fix controlled checkboxes 2024-08-06 01:47:13 -07:00
Enrico Ros acb2f6a1aa Attachments: youtube thumbnails 2024-08-06 01:30:12 -07:00
Enrico Ros 67184536a6 Attachments: youtube links as transcripts 2024-08-06 00:37:31 -07:00
Enrico Ros 85aed347cf YT: extract video id extraction 2024-08-05 23:43:13 -07:00
Enrico Ros 910f8c5a2f YT Persona: small cleanup 2024-08-05 23:36:48 -07:00
Enrico Ros bf47d40fdf Settings: improve padding 2024-08-05 20:27:22 -07:00
Enrico Ros c36440d576 DisableMarkdown: flipped the semantic meaning and removed some usages. On is the default 2024-08-05 20:20:04 -07:00
Enrico Ros 2e14c5a3d4 DoubleClickToEdit: default to false 2024-08-05 20:07:24 -07:00
Enrico Ros 7640e027d3 Merge branch 'refs/heads/main' into big-agi-2 2024-08-05 20:02:47 -07:00
Enrico Ros dccb493cf7 ReAct: bits 2024-08-05 20:02:37 -07:00
Enrico Ros 31a7ee0f4d ReAct: update doc 2024-08-05 19:51:42 -07:00
Enrico Ros 3ac1102274 ReAct: update doc 2024-08-05 19:50:20 -07:00
Enrico Ros a1c6cce61d ReAct: update doc 2024-08-05 19:49:05 -07:00
Enrico Ros 433f9a8162 Ephemerals: pinning to keep them on 2024-08-05 19:45:17 -07:00
Enrico Ros d0880da782 Improve Bubble and multi-refer-to 2024-08-05 19:08:04 -07:00
Enrico Ros e331393987 Roll packages 2024-08-05 19:07:52 -07:00
Enrico Ros 7047e98e91 Merge branch 'refs/heads/main' into big-agi-2 2024-08-05 18:05:14 -07:00
Enrico Ros 6c8a8bce88 Documentation: update ReAct 2024-08-05 18:05:03 -07:00
Enrico Ros a78f739935 Documentation: update ReAct 2024-08-05 17:56:38 -07:00
Enrico Ros 40c9b5a668 Documentation: document ReAct 2024-08-05 17:37:49 -07:00
Enrico Ros 46bb02f946 Documentation: document ReAct 2024-08-05 17:37:41 -07:00
Enrico Ros e57d4c724f bits 2024-08-05 16:10:00 -07:00
Enrico Ros d3c940bebc OpenPipe: add recording support, including tags. #615 2024-08-05 16:09:50 -07:00
Enrico Ros d71f94110f AttachmentAutoPrompts: support images 2024-08-04 06:07:55 -07:00
Enrico Ros 50e97e7523 remove logs 2024-08-04 06:07:36 -07:00
Enrico Ros 30ffd1a7ee InReferenceTo: multi-sentence, multi-role 2024-08-04 05:20:50 -07:00
Enrico Ros 030db4f769 Really Fix shortcuts matching 2024-08-04 02:08:40 -07:00
Enrico Ros 454f8620f7 Anthropic: start with the user message, if missing
This copies over the first line of the system prompt.
2024-08-04 02:03:30 -07:00
Enrico Ros f007f57b93 Fix shortcuts matching 2024-08-04 01:45:02 -07:00
Enrico Ros 573658ec7e Attachments: fix mime 2024-08-04 01:03:27 -07:00
Enrico Ros 1fc61f7c78 AutoPrompts: cleanup 2024-08-03 23:35:46 -07:00
Enrico Ros f0240018d6 useAsyncCall: improvements 2024-08-03 23:27:33 -07:00
Enrico Ros 4a40cca39e useAsyncCall: improvements 2024-08-03 23:22:15 -07:00
Enrico Ros 3add2b7a94 useAsyncCall: simplifies some state tracking 2024-08-03 23:09:08 -07:00
Enrico Ros 4fbcda03a5 AutoPrompts: extract 2024-08-03 21:25:24 -07:00
Enrico Ros 0020a49cd0 Gemini: updated default caps 2024-08-03 21:17:01 -07:00
Enrico Ros 7f7e484d4c Gemini: updated the capabilities (interfaces) of Pro/Experimental 2024-08-03 21:13:47 -07:00
Enrico Ros e9a162e952 Client-side error msg change 2024-08-03 21:01:28 -07:00
Enrico Ros 0a0270992d AIX: smallie 2024-08-03 20:59:04 -07:00
Enrico Ros 2d40e1b7ef Gemini: parse all finish reasons, and relax the parser 2024-08-03 20:58:11 -07:00
Enrico Ros 323e69d2eb Aix: client-side human errors 2024-08-03 20:46:18 -07:00
Enrico Ros f125b323b4 client-side add error utils 2024-08-03 20:40:16 -07:00
Enrico Ros b47b171e30 AIX: Client perfect exception handling 2024-08-03 20:24:21 -07:00
Enrico Ros f93a769c85 ChatMessage: 8 lines attachment preview 2024-08-03 19:16:36 -07:00
Enrico Ros fe2103b8cf ChatMessage: fix Content Fragments blank edit state 2024-08-03 19:13:47 -07:00
Enrico Ros 94278068c2 Blocks: tune edit 2024-08-03 19:00:55 -07:00
Enrico Ros b18a3f0fd9 Blocks: disaggro 2024-08-03 18:52:11 -07:00
Enrico Ros 1e5bb5aa7e Roll packages 2024-08-03 18:43:49 -07:00
Enrico Ros 3dd672a526 Blocks: Extract the Toggle button 2024-08-03 18:39:38 -07:00
Enrico Ros 92f3eb3184 Fix 2024-08-03 18:39:38 -07:00
Enrico Ros a8d1eb71c3 Blocks: Show Edit Shortcuts 2024-08-03 18:39:37 -07:00
Enrico Ros 4fb64d2117 Rename2 2024-08-03 16:04:20 -07:00
Enrico Ros e8beaa90ad Rename 2024-08-03 16:04:14 -07:00
Enrico Ros 5c3ecb86e1 Remove showTopWarning 2024-08-03 15:53:17 -07:00
Enrico Ros 13456da524 AutoBlocks: extract styles 2024-08-03 15:47:55 -07:00
Enrico Ros da15ab07e8 Rename 2024-08-03 15:41:08 -07:00
Enrico Ros 350c84fbda Move hooks 2024-08-03 15:32:39 -07:00
Enrico Ros 3efbe65ca6 Disaggro 2024-08-03 15:32:02 -07:00
Enrico Ros 7dffd797a4 Disaggro 2024-08-03 15:30:21 -07:00
Enrico Ros a6318e93a9 Document View: icon 2024-08-03 06:52:47 -07:00
Enrico Ros 7a7ab9b1ec Document View Mimetype: auto-detection of doc view type, and switch for manual override 2024-08-03 06:33:19 -07:00
Enrico Ros 6d8bb46985 Document View Mimetype: attachment pipeline adaptation 2024-08-03 06:03:59 -07:00
Enrico Ros 0b18e6d18a Document View Mimetype: good set of mimetypes 2024-08-03 05:37:03 -07:00
Enrico Ros 02dfda80a2 Document View Mimetype: dev conversion to vdt 2024-08-03 05:36:31 -07:00
Enrico Ros cb1e6f61f5 Document View Mimetype: doc renderer changes 2024-08-03 05:35:29 -07:00
Enrico Ros 2a359dfc4e Fix type 2024-08-03 04:28:32 -07:00
Enrico Ros 9f494288a9 Attachment: add Mime DB 2024-08-03 03:44:49 -07:00
Enrico Ros d90f2181b8 createVanillaStore 2024-08-03 01:56:40 -07:00
Enrico Ros 8be4582b5d Chat-overlay 2024-08-03 01:54:50 -07:00
Enrico Ros 8c817fba7c Roll pdfjs 2024-08-03 01:48:56 -07:00
Enrico Ros 543d32543c t2i: fix? 2024-08-03 00:26:29 -07:00
Enrico Ros f3dfb3383f Blocks: cleanup overlay button tooltip 2024-08-03 00:26:20 -07:00
Enrico Ros 8b733ed1f3 Blocks: external opening 2024-08-02 22:20:06 -07:00
Enrico Ros ffeb35a20b Blocks: over and out 2024-08-02 20:13:45 -07:00
Enrico Ros 2a1fccc43c Blocks: optimize 2024-08-02 19:54:54 -07:00
Enrico Ros a1097d2bb5 Blocks: improve IFrame processing 2024-08-02 19:53:59 -07:00
Enrico Ros b58465a769 Blocks: don't syntax highlight if not rendered 2024-08-02 19:38:51 -07:00
Enrico Ros 0f6af47eee Blocks: deaggro 2024-08-02 19:12:54 -07:00
Enrico Ros 1573d61a7e Blocks: rationalize overlays 2024-08-02 18:49:45 -07:00
Enrico Ros eb575a2320 Blocks: fix mouseover 2024-08-02 18:43:48 -07:00
Enrico Ros bbe4e36bd5 Blocks: extract overlay button 2024-08-02 18:39:48 -07:00
Enrico Ros b7de3669c3 Blocks: extract renderers 2024-08-02 18:27:07 -07:00
Enrico Ros 4011e55823 Blocks: support for extra 2024-08-02 18:23:29 -07:00
Enrico Ros 808992ecea Fix build 2024-08-02 17:55:24 -07:00
Enrico Ros 42596c6054 ContentPartTextEditor: reset min-rows 2024-08-02 17:55:20 -07:00
Enrico Ros 2cb3c82bd5 Blocks: improve button overlays 2024-08-02 17:51:45 -07:00
Enrico Ros 573143c57d Extract PlantUML renderer 2024-08-02 17:15:39 -07:00
Enrico Ros dfd77a3832 Fix showing errors 2024-08-02 17:13:12 -07:00
Enrico Ros c3d54defb7 RenderCode HTML: rename 2024-08-02 16:48:20 -07:00
Enrico Ros ae842984f2 Render User Text Content Fragments as text, not markdown. 2024-08-02 16:44:23 -07:00
Enrico Ros 421c586adb Perfect Composer Mic shortcuts, focus, logic. 2024-08-02 16:36:59 -07:00
Enrico Ros d06f9e17e1 Fix V3 load. 2024-08-02 07:31:07 -07:00
Enrico Ros b26954f326 Measure latency across providers. 2024-08-02 07:30:48 -07:00
Enrico Ros a7ee987e04 Data in-mem: rationalize upgrades 2024-08-02 06:47:13 -07:00
Enrico Ros cbdf48814b Data at Rest & Import/Export: rationalize 2024-08-02 06:15:51 -07:00
Enrico Ros df0854b897 Prepare to define Generator(s) 2024-08-02 04:19:52 -07:00
Enrico Ros 2ea79cf466 Cleanup 2024-08-02 04:19:29 -07:00
Enrico Ros 8e2db899c6 Restore OpenAI importer. 2024-08-02 04:18:43 -07:00
Enrico Ros c24876ba45 Remove cleanups - this may be risky, but let's dogfood it. 2024-08-02 03:54:15 -07:00
Enrico Ros 71bd05bbd1 Gif only in Extra mode. 2024-08-02 03:41:52 -07:00
Enrico Ros 7551848a29 Zen mode: dynamic theming. 2024-08-02 02:36:36 -07:00
Enrico Ros 05c304a053 Cleanup utility functions 2024-08-02 01:48:44 -07:00
Enrico Ros 4caa61da36 UI Complexity settings 2024-08-02 01:24:02 -07:00
Enrico Ros 080655b769 Open Drawers for 100ms at least. 2024-08-02 00:25:37 -07:00
Enrico Ros de4ab78664 Rename duplicate QueryClientProvider 2024-08-01 23:10:30 -07:00
Enrico Ros e72db54027 Open Drawers on press (both mobile and desktop) 2024-08-01 22:34:06 -07:00
Enrico Ros 8984c3d59c Proper separation. 2024-08-01 21:54:16 -07:00
Enrico Ros ce048c0521 Anticrash. 2024-08-01 20:10:04 -07:00
Enrico Ros 6c54220050 AIX: continuation as warning. 2024-08-01 05:43:07 -07:00
Enrico Ros 179ad9bbed AIX: basic continuation (user message). #613 2024-08-01 05:34:27 -07:00
Enrico Ros b6336a1fb0 AIX: cleanup debug 2024-08-01 05:31:24 -07:00
Enrico Ros f2676599c4 Remove react dep 2024-08-01 03:42:47 -07:00
Enrico Ros ba6cac9c2d AIX: handle max-tokens on 10 providers, streaming and non-streaming. #613 2024-08-01 01:44:04 -07:00
Enrico Ros 95633e0a88 AIX: OpenAI: relax finish_reason parsers, as OpenRouter makes a mess 2024-08-01 01:42:00 -07:00
Enrico Ros 515241edca OpenRouter: transmit upstream errors. 2024-08-01 01:01:58 -07:00
Enrico Ros 928231ce06 Together: add tool_calls=null exception.
https://github.com/togethercomputer/together-python/issues/160
2024-08-01 00:28:47 -07:00
Enrico Ros a46c6becbc Azure: improve model naming 2024-08-01 00:27:07 -07:00
Enrico Ros 273889eda0 tRPC fetchers: reduce log 2024-08-01 00:00:02 -07:00
Enrico Ros d0ce4359df OpenRouter: quick add/hide all. Fixes #605 2024-07-31 23:51:16 -07:00
Enrico Ros f1a0a22c2d Optima: optimize 2024-07-31 06:01:55 -07:00
Enrico Ros 64af43de4e Optima: full context removal 2024-07-31 05:00:12 -07:00
Enrico Ros 8c4f896e8a Stabilize the desktop nav (3rd group) 2024-07-31 04:20:41 -07:00
Enrico Ros ce33166c5c Stabilize the markdown renderer 2024-07-31 03:57:12 -07:00
Enrico Ros 10696fd5e7 zustand-5: disable devtools 2024-07-31 03:29:19 -07:00
Enrico Ros d53336baab zustand-5: fix some errors in conversion 2024-07-31 03:17:23 -07:00
Enrico Ros af96060e69 misc: disablePortal won't work for the top bar 2024-07-31 01:37:07 -07:00
Enrico Ros faccc1735f zustand: final removal of 'shallow' 2024-07-31 01:36:55 -07:00
Enrico Ros ab033807c4 roll packages 2024-07-31 00:50:07 -07:00
Enrico Ros 62c6353ca0 Optima: partial renames 2024-07-31 00:49:49 -07:00
Enrico Ros 79c1786bf3 Optima: migrated modals state - great stability 2024-07-30 23:58:53 -07:00
Enrico Ros 4b6759f2ad OptimaLayout: move AppMenu to zustand 2024-07-30 19:19:08 -07:00
Enrico Ros e166fd6703 MP: fix build 2024-07-30 04:41:43 -07:00
Enrico Ros 91f5f07a7f MP: Improve fx. 2024-07-30 04:39:16 -07:00
Enrico Ros 9678b6943d MP: Show empty messages. 2024-07-30 04:39:16 -07:00
Enrico Ros b439308023 Bring back the build. 2024-07-30 02:56:25 -07:00
Enrico Ros 8e1167d848 Remove debug hook. 2024-07-30 02:52:42 -07:00
Enrico Ros 575efb07f4 NextJS page router layout function - faster, lower flicker. 2024-07-30 02:40:33 -07:00
Enrico Ros ce93ab8234 withLayout: optimize 2024-07-30 01:56:28 -07:00
Enrico Ros 73ecc91188 Optima: react to presence/absence of Portal-in content 2024-07-30 00:39:18 -07:00
Enrico Ros f0a0dfc72a Optima: rationalize Portal names 2024-07-30 00:15:09 -07:00
Enrico Ros 95788f5dcd Optima: convert topbar to portals 2024-07-29 23:27:30 -07:00
Enrico Ros af18dc6683 Optima: convert drawers to portals 2024-07-29 23:18:00 -07:00
Enrico Ros 8d6540289d Optima: portals 2024-07-29 22:45:52 -07:00
Enrico Ros 7a5a24f210 Auto-Attachment-Prompt: under Flag 2024-07-29 17:13:24 -07:00
Enrico Ros 1f2f4b61b0 Fix pasting Screenshots 2024-07-29 16:41:28 -07:00
Enrico Ros 71d6bec954 Roll packages 2024-07-29 01:48:12 -07:00
Enrico Ros 4da95a389a Fix the 'shallow' warning once and for all. 2024-07-29 01:45:17 -07:00
Enrico Ros a28936199c Model search box when more than 50. 2024-07-29 01:12:10 -07:00
Enrico Ros da5cb20c3b DebouncedInput: support aggressive focus retention 2024-07-29 01:06:19 -07:00
Enrico Ros f01dc76b7f PageBarDropDown: add optional prepender 2024-07-29 00:41:44 -07:00
Enrico Ros ae7bcb84ab ContentFragments: let broken images be deleted 2024-07-28 22:08:39 -07:00
Enrico Ros 971686af2c FF: Composer: text area actions - intelligent function with attachments 2024-07-26 02:47:40 -07:00
Enrico Ros 4608d5fc2d AIX: streaming as a param, return the fragments. 2024-07-26 02:46:39 -07:00
Enrico Ros cb6ffc294c LLMAttachments: rename collection 2024-07-26 00:09:24 -07:00
Enrico Ros 52b1df0b4d Improve shallow object|array[] stabilizer 2024-07-26 00:06:51 -07:00
Enrico Ros 4b7cb28d3b AIX: Client function call tool definition helpers 2024-07-25 23:33:27 -07:00
Enrico Ros b9ab6d87c7 AIX: emit the debug request right away, and ready for a potential start message 2024-07-25 22:59:08 -07:00
Enrico Ros a5055ab67b Install zod-to-json-schema and roll packages 2024-07-25 22:55:50 -07:00
Enrico Ros f72f9f32cf OpenAI: fix chatGenerate adapter for Doc fragments 2024-07-25 01:29:34 -07:00
Enrico Ros 1eee2b8710 Mistral: FC warnings 2024-07-25 01:29:12 -07:00
Enrico Ros d3aaa8ae75 Lints 2024-07-24 23:31:51 -07:00
Enrico Ros 69e80fd415 Roll packages 2024-07-24 21:39:56 -07:00
Enrico Ros 836760accf Merge branch 'refs/heads/main' into big-agi-2 2024-07-24 21:33:23 -07:00
Enrico Ros cd504285b4 Merge branch 'refs/heads/main-stable' 2024-07-24 21:32:50 -07:00
Enrico Ros 3b4d5691d7 1.16.6: Release. Fixes #604 2024-07-24 21:31:57 -07:00
Enrico Ros 45c09d021a Groq: update output tokens (max 8,000 for 3.1) 2024-07-24 21:27:20 -07:00
Enrico Ros 8ef759fe0f Groq: update Models 2024-07-24 21:27:12 -07:00
Enrico Ros 977bcbb741 AIX: support Tool Invocation 2024-07-24 21:21:00 -07:00
Enrico Ros 3d11b85842 AIX: ReAssembler 2024-07-24 21:19:34 -07:00
Enrico Ros b8d0a5064b Tool Use/Response terrible rendering 2024-07-24 21:19:34 -07:00
Enrico Ros b50b796f15 AIX: fuller view of the last AIX transaction 2024-07-24 21:19:34 -07:00
Enrico Ros 04111e8a06 Labs: DEV: disable streaming UX option 2024-07-24 21:19:34 -07:00
Enrico Ros 432369abec Fragments: improve Data & constructors 2024-07-24 21:15:50 -07:00
Enrico Ros 8743c91275 AIX: Particles: update types 2024-07-24 21:15:20 -07:00
Enrico Ros b79dd3dbe0 AIX: Particle Transmitter: ok - new transmission logic 2024-07-24 21:13:21 -07:00
Enrico Ros d9df5d02be Anthropic: fix {} in the first tool call 2024-07-24 21:11:00 -07:00
Enrico Ros 2413a4d081 Groq: update output tokens (max 8,000 for 3.1) 2024-07-24 21:10:08 -07:00
Enrico Ros 4646394fe3 Server side nanoId: add prefix to distinguish us 2024-07-24 21:02:25 -07:00
Enrico Ros 288006ac1e Groq: update Models 2024-07-24 20:54:42 -07:00
Enrico Ros af65723a2c Groq: add failed_generation reporting 2024-07-24 20:49:14 -07:00
Enrico Ros ac5834f54d FF: snap reassembly 2024-07-24 06:25:44 -07:00
Enrico Ros bdc5143260 FF: snap reassembly 2024-07-24 06:08:11 -07:00
Enrico Ros 067d600fd3 FF: snap reassembly 2024-07-24 06:08:04 -07:00
Enrico Ros ee57c5f78f FF: snap tools 2024-07-24 05:44:45 -07:00
Enrico Ros 45722bbf56 FF: remove function 2024-07-24 05:06:05 -07:00
Enrico Ros 8fee5e0fd3 FF: fix namespacing 2024-07-24 04:51:39 -07:00
Enrico Ros 728c98f26d FF: fix Facton 2024-07-24 04:46:48 -07:00
Enrico Ros daab5ea0bc FF: fix crashes on undefined tokens 2024-07-24 04:15:26 -07:00
Enrico Ros 04e2d6e8eb FF: fix tRPC/superjson crash on 'undefined' values 2024-07-24 04:00:15 -07:00
Enrico Ros 58038a72d3 FF: fix gemini recitation fault 2024-07-24 03:59:07 -07:00
Enrico Ros 38ac0f1287 Aix: move Ollama out 2024-07-24 03:38:41 -07:00
Enrico Ros c870047f44 Aix: complete the (non-throttled) ChatGenerateTransmitter 2024-07-24 03:36:05 -07:00
Enrico Ros c65d472b97 FF: flush 2024-07-24 01:42:36 -07:00
Enrico Ros 239e332a28 FF: fix resource usage parsing 2024-07-24 01:42:10 -07:00
Enrico Ros c42c43165c FF: fix Router double-emission of the 'end' message on 'done-dialect' (Anthropic) 2024-07-24 01:25:40 -07:00
Enrico Ros b1810a2dbe FF: fix Gemini 2024-07-24 01:05:22 -07:00
Enrico Ros bab25bf763 Fix nth-of-type. 2024-07-24 00:41:13 -07:00
Enrico Ros 037ed5cbf6 Reply to on the user part too. Future: add role to the part. 2024-07-24 00:36:58 -07:00
Enrico Ros 1d0de6172f Roll Typescript 2024-07-23 04:33:45 -07:00
Enrico Ros 8a9dfa6143 Bits 2024-07-23 04:33:34 -07:00
Enrico Ros be2de6f90d MP: More details on the AttachmentFragmentEditor 2024-07-23 04:23:25 -07:00
Enrico Ros 604797b3f0 Attachments: more correct file size 2024-07-23 03:49:10 -07:00
Enrico Ros 7c4e08cad3 ScrollToBottom: skip autoscroll 2024-07-23 03:49:10 -07:00
Enrico Ros 075cd45c4c LiveFile: Subsystem complete. 2024-07-23 03:10:27 -07:00
Enrico Ros 096e2784d2 AttachmentButton: massive performance boost 2024-07-23 03:10:27 -07:00
Enrico Ros 0bba84d42d AttachmentButton: fix react issues 2024-07-23 02:31:09 -07:00
Enrico Ros 4a9feef7d1 LiveFile: Central approach 2024-07-22 20:50:35 -07:00
Enrico Ros 818595aeb5 LiveFile: react dep 2024-07-22 16:54:16 -07:00
Enrico Ros c2cd098003 LiveFile: message 2024-07-22 16:19:26 -07:00
Enrico Ros 7639eaa942 LiveFile: useLiveFile 2024-07-22 07:57:24 -07:00
Enrico Ros 96e9f9f780 Roll packages 2024-07-22 04:11:31 -07:00
Enrico Ros d7177dd4b7 LiveFile: style sync 2024-07-22 03:50:24 -07:00
Enrico Ros cd04ae461d LiveFile: small renames 2024-07-22 02:37:43 -07:00
Enrico Ros 5049ff24fa Fix #601 2024-07-22 02:26:15 -07:00
Enrico Ros 1bc22b15e3 LiveFile: Reload: 👍 2024-07-22 02:24:53 -07:00
Enrico Ros d9e46378ba LiveFile: Ready to Load 2024-07-22 02:05:02 -07:00
Enrico Ros 2c30790d4f Conversation: rename _abortController (and don't export/import it) 2024-07-22 02:02:47 -07:00
Enrico Ros f5ccd060a7 Attachments: Auto-select fix 2024-07-21 23:57:37 -07:00
Enrico Ros be40150515 LiveFile: AttachmentFragments 2024-07-21 23:57:15 -07:00
Enrico Ros b6c6317c62 LiveFiles: naming 2024-07-21 20:46:12 -07:00
Enrico Ros 5b00ddc43f LiveFiles: restructure, and store Handle to Attachment fragments 2024-07-21 20:43:52 -07:00
Enrico Ros 75be822b1b Cleanup 2024-07-21 20:11:46 -07:00
Enrico Ros feae7687e8 LiveFiles: relative name conversion on folder drops 2024-07-21 19:52:35 -07:00
Enrico Ros e1ceb02af1 LiveFiles: improve debugging 2024-07-21 19:35:27 -07:00
Enrico Ros 160f440588 LiveFiles: support folders drag/drop 2024-07-21 19:23:13 -07:00
Enrico Ros 3e439e1bef LiveFiles: improve drop 2024-07-21 17:28:08 -07:00
Enrico Ros 073b81cfb9 LiveFiles: async 2024-07-21 17:06:22 -07:00
Enrico Ros 85a832007a AIX: GCTransmitter high-level logic, and remove IntakeHandler 2024-07-20 20:28:45 -07:00
Enrico Ros 2760b7d431 AIX: Update Protocol parsing documentation 2024-07-20 16:17:15 -07:00
Enrico Ros 2bc429851d AIX: sync Readme. 2024-07-20 15:36:48 -07:00
Enrico Ros dbdb94ebcb AIX: PartTransmitter update 2024-07-20 15:36:42 -07:00
Enrico Ros 975672a551 Backup 2024-07-20 15:10:40 -07:00
Enrico Ros 9e095022f4 Roll packages 2024-07-20 15:05:12 -07:00
Enrico Ros 7fcedf452b AIX: OpenAI: split 'assistant' non-streaming wiretypes 2024-07-20 14:59:42 -07:00
Enrico Ros 8618664578 AIX: Remove Oobabooga 2024-07-20 14:59:42 -07:00
Enrico Ros 7405e45db2 AIX: connection options 2024-07-20 14:42:32 -07:00
Enrico Ros 8241386e7f AIX: PartTransmitter 2024-07-20 05:38:56 -07:00
Enrico Ros cf36c4eb8f AIX: update Readme with NS support 2024-07-20 05:37:27 -07:00
Enrico Ros a311531621 AIX: OpenAI: update wiretypes to allow for Mistral/NS 2024-07-20 05:37:14 -07:00
Enrico Ros 2876958ca6 AIX: update README 2024-07-20 04:44:28 -07:00
Enrico Ros 2ad60cddfc Gemini: cleanup Wiretypes 2024-07-20 01:24:46 -07:00
Enrico Ros 12fd0275ee Gemini: document parsing 2024-07-20 01:24:35 -07:00
Enrico Ros 3f66dcb0f6 Gemini: fix FC? 2024-07-20 00:57:50 -07:00
Enrico Ros 6d01c8f41d Gemini: update Wiretypes 2024-07-20 00:44:28 -07:00
Enrico Ros 652b902ece AIX: Update README 2024-07-19 19:13:04 -07:00
Enrico Ros 1225d4da15 AIX: Bits 2024-07-19 18:08:08 -07:00
Enrico Ros f313481727 AIX: Remove Ollama 2024-07-19 17:59:17 -07:00
Enrico Ros 9c84697094 AIX: Api: move away from Intake 2024-07-19 17:33:56 -07:00
Enrico Ros bcd3e3fdb6 AIX: improve architecture diagram 2024-07-19 17:07:24 -07:00
Enrico Ros 05bfbd8028 AIX: sync docs 2024-07-19 15:12:06 -07:00
Enrico Ros 9c07cada05 Effects placeholders 2024-07-19 15:06:03 -07:00
Enrico Ros 3e15ccee59 Empty out filters 2024-07-19 14:58:19 -07:00
Enrico Ros b169b2132c Future SVG filters support 2024-07-19 14:29:51 -07:00
Enrico Ros 6ed461788e Composer Tokens: highlight costs 2024-07-19 14:29:51 -07:00
Enrico Ros c3fea28592 Composer Tokens: extract and cleanup 2024-07-19 13:59:58 -07:00
Enrico Ros fcae1c9902 React: update dependency 2024-07-19 13:39:44 -07:00
Enrico Ros b177ddf3bb AIX: update AixWire namespaces 2024-07-19 13:37:50 -07:00
Enrico Ros 2c64e8e4ec Comment 2024-07-19 03:18:49 -07:00
Enrico Ros bba51ca5f3 MP: use l1Title where available 2024-07-19 03:05:18 -07:00
Enrico Ros a727350f37 MP: Doc: add l1_title 2024-07-19 02:52:46 -07:00
Enrico Ros bde369df29 MP: cleanup types 2024-07-19 02:44:10 -07:00
Enrico Ros 1ba227e449 Roll packages 2024-07-18 16:25:25 -07:00
Enrico Ros 9ad772e39e Merge branch 'refs/heads/main' into feature-multipart
# Conflicts:
#	src/apps/chat/components/message/ChatMessage.tsx
2024-07-18 16:18:36 -07:00
Enrico Ros 68b682ecb9 Merge branch 'refs/heads/main-stable' 2024-07-18 16:17:04 -07:00
Enrico Ros c06735fdd2 1.16.5: Release 2024-07-18 16:15:53 -07:00
Enrico Ros cf4297a1af OpenAI: support 4o Mini (16384 token output) 2024-07-18 16:15:37 -07:00
Enrico Ros 5d458d68bd Warn devs. 2024-07-18 16:12:17 -07:00
Enrico Ros e24fc94af1 Small layout fixes 2024-07-18 15:44:28 -07:00
Enrico Ros a04f91ae64 Improve composer separator 2024-07-17 21:54:25 -07:00
Enrico Ros 4120f7e923 Shortcuts: Active. 2024-07-17 12:21:37 -07:00
Enrico Ros ad28e86d4c Shortcuts: Finalize - looks great 2024-07-17 12:07:58 -07:00
Enrico Ros 9978c45548 Shortcuts: Professional Status Bar 2024-07-17 11:52:48 -07:00
Enrico Ros a874032fba Shortcuts: global rationalization 2024-07-17 09:59:47 -07:00
Enrico Ros b9ba0ad7c9 DEV MODE. Visible/usable only on localhost:3xxx 2024-07-16 17:52:51 -07:00
Enrico Ros 1602664130 AIX: move parser types 2024-07-16 17:24:38 -07:00
Enrico Ros da82810334 Speech Recognition: auto-send on keypress sound 2024-07-16 17:23:50 -07:00
Enrico Ros 73e9357364 Speech Recognition: improve states 2024-07-16 17:23:33 -07:00
Enrico Ros f00a87fc06 Attachments: pure-image website attachments 2024-07-16 03:47:23 -07:00
Enrico Ros 730ed42931 Attachments: show website preview (even if not attached) 2024-07-16 03:32:54 -07:00
Enrico Ros b2787f8bf9 RenderImageURL (and RefDblob) support a plain button render 2024-07-16 03:24:54 -07:00
Enrico Ros d254775f24 Diff: recycle the Add Files button 2024-07-16 02:50:47 -07:00
Enrico Ros 3a6a95704c DesktopDrawer: more visible line compared to 'divider' 2024-07-16 01:56:36 -07:00
Enrico Ros 6bb753d0ae ReplyToBubble: improve inline 2024-07-16 01:56:18 -07:00
Enrico Ros 3aea2b02b7 AIX: Reply-To ordered correctly 2024-07-16 00:53:40 -07:00
Enrico Ros fb9c50f6b3 Text Diff Tool - extends #194 2024-07-16 00:53:11 -07:00
Enrico Ros 332440a6d3 Improve Desktop Nav 2024-07-15 23:42:31 -07:00
Enrico Ros 3b5a6fabee AppTokens: improve 2024-07-15 23:15:05 -07:00
Enrico Ros 426764fcce AIX: Move readme 2024-07-15 21:53:41 -07:00
Enrico Ros 02ca84a467 AIX: Massive updates 2024-07-15 21:49:39 -07:00
Enrico Ros 6fd393949c AIX: Supreme Wire Types 2024-07-15 18:31:07 -07:00
Enrico Ros c8d16c7261 Chat: update Fragments 2024-07-15 18:20:22 -07:00
Enrico Ros 2332372bca AIX: Intake: perfect wire types 2024-07-15 18:18:58 -07:00
Enrico Ros 5bd45e2c2a AIX: Intake: new wire 2024-07-15 15:26:15 -07:00
Enrico Ros 5a7b50ed2f roll packages 2024-07-15 14:27:29 -07:00
Enrico Ros ee469c7759 Merge branch 'refs/heads/main' into feature-multipart 2024-07-15 14:15:16 -07:00
Enrico Ros e075803907 Merge branch 'refs/heads/main-stable' 2024-07-15 14:14:57 -07:00
Enrico Ros c3db077ae8 1.16.4: release 2024-07-15 14:13:36 -07:00
Enrico Ros 779b265b20 Anthropic: 8192 tokens 2024-07-15 14:08:02 -07:00
Enrico Ros 3d57f10a2f Disable play/pause handlers for now
This is meant to have a single key shortcut (e.g. play/pause) to interact with the app.
2024-07-15 13:56:46 -07:00
Enrico Ros 2ece0698cf play/pause handlers 2024-07-15 13:47:42 -07:00
Enrico Ros 43d424f1f8 Improve delete message 2024-07-15 12:57:57 -07:00
Enrico Ros 8428d2af7f AIX: OpenAI basic FC algo
Verified on: Azure, Groq, LMStudio, LocalAI, Mistral, OpenAI, TogetherAI
FC not supported on: Deepseek, Perplexity
FC poorly supported on: OpenRouter (basically only in OpenAI it works)
2024-07-15 03:45:52 -07:00
Enrico Ros ebcb827400 AIX: extract parsers 2024-07-15 02:18:00 -07:00
Enrico Ros e7773f6227 a 2024-07-15 02:10:16 -07:00
Enrico Ros c06250ecb1 AIX: Gemini: improve function calling 2024-07-15 02:05:49 -07:00
Enrico Ros 97786eb396 AIX: Gemini: first code execution 2024-07-15 01:55:40 -07:00
Enrico Ros b1a16517bf AIX: router: Improve dispatch 2024-07-15 01:36:10 -07:00
Enrico Ros 0bfc9545d3 AIX: Gemini: fix wires and parsing 2024-07-15 01:02:23 -07:00
Enrico Ros 9caf7763a5 Bits 2024-07-15 00:09:14 -07:00
Enrico Ros 0db62d0af1 AIX: Gemini: generateContent 2024-07-14 21:41:38 -07:00
Enrico Ros 0bbaf9bf95 AIX: update replyTo 2024-07-14 21:32:52 -07:00
Enrico Ros 80406f855a AIX: misc 2024-07-14 21:31:46 -07:00
Enrico Ros 300b5cafe2 UI: reduce default text size 2024-07-14 21:27:01 -07:00
Enrico Ros cb36cba9ab AIX: dispatch: move adapters 2024-07-14 19:45:39 -07:00
Enrico Ros 7c2026ac37 AIX: Gemini: begin wiring 2024-07-14 19:42:25 -07:00
Enrico Ros 5703c52fd7 AIX: Gemini: optimal wiretypes 2024-07-14 19:34:17 -07:00
Enrico Ros b3eba5c841 AIX: Anthropic: optimal wiretypes 2024-07-14 16:45:35 -07:00
Enrico Ros 4a6d272017 AIX: move dispatch wiretypes 2024-07-14 16:22:09 -07:00
Enrico Ros 26f5f35754 AIX: OpenAI: wiretypes delight 2024-07-14 16:16:22 -07:00
Enrico Ros 8c36502aeb AIX: OpenAI: reduce wiretypes visibility (until necessary) 2024-07-14 16:12:11 -07:00
Enrico Ros 0918d6be07 AIX: OpenAI: perfect wiretypes 2024-07-14 16:04:21 -07:00
Enrico Ros b48b102b35 AIX: intake: lower schema 2024-07-14 15:42:04 -07:00
Enrico Ros 46f98d643f AIX: improve wire types 2024-07-14 15:41:52 -07:00
Enrico Ros a9eccf2819 AIX: dispatch: improve chatGenerate structure 2024-07-14 15:17:55 -07:00
Enrico Ros 98ff38f8e1 Fix code leading spaces removal 2024-07-14 14:37:29 -07:00
Enrico Ros d969f55730 AIX: structure (folders) 2024-07-14 14:28:25 -07:00
Enrico Ros 082236e7d8 AIX: Rationalize hotfixes 2024-07-14 05:05:59 -07:00
Enrico Ros d43c81401e AIX: OpenRouter fixes 2024-07-14 04:44:26 -07:00
Enrico Ros c9824f1486 AIX: Perplexity hotfixes too 2024-07-14 04:32:34 -07:00
Enrico Ros 1e8f49d3a3 AIX: F'n call - F****** Mess 2024-07-14 04:06:32 -07:00
Enrico Ros 42696b82d5 AIX: Azure, Deepseek, Mistral, OpenRouter, Perplexity, Together fixes 2024-07-14 04:06:11 -07:00
Enrico Ros 004596a9c2 Ctrl + Shift + Z to regenerate the last message (very frequent op, frequent shortcut) 2024-07-14 03:50:15 -07:00
Enrico Ros c994f52a79 Bits 2024-07-14 03:49:41 -07:00
Enrico Ros ccff695f3a Fixed tRPC-domain fetchers' errors 2024-07-14 03:08:02 -07:00
Enrico Ros d1c318ed7e Attachments: progress 2024-07-13 22:56:29 -07:00
Enrico Ros 059dbe684c Attachments: vast betterment 2024-07-13 21:55:24 -07:00
Enrico Ros ec3c35095b Attachments: better menu looks 2024-07-13 21:55:24 -07:00
Enrico Ros ad8f5fec5b Attachments: support multiple converters 2024-07-13 18:18:34 -07:00
Enrico Ros 376f1ac5e0 roll packages 2024-07-13 12:45:14 -07:00
Enrico Ros 3978c50afc Browsing: enable page screenshot 2024-07-12 16:53:28 -07:00
Enrico Ros 0d25226c30 Rationalize open blobs in new tab 2024-07-12 16:40:46 -07:00
Enrico Ros f99cc74466 AIX: Reply-To 2024-07-12 15:22:08 -07:00
Enrico Ros 160d09f1d8 Remove obsolete 2024-07-12 14:12:20 -07:00
Enrico Ros f591b1711d Roll tRPC - incredible framework 2024-07-12 14:10:54 -07:00
Enrico Ros b4ce247c71 Replaced old doc 2024-07-12 13:51:20 -07:00
Enrico Ros adc7cd82fa Merge branch 'refs/heads/main' into feature-multipart 2024-07-12 13:49:28 -07:00
Enrico Ros 9327be14b7 LocalAI: new proto fix 2024-07-12 05:19:23 -07:00
Enrico Ros 8fa4fe85c4 Bits 2024-07-12 05:19:13 -07:00
Enrico Ros 2eb61f4777 AIX: Router debug parsing 2024-07-12 04:31:32 -07:00
Enrico Ros 0bdd3addc8 Cleanups 2024-07-12 04:29:31 -07:00
Enrico Ros 756738b540 Fix image tokens estimation 2024-07-12 04:29:20 -07:00
Enrico Ros 6b55bba634 AIX: OpenAI: adapter done 2024-07-12 04:12:35 -07:00
Enrico Ros 3f679ffb6a AIX: Anthropic: improve typing in the intake message conversion 2024-07-12 02:25:27 -07:00
Enrico Ros e87fe870bb AIX: OpenAI: improve FC schema 2024-07-12 01:48:40 -07:00
Enrico Ros 6fc6b23f38 AIX: Intake: improve schemas 2024-07-12 01:48:23 -07:00
Enrico Ros 03d633715a AIX: Anthropic: bits 2024-07-12 01:16:17 -07:00
Enrico Ros 99087ccdf0 FetchFromTRPC: cleanup 2024-07-12 01:15:49 -07:00
Enrico Ros b832025e88 Create 2024-AI-APIs-Comparison.md 2024-07-11 23:06:44 -07:00
Enrico Ros 1e5e3a225c Fix warning on ChatDrawer search 2024-07-11 03:20:11 -07:00
Enrico Ros c6f79b35de Improve Autospeak 2024-07-11 03:11:27 -07:00
Enrico Ros fa97bcc9f5 AIX: Anthropic streaming tool initial support 2024-07-11 02:54:55 -07:00
Enrico Ros a1ef070d49 AIX: client-side controlled debug 2024-07-11 02:54:42 -07:00
Enrico Ros 1db71d9ba7 AIX: dynamic streaming support 2024-07-11 02:31:44 -07:00
Enrico Ros de139cada0 AIX: Dispatch: !streaming 2024-07-11 01:12:02 -07:00
Enrico Ros b994ec8bbc AIX: Anthropic: timeInner 2024-07-11 00:59:15 -07:00
Enrico Ros 90b326da53 Screencap: 200ms delay, to remove the capture window from self 2024-07-11 00:53:28 -07:00
Enrico Ros fa70e6ac9d AIX: Messages API: rescale assistant messages 2024-07-11 00:44:09 -07:00
Enrico Ros a2b5a78454 AIX: from DMessages[] 2024-07-11 00:23:45 -07:00
Enrico Ros 167c944b64 AIX: .chat -> .chatSequence 2024-07-10 23:47:56 -07:00
Enrico Ros 77c7836a93 AIX: Anthropic: cleaner conversion 2024-07-10 23:47:11 -07:00
Enrico Ros 388194e8bc AIX: Anthropic: return token count and rate 2024-07-10 23:46:48 -07:00
Enrico Ros 1f5558a757 AIX: Gemini: wall emoji 2024-07-10 22:53:52 -07:00
Enrico Ros 04c1bd8a1f AIX: Anthropic: hotfix 1 2024-07-10 22:53:23 -07:00
Enrico Ros f431ccf307 AIX: vast improvements to function declarations, function calls, function results, Anthropic requests, image uploads, system prompt extraction 2024-07-10 19:01:11 -07:00
Enrico Ros d06ad58826 Drag/drop bits 2024-07-10 15:16:30 -07:00
Enrico Ros 4d10698cfd Composer: extract the drag/drop component 2024-07-10 15:15:01 -07:00
Enrico Ros a253a5a07a Composer Drop - expand and prioritize vs. Mic 2024-07-10 14:34:26 -07:00
Enrico Ros 3ee3c312ef AIX: First image. 2024-07-10 03:53:33 -07:00
Enrico Ros 83b1e0ffba AIX: Client API first port 2024-07-10 03:30:18 -07:00
Enrico Ros cc7242dfd3 AIX: Aix Client: lightweight types 2024-07-10 02:44:18 -07:00
Enrico Ros 45f6cf29de AIX: Dispatch: port former 2024-07-10 02:43:55 -07:00
Enrico Ros 26dc01e079 AIX: Intake cleanup 2024-07-10 02:43:43 -07:00
Enrico Ros f2659c52e9 AIX: Intake: much better types 2024-07-10 01:40:43 -07:00
Enrico Ros 12d690e264 AIX: Client - Improve types 2024-07-10 00:44:48 -07:00
Enrico Ros 0e0a945686 AIX: Client - Types 2024-07-10 00:12:01 -07:00
Enrico Ros 53cdca277c Cleanups 2024-07-09 23:43:03 -07:00
Enrico Ros 0d7ca3a67e AIX: document the 3 upstream APIs at a features set level 2024-07-09 19:32:21 -07:00
Enrico Ros cab726a327 AIX: fix Gemini with JSON outputs 2024-07-09 19:31:52 -07:00
Enrico Ros 0fbdc465a7 AIX: test streaming 2024-07-09 17:57:18 -07:00
Enrico Ros fcf95457c2 AIX: OpenAI usage parsing 2024-07-09 17:54:11 -07:00
Enrico Ros 415c4e2ec3 OpenAI Wire: full migration 2024-07-09 17:45:20 -07:00
Enrico Ros 7afe4ab477 OpenAI Wire: improve function definition 2024-07-09 17:25:33 -07:00
Enrico Ros 69a58c435b OpenAI Wire: port image generation and moderations 2024-07-09 17:10:42 -07:00
Enrico Ros eecf220bfe Bits 2024-07-09 16:36:45 -07:00
Enrico Ros 10aefa2da3 AIX: undocumented OpenAI types 2024-07-09 16:36:07 -07:00
Enrico Ros ecd0734a6b AIX: new OpenAI types 2024-07-09 16:15:54 -07:00
Enrico Ros 0f6673d6fd Attachments: clean html 2024-07-09 14:15:11 -07:00
Enrico Ros 65feb3f032 Attachments: cleaner html 2024-07-09 13:51:47 -07:00
Enrico Ros 17731931e5 AIX: Ollama: try move 2024-07-09 13:32:57 -07:00
Enrico Ros 06df834435 AIX: Anthropic: try move 2024-07-09 13:25:26 -07:00
Enrico Ros c18806394b AIX: Gemini: try move 2024-07-09 13:00:21 -07:00
Enrico Ros 21ec7219c3 Gemini: update dispatch responses 2024-07-09 12:55:10 -07:00
Enrico Ros b58e0f85f9 Gemini: update dispatch request 2024-07-09 12:39:48 -07:00
Enrico Ros 110ca34e1d Chat Drawer: fix key 2024-07-09 11:23:38 -07:00
Enrico Ros 1d543169e2 AIX: further remove upstream 2024-07-09 11:21:54 -07:00
Enrico Ros 45d464cb93 Style 2024-07-09 11:13:33 -07:00
Enrico Ros f60158f0fe Chat Drawer Filtering: improved 2024-07-09 11:07:10 -07:00
Enrico Ros cf903ab6ce AIX: Restructure 2024-07-09 10:57:11 -07:00
Enrico Ros 6b11291284 AIX: Rename router 2024-07-09 10:07:44 -07:00
Enrico Ros dd3993ec4f AIX: Remove Testing code 2024-07-09 10:07:34 -07:00
Enrico Ros faaf31e426 Filter for Attachments 2024-07-09 09:29:22 -07:00
Enrico Ros 30ad8f107d MP: improve sentinels 2024-07-09 09:27:54 -07:00
Enrico Ros 2922b4c1dc Style 2024-07-09 08:58:46 -07:00
Enrico Ros 958ac6b3b9 Doc Fragments Editor: title 2024-07-09 08:42:39 -07:00
Enrico Ros 548f7e47c5 Fix mime resolution from extension 2024-07-09 08:25:00 -07:00
Enrico Ros 1ebb04bae6 Support Docx. #588 2024-07-09 07:35:47 -07:00
Enrico Ros cb37f05728 Merge branch 'refs/heads/main' into feature-multipart 2024-07-09 06:50:10 -07:00
Enrico Ros 0b3b4a6417 Reverse proxy instructions. Fixes #587 2024-07-09 06:49:48 -07:00
Enrico Ros 7cf30e3a3a Merge branch 'refs/heads/main' into feature-multipart
# Conflicts:
#	src/apps/chat/AppChat.tsx
2024-07-08 17:55:30 -07:00
Enrico Ros 0bf2700687 Close #581 2024-07-08 17:39:23 -07:00
Enrico Ros c773359c0b Update env. 2024-07-08 17:19:33 -07:00
Enrico Ros b80d801acb K8S: link to docs 2024-07-08 17:15:01 -07:00
Enrico Ros 1bdd1dbcc4 Merge branch 'pichuang-k8s' 2024-07-08 17:10:21 -07:00
Enrico Ros 66637feb73 K8S: cleanup 2024-07-08 17:08:54 -07:00
Enrico Ros 22fb33b8a5 Merge branch 'k8s' of https://github.com/pichuang/big-agi into pichuang-k8s 2024-07-08 16:42:44 -07:00
Enrico Ros 8ea3eb7493 Zen mode improvements. Fixes #586 2024-07-08 16:32:36 -07:00
Enrico Ros 3addc4e2ac AIX: fix build 2024-07-07 05:02:37 -07:00
Enrico Ros 7ff7e489ab Merge branch 'refs/heads/main' into feature-multipart
# Conflicts:
#	src/apps/chat/AppChat.tsx
#	src/apps/chat/components/ChatMessageList.tsx
#	src/apps/personas/creator/Creator.tsx
2024-07-07 04:43:21 -07:00
Enrico Ros 95aa0da014 Merge branch 'fork/mapringg/mac-shortcuts' 2024-07-07 04:21:24 -07:00
Enrico Ros b12637267b Small cleanups with shortcut fixes 2024-07-07 04:20:23 -07:00
Enrico Ros 3a44f70db9 AI Persona Creator: Update the react state after 575 2024-07-07 03:55:55 -07:00
Enrico Ros 92206d9740 Merge pull request #575
[BUG] Fixes text on AI Personas Creator panel
2024-07-07 03:52:30 -07:00
Enrico Ros bddd91df2a Merge branch 'fork/mapringg/feature/deepseek-vendor' 2024-07-07 03:36:51 -07:00
Enrico Ros 144ead8cfe Deepseek: cleanups
Mostly reordered the properties in alphabetical order
and made sure that models are listed dynamically (for future changes)
2024-07-07 03:34:45 -07:00
Enrico Ros 185f8e7f44 roll tRPC w/ #5851 2024-07-07 02:52:39 -07:00
Enrico Ros 1538cd83af roll packages 2024-07-07 02:49:06 -07:00
Sorawit Kongnurat 027f7deb3a feat: implement deepseek vendor 2024-07-07 16:02:08 +07:00
Enrico Ros 4043a6098b Aix: handle abort signals on both server and client 2024-07-06 06:24:01 -07:00
Enrico Ros 92b913be98 Aix: use backend fetchers 2024-07-06 05:52:11 -07:00
Enrico Ros 8505ba6b84 Backend Fetchers: improve 2024-07-06 05:38:26 -07:00
Enrico Ros c6973f6b4e OpenRouter: remove non-free 2024-07-06 05:21:10 -07:00
Enrico Ros 94eddaff3f Backend fetchers: allow signals 2024-07-06 04:35:58 -07:00
Sorawit Kongnurat f38be4aff3 feat: replace useGlobalShortcut with useGlobalShortcuts
Ignore alt key for mac users.
2024-07-06 15:41:45 +07:00
Sorawit Kongnurat 3ea78fcf9f Merge branch 'main' into mac-shortcuts 2024-07-06 14:31:58 +07:00
Enrico Ros 78cfcc6206 AIX: improve Gemini and issue reporting 2024-07-05 18:45:23 -07:00
Enrico Ros 9c5d4a18ce Audio: Wire Chime (disabled) 2024-07-05 18:31:05 -07:00
Enrico Ros aa48b4d596 Audio: Add Generator 2024-07-05 17:11:10 -07:00
Enrico Ros 265acd9345 Audio: Add Generator 2024-07-05 16:38:41 -07:00
Enrico Ros 34ec1d5671 Audio: Port Player 2024-07-05 16:33:19 -07:00
Enrico Ros 4a1f4f0a01 Bits 2024-07-05 13:42:47 -07:00
Enrico Ros 850528820f AIX: define new low-level APIs 2024-07-05 02:55:34 -07:00
Enrico Ros 4dc8197c51 paste over 2024-07-04 16:28:04 -07:00
Enrico Ros 42e97eed4c Persona: port Throttle 2024-07-04 03:18:07 -07:00
Enrico Ros 065f30ac38 Persona: port AutoSpeak 2024-07-04 02:55:10 -07:00
Enrico Ros 9e705a12b1 Bits 2024-07-04 02:09:43 -07:00
Enrico Ros b8144f0748 AIX: flow cleanup 1 2024-07-04 01:29:56 -07:00
Enrico Ros e5b5faad3e Style2 2024-07-03 22:36:11 -07:00
Enrico Ros f840c1d424 Style 2024-07-03 20:30:36 -07:00
Enrico Ros eabd268874 AIX: client-side wire 2024-07-03 20:19:52 -07:00
Enrico Ros 06aadc543a AIX: redo all uplink parsers 2024-07-03 19:58:11 -07:00
Enrico Ros 2a410f52b5 AIX: improved all uplinks 2024-07-03 19:57:09 -07:00
Enrico Ros eb7a32ed16 AIX: redo the Upstream engine 2024-07-03 15:55:19 -07:00
Enrico Ros 14118d3056 Tokens: rationalize 2024-07-03 11:42:46 -07:00
Enrico Ros c8b3d8ad9b AIX: exception trap 2024-07-03 01:52:15 -07:00
Enrico Ros a097b32d5c AIX: types migration 2024-07-03 01:31:13 -07:00
Enrico Ros 0a88a9cee6 Cleanup Execute Mode labels 2024-07-03 00:17:36 -07:00
Enrico Ros bef1c0c5fc Extract ChatExecuteMode 2024-07-02 23:51:24 -07:00
Enrico Ros 52e6ef436f change ChatModeIds 2024-07-02 22:48:17 -07:00
Enrico Ros ad0617de90 roll PDFjs 2024-07-02 21:40:09 -07:00
Enrico Ros 1753c1a40a AutoSuggestions: controllable LLM 2024-07-02 21:37:49 -07:00
Enrico Ros 13b7004959 roll packages 2024-07-02 21:33:25 -07:00
Enrico Ros 3b9a21bbf7 AIX: remove tRPC router: not ready - will hand-roll it 2024-07-02 21:32:02 -07:00
Enrico Ros 5f0beb9d00 AIX: move stream debug 2024-07-02 00:38:03 -07:00
Enrico Ros 8411a73589 AIX: test router and client 2024-07-01 23:29:24 -07:00
Enrico Ros 009a3751c0 AIX: update fc schema 2024-07-01 23:28:52 -07:00
Enrico Ros adef88e358 roll packages 2024-07-01 22:44:14 -07:00
Enrico Ros f8b9df7bf0 AIX: function calling types 2024-07-01 21:58:18 -07:00
Enrico Ros c6fa3e1d24 Export: update backup file name 2024-07-01 21:26:31 -07:00
Enrico Ros ae24dd1e28 Bits 2024-07-01 21:26:31 -07:00
Enrico Ros 1efca7dd48 Ollama: update models 2024-06-28 02:32:35 -07:00
Jason Baker 3178f4e7e9 Fixes text on AI Personas Creator panel 2024-06-28 00:12:20 -07:00
Enrico Ros e00f61dcd0 MP: bits 2024-06-25 12:18:02 -07:00
Enrico Ros 6a5774aae7 MP: bifurcate persona generation 2024-06-25 03:27:38 -07:00
Enrico Ros 5119061861 MP: improve history editing 2024-06-25 03:11:52 -07:00
Enrico Ros fdfbae334a MP: re-enable reply to... 2024-06-25 03:03:59 -07:00
Enrico Ros e3fce43e62 Merge pull request #572 from JeremiLorenti/patch-1
Update DallESettings.tsx
2024-06-25 02:15:25 -07:00
Enrico Ros 9251f8ff0e MP: re-enable auto-draw... 2024-06-25 01:49:16 -07:00
Enrico Ros 18ef40f6f4 MP: bifurcate generate-text 2024-06-25 01:42:32 -07:00
Enrico Ros 46887d1d9f MP: reuse more fragment functions 2024-06-25 01:28:57 -07:00
Enrico Ros 632d10e9e3 MP: fix the execution pipeline 2024-06-25 01:08:56 -07:00
Enrico Ros 9fa33eea73 MP: fix editing 2024-06-24 22:29:21 -07:00
Enrico Ros 2c4c13bc2c MP: fix 'ph' reducing and token counting 2024-06-24 22:16:03 -07:00
Enrico Ros 33f8a4eb3a Message pricing: show min, and max on hover 2024-06-24 22:15:29 -07:00
Jeremi Lorenti aa7959a970 Update DallESettings.tsx
Changed the label for the "Hyper-Real" setting from "Relistic" to "Realistic" to correct the spelling mistake and improve clarity in the UI.
2024-06-25 01:12:42 -04:00
Enrico Ros 7471bc0bb2 roll packages 2024-06-24 21:41:22 -07:00
Enrico Ros b257f75e53 Screen Capture: enable for everyone 2024-06-24 20:25:13 -07:00
Enrico Ros 455e279216 MP: enter Docs 2024-06-24 20:19:43 -07:00
Enrico Ros 7fd359852a Browse: get page title too 2024-06-24 18:44:34 -07:00
Enrico Ros 82ecfdbd37 DMessage: remove Sender 2024-06-24 17:41:50 -07:00
Enrico Ros 478452983f MP: port to Embeds 2024-06-24 17:19:13 -07:00
Enrico Ros 5c1a7d485f Merge pull request #570 from blakkd/patch-1
Correct LocalAI URL
2024-06-24 04:39:56 -07:00
Enrico Ros 39c4ce9240 bits 2024-06-24 03:16:58 -07:00
Enrico Ros da49585df5 MP: improve Ego-Fragments 2024-06-24 01:34:54 -07:00
Enrico Ros 0b9bee02fe MP: begin converting Attachments 2024-06-23 21:33:40 -07:00
Enrico Ros 00e5d1ae27 MP: move towards typed parts 2024-06-23 21:16:03 -07:00
blakkd b290d63926 Correct LocalAI URL 2024-06-24 06:10:30 +02:00
Enrico Ros 1b5438cc6c MP: renames 2024-06-23 20:44:48 -07:00
Enrico Ros 17323facce Blocks: cleanups 2024-06-23 20:24:27 -07:00
Enrico Ros bc9dedeea4 MP: cleanup Content fragments 2024-06-23 20:22:05 -07:00
Enrico Ros 1b3a383b53 Blocks: rename to AutoBlocksRenderer 2024-06-23 20:09:27 -07:00
Enrico Ros 4e0a535402 Blocks: cleanups 2024-06-23 19:56:55 -07:00
Enrico Ros 0005db1b33 Blocks: extract iframe rendering 2024-06-23 19:18:28 -07:00
Enrico Ros 5cd74031be Blocks: rename 2024-06-23 19:07:24 -07:00
Enrico Ros facb85b5da Rename to an Anthropic-compatible naming (part 1) 2024-06-23 18:46:41 -07:00
Enrico Ros 5f97d17837 anthropic model naming 2024-06-23 01:10:53 -07:00
Enrico Ros af722e09f8 bits 2024-06-23 00:55:57 -07:00
Enrico Ros 959edf6010 MP: cleanups/enablers 2024-06-22 23:58:15 -07:00
Enrico Ros d08f183394 roll trpc 2024-06-22 23:25:20 -07:00
Enrico Ros da541ae182 MP: Extract Fragments to own file 2024-06-22 23:12:12 -07:00
Enrico Ros 4582c4c03d MP: Typesystem Sentinels 2024-06-22 21:52:30 -07:00
Enrico Ros 8c7d70d434 Debug 2024-06-22 18:01:59 -07:00
Enrico Ros fcf9f9e562 MP: disable images editing 2024-06-22 17:31:21 -07:00
Enrico Ros 7bb0fb294a MP: full document editing 2024-06-22 17:01:50 -07:00
Enrico Ros 2e7b5ba5f0 Fix enter is newline on editing 2024-06-22 16:41:08 -07:00
Enrico Ros 6b017f3678 style 2024-06-22 16:34:41 -07:00
Enrico Ros a303d00900 style 2024-06-22 16:34:26 -07:00
Enrico Ros aaa351dca4 Revert "code block detection: assume the ``` has a newline before the end of block"
Because the Diagrams stopped working in the modal.

This reverts commit ee5fb5361c.
2024-06-22 16:25:17 -07:00
Enrico Ros ee5fb5361c code block detection: assume the ``` has a newline before the end of block 2024-06-22 16:18:37 -07:00
Enrico Ros aaffcdbfeb Style 2024-06-22 16:13:09 -07:00
Enrico Ros a8fefb5a90 Document Editor: inline editing 2024-06-22 16:05:54 -07:00
Enrico Ros 8e3b07fa49 Document Fragment Button: variable height 2024-06-22 15:57:35 -07:00
Enrico Ros 36ac618e88 bits 2024-06-22 15:56:24 -07:00
Enrico Ros ab0eeae1e3 BlocksRenderer: plain code rendering mode 2024-06-22 15:55:32 -07:00
Enrico Ros f74adffa12 MP: Fix overall layout 2024-06-22 15:08:52 -07:00
Enrico Ros 8f23f41e2f bits 2024-06-22 13:20:05 -07:00
Enrico Ros 7d04844c6a DocumentFragment: improve 2024-06-21 03:47:53 -07:00
Enrico Ros c301dcc226 TextAttachmentFragment: works 2024-06-21 03:13:30 -07:00
Enrico Ros 8dd4ece730 PartImageRefDBlob: extract 2024-06-21 02:49:27 -07:00
Enrico Ros 75bd68f9fe PartImageRef: improve bifurcation 2024-06-21 02:18:58 -07:00
Enrico Ros 96af022afa BlocksRenderer: remove isBottom 2024-06-21 02:18:58 -07:00
Enrico Ros c570c68f1b TextAttachments: begin 2024-06-21 02:18:58 -07:00
Enrico Ros 21a226a486 Restore the Bubble menu 2024-06-21 00:06:01 -07:00
Enrico Ros 2695cb8e46 MP: align items correctly 2024-06-21 00:06:01 -07:00
Enrico Ros 2207405ebc MP: improve text part addition 2024-06-20 23:34:42 -07:00
Enrico Ros 3802123147 Double-click to edit: on again (differentiator) 2024-06-20 20:24:05 -07:00
Enrico Ros c6c630f5c6 Auto-UI: add one more message 2024-06-20 20:22:11 -07:00
Enrico Ros 7c76a17c08 RenderCode: borderless 2024-06-20 20:08:43 -07:00
Enrico Ros 5ba7723fa0 shift to delete without confirmation 2024-06-20 19:12:35 -07:00
Enrico Ros 87ff07c850 Debug: print DMessage 2024-06-20 19:05:34 -07:00
Enrico Ros 71e1a2eeec MP: render Image Attachments 2024-06-20 18:48:32 -07:00
Enrico Ros 88fba0f53a MP: cluster fragments 2024-06-20 17:40:54 -07:00
Enrico Ros 07260a8e06 ChatMessage: pass mobile 2024-06-20 17:37:26 -07:00
Enrico Ros c1d155b569 ImageRender(DataRef): Change buttons order 2024-06-20 17:36:10 -07:00
Enrico Ros 7e7cfe1db1 ContentPartImage: introduce a lighter variant 2024-06-20 17:35:27 -07:00
Enrico Ros d27a44ab7f TS 5.5.2 fixes 2024-06-20 14:55:02 -07:00
Enrico Ros 2adcca1cda roll packages 2024-06-20 14:43:43 -07:00
Enrico Ros cf854b7262 Merge branch 'refs/heads/main' into feature-multipart 2024-06-20 12:43:06 -07:00
Enrico Ros ecb0e07312 Merge branch 'refs/heads/main-stable' 2024-06-20 12:42:51 -07:00
Enrico Ros 7d6d7e619b Anthropic: hardcode date 2024-06-20 12:42:10 -07:00
Enrico Ros 8b2b88c7cb Merge branch 'refs/heads/main' into feature-multipart 2024-06-20 12:28:53 -07:00
Enrico Ros 9af1a6a16b Merge branch 'refs/heads/main-stable' 2024-06-20 12:28:36 -07:00
Enrico Ros 34caa16e39 1.16.3: release 2024-06-20 12:27:42 -07:00
Enrico Ros 976426dbd3 Anthropic: support Claude 3.5 Sonnet 2024-06-20 12:27:26 -07:00
Enrico Ros d1ac9adc7e executor: bits 2024-06-20 11:41:31 -07:00
Enrico Ros 513edf90f7 executor: begin cleanups 2024-06-19 19:48:48 -07:00
Enrico Ros 60d47510ab Auto-UI: further improve 2024-06-19 19:33:31 -07:00
Enrico Ros 5b7b9837f0 Chats: group by conversation size 2024-06-19 19:27:29 -07:00
Enrico Ros 333c3327c4 Text areas: deprecate enterIsNewline on text edits that have buttons 2024-06-19 18:59:55 -07:00
Enrico Ros 9723c98940 Auto-suggestions: cleanups 2024-06-19 18:47:38 -07:00
Enrico Ros 97604f3c5b Auto-UI: update 2024-06-19 18:40:30 -07:00
Enrico Ros 044f18da46 bits 2024-06-19 18:08:44 -07:00
Enrico Ros 53946b9523 Llms: begin cleaning up 2024-06-19 18:07:16 -07:00
Enrico Ros fd8f88c5e4 Chat: reorg 2024-06-19 13:29:01 -07:00
Enrico Ros e7d15ce2b0 bits 2024-06-19 12:55:02 -07:00
Enrico Ros ff1d98a87e MP: Improve ownership, restore GC 2024-06-19 11:58:09 -07:00
Enrico Ros accc68cd28 Attachments: cleanup of ownership 2024-06-19 11:57:45 -07:00
Enrico Ros b2c7bc980f DBlobs: type Context and Scope 2024-06-19 11:51:49 -07:00
Enrico Ros 75fbe8d5d8 PDFUtils: skip load in dev 2024-06-19 11:34:18 -07:00
Enrico Ros 13ebf3b3aa Composer: cleanups 2024-06-19 11:13:44 -07:00
Enrico Ros 916d3812db MP: Update follow-up prompts 2024-06-19 09:44:04 -07:00
Enrico Ros 90610c819b MP: AppChat: send logic 2024-06-19 09:22:23 -07:00
Enrico Ros a5f6f62559 Hide the block title when rendering html. 2024-06-19 08:49:16 -07:00
Enrico Ros bfb3501dec MP: Composer: go out in multipart 2024-06-18 16:30:26 -07:00
Enrico Ros c0513c50b1 MP: Attach: cleanups 2024-06-18 15:54:16 -07:00
Enrico Ros bcf4baf004 MP: Attach: rationalize 2024-06-18 15:35:20 -07:00
Enrico Ros 53bf948a04 ChatMessage: extract avatars 2024-06-18 14:47:13 -07:00
Enrico Ros 2186d91f89 MP: ChatMessage: Attachments begin 2024-06-18 14:47:13 -07:00
Enrico Ros aaf856a503 MP: ChatMessage: extract Fragments list 2024-06-18 14:19:57 -07:00
Enrico Ros 8af625b7dc Code: fix render lines suppression 2024-06-18 14:03:30 -07:00
Enrico Ros 4690891757 Code: render lines 2024-06-18 12:57:24 -07:00
Enrico Ros bb3e17c0fa Cleanups 2024-06-18 11:31:49 -07:00
Enrico Ros 7965df5ff2 Text Parts Editor: buttons to edit 2024-06-18 03:55:34 -07:00
Enrico Ros 5b5f0a5a8d Text Parts Editor: style 2024-06-18 02:56:32 -07:00
Enrico Ros fdb087a39b Text Parts Editor: works! 2024-06-18 02:43:34 -07:00
Enrico Ros 97749378d6 Text Parts Editor: begin 2024-06-18 02:43:26 -07:00
Enrico Ros 63dc2301ff Bits 2024-06-18 01:13:00 -07:00
Enrico Ros 5659c0bc70 Auto-UI: Remove bloat 2024-06-18 00:11:32 -07:00
Enrico Ros 1e288ab0fd Auto-UI: Update prompts 2024-06-17 21:37:04 -07:00
Enrico Ros 4f058a0174 RenderHTML: use a simple CSS reset and coalesce timers 2024-06-17 21:06:52 -07:00
Enrico Ros 7284114565 Code render: improve fallback while loading 2024-06-17 20:13:07 -07:00
Enrico Ros 0b2592dbd7 tRPC: un-batch for now 2024-06-17 19:53:38 -07:00
Enrico Ros edfaf6f002 Cleaner errors 2024-06-17 19:49:20 -07:00
Enrico Ros da3990b614 Save toolbar space 2024-06-17 19:49:16 -07:00
Enrico Ros 25740ae13c MP: Image parts support deletion 2024-06-17 19:48:37 -07:00
Enrico Ros fb4c05f698 Bits 2024-06-17 18:48:22 -07:00
Enrico Ros a0c4e37c94 MP: Remove duplicate Placeholdering 2024-06-17 18:23:17 -07:00
Enrico Ros 278caf6f0c MP: Rename PH 2024-06-17 16:33:43 -07:00
Enrico Ros 2ce0c61f83 MP: Add Placeholder and Error parts 2024-06-17 16:23:10 -07:00
Enrico Ros afb25324a7 DMessage: logic to index by fragmentIds 2024-06-17 11:23:47 -07:00
Enrico Ros ba1b761c08 DMessage: add fragment Id (not unique) and a type sentinel 2024-06-17 09:04:56 -07:00
Enrico Ros 0e2d4af617 tRPC-11: workaround a transformation bug in SuperJSON/tRPC/NextJS
May be related to:
- https://github.com/blitz-js/superjson/issues/242
- https://github.com/blitz-js/superjson/issues/283
2024-06-17 00:36:08 -07:00
Enrico Ros 1b0b54a072 tRPC-11: Loading states with React-Query 2024-06-17 00:12:47 -07:00
Enrico Ros 9c629d3c5c tRPC-11: Server 2024-06-17 00:12:47 -07:00
Enrico Ros 173af4e459 Bits 2024-06-17 00:12:47 -07:00
Enrico Ros c0f12c0a5d tRPC-11: Client 2024-06-17 00:12:47 -07:00
Enrico Ros 390605fe66 Roll packages 2024-06-16 17:42:26 -07:00
Enrico Ros e4bd5f865c Migrate to scoped nanoid() 2024-06-16 17:33:46 -07:00
Enrico Ros b31c891772 Fix compile 2024-06-16 17:26:32 -07:00
Enrico Ros 08e4016972 Auto-ui: include prompt auto-mix-in 2024-06-15 17:38:37 -07:00
Enrico Ros aea7eb6ba3 Auto-ui: improve rendering and integration 2024-06-15 17:24:10 -07:00
Enrico Ros 5496750085 Auto-ui: better execution security 2024-06-15 17:23:54 -07:00
Enrico Ros 4b9709898c Auto-ui: improve settings 2024-06-15 16:49:35 -07:00
Enrico Ros 705daac737 RenderHTML: do not scroll the parent frame when keys are pressed within 2024-06-15 02:51:09 -07:00
Enrico Ros a802b32f47 Auto-HTML UI: auto-render
Added DANGER disclaimers in the code and UI. Just a testing mode for fun.
2024-06-15 01:09:32 -07:00
Enrico Ros 8b8db5e447 Auto-HTML UI test 2024-06-15 00:15:58 -07:00
Enrico Ros 3ee44599c7 MP: Auto-diagrams (chat) fix. 2024-06-14 23:52:20 -07:00
Enrico Ros 2955a41ed5 Attachments: lower the image quality a tad (very large files) 2024-06-14 22:46:23 -07:00
Enrico Ros a52802c882 Attachments: when resizing (openai-*), force format conversion 2024-06-14 22:46:10 -07:00
Enrico Ros b46c70512a Beam: fix #552 2024-06-14 18:29:12 -07:00
Enrico Ros 18f91e2eeb Beam: flatter design 2024-06-14 17:53:52 -07:00
Enrico Ros 9296984569 Layout: preserve state on resizes 2024-06-14 15:24:14 -07:00
Enrico Ros 7b835d9855 Draw: use the queue 2024-06-14 08:52:40 -07:00
Enrico Ros ce23b9169b Misc 2024-06-14 01:16:45 -07:00
Enrico Ros 47a535d309 Chat: show has drawings icon 2024-06-13 23:17:53 -07:00
Enrico Ros 6342801aa0 Bits 2024-06-13 22:55:46 -07:00
Enrico Ros 50c00f5516 Bootup to the right drawer opening state 2024-06-13 22:53:15 -07:00
Enrico Ros 4a49678fb6 T2I: rename providerId 2024-06-13 22:34:54 -07:00
Enrico Ros 0f10b8f677 MP: filter chats for images 2024-06-13 22:21:45 -07:00
Enrico Ros d8433b79cc MP: regenerate in place 2024-06-13 21:40:49 -07:00
Enrico Ros f94f640212 MP: share common draw/store logic 2024-06-13 18:19:02 -07:00
Enrico Ros 5cf779757f MP: improve fetch logic? 2024-06-13 17:40:19 -07:00
Enrico Ros d49acf379e DBlobs: show usage if storage persistence fails 2024-06-13 16:36:06 -07:00
Enrico Ros b9bff4abc0 DBlobs: try to persist with the browser 2024-06-13 16:24:06 -07:00
Enrico Ros 6fc4dbe9d1 CSS fix 2024-06-13 16:09:31 -07:00
Enrico Ros cca8132a2c DBlobs: rationalize image usage and GC 2024-06-13 16:02:21 -07:00
Enrico Ros 91654ca219 Chat: option to regenerate images in-place 2024-06-13 03:57:48 -07:00
Enrico Ros 547d7eca59 Draw: gallery empty state 2024-06-13 03:13:41 -07:00
Enrico Ros b86bf31baa DBlob: fixup post-rename 2024-06-13 02:54:43 -07:00
Enrico Ros 5b5b4efe42 Chat symbol: render support 2024-06-13 02:47:21 -07:00
Enrico Ros e9fb65edba DBlobs: refactor DBlobAssetId 2024-06-13 02:42:43 -07:00
Enrico Ros cc1cba9aa8 DBlobs: refactor 2024-06-13 02:06:10 -07:00
Enrico Ros a765c566c8 DBlobs: simplify 2024-06-13 01:19:13 -07:00
Enrico Ros 63e9022b84 add Nanoid 2024-06-13 00:29:16 -07:00
Enrico Ros 368a995e7f DBlobs: rename the table 2024-06-13 00:29:16 -07:00
Enrico Ros c844c66b5a DBlobs: survive hot reloads 2024-06-12 23:27:24 -07:00
Enrico Ros 73b18313e9 Draw: layout 2024-06-12 23:09:48 -07:00
Enrico Ros bdd68dc6c9 DBlobs: sanity fix 2024-06-12 23:08:08 -07:00
Enrico Ros 3901b94382 Draw: add rounded 2024-06-12 22:11:06 -07:00
Enrico Ros 82ac276338 Draw: fix layout 2024-06-12 22:07:16 -07:00
Enrico Ros 02c9f3ebdb Draw: bare bones enhancer 2024-06-12 15:52:10 -07:00
Enrico Ros 364ad63877 Draw: Merge T2I back into DrawCreate 2024-06-12 02:43:44 -07:00
Enrico Ros 5fc4196d01 Draw: fix fallbacks 2024-06-12 02:24:56 -07:00
Enrico Ros 3a1e10bd21 Fix wrapping of radios 2024-06-12 02:10:59 -07:00
Enrico Ros 73519ec562 Draw: configure provider opens up top 2024-06-12 01:15:33 -07:00
Enrico Ros bf9c9916b1 Draw: improve prompt composer 2024-06-12 01:15:04 -07:00
Enrico Ros 01d017c6cd Draw: dynamic header 2024-06-12 00:37:44 -07:00
Enrico Ros ca98ab02d8 Draw: improve numbers 2024-06-12 00:37:36 -07:00
Enrico Ros 347804a02e Draw: fix dom 2024-06-11 23:43:47 -07:00
Enrico Ros 4c80f8dbf4 Draw: improve 2024-06-11 23:41:16 -07:00
Enrico Ros 73ee96040f Draw: heading 2024-06-11 22:09:04 -07:00
Enrico Ros 6180da1333 MP: cleanups 2024-06-11 19:53:44 -07:00
Enrico Ros 2756ff6ad0 MP: fix 2024-06-11 19:50:03 -07:00
Enrico Ros e57491b812 MP: DBlob GC on message/chat deletion 2024-06-11 19:50:00 -07:00
Enrico Ros 9d8ae538d9 Draw: thumbnail in gallery 2024-06-11 19:41:12 -07:00
Enrico Ros dd7defd2c7 DBlobs: auto-gen image thumbnail 2024-06-11 19:41:04 -07:00
Enrico Ros e79ec45b5b Draw: bare bones gallery 2024-06-11 19:13:48 -07:00
Enrico Ros 1a138bbc16 DesktopDrawer: do not get in the way when closed 2024-06-11 19:11:09 -07:00
Enrico Ros b067165471 Draw: cleans 2024-06-11 18:31:37 -07:00
Enrico Ros 6fbcbb9399 Draw: renames 2024-06-11 15:11:22 -07:00
Enrico Ros aaf77b4e20 Draw: renames 2024-06-11 15:06:18 -07:00
Enrico Ros f5cc2e952b Draw: sections 2024-06-11 14:50:02 -07:00
Enrico Ros eeab362567 cleanups 2024-06-11 14:45:49 -07:00
Enrico Ros 834205c426 DBlobs: renames 2024-06-11 14:13:17 -07:00
Enrico Ros fbad8ca62e DBlobs: gc on chat images 2024-06-11 13:48:21 -07:00
Enrico Ros 1e4c6f13c5 MP: show images 2024-06-11 12:56:12 -07:00
Enrico Ros b7c2b3d4cb RenderImageURL: improve greatly 2024-06-11 12:53:55 -07:00
Enrico Ros 0d5b7d36f1 Message Fragments: update v-layout 2024-06-11 12:10:47 -07:00
Enrico Ros 059886fede Mobile menu: shrink a bit 2024-06-11 12:08:22 -07:00
Enrico Ros db7dd0ca43 DBlobs: 'ot' for the origin type 2024-06-11 12:07:53 -07:00
Enrico Ros f4c611b47d DBlobs: reactive live hooks 2024-06-11 01:51:08 -07:00
Enrico Ros 39c32646c5 Merge branch 'refs/heads/main' into feature-multipart 2024-06-10 23:57:05 -07:00
Enrico Ros 1720fffbdc Merge remote-tracking branch 'refs/remotes/opensource/main-stable' 2024-06-10 23:56:43 -07:00
Enrico Ros b4d8e39d56 Gemini: acknowledge the new capability to createCachedContent. Fixes #565 2024-06-10 23:56:02 -07:00
Enrico Ros 6c51cd0d1d Fix Tooltip on errors 2024-06-10 23:54:59 -07:00
Enrico Ros cb9cdc508a MP: rename Content Parts 2024-06-10 23:35:53 -07:00
Enrico Ros 7d037a206f MP: enable multipart edits 2024-06-10 22:41:46 -07:00
Enrico Ros ace10ab4be MP: begin Fragment extraction and simplify BlockRenderer 2024-06-10 21:46:45 -07:00
Enrico Ros bc0a7b6ac3 Rename RenderImageURL 2024-06-10 21:45:40 -07:00
Enrico Ros e77e2045e3 MP: Message porting skel 2024-06-10 19:29:01 -07:00
Enrico Ros abbd55c740 Message: renames 2024-06-09 19:16:46 -07:00
Enrico Ros bf5e80a462 MP: adapt ego attachment, messageSingleTextOrThrow-- 2024-06-09 19:00:01 -07:00
Enrico Ros 121deaae5f bits 2024-06-09 18:01:49 -07:00
Enrico Ros 80317232ba MP: improve fragment typings 2024-06-09 17:44:25 -07:00
Enrico Ros 22f815dcd1 do not load 'pdfjs-dist' during development, to make '--turbo' work 2024-06-09 17:07:36 -07:00
Enrico Ros fb96c3ab47 Merge branch 'refs/heads/main' into feature-multipart
# Conflicts:
#	src/modules/aifn/autosuggestions/autoSuggestions.ts
#	src/modules/aifn/autotitle/autoTitle.ts
2024-06-07 14:24:03 -07:00
Enrico Ros 3b15ad51a1 Merge branch 'refs/heads/main-stable' 2024-06-07 14:23:21 -07:00
Enrico Ros 11c41e7381 Function call: increase debug verbosity 2024-06-07 14:18:01 -07:00
Enrico Ros 358d8a54ff Increase llms alignment before function calling. 2024-06-07 14:11:36 -07:00
Enrico Ros 3c8fedce68 Highlight issues with chatGenerateWithFunctions 2024-06-07 12:38:21 -07:00
Enrico Ros 5066336c75 Merge branch 'refs/heads/main-stable' 2024-06-07 12:16:49 -07:00
Enrico Ros 1744b5b9d0 Throw if function calling on a model that doesn't support it 2024-06-07 12:15:25 -07:00
Enrico Ros 0807744577 Option to see model interfaces 2024-06-07 12:09:38 -07:00
Enrico Ros 59f871d3ec Merge branch 'refs/heads/main' into feature-multipart
# Conflicts:
#	src/apps/chat/editors/chat-stream.ts
#	src/modules/beam/gather/instructions/ChatGenerateInstruction.tsx
#	src/modules/beam/scatter/beam.scatter.ts
2024-06-06 22:15:17 -07:00
Enrico Ros fed351a2fc Merge branch 'refs/heads/main-stable'
# Conflicts:
#	package-lock.json
#	package.json
#	src/common/util/token-counter.ts
2024-06-06 22:11:43 -07:00
Enrico Ros 0c15476dd2 1.16.2: release 2024-06-06 22:10:27 -07:00
Enrico Ros 94ef76c67e Gemini: update
(cherry picked from commit 3050b546ac)
2024-06-06 21:42:47 -07:00
Enrico Ros bd5bf6f94f Gemini: update
(cherry picked from commit 1429726ba6)
2024-06-06 21:42:47 -07:00
Enrico Ros 1fbf454c3c Add Codestral - Fixes #558
(cherry picked from commit 4075581acd)
2024-06-06 21:42:47 -07:00
Enrico Ros 07b62fe5c1 Streaming uplink: index sources for unification. 2024-06-06 21:42:47 -07:00
Enrico Ros 7fbf6ee2e8 Fix Domino issue (crash) by upgrading Turndown to 7.2.0
See:
https://github.com/mixmark-io/turndown/issues/439
https://github.com/fgnass/domino/issues/146
(cherry picked from commit baad3ae1c3)
2024-06-06 21:41:04 -07:00
Enrico Ros ba66fc30c5 Fix TimeoutError issue
(cherry picked from commit 7c099cab94)
2024-06-06 21:41:04 -07:00
Enrico Ros 45b7ed3220 Mistral: update pricing
(cherry picked from commit 05aa4b547f)
2024-06-06 21:41:04 -07:00
Enrico Ros 20f1c4c0ae Mistral: update
#518

(cherry picked from commit 6afb61d25d)
2024-06-06 21:41:04 -07:00
Enrico Ros 97b6fc5e2b Already Set
(cherry picked from commit a7ce5c1ca6)
2024-06-06 21:41:04 -07:00
Enrico Ros 44d8c30187 Start opened
(cherry picked from commit 952bd2bd93)
2024-06-06 21:41:04 -07:00
Enrico Ros e3957bf08b Page download: improve
(cherry picked from commit f9d33d4888)
2024-06-06 21:41:03 -07:00
Enrico Ros acfe0aba21 Beam: bits
(cherry picked from commit 81d99f19d4)
2024-06-06 21:41:03 -07:00
Enrico Ros 6247b5411b Beam: recall importing rays
(cherry picked from commit 454a4257da)
2024-06-06 21:41:03 -07:00
Enrico Ros 5cc0b0a011 Beam: fix reactive bug
(cherry picked from commit e513b42786)
2024-06-06 21:41:03 -07:00
Enrico Ros 1fed2fb18c Beam: if auto-start, give the chance to change merge model
(cherry picked from commit b607e3c034)
2024-06-06 21:41:03 -07:00
Enrico Ros 8a0e7a4e3d Tiktoken: in the future, show tokens
(cherry picked from commit d5c3f5012b)
2024-06-06 21:41:03 -07:00
Enrico Ros 29a784c6c6 Update TikToken for perfect token computation on 'o' models.
(cherry picked from commit 21d045be59)
2024-06-06 21:41:03 -07:00
Enrico Ros 409a3ee194 DChat: remove IDB migration
(cherry picked from commit 44ab0483b6)
2024-06-06 21:41:03 -07:00
Enrico Ros 54caa3e01a Gemini: improve support (incl. interfaces, cost, visibility)
(cherry picked from commit 9eb0cc0b62)
2024-06-06 21:41:03 -07:00
Enrico Ros e1a723a39f (bits)
(cherry picked from commit 2db74867f5)
2024-06-06 21:41:03 -07:00
Enrico Ros 463ea35d7c Default to the full context window
(cherry picked from commit fd30baafb8)
2024-06-06 21:41:03 -07:00
Enrico Ros f751c91c68 Browse: improve markdown transform
(cherry picked from commit 3623eef47f)
2024-06-06 21:41:03 -07:00
Enrico Ros ad24c8771a Browse: full support for markdown transform
(cherry picked from commit 7b07bb7884)
2024-06-06 21:41:03 -07:00
Enrico Ros 6f82e2c3ed Browse: markdown transform as default
(cherry picked from commit 7946cd6614)
2024-06-06 21:41:03 -07:00
Enrico Ros f4b39071f0 Browse: support transform (skel)
(cherry picked from commit 51b6e30986)
2024-06-06 21:41:03 -07:00
Enrico Ros 621c968f3f Hold Shift to delete without confirmation: fixes #537
(cherry picked from commit 002df7b0f9)
2024-06-06 21:41:03 -07:00
Enrico Ros aeb129e422 roll: minor packages 2024-06-06 11:21:23 -07:00
Enrico Ros 3050b546ac Gemini: update 2024-06-06 10:13:37 -07:00
Enrico Ros 1429726ba6 Gemini: update 2024-06-06 10:10:06 -07:00
Enrico Ros 4075581acd Add Codestral - Fixes #558 2024-06-06 09:59:31 -07:00
Enrico Ros 56774fd974 roll: mermaid 10.9.1 from CDN 2024-06-06 09:36:08 -07:00
Enrico Ros 5e674d2299 Dynamic won't be required from Next 15 2024-06-04 20:49:05 -07:00
Enrico Ros 06f5b6d6ff Silence warnings by declaring asyncFunction available on the browsers side 2024-06-04 20:44:01 -07:00
Enrico Ros b25b4e6c8f roll: next 14.2 2024-06-04 20:05:06 -07:00
Enrico Ros 645e07dba8 roll: pdfjs-dist 2024-06-04 20:04:51 -07:00
Enrico Ros 46181fcaa2 roll: misc 2024-06-04 19:32:08 -07:00
Enrico Ros 8d7ae425f9 roll: cloudflare/puppeteer 2024-06-04 18:34:56 -07:00
Enrico Ros 7d572334a1 roll: misc 2024-06-04 18:19:38 -07:00
Enrico Ros 5dab6f68e6 roll: mui 2024-06-04 18:18:04 -07:00
Enrico Ros d1c595d8db Text 2024-06-04 07:09:56 -07:00
Enrico Ros eaa2635b51 T2I: port TextToImage (partial) 2024-06-03 13:55:11 -07:00
Enrico Ros dc2d226ddb T2I: port image-generate 2024-06-03 13:41:57 -07:00
Enrico Ros 336a4e1f35 T2I: separate data/mime 2024-06-03 13:40:45 -07:00
Enrico Ros 4d3b6b4f43 MP: cleaner contentFragments additions 2024-06-03 12:57:59 -07:00
Enrico Ros a12601b49c Merge remote-tracking branch 'feature-t2i-b64' into feature-multipart
# Conflicts:
#	src/apps/chat/editors/image-generate.ts
2024-06-03 12:05:48 -07:00
Enrico Ros 15a895064e ChatMessage: bits 2024-06-03 12:02:35 -07:00
Enrico Ros 8bd1507ace ChatMessage: Fix Avatar on Mobile 2024-06-03 11:42:46 -07:00
Enrico Ros 89d7ec5d0b ChatMessage: disable diffing 2024-06-03 10:16:55 -07:00
Enrico Ros 670e57735a MP: relax singleTextOrThrow 2024-06-03 10:10:54 -07:00
Enrico Ros fa703c25e8 Attachments: disable GC drafts for now 2024-06-03 09:34:57 -07:00
Enrico Ros f58161b1d1 Attachments: GC drafts 2024-06-03 09:33:53 -07:00
Enrico Ros 8db2a37a59 Attachments: remove DBlobs when setting outputFragments, until GC comes 2024-06-03 09:21:58 -07:00
Enrico Ros bfdb9c2624 Attachments: remove race condition on conversion 2024-06-03 09:15:11 -07:00
Enrico Ros 240e984737 DBlob: types 2024-06-03 09:05:46 -07:00
Enrico Ros fe128c18b1 MP: improve dmessage part/reference functions and cloning 2024-06-03 08:48:42 -07:00
Enrico Ros b208d8c40d MP: fix streaming text 2024-05-26 02:55:55 -07:00
Enrico Ros 556641e1f4 MP: fix V3 chats porting 2024-05-26 02:47:11 -07:00
Enrico Ros 464eb671db MP: upgrade V3 to V4 (store, links, jsons) 2024-05-25 21:13:45 -07:00
Enrico Ros 12b8f1e3ef MP: refine DMessage/DMessageFragment
Once again, large change.
2024-05-25 20:17:43 -07:00
Enrico Ros ab199afe0d Beam: reminder the save/restore on a per-message basis, #483 2024-05-25 15:53:56 -07:00
Enrico Ros fe1a498da0 Beam: also enable method selection on AutoStart 2024-05-25 15:51:37 -07:00
Enrico Ros 4f9d55eb42 Attachments: +Plain Mime 2024-05-25 03:49:21 -07:00
Enrico Ros 70f450f547 Attachments: restored take and copy 2024-05-25 02:56:17 -07:00
Enrico Ros 28fc7deefc MP: rename to contentRef 2024-05-25 00:40:39 -07:00
Enrico Ros 428babf856 Tokens: estimate images tokens 2024-05-25 00:28:15 -07:00
Enrico Ros b824ddf2e3 Attachments: uniform remove 2024-05-24 22:33:33 -07:00
Enrico Ros 2396966740 Tokens: rename the text methods 2024-05-24 22:25:14 -07:00
Enrico Ros 23ca49128a Attachments: consolidation 2024-05-24 19:35:26 -07:00
Enrico Ros ec6bdede20 Attachments: improvements 2024-05-24 18:06:45 -07:00
Enrico Ros 4ada2013d2 Attachments: correct rescaling 2024-05-24 17:31:36 -07:00
Enrico Ros 79afef6bc1 Attachments: more rescaling pains 2024-05-24 16:52:49 -07:00
Enrico Ros e7000df89f Attachments: no upsizing of small images 2024-05-24 16:30:10 -07:00
Enrico Ros 59f77a64ea Attachments: open images from the menu in new tabs 2024-05-24 16:13:29 -07:00
Enrico Ros 8be152666e Attachments: improve conversions/quality 2024-05-24 15:14:50 -07:00
Enrico Ros 10488854ce Attachments: low/high detail modes 2024-05-24 03:44:59 -07:00
Enrico Ros 6586aafed8 Attachments: resize modes for OpenAI, Google, Anthropic 2024-05-24 03:32:25 -07:00
Enrico Ros 4568a60be3 Attachments: image resize 2024-05-24 03:18:12 -07:00
Enrico Ros 193bc8bb8e Attachments: fix multi-image pdf 2024-05-24 02:20:53 -07:00
Enrico Ros ce381b7690 Attachments: rename main to AttachmentDraft, convert to (overlayed) Store Slice 2024-05-24 01:52:25 -07:00
Enrico Ros b238428816 Chat search: sort by date by default 2024-05-24 00:27:31 -07:00
Enrico Ros 0ac37f50cf Attachments: remove old code 2024-05-23 22:29:44 -07:00
Enrico Ros 54b9389b77 MP: Attachments full port, incl. Storage 2024-05-22 02:56:23 -07:00
Enrico Ros a183c26e51 PDFUtils: improve PDF to image 2024-05-22 02:56:23 -07:00
Enrico Ros 01a03d164c ImageUtils: add dimension guessers and converters 2024-05-22 02:56:23 -07:00
Enrico Ros cdff1fde2d TextUtils: update to new uuid 2024-05-22 02:56:23 -07:00
Enrico Ros c38b9998a6 TextUtils: add uuidv4 base64 2024-05-22 02:56:23 -07:00
Enrico Ros 77c1a335ad MP: data at rest cleanup 2024-05-22 02:56:23 -07:00
Enrico Ros 07a0fe6249 MP: text separation 2024-05-22 02:56:23 -07:00
Enrico Ros 204bc46976 MP: append parts to messages 2024-05-22 02:56:23 -07:00
Enrico Ros b910506519 MP: cleanup MP Beam 2024-05-22 02:56:23 -07:00
Enrico Ros 3cef39da17 MP: fix Beam, Rays and Fusions 2024-05-22 02:56:23 -07:00
Enrico Ros 3aea29bcb5 MP: remove typing, support placeholder, improve streaming of updates 2024-05-22 02:56:23 -07:00
Enrico Ros dd0d19168b MP: cleanup conversions 2024-05-22 02:56:22 -07:00
Enrico Ros 6727fcd111 MP: cleanup conversions 2024-05-22 02:56:22 -07:00
Enrico Ros 9d347f4a5a Multi-Part refactor
Partial still. Does not build.
2024-05-22 02:56:22 -07:00
Enrico Ros 084e48ddc2 Desktop Nav: improve menu 2024-05-22 02:55:04 -07:00
Enrico Ros 31e89ce9a1 App: Tokenizer 2024-05-22 02:54:56 -07:00
Enrico Ros baad3ae1c3 Fix Domino issue (crash) by upgrading Turndown to 7.2.0
See:
https://github.com/mixmark-io/turndown/issues/439
https://github.com/fgnass/domino/issues/146
2024-05-21 23:50:32 -07:00
Enrico Ros 7c099cab94 Fix TimeoutError issue 2024-05-18 03:07:04 -07:00
Enrico Ros 811875dd2e idb-keyval: bits 2024-05-16 18:04:27 -07:00
Enrico Ros 127443d550 idb-keyval: crud console fn 2024-05-16 18:03:20 -07:00
Enrico Ros d2064605bf Bits 2024-05-16 04:14:41 -07:00
Enrico Ros 4c6fb61ca8 Draw: enable nav 2024-05-16 04:11:04 -07:00
Enrico Ros 608ba8bcb4 T2I: Adapt callers (fixme) 2024-05-16 04:11:04 -07:00
Enrico Ros b53c054dee T2I: Enrich Generated Output 2024-05-16 04:11:04 -07:00
Enrico Ros 05aa4b547f Mistral: update pricing 2024-05-16 04:02:04 -07:00
Enrico Ros 6afb61d25d Mistral: update
#518
2024-05-16 04:02:03 -07:00
Enrico Ros a7ce5c1ca6 Already Set 2024-05-16 03:25:25 -07:00
Enrico Ros 952bd2bd93 Start opened 2024-05-16 03:03:57 -07:00
Enrico Ros f9d33d4888 Page download: improve 2024-05-16 02:57:50 -07:00
Enrico Ros 81d99f19d4 Beam: bits 2024-05-16 01:41:44 -07:00
Enrico Ros 454a4257da Beam: recall importing rays 2024-05-16 01:35:04 -07:00
Enrico Ros e513b42786 Beam: fix reactive bug 2024-05-16 01:30:37 -07:00
Enrico Ros b607e3c034 Beam: if auto-start, give the chance to change merge model 2024-05-16 01:00:21 -07:00
Enrico Ros d5c3f5012b Tiktoken: in the future, show tokens 2024-05-16 00:55:58 -07:00
Enrico Ros 21d045be59 Update TikToken for perfect token computation on 'o' models. 2024-05-16 00:53:08 -07:00
Enrico Ros a9c1c34dc9 DBlobs: subsystem for storing blobs
Uses Dexie.js fro IndexedDB access.
2024-05-15 23:44:33 -07:00
Enrico Ros 44ab0483b6 DChat: remove IDB migration 2024-05-15 23:43:31 -07:00
Enrico Ros 9eb0cc0b62 Gemini: improve support (incl. interfaces, cost, visibility) 2024-05-14 15:15:53 -07:00
Enrico Ros 2db74867f5 (bits) 2024-05-13 16:24:50 -07:00
Enrico Ros fd30baafb8 Default to the full context window 2024-05-13 16:24:30 -07:00
Enrico Ros 3623eef47f Browse: improve markdown transform 2024-05-13 15:59:46 -07:00
Enrico Ros 7b07bb7884 Browse: full support for markdown transform 2024-05-13 15:38:08 -07:00
Enrico Ros 7946cd6614 Browse: markdown transform as default 2024-05-13 14:49:29 -07:00
Enrico Ros 51b6e30986 Browse: support transform (skel) 2024-05-13 14:34:25 -07:00
Enrico Ros 002df7b0f9 Hold Shift to delete without confirmation: fixes #537 2024-05-13 14:00:43 -07:00
Enrico Ros 564cf0fed0 1.16.1: default:hidden on the first Turbo 2024-05-13 12:04:31 -07:00
Enrico Ros dee9492d4c 1.16.0: update 2024-05-13 12:02:02 -07:00
Enrico Ros 6ae026f7c5 OpenAI: un-star Turbo 2024-05-13 11:49:10 -07:00
Enrico Ros 6bcbe286f3 OpenAI: add support for 'o' models 2024-05-13 11:47:55 -07:00
Enrico Ros 6f35f72607 Beam: auto-merge 2024-05-12 23:39:06 -07:00
Enrico Ros 3a7aa75538 Soft-wrap as a global preference. Fixes #517 2024-05-10 04:05:50 -07:00
Enrico Ros e4e7ac260a pdfjs: image generation (just in case) 2024-05-10 02:46:28 -07:00
Enrico Ros b8aaa4bb42 pdfjs: better parsing (for humans) 2024-05-10 02:19:45 -07:00
Enrico Ros 7793e2694b pdfjs: roll 2024-05-10 02:19:32 -07:00
Enrico Ros 83f2c72f29 Roll packages 2024-05-10 01:38:56 -07:00
Enrico Ros 1caeaee7f0 1.16.0: update News 2024-05-09 01:00:53 -07:00
Enrico Ros f354134234 Update README 2024-05-09 00:56:50 -07:00
Enrico Ros 66219d30e0 ReplyTo: fix bubble 2024-05-09 00:48:24 -07:00
Enrico Ros b9e3942ed8 ChatMessage: fix broken overflow 2024-05-09 00:18:29 -07:00
Enrico Ros 2354cdc1d1 ReplyTo: render in ChatMessage 2024-05-09 00:18:21 -07:00
Enrico Ros d929438df9 ReplyTo: extract 2024-05-09 00:09:17 -07:00
Enrico Ros 1acaed1de7 ReplyTo: Move Bubble 2024-05-09 00:03:22 -07:00
Enrico Ros 16195f8a55 ReplyTo: works 100 for OpenAI, ok for Anthropic, exposes Chat sequencing issues for a couple 2024-05-09 00:00:37 -07:00
Enrico Ros d7fc8c178f 1.16.0: enable cost by default 2024-05-08 15:39:03 -07:00
Enrico Ros 2894e16706 Merge branch 'release-1.16.0' 2024-05-08 15:11:10 -07:00
Enrico Ros c2340f3432 1.16.0: README 2024-05-08 15:03:32 -07:00
Enrico Ros 3b7b3106db Misc 2024-05-08 14:37:31 -07:00
Enrico Ros cff92819f9 1.16.0: News 2024-05-08 14:13:01 -07:00
Enrico Ros 2f981d852b Show message costs (option) 2024-05-08 13:11:21 -07:00
Enrico Ros 8eef74d776 1.16.0: version 2024-05-08 11:53:56 -07:00
Enrico Ros 60e46204dc Update default contextWindow to 8192
And override as per https://github.com/enricoros/big-AGI/pull/518#issuecomment-2090736347
2024-05-07 04:44:38 -07:00
Enrico Ros 6a5d783435 Show Costs on Hover. #480, #341 2024-05-07 04:33:39 -07:00
Enrico Ros 0223e076c4 LLM Options: improve 2024-05-07 03:54:28 -07:00
Enrico Ros ce80c78319 1.16.0: disable Reply-To (note: full in a different branch) 2024-05-07 02:55:14 -07:00
Enrico Ros cc0085ae61 Group vendors (disabled) 2024-05-07 02:46:41 -07:00
Enrico Ros f28e243b9d Chat: perfect execution error reporting, Fixes #523 2024-05-07 02:19:54 -07:00
Enrico Ros 2e4532593f Toggle JSON mode, Fixes #515 2024-05-07 00:58:02 -07:00
Enrico Ros 1f10905a03 Fix model temperaturs 2024-05-07 00:47:11 -07:00
Enrico Ros 88762db484 Anthropic: more precise usage link to show the token usage. Fixes #524 2024-05-06 23:48:41 -07:00
Enrico Ros 3b5ab0ac70 Beam: fix relaxed parsing. Fixes #528 2024-05-06 23:45:34 -07:00
Enrico Ros 8903c9296b OpenRouter: update parser 2024-05-06 22:56:09 -07:00
Enrico Ros 97858a3c94 docs/installation: mention optionality 2024-05-06 22:26:40 -07:00
Enrico Ros 0ec3e83518 Merge pull request #521 from dandv/patch-1
Docs: fix command to run local build
2024-05-06 22:25:51 -07:00
Enrico Ros 8c007b5bf7 Merge pull request #522 from dandv/patch-2
E: grammar in OpenAISourceSetup.tsx
2024-05-06 22:21:46 -07:00
Enrico Ros 768236b0e2 Merge pull request #525 from PrivTEC/patch-1
Correct typo in config-feature-browse.md
2024-05-06 22:20:18 -07:00
Enrico Ros 495d78b885 Perplexity: update models, with the ne online models 2024-05-06 21:20:02 -07:00
Enrico Ros 34b1e515fe Figure out unused model vendors 2024-05-06 21:04:02 -07:00
Sorawit Kongnurat 2ac1789312 Use ctrl and remove alt usage with certain hotkeys for mac shortcuts 2024-05-06 16:34:06 +07:00
PrivTEC 79edbd3fa5 Correct typo in config-feature-browse.md
Corrected the typo from "proyy" to "proxy" in the file `config-feature-browse.md`. This change addresses a small, but significant error in the configuration documentation.
2024-05-06 03:51:04 +02:00
Dan Dascalescu f50d9994e2 E: grammar in OpenAISourceSetup.tsx 2024-05-04 22:22:34 +03:00
Dan Dascalescu 1603d3085f Docs: fix command to run local build 2024-05-04 22:16:12 +03:00
Enrico Ros ccf7036f33 Longer timeouts 2024-05-02 00:43:10 -07:00
Enrico Ros a0a1a5e3c1 Update the proxy desc 2024-05-02 00:09:17 -07:00
Enrico Ros fbf9120859 Default to llama3 2024-05-01 23:59:09 -07:00
Enrico Ros 8a770beec3 Update Ollama models 2024-05-01 23:05:30 -07:00
Enrico Ros 6b31669765 Fix diagrams in Dark mode. Fixes #520 2024-05-01 22:54:53 -07:00
Enrico Ros 26d72fc2d8 DMesage: add metadata 2024-04-25 22:17:36 -07:00
Enrico Ros 5eb56d0994 Move Diff'er. 2024-04-25 22:16:14 -07:00
Enrico Ros dbc4a922d5 Message Toolbar: good looking too. 2024-04-25 22:15:20 -07:00
Enrico Ros 141f423842 Diagrams: auto-switch 2024-04-25 22:15:00 -07:00
Enrico Ros 667f2433ab Diagrams: enter 2024-04-25 22:14:59 -07:00
Enrico Ros fd930ef548 Message Toolbar: fix disappearance 2024-04-25 22:14:49 -07:00
Enrico Ros 7eadfb1a63 E: PageDrawerHeader style 2024-04-25 22:11:28 -07:00
Enrico Ros 67cb07ac92 E: Style 2024-04-25 21:53:10 -07:00
Enrico Ros 96d28c43fc Manifest: update 2024-04-25 18:38:56 -07:00
Enrico Ros e57e3f5f0a Code: soft wrap. Closes #517 2024-04-25 11:41:34 -07:00
Enrico Ros 7b99bd71da Update overlay buttons 2024-04-25 11:36:58 -07:00
Enrico Ros 861a037321 Tweaks 2024-04-24 18:51:40 -07:00
Enrico Ros 84cbe6c434 RenderCode: title looks 2024-04-24 18:33:45 -07:00
Enrico Ros 2cbb811523 RenderCode: fix titles 2024-04-24 12:32:17 -07:00
Enrico Ros 8ef4faa10f Llms: update 'latest' 2024-04-24 12:25:34 -07:00
Enrico Ros f6a1c9bf52 Diagrams: fix centering 2024-04-24 03:42:50 -07:00
Enrico Ros 5d9f6fb4f5 Code blocks: undo the removal of ? 2024-04-24 03:31:00 -07:00
Enrico Ros 66840a8ecd Diagrams: center Mermaid and PlantUML diagrams 2024-04-24 03:30:28 -07:00
Enrico Ros a8ee6b255a Diagrams: improve hotfixes for Haiku and 3.5 2024-04-24 03:30:16 -07:00
Enrico Ros bd73d1c533 Diagrams: improve prompts 2024-04-24 03:30:05 -07:00
Enrico Ros e33c0ebc42 Fix code block separation in case of nested blocks. 2024-04-24 02:42:43 -07:00
Enrico Ros 57e4a35fee AppChat: extract chat executor (1st step) 2024-04-24 01:59:49 -07:00
Enrico Ros d490b57410 Diagrams: improve instructions 2024-04-24 01:59:08 -07:00
Enrico Ros 0416602e5f Diagrams: improve dialog 2024-04-24 01:59:01 -07:00
Enrico Ros ddc27b2eb9 BlockCode: improve looks 2024-04-24 01:36:32 -07:00
Enrico Ros 374deb147b Composer: improve ReplyTo integration 2024-04-24 00:03:30 -07:00
Enrico Ros d2eabd1ad0 Composer: correctness of activation 2024-04-24 00:02:42 -07:00
Enrico Ros efbc625cc3 Composer: onAction callback 2024-04-23 23:52:09 -07:00
Enrico Ros 91ae0b8cb0 Codeblocks: broader inclusion of filenames 2024-04-23 23:46:20 -07:00
Enrico Ros ddc5741b00 Attachments: getCollapsedAttachments 2024-04-23 23:18:39 -07:00
Enrico Ros 4729aca6b0 ReplyTo: improve bubble 2024-04-23 22:56:05 -07:00
Enrico Ros bb4fc3a70c Anthropic: relax key validation on custom deployments. Closes #511 2024-04-23 20:32:08 -07:00
Enrico Ros 5d8084b650 Llms: streaming: cleanups 2024-04-23 05:07:55 -07:00
Enrico Ros f316b892f5 Revert "Llms: fix Streaming timeouts (2)"
This reverts commit cbda1d7cd0.
2024-04-23 03:15:07 -07:00
Enrico Ros cbda1d7cd0 Llms: fix Streaming timeouts (2) 2024-04-23 02:07:20 -07:00
Enrico Ros 2f8e879976 Llms: fix Streaming timeouts 2024-04-23 01:45:27 -07:00
Enrico Ros cc0ac5ae3c React: fix llm naming 2024-04-22 23:59:30 -07:00
Enrico Ros 0185d24fb3 Beam: improve Merge disablement 2024-04-22 23:59:08 -07:00
Enrico Ros 97dbdc9c31 Beam: improve inlining (not ready yet) 2024-04-22 23:58:26 -07:00
Enrico Ros a07c66c9a3 Beam: lay down some inlining code 2024-04-22 21:49:14 -07:00
Enrico Ros 308bd25bc0 Beam: improve Tutorial 2024-04-22 21:48:00 -07:00
Enrico Ros 70066a03b6 Explainer Carousel: improvements 2024-04-22 21:44:17 -07:00
Enrico Ros a7f3872af3 Beam: update bar icons 2024-04-22 16:38:26 -07:00
Enrico Ros 22e10e675a RMB on Chat Avatar brings up the menu 2024-04-22 16:31:30 -07:00
Enrico Ros 89679e946d Beam: remove optionality (/beam, chat mode, composer button & shortcut, message beam from) 2024-04-22 16:12:09 -07:00
Enrico Ros 1d1bb9d3df Beam: explain a possible missing user message 2024-04-22 15:58:39 -07:00
Enrico Ros 8faf2b2595 Beam: move scroll button to the Gather pane 2024-04-22 15:58:18 -07:00
Enrico Ros e47ad9700e Anthropic: workaround for history[0] being assistant 2024-04-22 15:40:48 -07:00
Enrico Ros 372b19a057 Formulas: fix rendering for OpenAI-style inline '\(' and block '\[' latex. Fixes #508 2024-04-22 04:39:12 -07:00
Enrico Ros cbe156a868 Merge branch 'refs/heads/main-stable' 2024-04-22 02:57:08 -07:00
Enrico Ros 181a3881e2 Groq: update models
(cherry picked from commit 3eef03b303)
2024-04-22 02:56:47 -07:00
Enrico Ros 3eef03b303 Groq: update models 2024-04-22 02:52:19 -07:00
Enrico Ros ad56e3165c Beam: fix pixel-bound loading of presets 2024-04-22 02:27:07 -07:00
Enrico Ros b1a96b6e75 Beam: clear heuristics for llm selection 2024-04-22 02:26:48 -07:00
Enrico Ros 56419b1b4e Beam: persist the last configuration 2024-04-22 02:19:17 -07:00
Enrico Ros 372f14a9c5 Beam: auto-configure from Elo 2024-04-22 01:01:43 -07:00
Enrico Ros e1ec56a120 Beam: remove fallbackLlmId 2024-04-22 01:01:33 -07:00
Enrico Ros 5bb11249d6 Beam: remove reactive (view-based) ray conf 2024-04-22 01:01:17 -07:00
Enrico Ros 9fbcca1ff2 Llms: avoid name clash 2024-04-22 00:54:41 -07:00
Enrico Ros 323f2b2c3e Llms: cleaner 2024-04-22 00:52:56 -07:00
Enrico Ros b971d38dd5 Llms: heuristic to auto-pick the best diverse LLMs 2024-04-22 00:49:06 -07:00
Enrico Ros 278f479a3a Beam: rename terminate 2024-04-22 00:48:36 -07:00
Enrico Ros 03aea5678d Llms: misc 2024-04-22 00:17:49 -07:00
Enrico Ros b62b8ee7e6 Beam: App: fix state 2024-04-22 00:12:49 -07:00
Enrico Ros 63f55551e5 Beam: gather show all prompts 2024-04-21 23:30:41 -07:00
Enrico Ros b185fbc57d Beam: fallback llm Id 2024-04-21 23:24:52 -07:00
Enrico Ros ceb9d58e72 Beam: fix import rays 2024-04-21 23:10:47 -07:00
Enrico Ros a0bb515a4f Beam: minor bits 2024-04-21 22:28:36 -07:00
Enrico Ros 2cfac2f18b Beam: combine two menus into one 2024-04-21 22:05:08 -07:00
Enrico Ros d412f538b2 Make it more explicit we're only not rolling this one. 2024-04-21 21:30:26 -07:00
Enrico Ros 94f90ad861 Roll packages, but hold Next back. 2024-04-21 21:22:47 -07:00
Enrico Ros 4a402e7937 Roll pdfjs 2024-04-21 21:19:30 -07:00
Enrico Ros c226d6c391 Lock Next to 14.1, as 14.2 introduces the async/await messages when running/building, and we don't know what it means yet.
"The generated code contains 'async/await' because this module is using "topLevelAwait"."

See: https://github.com/vercel/next.js/issues/64792
2024-04-21 21:17:24 -07:00
Enrico Ros 67410e6c59 Revert "Roll packages." - Next v14.2.2 shows some async/await messages.
See https://github.com/vercel/next.js/issues/64792

This reverts commit 419c361147.
2024-04-21 21:12:32 -07:00
Enrico Ros 419c361147 Roll packages. 2024-04-21 20:39:56 -07:00
Enrico Ros 3769a53ffa Merge pull request #507 from mludvig/arm-build-1
Build multi-arch docker image for x64-64 and ARM64
2024-04-15 22:04:07 -07:00
Michael Ludvig ec4aaa3bfb Cleanup 2024-04-16 16:51:57 +12:00
Michael Ludvig be52680fcd Put back hashes and comments 2024-04-16 16:20:48 +12:00
Michael Ludvig 9d41ab9339 Merge branch 'enricoros:main' into arm-build-1 2024-04-16 12:36:23 +12:00
Michael Ludvig f126fc3087 Cleanup 2024-04-16 11:52:58 +12:00
Michael Ludvig 764377037c Disabled arm 32 again (not supported by Prisma) 2024-04-16 11:22:15 +12:00
Michael Ludvig 8e09eaab45 Add sha tag 2024-04-16 11:10:32 +12:00
Michael Ludvig 6523da186c Update versions, add arm32 2024-04-16 10:29:18 +12:00
Michael Ludvig 6471fd8b6f Enable action 2024-04-16 10:01:41 +12:00
Michael Ludvig 247a74881a Added buildx support 2024-04-15 11:34:42 +12:00
Enrico Ros 3ef09f0a5f Models: upgrade data structure to v2 - auto-pick 2024-04-12 05:50:46 -07:00
Enrico Ros b924d331f9 Models: upgrade data structure to v2 2024-04-12 05:36:18 -07:00
Enrico Ros 14041b6012 Beam: simplify a bit 2024-04-12 03:44:54 -07:00
Enrico Ros 2c6cc5ecec Cleanup models update logic 2024-04-12 02:44:14 -07:00
Enrico Ros ac022b1df0 Models: adding prices and benchmarks for a few models 2024-04-12 02:09:14 -07:00
Enrico Ros 0a2081de08 Better Beam Hint 2024-04-12 01:06:25 -07:00
Enrico Ros 64a8e554c7 Designer update 2024-04-12 00:46:58 -07:00
Enrico Ros 082d29fd2f Improve style 2024-04-12 00:45:00 -07:00
Enrico Ros ba5cf9d002 Composer: show the bubble 2024-04-12 00:22:55 -07:00
Enrico Ros 57a55318df Stabilize 2024-04-12 00:07:40 -07:00
Enrico Ros e70f4f7a59 ChatMessageList: this side is probably done 2024-04-11 21:10:56 -07:00
Enrico Ros 1d217fad67 Warning 2024-04-11 21:10:39 -07:00
Enrico Ros e95d46f085 ConversationHandler: prepare chat overlays 2024-04-11 21:08:04 -07:00
Enrico Ros f4577878e1 ChatMessage: Reply on 2024-04-11 20:36:32 -07:00
Enrico Ros 1bd1e5c8e3 ChatMessage: Toolbar complete 2024-04-11 20:19:30 -07:00
Enrico Ros c975dee965 ChatMessageList: remove menu items if t2i off 2024-04-11 19:22:03 -07:00
Enrico Ros 9d690f4219 ChatMessage: fix double-closure 2024-04-11 18:22:12 -07:00
Enrico Ros 29ddb3f58d ChatMessage: improve menu 2024-04-11 18:12:44 -07:00
Enrico Ros 8626bc0b1c BlocksRenderer: selection color 2024-04-11 18:12:37 -07:00
Enrico Ros c362cf6596 Propagate information on whether this can be spoken 2024-04-11 17:52:50 -07:00
Enrico Ros 97264fc5ff ChatMessage: toolbar framework 2024-04-11 17:04:44 -07:00
Enrico Ros 494c4409c1 BlocksRenderer: more v-padding for an improved mouse-up behavior 2024-04-11 16:40:47 -07:00
Enrico Ros d46e366c81 Blocks Renderer: use refs 2024-04-11 13:16:13 -07:00
Enrico Ros 6afe33ee9c decolor 2024-04-11 10:13:54 -07:00
Enrico Ros 903c9e1cc3 Improve options 2024-04-11 10:12:03 -07:00
Enrico Ros 3ef43fc3f5 Merge branch 'joriskalz-chat-with-youtube' 2024-04-11 09:58:56 -07:00
Enrico Ros b1c3be05dd Integrate YouTube transcriber (hidden by default) 2024-04-11 09:58:45 -07:00
Enrico Ros efee23b4a7 Update shadows 2024-04-11 09:49:13 -07:00
Enrico Ros 06b67a7586 Merge branch 'chat-with-youtube' of https://github.com/joriskalz/big-AGI-dev into joriskalz-chat-with-youtube 2024-04-11 09:33:56 -07:00
Joris Kalz 889a2dbf9d Remvoved unwanted new line. 2024-04-11 11:45:03 +01:00
Joris Kalz 2f80fcc888 Removed comments 2024-04-11 11:43:54 +01:00
Joris Kalz f7ee479c1d Removed comments 2024-04-11 11:36:27 +01:00
Joris Kalz 94fa0981fe Update YouTube Transcriber voiceId in data.ts 2024-04-11 11:33:55 +01:00
Joris Kalz 4c74afe438 Update YouTube Transcriber system message in data.ts 2024-04-11 11:33:42 +01:00
Joris Kalz f76cea22de Fix YouTube Transcriber activation bug in PersonaSelector component 2024-04-10 22:18:35 +01:00
Joris Kalz 3d49110808 Implement handleAddMessage function in PersonaSelector component 2024-04-10 22:14:15 +01:00
Joris Kalz 88a4579f7a Refactor PersonaSelector component to handle YouTube Transcriber tile click 2024-04-10 22:00:29 +01:00
Joris Kalz 241bde0333 Update YouTubeURLInput component to handle YouTube video transcripts 2024-04-10 21:48:20 +01:00
Joris Kalz 73c7867cd6 Add YouTube Transcriber persona and handle YouTube Transcriber tile click 2024-04-10 11:53:48 +01:00
Enrico Ros b35254f7ad Qol 2024-04-10 03:14:15 -07:00
Enrico Ros 213e78c956 Beam: save the merge model, and shrink rays when loading a smaller preset 2024-04-10 03:01:18 -07:00
Enrico Ros 7bf552c491 1.15.1 2024-04-10 01:09:25 -07:00
Enrico Ros 3bf9923f86 Update README 2024-04-10 01:03:06 -07:00
Enrico Ros a6a8a28f59 Update models pricing 2024-04-10 00:33:16 -07:00
Enrico Ros 56a8e452bf OpenAI: 2024-04-09 models 2024-04-10 00:17:08 -07:00
Enrico Ros 6bec0bf70d Models: precise id matching 2024-04-09 23:15:17 -07:00
Enrico Ros 5dc9c8f90e Gemini: support Pro 1.5 2024-04-09 22:41:05 -07:00
Enrico Ros e3290e12b1 Fix mic layout 2024-04-09 22:37:47 -07:00
Enrico Ros 9f37ce9e42 Warn if clipboard access is prevented 2024-04-09 19:49:52 -07:00
Enrico Ros 8904c0c811 E: Consistent file names, shortcuts. 2024-04-09 19:40:56 -07:00
Enrico Ros b0d021b7f2 E: Ctrl+O opens chat file 2024-04-09 17:41:53 -07:00
Enrico Ros 0175f3b8a1 E: Manifest File Handlers 2024-04-09 17:04:48 -07:00
Enrico Ros 0fa9d5bf62 E: Save conversations. Closes #466 2024-04-09 16:44:40 -07:00
Enrico Ros 4919e38e3e OpenAI-derivatives: Remove UI validation - never helped. Fixes #446 2024-04-09 16:28:09 -07:00
Enrico Ros 2e99533f96 Fit on mobile 2024-04-09 16:21:05 -07:00
Enrico Ros f095645d89 Merge pull request #498 from dogmatic69/trailing-whitespace
chore: remove trailing whitespace
2024-04-09 01:48:19 -07:00
Enrico Ros 757c83142e Merge pull request #497 from dogmatic69/env-docs
chore: link to env docs
2024-04-09 01:47:50 -07:00
Carl Sutton 36d274ca9f chore: remove trailing whitespace 2024-04-09 10:13:35 +02:00
Carl Sutton ec11b61f67 chore: link to env docs 2024-04-09 10:09:37 +02:00
Enrico Ros 7765271d63 PPLX: fix alternation 2024-04-09 00:55:04 -07:00
Enrico Ros 7c2464bba7 PPLX: fix models 2024-04-09 00:32:27 -07:00
Enrico Ros 17e010f93c Anthropic: fix empty messages 2024-04-09 00:19:48 -07:00
Enrico Ros 452d630a2a Tryfix for the Autocomplete 2024-04-08 23:39:06 -07:00
Enrico Ros f317a3e38f Test client-side fetch (no cors) 2024-04-08 22:15:15 -07:00
Enrico Ros f56195058e Fix ssr issue 2024-04-08 22:13:46 -07:00
Enrico Ros 2e93dbb10c Improve Error reporting 2024-04-08 21:01:57 -07:00
Enrico Ros f862456d73 Decrease errors 2024-04-08 18:52:11 -07:00
Enrico Ros d99b0b2137 Reduce errors 2024-04-08 18:43:01 -07:00
Enrico Ros 1d390f9aa7 3,000 2024-04-07 16:18:45 -07:00
Enrico Ros 514beb7940 Merge pull request #492 from enricoros/main
Update BeamFusionGrid.tsx
2024-04-06 16:48:46 -07:00
Enrico Ros c7bdfce734 Update BeamFusionGrid.tsx 2024-04-06 16:47:36 -07:00
Enrico Ros e5fe4b06ad Show warning for non-US merges 2024-04-06 15:58:38 -07:00
Enrico Ros 89b7c265d3 show URL attachments as well 2024-04-06 15:41:35 -07:00
Enrico Ros 698c31943e Centralize Lang 2024-04-06 14:27:21 -07:00
Enrico Ros b70060d46e Beam: understand tutorial usage 2024-04-06 14:27:10 -07:00
Enrico Ros 6ddc5ef53e Roll packages 2024-04-06 13:57:57 -07:00
Enrico Ros 212023c7e4 Merge pull request #484
Update README.md (Added Midori AI subsystem to the readme)
2024-04-05 18:30:32 -07:00
Enrico Ros b687f23c95 Anthropic: server status. #485 2024-04-05 14:07:13 -07:00
Luna Midori 7a05d01554 Update README.md 2024-04-03 15:17:43 -07:00
Enrico Ros 78e3a57857 parsing of HTML code blocks 2024-04-02 21:07:35 -07:00
Enrico Ros 79d0c96b20 Gemini: call out RECITATIONS 2024-04-02 20:53:26 -07:00
Enrico Ros 21ed38a20e DuoTonal for AI functions 2024-04-02 19:20:35 -07:00
Enrico Ros d8b1f99114 Divider 2024-04-02 18:42:33 -07:00
Enrico Ros b0fb1b9890 Fix build 2024-04-02 01:48:11 -07:00
Enrico Ros a63932cff2 Show HTML code when beaming, by default 2024-04-02 01:42:06 -07:00
Enrico Ros 0b22165d2a Beam: remove link 2024-04-02 01:29:23 -07:00
Enrico Ros 41b1951abe Merge pull request #481 from aj47/patch-1
Update README.md typo
2024-04-01 23:41:37 -07:00
AJ (@techfren) 353431e54c Update README.md 2024-04-02 17:41:08 +11:00
Enrico Ros 7b232dd7d8 Renamed vercel.json to vercel_PRODUCTION.json to get it out of the way and fix #468
Fix #468 once and for all. Documentation on the env
2024-04-01 18:05:27 -07:00
Enrico Ros d32adf9dbf 1.15.0: Add hackernews callout 2024-04-01 17:17:33 -07:00
Enrico Ros 940d490217 1.15.0: Beam News improved copy 2024-04-01 15:29:08 -07:00
Enrico Ros 46e41e38cf 1.15.0: Beam News callout 2024-04-01 15:15:52 -07:00
Enrico Ros 276ff8f995 Merge branch 'release-1.15.0' 2024-04-01 15:05:10 -07:00
Enrico Ros 030837fccf 1.15.0: Readme and Changelog 2024-04-01 15:04:15 -07:00
Enrico Ros a7d38aefb1 1.15.0: Update News 2024-04-01 14:42:07 -07:00
Enrico Ros 230a0d7caf Beam: update intro. 2024-04-01 14:21:12 -07:00
Enrico Ros 6e14e43c78 Beam: update in-app explainer. 2024-04-01 14:07:33 -07:00
Enrico Ros e6389f08be Branch before delete 2024-03-30 23:19:48 -07:00
Enrico Ros a4edeb098e 1.15.0: news placeholder 2024-03-30 20:14:30 -07:00
Enrico Ros 093c536415 1.15.0: version number 2024-03-30 19:04:37 -07:00
Enrico Ros 7479b50fea 1.15.0: Disable Title Bar Setting (2 people got confused) 2024-03-30 19:03:45 -07:00
Enrico Ros ebce36d043 1.15.0: Package Version 2024-03-30 18:57:46 -07:00
Enrico Ros 77bab1aa74 Beam: earlyaccess: edit the Custom merges 2024-03-30 01:52:01 -07:00
Enrico Ros ebcac3405c Beam: custom: improve icon 2024-03-30 00:56:15 -07:00
Enrico Ros d2781a6f87 Beam: custom: do not auto-start Custom 2024-03-30 00:40:23 -07:00
Enrico Ros f5954f5bb3 Beam: Gather: change some prop names 2024-03-30 00:40:08 -07:00
Enrico Ros 6baf694d6f Beam: earlyaccess: remove Show Dev Methods 2024-03-30 00:20:08 -07:00
Enrico Ros cb3b586d4d Beam: custom: improve hardcoding 2024-03-30 00:16:41 -07:00
Enrico Ros f68789ab20 Beam: earlyaccess: add Menu Option for response identification 2024-03-30 00:13:33 -07:00
Enrico Ros 0c6a3f1917 Beam: earlyaccess: Fix the "checklist issue" with the mentioned "unicode bullet" 2024-03-29 23:45:53 -07:00
Enrico Ros 05fccaf982 Beam: earlyaccess: Improve popup menu to hint at saving/loading model combos 2024-03-29 23:42:47 -07:00
Enrico Ros 7340b9ecc2 Beam: earlyaccess: Address the UI problem where the menu option does not open when the screen is maximized 2024-03-29 23:15:57 -07:00
Enrico Ros 78eb4ebe0b Beam: earlyaccess: Correct the "Synthesizing" typo. 2024-03-29 23:07:03 -07:00
Enrico Ros b1453a34ec Beam: fix issue with older installs 2024-03-29 21:48:28 -07:00
Enrico Ros c357e9e2f5 Beam: ensure non-empty gather messages 2024-03-29 21:48:28 -07:00
Enrico Ros 98717bf8a9 Beam: scroller: smaller 2024-03-29 21:48:28 -07:00
Enrico Ros d7077ada0e Beam: scroll the instruciton gen too 2024-03-29 21:48:28 -07:00
Enrico Ros 64f63ed1d3 Beam: score to 100 2024-03-29 21:48:28 -07:00
Enrico Ros 2a27f6c30d Beam: fusion zone 2024-03-29 21:48:28 -07:00
Enrico Ros 9fdddeaba8 Beam: Checklist -> Guided 2024-03-29 21:48:28 -07:00
Enrico Ros 2cfa5e93e4 Beam: improve prompts 2024-03-29 21:48:28 -07:00
Enrico Ros 778ac14344 Beam: enhance checklist quality 2024-03-29 21:48:28 -07:00
Enrico Ros 85fcf8be61 Beam: re-merge will not change the model 2024-03-29 21:48:28 -07:00
Enrico Ros b31eb09015 Beam: no green shade 2024-03-29 21:48:28 -07:00
Enrico Ros 5154dd1740 Beam: improve Fusion layout 2024-03-29 21:48:27 -07:00
Enrico Ros 274f11ef1d Beam: change the Fusion model 2024-03-29 21:48:27 -07:00
Enrico Ros aeb1acf458 Beam: bits 2024-03-29 21:48:27 -07:00
Enrico Ros a204f4a58e Beam: Ray grid: bits 2024-03-29 21:48:27 -07:00
Enrico Ros 8e4a57aa01 Beam: auto-fit 2024-03-29 21:48:27 -07:00
Enrico Ros 797ed0a553 Beam: shorter scroll on mobile beams 2024-03-29 21:48:27 -07:00
Enrico Ros 663bc0d471 Beam: shadow on mobile scatter 2024-03-29 21:48:27 -07:00
Enrico Ros 8d7e2d2c46 Beam: remove lastScatterLlmId 2024-03-29 21:48:27 -07:00
Enrico Ros 19d96bb30b Beam: remove llm Linkage 2024-03-29 21:48:27 -07:00
Enrico Ros 47f2f20d9c Beam: relax checklist parsing 2024-03-29 21:48:27 -07:00
Enrico Ros 12c7c634c0 Beam: improve LLM usage 2024-03-29 21:48:27 -07:00
Enrico Ros 9a322c150a Beam: reduce space 2024-03-29 21:48:27 -07:00
Enrico Ros 1a3bc4f666 Beam: move instructions 2024-03-29 21:48:27 -07:00
Enrico Ros d4881b1ce5 Beam: move to modules 2024-03-29 21:48:27 -07:00
Enrico Ros a2ad2df473 Beam: prompt update 2024-03-29 21:48:27 -07:00
Enrico Ros 541c5bd1c3 Beam: prompt update 2024-03-29 21:48:27 -07:00
Enrico Ros b744e9673b Beam: Checklist done 2024-03-29 21:48:27 -07:00
Enrico Ros bb94b7c5c6 Beam: prompt updates 2024-03-29 21:48:27 -07:00
Enrico Ros e9ff57d5e1 Beam: Gather: User Input 2024-03-29 21:48:27 -07:00
Enrico Ros 179245457c Beam: Gather: extract instructions 2024-03-29 21:48:27 -07:00
Enrico Ros 1493f74691 Beam: Gather: render 2024-03-29 21:48:27 -07:00
Enrico Ros 4857503ed3 Beam: Gather: intermediate components 2024-03-29 21:48:27 -07:00
Enrico Ros a0e38b4f0c Beam: Gather: begin ui production 2024-03-29 21:48:27 -07:00
Enrico Ros 1d62cad9e9 Beam: Gather: large state redux 2024-03-29 21:48:27 -07:00
Enrico Ros 855761020c Beam: Instructions: interrupt the fake user op 2024-03-29 21:48:27 -07:00
Enrico Ros 0950d06dfb Beam: Instructions: improve state machinery much 2024-03-29 21:48:27 -07:00
Enrico Ros 1496402325 Beam: layout seems ok 2024-03-29 21:48:27 -07:00
Enrico Ros 77e2c4babb Beam: stop this madness 2024-03-29 21:48:27 -07:00
Enrico Ros a465082984 Beam: Dev methods by default 2024-03-29 21:48:27 -07:00
Enrico Ros 025fdac686 Beam: Iconoclastic 2024-03-29 21:48:27 -07:00
Enrico Ros 6bde5ec64c Beam: Gather: Fin of Fin 2024-03-29 21:48:27 -07:00
Enrico Ros f099a9ec39 Beam: Gather Cleanups galore 2024-03-29 21:48:27 -07:00
Enrico Ros 5bfcef92ee Beam: Persist (and get off the way) more state 2024-03-29 21:48:27 -07:00
Enrico Ros 79a8fbd881 Beam: Extract the Module Beam Store 2024-03-29 21:48:27 -07:00
Enrico Ros 7f96a14cf6 Beam: Debug: swap properties 2024-03-29 21:48:27 -07:00
Enrico Ros 5fe6d70713 Beam: App: more clearer debug 2024-03-29 21:48:27 -07:00
Enrico Ros dcba4dd4bc Beam: App: clearer debug 2024-03-29 21:48:27 -07:00
Enrico Ros ccbe77913b Beam: Gather: beginning of output 2024-03-29 21:48:27 -07:00
Enrico Ros 2844cb81c2 Beam: Gather: wait indicator 2024-03-29 21:48:27 -07:00
Enrico Ros d86e8e5920 Beam: bits 2024-03-29 21:48:27 -07:00
Enrico Ros 9665fa1eb4 Beam: good button on mobile 2024-03-29 21:48:27 -07:00
Enrico Ros 2788ef679b Beam: scroll-fix 2024-03-29 21:48:27 -07:00
Enrico Ros e1a88e1fd8 Beam: move gapper 2024-03-29 21:48:27 -07:00
Enrico Ros 32163c5302 Beam: bottom gapper 2024-03-29 21:48:26 -07:00
Enrico Ros 2d3d5efe87 Beam: fix merge dim when inactive 2024-03-29 21:48:26 -07:00
Enrico Ros e1bbba392c Beam: Scatter: save file rename 2024-03-29 21:48:26 -07:00
Enrico Ros ed642c856b Beam: Scatter: complete the dialog 2024-03-29 21:48:26 -07:00
Enrico Ros 927e462f7a Beam: Scatter: preset save (full) 2024-03-29 21:48:26 -07:00
Enrico Ros e250499a3b Beam: Scatter: preset save (part) 2024-03-29 21:48:26 -07:00
Enrico Ros 91d96a6639 Beam: bits 2024-03-29 21:48:26 -07:00
Enrico Ros 104ec4c87c Beam: improve Composer button 2024-03-29 21:48:26 -07:00
Enrico Ros 0a7e8436c3 Beam: Gather: starts to work like a charm 2024-03-29 21:48:26 -07:00
Enrico Ros 9e597e0a28 Beam: Gather: first response! 2024-03-29 21:48:26 -07:00
Enrico Ros 01fbb5d47c Beam: Gather: rename executor to instructions 2024-03-29 21:48:26 -07:00
Enrico Ros 6517d16337 Beam: Gather: Mega Pint of state cleanup 2024-03-29 21:48:26 -07:00
Enrico Ros 0e636adf28 Beam: Gather: more state cleanuppery 2024-03-29 21:48:26 -07:00
Enrico Ros 0bb281237b Beam: Gather: some customization 2024-03-29 21:48:26 -07:00
Enrico Ros 2b224376c2 Beam: Gather: further improvements 2024-03-29 21:48:26 -07:00
Enrico Ros e510b369d7 Beam: Gather: ui fix 2024-03-29 21:48:26 -07:00
Enrico Ros a0de1f7230 Beam: Gather: wire things up 2024-03-29 21:48:26 -07:00
Enrico Ros 4591132269 Beam: the ghost in the machine 2024-03-29 21:48:26 -07:00
Enrico Ros a03de8d490 Beam: Gather: And Here We Go (Again -final.r002.copy.goodone) 2024-03-29 21:48:26 -07:00
Enrico Ros 27bcfec17e Beam: Gather: And Here We Go (Again) 2024-03-29 21:48:26 -07:00
Enrico Ros f6dbec3e1d Beam: Gather: And Here We Go 2024-03-29 21:48:26 -07:00
Enrico Ros aebc45f705 Beam: Gather: messaging & lime 2024-03-29 21:48:26 -07:00
Enrico Ros 310c60b9d9 Beam: Gather: pre-fusion 2024-03-29 21:48:26 -07:00
Enrico Ros bcba67c209 Beam: 4->6px 2024-03-29 21:48:26 -07:00
Enrico Ros fc013aed52 Beam: Gather: icons 2024-03-29 21:48:26 -07:00
Enrico Ros 8ad41c059b Beam: Scatter: cleaner 2024-03-29 21:48:26 -07:00
Enrico Ros 8eaf8db850 Beam: Gather: cleaner 2024-03-29 21:48:26 -07:00
Enrico Ros 896883766c Beam: Gather: perfect styles 2024-03-29 21:48:26 -07:00
Enrico Ros 258dacf3ed Beam: Gather: higher contrast 2024-03-29 21:48:26 -07:00
Enrico Ros 242243f485 Beam: Gather: even better ux 2024-03-29 21:48:26 -07:00
Enrico Ros a18436dce1 Beam: Gather: real good ux 2024-03-29 21:48:26 -07:00
Enrico Ros 5323cbc00e Beam: Gather: simplify state 2024-03-29 21:48:26 -07:00
Enrico Ros ddd3b137ac Beam: Gather: convert to Fusion IDs 2024-03-29 21:48:26 -07:00
Enrico Ros 94550088e5 Beam: Gather: show/hide dev methods 2024-03-29 21:48:26 -07:00
Enrico Ros 1375ca6f5c Beam: Gather: style multiline 2024-03-29 21:48:26 -07:00
Enrico Ros e4c4fe0495 Beam: Gather: start from 0 2024-03-29 21:48:26 -07:00
Enrico Ros 2fa5277e56 Beam: Gather: add Eval 2024-03-29 21:48:26 -07:00
Enrico Ros b73ad8fdc1 Beam: Gather: icons 2024-03-29 21:48:26 -07:00
Enrico Ros 9cc281e65e Beam: redo optionality 2024-03-29 21:48:26 -07:00
Enrico Ros d62107d39b 1.15.0: Cover image 2024-03-29 21:47:33 -07:00
Enrico Ros 4a8d20ad72 News: raise the quality 75 -> 90 2024-03-29 21:47:33 -07:00
Enrico Ros 5acb72c39b T2I: max 4 columns 2024-03-29 21:47:33 -07:00
Enrico Ros 67e8236a60 Fix deprecation 2024-03-29 21:47:32 -07:00
Enrico Ros 18b8853f82 Merge branch 'main-stable' 2024-03-29 21:39:05 -07:00
Enrico Ros 65c7df7938 Backend: auto-configuration. Fixes #436 2024-03-29 05:07:37 -07:00
Enrico Ros 15678cdfa2 Backend: removed onSuccess callbacks! 2024-03-29 05:07:36 -07:00
Enrico Ros 6cd6c62046 Backend: migration to async fetch from Query. plus consistency of behaviors 2024-03-29 05:07:36 -07:00
Enrico Ros dbf92805a2 Backend: reprio 2024-03-29 05:07:35 -07:00
Enrico Ros 11fc9a7b85 Backend: capability variables 2024-03-29 05:07:35 -07:00
Enrico Ros 8bc970ff57 Backend: autoconf only on chat 2024-03-29 05:07:34 -07:00
Enrico Ros a16eefd97b react-query: disable refetch on focus by default 2024-03-29 05:07:34 -07:00
Enrico Ros ca5e5b820c Backend: autoconf base logic 2024-03-29 05:07:33 -07:00
Enrico Ros f73ad52441 Backend: ->getBackendCapabilities() 2024-03-29 05:07:33 -07:00
Enrico Ros 729ec1d1bf Backend: config hash, to detect backend config updates 2024-03-29 05:07:32 -07:00
Enrico Ros 4adb30b861 AppChat: use intent to navigate to it from the link importer 2024-03-29 05:07:32 -07:00
Enrico Ros 999f6de45f Serverless Functions timeout: set it in the Vercel functions as the conditional was not working. Fix (again) #468 2024-03-28 23:20:40 -07:00
Enrico Ros 70686502b4 Revert "Set the Vercel serverless max duration as env variable. Fixes #468"
This reverts commit d17a980151.
2024-03-28 23:16:11 -07:00
Enrico Ros d17a980151 Set the Vercel serverless max duration as env variable. Fixes #468 2024-03-28 23:12:25 -07:00
Enrico Ros 7fa5947030 Chat Nav Grouping: when unset, the search won't sort by frequency
TODO: needs a better UX pattern here.
2024-03-28 22:48:12 -07:00
Enrico Ros de8f120fd4 Update README.md 2024-03-28 17:01:11 -07:00
Enrico Ros 9b54603264 Update README.md 2024-03-28 17:00:10 -07:00
Enrico Ros 698c77d7ba Tease the upcoming Beam 2024-03-28 16:53:34 -07:00
Enrico Ros 18d83a4d18 PersonaSelector: better tiles 2024-03-27 22:11:52 -07:00
Enrico Ros 8e849d93b2 Style fixes 2024-03-27 21:59:49 -07:00
Enrico Ros 4ca42f028b SVG: parse alternatives 2024-03-27 21:23:19 -07:00
Enrico Ros 3118337879 Timeout on Vercel/Serverless raised to 25 (for Browsing/Browserless requests) 2024-03-27 21:22:47 -07:00
Enrico Ros db4490affb SVG: improve compat with Opus 2024-03-27 18:33:28 -07:00
Enrico Ros 51ab79384e SVG: more compatible 2024-03-27 18:33:28 -07:00
Enrico Ros 3ee30a252d Creator: fixes 2024-03-27 18:33:28 -07:00
Enrico Ros b883566ebb Shrink the Folders list when running out of space (at twice the Chat Titles rate) 2024-03-27 18:32:46 -07:00
Enrico Ros ac78fb85b8 Shadow 2024-03-27 18:32:46 -07:00
Enrico Ros 0d2b11d0c4 Fonts 2024-03-27 18:32:45 -07:00
Enrico Ros 5b610c88c1 Gemini: fix RECITATION 2024-03-27 18:32:45 -07:00
Enrico Ros bf444ce043 Attachments: support RMB 2024-03-27 18:32:45 -07:00
Enrico Ros c91c027dab Compress icons 2024-03-27 18:32:44 -07:00
Enrico Ros 81fd87c510 Reduced badges 2024-03-27 18:32:44 -07:00
Enrico Ros 9da174a962 Roll packages 2024-03-27 18:32:44 -07:00
Enrico Ros 84f54a7e65 PersonaSelector: improve examples 2024-03-27 18:25:41 -07:00
Enrico Ros baeecf1464 PersonaSelector: reshade 2024-03-27 18:25:34 -07:00
Enrico Ros f2fdd39c96 Persona Selector: smaller tiles 2024-03-27 18:25:18 -07:00
Enrico Ros 53b074d78e Personas: show enablement, not disablement 2024-03-27 18:22:38 -07:00
Enrico Ros f4fc1e6775 Persona: update example 2024-03-27 18:22:28 -07:00
Enrico Ros dba791b8db Personas: update Dev examples 2024-03-27 18:22:24 -07:00
Enrico Ros 750fa02621 Personas: update custom task 2024-03-27 18:22:20 -07:00
Enrico Ros 7a67816111 Update default prompt. 2024-03-27 18:22:14 -07:00
Enrico Ros 613625644e LocalAI T2I: integration skel 2024-03-23 04:16:59 -07:00
Enrico Ros 0e25071ef0 Prevent pull-to-refresh on mobile - would be triggered while scrolling up 2024-03-22 22:40:56 -07:00
Enrico Ros ed1932cd26 Link env vars 2024-03-20 23:08:47 -07:00
Enrico Ros 67b89213d0 Your input 2024-03-20 22:39:34 -07:00
Enrico Ros 814f142c5f Fix zIndex of the ScrollToBottomButton 2024-03-20 22:39:33 -07:00
Enrico Ros 16cd3e7d5a Desktop Nav: fix key 2024-03-20 04:55:30 -07:00
Enrico Ros c5dcb8faef Beam: Gather: disable for now 2024-03-20 04:54:53 -07:00
Enrico Ros 6b46c022f9 Beam: Gather: improve prompt definitions 2024-03-20 03:56:15 -07:00
Enrico Ros 88ef05fc72 Beam: Gather: baseline prompts 2024-03-20 03:13:48 -07:00
Enrico Ros 445ea367fc Beam: copy Ray to clipboard 2024-03-20 02:10:20 -07:00
Enrico Ros c819554f43 Prompt-mixin: custom filters 2024-03-20 02:08:01 -07:00
Enrico Ros bbc8a79ded Beam: inline edit the Custom 2024-03-20 01:25:25 -07:00
Enrico Ros 3d181bc10d Beam: optimize App 2024-03-20 00:40:49 -07:00
Enrico Ros ba5478f382 Beam: Fusion: improved Input 2024-03-20 00:25:52 -07:00
Enrico Ros 136c993c8d Beam: Fusion: show prompts option 2024-03-19 23:00:23 -07:00
Enrico Ros 6cf18ea4e8 fix tooltip missing on nav 2024-03-19 22:46:54 -07:00
Enrico Ros fe7f56c82e fix check icon 2024-03-19 22:46:45 -07:00
Enrico Ros 6c580f1e43 Beam: Gather: edit custom instructions 2024-03-19 19:51:30 -07:00
Enrico Ros f171cd4f03 Beam: Gather: enable customization 2024-03-19 18:12:38 -07:00
Enrico Ros ea109e6c30 EditRounded 2024-03-19 13:51:36 -07:00
Enrico Ros f514eed226 Beam: Gather: instruction definition 2024-03-19 13:47:49 -07:00
Enrico Ros 274ba80149 Beam: Gather: bits 2024-03-19 11:57:45 -07:00
Enrico Ros 46b4dfc458 Beam: Gather: reinit state 2024-03-19 11:52:24 -07:00
Enrico Ros 4af8f4ff6a [desktop] Improve overflow 2024-03-19 11:40:20 -07:00
Enrico Ros df5810d695 [desktop] Application Overflow menu 2024-03-19 11:32:25 -07:00
Enrico Ros d9ad96c374 Beam: 'from chat' 2024-03-19 02:21:43 -07:00
Enrico Ros 06cc93fd82 Beam: begin Fusion state 2024-03-19 02:16:50 -07:00
Enrico Ros 41da63765f Beam: state cleanup 2024-03-19 01:33:27 -07:00
Enrico Ros 3975411c78 Beam: slices pattern 2024-03-19 01:09:38 -07:00
Enrico Ros fc2e75ef61 Beam: separated gather and scatter, physically 2024-03-19 00:00:40 -07:00
Enrico Ros ef0f2dd3d0 Beam: bits 2024-03-18 23:44:40 -07:00
Enrico Ros 548c3c5d72 Beam: clean styles 2024-03-18 20:32:15 -07:00
Enrico Ros d2e3a0cb8e Beam: add gather config and fusion 2024-03-18 20:16:38 -07:00
Enrico Ros 9cdace6f81 Beam: rename Panes 2024-03-18 19:09:11 -07:00
Enrico Ros 12f020570e Beam: extract Scatter input 2024-03-18 19:07:55 -07:00
Enrico Ros bef2551eec Beam: Gather commands shall be ok 2024-03-18 18:49:05 -07:00
Enrico Ros 7e20f8c189 Beam: wire Gather 2024-03-18 18:30:31 -07:00
Enrico Ros 56e8390e55 Beam: Fusion rename 2024-03-18 17:52:32 -07:00
Enrico Ros 89fff16385 Beam: Gather style 2024-03-18 04:00:00 -07:00
Enrico Ros 2cf15a24eb Beam: Gather layout 2024-03-18 03:48:30 -07:00
Enrico Ros 512e867034 Beam: final style fixes on Beam 2024-03-18 02:44:37 -07:00
Enrico Ros ce8c55c3c7 Beam: the beam panel seems done 2024-03-18 02:24:56 -07:00
Enrico Ros 8e0d904d9a Beam: Style updates 2024-03-18 00:57:26 -07:00
Enrico Ros 6c846a8ae7 Beam: very large state update 2024-03-18 00:03:10 -07:00
Enrico Ros 5004469fe9 Beam: DRay -> BRay 2024-03-17 21:54:42 -07:00
Enrico Ros 14d0af74ed Beam: extract rays 2024-03-17 21:51:38 -07:00
Enrico Ros 5a76cf9486 Beam: move the pre-beam where it shall go 2024-03-17 21:34:06 -07:00
Enrico Ros 82901ccd02 Beam: desktop sticky controls for Scatter and Gather 2024-03-17 21:26:56 -07:00
Enrico Ros 1dc9d66673 Beam: unused callout 2024-03-17 21:20:51 -07:00
Enrico Ros a0cbfaf390 Beam: fix explainer layout 2024-03-17 21:14:35 -07:00
Enrico Ros 9a01ae61ef ChatDrawer (item groups): sticky 2024-03-17 17:01:22 -07:00
Enrico Ros 91837d5acd Optimize 2024-03-17 16:47:00 -07:00
Enrico Ros 1b9ebdda22 Beam: Maximized Mode(al) 2024-03-17 16:43:33 -07:00
Enrico Ros b6f6177af3 Beam: improve looks 2024-03-17 16:08:11 -07:00
Enrico Ros d35486196b Scroll/Beam: embeddable ScrollToBottomButton 2024-03-17 16:05:31 -07:00
Enrico Ros 1603637e3b Scroll/Beam: improve usage 2024-03-17 15:53:44 -07:00
Enrico Ros 8f20840169 Beam: optimize when in Chat 2024-03-17 15:28:49 -07:00
Enrico Ros 4fff2394de ScrollToBottom: centralize styles 2024-03-17 15:28:00 -07:00
Enrico Ros afb74e68ee ScrollToBottom: moved to shared components 2024-03-17 14:54:15 -07:00
Enrico Ros d5fa7844c5 ScrollToBottom: allow to disable auto-stick (button only) 2024-03-17 14:47:02 -07:00
Enrico Ros b8470cd640 ScrollToBottom: allow the button to be inline 2024-03-17 14:44:27 -07:00
Enrico Ros 9a23f573a6 Beam: remove badge (hat on a hat) 2024-03-16 21:17:38 -07:00
Enrico Ros efe8fa0fda Beam: remove Phase 2024-03-16 21:16:27 -07:00
Enrico Ros 2d16e8bb4f UserFlags: show on messages 2024-03-16 20:44:54 -07:00
Enrico Ros bbd95eebff Update Models Attraction icon 2024-03-15 22:52:26 -07:00
Enrico Ros ceb00b4e93 Roll packages 2024-03-15 20:21:51 -07:00
Enrico Ros cc60d26d1c Turn multicast blue 2024-03-15 19:57:17 -07:00
Enrico Ros ba3ff739f6 Improve icons 2024-03-15 19:56:59 -07:00
Enrico Ros 6062647705 App: remove graying out - gets in the way a lot 2024-03-15 18:22:39 -07:00
Enrico Ros 070c1c2de9 Composer: tutorial happiness preserver 2024-03-15 18:16:21 -07:00
Enrico Ros d3aaa69409 Composer: tutorialize 2024-03-15 18:09:46 -07:00
Enrico Ros 0ac7753e35 Beam: terminate on Conversation clear 2024-03-15 17:49:56 -07:00
Enrico Ros eba9d53d2e Reduce the usage of backendCapabilities() 2024-03-15 17:35:38 -07:00
Enrico Ros d04d4ec8e7 Reorder providers 2024-03-15 16:34:42 -07:00
Enrico Ros c7c3efcbe7 Progress with bootstrap logic 2024-03-15 15:51:41 -07:00
Enrico Ros 2b8d53a44c Update wrappers 2024-03-15 15:41:08 -07:00
Enrico Ros ef6b573e08 Update TRPC Query Settings 2024-03-15 15:39:38 -07:00
Enrico Ros 61eedd41df Bootstrapper cleanup 2024-03-15 15:27:34 -07:00
Enrico Ros b265bcda20 Start cleaning up Bootstrapper 2024-03-15 14:32:15 -07:00
Enrico Ros d703d32a1f Cleanup knowledge of backend capabilities 2024-03-15 14:15:59 -07:00
Enrico Ros aab9334404 Build fix 2024-03-15 04:47:57 -07:00
Enrico Ros c2570f6955 New: attach starred messages with @
Note: the marshalling shall be moved inside the pipeline, probably
with a converter of type `ego-message-frontmatter` or similar
2024-03-15 04:42:16 -07:00
Enrico Ros 8e936a6334 Prevent this 2024-03-15 04:02:16 -07:00
Enrico Ros 46bfc22869 Show error on misused /beam 2024-03-15 02:48:45 -07:00
Enrico Ros db1620dd56 Actile: improve logic 2024-03-15 02:40:47 -07:00
Enrico Ros e59f8a42a3 Improve TRPC errors 2024-03-15 02:38:36 -07:00
Enrico Ros 17d18bd85d Fix /commands parsing 2024-03-15 02:37:30 -07:00
Enrico Ros fb256cf578 Bits 2024-03-15 01:39:51 -07:00
Enrico Ros 1b6b5db76d Actiles: improve provider search 2024-03-15 01:39:42 -07:00
Enrico Ros 41647ca83a Proactively get the user out of trouble. 2024-03-15 01:16:59 -07:00
Enrico Ros 07d2a17a87 Filter by starred chats. #109 2024-03-15 01:12:19 -07:00
Enrico Ros 6d744dfb7e ScrolltoBottomButton: improve 2024-03-15 00:40:01 -07:00
Enrico Ros b9b946c35f Messages: add 'starring' #109 2024-03-15 00:32:56 -07:00
Enrico Ros 17adfe2117 DMessage: add flag list support 2024-03-15 00:04:17 -07:00
Enrico Ros 1e5e21102d DMessage: improve edit support 2024-03-15 00:03:49 -07:00
Enrico Ros 4af992222f Shortcuts work 2024-03-14 21:47:59 -07:00
Enrico Ros a9447c6a11 Beam: misc 2024-03-14 21:33:42 -07:00
Enrico Ros db71323313 Misc 2024-03-14 21:19:02 -07:00
Enrico Ros b9b2748e05 Improved Avatar menu looks 2024-03-14 21:00:27 -07:00
Enrico Ros 387231f743 Fix Avatar menus 2024-03-14 20:52:34 -07:00
Enrico Ros 2216a89aa3 Beam: messaging 2024-03-14 19:10:15 -07:00
Enrico Ros 4faa6326fa Explainer: shortcuts 2024-03-14 19:08:11 -07:00
Enrico Ros cb22b3d9a1 Beam: update images 2024-03-14 19:07:34 -07:00
Enrico Ros 152a3873bd Beam: update scatter image 2024-03-14 18:50:25 -07:00
Enrico Ros adc2760a89 Beam: gather image 2024-03-14 18:24:36 -07:00
Enrico Ros dde64acb06 Improve Streaming issue reporting. Fixes #457 2024-03-14 17:47:55 -07:00
Enrico Ros 008adbd8bc Fix #459 2024-03-14 16:50:45 -07:00
Enrico Ros 0e4866a5a2 Beam: tutorial complete x2 2024-03-14 15:11:51 -07:00
Enrico Ros 5cb96cae3a Beam: tutorial complete 2024-03-14 15:05:36 -07:00
Enrico Ros 8cbb82a67f Beam: BEAM image, transparent 2024-03-14 14:57:56 -07:00
Enrico Ros 848ddbe477 Beam: BEAM image 2024-03-14 14:53:47 -07:00
Enrico Ros 083c1cde8b Explainer: adj auto resize 2024-03-14 14:53:47 -07:00
Enrico Ros b792971062 Add Gemini icon 2024-03-14 14:16:49 -07:00
Enrico Ros 07dde8f4b1 Chat messages: sticky headers 2024-03-14 04:19:57 -07:00
Enrico Ros 01f94127dd Beam: vendor icons 2024-03-14 04:07:50 -07:00
Enrico Ros 4d457b4e9e Beam: re-show explainer, with double-click 2024-03-14 03:28:27 -07:00
Enrico Ros 8ac93ff2da Beam: update explainer, with an end 2024-03-14 03:28:08 -07:00
Enrico Ros ef33a4b08e Beam: link 2024-03-14 02:47:27 -07:00
Enrico Ros fdd3b25a27 Beam: add Explainers 2024-03-14 02:37:01 -07:00
Enrico Ros 4dc979da08 SquircleIcon: support an alt color 2024-03-14 01:28:53 -07:00
Enrico Ros 8f426e03c4 Uniformize Roundicons 2024-03-14 01:28:40 -07:00
Enrico Ros 40cd085bf8 ExploreCarousel: the new Wizard experience 2024-03-14 01:28:20 -07:00
Enrico Ros 6aa75fc5d1 Animutils: amazing animations (not) 2024-03-14 01:27:55 -07:00
Enrico Ros eae5920f9d Beam: initial Explainer support 2024-03-13 21:59:55 -07:00
Enrico Ros 2f6bfa37cc Beam: balance title 2024-03-13 21:55:08 -07:00
Enrico Ros 9d6fd9b9b8 Styles fix 2024-03-13 20:14:58 -07:00
Enrico Ros 260cd67c96 Beam: user message editing 2024-03-13 17:34:07 -07:00
Enrico Ros aff76e2d18 Beam: improve grid 2024-03-13 17:21:50 -07:00
Enrico Ros 52e4343045 Improve drawer sizing 2024-03-13 17:15:50 -07:00
Enrico Ros 1ffbb135c6 Anthropic: add Haiku
(cherry picked from commit c3ec522261)
2024-03-13 14:46:39 -07:00
Enrico Ros c3ec522261 Anthropic: add Haiku 2024-03-13 14:45:50 -07:00
Enrico Ros 4538839376 Beam: unify invocation logic, from 7 places 2024-03-13 14:41:39 -07:00
Enrico Ros 834edd3a71 Beam: improve chat message popup 2024-03-13 14:22:06 -07:00
Enrico Ros 581c3d9593 Beam: document shortcut 2024-03-13 14:21:50 -07:00
Enrico Ros 0c672fbaa5 Beam: add disabled support for letters 2024-03-13 14:15:41 -07:00
Enrico Ros 6d96b9a312 Beam: add badges on menu and chat mode menu 2024-03-13 14:02:20 -07:00
Enrico Ros 691791ccd0 Beam: improve user message 2024-03-13 14:01:54 -07:00
Enrico Ros f4299121d5 Beam: highlight in modes menu 2024-03-13 13:43:48 -07:00
Enrico Ros 1adfb7eedd Chat drawer: setting to show persona icons 2024-03-13 13:36:55 -07:00
Enrico Ros 33ad583d15 New chat: better button spacings 2024-03-13 13:30:58 -07:00
Enrico Ros a7e2fe2277 New chat: better button 2024-03-13 13:16:35 -07:00
Enrico Ros 5a479d5863 DesktopDrawer: perfect shadows 2024-03-13 13:05:57 -07:00
Enrico Ros 873ff034d2 DesktopDrawer: fix shadow 2024-03-13 04:18:10 -07:00
Enrico Ros 61d3537617 Composer: fix zIndex 2024-03-13 04:11:09 -07:00
Enrico Ros ae068a3f64 Beam: shortcuts 2024-03-13 03:47:56 -07:00
Enrico Ros f7402cd6f5 Beam: close dialog after using selected 2024-03-13 03:47:48 -07:00
Enrico Ros c53f9c8020 Beam: use selected 2024-03-13 03:28:42 -07:00
Enrico Ros 798b4d57f4 Beam: disable on system message 2024-03-13 03:12:05 -07:00
Enrico Ros 98d428fb34 Beam: enable high performance mode 2024-03-13 02:32:42 -07:00
Enrico Ros 3ac5ace216 Share stream text indicator 2024-03-13 02:32:29 -07:00
Enrico Ros 444a1a7ab9 Temp download gif 2024-03-13 02:32:19 -07:00
Enrico Ros 43ea4bd4b5 Large cleanups in execution logic 2024-03-13 02:32:09 -07:00
Enrico Ros 6a9272e40a Beam: fix 2024-03-13 02:23:32 -07:00
Enrico Ros 10589a11aa Beam: business logic to continue/replace messages, including import 2024-03-13 00:15:41 -07:00
Enrico Ros a88f898bc0 Chat/Message/List: improve Beam and related restart logic 2024-03-12 22:55:40 -07:00
Enrico Ros 7a84038b04 Beam: initialize/terminate instead of open/close 2024-03-12 19:56:11 -07:00
Enrico Ros 111c40732d Beam: slight text changes 2024-03-12 18:58:35 -07:00
Enrico Ros 69bb78c8be Beam: reduce direct open calls 2024-03-12 18:54:45 -07:00
Enrico Ros ad3b327d69 Beam: close confirmation: add callbacks 2024-03-12 18:36:23 -07:00
Enrico Ros dc27f38534 Beam: close confirmation 2024-03-12 18:33:24 -07:00
Enrico Ros 5b0816cb92 Beam: esc to close 2024-03-12 18:18:46 -07:00
Enrico Ros 57f6955303 Beam: alt bar improvement 2024-03-12 18:03:31 -07:00
Enrico Ros 78915f878d Beam: clean gather pane 2024-03-12 18:01:29 -07:00
Enrico Ros 6ced6d626b Beam: improve integration 2024-03-12 18:01:17 -07:00
Enrico Ros ee3cb819b4 Beam: back to dev 2024-03-12 18:01:09 -07:00
Enrico Ros cc17b1d19d Beam: Chat Title bar to close the pane 2024-03-12 17:50:16 -07:00
Enrico Ros 2c83240d47 Snacks: review state 2024-03-12 16:48:03 -07:00
Enrico Ros 54f18ff120 Chat: focused state review 2024-03-12 16:47:50 -07:00
Enrico Ros 5e1fe363c3 PanesManager: cleanups (shall be safe) 2024-03-12 15:42:25 -07:00
Enrico Ros 3d2ec507e1 Chat: clarify state 2024-03-12 13:54:40 -07:00
Enrico Ros 1dd7af3c8b Beam: gather test icons 2024-03-12 13:41:50 -07:00
Enrico Ros 06ec1fcebf Beam: improve messaging 2024-03-12 13:08:08 -07:00
Enrico Ros 86cb863fd4 Beam: explored the modal 2024-03-12 13:07:57 -07:00
Enrico Ros d5ef1288d8 Beam: unify layout again 2024-03-12 12:45:04 -07:00
Enrico Ros f3354c498d Beam: unify layout again 2024-03-12 12:44:59 -07:00
Enrico Ros 9557141b38 Beam: bits (drag-drop didn't work out, it's a grid layout) 2024-03-12 12:36:32 -07:00
Enrico Ros 3144b66e73 StrictModeDroppable: share 2024-03-12 11:55:20 -07:00
Enrico Ros 6dbefa3d2f Beam: bits 2024-03-12 11:55:08 -07:00
Enrico Ros c8f3b139e8 Beam: bits 2024-03-12 11:06:52 -07:00
Enrico Ros 288663325d Beam: rename Panes 2024-03-12 11:05:16 -07:00
Enrico Ros 49947ee01d Beam: extract the Grid 2024-03-12 11:03:55 -07:00
Enrico Ros fa7a45ebc7 bits 2024-03-12 10:54:03 -07:00
Enrico Ros 9a074c222f Beam: adjustments 2024-03-12 10:51:18 -07:00
Enrico Ros 4e0d7b6ed9 Beam: down to non-removable 1 2024-03-12 10:41:16 -07:00
Enrico Ros 1f3defb04c Beam: optimize ControlsRow 2024-03-12 02:43:59 -07:00
Enrico Ros 6c52c43460 Beam: auto-hide composer 2024-03-12 02:38:18 -07:00
Enrico Ros deae2879f1 Beam: improve hooks 2024-03-12 01:59:42 -07:00
Enrico Ros 5b255a7d8b LLMSelect: try stabilize 2024-03-12 01:58:54 -07:00
Enrico Ros 6e06c24b7a Beam: extract hooks 2024-03-12 01:58:28 -07:00
Enrico Ros 2fde1efdd3 Beam: begin wiring the Gatherer 2024-03-11 23:59:04 -07:00
Enrico Ros aeb29d983a FormLabelStart: optimize 2024-03-11 23:27:58 -07:00
Enrico Ros c8a7123da9 Beam: fix styles 2024-03-11 23:13:20 -07:00
Enrico Ros 5c22061415 Beam: state cleanup and sync 2024-03-11 16:32:25 -07:00
Enrico Ros 9a0fda8c02 Beam: scrollable main layout 2024-03-11 16:00:22 -07:00
Enrico Ros 2f9a17c44a Beam: fixes 2024-03-11 15:46:29 -07:00
Enrico Ros 50559015d8 Beam: fix scattering (empty) issue 2024-03-11 15:40:20 -07:00
Enrico Ros a8d4e143c2 Beam: selection (disable, does not look great) 2024-03-11 15:32:54 -07:00
Enrico Ros 2a6c69538d Beam: increase ray state consistency 2024-03-11 15:09:43 -07:00
Enrico Ros 0ba5d61353 Beam: Ray lifecycle tracking 2024-03-11 14:44:36 -07:00
Enrico Ros d436ec5790 chat-stream: streamAssistantMessage: add an outcome type 2024-03-11 14:01:30 -07:00
Enrico Ros 759b822b92 Beam: relayout with Gather Controls skel 2024-03-11 13:49:19 -07:00
Enrico Ros 9df45af698 Beam: rename Scatter Controls 2024-03-11 13:34:57 -07:00
Enrico Ros 3474e81446 Beam: show preceding messages count 2024-03-11 13:26:06 -07:00
Enrico Ros e1f07eb957 ChatMessage: support top decorator (4rem default size) 2024-03-11 13:16:52 -07:00
Enrico Ros 71ff1b98be Beam: extract Ray controls row 2024-03-11 12:41:01 -07:00
Enrico Ros 9b370dfa88 Remove warnings 2024-03-11 12:40:40 -07:00
Enrico Ros 0be0661750 ButtonGroup background 2024-03-11 12:40:33 -07:00
Enrico Ros eaa7230af7 Improve Expand/Collapse (position, length) 2024-03-11 12:40:07 -07:00
Enrico Ros 11cb000481 Beam: fix stops and deletes 2024-03-11 01:54:39 -07:00
Enrico Ros 8ae3554a58 Beam: start/stop Rays 2024-03-11 00:25:50 -07:00
Enrico Ros dfd4736386 LLMSelect: support disablement 2024-03-11 00:25:39 -07:00
Enrico Ros feb793c9fa Beam: improve controller 2024-03-10 22:50:46 -07:00
Enrico Ros ee962fde08 GoodTooltip: fix 2024-03-10 22:12:12 -07:00
Enrico Ros c08dd96de3 Beam: add Stop buttons 2024-03-10 21:39:57 -07:00
Enrico Ros b52f771133 BlocksRenderer: improve expand buttons 2024-03-10 21:39:28 -07:00
Enrico Ros 4631232551 Animations: centralize 2024-03-10 21:39:02 -07:00
Enrico Ros df7f5047aa Beam: first Wiring 2024-03-10 20:58:37 -07:00
Enrico Ros 467d14324d zIndices: cleanup 2024-03-10 20:53:09 -07:00
Enrico Ros cbdce08e96 Beam: improve rays 2024-03-10 17:50:46 -07:00
Enrico Ros d6bf8f8854 Beam: rename View again 2024-03-10 17:25:51 -07:00
Enrico Ros 4599da3ded Revert "Beam: remove optionality"
This reverts commit 6d50952b2e.
2024-03-10 17:24:42 -07:00
Enrico Ros 6d50952b2e Beam: remove optionality 2024-03-10 17:23:00 -07:00
Enrico Ros 7066947809 Beam: move files 2024-03-10 17:15:01 -07:00
Enrico Ros e2924aacab Beam: cleanups 2024-03-10 16:49:36 -07:00
Enrico Ros 1e86d2503f Beam: merged -> gather 2024-03-10 16:33:24 -07:00
Enrico Ros eb67eee53a Beam: improve Debug methods 2024-03-10 16:33:15 -07:00
Enrico Ros dfdad45963 Beam: improve Debug info 2024-03-10 16:21:04 -07:00
Enrico Ros 4735508d87 Beam: cleanups 2024-03-10 16:17:43 -07:00
Enrico Ros c43c47eab8 Beam: standalone debug app 2024-03-10 16:12:48 -07:00
Enrico Ros fafb2dc6b9 Dev Apps 2024-03-10 16:12:20 -07:00
Enrico Ros 140e99c465 Beam: start from neg scale 2024-03-10 15:59:43 -07:00
Enrico Ros 7ba1974390 Beam: Encapsulate and move logic to BeamStore 2024-03-10 15:34:34 -07:00
Enrico Ros 51b8510f17 Misc 2024-03-10 15:05:01 -07:00
Enrico Ros 5d6949d471 Force the hard work 2024-03-10 14:54:11 -07:00
Enrico Ros 8e9d0c1fd1 The Beauty and the Beam 2024-03-10 14:01:39 -07:00
Enrico Ros 3852a3b779 User Text: Collapse as well as Expand 2024-03-10 13:47:21 -07:00
Enrico Ros 8b4ba96936 Beam: rays increase button 2024-03-09 18:06:06 -08:00
Enrico Ros 0c17e18491 Beam: Rays close to gen 2024-03-09 17:57:30 -08:00
Enrico Ros 2bdbab3afc Messages: controllable Avatar sightings and content scaling offset 2024-03-09 17:54:27 -08:00
Enrico Ros b97499a95e Beam: renames 2024-03-09 17:39:36 -08:00
Enrico Ros a70ac57872 Beam: stored Rays 2024-03-09 17:01:16 -08:00
Enrico Ros a9cf457024 Beam: dynamic Rays 2024-03-09 13:07:22 -08:00
Enrico Ros e5c938ac37 Beam: optimize Ray 2024-03-09 12:44:50 -08:00
Enrico Ros edad54efa2 Beam: optimize View 2024-03-09 12:44:35 -08:00
Enrico Ros f88426758f Beam: ensure component recreation 2024-03-09 12:44:09 -08:00
Enrico Ros 77a28eb810 Optimize LLMSelect 2024-03-09 12:43:56 -08:00
Enrico Ros f834b27562 Optimize FormLabelStart 2024-03-09 12:43:49 -08:00
Enrico Ros 984e257cc5 Move to a better (more reactive?) BeamStore 2024-03-09 11:24:28 -08:00
Enrico Ros 729e7612bc Improve LLMSelect (fix dependency) 2024-03-09 11:23:59 -08:00
Enrico Ros 59fadeae57 Improve LLMSelect 2024-03-09 11:20:18 -08:00
Enrico Ros bfbf7a298a Beam: actor -> ray 2024-03-09 00:32:32 -08:00
Enrico Ros aad5d3bd65 Beam: improve style 2024-03-09 00:07:28 -08:00
Enrico Ros 504f19c445 Beam: cleanups 2024-03-08 23:34:05 -08:00
Enrico Ros 19c47eb442 Beam: improve state 2024-03-08 23:11:13 -08:00
Enrico Ros ab6043df60 Beam: rename 2024-03-08 21:58:32 -08:00
Enrico Ros 3305549a0f Fix customEvent helpers 2024-03-08 21:57:59 -08:00
Enrico Ros c24c3cb571 Beam: misc highlights 2024-03-08 18:55:38 -08:00
Enrico Ros 952999258b Beam: header: improve looks 2024-03-08 18:50:01 -08:00
Enrico Ros 0713eaa52c Beam: extract header 2024-03-08 18:43:35 -08:00
Enrico Ros 8fee689f60 Beam: update layout 2024-03-08 18:05:13 -08:00
Enrico Ros 75ddb17fed Beam: begin UI 2024-03-08 18:04:59 -08:00
Enrico Ros 0c6a74626c Beam: update store 2024-03-08 18:04:39 -08:00
Enrico Ros 41e3d0eaf9 Use customEventHelpers for creating and subscribing to custom events 2024-03-08 15:40:41 -08:00
Enrico Ros 8b9cfebd42 Beam: misc 2024-03-08 14:21:48 -08:00
Enrico Ros 16badee259 Beam: renames 2024-03-08 14:21:36 -08:00
Enrico Ros 9d5171dd36 Panes: bits 2024-03-08 13:43:56 -08:00
Enrico Ros e0c0e81b7d Panes: improve branching behavior 2024-03-08 13:42:13 -08:00
Enrico Ros fd4e8985fc Beam: 1.15 2024-03-08 12:16:58 -08:00
Enrico Ros 1d9b8503c0 Roll packages 2024-03-08 12:16:12 -08:00
Enrico Ros b3ef7b914d Beam: enable dev setting 2024-03-08 11:59:12 -08:00
Enrico Ros 2f59e12e20 Remove log 2024-03-06 22:20:40 -08:00
Enrico Ros 30e8652c2a 1.14.1: Release for Claude-3 2024-03-06 22:10:41 -08:00
Enrico Ros 5ee6aceb60 cleanups 2024-03-06 21:51:15 -08:00
Enrico Ros 6940b6a6d1 Anthropic: Full support for Claude-3 models. Closes #443, #450
Thanks to @slapglif in #450 for a reference implementation.
2024-03-06 21:50:24 -08:00
Enrico Ros 4e33ce9415 misc 2024-03-06 20:56:32 -08:00
Enrico Ros 944e22bde6 Anthropic: if there's a single system message, treat it as-if it was a user message 2024-03-06 20:49:59 -08:00
Enrico Ros 6054fa0a26 Anthropic: use the new Messages format (thanks @slapglif #450) 2024-03-06 20:42:33 -08:00
Enrico Ros 4db13cfed4 Anthropic: wire types (fully switch to the new Messages API) 2024-03-06 20:33:59 -08:00
Enrico Ros 6a6adda2e0 misc 2024-03-06 20:33:12 -08:00
Enrico Ros 4afa55c0db Anthropic: update models 2024-03-06 18:36:07 -08:00
Enrico Ros bc120bfb2b Merge branch 'release-1.14.0' 2024-03-05 22:41:40 -08:00
Enrico Ros 88966699e7 1.14.0: Changelog and README 2024-03-05 22:40:49 -08:00
Enrico Ros 9a5db3dcfb 1.14.0: release date 2024-03-05 22:38:56 -08:00
Enrico Ros 392aa1e654 1.14.0: README and Changelog 2024-03-05 22:16:02 -08:00
Enrico Ros f2b32e47ff 1.14.0: README and Changelog 2024-03-05 22:13:59 -08:00
Enrico Ros 58136d0181 maintainers: release name and cover 2024-03-05 21:58:04 -08:00
Enrico Ros 02733e55cb 1.14.0: News items 2024-03-05 21:55:44 -08:00
Enrico Ros 60df8456a7 1.14.0: Icons support 2024-03-05 21:54:48 -08:00
Enrico Ros 6d0ecc805c 1.14.0: Cover Image 2024-03-05 21:54:38 -08:00
Enrico Ros a0e9dd24a3 Explain the Debug page 2024-03-05 20:12:40 -08:00
Enrico Ros d1eb89057d Update flow 2024-03-05 14:51:00 -08:00
Enrico Ros 161c6dc83a 1.14.0: News Version 2024-03-05 14:50:51 -08:00
Enrico Ros 54848b8a7e 1.14.0: news: move around 2024-03-05 14:50:46 -08:00
Enrico Ros 990563c604 1.14.0: Version 2024-03-05 14:45:35 -08:00
Enrico Ros 8489ca8c8d Anthropic: add status update tracking #443 2024-03-05 14:40:43 -08:00
Enrico Ros b57e2c89e3 miniroll 2024-03-05 14:32:44 -08:00
Enrico Ros 66bedf78ac anthropic: cutoff dates 2024-03-04 22:30:09 -08:00
Enrico Ros 592c5cce60 roll packages 2024-03-04 22:01:19 -08:00
Enrico Ros 2ccf9a4e92 swap items 2024-03-04 21:38:30 -08:00
Enrico Ros ed333c0513 make 127.0.0.1 work on airgaped connections 2024-03-04 16:26:20 -08:00
Enrico Ros 89b65b7009 unbreak build #444 2024-03-04 15:20:08 -08:00
Enrico Ros 0cc2d346af Merge pull request #444 from jacksongoode/claude-3
Add Claude 3 models
2024-03-04 14:18:19 -08:00
Jackson 5f81e78bc4 Add Claude 2 to old models 2024-03-04 12:29:04 -08:00
Jackson 554b5fd4b5 Add Claude 3 models 2024-03-04 12:24:12 -08:00
Phil Huang a705b16493 Add support Kubernetes deployment
- Provide k8s/big-agi-deployment.yaml and env-secrert.yaml
- Add deploy-k8s.md to explain the installation process
2023-10-05 02:36:36 +08:00
748 changed files with 63793 additions and 21766 deletions
+25 -3
View File
@@ -21,8 +21,9 @@ assignees: enricoros
- [ ] Create a temporary tag `git tag v1.2.3 && git push opensource --tags`
- [ ] Create a [New Draft GitHub Release](https://github.com/enricoros/big-agi/releases/new), and generate the automated changelog (for new contributors)
- [ ] Update the release version in package.json, and `npm i`
- [ ] Update in-app News [src/apps/news/news.data.tsx](/src/apps/news/news.data.tsx)
- [ ] Update the in-app News version number
- [ ] Update in-app News [src/apps/news/news.data.tsx](/src/apps/news/news.data.tsx)
- [ ] Update in-app Cover graphics
- [ ] Update the README.md with the new release
- [ ] Copy the highlights to the [docs/changelog.md](/docs/changelog.md)
- Release:
@@ -50,7 +51,7 @@ To familiarize yourself with the application, the following are the Website and
```
- paste the URL: https://big-agi.com
- drag & drop: [README.md](https://raw.githubusercontent.com/enricoros/big-AGI/main/README.md)
- drag & drop: [README.md](https://raw.githubusercontent.com/enricoros/big-AGI/v2-dev/README.md)
```markdown
I am announcing a new version, 1.2.3.
@@ -79,11 +80,32 @@ I need the following from you:
1. a table summarizing all the new features in 1.2.3 with the following columns: 4 words description (exactly what it is), short description, usefulness (what it does for the user), significance, link to the issue number (not the commit)), which will be used for the artifacts later
2. then double-check the git log to see if there are any features of significance that are not in the table
3. then score each feature in terms of importance for users (1-10), relative impact of the feature (1-10, where 10 applies to the broadest user base), and novelty and uniqueness (1-10, where 10 is truly unique and novel from what exists already)
3. then score each feature in terms of importance for users (1-10), relative impact of the feature (1-10, where 10 applies to the broadest user base), and novelty and uniqueness (1-10, where 10 is truly unique and novel from what exists already)
4. then improve the table, in decreasing order of importance for features, fixing any detail that's missing, in particular check if there are commits of significance from a user or developer point of view, which are not contained in the table
5. then I want you then to update the news.data.tsx for the new release
```
### release name
```markdown
please brainstorm 10 different names for this release. see the former names here: https://big-agi.com/blog
```
You can follow with 'What do you think of Modelmorphic?' or other selected name
### cover images
```markdown
Great, now I need to generate images for this. Before I used the following prompts (2 releases before).
// An image of a capybara sculpted entirely from black cotton candy, set against a minimalist backdrop with splashes of bright, contrasting sparkles. The capybara is using a computer with split screen made of origami, split keyboard and is wearing origami sunglasses with very different split reflections. Split halves are very contrasting. Close up photography, bokeh, white background.
import coverV113 from '../../../public/images/covers/release-cover-v1.13.0.png';
// An image of a capybara sculpted entirely from black cotton candy, set against a minimalist backdrop with splashes of bright, contrasting sparkles. The capybara is calling on a 3D origami old-school pink telephone and the camera is zooming on the telephone. Close up photography, bokeh, white background.
import coverV112 from '../../../public/images/covers/release-cover-v1.12.0.png';
What can I do now as far as images? Give me 4 prompt ideas with the same style as looks as the former, but different scene or action
```
### Readme (and Changelog)
```markdown
+32 -8
View File
@@ -12,8 +12,9 @@ name: Create and publish Docker images
on:
push:
branches:
- main
#- main-stable # Disabled as the v* tag is used for stable releases
- v2-dev
#- v1-dev # Disabled because this is not needed anymore
#- v1-stable # Disabled as the v* tag is used for stable releases
tags:
- 'v*' # Trigger on version tags (e.g., v1.7.0)
@@ -27,13 +28,22 @@ jobs:
permissions:
contents: read
packages: write
security-events: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to the Container registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
@@ -41,21 +51,35 @@ jobs:
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=raw,value=development,enable=${{ github.ref == 'refs/heads/main' }}
type=raw,value=stable,enable=${{ github.ref == 'refs/heads/main-stable' }}
type=raw,value=development,enable=${{ github.ref == 'refs/heads/v2-dev' }} # For v2-dev branch
type=raw,value=stable,enable=${{ github.ref == 'refs/heads/v1-stable' }}
type=ref,event=tag # Use the tag name as a tag for tag builds
type=semver,pattern={{version}} # Generate semantic versioning tags for tag builds
type=sha,format=short,prefix=sha- # Just in case none of the above applies
labels: |
org.opencontainers.image.title=Big-AGI
org.opencontainers.image.description=Generative AI suite powered by state-of-the-art models
org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}
org.opencontainers.image.documentation=https://big-agi.com
- name: Build and push Docker image
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
uses: docker/build-push-action@v6
with:
context: .
file: Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: NEXT_PUBLIC_GA4_MEASUREMENT_ID=${{ secrets.GA4_MEASUREMENT_ID }}
build-args: |
NEXT_PUBLIC_GA4_MEASUREMENT_ID=${{ secrets.GA4_MEASUREMENT_ID }}
# Enable build cache (future)
#cache-from: type=gha
#cache-to: type=gha,mode=max
# Enable provenance and SBOM (future)
#provenance: true
#sbom: true
+12 -1
View File
@@ -3,6 +3,10 @@
# Frontend Build: ignore API files disabled for this build
/app/**/*.backup
# Supabase - ignored for now
/supabase/
/*.sql
# dependencies
/node_modules
/.pnp
@@ -41,4 +45,11 @@ yarn-error.log*
next-env.d.ts
# other
.idea/
.idea/
# Ingore k8s/env-secret.yaml
./k8s/env-secret.yaml
/certificates
.env*.local
/.run/dev (ENV).run.xml
/src/modules/3rdparty/aider/scratch*
+5 -3
View File
@@ -1,8 +1,7 @@
# Base
FROM node:18-alpine AS base
FROM node:22-alpine AS base
ENV NEXT_TELEMETRY_DISABLED 1
# Dependencies
FROM base AS deps
WORKDIR /app
@@ -11,6 +10,9 @@ WORKDIR /app
COPY package*.json ./
COPY src/server/prisma ./src/server/prisma
# link ssl3 for latest Alpine
RUN sh -c '[ ! -e /lib/libssl.so.3 ] && ln -s /usr/lib/libssl.so.3 /lib/libssl.so.3 || echo "Link already exists"'
# Install dependencies, including dev (release builds should use npm ci)
ENV NODE_ENV development
RUN npm ci
@@ -61,4 +63,4 @@ USER nextjs
EXPOSE 3000
# Start the application
CMD ["next", "start"]
CMD ["next", "start"]
+110 -88
View File
@@ -1,23 +1,96 @@
# BIG-AGI 🧠✨
Welcome to big-AGI 👋, the GPT application for professionals that need function, form,
Welcome to big-AGI, the AI suite for professionals that need function, form,
simplicity, and speed. Powered by the latest models from 12 vendors and
open-source model servers, `big-AGI` offers best-in-class Voice and Chat with AI Personas,
visualizations, coding, drawing, calling, and quite more -- all in a polished UX.
open-source servers, `big-AGI` offers best-in-class Chats,
[Beams](https://github.com/enricoros/big-AGI/issues/470),
and [Calls](https://github.com/enricoros/big-AGI/issues/354) with AI personas,
visualizations, coding, drawing, side-by-side chatting, and more -- all wrapped in a polished UX.
Pros use big-AGI. 🚀 Developers love big-AGI. 🤖
Stay ahead of the curve with big-AGI. 🚀 Pros & Devs love big-AGI. 🤖
[![Official Website](https://img.shields.io/badge/BIG--AGI.com-%23096bde?style=for-the-badge&logo=vercel&label=launch)](https://big-agi.com)
> 🚀 Big-AGI 2 is launching Q4 2024. Be the first to experience it before the public release.
>
> 👉 [Apply for Early Access](https://y2rjg0zillz.typeform.com/to/ZSADpr5u?utm_source=gh-2&utm_medium=readme&utm_campaign=ea2)
Or fork & run on Vercel
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fenricoros%2Fbig-AGI&env=OPENAI_API_KEY&envDescription=Backend%20API%20keys%2C%20optional%20and%20may%20be%20overridden%20by%20the%20UI.&envLink=https%3A%2F%2Fgithub.com%2Fenricoros%2Fbig-AGI%2Fblob%2Fmain%2Fdocs%2Fenvironment-variables.md&project-name=big-AGI)
## 👉 [roadmap](https://github.com/users/enricoros/projects/4/views/2) 👉 [documentation](docs/README.md)
### New Version
big-AGI is an open book; see the **[ready-to-ship and future ideas](https://github.com/users/enricoros/projects/4/views/2)** in our open roadmap
This repository contains two main versions:
### What's New in 1.13.0 · Feb 8, 2024 · Multi + Mind
- Big-AGI 2: next-generation, bringing the most advanced AI experience
- `v2-dev`: V2 development branch, the exciting one, future default
- Big-AGI Stable: as deployed on big-agi.com
- `v1-dev`: V1 development branch (this branch)
- `v1-stable`: Current stable version
Note: After the V2 release in Q4, `v2-dev` will become the default branch and `v1-dev` will reach EOL.
### Quick links: 👉 [roadmap](https://github.com/users/enricoros/projects/4/views/2) 👉 [installation](docs/installation.md) 👉 [documentation](docs/README.md)
### What's New in 1.16.1...1.16.8 · Sep 13, 2024 (patch releases)
- 1.16.8: OpenAI ChatGPT-4o Latest (o1-preview and o1-mini are supported in Big-AGI 2)
- 1.16.7: OpenAI support for GPT-4o 2024-08-06
- 1.16.6: Groq support for Llama 3.1 models
- 1.16.5: GPT-4o Mini support
- 1.16.4: 8192 tokens support for Claude 3.5 Sonnet
- 1.16.3: Anthropic Claude 3.5 Sonnet model support
- 1.16.2: Improve web downloads, as text, markdown, or HTML
- 1.16.2: Proper support for Gemini models
- 1.16.2: Added the latest Mistral model
- 1.16.2: Tokenizer support for gpt-4o
- 1.16.2: Updates to Beam
- 1.16.1: Support for the new OpenAI GPT-4o 2024-05-13 model
### What's New in 1.16.0 · May 9, 2024 · Crystal Clear
- [Beam](https://big-agi.com/blog/beam-multi-model-ai-reasoning) core and UX improvements based on user feedback
- Chat cost estimation 💰 (enable it in Labs / hover the token counter)
- Save/load chat files with Ctrl+S / Ctrl+O on desktop
- Major enhancements to the Auto-Diagrams tool
- YouTube Transcriber Persona for chatting with video content, [#500](https://github.com/enricoros/big-AGI/pull/500)
- Improved formula rendering (LaTeX), and dark-mode diagrams, [#508](https://github.com/enricoros/big-AGI/issues/508), [#520](https://github.com/enricoros/big-AGI/issues/520)
- Models update: **Anthropic**, **Groq**, **Ollama**, **OpenAI**, **OpenRouter**, **Perplexity**
- Code soft-wrap, chat text selection toolbar, 3x faster on Apple silicon, and more [#517](https://github.com/enricoros/big-AGI/issues/517), [507](https://github.com/enricoros/big-AGI/pull/507)
#### 3,000 Commits Milestone · April 7, 2024
![big-AGI Milestone](https://github.com/enricoros/big-AGI/assets/32999/47fddbb1-9bd6-4b58-ace4-781dfcb80923)
- 🥇 Today we <b>celebrate commit 3000</b> in just over one year, and going stronger 🚀
- 📢️ Thanks everyone for your support and words of love for Big-AGI, we are committed to creating the best AI experiences for everyone.
### What's New in 1.15.0 · April 1, 2024 · Beam
- ⚠️ [**Beam**: the multi-model AI chat](https://big-agi.com/blog/beam-multi-model-ai-reasoning). find better answers, faster - a game-changer for brainstorming, decision-making, and creativity. [#443](https://github.com/enricoros/big-AGI/issues/443)
- Managed Deployments **Auto-Configuration**: simplify the UI models setup with backend-set models. [#436](https://github.com/enricoros/big-AGI/issues/436)
- Message **Starring ⭐**: star important messages within chats, to attach them later. [#476](https://github.com/enricoros/big-AGI/issues/476)
- Enhanced the default Persona
- Fixes to Gemini models and SVGs, improvements to UI and icons
- 1.15.1: Support for Gemini Pro 1.5 and OpenAI Turbo models
- Beast release, over 430 commits, 10,000+ lines changed: [release notes](https://github.com/enricoros/big-AGI/releases/tag/v1.15.0), and changes [v1.14.1...v1.15.0](https://github.com/enricoros/big-AGI/compare/v1.14.1...v1.15.0)
<details>
<summary>What's New in 1.14.1 · March 7, 2024 · Modelmorphic</summary>
- **Anthropic** [Claude-3](https://www.anthropic.com/news/claude-3-family) model family support. [#443](https://github.com/enricoros/big-AGI/issues/443)
- New **[Perplexity](https://www.perplexity.ai/)** and **[Groq](https://groq.com/)** integration (thanks @Penagwin). [#407](https://github.com/enricoros/big-AGI/issues/407), [#427](https://github.com/enricoros/big-AGI/issues/427)
- **[LocalAI](https://localai.io/models/)** deep integration, including support for [model galleries](https://github.com/enricoros/big-AGI/issues/411)
- **Mistral** Large and Google **Gemini 1.5** support
- Performance optimizations: runs [much faster](https://twitter.com/enricoros/status/1756553038293303434?utm_source=localhost:3000&utm_medium=big-agi), saves lots of power, reduces memory usage
- Enhanced UX with auto-sizing charts, refined search and folder functionalities, perfected scaling
- And with more UI improvements, documentation, bug fixes (20 tickets), and developer enhancements
</details>
<details>
<summary>What's New in 1.13.0 · Feb 8, 2024 · Multi + Mind</summary>
https://github.com/enricoros/big-AGI/assets/32999/01732528-730e-41dc-adc7-511385686b13
@@ -29,6 +102,8 @@ https://github.com/enricoros/big-AGI/assets/32999/01732528-730e-41dc-adc7-511385
- Better looking chats with improved spacing, fonts, and menus
- More: new video player, [LM Studio tutorial](https://github.com/enricoros/big-AGI/blob/main/docs/config-local-lmstudio.md) (thanks @aj47), [MongoDB support](https://github.com/enricoros/big-AGI/blob/main/docs/deploy-database.md) (thanks @ranfysvalle02), and speedups
</details>
<details>
<summary>What's New in 1.12.0 · Jan 26, 2024 · AGI Hotline</summary>
@@ -73,11 +148,11 @@ https://github.com/enricoros/big-AGI/assets/1590910/a6b8e172-0726-4b03-a5e5-10cf
For full details and former releases, check out the [changelog](docs/changelog.md).
## Key Features 👊
## 👉 Key Features
| ![Advanced AI](https://img.shields.io/badge/Advanced%20AI-32383e?style=for-the-badge&logo=ai&logoColor=white) | ![100+ AI Models](https://img.shields.io/badge/100%2B%20AI%20Models-32383e?style=for-the-badge&logo=ai&logoColor=white) | ![Flow-state UX](https://img.shields.io/badge/Flow--state%20UX-32383e?style=for-the-badge&logo=flow&logoColor=white) | ![Privacy First](https://img.shields.io/badge/Privacy%20First-32383e?style=for-the-badge&logo=privacy&logoColor=white) | ![Advanced Tools](https://img.shields.io/badge/Fun%20To%20Use-f22a85?style=for-the-badge&logo=tools&logoColor=white) |
|---------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------|
| **Chat**<br/>**Call** AGI<br/>**Draw** images<br/>**Agents**, ... | Local & Cloud<br/>Open & Closed<br/>Cheap & Heavy<br/>Google, Mistral, ... | Attachments<br/>Diagrams<br/>Multi-Chat<br/>Mobile-first UI | Stored Locally<br/>Easy self-Host<br/>Local actions<br/>Data = Gold | AI Personas<br/>Voice Modes<br/>Screen Capture<br/>Camera + OCR |
| **Chat**<br/>**Call**<br/>**Beam**<br/>**Draw**, ... | Local & Cloud<br/>Open & Closed<br/>Cheap & Heavy<br/>Google, Mistral, ... | Attachments<br/>Diagrams<br/>Multi-Chat<br/>Mobile-first UI | Stored Locally<br/>Easy self-Host<br/>Local actions<br/>Data = Gold | AI Personas<br/>Voice Modes<br/>Screen Capture<br/>Camera + OCR |
![big-AGI screenshot](docs/pixels/big-AGI-compo-20240201_small.png)
@@ -85,7 +160,7 @@ You can easily configure 100s of AI models in big-AGI:
| **AI models** | _supported vendors_ |
|:--------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Opensource Servers | [LocalAI](https://localai.com) (multimodal) · [Ollama](https://ollama.com/) · [Oobabooga](https://github.com/oobabooga/text-generation-webui) |
| Opensource Servers | [LocalAI](https://localai.io/) (multimodal) · [Ollama](https://ollama.com/) |
| Local Servers | [LM Studio](https://lmstudio.ai/) |
| Multimodal services | [Azure](https://azure.microsoft.com/en-us/products/ai-services/openai-service) · [Google Gemini](https://ai.google.dev/) · [OpenAI](https://platform.openai.com/docs/overview) |
| Language services | [Anthropic](https://anthropic.com) · [Groq](https://wow.groq.com/) · [Mistral](https://mistral.ai/) · [OpenRouter](https://openrouter.ai/) · [Perplexity](https://www.perplexity.ai/) · [Together AI](https://www.together.ai/) |
@@ -120,6 +195,22 @@ Add extra functionality with these integrations:
<br/>
## 🚀 Installation
To get started with big-AGI, follow our comprehensive [Installation Guide](docs/installation.md).
The guide covers various installation options, whether you're spinning it up on
your local computer, deploying on Vercel, on Cloudflare, or rolling it out
through Docker.
Whether you're a developer, system integrator, or enterprise user, you'll find step-by-step instructions
to set up big-AGI quickly and easily.
[![Installation Guide](https://img.shields.io/badge/Installation%20Guide-blue?style=for-the-badge&logo=read-the-docs&logoColor=white)](docs/installation.md)
Or bring your API keys and jump straight into our free instance on [big-AGI.com](https://big-agi.com).
<br/>
# 🌟 Get Involved!
[//]: # ([![Official Discord]&#40;https://img.shields.io/discord/1098796266906980422?label=discord&logo=discord&logoColor=%23fff&style=for-the-badge&#41;]&#40;https://discord.gg/MkH4qj2Jp9&#41;)
@@ -129,86 +220,10 @@ Add extra functionality with these integrations:
- [ ]**Give us a star** on GitHub 👆
- [ ] 🚀 **Do you like code**? You'll love this gem of a project! [_Pick up a task!_](https://github.com/users/enricoros/projects/4/views/4) - _easy_ to _pro_
- [ ] 💡 Got a feature suggestion? [_Add your roadmap ideas_](https://github.com/enricoros/big-agi/issues/new?&template=roadmap-request.md)
- [ ]Deploy your [fork](docs/customizations.md) for your friends and family, or [customize it for work](docs/customizations.md)
- [ ] Check out some of the big-AGI [**community projects**](docs/customizations.md)
| Project | Features | GitHub |
|---------|----------------------------------------------------|-------------------------------------------------------------------------------------|
| CoolAGI | Code Interpreter, Vision, Mind maps, and much more | [nextgen-user/CoolAGI](https://github.com/nextgen-user/CoolAGI) |
| HL-GPT | Fully remodeled UI | [harlanlewis/nextjs-chatgpt-app](https://github.com/harlanlewis/nextjs-chatgpt-app) |
- [ ][Deploy](docs/installation.md) your [fork](docs/customizations.md) for your friends and family, or [customize it for work](docs/customizations.md)
<br/>
# 🧩 Develop
[//]: # (![TypeScript]&#40;https://img.shields.io/badge/TypeScript-007ACC?style=&logo=typescript&logoColor=white&#41;)
[//]: # (![React]&#40;https://img.shields.io/badge/React-61DAFB?style=&logo=react&logoColor=black&#41;)
[//]: # (![Next.js]&#40;https://img.shields.io/badge/Next.js-000000?style=&logo=vercel&logoColor=white&#41;)
To download and run this Typescript/React/Next.js project locally, the only prerequisite is Node.js with the `npm` package manager.
Clone this repo, install the dependencies (all local), and run the development server (which auto-watches the
files for changes):
```bash
git clone https://github.com/enricoros/big-agi.git
cd big-agi
npm install
npm run dev
# You will see something like:
#
# ▲ Next.js 14.1.0
# - Local: http://localhost:3000
# ✓ Ready in 2.6s
```
The development app will be running on `http://localhost:3000`. Development builds have the advantage of not requiring
a build step, but can be slower than production builds. Also, development builds won't have timeout on edge functions.
## 🛠️ Deploy from source
The _production_ build of the application is optimized for performance and is performed by the `npm run build` command,
after installing the required dependencies.
```bash
# .. repeat the steps above up to `npm install`, then:
npm run build
next start --port 3000
```
The app will be running on the specified port, e.g. `http://localhost:3000`.
Want to deploy with username/password? See the [Authentication](docs/deploy-authentication.md) guide.
## 🐳 Deploy with Docker
For more detailed information on deploying with Docker, please refer to the [docker deployment documentation](docs/deploy-docker.md).
Build and run:
```bash
docker build -t big-agi .
docker run -d -p 3000:3000 big-agi
```
Or run the official container:
- manually: `docker run -d -p 3000:3000 ghcr.io/enricoros/big-agi`
- or, with docker-compose: `docker-compose up` or see [the documentation](docs/deploy-docker.md) for a composer file with integrated browsing
## ☁️ Deploy on Cloudflare Pages
Please refer to the [Cloudflare deployment documentation](docs/deploy-cloudflare.md).
## 🚀 Deploy on Vercel
Create your GitHub fork, create a Vercel project over that fork, and deploy it. Or press the button below for convenience.
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fenricoros%2Fbig-AGI&env=OPENAI_API_KEY&envDescription=Backend%20API%20keys%2C%20optional%20and%20may%20be%20overridden%20by%20the%20UI.&envLink=https%3A%2F%2Fgithub.com%2Fenricoros%2Fbig-AGI%2Fblob%2Fmain%2Fdocs%2Fenvironment-variables.md&project-name=big-AGI)
[//]: # ([![GitHub stars]&#40;https://img.shields.io/github/stars/enricoros/big-agi&#41;]&#40;https://github.com/enricoros/big-agi/stargazers&#41;)
[//]: # ([![GitHub forks]&#40;https://img.shields.io/github/forks/enricoros/big-agi&#41;]&#40;https://github.com/enricoros/big-agi/network&#41;)
@@ -217,6 +232,13 @@ Create your GitHub fork, create a Vercel project over that fork, and deploy it.
[//]: # ([![License]&#40;https://img.shields.io/github/license/enricoros/big-agi&#41;]&#40;https://github.com/enricoros/big-agi/LICENSE&#41;)
## 📜 Licensing
Big-AGI incorporates third-party software components that are subject
to separate license terms. For detailed information about these
components and their respective licenses, please refer to
the [Third-Party Notices](src/modules/3rdparty/THIRD_PARTY_NOTICES.md).
---
2023-2024 · Enrico Ros x [big-AGI](https://big-agi.com) · License: [MIT](LICENSE) · Made with 💙
2023-2024 · Enrico Ros x [Big-AGI](https://big-agi.com) · Like this project? Leave a star! 💫⭐
+24
View File
@@ -0,0 +1,24 @@
import { fetchRequestHandler } from '@trpc/server/adapters/fetch';
import { appRouterCloud } from '~/server/trpc/trpc.router-cloud';
import { createTRPCFetchContext } from '~/server/trpc/trpc.server';
const handlerNodeRoutes = (req: Request) => fetchRequestHandler({
endpoint: '/api/cloud',
router: appRouterCloud,
req,
createContext: createTRPCFetchContext,
onError:
process.env.NODE_ENV === 'development'
? ({ path, error }) => console.error(`❌ tRPC-cloud failed on ${path ?? 'unk-path'}: ${error.message}`)
: undefined,
});
// NOTE: the following statement breaks the build on non-pro deployments, and conditionals don't work either
// so we resorted to raising the timeout from 10s to 25s in the vercel.json file instead
// export const maxDuration = 25;
export const runtime = 'nodejs';
export const dynamic = 'force-dynamic';
export { handlerNodeRoutes as GET, handlerNodeRoutes as POST };
+18
View File
@@ -0,0 +1,18 @@
import { fetchRequestHandler } from '@trpc/server/adapters/fetch';
import { appRouterEdge } from '~/server/trpc/trpc.router-edge';
import { createTRPCFetchContext } from '~/server/trpc/trpc.server';
const handlerEdgeRoutes = (req: Request) => fetchRequestHandler({
endpoint: '/api/edge',
router: appRouterEdge,
req,
createContext: createTRPCFetchContext,
onError:
process.env.NODE_ENV === 'development'
? ({ path, error }) => console.error(`❌ tRPC-edge failed on ${path ?? 'unk-path'}: ${error.message}`)
: undefined,
});
export const runtime = 'edge';
export { handlerEdgeRoutes as GET, handlerEdgeRoutes as POST };
-2
View File
@@ -1,2 +0,0 @@
export const runtime = 'edge';
export { elevenLabsHandler as POST } from '~/modules/elevenlabs/elevenlabs.server';
-2
View File
@@ -1,2 +0,0 @@
export const runtime = 'edge';
export { llmStreamingRelayHandler as POST } from '~/modules/llms/server/llm.server.streaming';
-19
View File
@@ -1,19 +0,0 @@
import { fetchRequestHandler } from '@trpc/server/adapters/fetch';
import { appRouterEdge } from '~/server/api/trpc.router-edge';
import { createTRPCFetchContext } from '~/server/api/trpc.server';
const handlerEdgeRoutes = (req: Request) =>
fetchRequestHandler({
router: appRouterEdge,
endpoint: '/api/trpc-edge',
req,
createContext: createTRPCFetchContext,
onError:
process.env.NODE_ENV === 'development'
? ({ path, error }) => console.error(`❌ tRPC-edge failed on ${path ?? "<no-path>"}: ${error.message}`)
: undefined,
});
export const runtime = 'edge';
export { handlerEdgeRoutes as GET, handlerEdgeRoutes as POST };
-19
View File
@@ -1,19 +0,0 @@
import { fetchRequestHandler } from '@trpc/server/adapters/fetch';
import { appRouterNode } from '~/server/api/trpc.router-node';
import { createTRPCFetchContext } from '~/server/api/trpc.server';
const handlerNodeRoutes = (req: Request) =>
fetchRequestHandler({
router: appRouterNode,
endpoint: '/api/trpc-node',
req,
createContext: createTRPCFetchContext,
onError:
process.env.NODE_ENV === 'development'
? ({ path, error }) => console.error(`❌ tRPC-node failed on ${path ?? '<no-path>'}: ${error.message}`)
: undefined,
});
export const runtime = 'nodejs';
export { handlerNodeRoutes as GET, handlerNodeRoutes as POST };
+70
View File
@@ -0,0 +1,70 @@
# AIX dispatch server - API features comparison
This is updated as of 2024-07-09, and includes the latest features and capabilities of the three major AI APIs: Anthropic, Gemini, and OpenAI.
The comparison covers a wide range of features, including function calling, vision, system instructions, etc.
| Feature Category | Specific Feature | Anthropic | Gemini | OpenAI |
|------------------------------------------|-------------------------------|--------------------------------------------------------------------|------------------------------------------------------------------|---------------------------------------------------------------------|
| **Message Structure** |
| | Role types | user, assistant | user, model | user, assistant, system, tool |
| | Named participants | No | No | Yes |
| | Content array | Yes | Yes | Yes |
| **Content Types and Multimodal Support** |
| | Text generation | Yes | Yes | Yes |
| | Image understanding | Yes | Yes | Yes |
| | Audio processing | No | **Yes** | No |
| | Video processing | No | **Yes** | No |
| **Image Handling** |
| | Supported formats | JPEG, PNG, GIF, WebP | JPEG, PNG, WebP, HEIC, HEIF | PNG, JPEG, WebP, non-animated GIF |
| | Max image size | 5MB per image | (20MB per prompt) | 20MB per image |
| | Image detail level | N/A | N/A | **Low, high, auto** |
| | Image resolution | max: 1568x1568 | min: 768x768, max: 3072x3072 | min: 512x512, max: 2048 x 2048 |
| | Token calculation for images | (width * height)/750; max 1,600 | 258 tokens | 85 + 170 * {patches} |
| | Image retention | Deleted after processing | Not specified | Deleted after processing |
| **Audio and Video Handling** |
| | Audio formats | N/A | WAV, MP3, AIFF, AAC, OGG, FLAC | N/A |
| | Video formats | N/A | MP4, MPEG, MOV, AVI, MPG, WebM, WMV, 3GPP | N/A |
| **System Instructions and Tool Use** |
| | System instructions | Yes (array of text blocks) | Yes (parts array) | Yes (as system message) |
| **Function/Tool Handling** |
| | Parallel tool calls | No | No | **Yes** |
| | Tool Declaration | Defined in `tools` array | Defined in `tools` array | Defined in `tools` array |
| | FC name restrictions | Yes | Yes (max 63 chars) | Yes (max 64 chars) |
| | FC declaration | name, description, input_schema | name, description, parameters | name, description, parameters |
| | FC options structure | JSON Schema for input | Object with properties | JSON Schema for parameters |
| | FC Force invocation | Via `tool_choice` parameter | Via `toolConfig` parameter | Via `tool_choice` parameter |
| | FC Model invocation | Model generates a `tool_use` block with predicted parameters | Generates a `functionCall` part with predicted parameters | Generates a message.`tool_calls` item with predicted arguments |
| | FC Execution | Client-side | Client-side | Client-side |
| | FC Result injection | Client appends a `user` message with a `tool_result` content block | Client appends a `function` message with `functionResponse` part | Client sends a new `tool` message with `tool_call_id` and `content` |
| | Built-in Code execution | No | **Yes** | No |
| | Tool use with vision | Yes | Yes | Yes |
| **Generation Configuration** |
| | temperature | Yes | Yes | Yes |
| | max_tokens | Yes | Yes | Yes |
| | stop_sequences | Yes | Yes | Yes |
| | top_k | Yes | Yes | **No** |
| | top_p | Yes | Yes | Yes |
| | seed | No | No | **Yes** |
| | Multiple candidates | No | No | Yes (with 'n' parameter, breaks streaming?) |
| **Streaming and Response Structure** |
| | Streaming support | Yes | Yes | Yes |
| | Streaming initiation | stream=true | streamGenerateContent path | stream=true |
| | Streaming event types | **Multiple specific types** | Not specified | Single delta type |
| | Response container | content (array) | candidates (array) | choices (array) |
| **Usage Metrics and Error Handling** |
| | Token counts | Yes | Yes | Yes |
| | Detailed token breakdown | input, output | prompt, cached, candidates, total | prompt, completion, total |
| | Usage in stream | No | No | **Optional** |
| | Error handling in response | Not specified | Not specified | **Yes (undocumented)** |
| | Error handling in stream | Not specified | Not specified | **Yes (undocumented)** |
| **Advanced Features** |
| | JSON mode | **Partial (via structured prompts)** | **Yes (responseMimeType)** | **Yes** |
| | Output consistency techniques | **Yes (multiple methods)** | Not specified | Not specified |
| | Logprobs | No | No | **Yes (disabled in schema)** |
| | System fingerprint | No | No | **Yes** |
| | Semantic caching | No | **Yes** | No |
| | Assistant prefill | **Yes** | No | No |
| | Preferred formatting | **XML tags, JSON** | Not specified | Markdown |
| **Safety and Compliance** |
| | Safety settings in request | **Stop sequences** | **Detailed category-based** | **Moderation API** |
| | Safety feedback in response | Yes | Yes | Not specified |
+33 -36
View File
@@ -1,65 +1,62 @@
# big-AGI Documentation
# Big-AGI Documentation
Find all the information you need to get started, configure, and effectively use big-AGI.
Information you need to get started, configure, and use big-AGI productively.
[//]: # (## Quick Start)
## Getting Started
[//]: # (- **[Introduction]&#40;big-agi.md&#41;**: Overview of big-AGI's features.)
Guides for basic big-AGI features:
## Configuration Guides
- **[Enabling Microphone for Speech Recognition](help-feature-microphone.md)**: Instructions to
allow speech recognition in browsers and apps.
Detailed guides to configure your big-AGI interface and models.
## AI Model Configuration
👉 The following applies to the users of big-AGI.com, as the public instance is empty and to be configured by the user.
Detailed guides to configure AI models and advanced features in big-AGI.
- **Cloud Model Services**:
> 👉 The following applies to users of big-AGI.com, as the public instance is empty and requires user configuration.
- **Cloud AI Services**:
- **[Azure OpenAI](config-azure-openai.md)**
- **[OpenRouter](config-openrouter.md)**
- easy API key: **Anthropic**, **Google AI**, **Groq**, **Mistral**, **OpenAI**, **Perplexity**, **TogetherAI**
- Easy API key setup: **Anthropic**, **Deepseek**, **Google AI**, **Groq**, **Mistral**, **OpenAI**, **OpenPipe**, **Perplexity**, **TogetherAI**, **xAI**
- **Local Model Servers**:
- **Local AI Integrations**:
- **[LocalAI](config-local-localai.md)**
- **[LM Studio](config-local-lmstudio.md)**
- **[Ollama](config-local-ollama.md)**
- **[Oobabooga](config-local-oobabooga.md)**
- **Advanced Feature Configuration**:
- **[Browse](config-feature-browse.md)**: Enable web page download through third-party services or your own cloud (advanced)
- **ElevenLabs API**: Voice and cutom voice generation, only requires their API key
- **Google Search API**: guide not yet available, see the Google options in 'Environment Variables'
- **Prodia API**: Stable Diffusion XL image generation, only requires their API key, alternative to DALL·E
- **Enhanced AI Features**:
- **[Web Browsing](config-feature-browse.md)**: Enable web page download through third-party services or your own cloud (advanced)
- **Web Search**: Google Search API (see '[Environment Variables](environment-variables.md)')
- **Image Generation**: DALL·E 3 and 2, or Prodia API for Stable Diffusion XL
- **Voice Synthesis**: ElevenLabs API for voice generation
## Deployment
## Deployment & Customization
System integrators, administrators, whitelabelers: instead of using the public big-AGI instance on get.big-agi.com, you can deploy your own instance.
> 👉 The following applies to developers and experts who deploy their own big-AGI instance.
Step-by-step deployment and system configuration instructions.
For deploying a custom big-AGI instance:
- **Deploy Your Own**
- straightforward: **Local development**, **Vercel 1-Click**
- **[Cloudflare Deployment](deploy-cloudflare.md)**
- **[Docker Deployment](deploy-docker.md)**: Containers for Local or Cloud deployments
- **[Installation Guide](installation.md)**: Set up your own big-AGI instance
- Source build or pre-built options
- Local, cloud, or on-premises deployment
- **Deployment Server Features**
- **[Database Setup](deploy-database.md)**: Optional, only required to enable "Chat Link Sharing"
- **[Environment Variables](environment-variables.md)**: 📌 Set server-side API keys and special features in your deployments
- **[HTTP Basic Authentication](deploy-authentication.md)**: Optional, Secure your big-AGI instance with a username and password
- **Advanced Setup**:
- **[Source Code Customization Guide](customizations.md)**: Modify the source code
- **[Access Control](deploy-authentication.md)**: Optional, add basic user authentication
- **[Database Setup](deploy-database.md)**: Optional, enables "Chat Link Sharing"
- **[Reverse Proxy](deploy-reverse-proxy.md)**: Optional, enables custom domains and SSL
- **[Environment Variables](environment-variables.md)**: Pre-configures models and services
## Customization & Derivative UIs
## Community & Support
👏 Customize big-AGI to fit your needs.
- **[Customizing big-AGI](customizations.md)**: how to alter source code and server-side configuration
## Support and Community
Join our community or get support:
Connect with the growing big-AGI community:
- Visit our [GitHub repository](https://github.com/enricoros/big-AGI) for source code and issue tracking
- Check the latest updates and features on [Changelog](changelog.md) or the in-app [News](https://get.big-agi.com/news)
- Connect with us and other users on [Discord](https://discord.gg/MkH4qj2Jp9) for discussions, help, and sharing your experiences with big-AGI
Thank you for choosing big-AGI. We're excited to see what you'll build.
Thank you for choosing big-AGI. We're excited to give you the best tools to amplify yourself.
+59 -7
View File
@@ -5,12 +5,65 @@ by release.
- For the live roadmap, please see [the GitHub project](https://github.com/users/enricoros/projects/4/views/2)
### 1.13.0 - Feb 2024
### 1.17.0 - Jun 2024
- milestone: [1.13.0](https://github.com/enricoros/big-agi/milestone/13)
- milestone: [1.17.0](https://github.com/enricoros/big-agi/milestone/17)
- work in progress: [big-AGI open roadmap](https://github.com/users/enricoros/projects/4/views/2), [help here](https://github.com/users/enricoros/projects/4/views/4)
## What's New in 1.13.0 · Feb 8, 2024 · Multi + Mind
### What's New in 1.16.1...1.16.8 · Sep 13, 2024 (patch releases)
- 1.16.8: OpenAI ChatGPT-4o Latest (o1-preview and o1-mini are supported in Big-AGI 2)
- 1.16.7: OpenAI support for GPT-4o 2024-08-06
- 1.16.6: Groq support for Llama 3.1 models
- 1.16.5: GPT-4o Mini support
- 1.16.4: 8192 tokens support for Claude 3.5 Sonnet
- 1.16.3: Anthropic Claude 3.5 Sonnet model support
- 1.16.2: Improve web downloads, as text, markdown, or HTML
- 1.16.2: Proper support for Gemini models
- 1.16.2: Added the latest Mistral model
- 1.16.2: Tokenizer support for gpt-4o
- 1.16.2: Updates to Beam
- 1.16.1: Support for the new OpenAI GPT-4o 2024-05-13 model
### What's New in 1.16.0 · May 9, 2024 · Crystal Clear
- [Beam](https://big-agi.com/blog/beam-multi-model-ai-reasoning) core and UX improvements based on user feedback
- Chat cost estimation 💰 (enable it in Labs / hover the token counter)
- Save/load chat files with Ctrl+S / Ctrl+O on desktop
- Major enhancements to the Auto-Diagrams tool
- YouTube Transcriber Persona for chatting with video content, [#500](https://github.com/enricoros/big-AGI/pull/500)
- Improved formula rendering (LaTeX), and dark-mode diagrams, [#508](https://github.com/enricoros/big-AGI/issues/508), [#520](https://github.com/enricoros/big-AGI/issues/520)
- Models update: **Anthropic**, **Groq**, **Ollama**, **OpenAI**, **OpenRouter**, **Perplexity**
- Code soft-wrap, chat text selection toolbar, 3x faster on Apple silicon, and more [#517](https://github.com/enricoros/big-AGI/issues/517), [507](https://github.com/enricoros/big-AGI/pull/507)
- Developers: update the LLMs data structures
### What's New in 1.15.1 · April 10, 2024 (minor release, models support)
- Support for the newly released Gemini Pro 1.5 models
- Support for the new OpenAI 2024-04-09 Turbo models
- Resilience fixes after the large success of 1.15.0
### What's New in 1.15.0 · April 1, 2024 · Beam
- ⚠️ [**Beam**: the multi-model AI chat](https://big-agi.com/blog/beam-multi-model-ai-reasoning). find better answers, faster - a game-changer for brainstorming, decision-making, and creativity. [#443](https://github.com/enricoros/big-AGI/issues/443)
- Managed Deployments **Auto-Configuration**: simplify the UI mdoels setup with backend-set models. [#436](https://github.com/enricoros/big-AGI/issues/436)
- Message **Starring ⭐**: star important messages within chats, to attach them later. [#476](https://github.com/enricoros/big-AGI/issues/476)
- Enhanced the default Persona
- Fixes to Gemini models and SVGs, improvements to UI and icons
- Beast release, over 430 commits, 10,000+ lines changed: [release notes](https://github.com/enricoros/big-AGI/releases/tag/v1.15.0), and changes [v1.14.1...v1.15.0](https://github.com/enricoros/big-AGI/compare/v1.14.1...v1.15.0)
### What's New in 1.14.1 · March 7, 2024 · Modelmorphic
- **Anthropic** [Claude-3](https://www.anthropic.com/news/claude-3-family) model family support. [#443](https://github.com/enricoros/big-AGI/issues/443)
- New **[Perplexity](https://www.perplexity.ai/)** and **[Groq](https://groq.com/)** integration (thanks @Penagwin). [#407](https://github.com/enricoros/big-AGI/issues/407), [#427](https://github.com/enricoros/big-AGI/issues/427)
- **[LocalAI](https://localai.io/models/)** deep integration, including support for [model galleries](https://github.com/enricoros/big-AGI/issues/411)
- **Mistral** Large and Google **Gemini 1.5** support
- Performance optimizations: runs [much faster](https://twitter.com/enricoros/status/1756553038293303434?utm_source=localhost:3000&utm_medium=big-agi), saves lots of power, reduces memory usage
- Enhanced UX with auto-sizing charts, refined search and folder functionalities, perfected scaling
- And with more UI improvements, documentation, bug fixes (20 tickets), and developer enhancements
- [Release notes](https://github.com/enricoros/big-AGI/releases/tag/v1.14.0), and changes [v1.13.1...v1.14.0](https://github.com/enricoros/big-AGI/compare/v1.13.1...v1.14.0) (233 commits, 8,000+ lines changed)
### What's New in 1.13.0 · Feb 8, 2024 · Multi + Mind
https://github.com/enricoros/big-AGI/assets/32999/01732528-730e-41dc-adc7-511385686b13
@@ -22,7 +75,7 @@ https://github.com/enricoros/big-AGI/assets/32999/01732528-730e-41dc-adc7-511385
- Better looking chats with improved spacing, fonts, and menus
- More: new video player, [LM Studio tutorial](https://github.com/enricoros/big-AGI/blob/main/docs/config-local-lmstudio.md) (thanks @aj47), [MongoDB support](https://github.com/enricoros/big-AGI/blob/main/docs/deploy-database.md) (thanks @ranfysvalle02), and speedups
## What's New in 1.12.0 · Jan 26, 2024 · AGI Hotline
### What's New in 1.12.0 · Jan 26, 2024 · AGI Hotline
https://github.com/enricoros/big-AGI/assets/32999/95ceb03c-945d-4fdd-9a9f-3317beb54f3f
@@ -85,7 +138,7 @@ https://github.com/enricoros/big-AGI/assets/1590910/a6b8e172-0726-4b03-a5e5-10cf
- **Overheat LLMs**: Push the creativity with higher LLM temperatures. [#256](https://github.com/enricoros/big-agi/issues/256)
- **Model Options Shortcut**: Quick adjust with `Ctrl+Shift+O`
- Optimized Voice Input and Performance
- Latest Ollama and Oobabooga models
- Latest Ollama models
- For developers: **Password Protection**: HTTP Basic Auth. [Learn How](https://github.com/enricoros/big-agi/blob/main/docs/deploy-authentication.md)
### What's New in 1.6.0 - Nov 28, 2023 · Surf's Up
@@ -117,7 +170,7 @@ For Developers:
first request to get the configuration. See
https://github.com/enricoros/big-agi/blob/main/src/modules/backend/backend.router.ts.
- CloudFlare developers: please change the deployment command to
`rm app/api/trpc-node/[trpc]/route.ts && npx @cloudflare/next-on-pages@1`,
`rm app/api/cloud/[trpc]/route.ts && npx @cloudflare/next-on-pages@1`,
as we transitioned to the App router in NextJS 14. The documentation in
[docs/deploy-cloudflare.md](../docs/deploy-cloudflare.md) is updated
@@ -134,7 +187,6 @@ For Developers:
- **Camera OCR** - real-world AI - take a picture of a text, and chat with it
- **Anthropic models** support, e.g. Claude
- **Backup/Restore** - save chats, and restore them later
- **[Local model support with Oobabooga server](../docs/config-local-oobabooga)** - run your own LLMs!
- **Flatten conversations** - conversations summarizer with 4 modes
- **Fork conversations** - create a new chat, to try with different endings
- New commands: /s to add a System message, and /a for an Assistant message
+3
View File
@@ -20,6 +20,9 @@ If you have an `API Endpoint` and `API Key`, you can configure big-AGI as follow
The deployed models are now available in the application. If you don't have a configured
Azure OpenAI service instance, continue with the next section.
In addition to using the UI, configuration can also be done using
[environment variables](environment-variables.md).
## Setting Up Azure
### Step 1: Azure Account & Subscription
+2 -2
View File
@@ -68,7 +68,7 @@ The chat agent won't be able to access the web sites if the browserless containe
- MAX_CONCURRENT_SESSIONS=10
```
You can then add the proyy lines to your `.env` file.
You can then add the proxy lines to your `.env` file.
```
https_proxy=http://PROXY-IP:PROXY-PORT
@@ -115,4 +115,4 @@ If you encounter any issues or have questions about configuring the browse funct
Enjoy the enhanced browsing experience within `big-AGI` and explore the web without ever leaving your chat!
Last updated on Feb 27, 2024 ([edit on GitHub](https://github.com/enricoros/big-AGI/edit/main/docs/config-feature-browse.md))
Last updated on Feb 27, 2024 ([edit on GitHub](https://github.com/enricoros/big-AGI/edit/main/docs/config-feature-browse.md))
+3
View File
@@ -37,6 +37,9 @@ Check the URL and modify if different.
2. Enter the API URL: `http://localhost:1234` (modify if different)
3. Refresh by clicking on the `Models` button to load models from LM Studio
In addition to using the UI, configuration can also be done using
[environment variables](environment-variables.md).
## Troubleshooting
- **Missing @mui/material**: Execute `npm install @mui/material` or `yarn add @mui/material`
+4 -1
View File
@@ -36,6 +36,9 @@ Follow the guide at: https://localai.io/basics/getting_started/
- Load the models (click on `Models 🔄`)
- Select the model and chat
In addition to using the UI, configuration can also be done using
[environment variables](environment-variables.md).
### Integration: Models Gallery
If the running LocalAI instance is configured with a [Model Gallery](https://localai.io/models/):
@@ -51,7 +54,7 @@ If the running LocalAI instance is configured with a [Model Gallery](https://loc
At the time of writing, LocalAI does not publish the model `context window size`.
Every model is assumed to be capable of chatting, and with a context window of 4096 tokens.
Please update the [src/modules/llms/transports/server/openai/models.data.ts](../src/modules/llms/server/openai/models.data.ts)
Please update the [src/modules/llms/transports/server/openai/models/models.data.ts](../src/modules/llms/server/openai/models/models.data.ts)
file with the mapping information between LocalAI model IDs and names/descriptions/tokens, etc.
# 🤝 Support
+17 -9
View File
@@ -13,7 +13,7 @@ _Last updated Dec 16, 2023_
1. **Ensure Ollama API Server is Running**: Follow the official instructions to get Ollama up and running on your machine
- For detailed instructions on setting up the Ollama API server, please refer to the
[Ollama download page](https://ollama.ai/download) and [instructions for linux](https://github.com/jmorganca/ollama/blob/main/docs/linux.md).
[Ollama download page](https://ollama.ai/download) and [instructions for linux](https://github.com/jmorganca/ollama/blob/main/docs/linux.md).
2. **Add Ollama as a Model Source**: In `big-AGI`, navigate to the **Models** section, select **Add a model source**, and choose **Ollama**
3. **Enter Ollama Host URL**: Provide the Ollama Host URL where the API server is accessible (e.g., `http://localhost:11434`)
4. **Refresh Model List**: Once connected, refresh the list of available models to include the Ollama models
@@ -22,6 +22,9 @@ _Last updated Dec 16, 2023_
you'll have to press the 'Pull' button again, until a green message appears.
5. **Chat with Ollama models**: select an Ollama model and begin chatting with AI personas
In addition to using the UI, configuration can also be done using
[environment variables](environment-variables.md).
**Visual Configuration Guide**:
* After adding the `Ollama` model vendor, entering the IP address of an Ollama server, and refreshing models:<br/>
@@ -37,7 +40,7 @@ _Last updated Dec 16, 2023_
### ⚠️ Network Troubleshooting
If you get errors about the server having trouble connecting with Ollama, please see
If you get errors about the server having trouble connecting with Ollama, please see
[this message](https://github.com/enricoros/big-AGI/issues/276#issuecomment-1858591483) on Issue #276.
And in brief, make sure the Ollama endpoint is accessible from the servers where you run big-AGI (which could
@@ -69,15 +72,20 @@ Then, edit the nginx configuration file `/etc/nginx/sites-enabled/default` and a
```nginx
location /ollama/ {
proxy_pass http://localhost:11434;
proxy_pass http://127.0.0.1:11434/;
# Disable buffering for the streaming responses (SSE)
proxy_set_header Connection '';
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
# Disable buffering for the streaming responses
chunked_transfer_encoding off;
proxy_buffering off;
proxy_cache off;
# Longer timeouts (1hr)
keepalive_timeout 3600;
proxy_read_timeout 3600;
proxy_connect_timeout 3600;
proxy_send_timeout 3600;
}
```
-61
View File
@@ -1,61 +0,0 @@
# Local LLM Integration with `text-web-ui` :llama:
Integrate local Large Language Models (LLMs) with
[oobabooga/text-generation-webui](https://github.com/oobabooga/text-generation-webui),
a specialized interface that includes a custom variant of the OpenAI API for a smooth integration process.
_Last updated on Dec 7, 2023_
### Components
The implementation of local LLMs involves the following components:
* **text-generation-webui**: A Python application with a Gradio web UI for operating Large Language Models.
* **Local Large Language Models "LLMs"**: Use large language models on your personal computer with consumer-grade GPUs or CPUs.
* **big-AGI**: An LLM UI that offers features such as Personas, OCR, Voice Support, Code Execution, AGI functions, and more.
## Instructions
This guide assumes that **big-AGI** is already installed on your system. Note that the text-generation-webui IP address must be accessible from the server running **big-AGI**.
### Text-web-ui Installation & Configuration:
1. Install [text-generation-webui](https://github.com/oobabooga/text-generation-webui#Installation):
- Follow the instructions in the official page (basicall clone the repo and run a script) [~10 minutes]
- Stop the Web UI as we need to modify the startup flags to enable the OpenAI API
2. Enable the **openai extension**
- Edit `CMD_FLAGS.txt`
- Make sure that `--listen --api` is present and uncommented
3. Restart text-generation-webui
- Double-click on "start"
- You should see something like:
```
2023-12-07 21:51:21 INFO:Loading the extension "openai"...
2023-12-07 21:51:21 INFO:OpenAI-compatible API URL:
http://0.0.0.0:5000
...
INFO: Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit)
Running on local URL: http://0.0.0.0:7860
```
- This shows that:
- The Web UI is running on port 7860: http://127.0.0.1:7860
- **The OpenAI API is running on port 5000: http://127.0.0.1:5000**
4. Load your first model
- Open the text-generation-webui at [127.0.0.1:7860](http://127.0.0.1:7860/)
- Switch to the **Model** tab
- Download, for instance, `TheBloke/Llama-2-7B-Chat-GPTQ`
- Select the model once it's loaded
### Integrating text-web-ui with big-AGI:
1. Integrating Text-Generation-WebUI with big-AGI:
- Go to Models > Add a model source of type: **Oobabooga**
- Enter the address: `http://127.0.0.1:5000`
- If running remotely, replace 127.0.0.1 with the IP of the machine. Make sure to use the **IP:Port** format
- Load the models
- The active model must be selected and LOADED on the text-generation-webui as it doesn't support model switching or parallel requests.
- Select model & Chat
![config-oobabooga-0.png](pixels/config-oobabooga-0.png)
Enjoy the privacy and flexibility of local LLMs with `big-AGI` and `text-generation-webui`!
+3
View File
@@ -22,6 +22,9 @@ This document details the process of integrating OpenRouter with big-AGI.
![feature-openrouter-configure.png](pixels/feature-openrouter-configure.png)
4. OpenAI GPT4-32k and other models will now be accessible and selectable in the application.
In addition to using the UI, configuration can also be done using
[environment variables](environment-variables.md).
### Pricing
OpenRouter independently manages its service and pricing and is not affiliated with big-AGI.
+30 -6
View File
@@ -22,6 +22,25 @@ Understand the Architecture: big-AGI uses Next.js, React for the front end, and
This necessitates a code change (file renaming) before build initiation, detailed in [deploy-authentication.md](deploy-authentication.md).
### Increase Vercel Functions Timeout
For long-running operations, Vercel allows paid deployments to increase the timeout on Functions.
Note that this applies to old-style Vercel Functions (based on Node.js) and not the new Edge Functions.
At time of writing, big-AGI has only 2 operations that run on Node.js Functions:
browsing (fetching web pages) and sharing. They both can exceed 10 seconds, especially
when fetching large pages or waiting for websites to be completed.
We provide `vercel_PRODUCTION.json` to raise the duration to 25 seconds (from a default of 10), to use it,
make sure to rename it to `vercel.json` before build.
From the Vercel Project > Settings > General > Build & Development Settings,
you can for instance set the build command to:
```bash
mv vercel_PRODUCTION.json vercel.json; next build
```
### Change the Personas
Edit the `src/data.ts` file to customize personas. This file houses the default personas. You can add, remove, or modify these to meet your project's needs.
@@ -42,21 +61,26 @@ Test your application thoroughly using local development (refer to README.md for
- [deploy-cloudflare.md](deploy-cloudflare.md): for Cloudflare Workers deployment
- [deploy-docker.md](deploy-docker.md): for Docker deployment instructions and examples
- [deploy-k8s.md](deploy-k8s.md): for Kubernetes deployment instructions and examples
<br/>
## Debugging
We introduced the `/info/debug` page that provides a detailed overview of the application's environment, including the API keys, environment variables, and other configuration settings.
<br/>
## Community Projects - Share Your Project
After deployment, share your project with the community. We will link to your project to help others discover and learn from your work.
| Project | Features | GitHub |
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|
| 🚀 CoolAGI: Where AI meets Imagination<br/>![CoolAGI Logo](https://github.com/nextgen-user/freegpt4plus/assets/150797204/9b0e1232-4791-4d61-b949-16f9eb284c22) | Code Interpreter, Vision, Mind maps, Web Searches, Advanced Data Analytics, Large Data Handling and more! | [nextgen-user/CoolAGI](https://github.com/nextgen-user/CoolAGI) |
| HL-GPT | Fully remodeled UI | [harlanlewis/nextjs-chatgpt-app](https://github.com/harlanlewis/nextjs-chatgpt-app) |
| Project | Features | GitHub |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|
| 🚀 CoolAGI: Where AI meets Imagination<br/>![CoolAGI Logo](https://github.com/nextgen-user/freegpt4plus/assets/150797204/9b0e1232-4791-4d61-b949-16f9eb284c22) | Code Interpreter, Vision, Mind maps, Web Searches, Advanced Data Analytics, Large Data Handling and more! | [nextgen-user/CoolAGI](https://github.com/nextgen-user/CoolAGI) |
| HL-GPT | Fully remodeled UI | [harlanlewis/nextjs-chatgpt-app](https://github.com/harlanlewis/nextjs-chatgpt-app) |
For public projects, update your README.md with your modifications and submit a pull request to add your project to our list, aiding in its discovery.
<br/>
<br/>
## Best Practices
+1 -1
View File
@@ -53,7 +53,7 @@ As of Feb 27, 2024, this feature is in development.
## Configurations
| Scope | Default | Description / Instructions |
| Scope | Default | Description / Instructions |
|-----------------------------------------------------------------------------------------|------------------|-------------------------------------------------------------------------------------------------------------------------|
| Your source builds of big-AGI | None | **Vercel**: enable Vercel Analytics from the dashboard. · **Google Analytics**: set environment variable at build time. |
| Your docker builds of big-AGI | None | **Vercel**: n/a. · **Google Analytics**: set environment variable at `docker build` time. |
+1 -1
View File
@@ -19,7 +19,7 @@ To enable it in `big-AGI`, you **must manually build the application**:
- Build `big-AGI` with HTTP authentication enabled:
- Clone the repository
- Rename `middleware_BASIC_AUTH.ts` to `middleware.ts`
- Build: usual simple build procedure (e.g. [Deploy manually](../README.md#-deploy-manually) or [Deploying with Docker](deploy-docker.md))
- Build: usual simple build procedure (e.g. [Deploy manually](installation.md#Local-Production-build) or [Deploying with Docker](deploy-docker.md))
- Configure the following [environment variables](environment-variables.md) before launching `big-AGI`:
```dotenv
+1 -1
View File
@@ -34,7 +34,7 @@ Fork the repository to your personal GitHub account.
2. On this page, set your **Project name**, **Production branch** (e.g., main), and your Build settings
3. Choose `Next.js` from the **Framework preset** dropdown menu
4. Set a custom **Build Command**:
- `rm app/api/trpc-node/[trpc]/route.ts && npx @cloudflare/next-on-pages@1`
- `rm app/api/cloud/[trpc]/route.ts && npx @cloudflare/next-on-pages@1`
- see the tradeoffs for this deletion on the notice at the top
5. Keep the **Build output directory** as default
6. Click the **Save and Deploy** button
+12 -1
View File
@@ -9,7 +9,7 @@ Docker ensures faster development cycles, easier collaboration, and seamless env
```bash
git clone https://github.com/enricoros/big-agi.git
cd big-agi
```
```
2. **Build the Docker Image**: Build a local docker image from the provided Dockerfile:
```bash
docker build -t big-agi .
@@ -59,6 +59,17 @@ To make local services running on your host machine accessible to a Docker conta
<br/>
### Reverse Proxy Configuration
A reverse proxy is a server that sits in front of big-AGI's container and can forwards web
requests to it. Often used to run multiple web applications, expose them to the internet,
increase security.
If you're deploying big-AGI behind a reverse proxy, you may want to see
our [Reverse Proxy Deployment Guide](deploy-reverse-proxy.md) for more information.
<br/>
### More Information
The [`Dockerfile`](../Dockerfile) describes how to create a Docker image. It establishes a Node.js environment,
+85
View File
@@ -0,0 +1,85 @@
# Deploy `big-AGI` with Kubernetes ☸️
In this tutorial, we will guide you through the process of deploying big-AGI
in a Kubernetes environment using the kubectl command-line tool.
## First Deployment
### Step 1: Clone the big-AGI repository
```bash
$ git clone https://github.com/enricoros/big-agi
$ cd ./big-agi/docs/k8s
```
### Step 2: Create the namespace
```bash
$ kubectl create namespace ns-big-agi
```
### Step 3: Fill in the key information into env-secret.yaml
All variables are optional. By default, Kubernetes Secret uses Base64 for
encode/decode, so please don't do a git commit after filling in the keys
to avoid leaking sensitive information.
We provide an empty `env-secret.yaml` file as a template.
You can fill in the necessary information using a text editor.
```bash
$ nano env-secret.yaml
```
### Step 4: Deploying Kubernetes Resources
```bash
$ kubectl apply -f big-agi-deployment.yaml -f env-secret.yaml
```
### Step 5: Verifying the Resource Statuses
```bash
$ kubectl -n ns-big-agi get svc,pod,deployment
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/svc-big-agi ClusterIP 10.0.198.118 <none> 3000/TCP 63m
NAME READY STATUS RESTARTS AGE
pod/deployment-big-agi-xxxxxxxx-yyyyy 1/1 Running 0 39m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/deployment-big-agi 1/1 1 1 63m
```
### Step 6: Testing the Service
You can test the service by port-forwarding the service to your local machine:
```bash
$ kubectl -n ns-big-agi port-forward service/svc-big-agi 3000
Forwarding from 127.0.0.1:3000 -> 3000
Forwarding from [::1]:3000 -> 3000
```
Now you can access the service at `http://localhost:3000`, and you should see the big-AGI homepage.
## Updating big-AGI
To update big-AGI to the latest version:
1. Pull the latest changes from the repository:
```bash
$ git pull origin main
```
2. Apply the updated deployment:
```bash
$ kubectl apply -f big-agi-deployment.yaml
```
This will trigger a rolling update of the deployment with the latest image.
**Note**: If you're deploying big-AGI behind a reverse proxy, you may need to configure
your proxy to support streaming. See our [Reverse Proxy Deployment Guide](deploy-reverse-proxy.md) for more information.
Note: For production use, consider setting up an Ingress Controller or Load Balancer instead of using port-forward.
+58
View File
@@ -0,0 +1,58 @@
# Advanced: Deploying big-AGI behind a Reverse Proxy
Note: if you don't have a reverse proxy set up, you can skip this guide.
If you're deploying big-AGI behind a reverse proxy, you may want to configure your proxy to support streaming output.
This guide provides instructions on how to configure your reverse proxy to support streaming output from big-AGI.
This is for advanced deployments, and you should have a basic understanding of how reverse proxies work.
## Nginx Configuration
If you're using Nginx as your reverse proxy, add the following configuration to your server block:
```nginx
server {
listen 80;
server_name your-domain.com;
location / {
# ...your specific proxy_pass configuration, example below...
proxy_pass http://localhost:3000; # Assuming big-AGI is running on port 3000
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
# ...
# Important: Disable buffering for the streaming responses (SSE)
chunked_transfer_encoding on; # Turn on chunked transfer encoding
proxy_buffering off; # Turn off proxy buffering
proxy_cache off; # Turn off caching
tcp_nodelay on; # Turn on TCP NODELAY option, disable delay ACK algorithm
tcp_nopush on; # Turn on TCP NOPUSH option, disable Nagle algorithm
# Important: Longer timeouts (5 min)
keepalive_timeout 300;
proxy_connect_timeout 300;
proxy_read_timeout 300;
proxy_send_timeout 300;
}
}
```
This configuration disables caching and buffering, enables chunked transfer encoding, and adjusts TCP settings to optimize for streaming content.
## Troubleshooting
If you're experiencing issues with streaming not working, especially when deploying behind a reverse proxy,
ensure that your proxy is configured to support streaming output as described above.
## Additional Resources
- For Docker deployments, see our [Docker Deployment Guide](deploy-docker.md)
- For Kubernetes deployments, see our [Kubernetes Deployment Guide](deploy-k8s.md)
- For general installation instructions, see our [Installation Guide](installation.md)
If you continue to experience issues, please reach out to our [community support channels](../README.md#-get-involved).
+37 -32
View File
@@ -27,38 +27,41 @@ AZURE_OPENAI_API_ENDPOINT=
AZURE_OPENAI_API_KEY=
ANTHROPIC_API_KEY=
ANTHROPIC_API_HOST=
DEEPSEEK_API_KEY=
GEMINI_API_KEY=
GROQ_API_KEY=
LOCALAI_API_HOST=
LOCALAI_API_KEY=
MISTRAL_API_KEY=
OLLAMA_API_HOST=
OPENPIPE_API_KEY=
OPENROUTER_API_KEY=
PERPLEXITY_API_KEY=
TOGETHERAI_API_KEY=
XAI_API_KEY=
# Model Observability: Helicone
HELICONE_API_KEY=
# Text-To-Speech
ELEVENLABS_API_KEY=
ELEVENLABS_API_HOST=
ELEVENLABS_VOICE_ID=
# Text-To-Image
PRODIA_API_KEY=
# Google Custom Search
GOOGLE_CLOUD_API_KEY=
GOOGLE_CSE_ID=
# Browse
PUPPETEER_WSS_ENDPOINT=
# Backend Analytics
BACKEND_ANALYTICS=
# Search
GOOGLE_CLOUD_API_KEY=
GOOGLE_CSE_ID=
# Text-To-Speech: ElevenLabs
ELEVENLABS_API_KEY=
ELEVENLABS_API_HOST=
ELEVENLABS_VOICE_ID=
# Text-To-Image: Prodia
PRODIA_API_KEY=
# Backend HTTP Basic Authentication (see `deploy-authentication.md` for turning on authentication)
HTTP_BASIC_AUTH_USERNAME=
HTTP_BASIC_AUTH_PASSWORD=
# Frontend variables
NEXT_PUBLIC_GA4_MEASUREMENT_ID=
NEXT_PUBLIC_PLANTUML_SERVER_URL=
@@ -80,24 +83,27 @@ For Database configuration see [deploy-database.md](deploy-database.md).
The following variables when set will enable the corresponding LLMs on the server-side, without
requiring the user to enter an API key
| Variable | Description | Required |
|-----------------------------|-------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------|
| `OPENAI_API_KEY` | API key for OpenAI | Recommended |
| `OPENAI_API_HOST` | Changes the backend host for the OpenAI vendor, to enable platforms such as Helicone and CloudFlare AI Gateway | Optional |
| `OPENAI_API_ORG_ID` | Sets the "OpenAI-Organization" header field to support organization users | Optional |
| `AZURE_OPENAI_API_ENDPOINT` | Azure OpenAI endpoint - host only, without the path | Optional, but if set `AZURE_OPENAI_API_KEY` must also be set |
| `AZURE_OPENAI_API_KEY` | Azure OpenAI API key, see [config-azure-openai.md](config-azure-openai.md) | Optional, but if set `AZURE_OPENAI_API_ENDPOINT` must also be set |
| `ANTHROPIC_API_KEY` | The API key for Anthropic | Optional |
| `ANTHROPIC_API_HOST` | Changes the backend host for the Anthropic vendor, to enable platforms such as [config-aws-bedrock.md](config-aws-bedrock.md) | Optional |
| `GEMINI_API_KEY` | The API key for Google AI's Gemini | Optional |
| `GROQ_API_KEY` | The API key for Groq Cloud | Optional |
| `LOCALAI_API_HOST` | Sets the URL of the LocalAI server, or defaults to http://127.0.0.1:8080 | Optional |
| `LOCALAI_API_KEY` | The (Optional) API key for LocalAI | Optional |
| `MISTRAL_API_KEY` | The API key for Mistral | Optional |
| `OLLAMA_API_HOST` | Changes the backend host for the Ollama vendor. See [config-local-ollama.md](config-local-ollama) | |
| `OPENROUTER_API_KEY` | The API key for OpenRouter | Optional |
| `PERPLEXITY_API_KEY` | The API key for Perplexity | Optional |
| `TOGETHERAI_API_KEY` | The API key for Together AI | Optional |
| Variable | Description | Required |
|-----------------------------|----------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------|
| `OPENAI_API_KEY` | API key for OpenAI | Recommended |
| `OPENAI_API_HOST` | Changes the backend host for the OpenAI vendor, to enable platforms such as Helicone and CloudFlare AI Gateway | Optional |
| `OPENAI_API_ORG_ID` | Sets the "OpenAI-Organization" header field to support organization users | Optional |
| `AZURE_OPENAI_API_ENDPOINT` | Azure OpenAI endpoint - host only, without the path | Optional, but if set `AZURE_OPENAI_API_KEY` must also be set |
| `AZURE_OPENAI_API_KEY` | Azure OpenAI API key, see [config-azure-openai.md](config-azure-openai.md) | Optional, but if set `AZURE_OPENAI_API_ENDPOINT` must also be set |
| `ANTHROPIC_API_KEY` | The API key for Anthropic | Optional |
| `ANTHROPIC_API_HOST` | Changes the backend host for the Anthropic vendor, to enable platforms such as AWS Bedrock | Optional |
| `DEEPSEEK_API_KEY` | The API key for Deepseek AI | Optional |
| `GEMINI_API_KEY` | The API key for Google AI's Gemini | Optional |
| `GROQ_API_KEY` | The API key for Groq Cloud | Optional |
| `LOCALAI_API_HOST` | Sets the URL of the LocalAI server, or defaults to http://127.0.0.1:8080 | Optional |
| `LOCALAI_API_KEY` | The (Optional) API key for LocalAI | Optional |
| `MISTRAL_API_KEY` | The API key for Mistral | Optional |
| `OLLAMA_API_HOST` | Changes the backend host for the Ollama vendor. See [config-local-ollama.md](config-local-ollama.md) | |
| `OPENPIPE_API_KEY` | The API key for OpenPipe | Optional |
| `OPENROUTER_API_KEY` | The API key for OpenRouter | Optional |
| `PERPLEXITY_API_KEY` | The API key for Perplexity | Optional |
| `TOGETHERAI_API_KEY` | The API key for Together AI | Optional |
| `XAI_API_KEY` | The API key for xAI | Optional |
### LLM Observability: Helicone
@@ -128,8 +134,7 @@ Enable the app to Talk, Draw, and Google things up.
| `GOOGLE_CSE_ID` | Google Custom/Programmable Search Engine ID - [Link to PSE](https://programmablesearchengine.google.com/) |
| **Browse** | |
| `PUPPETEER_WSS_ENDPOINT` | Puppeteer WebSocket endpoint - used for browsing (pade downloadeing), etc. |
| **Backend** | |
| `BACKEND_ANALYTICS` | Semicolon-separated list of analytics flags (see backend.analytics.ts). Flags: `domain` logs the responding domain. |
| **Backend** | |
| `HTTP_BASIC_AUTH_USERNAME` | See the [Authentication](deploy-authentication.md) guide. Username for HTTP Basic Authentication. |
| `HTTP_BASIC_AUTH_PASSWORD` | Password for HTTP Basic Authentication. |
@@ -147,5 +152,5 @@ The value of these variables are passed to the frontend (Web UI) - make sure the
---
For a higher level overview of backend code and environemnt customization,
For a higher level overview of backend code and environment customization,
see the [big-AGI Customization](customizations.md) guide.
+42
View File
@@ -0,0 +1,42 @@
# Big-AGI Advanced Tips & Tricks
> 🚨 This file is not meant for publication, and it's just been created as a handbook with tips
> and tricks to make Big-AGI more efficient and productive. 🚨
Welcome to the advanced tips and tricks guide for Big-AGI. This document will help you make the most of the platform's existing features.
---
## Hidden Gems
- **Shift + Double-Click** on a chat message to **edit** it.
- **Shift + Trash Icon** to **delete** a chats and messages without confirmation.
- also applies elsewhere: delete Attachments, etc.
- **Shift + Click** on **New Chat** to create an incognito chat.
- Drag a big-AGI saved chat into Big-AGI to load (or attach) it.
## Not-so-obvious Shortcuts
- When sending a message:
- Enter is for newlines
- **Shift + Enter** to send the message.
- **Ctrl + Enter** to **Beam** the message.
- **Alt/Option + Enter** to send the message without an answer.
- When editing a message:
- **Ctrl + Enter** to **Save** the changes.
- **Shift + Ctrl + Enter** to **Save & Regenerate**.
- Scroll between messages:
- **Ctrl + Up/Down** to scroll between **messages** and/or **Beams**.
## Worth the Effort:
- [LiveFile](help-feature-livefile.md) works on **Chrome**: Pair and synchronize your documents and code blocks with files on your local system: refresh, save, update them.
## Best User Hacks:
-
---
Note: this document is just at the beginning. It's here so we can capture
the best tips over time.
+167
View File
@@ -0,0 +1,167 @@
# LiveFile: Synchronize Your Documents with Local Files
## Introduction
**LiveFile** is a powerful feature in big-AGI that allows you to **pair and synchronize
your documents and code blocks** with files on your local system.
This feature enables a **two-way connection between big-AGI and your local files on disk**,
saving you time and effort.
With LiveFile, you can:
- **Pair** documents and code blocks with local files.
- **Monitor** changes in local files and update content in big-AGI.
- **Refresh** chat attachments with the latest content.
- **Save** edits made in big-AGI back to your local files.
- **Store** AI-generated code and content.
---
## Requirements
- **Supported Browsers:**
- **Google Chrome** (desktop)
- **Microsoft Edge** (desktop)
- **Operating Systems:**
- **Desktop platforms only**
- **Note:** Mobile devices (iOS and Android) are **not supported** due to browser limitations.
- **File Types:**
- Designed for **text-based files** (e.g., `.txt`, `.md`, `.js`, `.py`).
- **Performance:**
- Can handle **dozens of files efficiently**.
- **Limitations:**
- **File Size Limit**:
- Supports text files up to **10 MB**.
- **Pairing Persistence:**
- LiveFile connections **do not persist across sessions**.
- After reloading the page, you will need to re-pair your files.
- **Saving Overwrites:**
- Saving changes in big-AGI will **overwrite the entire file**.
- Use external tools for version control or incremental backups.
---
## Enabling LiveFile
LiveFile can be enabled automatically or manually in your Big-AGI workflow.
### Automatic Pairing
When you:
- **Attach**, **drop**, or **paste** a file into a chat message,
LiveFile is **automatically enabled** for that attachment. This means you can start
monitoring and reloading changes without any additional setup.
### Manual Pairing
For existing attachments or code blocks that:
- **Do not have LiveFile enabled** (e.g., created on other devices),
- **Are AI-generated code snippets without an associated file**,
You can manually pair them with a local file.
#### Pairing Attachments
1. **Select the Attachment:**
- Click on the attachment in the chat to view it in the previewer.
2. **Initiate Pairing:**
- Click on **"Pair File"** (🔗).
- If you have open LiveFiles, they will be listed for easy selection.
- Alternatively, you can select a new file from your local system.
3. **Grant Permissions**
- When prompted, allow big-AGI to access the file.
#### Pairing Code Blocks
1. **Access Code Block Options:**
- Click on the code block to reveal the header with options.
2. **Initiate Pairing:**
- Click the **"Pair File"** button (🔗).
- Select from your open LiveFiles or choose a new file.
3. **Confirm Pairing:**
- Grant permission when prompted.
---
## Using LiveFile
### Monitoring Changes
- **Automatic Monitoring:**
- LiveFile watches for changes in your paired local files.
- If the file is modified outside of big-AGI, you'll be shown the changes in the LiveFile bar.
- There is also a **"Replace with File"** option to manually load the latest content and see the changes.
- **Refreshing Content:**
- Click **"Replace with File"** (🔄) to load the latest content from the paired file into big-AGI.
### Saving Edits Back to Paired Files
- **Editing Attachments or Code Blocks:**
- Modify the content directly within big-AGI.
- Attachments: Click on the attachment to open the previewer and click on "Edit" to make changes.
- Code Blocks: Select "Edit" on the chat message to update code blocks.
- **Saving Changes:**
- Click **"Save to File"** (💾) to overwrite the local file with your changes.
- **Note:** This action overwrites the entire file. Ensure this is what you want before proceeding.
---
## Best Practices
- **Monitor External Changes:**
- Refresh content in big-AGI if the local file has been modified outside the application.
- **Use a Version Control System:**
- For critical files, consider using Git or other version control systems to track and monitor changes, authorship, and history.
---
## Troubleshooting
- **LiveFile Options Not Visible:**
- Ensure you are using a **supported desktop browser**.
- Check that you have the latest version of big-AGI.
- **Permission Issues:**
- Confirm that you granted big-AGI permission to access your files.
- Check your browser's settings to ensure file access is allowed.
---
## Technical Details
LiveFile uses the [File System Access API](https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API) to
interact with your local files securely. It leverages the [browser-fs-access](https://github.com/GoogleChromeLabs/browser-fs-access) library,
an open-source project by Google Chrome Labs, which provides an easy interface to the File System Access API with fallbacks for broader browser support.
- **Security:**
- Access to files requires explicit user permission.
- **Performance:**
- Designed to handle dozens of files efficiently (tested on hundreds).
- Works with the Big-AGI attachment system to recursively add directories.
- **Browser Support:**
- Fully supported on **Google Chrome** and **Microsoft Edge** desktop versions.
---
## Another Big-AGI First!
You can significantly boost your productivity and streamline your workflow within big-AGI
by understanding how to utilize LiveFile's features fully.
This Feature is in Beta as there are a few limitations and improvements to be made.
Join us in enjoying and enhancing this feature on [big-AGI.com](https://big-agi.com), or
[GitHub](https://github.com/enricoros/big-AGI) for support and [Discord](https://discord.gg/MkH4qj2Jp9)
to share the love.
+141
View File
@@ -0,0 +1,141 @@
# Enabling Microphone Access for Speech Recognition
This guide explains how to enable microphone access for speech recognition in various browsers and mobile devices.
Ensuring microphone access is essential for using voice features in applications like big-AGI.
## Desktop Browsers
### Google Chrome (All Platforms, recommended)
1. Open the website (e.g., big-AGI) in Chrome.
2. Click the **lock icon** in the address bar.
3. In the dropdown, find **"Microphone"**.
- Set it to **"Allow"**.
4. If "Microphone" isn't listed:
- Click on **"Site settings"**.
- Find **"Microphone"** in the permissions list.
- Change the setting to **"Allow"**.
5. **Refresh** the page.
### Safari (macOS)
**[Watch the video tutorial: How to enable Speech Recognition in Safari](https://vimeo.com/1010342201)**
If you're seeing a "Speech Recognition permission denied" error, follow these steps:
1. Open **System Settings**.
- Go to **Privacy & Security** > **Speech Recognition**.
- Enable Safari in the list of allowed applications.
- Quit & Open Safari.
2. Click **Safari** in the top menu bar.
- Select **Settings**.
- Go to the **Websites** tab.
- Select **Microphone** from the sidebar.
- Find big-AGI (or localhost for developers) in the list and set it to **Allow**.
- Close the Settings window.
3. **Refresh** the page.
This quick and simple fix should get essential voice input working in big-AGI on your Mac.
### Microsoft Edge (Windows)
1. Open the website in Edge.
2. Click the **lock icon** in the address bar.
3. Click **"Permissions for this site"**.
4. Find **"Microphone"**.
- Set it to **"Allow"**.
5. **Refresh** the page.
### Firefox (All Platforms)
> **Note:** The Speech Recognition API is **not supported** in Firefox. If you're using Firefox, please switch to a supported browser to use speech recognition
> features.
## Mobile Devices
### Android (Chrome)
1. Open the website in Chrome.
2. Tap the **lock icon** in the address bar.
3. Tap **"Permissions"**.
4. Find **"Microphone"**.
- Set it to **"Allow"**.
5. **Refresh** the page.
### iOS (Safari)
1. Open the **Settings** app on your device.
2. Scroll down and tap **"Safari"**.
3. Tap **"Microphone"**.
4. Ensure **"Ask"** or **"Allow"** is selected.
5. Return to Safari and open the website.
6. If prompted, allow microphone access.
7. **Refresh** the page.
### iOS (Chrome)
> **Note:** Chrome on iOS uses Safari's engine due to system limitations. Microphone permissions are managed through iOS settings.
1. Open the **Settings** app.
2. Scroll down and tap **"Chrome"**.
3. Ensure **"Microphone"** is toggled **on**.
4. Open Chrome and navigate to the website.
5. If prompted, allow microphone access.
6. **Refresh** the page.
## Troubleshooting
If you're still experiencing issues after enabling microphone access:
**Check System Permissions (macOS):**
- Open **System Settings**.
- Go to **"Privacy & Security"**.
- Select the **"Privacy"** tab.
- Click **"Microphone"** in the sidebar.
- Ensure your browser (e.g., Chrome, Safari) is checked.
- You may need to unlock the settings by clicking the lock icon at the bottom.
**Check Microphone Access (Windows):**
- Open **Settings**.
- Go to **"Privacy"** > **"Microphone"**.
- Ensure **"Allow apps to access your microphone"** is **on**.
- Scroll down and make sure your browser is allowed.
**Close Other Applications:**
- Close any applications that might be using the microphone.
**Restart the Browser:**
- Close all browser windows and reopen.
**Update Your Browser:**
- Ensure you're using the latest version.
**Check for Browser Extensions:**
- Disable extensions that might block access to the microphone.
For persistent issues, consult your browser's official support resources or contact big-AGI support.
## Technical Details
Big-AGI uses the [Web Speech API (SpeechRecognition)](https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognition)
to transcribe spoken words into text. This API provides real-time transcription with live previews and works on most
modern mobile and desktop browsers.
**Note on Browser Support:**
| Browser | Support Level | Notes |
|----------------|-----------------|------------------------------------------------------------------------|
| Google Chrome | ✅ Recommended | Fully supported on desktop and Android. Preferred for best experience. |
| Safari | ✅ Supported | Requires macOS/iOS 14 or later. |
| Microsoft Edge | ✅ Supported | Fully supported on desktop. |
| Firefox | ❌ Not Supported | SpeechRecognition API not available. |
**Recommendation:**
For the best experience with speech recognition features, we strongly recommend using Google Chrome.
Ensure your browser is up to date to benefit from the latest features and security updates.
+156
View File
@@ -0,0 +1,156 @@
# Installation Guide
Welcome to the big-AGI Installation Guide - Whether you're a developer
eager to explore, a system integrator, or an enterprise looking for a
white-label solution, this comprehensive guide ensures a smooth setup
process for your own instance of big-AGI and related products.
**Try big-AGI** - You don't need to install anything if you want to play with big-AGI
and have your API keys to various model services. You can access our free instance on [big-AGI.com](https://big-agi.com).
The free instance runs the latest `main-stable` branch from this repository.
## 🧩 Build-your-own
If you want to change the code, have a deeper configuration,
add your own models, or run your own instance, follow the steps below.
### Local Development
**Prerequisites:**
- Node.js and npm installed on your machine.
**Steps:**
1. Clone the big-AGI repository:
```bash
git clone https://github.com/enricoros/big-AGI.git
cd big-AGI
```
2. Install dependencies:
```bash
npm install
```
3. Run the development server:
```bash
npm run dev
```
Your big-AGI instance is now running at `http://localhost:3000`.
### Local Production build
The production build is optimized for performance and follows
the same steps 1 and 2 as for [local development](#local-development).
3. Build the production version:
```bash
# .. repeat the steps above up to `npm install`, then:
npm run build
```
4. Start the production server (`npx` may be optional):
```bash
npx next start --port 3000
```
Your big-AGI production instance is on `http://localhost:3000`.
### Advanced Customization
Want to pre-enable models, customize the interface, or deploy with username/password or alter code to your needs?
Check out the [Customizations Guide](README.md) for detailed instructions.
## ☁️ Cloud Deployment Options
To deploy big-AGI on a public server, you have several options. Choose the one that best fits your needs.
### Deploy on Vercel
Install big-AGI on Vercel with just a few clicks.
Create your GitHub fork, create a Vercel project over that fork, and deploy it. Or press the button below for convenience.
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fenricoros%2Fbig-AGI&env=OPENAI_API_KEY&envDescription=Backend%20API%20keys%2C%20optional%20and%20may%20be%20overridden%20by%20the%20UI.&envLink=https%3A%2F%2Fgithub.com%2Fenricoros%2Fbig-AGI%2Fblob%2Fmain%2Fdocs%2Fenvironment-variables.md&project-name=big-AGI)
### Deploy on Cloudflare
Deploy on Cloudflare's global network by installing big-AGI on
Cloudflare Pages. Check out the [Cloudflare Installation Guide](deploy-cloudflare.md)
for step-by-step instructions.
### Docker Deployments
Containerize your big-AGI installation using Docker for portability and scalability.
Our [Docker Deployment Guide](deploy-docker.md) will walk you through the process,
or follow the steps below for a quick start.
1. (optional) Build the Docker image - if you do not want to use the [pre-built Docker images](https://github.com/enricoros/big-AGI/pkgs/container/big-agi):
```bash
docker build -t big-agi .
```
2. Run the Docker container with either:
```bash
# 2A. if you built the image yourself:
docker run -d -p 3000:3000 big-agi
# 2B. or use the pre-built image:
docker run -d -p 3000:3000 ghcr.io/enricoros/big-agi
# 2C. or use docker-compose:
docker-compose up
```
Access your big-AGI instance at `http://localhost:3000`.
If you deploy big-AGI behind a reverse proxy, you may want to check out the [Reverse Proxy Configuration Guide](deploy-reverse-proxy.md).
### Kubernetes Deployment
Deploy big-AGI on a Kubernetes cluster for enhanced scalability and management. Follow these steps for a Kubernetes deployment:
1. Clone the big-AGI repository:
```bash
git clone https://github.com/enricoros/big-AGI.git
cd big-AGI
```
2. Configure the environment variables:
```bash
cp docs/k8s/env-secret.yaml env-secret.yaml
vim env-secret.yaml # Edit the file to set your environment variables
```
3. Apply the Kubernetes configurations:
```bash
kubectl create namespace ns-big-agi
kubectl apply -f docs/k8s/big-agi-deployment.yaml -f env-secret.yaml
```
4. Verify the deployment:
```bash
kubectl -n ns-big-agi get svc,pod,deployment
```
5. Access the big-AGI application:
```bash
kubectl -n ns-big-agi port-forward service/svc-big-agi 3000:3000
```
Your big-AGI instance is now accessible at `http://localhost:3000`.
For more detailed instructions on Kubernetes deployment, including updating and troubleshooting, refer to our [Kubernetes Deployment Guide](deploy-k8s.md).
### Midori AI Subsystem for Docker Deployment
Follow the instructions found on [Midori AI Subsystem Site](https://io.midori-ai.xyz/subsystem/manager/)
for your host OS. After completing the setup process, install the Big-AGI docker backend to the Midori AI Subsystem.
## Enterprise-Grade Installation
For businesses seeking a fully-managed, scalable solution, consider our managed installations.
Enjoy all the features of big-AGI without the hassle of infrastructure management. [hello@big-agi.com](mailto:hello@big-agi.com) to learn more.
## Support
Join our vibrant community of developers, researchers, and AI enthusiasts. Share your projects, get help, and collaborate with others.
- [Discord Community](https://discord.gg/MkH4qj2Jp9)
- [Twitter](https://twitter.com/yourusername)
For any questions or inquiries, please don't hesitate to [reach out to our team](mailto:hello@big-agi.com).
+52
View File
@@ -0,0 +1,52 @@
---
apiVersion: v1
kind: Namespace
metadata:
name: ns-big-agi
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: big-agi
name: deployment-big-agi
namespace: ns-big-agi
spec:
replicas: 1
selector:
matchLabels:
app: big-agi
strategy: {}
template:
metadata:
labels:
app: big-agi
spec:
containers:
- image: ghcr.io/enricoros/big-agi:latest
name: big-agi
ports:
- containerPort: 3000
args:
- next
- start
- -p
- "3000"
envFrom:
- secretRef:
name: env
---
apiVersion: v1
kind: Service
metadata:
labels:
app: big-agi
name: svc-big-agi
namespace: ns-big-agi
spec:
ports:
- name: "http"
port: 3000
targetPort: 3000
selector:
app: big-agi
+49
View File
@@ -0,0 +1,49 @@
---
apiVersion: v1
kind: Secret
metadata:
name: env
namespace: ns-big-agi
type: Opaque
stringData:
# IMPORTANT: This file contains sensitive information. Do not commit changes to version control.
# All variables are optional. Fill in only the ones you need.
#
# For the latest information on all the environment variables, see /docs/environment-variables.md
#
# LLMs
OPENAI_API_KEY: ""
OPENAI_API_HOST: ""
OPENAI_API_ORG_ID: ""
AZURE_OPENAI_API_ENDPOINT: ""
AZURE_OPENAI_API_KEY: ""
ANTHROPIC_API_KEY: ""
ANTHROPIC_API_HOST: ""
DEEPSEEK_API_KEY: ""
GEMINI_API_KEY: ""
GROQ_API_KEY: ""
LOCALAI_API_HOST: ""
LOCALAI_API_KEY: ""
MISTRAL_API_KEY: ""
OLLAMA_API_HOST: ""
OPENPIPE_API_KEY: ""
OPENROUTER_API_KEY: ""
PERPLEXITY_API_KEY: ""
TOGETHERAI_API_KEY: ""
XAI_API_KEY: ""
# Browse
PUPPETEER_WSS_ENDPOINT: ""
# Search
GOOGLE_CLOUD_API_KEY: ""
GOOGLE_CSE_ID: ""
# Text-To-Speech: Eleven Labs
ELEVENLABS_API_KEY: ""
ELEVENLABS_API_HOST: ""
ELEVENLABS_VOICE_ID: ""
# Text-To-Image: Prodia
PRODIA_API_KEY: ""
+43
View File
@@ -0,0 +1,43 @@
# ReAct: question answering with Reasoning and Actions
## What is ReAct?
[ReAct](https://arxiv.org/abs/2210.03629) (Reason+Act) is a classis AI question-answering feature,
that combines reasoning with actions to provide informed answers.
Within Big-AGI, users can invoke ReAct to ask complex questions that require multiple steps to answer.
| Mode | Activation | Information Sources | Reasoning Visibility | When to Use |
|-------|-----------------------------------|------------------------------------------------------|------------------------------------|--------------------------------------------------|
| Chat | Just type and send | **Pre-trained knowledge only** | Only shows final response | Quick answers, general knowledge queries |
| ReAct | Type "/react" before the question | **Web loads, Web searches, Wikipedia, calculations** | Shows step-by-step thought process | Complex, multi-step, or research-based questions |
Example of ReAct in action, taking a question about current events, googling results, opening a page, and summarizing the information:
https://github.com/user-attachments/assets/c3480428-9ab8-4257-a869-2541bf44a062
The following tools are implemented in Big-AGI:
- **browse**: loads web pages (URLs) and extracts information, using a correctly configured `Tools > Browsing` API
- **search**: searches the web to produce page URLs, using a correctly configured `Tools > Google Search` ([Google Programmable Search Engine](https://programmablesearchengine.google.com/about/)) API
- **wikipedia**: looks up information on Wikipedia pages
- **calculate**: performs mathematical calculations by executing typescript code
- warning: (!) unsafe and dangerous, do not use for untrusted code/LLMs
## How to Use ReAct in Big-AGI
1. **Invoking ReAct**: Type "/react" followed by your question in the chat.
2. **What to Expect**:
- An ephemeral space will show the AI's thought process and actions, showing all the steps taken.
- The final answer will appear in the main chat.
3. **Available Actions**: Web searches, Wikipedia lookups, calculations, and optionally web browsing.
## Good to know:
- **ReAct operates in isolation** from the main chat history.
- It **will take longer than standard responses** due to multiple steps.
- Web searches and browsing may have privacy implications, and require **tool configuration** in the UI.
- Errors or limitations in accessing external resources may affect results.
- ReAct does not use the [Tool or Function Calling](https://platform.openai.com/docs/guides/function-calling) feature of AI models, rather uses the old school approach of parsing and executing actions.
+21 -6
View File
@@ -1,10 +1,18 @@
import { readFile } from 'node:fs/promises';
// Build information
process.env.NEXT_PUBLIC_BUILD_HASH = 'big-agi-2-dev';
process.env.NEXT_PUBLIC_BUILD_PKGVER = JSON.parse('' + await readFile(new URL('./package.json', import.meta.url))).version;
process.env.NEXT_PUBLIC_BUILD_TIMESTAMP = new Date().toISOString();
console.log(` 🧠 \x1b[1mbig-AGI\x1b[0m v${process.env.NEXT_PUBLIC_BUILD_PKGVER} (@${process.env.NEXT_PUBLIC_BUILD_HASH})`);
// Non-default build types
const buildType =
process.env.BIG_AGI_BUILD === 'standalone' ? 'standalone'
: process.env.BIG_AGI_BUILD === 'static' ? 'export'
: undefined;
buildType && console.log(` 🧠 big-AGI: building for ${buildType}...\n`);
buildType && console.log(` 🧠 big-AGI: building for ${buildType}...\n`);
/** @type {import('next').NextConfig} */
let nextConfig = {
@@ -23,11 +31,10 @@ let nextConfig = {
},
// [puppeteer] https://github.com/puppeteer/puppeteer/issues/11052
experimental: {
serverComponentsExternalPackages: ['puppeteer-core'],
},
// NOTE: we may not be needing this anymore, as we use '@cloudflare/puppeteer'
serverExternalPackages: ['puppeteer-core'],
webpack: (config, _options) => {
webpack: (config, { isServer }) => {
// @mui/joy: anything material gets redirected to Joy
config.resolve.alias['@mui/material'] = '@mui/joy';
@@ -37,9 +44,17 @@ let nextConfig = {
layers: true,
};
// fix warnings for async functions in the browser (https://github.com/vercel/next.js/issues/64792)
if (!isServer) {
config.output.environment = { ...config.output.environment, asyncFunction: true };
}
// prevent too many small chunks (40kb min) on 'client' packs (not 'server' or 'edge-server')
if (typeof config.optimization.splitChunks === 'object' && config.optimization.splitChunks.minSize)
// noinspection JSUnresolvedReference
if (typeof config.optimization.splitChunks === 'object' && config.optimization.splitChunks.minSize) {
// noinspection JSUnresolvedReference
config.optimization.splitChunks.minSize = 40 * 1024;
}
return config;
},
+4963 -3144
View File
File diff suppressed because it is too large Load Diff
+72 -48
View File
@@ -1,15 +1,17 @@
{
"name": "big-agi",
"version": "1.13.0",
"version": "1.91.0",
"private": true,
"author": "Enrico Ros <enrico.ros@gmail.com>",
"repository": "https://github.com/enricoros/big-agi",
"scripts": {
"dev": "next dev",
"dev": "next dev --turbopack",
"dev-debug": "cross-env NODE_OPTIONS='--inspect' next dev",
"dev-https": "next dev --experimental-https",
"build": "next build",
"start": "next start",
"lint": "next lint",
"postinstall": "prisma generate",
"postinstall": "prisma generate --no-hints",
"db:push": "prisma db push",
"db:studio": "prisma studio",
"vercel:env:pull": "npx vercel env pull .env.development.local"
@@ -18,70 +20,92 @@
"schema": "src/server/prisma/schema.prisma"
},
"dependencies": {
"@emotion/cache": "^11.11.0",
"@emotion/react": "^11.11.3",
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/modifiers": "^9.0.0",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@emotion/cache": "^11.14.0",
"@emotion/react": "^11.14.0",
"@emotion/server": "^11.11.0",
"@emotion/styled": "^11.11.0",
"@mui/icons-material": "^5.15.11",
"@mui/joy": "^5.0.0-beta.29",
"@next/bundle-analyzer": "^14.1.0",
"@next/third-parties": "^14.1.0",
"@prisma/client": "^5.10.2",
"@sanity/diff-match-patch": "^3.1.1",
"@t3-oss/env-nextjs": "^0.9.2",
"@tanstack/react-query": "~4.36.1",
"@trpc/client": "10.44.1",
"@trpc/next": "10.44.1",
"@trpc/react-query": "10.44.1",
"@trpc/server": "10.44.1",
"@vercel/analytics": "^1.2.2",
"@vercel/speed-insights": "^1.0.10",
"@emotion/styled": "^11.14.0",
"@mui/icons-material": "^5.16.14",
"@mui/joy": "^5.0.0-beta.51",
"@mui/material": "^5.16.14",
"@next/bundle-analyzer": "^15.1.4",
"@next/third-parties": "^15.1.4",
"@prisma/client": "~5.22.0",
"@t3-oss/env-nextjs": "^0.11.1",
"@tanstack/react-query": "^5.63.0",
"@tanstack/react-virtual": "^3.11.2",
"@trpc/client": "11.0.0-rc.688",
"@trpc/next": "11.0.0-rc.688",
"@trpc/react-query": "11.0.0-rc.688",
"@trpc/server": "11.0.0-rc.688",
"@vercel/analytics": "^1.4.1",
"@vercel/speed-insights": "^1.1.0",
"browser-fs-access": "^0.35.0",
"eventsource-parser": "^1.1.2",
"cheerio": "^1.0.0",
"dexie": "^4.0.10",
"dexie-react-hooks": "^1.1.7",
"diff": "^7.0.0",
"eventsource-parser": "^3.0.0",
"idb-keyval": "^6.2.1",
"next": "^14.1.0",
"mammoth": "^1.9.0",
"nanoid": "^5.0.9",
"next": "^15.1.4",
"nprogress": "^0.2.0",
"pdfjs-dist": "4.0.379",
"pdfjs-dist": "4.10.38",
"plantuml-encoder": "^1.4.0",
"prismjs": "^1.29.0",
"react": "^18.2.0",
"react-beautiful-dnd": "^13.1.1",
"react": "^18.3.1",
"react-csv": "^2.2.2",
"react-dom": "^18.2.0",
"react-dom": "^18.3.1",
"react-hook-form": "^7.54.2",
"react-katex": "^3.0.1",
"react-markdown": "^9.0.1",
"react-player": "^2.14.1",
"react-resizable-panels": "^2.0.11",
"react-markdown": "^9.0.3",
"react-player": "^2.16.0",
"react-resizable-panels": "^2.1.7",
"react-timeago": "^7.2.0",
"rehype-katex": "^7.0.1",
"remark-gfm": "^4.0.0",
"sharp": "^0.33.2",
"superjson": "^2.2.1",
"tesseract.js": "^5.0.5",
"tiktoken": "^1.0.13",
"uuid": "^9.0.1",
"zod": "^3.22.4",
"zustand": "^4.5.1"
"remark-mark-highlight": "^0.1.1",
"remark-math": "^6.0.0",
"sharp": "^0.33.5",
"superjson": "^2.2.2",
"tesseract.js": "^6.0.0",
"tiktoken": "^1.0.18",
"turndown": "^7.2.0",
"zod": "^3.24.1",
"zod-to-json-schema": "^3.24.1",
"zustand": "^5.0.3"
},
"devDependencies": {
"@cloudflare/puppeteer": "^0.0.5",
"@types/node": "^20.11.20",
"@types/diff": "^7.0.0",
"@types/node": "^22.10.5",
"@types/nprogress": "^0.2.3",
"@types/plantuml-encoder": "^1.4.2",
"@types/prismjs": "^1.26.3",
"@types/react": "^18.2.59",
"@types/prismjs": "^1.26.5",
"@types/react": "^18.3.18",
"@types/react-beautiful-dnd": "^13.1.8",
"@types/react-csv": "^1.1.10",
"@types/react-dom": "^18.2.19",
"@types/react-dom": "^18.3.5",
"@types/react-katex": "^3.0.4",
"@types/react-timeago": "^4.1.7",
"@types/uuid": "^9.0.8",
"eslint": "^8.57.0",
"eslint-config-next": "^14.1.0",
"prettier": "^3.2.5",
"prisma": "^5.10.2",
"typescript": "^5.3.3"
"@types/turndown": "^5.0.5",
"cross-env": "^7.0.3",
"eslint": "^9.17.0",
"eslint-config-next": "^15.1.4",
"prettier": "^3.4.2",
"prisma": "~5.22.0",
"puppeteer-core": "^23.11.1",
"typescript": "^5.7.3"
},
"engines": {
"node": "^20.0.0 || ^18.0.0"
"node": "^22.0.0 || ^20.0.0"
},
"overrides": {
"@types/react": "^18.3.18",
"@types/react-dom": "^18.3.5",
"uri-js": "npm:uri-js-replace"
}
}
+26 -19
View File
@@ -11,20 +11,27 @@ import 'katex/dist/katex.min.css';
import '~/common/styles/CodePrism.css';
import '~/common/styles/GithubMarkdown.css';
import '~/common/styles/NProgress.css';
import '~/common/styles/agi.effects.css';
import '~/common/styles/app.styles.css';
import { ProviderBackendAndNoSSR } from '~/common/providers/ProviderBackendAndNoSSR';
import { Is } from '~/common/util/pwaUtils';
import { OverlaysInsert } from '~/common/layout/overlays/OverlaysInsert';
import { ProviderBackendCapabilities } from '~/common/providers/ProviderBackendCapabilities';
import { ProviderBootstrapLogic } from '~/common/providers/ProviderBootstrapLogic';
import { ProviderSingleTab } from '~/common/providers/ProviderSingleTab';
import { ProviderSnacks } from '~/common/providers/ProviderSnacks';
import { ProviderTRPCQueryClient } from '~/common/providers/ProviderTRPCQueryClient';
import { ProviderTheming } from '~/common/providers/ProviderTheming';
import { SnackbarInsert } from '~/common/components/snackbar/SnackbarInsert';
import { hasGoogleAnalytics, OptionalGoogleAnalytics } from '~/common/components/GoogleAnalytics';
import { isVercelFromFrontend } from '~/common/util/pwaUtils';
const MyApp = ({ Component, emotionCache, pageProps }: MyAppProps) =>
<>
const Big_AGI_App = ({ Component, emotionCache, pageProps }: MyAppProps) => {
// We are using a nextjs per-page layout pattern to bring the (Optima) layout creation to a shared place
// This reduces the flicker and the time switching between apps, and seems to not have impact on
// the build. This is a good trade-off for now.
const getLayout = Component.getLayout ?? ((page: any) => page);
return <>
<Head>
<title>{Brand.Title.Common}</title>
@@ -33,23 +40,23 @@ const MyApp = ({ Component, emotionCache, pageProps }: MyAppProps) =>
<ProviderTheming emotionCache={emotionCache}>
<ProviderSingleTab>
<ProviderBootstrapLogic>
<ProviderTRPCQueryClient>
<ProviderSnacks>
<ProviderBackendAndNoSSR>
<Component {...pageProps} />
</ProviderBackendAndNoSSR>
</ProviderSnacks>
</ProviderTRPCQueryClient>
</ProviderBootstrapLogic>
<ProviderBackendCapabilities>
{/* ^ Backend capabilities & SSR boundary */}
<ProviderBootstrapLogic>
<SnackbarInsert />
{getLayout(<Component {...pageProps} />)}
<OverlaysInsert />
</ProviderBootstrapLogic>
</ProviderBackendCapabilities>
</ProviderSingleTab>
</ProviderTheming>
{isVercelFromFrontend && <VercelAnalytics debug={false} />}
{isVercelFromFrontend && <VercelSpeedInsights debug={false} sampleRate={1 / 2} />}
{Is.Deployment.VercelFromFrontend && <VercelAnalytics debug={false} />}
{Is.Deployment.VercelFromFrontend && <VercelSpeedInsights debug={false} sampleRate={1 / 2} />}
{hasGoogleAnalytics && <OptionalGoogleAnalytics />}
</>;
};
// enables the React Query API invocation
export default apiQuery.withTRPC(MyApp);
// Initializes React Query and tRPC, and enables the tRPC React Query hooks (apiQuery).
export default apiQuery.withTRPC(Big_AGI_App);
+3 -3
View File
@@ -2,7 +2,7 @@ import * as React from 'react';
import { AppType, MyAppProps } from 'next/app';
import { default as Document, DocumentContext, DocumentProps, Head, Html, Main, NextScript } from 'next/document';
import createEmotionServer from '@emotion/server/create-instance';
import { getInitColorSchemeScript } from '@mui/joy/styles';
import InitColorSchemeScript from '@mui/joy/InitColorSchemeScript';
import { Brand } from '~/common/app.config';
import { createEmotionCache } from '~/common/app.theme';
@@ -26,7 +26,7 @@ export default function MyDocument({ emotionStyleTags }: MyDocumentProps) {
<link rel='icon' type='image/png' sizes='16x16' href='/icons/favicon-16x16.png' />
<link rel='apple-touch-icon' sizes='180x180' href='/apple-touch-icon.png' />
<link rel='manifest' href='/manifest.json' />
<meta name='apple-mobile-web-app-capable' content='yes' />
<meta name='mobile-web-app-capable' content='yes' />
<meta name='apple-mobile-web-app-status-bar-style' content='black' />
{/* Opengraph */}
@@ -51,7 +51,7 @@ export default function MyDocument({ emotionStyleTags }: MyDocumentProps) {
{emotionStyleTags}
</Head>
<body>
{getInitColorSchemeScript()}
<InitColorSchemeScript />
<Main />
<NextScript />
</body>
+2 -4
View File
@@ -2,9 +2,7 @@ import * as React from 'react';
import { AppCall } from '../src/apps/call/AppCall';
import { withLayout } from '~/common/layout/withLayout';
import { withNextJSPerPageLayout } from '~/common/layout/withLayout';
export default function CallPage() {
return withLayout({ type: 'optima' }, <AppCall />);
}
export default withNextJSPerPageLayout({ type: 'optima' }, () => <AppCall />);
+8
View File
@@ -0,0 +1,8 @@
import * as React from 'react';
import { AppBeam } from '../../src/apps/beam/AppBeam';
import { withNextJSPerPageLayout } from '~/common/layout/withLayout';
export default withNextJSPerPageLayout({ type: 'optima' }, () => <AppBeam />);
+8
View File
@@ -0,0 +1,8 @@
import * as React from 'react';
import { AppDiff } from '../src/apps/diff/AppDiff';
import { withNextJSPerPageLayout } from '~/common/layout/withLayout';
export default withNextJSPerPageLayout({ type: 'optima' }, () => <AppDiff />);
+2 -4
View File
@@ -2,9 +2,7 @@ import * as React from 'react';
import { AppDraw } from '../src/apps/draw/AppDraw';
import { withLayout } from '~/common/layout/withLayout';
import { withNextJSPerPageLayout } from '~/common/layout/withLayout';
export default function DrawPage() {
return withLayout({ type: 'optima' }, <AppDraw />);
}
export default withNextJSPerPageLayout({ type: 'optima' }, () => <AppDraw />);
+4 -4
View File
@@ -2,13 +2,13 @@ import * as React from 'react';
import { AppChat } from '../src/apps/chat/AppChat';
import { withLayout } from '~/common/layout/withLayout';
import { withNextJSPerPageLayout } from '~/common/layout/withLayout';
export default function IndexPage() {
export default withNextJSPerPageLayout({ type: 'optima' }, () => {
// TODO: This Index page will point to the Dashboard (or a landing page)
// For now it offers the chat experience, but this will change. #299
return withLayout({ type: 'optima' }, <AppChat />);
}
return <AppChat />;
});
+26 -27
View File
@@ -6,32 +6,31 @@ import DownloadIcon from '@mui/icons-material/Download';
import { AppPlaceholder } from '../../src/apps/AppPlaceholder';
import { backendCaps } from '~/modules/backend/state-backend';
import { getPlantUmlServerUrl } from '~/modules/blocks/code/RenderCode';
import { getBackendCapabilities } from '~/modules/backend/store-backend-capabilities';
import { getPlantUmlServerUrl } from '~/modules/blocks/code/code-renderers/RenderCodePlantUML';
import { withLayout } from '~/common/layout/withLayout';
import { withNextJSPerPageLayout } from '~/common/layout/withLayout';
// app config
// basics
import { Brand } from '~/common/app.config';
import { ROUTE_APP_CHAT, ROUTE_INDEX } from '~/common/app.routes';
// apps access
import { incrementalNewsVersion } from '../../src/apps/news/news.version';
import { Release } from '~/common/app.release';
// capabilities access
import { useCapabilityBrowserSpeechRecognition, useCapabilityElevenLabs, useCapabilityTextToImage } from '~/common/components/useCapabilities';
// stores access
import { getLLMsDebugInfo } from '~/modules/llms/store-llms';
import { useAppStateStore } from '~/common/state/store-appstate';
import { useChatStore } from '~/common/state/store-chats';
import { useFolderStore } from '~/common/state/store-folders';
import { getLLMsDebugInfo } from '~/common/stores/llms/store-llms';
import { useChatStore } from '~/common/stores/chat/store-chats';
import { useFolderStore } from '~/common/stores/folders/store-chat-folders';
import { useLogicSherpaStore } from '~/common/logic/store-logic-sherpa';
import { useUXLabsStore } from '~/common/state/store-ux-labs';
// utils access
import { clientHostName, isChromeDesktop, isFirefox, isIPhoneUser, isMacUser, isPwa, isVercelFromFrontend } from '~/common/util/pwaUtils';
import { BrowserLang, clientHostName, Is, isPwa } from '~/common/util/pwaUtils';
import { getGA4MeasurementId } from '~/common/components/GoogleAnalytics';
import { prettyTimestampForFilenames } from '~/common/util/timeUtils';
import { supportsClipboardRead } from '~/common/util/clipboardUtils';
import { supportsScreenCapture } from '~/common/util/screenCaptureUtils';
@@ -70,28 +69,27 @@ function DebugJsonCard(props: { title: string, data: any }) {
}
const frontendBuild = Release.buildInfo('frontend');
function AppDebug() {
// state
const [saved, setSaved] = React.useState(false);
// external state
const backendCapabilities = backendCaps();
const backendCaps = getBackendCapabilities();
const chatsCount = useChatStore.getState().conversations?.length;
const uxLabsExperiments = Object.entries(useUXLabsStore.getState()).filter(([_k, v]) => v === true).map(([k, _]) => k).join(', ');
const { folders, enableFolders } = useFolderStore.getState();
const { lastSeenNewsVersion, usageCount } = useAppStateStore.getState();
const { lastSeenNewsVersion, usageCount } = useLogicSherpaStore.getState();
// derived state
const cClient = {
// isBrowser,
isChromeDesktop,
isFirefox,
isIPhone: isIPhoneUser,
isMac: isMacUser,
Is,
BrowserLang,
isPWA: isPwa(),
supportsClipboardPaste: supportsClipboardRead,
supportsClipboardPaste: supportsClipboardRead(),
supportsScreenCapture,
};
const cProduct = {
@@ -105,18 +103,21 @@ function AppDebug() {
chatsCount,
foldersCount: folders?.length,
foldersEnabled: enableFolders,
newsCurrent: incrementalNewsVersion,
newsCurrent: Release.Monotonics.NewsVersion,
newsSeen: lastSeenNewsVersion,
labsActive: uxLabsExperiments,
reloads: usageCount,
},
release: {
app: Release.App,
build: frontendBuild,
},
};
const cBackend = {
configuration: backendCapabilities,
configuration: backendCaps,
deployment: {
home: Brand.URIs.Home,
hostName: clientHostName(),
isVercelFromFrontend,
measurementId: getGA4MeasurementId(),
plantUmlServerUrl: getPlantUmlServerUrl(),
routeIndex: ROUTE_INDEX,
@@ -127,7 +128,7 @@ function AppDebug() {
const handleDownload = async () => {
fileSave(
new Blob([JSON.stringify({ client: cClient, agi: cProduct, backend: cBackend }, null, 2)], { type: 'application/json' }),
{ fileName: `big-agi-debug-${new Date().toISOString().replace(/:/g, '-')}.json`, extensions: ['.json'] },
{ fileName: `big-agi_debug_${prettyTimestampForFilenames()}.json`, extensions: ['.json'] },
)
.then(() => setSaved(true))
.catch(e => console.error('Error saving debug.json', e));
@@ -162,6 +163,4 @@ function AppDebug() {
}
export default function DebugPage() {
return withLayout({ type: 'plain' }, <AppDebug />);
};
export default withNextJSPerPageLayout({ type: 'container' }, () => <AppDebug />);
+9 -9
View File
@@ -2,20 +2,19 @@ import * as React from 'react';
import { Box, Typography } from '@mui/joy';
import { useModelsStore } from '~/modules/llms/store-llms';
import { llmsStoreActions } from '~/common/stores/llms/store-llms';
import { InlineError } from '~/common/components/InlineError';
import { apiQuery } from '~/common/util/trpc.client';
import { navigateToIndex, useRouterQuery } from '~/common/app.routes';
import { withLayout } from '~/common/layout/withLayout';
import { withNextJSPerPageLayout } from '~/common/layout/withLayout';
function CallbackOpenRouterPage(props: { openRouterCode: string | undefined }) {
// external state
const { data, isError, error, isLoading } = apiQuery.backend.exchangeOpenRouterKey.useQuery({ code: props.openRouterCode || '' }, {
const { data, isError, error, isPending } = apiQuery.backend.exchangeOpenRouterKey.useQuery({ code: props.openRouterCode || '' }, {
enabled: !!props.openRouterCode,
refetchOnWindowFocus: false,
staleTime: Infinity,
});
@@ -31,7 +30,7 @@ function CallbackOpenRouterPage(props: { openRouterCode: string | undefined }) {
return;
// 1. Save the key as the client key
useModelsStore.getState().setOpenRoutersKey(openRouterKey);
llmsStoreActions().setOpenRouterKey(openRouterKey);
// 2. Navigate to the chat app
void navigateToIndex(true); //.then(openModelsSetup);
@@ -56,7 +55,7 @@ function CallbackOpenRouterPage(props: { openRouterCode: string | undefined }) {
Welcome Back
</Typography>
{isLoading && <Typography level='body-sm'>Loading...</Typography>}
{isPending && <Typography level='body-sm'>Loading...</Typography>}
{isErrorInput && <InlineError error='There was an issue retrieving the code from OpenRouter.' />}
@@ -81,10 +80,11 @@ function CallbackOpenRouterPage(props: { openRouterCode: string | undefined }) {
* Docs: https://openrouter.ai/docs#oauth
* Example URL: https://localhost:3000/link/callback_openrouter?code=SomeCode
*/
export default function CallbackPage() {
export default withNextJSPerPageLayout({ type: 'container' }, () => {
// external state - get the 'code=...' from the URL
const { code } = useRouterQuery<{ code: string | undefined }>();
return withLayout({ type: 'plain' }, <CallbackOpenRouterPage openRouterCode={code} />);
}
return <CallbackOpenRouterPage openRouterCode={code} />;
});
+5 -4
View File
@@ -3,13 +3,14 @@ import * as React from 'react';
import { AppLinkChat } from '../../../src/apps/link-chat/AppLinkChat';
import { useRouterQuery } from '~/common/app.routes';
import { withLayout } from '~/common/layout/withLayout';
import { withNextJSPerPageLayout } from '~/common/layout/withLayout';
export default function ChatLinkPage() {
export default withNextJSPerPageLayout({ type: 'optima', suspendAutoModelsSetup: true }, () => {
// external state
const { chatLinkId } = useRouterQuery<{ chatLinkId: string | undefined }>();
return withLayout({ type: 'optima', suspendAutoModelsSetup: true }, <AppLinkChat chatLinkId={chatLinkId || null} />);
}
return <AppLinkChat chatLinkId={chatLinkId || null} />;
});
+15 -10
View File
@@ -3,14 +3,14 @@ import * as React from 'react';
import { Alert, Box, Button, Typography } from '@mui/joy';
import ArrowBackIcon from '@mui/icons-material/ArrowBack';
import { setComposerStartupText } from '../../src/apps/chat/components/composer/store-composer';
import { setComposerStartupText } from '~/common/logic/store-logic-sherpa';
import { callBrowseFetchPage } from '~/modules/browse/browse.client';
import { callBrowseFetchPageOrThrow } from '~/modules/browse/browse.client';
import { LogoProgress } from '~/common/components/LogoProgress';
import { asValidURL } from '~/common/util/urlUtils';
import { navigateToIndex, useRouterQuery } from '~/common/app.routes';
import { withLayout } from '~/common/layout/withLayout';
import { withNextJSPerPageLayout } from '~/common/layout/withLayout';
/**
@@ -75,11 +75,18 @@ function AppShareTarget() {
React.useEffect(() => {
if (intentURL) {
setIsDownloading(true);
callBrowseFetchPage(intentURL)
callBrowseFetchPageOrThrow(intentURL)
.then(page => {
if (page.stopReason !== 'error')
queueComposerTextAndLaunchApp('\n\n```' + intentURL + '\n' + page.content + '\n```\n');
else
if (page.stopReason !== 'error') {
if (!page.content) {
setErrorMessage(page.file ? 'No web page found, and we do not support files at the moment.' : 'No content found');
return;
}
let pageContent = page.content.markdown || page.content.text || page.content.html || '';
if (pageContent)
pageContent = '\n\n```' + intentURL + '\n' + pageContent + '\n```\n';
queueComposerTextAndLaunchApp(pageContent);
} else
setErrorMessage('Could not read any data' + page.error ? ': ' + page.error : '');
})
.catch(error => setErrorMessage(error?.message || error || 'Unknown error'))
@@ -132,6 +139,4 @@ function AppShareTarget() {
* This page will be invoked on mobile when sharing Text/URLs/Files from other APPs
* Example URL: https://localhost:3000/link/share_target?title=This+Title&text=https%3A%2F%2Fexample.com%2Fapp%2Fpath
*/
export default function ShareTargetPage() {
return withLayout({ type: 'plain' }, <AppShareTarget />);
}
export default withNextJSPerPageLayout({ type: 'container' }, () => <AppShareTarget />);
+6 -5
View File
@@ -1,14 +1,15 @@
import * as React from 'react';
import { AppNews } from '../src/apps/news/AppNews';
import { markNewsAsSeen } from '../src/apps/news/news.version';
import { withLayout } from '~/common/layout/withLayout';
import { markNewsAsSeen } from '~/common/logic/store-logic-sherpa';
import { withNextJSPerPageLayout } from '~/common/layout/withLayout';
export default function NewsPage() {
export default withNextJSPerPageLayout({ type: 'optima', suspendAutoModelsSetup: true }, () => {
// 'touch' the last seen news version
React.useEffect(() => markNewsAsSeen(), []);
return withLayout({ type: 'optima', suspendAutoModelsSetup: true }, <AppNews />);
}
return <AppNews />;
});
+2 -4
View File
@@ -2,9 +2,7 @@ import * as React from 'react';
import { AppPersonas } from '../src/apps/personas/AppPersonas';
import { withLayout } from '~/common/layout/withLayout';
import { withNextJSPerPageLayout } from '~/common/layout/withLayout';
export default function PersonasPage() {
return withLayout({ type: 'optima' }, <AppPersonas />);
}
export default withNextJSPerPageLayout({ type: 'optima' }, () => <AppPersonas />);
+8
View File
@@ -0,0 +1,8 @@
import * as React from 'react';
import { AppTokens } from '../src/apps/tokens/AppTokens';
import { withNextJSPerPageLayout } from '~/common/layout/withLayout';
export default withNextJSPerPageLayout({ type: 'optima' }, () => <AppTokens />);
+3 -7
View File
@@ -1,12 +1,8 @@
import * as React from 'react';
import { Box } from '@mui/joy';
import { AppPlaceholder } from '../src/apps/AppPlaceholder';
// import { AppWorkspace } from '../src/apps/personas/AppWorkspace';
import { withLayout } from '~/common/layout/withLayout';
import { withNextJSPerPageLayout } from '~/common/layout/withLayout';
export default function PersonasPage() {
return withLayout({ type: 'optima' }, <Box />);
}
export default withNextJSPerPageLayout({ type: 'optima' }, () => <AppPlaceholder />);
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

+56 -10
View File
@@ -3,25 +3,45 @@
"short_name": "big-AGI",
"theme_color": "#32383E",
"background_color": "#9FA6AD",
"description": "Personal AGI App",
"description": "Your Generative AI Suite",
"categories": [
"productivity",
"AI",
"tool",
"utilities"
],
"display": "standalone",
"start_url": "/",
"start_url": "/?source=pwa",
"scope": "/",
"icons": [
{
"src": "/icons/icon-192x192.png",
"sizes": "192x192",
"src": "/icons/icon-1024x1024.png",
"sizes": "1024x1024",
"type": "image/png",
"purpose": "maskable"
"purpose": "any maskable"
},
{
"src": "/icons/icon-512x512.png",
"sizes": "512x512",
"type": "image/png"
"type": "image/png",
"purpose": "any"
},
{
"src": "/icons/icon-1024x1024.png",
"sizes": "1024x1024",
"type": "image/png"
"src": "/icons/icon-192x192.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
}
],
"file_handlers": [
{
"action": "/link/share_target",
"accept": {
"application/big-agi": [
".agi",
".agi.json"
]
}
}
],
"share_target": {
@@ -33,5 +53,31 @@
"text": "text",
"url": "url"
}
}
},
"shortcuts": [
{
"name": "Call",
"url": "/call",
"description": "Call a Persona",
"icons": [
{
"src": "/icons/icon-call-96x96.png",
"sizes": "96x96",
"type": "image/png"
}
]
},
{
"name": "New Voice Chat",
"url": "/?newChat=voiceInput",
"description": "Start a new chat with voice input",
"icons": [
{
"src": "/icons/icon-voicechat-96x96.png",
"sizes": "96x96",
"type": "image/png"
}
]
}
]
}
File diff suppressed because one or more lines are too long
+17 -15
View File
@@ -10,7 +10,7 @@ import { useRouterRoute } from '~/common/app.routes';
* https://github.com/enricoros/big-AGI/issues/299
*/
export function AppPlaceholder(props: {
title?: string,
title?: string | null,
text?: React.ReactNode,
children?: React.ReactNode,
}) {
@@ -29,23 +29,25 @@ export function AppPlaceholder(props: {
border: '1px solid blue',
}}>
<Box sx={{
my: 'auto',
display: 'flex', flexDirection: 'column', alignItems: 'center',
gap: 4,
border: '1px solid red',
}}>
{(props.title !== null || !!props.text) && (
<Box sx={{
my: 'auto',
display: 'flex', flexDirection: 'column', alignItems: 'center',
gap: 4,
border: '1px solid red',
}}>
<Typography level='h1'>
{placeholderAppName}
</Typography>
{!!props.text && (
<Typography>
{props.text}
<Typography level='h1'>
{placeholderAppName}
</Typography>
)}
{!!props.text && (
<Typography>
{props.text}
</Typography>
)}
</Box>
</Box>
)}
{props.children}
+27
View File
@@ -0,0 +1,27 @@
import * as React from 'react';
import { Box, Container, Typography } from '@mui/joy';
export function AppSmallContainer({ title, description, children }: {
title: string;
description: React.ReactNode;
children: React.ReactNode;
}) {
return (
<Box sx={{ flexGrow: 1, overflowY: 'auto', p: { xs: 3, md: 6 } }}>
<Container disableGutters maxWidth='md' sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
<Box sx={{ mb: 2 }}>
<Typography level='h1' sx={{ mb: 1 }}>{title}</Typography>
<Typography>{description}</Typography>
</Box>
{children}
</Container>
</Box>
);
}
+108
View File
@@ -0,0 +1,108 @@
import * as React from 'react';
import { useShallow } from 'zustand/react/shallow';
import { Box, Button, Typography } from '@mui/joy';
import { BeamStoreApi, useBeamStore } from '~/modules/beam/store-beam.hooks';
import { BeamView } from '~/modules/beam/BeamView';
import { createBeamVanillaStore } from '~/modules/beam/store-beam_vanilla';
import { OptimaToolbarIn } from '~/common/layout/optima/portals/OptimaPortalsIn';
import { createDConversation, DConversation } from '~/common/stores/chat/chat.conversation';
import { createDMessageTextContent, DMessage } from '~/common/stores/chat/chat.message';
import { getChatLLMId } from '~/common/stores/llms/store-llms';
import { useIsMobile } from '~/common/components/useMatchMedia';
function initTestConversation(): DConversation {
const conversation = createDConversation();
conversation.messages.push(createDMessageTextContent('system', 'You are a helpful assistant.')); // Beam Test - seed1
conversation.messages.push(createDMessageTextContent('user', 'Hello, who are you? (please expand...)')); // Beam Test - seed2
return conversation;
}
function initTestBeamStore(messages: DMessage[], beamStore: BeamStoreApi = createBeamVanillaStore()): BeamStoreApi {
beamStore.getState().open(messages, getChatLLMId(), false, (content) => alert(content));
return beamStore;
}
export function AppBeam() {
// state
const [showDebug, setShowDebug] = React.useState(false);
const [conversation, setConversation] = React.useState<DConversation>(() => initTestConversation());
const [beamStoreApi] = React.useState(() => createBeamVanillaStore());
// reinit the beam store if the conversation changes
React.useEffect(() => {
initTestBeamStore(conversation.messages, beamStoreApi);
}, [beamStoreApi, conversation]);
// external state
const isMobile = useIsMobile();
const { isOpen, beamState } = useBeamStore(beamStoreApi, useShallow(state => {
return {
isOpen: state.isOpen,
beamState: showDebug ? state : null,
};
}));
const handleClose = React.useCallback(() => {
beamStoreApi.getState().terminateKeepingSettings();
}, [beamStoreApi]);
const toolbarItems = React.useMemo(() => <>
{/* button to toggle debug info */}
<Button size='sm' variant='plain' color='neutral' onClick={() => setShowDebug(on => !on)}>
{showDebug ? 'Hide' : 'Show'} debug
</Button>
{/* 'open' */}
<Button size='sm' variant='plain' color='neutral' onClick={() => setConversation(initTestConversation())}>
.open
</Button>
{/* 'close' */}
<Button size='sm' variant='plain' color='neutral' onClick={handleClose}>
.close
</Button>
</>, [handleClose, showDebug]);
return <>
<OptimaToolbarIn>{toolbarItems}</OptimaToolbarIn>
<Box sx={{ flexGrow: 1, overflowY: 'auto', position: 'relative' }}>
{isOpen && (
<BeamView
beamStore={beamStoreApi}
isMobile={isMobile}
/>
)}
{showDebug && (
<Typography level='body-xs' sx={{
whiteSpace: 'pre',
position: 'absolute',
inset: 0,
zIndex: 1 /* debug on top of BeamView */,
backdropFilter: 'blur(4px)',
padding: '1rem',
}}>
{JSON.stringify(beamState, null, 2)
// add an extra newline between first level properties (space, space, double quote) to make it more readable
.split('\n').map(line => line.replace(/^\s\s"/g, '\n ')).join('\n')}
</Typography>
)}
</Box>
</>;
}
+1 -1
View File
@@ -2,7 +2,7 @@ import * as React from 'react';
import { Container, Sheet } from '@mui/joy';
import type { DConversationId } from '~/common/state/store-chats';
import type { DConversationId } from '~/common/stores/chat/chat.conversation';
import { useRouterQuery } from '~/common/app.routes';
import { CallWizard } from './CallWizard';
+19 -58
View File
@@ -1,60 +1,22 @@
import * as React from 'react';
import { Box, Button, Card, CardContent, IconButton, ListItemDecorator, Typography } from '@mui/joy';
import ArrowForwardIcon from '@mui/icons-material/ArrowForward';
import ArrowForwardRoundedIcon from '@mui/icons-material/ArrowForwardRounded';
import ChatIcon from '@mui/icons-material/Chat';
import CheckIcon from '@mui/icons-material/Check';
import CheckRoundedIcon from '@mui/icons-material/CheckRounded';
import CloseRoundedIcon from '@mui/icons-material/CloseRounded';
import MicIcon from '@mui/icons-material/Mic';
import RecordVoiceOverIcon from '@mui/icons-material/RecordVoiceOver';
import RecordVoiceOverTwoToneIcon from '@mui/icons-material/RecordVoiceOverTwoTone';
import WarningRoundedIcon from '@mui/icons-material/WarningRounded';
import { PreferencesTab, useOptimaLayout } from '~/common/layout/optima/useOptimaLayout';
import { cssRainbowColorKeyframes } from '~/common/app.theme';
import { animationColorRainbow } from '~/common/util/animUtils';
import { navigateBack } from '~/common/app.routes';
import { optimaOpenPreferences } from '~/common/layout/optima/useOptima';
import { useCapabilityBrowserSpeechRecognition, useCapabilityElevenLabs } from '~/common/components/useCapabilities';
import { useChatStore } from '~/common/state/store-chats';
import { useChatStore } from '~/common/stores/chat/store-chats';
import { useUICounter } from '~/common/state/store-ui';
/*export const cssRainbowBackgroundKeyframes = keyframes`
100%, 0% {
background-color: rgb(128, 0, 0);
}
8% {
background-color: rgb(102, 51, 0);
}
16% {
background-color: rgb(64, 64, 0);
}
25% {
background-color: rgb(38, 76, 0);
}
33% {
background-color: rgb(0, 89, 0);
}
41% {
background-color: rgb(0, 76, 41);
}
50% {
background-color: rgb(0, 64, 64);
}
58% {
background-color: rgb(0, 51, 102);
}
66% {
background-color: rgb(0, 0, 128);
}
75% {
background-color: rgb(63, 0, 128);
}
83% {
background-color: rgb(76, 0, 76);
}
91% {
background-color: rgb(102, 0, 51);
}`;*/
function StatusCard(props: { icon: React.JSX.Element, hasIssue: boolean, text: string, button?: React.JSX.Element }) {
return (
<Card sx={{ width: '100%' }}>
@@ -67,7 +29,7 @@ function StatusCard(props: { icon: React.JSX.Element, hasIssue: boolean, text: s
{props.button}
</Typography>
<ListItemDecorator>
{props.hasIssue ? <WarningRoundedIcon color='warning' /> : <CheckIcon color='success' />}
{props.hasIssue ? <WarningRoundedIcon color='warning' /> : <CheckRoundedIcon color='success' />}
</ListItemDecorator>
</CardContent>
</Card>
@@ -82,7 +44,6 @@ export function CallWizard(props: { strict?: boolean, conversationId: string | n
const [recognitionOverride, setRecognitionOverride] = React.useState(false);
// external state
const { openPreferencesTab } = useOptimaLayout();
const recognition = useCapabilityBrowserSpeechRecognition();
const synthesis = useCapabilityElevenLabs();
const chatIsEmpty = useChatStore(state => {
@@ -100,22 +61,22 @@ export function CallWizard(props: { strict?: boolean, conversationId: string | n
const allGood = overriddenEmptyChat && overriddenRecognition && synthesis.mayWork;
const fatalGood = overriddenRecognition && synthesis.mayWork;
if (!novel && fatalGood)
return props.children;
const handleOverrideChatEmpty = () => setChatEmptyOverride(true);
const handleOverrideChatEmpty = React.useCallback(() => setChatEmptyOverride(true), []);
const handleOverrideRecognition = () => setRecognitionOverride(true);
const handleOverrideRecognition = React.useCallback(() => setRecognitionOverride(true), []);
const handleConfigureElevenLabs = () => {
openPreferencesTab(PreferencesTab.Voice);
};
const handleConfigureElevenLabs = React.useCallback(() => optimaOpenPreferences('voice'), []);
const handleFinishButton = () => {
const handleFinishButton = React.useCallback(() => {
if (!allGood)
return navigateBack();
touch();
};
}, [allGood, touch]);
if (!novel && fatalGood)
return props.children;
return <>
@@ -124,7 +85,7 @@ export function CallWizard(props: { strict?: boolean, conversationId: string | n
<Typography level='title-lg' sx={{ fontSize: '3rem', fontWeight: 'sm', textAlign: 'center' }}>
Welcome to<br />
<Box component='span' sx={{ animation: `${cssRainbowColorKeyframes} 15s linear infinite` }}>
<Box component='span' sx={{ animation: `${animationColorRainbow} 15s linear infinite` }}>
your first call
</Box>
</Typography>
@@ -167,7 +128,7 @@ export function CallWizard(props: { strict?: boolean, conversationId: string | n
{/* Text to Speech status */}
<StatusCard
icon={<RecordVoiceOverIcon />}
icon={<RecordVoiceOverTwoToneIcon />}
text={
(synthesis.mayWork ? 'Voice synthesis should be ready.' : 'There might be an issue with ElevenLabs voice synthesis.')
+ (synthesis.isConfiguredServerSide ? '' : (synthesis.isConfiguredClientSide ? '' : ' Please add your API key in the settings.'))
@@ -208,7 +169,7 @@ export function CallWizard(props: { strict?: boolean, conversationId: string | n
// boxShadow: allGood ? 'md' : 'none',
}}
>
{allGood ? <ArrowForwardIcon sx={{ fontSize: '1.5em' }} /> : <CloseRoundedIcon sx={{ fontSize: '1.5em' }} />}
{allGood ? <ArrowForwardRoundedIcon sx={{ fontSize: '1.5em' }} /> : <CloseRoundedIcon sx={{ fontSize: '1.5em' }} />}
</IconButton>
</Box>
+17 -38
View File
@@ -1,14 +1,15 @@
import * as React from 'react';
import { shallow } from 'zustand/shallow';
import { keyframes } from '@emotion/react';
import type { SxProps } from '@mui/joy/styles/types';
import { Avatar, Box, Card, CardContent, Chip, IconButton, Link as MuiLink, ListDivider, MenuItem, Sheet, Switch, Typography } from '@mui/joy';
import CallIcon from '@mui/icons-material/Call';
import { GitHubProjectIssueCard } from '~/common/components/GitHubProjectIssueCard';
import { conversationTitle, DConversation, DConversationId, useChatStore } from '~/common/state/store-chats';
import { usePluggableOptimaLayout } from '~/common/layout/optima/useOptimaLayout';
import { OptimaPanelGroup } from '~/common/layout/optima/panel/OptimaPanelGroup';
import { animationShadowRingLimey } from '~/common/util/animUtils';
import { conversationTitle, DConversation, DConversationId } from '~/common/stores/chat/chat.conversation';
import { useChatStore } from '~/common/stores/chat/store-chats';
import { useSetOptimaAppMenu } from '~/common/layout/optima/useOptima';
import type { AppCallIntent } from './AppCall';
import { MockPersona, useMockPersonas } from './state/useMockPersonas';
@@ -19,27 +20,6 @@ import { useAppCallStore } from './state/store-app-call';
const COLLAPSED_COUNT = 2;
export const niceShadowKeyframes = keyframes`
100%, 0% {
//background-color: rgb(102, 0, 51);
box-shadow: 1px 1px 0 white, 2px 2px 12px rgb(183, 255, 0);
}
25% {
//background-color: rgb(76, 0, 76);
box-shadow: 1px 1px 0 white, 2px 2px 12px rgb(255, 251, 0);
//scale: 1.2;
}
50% {
//background-color: rgb(63, 0, 128);
box-shadow: 1px 1px 0 white, 2px 2px 12px rgba(0, 255, 81);
//scale: 0.8;
}
75% {
//background-color: rgb(0, 0, 128);
box-shadow: 1px 1px 0 white, 2px 2px 12px rgb(255, 153, 0);
}`;
const ContactCardAvatar = (props: { size: string, symbol?: string, imageUrl?: string, onClick?: () => void, sx?: SxProps }) =>
<Avatar
// variant='outlined'
@@ -81,7 +61,7 @@ const ContactCardConversationCall = (props: { conversation: DConversation, onCon
function CallContactCard(props: {
persona: MockPersona,
callGrayUI: boolean,
conversations: DConversation[],
conversations: Readonly<DConversation[]>,
setCallIntent: (intent: AppCallIntent) => void,
}) {
@@ -125,7 +105,6 @@ function CallContactCard(props: {
sx={{
mx: 'auto',
mt: '-2.5rem',
zIndex: 1,
}}
/>
@@ -211,7 +190,7 @@ function CallContactCard(props: {
function useConversationsByPersona() {
const conversations = useChatStore(state => state.conversations, shallow);
const conversations = useChatStore(state => state.conversations);
return React.useMemo(() => {
// group by personaId
@@ -245,7 +224,12 @@ export function Contacts(props: { setCallIntent: (intent: AppCallIntent) => void
// pluggable UI
const menuItems = React.useMemo(() => <>
const menuItems = React.useMemo(() => <OptimaPanelGroup title='Contacts Settings'>
<MenuItem onClick={toggleGrayUI}>
Grayed UI
<Switch checked={grayUI} sx={{ ml: 'auto' }} />
</MenuItem>
<MenuItem onClick={toggleShowConversations}>
Conversations
@@ -253,18 +237,13 @@ export function Contacts(props: { setCallIntent: (intent: AppCallIntent) => void
</MenuItem>
<MenuItem onClick={toggleShowSupport}>
Support
Show Support
<Switch checked={showSupport} sx={{ ml: 'auto' }} />
</MenuItem>
<MenuItem onClick={toggleGrayUI}>
Grayed UI
<Switch checked={grayUI} sx={{ ml: 'auto' }} />
</MenuItem>
</OptimaPanelGroup>, [grayUI, showConversations, showSupport, toggleGrayUI, toggleShowConversations, toggleShowSupport]);
</>, [grayUI, showConversations, showSupport, toggleGrayUI, toggleShowConversations, toggleShowSupport]);
usePluggableOptimaLayout(null, null, menuItems, 'CallUI');
useSetOptimaAppMenu(menuItems, 'CallUI-Contacts');
return <>
@@ -282,7 +261,7 @@ export function Contacts(props: { setCallIntent: (intent: AppCallIntent) => void
borderRadius: '50%',
pointerEvents: 'none',
backgroundColor: 'background.popup',
animation: `${niceShadowKeyframes} 5s infinite`,
animation: `${animationShadowRingLimey} 5s infinite`,
}}>
<CallIcon />
</IconButton>
+112 -86
View File
@@ -1,5 +1,5 @@
import * as React from 'react';
import { shallow } from 'zustand/shallow';
import { useShallow } from 'zustand/react/shallow';
import { Box, Card, ListDivider, ListItemDecorator, MenuItem, Switch, Typography } from '@mui/joy';
import ArrowBackIcon from '@mui/icons-material/ArrowBack';
@@ -7,23 +7,31 @@ import CallEndIcon from '@mui/icons-material/CallEnd';
import CallIcon from '@mui/icons-material/Call';
import MicIcon from '@mui/icons-material/Mic';
import MicNoneIcon from '@mui/icons-material/MicNone';
import RecordVoiceOverIcon from '@mui/icons-material/RecordVoiceOver';
import RecordVoiceOverTwoToneIcon from '@mui/icons-material/RecordVoiceOverTwoTone';
import { ScrollToBottom } from '../chat/components/scroll-to-bottom/ScrollToBottom';
import { ScrollToBottomButton } from '../chat/components/scroll-to-bottom/ScrollToBottomButton';
import { useChatLLMDropdown } from '../chat/components/useLLMDropdown';
import { ScrollToBottom } from '~/common/scroll-to-bottom/ScrollToBottom';
import { ScrollToBottomButton } from '~/common/scroll-to-bottom/ScrollToBottomButton';
import { useChatLLMDropdown } from '../chat/components/layout-bar/useLLMDropdown';
import { EXPERIMENTAL_speakTextStream } from '~/modules/elevenlabs/elevenlabs.client';
import { SystemPurposeId, SystemPurposes } from '../../data';
import { llmStreamingChatGenerate, VChatMessageIn } from '~/modules/llms/llm.client';
import { elevenLabsSpeakText } from '~/modules/elevenlabs/elevenlabs.client';
import { AixChatGenerateContent_DMessage, aixChatGenerateContent_DMessage_FromConversation } from '~/modules/aix/client/aix.client';
import { useElevenLabsVoiceDropdown } from '~/modules/elevenlabs/useElevenLabsVoiceDropdown';
import type { OptimaBarControlMethods } from '~/common/layout/optima/bar/OptimaBarDropdown';
import { AudioPlayer } from '~/common/util/audio/AudioPlayer';
import { Link } from '~/common/components/Link';
import { SpeechResult, useSpeechRecognition } from '~/common/components/useSpeechRecognition';
import { conversationTitle, createDMessage, DMessage, useChatStore } from '~/common/state/store-chats';
import { OptimaPanelGroup } from '~/common/layout/optima/panel/OptimaPanelGroup';
import { OptimaToolbarIn } from '~/common/layout/optima/portals/OptimaPortalsIn';
import { SpeechResult, useSpeechRecognition } from '~/common/components/speechrecognition/useSpeechRecognition';
import { conversationTitle, remapMessagesSysToUsr } from '~/common/stores/chat/chat.conversation';
import { createDMessageFromFragments, createDMessageTextContent, DMessage, messageFragmentsReduceText } from '~/common/stores/chat/chat.message';
import { createErrorContentFragment } from '~/common/stores/chat/chat.fragments';
import { launchAppChat, navigateToIndex } from '~/common/app.routes';
import { playSoundUrl, usePlaySoundUrl } from '~/common/util/audioUtils';
import { usePluggableOptimaLayout } from '~/common/layout/optima/useOptimaLayout';
import { useChatStore } from '~/common/stores/chat/store-chats';
import { useGlobalShortcuts } from '~/common/components/shortcuts/useGlobalShortcuts';
import { usePlayUrl } from '~/common/util/audio/usePlayUrl';
import { useSetOptimaAppMenu } from '~/common/layout/optima/useOptima';
import type { AppCallIntent } from './AppCall';
import { CallAvatar } from './components/CallAvatar';
@@ -48,7 +56,7 @@ function CallMenuItems(props: {
const handleChangeVoiceToggle = () => props.setOverride(!props.override);
return <>
return <OptimaPanelGroup title='Call'>
<MenuItem onClick={handlePushToTalkToggle}>
<ListItemDecorator>{props.pushToTalk ? <MicNoneIcon /> : <MicIcon />}</ListItemDecorator>
@@ -57,7 +65,7 @@ function CallMenuItems(props: {
</MenuItem>
<MenuItem onClick={handleChangeVoiceToggle}>
<ListItemDecorator><RecordVoiceOverIcon /></ListItemDecorator>
<ListItemDecorator><RecordVoiceOverTwoToneIcon /></ListItemDecorator>
Change Voice
<Switch checked={props.override} onChange={handleChangeVoiceToggle} sx={{ ml: 'auto' }} />
</MenuItem>
@@ -78,7 +86,7 @@ function CallMenuItems(props: {
Voice Calls Feedback
</MenuItem>
</>;
</OptimaPanelGroup>;
}
@@ -95,11 +103,12 @@ export function Telephone(props: {
const [personaTextInterim, setPersonaTextInterim] = React.useState<string | null>(null);
const [pushToTalk, setPushToTalk] = React.useState(true);
const [stage, setStage] = React.useState<'ring' | 'declined' | 'connected' | 'ended'>('ring');
const llmDropdownRef = React.useRef<OptimaBarControlMethods>(null);
const responseAbortController = React.useRef<AbortController | null>(null);
// external state
const { chatLLMId, chatLLMDropdown } = useChatLLMDropdown();
const { chatTitle, reMessages } = useChatStore(state => {
const { chatLLMId, chatLLMDropdown } = useChatLLMDropdown(llmDropdownRef);
const { chatTitle, reMessages } = useChatStore(useShallow(state => {
const conversation = props.callIntent.conversationId
? state.conversations.find(conversation => conversation.id === props.callIntent.conversationId) ?? null
: null;
@@ -107,7 +116,7 @@ export function Telephone(props: {
chatTitle: conversation ? conversationTitle(conversation) : null,
reMessages: conversation ? conversation.messages : null,
};
}, shallow);
}));
const persona = SystemPurposes[props.callIntent.personaId as SystemPurposeId] ?? undefined;
const personaCallStarters = persona?.call?.starters ?? undefined;
const personaVoiceId = overridePersonaVoice ? undefined : (persona?.voices?.elevenLabs?.voiceId ?? undefined);
@@ -118,12 +127,12 @@ export function Telephone(props: {
const onSpeechResultCallback = React.useCallback((result: SpeechResult) => {
setSpeechInterim(result.done ? null : { ...result });
if (result.done) {
const transcribed = result.transcript.trim();
if (transcribed.length >= 1)
setCallMessages(messages => [...messages, createDMessage('user', transcribed)]);
const userSpeechTranscribed = result.transcript.trim();
if (userSpeechTranscribed.length >= 1)
setCallMessages(messages => [...messages, createDMessageTextContent('user', userSpeechTranscribed)]); // [state] append user:speech
}
}, []);
const { isSpeechEnabled, isRecording, isRecordingAudio, isRecordingSpeech, startRecording, stopRecording, toggleRecording } = useSpeechRecognition(onSpeechResultCallback, 1000);
const { recognitionState, startRecognition, stopRecognition, toggleRecognition } = useSpeechRecognition('webSpeechApi', onSpeechResultCallback, 1000);
// derived state
const isRinging = stage === 'ring';
@@ -136,17 +145,23 @@ export function Telephone(props: {
// pickup / hangup
React.useEffect(() => {
!isRinging && playSoundUrl(isConnected ? '/sounds/chat-begin.mp3' : '/sounds/chat-end.mp3');
!isRinging && AudioPlayer.playUrl(isConnected ? '/sounds/chat-begin.mp3' : '/sounds/chat-end.mp3');
}, [isRinging, isConnected]);
// ringtone
usePlaySoundUrl(isRinging ? '/sounds/chat-ringtone.mp3' : null, 300, 2800 * 2);
usePlayUrl(isRinging ? '/sounds/chat-ringtone.mp3' : null, 300, 2800 * 2);
/// Shortcuts
useGlobalShortcuts('Telephone', React.useMemo(() => [
{ key: 'm', ctrl: true, action: toggleRecognition },
], [toggleRecognition]));
/// CONNECTED
const handleCallStop = () => {
stopRecording();
stopRecognition(false);
setStage('ended');
};
@@ -169,9 +184,10 @@ export function Telephone(props: {
const phoneMessages = personaCallStarters || ['Hello?', 'Hey!'];
const firstMessage = phoneMessages[Math.floor(Math.random() * phoneMessages.length)];
setCallMessages([createDMessage('assistant', firstMessage)]);
setCallMessages([createDMessageTextContent('assistant', firstMessage)]); // [state] set assistant:hello message
// fire/forget
void EXPERIMENTAL_speakTextStream(firstMessage, personaVoiceId);
void elevenLabsSpeakText(firstMessage, personaVoiceId, true, true);
return () => clearInterval(interval);
}, [isConnected, personaCallStarters, personaVoiceId]);
@@ -179,22 +195,30 @@ export function Telephone(props: {
// [E] persona streaming response - upon new user message
React.useEffect(() => {
// only act when we have a new user message
if (!isConnected || callMessages.length < 1 || callMessages[callMessages.length - 1].role !== 'user')
if (!isConnected || callMessages.length < 1)
return;
switch (callMessages[callMessages.length - 1].text) {
// Voice commands
const lastUserMessage = callMessages[callMessages.length - 1];
if (lastUserMessage.role !== 'user')
return;
switch (messageFragmentsReduceText(lastUserMessage.fragments)) {
// do not respond
case 'Stop.':
return;
// command: close the call
case 'Goodbye.':
setStage('ended');
setTimeout(launchAppChat, 2000);
return;
// command: regenerate answer
case 'Retry.':
case 'Try again.':
setCallMessages(messages => messages.slice(0, messages.length - 2));
return;
// command: restart chat
case 'Restart.':
setCallMessages([]);
@@ -204,43 +228,57 @@ export function Telephone(props: {
// bail if no llm selected
if (!chatLLMId) return;
// temp fix: when the chat has no messages, only assume a single system message
const chatMessages: { role: VChatMessageIn['role'], text: string }[] = (reMessages && reMessages.length > 0)
? reMessages
: personaSystemMessage
? [{ role: 'system', text: personaSystemMessage }]
: [];
// 'prompt' for a "telephone call"
// FIXME: can easily run ouf of tokens - if this gets traction, we'll fix it
const callPrompt: VChatMessageIn[] = [
{ role: 'system', content: 'You are having a phone call. Your response style is brief and to the point, and according to your personality, defined below.' },
...chatMessages.map(message => ({ role: message.role, content: message.text })),
{ role: 'system', content: 'You are now on the phone call related to the chat above. Respect your personality and answer with short, friendly and accurate thoughtful lines.' },
...callMessages.map(message => ({ role: message.role, content: message.text })),
// Call Message Generation Prompt
const callSystemInstruction = createDMessageTextContent('system', 'You are having a phone call. Your response style is brief and to the point, and according to your personality, defined below.');
const reMessagesRemapSysToUsr = remapMessagesSysToUsr(reMessages);
const callGenerationInputHistory: DMessage[] = [
// Chat messages, including the system prompt which is casted to a user message
// TODO: when upgrading to dynamic personas, we need to inject the persona message instead - not rely on reMessages, as messages[0] !== 'system'
...(reMessagesRemapSysToUsr ? reMessagesRemapSysToUsr : [createDMessageTextContent('user', personaSystemMessage)]),
// Call system prompt 2, to indicate the call has started
createDMessageTextContent('user', '**You are now on the phone call related to the chat above**.\nRespect your personality and answer with short, friendly and accurate thoughtful brief lines.'),
// Call history
...callMessages,
];
// perform completion
responseAbortController.current = new AbortController();
let finalText = '';
let error: any | null = null;
setPersonaTextInterim('💭...');
llmStreamingChatGenerate(chatLLMId, callPrompt, null, null, responseAbortController.current.signal, ({ textSoFar }) => {
const text = textSoFar?.trim();
if (text) {
finalText = text;
setPersonaTextInterim(text);
}
aixChatGenerateContent_DMessage_FromConversation(
chatLLMId,
callSystemInstruction,
callGenerationInputHistory,
'call',
callMessages[0].id,
{ abortSignal: responseAbortController.current.signal },
(update: AixChatGenerateContent_DMessage, _isDone: boolean) => {
const updatedText = messageFragmentsReduceText(update.fragments).trim();
if (updatedText)
setPersonaTextInterim(finalText = updatedText);
},
).then((status) => {
// whether status.outcome === 'success' or not, we get a valid DMessage, eventually with Error Fragments inside
const fullMessage = createDMessageFromFragments('assistant', status.lastDMessage.fragments);
fullMessage.generator = status.lastDMessage.generator;
setCallMessages(messages => [...messages, fullMessage]); // [state] append assistant:call_response
// fire/forget
if (status.outcome === 'success' && finalText?.length >= 1)
void elevenLabsSpeakText(finalText, personaVoiceId, true, true);
}).catch((err: DOMException) => {
if (err?.name !== 'AbortError')
error = err;
if (err?.name !== 'AbortError') {
// create an error message to explain the exception
const errorMesage = createDMessageFromFragments('assistant', [createErrorContentFragment(err.message || err.toString())]);
setCallMessages(messages => [...messages, errorMesage]); // [state] append assistant:call_response-ERROR
}
}).finally(() => {
setPersonaTextInterim(null);
if (finalText || error)
setCallMessages(messages => [...messages, createDMessage('assistant', finalText + (error ? ` (ERROR: ${error.message || error.toString()})` : ''))]);
// fire/forget
if (finalText?.length >= 1)
void EXPERIMENTAL_speakTextStream(finalText, personaVoiceId);
});
return () => {
@@ -250,7 +288,7 @@ export function Telephone(props: {
}, [isConnected, callMessages, chatLLMId, personaVoiceId, personaSystemMessage, reMessages]);
// [E] Message interrupter
const abortTrigger = isConnected && isRecordingSpeech;
const abortTrigger = isConnected && recognitionState.hasSpeech;
React.useEffect(() => {
if (abortTrigger && responseAbortController.current) {
responseAbortController.current.abort();
@@ -261,16 +299,16 @@ export function Telephone(props: {
// [E] continuous speech recognition (reload)
const shouldStartRecording = isConnected && !pushToTalk && speechInterim === null && !isRecordingAudio;
const shouldStartRecording = isConnected && !pushToTalk && speechInterim === null && !recognitionState.hasAudio;
React.useEffect(() => {
if (shouldStartRecording)
startRecording();
}, [shouldStartRecording, startRecording]);
startRecognition();
}, [shouldStartRecording, startRecognition]);
// more derived state
const personaName = persona?.title ?? 'Unknown';
const isMicEnabled = isSpeechEnabled;
const isMicEnabled = recognitionState.isAvailable;
const isTTSEnabled = true;
const isEnabled = isMicEnabled && isTTSEnabled;
@@ -284,10 +322,11 @@ export function Telephone(props: {
, [overridePersonaVoice, pushToTalk],
);
usePluggableOptimaLayout(null, chatLLMDropdown, menuItems, 'CallUI');
useSetOptimaAppMenu(menuItems, 'CallUI-Call');
return <>
<OptimaToolbarIn>{chatLLMDropdown}</OptimaToolbarIn>
<Typography
level='h1'
@@ -331,28 +370,15 @@ export function Telephone(props: {
padding: 0, // move this to the ScrollToBottom component
}}>
<ScrollToBottom
// bootToBottom
stickToBottom
sx={{
// allows the content to be scrolled (all browsers)
overflowY: 'auto',
// actually make sure this scrolls & fills
height: '100%',
<ScrollToBottom stickToBottomInitial>
// content
display: 'grid',
padding: 1,
}}
>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>
<Box sx={{ minHeight: '100%', p: 1, display: 'flex', flexDirection: 'column', gap: 1 }}>
{/* Call Messages [] */}
{callMessages.map((message) =>
<CallMessage
key={message.id}
text={message.text}
text={messageFragmentsReduceText(message.fragments)}
variant={message.role === 'assistant' ? 'solid' : 'soft'}
color={message.role === 'assistant' ? 'neutral' : 'primary'}
role={message.role}
@@ -370,10 +396,10 @@ export function Telephone(props: {
)}
{/* Listening... */}
{isRecording && (
{recognitionState.isActive && (
<CallMessage
text={<>{speechInterim?.transcript.trim() || null}{speechInterim?.interimTranscript.trim() ? <i> {speechInterim.interimTranscript}</i> : null}</>}
variant={(isRecordingSpeech || !!speechInterim?.transcript) ? 'soft' : 'outlined'}
variant={(recognitionState.hasSpeech || !!speechInterim?.transcript) ? 'soft' : 'outlined'}
color='primary'
role='user'
/>
@@ -399,11 +425,11 @@ export function Telephone(props: {
{isConnected && <CallButton Icon={CallEndIcon} text='Hang up' color='danger' variant='soft' onClick={handleCallStop} />}
{isConnected && (pushToTalk ? (
<CallButton
Icon={MicIcon} onClick={toggleRecording}
text={isRecordingSpeech ? 'Listening...' : isRecording ? 'Listening' : 'Push To Talk'}
variant={isRecordingSpeech ? 'solid' : isRecording ? 'soft' : 'outlined'}
Icon={MicIcon} onClick={toggleRecognition}
text={recognitionState.hasSpeech ? 'Listening...' : recognitionState.isActive ? 'Listening' : 'Push To Talk'}
variant={recognitionState.hasSpeech ? 'solid' : recognitionState.isActive ? 'soft' : 'outlined'}
color='primary'
sx={!isRecording ? { backgroundColor: 'background.surface' } : undefined}
sx={!recognitionState.isActive ? { backgroundColor: 'background.surface' } : undefined}
/>
) : null
// <CallButton disabled={true} Icon={MicOffIcon} onClick={() => setMicMuted(muted => !muted)}
@@ -419,9 +445,9 @@ export function Telephone(props: {
{/* DEBUG state */}
{avatarClickCount > 10 && (avatarClickCount % 2 === 0) && (
<Card variant='outlined' sx={{ maxHeight: '25dvh', overflow: 'auto', whiteSpace: 'pre', py: 0, width: '100%' }}>
Special commands: Stop, Retry, Try Again, Restart, Goodbye.
{JSON.stringify({ isSpeechEnabled, isRecordingAudio, speechInterim }, null, 2)}
<Card variant='outlined' sx={{ maxHeight: '25dvh', fontSize: 'sm', overflow: 'auto', whiteSpace: 'pre', py: 0, width: '100%' }}>
Special commands: Stop, Retry, Try Again, Restart, Goodbye.<br />
{JSON.stringify({ ...recognitionState, speechInterim }, null, 2)}
</Card>
)}
+2 -13
View File
@@ -1,19 +1,8 @@
import * as React from 'react';
import { keyframes } from '@emotion/react';
import { Avatar, Box } from '@mui/joy';
const cssScaleKeyframes = keyframes`
0% {
transform: scale(1);
}
50% {
transform: scale(1.2);
}
100% {
transform: scale(1);
}`;
import { animationScalePulse } from '~/common/util/animUtils';
export function CallAvatar(props: { symbol: string, imageUrl?: string, isRinging?: boolean, onClick: () => void }) {
@@ -34,7 +23,7 @@ export function CallAvatar(props: { symbol: string, imageUrl?: string, isRinging
<Box
sx={{
...(props.isRinging
? { animation: `${cssScaleKeyframes} 1.4s ease-in-out infinite` }
? { animation: `${animationScalePulse} 1.4s ease-in-out infinite` }
: {}),
}}
>
+2 -2
View File
@@ -3,13 +3,13 @@ import * as React from 'react';
import { Chip, ColorPaletteProp, VariantProp } from '@mui/joy';
import { SxProps } from '@mui/joy/styles/types';
import type { VChatMessageIn } from '~/modules/llms/llm.client';
import type { DMessage } from '~/common/stores/chat/chat.message';
export function CallMessage(props: {
text?: string | React.JSX.Element,
variant?: VariantProp, color?: ColorPaletteProp,
role: VChatMessageIn['role'],
role: DMessage['role'],
sx?: SxProps,
}) {
const isUserMessage = props.role === 'user';
+482 -386
View File
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -3,18 +3,18 @@ import ClearIcon from '@mui/icons-material/Clear';
import type { ICommandsProvider } from './ICommandsProvider';
export const CommandsAlter: ICommandsProvider = {
id: 'chat-alter',
id: 'cmd-chat-alter',
rank: 25,
getCommands: () => [{
primary: '/assistant',
alternatives: ['/a'],
arguments: ['text'],
arguments: ['text...'],
description: 'Injects assistant response',
}, {
primary: '/system',
alternatives: ['/s'],
arguments: ['text'],
arguments: ['text...'],
description: 'Injects system message',
}, {
primary: '/clear',
-17
View File
@@ -1,17 +0,0 @@
import { ChatBeamIcon } from '~/common/components/icons/ChatBeamIcon';
import { getUXLabsChatBeam } from '~/common/state/store-ux-labs';
import type { ICommandsProvider } from './ICommandsProvider';
export const CommandsBeam: ICommandsProvider = {
id: 'ass-beam',
rank: 9,
getCommands: () => getUXLabsChatBeam() ? [{
primary: '/beam',
arguments: ['prompt'],
description: 'Best of multiple replies',
Icon: ChatBeamIcon,
}] : [],
};
-16
View File
@@ -1,16 +0,0 @@
import LanguageIcon from '@mui/icons-material/Language';
import type { ICommandsProvider } from './ICommandsProvider';
export const CommandsBrowse: ICommandsProvider = {
id: 'ass-browse',
rank: 20,
getCommands: () => [{
primary: '/browse',
arguments: ['URL'],
description: 'Assistant will download the web page',
Icon: LanguageIcon,
}],
};
+7 -3
View File
@@ -1,9 +1,13 @@
import FormatPaintIcon from '@mui/icons-material/FormatPaint';
import FormatPaintTwoToneIcon from '@mui/icons-material/FormatPaintTwoTone';
import type { ICommandsProvider } from './ICommandsProvider';
export function textToDrawCommand(text: string): string {
return `/draw ${text}`;
}
export const CommandsDraw: ICommandsProvider = {
id: 'ass-t2i',
id: 'cmd-ass-t2i',
rank: 10,
getCommands: () => [{
@@ -11,7 +15,7 @@ export const CommandsDraw: ICommandsProvider = {
alternatives: ['/imagine', '/img'],
arguments: ['prompt'],
description: 'Assistant will draw the text',
Icon: FormatPaintIcon,
Icon: FormatPaintTwoToneIcon,
}],
};
+1 -1
View File
@@ -3,7 +3,7 @@ import PsychologyIcon from '@mui/icons-material/Psychology';
import type { ICommandsProvider } from './ICommandsProvider';
export const CommandsReact: ICommandsProvider = {
id: 'ass-react',
id: 'cmd-mode-react',
rank: 15,
getCommands: () => [{
+39 -23
View File
@@ -1,27 +1,23 @@
import { ChatCommand, ICommandsProvider } from './ICommandsProvider';
import type { ChatCommand, ICommandsProvider } from './ICommandsProvider';
import { CommandsAlter } from './CommandsAlter';
import { CommandsBeam } from './CommandsBeam';
import { CommandsBrowse } from './CommandsBrowse';
import { CommandsDraw } from './CommandsDraw';
import { CommandsHelp } from './CommandsHelp';
import { CommandsReact } from './CommandsReact';
export type CommandsProviderId = 'ass-beam' | 'ass-browse' | 'ass-t2i' | 'ass-react' | 'chat-alter' | 'cmd-help';
export type CommandsProviderId = 'cmd-ass-t2i' | 'cmd-chat-alter' | 'cmd-help' | 'cmd-mode-react';
type TextCommandPiece =
| { type: 'text'; value: string; }
| { type: 'cmd'; providerId: CommandsProviderId, command: string; params?: string, isError?: boolean };
| { type: 'nocmd'; value: string; }
| { type: 'cmd'; providerId: CommandsProviderId, command: string; params?: string, isErrorNoArgs?: boolean };
const ChatCommandsProviders: Record<CommandsProviderId, ICommandsProvider> = {
'ass-beam': CommandsBeam,
'ass-browse': CommandsBrowse,
'ass-react': CommandsReact,
'ass-t2i': CommandsDraw,
'chat-alter': CommandsAlter,
'cmd-ass-t2i': CommandsDraw,
'cmd-chat-alter': CommandsAlter,
'cmd-help': CommandsHelp,
'cmd-mode-react': CommandsReact,
};
export function findAllChatCommands(): ChatCommand[] {
@@ -31,16 +27,25 @@ export function findAllChatCommands(): ChatCommand[] {
.flat();
}
export function helpPrettyChatCommands() {
return findAllChatCommands()
.map(cmd => ` - ${cmd.primary}` + (cmd.alternatives?.length ? ` (${cmd.alternatives.join(', ')})` : '') + `: ${cmd.description}`)
.join('\n');
}
export function extractChatCommand(input: string): TextCommandPiece[] {
const inputTrimmed = input.trim();
// quick exit: command does not start with '/'
if (!inputTrimmed.startsWith('/'))
return [{ type: 'text', value: input }];
return [{ type: 'nocmd', value: input }];
// Find the first space to separate the command from its parameters (if any)
const firstSpaceIndex = inputTrimmed.indexOf(' ');
const potentialCommand = inputTrimmed.substring(0, firstSpaceIndex >= 0 ? firstSpaceIndex : inputTrimmed.length);
const commandMatch = inputTrimmed.match(/^\/\S+/);
const potentialCommand = commandMatch ? commandMatch[0] : inputTrimmed;
const textAfterCommand = firstSpaceIndex >= 0 ? inputTrimmed.substring(firstSpaceIndex + 1) : '';
// Check if the potential command is an actual command
for (const provider of Object.values(ChatCommandsProviders)) {
@@ -48,22 +53,33 @@ export function extractChatCommand(input: string): TextCommandPiece[] {
if (cmd.primary === potentialCommand || cmd.alternatives?.includes(potentialCommand)) {
// command needs arguments: take the rest of the input as parameters
if (cmd.arguments?.length) {
const params = firstSpaceIndex >= 0 ? inputTrimmed.substring(firstSpaceIndex + 1) : '';
return [{ type: 'cmd', providerId: provider.id, command: potentialCommand, params: params || undefined, isError: !params || undefined }];
}
if (cmd.arguments?.length) return [{
type: 'cmd',
providerId: provider.id,
command: potentialCommand,
params: textAfterCommand || undefined,
isErrorNoArgs: !textAfterCommand,
}];
// command without arguments, treat any text after as a separate text piece
const pieces: TextCommandPiece[] = [{ type: 'cmd', providerId: provider.id, command: potentialCommand, params: undefined }];
const textAfterCommand = firstSpaceIndex >= 0 ? inputTrimmed.substring(firstSpaceIndex + 1) : '';
if (textAfterCommand)
pieces.push({ type: 'text', value: textAfterCommand });
const pieces: TextCommandPiece[] = [{
type: 'cmd',
providerId: provider.id,
command: potentialCommand,
params: undefined,
}];
textAfterCommand && pieces.push({
type: 'nocmd',
value: textAfterCommand,
});
return pieces;
}
}
}
// No command found, return the entire input as text
return [{ type: 'text', value: input }];
return [{
type: 'nocmd',
value: input,
}];
}
@@ -0,0 +1,59 @@
import * as React from 'react';
import type { SxProps } from '@mui/joy/styles/types';
import { Box, Modal, ModalClose } from '@mui/joy';
import { BeamStoreApi, useBeamStore } from '~/modules/beam/store-beam.hooks';
import { BeamView } from '~/modules/beam/BeamView';
import { ScrollToBottom } from '~/common/scroll-to-bottom/ScrollToBottom';
/*const overlaySx: SxProps = {
position: 'absolute',
inset: 0,
zIndex: themeZIndexBeamView, // stay on top of Message > Chips (:1), and Overlays (:2) - note: Desktop Drawer (:26)
}*/
export function ChatBeamWrapper(props: {
beamStore: BeamStoreApi,
isMobile: boolean,
inlineSx?: SxProps,
}) {
// state
const isMaximized = useBeamStore(props.beamStore, state => state.isMaximized);
const handleUnMaximize = React.useCallback(() => {
props.beamStore.getState().setIsMaximized(false);
}, [props.beamStore]);
// memo the beamview
const beamView = React.useMemo(() => (
<BeamView
beamStore={props.beamStore}
isMobile={props.isMobile}
showExplainer
/>
), [props.beamStore, props.isMobile]);
return isMaximized ? (
<Modal open onClose={handleUnMaximize}>
<Box sx={{
backgroundColor: 'background.level1',
position: 'absolute',
inset: 0,
}}>
<ScrollToBottom disableAutoStick>
{beamView}
</ScrollToBottom>
<ModalClose sx={{ color: 'white', backgroundColor: 'background.surface', boxShadow: 'xs', mr: 2 }} />
</Box>
</Modal>
) : (
<Box sx={props.inlineSx}>
{beamView}
</Box>
);
}
-371
View File
@@ -1,371 +0,0 @@
import * as React from 'react';
import { shallow } from 'zustand/shallow';
import { Box, Dropdown, IconButton, ListDivider, ListItem, ListItemButton, ListItemDecorator, Menu, MenuButton, MenuItem, Tooltip, Typography } from '@mui/joy';
import AddIcon from '@mui/icons-material/Add';
import CheckIcon from '@mui/icons-material/Check';
import ClearIcon from '@mui/icons-material/Clear';
import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline';
import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined';
import FileUploadOutlinedIcon from '@mui/icons-material/FileUploadOutlined';
import FolderIcon from '@mui/icons-material/Folder';
import MoreVertIcon from '@mui/icons-material/MoreVert';
import type { DConversationId } from '~/common/state/store-chats';
import { CloseableMenu } from '~/common/components/CloseableMenu';
import { DFolder, useFolderStore } from '~/common/state/store-folders';
import { DebounceInputMemo } from '~/common/components/DebounceInput';
import { FoldersToggleOff } from '~/common/components/icons/FoldersToggleOff';
import { FoldersToggleOn } from '~/common/components/icons/FoldersToggleOn';
import { PageDrawerHeader } from '~/common/layout/optima/components/PageDrawerHeader';
import { PageDrawerList } from '~/common/layout/optima/components/PageDrawerList';
import { capitalizeFirstLetter } from '~/common/util/textUtils';
import { themeScalingMap, themeZIndexOverMobileDrawer } from '~/common/app.theme';
import { useOptimaDrawers } from '~/common/layout/optima/useOptimaDrawers';
import { useUIPreferencesStore } from '~/common/state/store-ui';
import { ChatDrawerItemMemo, FolderChangeRequest } from './ChatDrawerItem';
import { ChatFolderList } from './folders/ChatFolderList';
import { ChatNavGrouping, useChatNavRenderItems } from './useChatNavRenderItems';
import { ClearFolderText } from './folders/useFolderDropdown';
import { useChatShowRelativeSize } from '../store-app-chat';
// this is here to make shallow comparisons work on the next hook
const noFolders: DFolder[] = [];
/*
* Lists folders and returns the active folder
*/
export const useFolders = (activeFolderId: string | null) => useFolderStore(({ enableFolders, folders, toggleEnableFolders }) => {
// finds the active folder if any
const activeFolder = (enableFolders && activeFolderId)
? folders.find(folder => folder.id === activeFolderId) ?? null
: null;
return {
activeFolder,
allFolders: enableFolders ? folders : noFolders,
enableFolders,
toggleEnableFolders,
};
}, shallow);
export const ChatDrawerMemo = React.memo(ChatDrawer);
function ChatDrawer(props: {
isMobile: boolean,
activeConversationId: DConversationId | null,
activeFolderId: string | null,
chatPanesConversationIds: DConversationId[],
disableNewButton: boolean,
onConversationActivate: (conversationId: DConversationId) => void,
onConversationBranch: (conversationId: DConversationId, messageId: string | null) => void,
onConversationNew: (forceNoRecycle: boolean) => void,
onConversationsDelete: (conversationIds: DConversationId[], bypassConfirmation: boolean) => void,
onConversationsExportDialog: (conversationId: DConversationId | null, exportAll: boolean) => void,
onConversationsImportDialog: () => void,
setActiveFolderId: (folderId: string | null) => void,
}) {
const { onConversationActivate, onConversationBranch, onConversationNew, onConversationsDelete, onConversationsExportDialog } = props;
// local state
const [navGrouping, setNavGrouping] = React.useState<ChatNavGrouping>('date');
const [debouncedSearchQuery, setDebouncedSearchQuery] = React.useState('');
const [folderChangeRequest, setFolderChangeRequest] = React.useState<FolderChangeRequest | null>(null);
// external state
const { closeDrawer, closeDrawerOnMobile } = useOptimaDrawers();
const { showRelativeSize, toggleRelativeSize } = useChatShowRelativeSize();
const { activeFolder, allFolders, enableFolders, toggleEnableFolders } = useFolders(props.activeFolderId);
const { filteredChatsCount, filteredChatIDs, filteredChatsAreEmpty, filteredChatsBarBasis, filteredChatsIncludeActive, renderNavItems } = useChatNavRenderItems(
props.activeConversationId, props.chatPanesConversationIds, debouncedSearchQuery, activeFolder, allFolders, navGrouping, showRelativeSize,
);
const { contentScaling, showSymbols } = useUIPreferencesStore(state => ({
contentScaling: state.contentScaling,
showSymbols: state.zenMode !== 'cleaner',
}), shallow);
// New/Activate/Delete Conversation
const isMultiPane = props.chatPanesConversationIds.length >= 2;
const disableNewButton = props.disableNewButton && filteredChatsIncludeActive;
const newButtonDontRecycle = isMultiPane || !filteredChatsIncludeActive;
const handleButtonNew = React.useCallback(() => {
onConversationNew(newButtonDontRecycle);
closeDrawerOnMobile();
}, [closeDrawerOnMobile, newButtonDontRecycle, onConversationNew]);
const handleConversationActivate = React.useCallback((conversationId: DConversationId, closeMenu: boolean) => {
onConversationActivate(conversationId);
if (closeMenu)
closeDrawerOnMobile();
}, [closeDrawerOnMobile, onConversationActivate]);
const handleConversationsDeleteFiltered = React.useCallback(() => {
!!filteredChatIDs?.length && onConversationsDelete(filteredChatIDs, false);
}, [filteredChatIDs, onConversationsDelete]);
const handleConversationDeleteNoConfirmation = React.useCallback((conversationId: DConversationId) => {
conversationId && onConversationsDelete([conversationId], true);
}, [onConversationsDelete]);
const handleConversationsExport = React.useCallback(() => {
props.activeConversationId && onConversationsExportDialog(props.activeConversationId, true);
}, [onConversationsExportDialog, props.activeConversationId]);
// Folder change request
const handleConversationFolderChange = React.useCallback((folderChangeRequest: FolderChangeRequest) => setFolderChangeRequest(folderChangeRequest), []);
const handleConversationFolderCancel = React.useCallback(() => setFolderChangeRequest(null), []);
const handleConversationFolderSet = React.useCallback((conversationId: DConversationId, nextFolderId: string | null) => {
// Remove conversation from existing folders
const { addConversationToFolder, folders, removeConversationFromFolder } = useFolderStore.getState();
folders.forEach(folder => folder.conversationIds.includes(conversationId) && removeConversationFromFolder(folder.id, conversationId));
// Add conversation to the selected folder
nextFolderId && addConversationToFolder(nextFolderId, conversationId);
// Close the menu
setFolderChangeRequest(null);
}, []);
// memoize the group dropdown
const groupingComponent = React.useMemo(() => (
<Dropdown>
<MenuButton
aria-label='View options'
slots={{ root: IconButton }}
slotProps={{ root: { size: 'sm' } }}
>
<MoreVertIcon sx={{ fontSize: 'xl' }} />
</MenuButton>
<Menu placement='bottom-start' sx={{ minWidth: 180, zIndex: themeZIndexOverMobileDrawer /* need to be on top of the Modal on Mobile */ }}>
<ListItem>
<Typography level='body-sm'>Group By</Typography>
</ListItem>
{(['date', 'persona'] as const).map(_gName => (
<MenuItem
key={'group-' + _gName}
aria-label={`Group by ${_gName}`}
selected={navGrouping === _gName}
onClick={() => setNavGrouping(grouping => grouping === _gName ? false : _gName)}
>
<ListItemDecorator>{navGrouping === _gName && <CheckIcon />}</ListItemDecorator>
{capitalizeFirstLetter(_gName)}
</MenuItem>
))}
<ListDivider />
<ListItem>
<Typography level='body-sm'>Show</Typography>
</ListItem>
<MenuItem onClick={toggleRelativeSize}>
<ListItemDecorator>{showRelativeSize && <CheckIcon />}</ListItemDecorator>
Relative Size
</MenuItem>
</Menu>
</Dropdown>
), [navGrouping, showRelativeSize, toggleRelativeSize]);
return <>
{/* Drawer Header */}
<PageDrawerHeader title='Chats' onClose={closeDrawer}>
<Tooltip title={enableFolders ? 'Hide Folders' : 'Use Folders'}>
<IconButton onClick={toggleEnableFolders}>
{enableFolders ? <FoldersToggleOn /> : <FoldersToggleOff />}
</IconButton>
</Tooltip>
</PageDrawerHeader>
{/* Folders List */}
{/*<Box sx={{*/}
{/* display: 'grid',*/}
{/* gridTemplateRows: !enableFolders ? '0fr' : '1fr',*/}
{/* transition: 'grid-template-rows 0.42s cubic-bezier(.17,.84,.44,1)',*/}
{/* '& > div': {*/}
{/* padding: enableFolders ? 2 : 0,*/}
{/* transition: 'padding 0.42s cubic-bezier(.17,.84,.44,1)',*/}
{/* overflow: 'hidden',*/}
{/* },*/}
{/*}}>*/}
{enableFolders && (
<ChatFolderList
folders={allFolders}
contentScaling={contentScaling}
activeFolderId={props.activeFolderId}
onFolderSelect={props.setActiveFolderId}
/>
)}
{/*</Box>*/}
{/* Chats List */}
<PageDrawerList variant='plain' noTopPadding noBottomPadding tallRows>
{enableFolders && <ListDivider sx={{ mb: 0 }} />}
{/* Search Input Field */}
<DebounceInputMemo
minChars={2}
onDebounce={setDebouncedSearchQuery}
debounceTimeout={300}
placeholder='Search...'
aria-label='Search'
endDecorator={groupingComponent}
sx={{ m: 2 }}
/>
{/* New Chat Button */}
<ListItem sx={{ mx: '0.25rem', mb: 0.5 }}>
<ListItemButton
// variant='outlined'
variant={disableNewButton ? undefined : 'outlined'}
disabled={disableNewButton}
onClick={handleButtonNew}
sx={{
// ...PageDrawerTallItemSx,
px: 'calc(var(--ListItem-paddingX) - 0.25rem)',
// text size
fontSize: 'sm',
fontWeight: 'lg',
// style
borderRadius: 'md',
boxShadow: (disableNewButton || props.isMobile) ? 'none' : 'sm',
backgroundColor: 'background.popup',
transition: 'box-shadow 0.2s',
}}
>
<ListItemDecorator><AddIcon sx={{ '--Icon-fontSize': 'var(--joy-fontSize-xl)', pl: '0.125rem' }} /></ListItemDecorator>
New chat
</ListItemButton>
</ListItem>
{/*<ListDivider sx={{ mt: 0 }} />*/}
{/* List of Chat Titles (and actions) */}
<Box sx={{ flex: 1, overflowY: 'auto', ...themeScalingMap[contentScaling].chatDrawerItemSx }}>
{/*<ListItem sticky sx={{ justifyContent: 'space-between', boxShadow: 'sm' }}>*/}
{/* <Typography level='body-sm'>*/}
{/* Conversations*/}
{/* </Typography>*/}
{/* <ToggleButtonGroup variant='soft' size='sm' value={grouping} onChange={(_event, newValue) => newValue && setGrouping(newValue)}>*/}
{/* <IconButton value='off'>*/}
{/* <AccessTimeIcon />*/}
{/* </IconButton>*/}
{/* <IconButton value='persona'>*/}
{/* <PersonIcon />*/}
{/* </IconButton>*/}
{/* </ToggleButtonGroup>*/}
{/*</ListItem>*/}
{renderNavItems.map((item, idx) => item.type === 'nav-item-chat-data' ? (
<ChatDrawerItemMemo
key={'nav-chat-' + item.conversationId}
item={item}
showSymbols={showSymbols}
bottomBarBasis={filteredChatsBarBasis}
onConversationActivate={handleConversationActivate}
onConversationBranch={onConversationBranch}
onConversationDelete={handleConversationDeleteNoConfirmation}
onConversationExport={onConversationsExportDialog}
onConversationFolderChange={handleConversationFolderChange}
/>
) : item.type === 'nav-item-group' ? (
<Typography key={'nav-divider-' + idx} level='body-xs' sx={{ textAlign: 'center', my: 'calc(var(--ListItem-minHeight) / 4)' }}>
{item.title}
</Typography>
) : item.type === 'nav-item-info-message' ? (
<Typography key={'nav-info-' + idx} level='body-xs' sx={{ textAlign: 'center', my: 'calc(var(--ListItem-minHeight) / 2)' }}>
{item.message}
</Typography>
) : null,
)}
</Box>
<ListDivider sx={{ my: 0 }} />
<Box sx={{ display: 'flex', alignItems: 'center' }}>
<ListItemButton onClick={props.onConversationsImportDialog} sx={{ flex: 1 }}>
<ListItemDecorator>
<FileUploadOutlinedIcon />
</ListItemDecorator>
Import
{/*<OpenAIIcon sx={{ ml: 'auto' }} />*/}
</ListItemButton>
<ListItemButton disabled={filteredChatsAreEmpty} onClick={handleConversationsExport} sx={{ flex: 1 }}>
<ListItemDecorator>
<FileDownloadOutlinedIcon />
</ListItemDecorator>
Export
</ListItemButton>
</Box>
<ListItemButton disabled={filteredChatsAreEmpty} onClick={handleConversationsDeleteFiltered}>
<ListItemDecorator>
<DeleteOutlineIcon />
</ListItemDecorator>
Delete {filteredChatsCount >= 2 ? `all ${filteredChatsCount} chats` : 'chat'}
</ListItemButton>
</PageDrawerList>
{/* [Menu] Chat Item Folder Change */}
{!!folderChangeRequest?.anchorEl && (
<CloseableMenu
bigIcons
open anchorEl={folderChangeRequest.anchorEl} onClose={handleConversationFolderCancel}
placement='bottom-start'
zIndex={themeZIndexOverMobileDrawer /* need to be on top of the Modal on Mobile */}
sx={{ minWidth: 200 }}
>
{/* Folder Assignment Buttons */}
{allFolders.map(folder => {
const isRequestFolder = folder === folderChangeRequest.currentFolder;
return (
<ListItem
key={folder.id}
variant={isRequestFolder ? 'soft' : 'plain'}
onClick={() => handleConversationFolderSet(folderChangeRequest.conversationId, folder.id)}
>
<ListItemButton>
<ListItemDecorator>
<FolderIcon sx={{ color: folder.color }} />
</ListItemDecorator>
{folder.title}
</ListItemButton>
</ListItem>
);
})}
{/* Remove Folder Assignment */}
{!!folderChangeRequest.currentFolder && (
<ListItem onClick={() => handleConversationFolderSet(folderChangeRequest.conversationId, null)}>
<ListItemButton>
<ListItemDecorator>
<ClearIcon />
</ListItemDecorator>
{ClearFolderText}
</ListItemButton>
</ListItem>
)}
</CloseableMenu>
)}
</>;
}
@@ -1,31 +0,0 @@
import * as React from 'react';
import type { DConversationId } from '~/common/state/store-chats';
import { useChatLLMDropdown } from './useLLMDropdown';
import { usePersonaIdDropdown } from './usePersonaDropdown';
import { useFolderDropdown } from './folders/useFolderDropdown';
export function ChatDropdowns(props: {
conversationId: DConversationId | null
}) {
// state
const { chatLLMDropdown } = useChatLLMDropdown();
const { personaDropdown } = usePersonaIdDropdown(props.conversationId);
const { folderDropdown } = useFolderDropdown(props.conversationId);
return <>
{/* Persona selector */}
{personaDropdown}
{/* Model selector */}
{chatLLMDropdown}
{/* Folder selector */}
{folderDropdown}
</>;
}
+219 -100
View File
@@ -1,28 +1,37 @@
import * as React from 'react';
import { shallow } from 'zustand/shallow';
import { useShallow } from 'zustand/react/shallow';
import type { SxProps } from '@mui/joy/styles/types';
import { Box, List } from '@mui/joy';
import { SxProps } from '@mui/joy/styles/types';
import type { SystemPurposeExample } from '../../../data';
import type { DiagramConfig } from '~/modules/aifn/digrams/DiagramsModal';
import type { ConversationHandler } from '~/common/chats/ConversationHandler';
import { InlineError } from '~/common/components/InlineError';
import { PreferencesTab, useOptimaLayout } from '~/common/layout/optima/useOptimaLayout';
import { ShortcutKeyName, useGlobalShortcut } from '~/common/components/useGlobalShortcut';
import { createDMessage, DConversationId, DMessage, getConversation, useChatStore } from '~/common/state/store-chats';
import type { ConversationHandler } from '~/common/chat-overlay/ConversationHandler';
import { DConversationId, excludeSystemMessages } from '~/common/stores/chat/chat.conversation';
import { ShortcutKey, useGlobalShortcuts } from '~/common/components/shortcuts/useGlobalShortcuts';
import { convertFilesToDAttachmentFragments } from '~/common/attachment-drafts/attachment.pipeline';
import { createDMessageFromFragments, createDMessageTextContent, DMessage, DMessageId, DMessageUserFlag, DMetaReferenceItem, MESSAGE_FLAG_AIX_SKIP } from '~/common/stores/chat/chat.message';
import { createTextContentFragment, DMessageFragment, DMessageFragmentId } from '~/common/stores/chat/chat.fragments';
import { openFileForAttaching } from '~/common/components/ButtonAttachFiles';
import { optimaOpenPreferences } from '~/common/layout/optima/useOptima';
import { useBrowserTranslationWarning } from '~/common/components/useIsBrowserTranslating';
import { useCapabilityElevenLabs } from '~/common/components/useCapabilities';
import { useEphemerals } from '~/common/chats/EphemeralsStore';
import { useChatOverlayStore } from '~/common/chat-overlay/store-perchat_vanilla';
import { useChatStore } from '~/common/stores/chat/store-chats';
import { useScrollToBottom } from '~/common/scroll-to-bottom/useScrollToBottom';
import { CMLZeroConversation } from './messages-list/CMLZeroConversation';
import { ChatMessage, ChatMessageMemo } from './message/ChatMessage';
import { CleanerMessage, MessagesSelectionHeader } from './message/CleanerMessage';
import { Ephemerals } from './Ephemerals';
import { PersonaSelector } from './persona-selector/PersonaSelector';
import { useChatShowSystemMessages } from '../store-app-chat';
import { useScrollToBottom } from './scroll-to-bottom/useScrollToBottom';
import { useChatAutoSuggestHTMLUI, useChatShowSystemMessages } from '../store-app-chat';
const stableNoMessages: DMessage[] = [];
/**
* A list of ChatMessages
*/
@@ -30,11 +39,15 @@ export function ChatMessageList(props: {
conversationId: DConversationId | null,
conversationHandler: ConversationHandler | null,
capabilityHasT2I: boolean,
chatLLMAntPromptCaching: boolean,
chatLLMContextTokens: number | null,
chatLLMSupportsImages: boolean,
fitScreen: boolean,
isMobile: boolean,
isMessageSelectionMode: boolean,
onConversationBranch: (conversationId: DConversationId, messageId: string) => void,
onConversationExecuteHistory: (conversationId: DConversationId, history: DMessage[], chatEffectBeam: boolean) => Promise<void>,
onConversationBranch: (conversationId: DConversationId, messageId: string, addSplitPane: boolean) => void,
onConversationExecuteHistory: (conversationId: DConversationId) => Promise<void>,
onConversationNew: (forceNoRecycle: boolean, isIncognito: boolean) => void,
onTextDiagram: (diagramConfig: DiagramConfig | null) => void,
onTextImagine: (conversationId: DConversationId, selectedText: string) => Promise<void>,
onTextSpeak: (selectedText: string) => Promise<void>,
@@ -49,84 +62,163 @@ export function ChatMessageList(props: {
// external state
const { notifyBooting } = useScrollToBottom();
const { openPreferencesTab } = useOptimaLayout();
const danger_experimentalHtmlWebUi = useChatAutoSuggestHTMLUI();
const [showSystemMessages] = useChatShowSystemMessages();
const optionalTranslationWarning = useBrowserTranslationWarning();
const { conversationMessages, historyTokenCount, editMessage, deleteMessage, setMessages } = useChatStore(state => {
const conversation = state.conversations.find(conversation => conversation.id === props.conversationId);
const { conversationMessages, historyTokenCount } = useChatStore(useShallow(({ conversations }) => {
const conversation = conversations.find(conversation => conversation.id === props.conversationId);
return {
conversationMessages: conversation ? conversation.messages : [],
conversationMessages: conversation ? conversation.messages : stableNoMessages,
historyTokenCount: conversation ? conversation.tokenCount : 0,
deleteMessage: state.deleteMessage,
editMessage: state.editMessage,
setMessages: state.setMessages,
};
}, shallow);
const ephemerals = useEphemerals(props.conversationHandler);
}));
const { _composerInReferenceToCount, ephemerals } = useChatOverlayStore(props.conversationHandler?.conversationOverlayStore ?? null, useShallow(state => ({
_composerInReferenceToCount: state.inReferenceTo?.length ?? 0,
ephemerals: state.ephemerals?.length ? state.ephemerals : null,
})));
const { mayWork: isSpeakable } = useCapabilityElevenLabs();
// derived state
const { conversationId, capabilityHasT2I, onConversationBranch, onConversationExecuteHistory, onTextDiagram, onTextImagine, onTextSpeak } = props;
const { conversationHandler, conversationId, capabilityHasT2I, onConversationBranch, onConversationExecuteHistory, onTextDiagram, onTextImagine, onTextSpeak } = props;
const composerCanAddInReferenceTo = _composerInReferenceToCount < 5;
const composerHasInReferenceto = _composerInReferenceToCount > 0;
// text actions
const handleRunExample = React.useCallback(async (text: string) => {
conversationId && await onConversationExecuteHistory(conversationId, [...conversationMessages, createDMessage('user', text)], false);
}, [conversationId, conversationMessages, onConversationExecuteHistory]);
const handleRunExample = React.useCallback(async (example: SystemPurposeExample) => {
if (!conversationId || !conversationHandler) return;
// Simple Example Prompt (User text message)
if (typeof example === 'string') {
conversationHandler.messageAppend(createDMessageTextContent('user', example)); // [chat] append user:persona question
await onConversationExecuteHistory(conversationId);
return;
}
// User-Action Example Prompts (User text message + File attachments)
switch (example.action) {
case 'require-data-attachment':
await openFileForAttaching(true, async (filesWithHandle) => {
// Retrieve fully-fledged Attachment Fragments (converted/extracted, with sources, mimes, etc.) from the selected files
const attachmentFragments = await convertFilesToDAttachmentFragments('file-open', filesWithHandle, {
hintAddImages: props.chatLLMSupportsImages,
});
// Create a User message with the prompt and the attachment fragments
if (attachmentFragments.length) {
conversationHandler.messageAppend(createDMessageFromFragments('user', [ // [chat] append user:persona question + attachment(s)
createTextContentFragment(example.prompt),
...attachmentFragments,
]));
await onConversationExecuteHistory(conversationId);
}
});
break;
}
}, [conversationHandler, conversationId, onConversationExecuteHistory, props.chatLLMSupportsImages]);
const handleMessageContinue = React.useCallback(async (_messageId: DMessageId /* Ignored for now */) => {
if (conversationId && conversationHandler) {
conversationHandler.messageAppend(createDMessageTextContent('user', 'Continue')); // [chat] append user:Continue
await onConversationExecuteHistory(conversationId);
}
}, [conversationHandler, conversationId, onConversationExecuteHistory]);
// message menu methods proxy
const handleConversationBranch = React.useCallback((messageId: string) => {
conversationId && onConversationBranch(conversationId, messageId);
const handleMessageAssistantFrom = React.useCallback(async (messageId: DMessageId, offset: number) => {
if (conversationId && conversationHandler) {
conversationHandler.historyTruncateTo(messageId, offset);
await onConversationExecuteHistory(conversationId);
}
}, [conversationHandler, conversationId, onConversationExecuteHistory]);
const handleMessageBeam = React.useCallback(async (messageId: DMessageId) => {
// Message option menu Beam
if (!conversationId || !props.conversationHandler || !props.conversationHandler.isValid()) return;
const inputHistory = props.conversationHandler.historyViewHeadOrThrow('chat-beam-message');
if (!inputHistory.length) return;
// TODO: replace the Persona and Auto-Cache-hint in the history?
// truncate the history to the given message (may or may not have more after)
const truncatedHistory = inputHistory.slice(0, inputHistory.findIndex(m => m.id === messageId) + 1);
const lastTruncatedMessage = truncatedHistory[truncatedHistory.length - 1];
if (!lastTruncatedMessage) return;
// assistant: do an in-place beam
if (lastTruncatedMessage.role === 'assistant') {
if (truncatedHistory.length >= 2)
props.conversationHandler.beamInvoke(truncatedHistory.slice(0, -1), [lastTruncatedMessage], lastTruncatedMessage.id);
} else if (lastTruncatedMessage.role === 'user') {
// user: truncate and append (but if the next message is an assistant message, import it)
const possibleNextMessage = inputHistory[truncatedHistory.length];
if (possibleNextMessage?.role === 'assistant')
props.conversationHandler.beamInvoke(truncatedHistory, [possibleNextMessage], null);
else
props.conversationHandler.beamInvoke(truncatedHistory, [], null);
}
}, [conversationId, props.conversationHandler]);
const handleMessageBranch = React.useCallback((messageId: DMessageId) => {
conversationId && onConversationBranch(conversationId, messageId, true);
}, [conversationId, onConversationBranch]);
const handleConversationRestartFrom = React.useCallback(async (messageId: string, offset: number, chatEffectBeam: boolean) => {
const messages = getConversation(conversationId)?.messages;
if (messages) {
const truncatedHistory = messages.slice(0, messages.findIndex(m => m.id === messageId) + offset + 1);
conversationId && await onConversationExecuteHistory(conversationId, truncatedHistory, chatEffectBeam);
}
}, [conversationId, onConversationExecuteHistory]);
const handleMessageTruncate = React.useCallback((messageId: DMessageId) => {
props.conversationHandler?.historyTruncateTo(messageId, 0);
}, [props.conversationHandler]);
const handleConversationTruncate = React.useCallback((messageId: string) => {
const messages = getConversation(conversationId)?.messages;
if (conversationId && messages) {
const truncatedHistory = messages.slice(0, messages.findIndex(m => m.id === messageId) + 1);
setMessages(conversationId, truncatedHistory);
}
}, [conversationId, setMessages]);
const handleMessageDelete = React.useCallback((messageId: DMessageId) => {
props.conversationHandler?.messagesDelete([messageId]);
}, [props.conversationHandler]);
const handleMessageDelete = React.useCallback((messageId: string) => {
conversationId && deleteMessage(conversationId, messageId);
}, [conversationId, deleteMessage]);
const handleMessageAppendFragment = React.useCallback((messageId: DMessageId, fragment: DMessageFragment) => {
props.conversationHandler?.messageFragmentAppend(messageId, fragment, false, false);
}, [props.conversationHandler]);
const handleMessageEdit = React.useCallback((messageId: string, newText: string) => {
conversationId && editMessage(conversationId, messageId, { text: newText }, true);
}, [conversationId, editMessage]);
const handleMessageDeleteFragment = React.useCallback((messageId: DMessageId, fragmentId: DMessageFragmentId) => {
props.conversationHandler?.messageFragmentDelete(messageId, fragmentId, false, true);
}, [props.conversationHandler]);
const handleTextDiagram = React.useCallback(async (messageId: string, text: string) => {
const handleMessageReplaceFragment = React.useCallback((messageId: DMessageId, fragmentId: DMessageFragmentId, newFragment: DMessageFragment) => {
props.conversationHandler?.messageFragmentReplace(messageId, fragmentId, newFragment, false);
}, [props.conversationHandler]);
const handleMessageToggleUserFlag = React.useCallback((messageId: DMessageId, userFlag: DMessageUserFlag, _maxPerConversation?: number) => {
props.conversationHandler?.messageToggleUserFlag(messageId, userFlag, true /* touch */);
// Note: we don't support 'maxPerConversation' yet, which is supposed to turn off the flag from the beginning if it's too numerous
// if (_maxPerConversation) {
// ...
// }
}, [props.conversationHandler]);
const handleAddInReferenceTo = React.useCallback((item: DMetaReferenceItem) => {
props.conversationHandler?.overlayActions.addInReferenceTo(item);
}, [props.conversationHandler]);
const handleTextDiagram = React.useCallback(async (messageId: DMessageId, text: string) => {
conversationId && onTextDiagram({ conversationId: conversationId, messageId, text });
}, [conversationId, onTextDiagram]);
const handleTextImagine = React.useCallback(async (text: string) => {
if (!capabilityHasT2I)
return openPreferencesTab(PreferencesTab.Draw);
return optimaOpenPreferences('draw');
if (conversationId) {
setIsImagining(true);
await onTextImagine(conversationId, text);
setIsImagining(false);
}
}, [capabilityHasT2I, conversationId, onTextImagine, openPreferencesTab]);
}, [capabilityHasT2I, conversationId, onTextImagine]);
const handleTextSpeak = React.useCallback(async (text: string) => {
if (!isSpeakable)
return openPreferencesTab(PreferencesTab.Voice);
return optimaOpenPreferences('voice');
setIsSpeaking(true);
await onTextSpeak(text);
setIsSpeaking(false);
}, [isSpeakable, onTextSpeak, openPreferencesTab]);
}, [isSpeakable, onTextSpeak]);
// operate on the local selection set
@@ -139,36 +231,43 @@ export function ChatMessageList(props: {
setSelectedMessages(newSelected);
};
const handleSelectMessage = (messageId: string, selected: boolean) => {
const handleSelectMessage = (messageId: DMessageId, selected: boolean) => {
const newSelected = new Set(selectedMessages);
selected ? newSelected.add(messageId) : newSelected.delete(messageId);
setSelectedMessages(newSelected);
};
const handleSelectionDelete = () => {
if (conversationId)
for (const selectedMessage of selectedMessages)
deleteMessage(conversationId, selectedMessage);
const handleSelectionDelete = React.useCallback(() => {
props.conversationHandler?.messagesDelete(Array.from(selectedMessages));
setSelectedMessages(new Set());
};
}, [props.conversationHandler, selectedMessages]);
useGlobalShortcut(props.isMessageSelectionMode && ShortcutKeyName.Esc, false, false, false, () => {
props.setIsMessageSelectionMode(false);
});
const handleSelectionHide = React.useCallback(() => {
for (let selectedMessage of Array.from(selectedMessages))
props.conversationHandler?.messageSetUserFlag(selectedMessage, MESSAGE_FLAG_AIX_SKIP, true, true);
setSelectedMessages(new Set());
}, [props.conversationHandler, selectedMessages]);
const { isMessageSelectionMode, setIsMessageSelectionMode } = props;
useGlobalShortcuts('ChatMessageList_Selection', React.useMemo(() => !isMessageSelectionMode ? [] : [
{ key: ShortcutKey.Esc, action: () => setIsMessageSelectionMode(false), description: 'Close Cleanup', level: 10 - 1 },
], [isMessageSelectionMode, setIsMessageSelectionMode]));
// text-diff functionality: only diff the last message and when it's complete (not typing), and they're similar in size
// text-diff functionality: only diff the last complete message, and they're similar in size
const { diffTargetMessage, diffPrevText } = React.useMemo(() => {
const [msgB, msgA] = conversationMessages.filter(m => m.role === 'assistant').reverse();
if (msgB?.text && msgA?.text && !msgB?.typing) {
const textA = msgA.text, textB = msgB.text;
const lenA = textA.length, lenB = textB.length;
if (lenA > 80 && lenB > 80 && lenA > lenB / 3 && lenB > lenA / 3)
return { diffTargetMessage: msgB, diffPrevText: textA };
}
return { diffTargetMessage: undefined, diffPrevText: undefined };
}, [conversationMessages]);
// const { diffTargetMessage, diffPrevText } = React.useMemo(() => {
// const [msgB, msgA] = conversationMessages.filter(m => m.role === 'assistant').reverse();
// const textB = msgB ? singleTextOrThrow(msgB) : undefined;
// const textA = msgA ? singleTextOrThrow(msgA) : undefined;
// if (textB && textA && !msgB?.pendingIncomplete) {
// const lenA = textA.length, lenB = textB.length;
// if (lenA > 80 && lenB > 80 && lenA > lenB / 3 && lenB > lenA / 3)
// return { diffTargetMessage: msgB, diffPrevText: textA };
// }
// return { diffTargetMessage: undefined, diffPrevText: undefined };
// }, [conversationMessages]);
// scroll to the very bottom of a new chat
@@ -178,30 +277,39 @@ export function ChatMessageList(props: {
}, [conversationId, notifyBooting]);
// style memo
const listSx: SxProps = React.useMemo(() => ({
p: 0,
...props.sx,
// fix for the double-border on the last message (one by the composer, one to the bottom of the message)
// marginBottom: '-1px',
// layout
display: 'flex',
flexDirection: 'column',
}), [props.sx]);
// no conversation: sine qua non
if (!conversationId)
return <CMLZeroConversation onConversationNew={props.onConversationNew} />;
// no content: show the persona selector
const filteredMessages = conversationMessages
.filter(m => m.role !== 'system' || showSystemMessages); // hide the System message if the user choses to
const filteredMessages = excludeSystemMessages(conversationMessages, showSystemMessages);
if (!filteredMessages.length)
return (
<Box sx={{ ...props.sx }}>
{conversationId
? <PersonaSelector conversationId={conversationId} runExample={handleRunExample} />
: <InlineError severity='info' error='Select a conversation' sx={{ m: 2 }} />}
<PersonaSelector conversationId={conversationId} isMobile={props.isMobile} runExample={handleRunExample} />
</Box>
);
return (
<List sx={{
p: 0, ...(props.sx || {}),
// this makes sure that the the window is scrolled to the bottom (column-reverse)
display: 'flex',
flexDirection: 'column',
// fix for the double-border on the last message (one by the composer, one to the bottom of the message)
// marginBottom: '-1px',
}}>
<List role='chat-messages-list' sx={listSx}>
{optionalTranslationWarning}
@@ -212,13 +320,14 @@ export function ChatMessageList(props: {
onClose={() => props.setIsMessageSelectionMode(false)}
onSelectAll={handleSelectAll}
onDeleteMessages={handleSelectionDelete}
onHideMessages={handleSelectionHide}
/>
)}
{filteredMessages.map((message, idx, { length: count }) => {
{filteredMessages.map((message, idx) => {
// Optimization: if the component is going to change (e.g. the message is typing), we don't want to memoize it to not throw garbage in memory
const ChatMessageMemoOrNot = message.typing ? ChatMessage : ChatMessageMemo;
// Optimization: only memo complete components, or we'd be memoizing garbage
const ChatMessageMemoOrNot = !message.pendingIncomplete ? ChatMessageMemo : ChatMessage;
return props.isMessageSelectionMode ? (
@@ -234,33 +343,43 @@ export function ChatMessageList(props: {
<ChatMessageMemoOrNot
key={'msg-' + message.id}
message={message}
diffPreviousText={message === diffTargetMessage ? diffPrevText : undefined}
// diffPreviousText={message === diffTargetMessage ? diffPrevText : undefined}
fitScreen={props.fitScreen}
isBottom={idx === count - 1}
hasInReferenceTo={composerHasInReferenceto}
isMobile={props.isMobile}
isBottom={idx === filteredMessages.length - 1}
isImagining={isImagining}
isSpeaking={isSpeaking}
onConversationBranch={handleConversationBranch}
onConversationRestartFrom={handleConversationRestartFrom}
onConversationTruncate={handleConversationTruncate}
showAntPromptCaching={props.chatLLMAntPromptCaching}
showUnsafeHtmlCode={danger_experimentalHtmlWebUi}
onAddInReferenceTo={!composerCanAddInReferenceTo ? undefined : handleAddInReferenceTo}
onMessageAssistantFrom={handleMessageAssistantFrom}
onMessageBeam={handleMessageBeam}
onMessageBranch={handleMessageBranch}
onMessageContinue={handleMessageContinue}
onMessageDelete={handleMessageDelete}
onMessageEdit={handleMessageEdit}
onMessageFragmentAppend={handleMessageAppendFragment}
onMessageFragmentDelete={handleMessageDeleteFragment}
onMessageFragmentReplace={handleMessageReplaceFragment}
onMessageToggleUserFlag={handleMessageToggleUserFlag}
onMessageTruncate={handleMessageTruncate}
onTextDiagram={handleTextDiagram}
onTextImagine={handleTextImagine}
onTextSpeak={handleTextSpeak}
onTextImagine={capabilityHasT2I ? handleTextImagine : undefined}
onTextSpeak={isSpeakable ? handleTextSpeak : undefined}
/>
);
},
)}
{!!ephemerals.length && (
{/* Render ephemerals (sidebar ReAct output widgets) at the bottom */}
{!!ephemerals?.length && !!conversationHandler && (
<Ephemerals
ephemerals={ephemerals}
conversationId={props.conversationId}
conversationHandler={conversationHandler}
sx={{
mt: 'auto',
overflowY: 'auto',
minHeight: 64,
}}
/>
)}
@@ -1,151 +0,0 @@
import * as React from 'react';
import { Box, IconButton, ListDivider, ListItemDecorator, MenuItem, Switch, Tooltip } from '@mui/joy';
import AddIcon from '@mui/icons-material/Add';
import CheckBoxOutlineBlankOutlinedIcon from '@mui/icons-material/CheckBoxOutlineBlankOutlined';
import CheckBoxOutlinedIcon from '@mui/icons-material/CheckBoxOutlined';
import ClearIcon from '@mui/icons-material/Clear';
import CompressIcon from '@mui/icons-material/Compress';
import ForkRightIcon from '@mui/icons-material/ForkRight';
import HorizontalSplitIcon from '@mui/icons-material/HorizontalSplit';
import HorizontalSplitOutlinedIcon from '@mui/icons-material/HorizontalSplitOutlined';
import SettingsSuggestOutlinedIcon from '@mui/icons-material/SettingsSuggestOutlined';
import VerticalSplitIcon from '@mui/icons-material/VerticalSplit';
import VerticalSplitOutlinedIcon from '@mui/icons-material/VerticalSplitOutlined';
import type { DConversationId } from '~/common/state/store-chats';
import { KeyStroke } from '~/common/components/KeyStroke';
import { useOptimaDrawers } from '~/common/layout/optima/useOptimaDrawers';
import { useChatShowSystemMessages } from '../store-app-chat';
import { usePaneDuplicateOrClose } from './panes/usePanesManager';
export function ChatPageMenuItems(props: {
isMobile: boolean,
conversationId: DConversationId | null,
disableItems: boolean,
hasConversations: boolean,
isMessageSelectionMode: boolean,
onConversationBranch: (conversationId: DConversationId, messageId: string | null) => void,
onConversationClear: (conversationId: DConversationId) => void,
onConversationFlatten: (conversationId: DConversationId) => void,
// onConversationNew: (forceNoRecycle: boolean) => void,
setIsMessageSelectionMode: (isMessageSelectionMode: boolean) => void,
}) {
// external state
const { closePageMenu } = useOptimaDrawers();
const { canAddPane, isMultiPane, duplicateFocusedPane, removeOtherPanes } = usePaneDuplicateOrClose();
const [showSystemMessages, setShowSystemMessages] = useChatShowSystemMessages();
const handleIncreaseMultiPane = React.useCallback((event?: React.MouseEvent) => {
event?.stopPropagation();
// create a new pane with the current conversation
duplicateFocusedPane();
// load a brand new conversation inside
// FIXME: still testing this
// props.onConversationNew(true);
}, [duplicateFocusedPane]);
const handleToggleMultiPane = React.useCallback((_event: React.MouseEvent) => {
if (isMultiPane)
removeOtherPanes();
else
handleIncreaseMultiPane(undefined);
}, [handleIncreaseMultiPane, isMultiPane, removeOtherPanes]);
const closeMenu = (event: React.MouseEvent) => {
event.stopPropagation();
closePageMenu();
};
const handleConversationClear = (event: React.MouseEvent<HTMLDivElement>) => {
closeMenu(event);
props.conversationId && props.onConversationClear(props.conversationId);
};
const handleConversationBranch = (event: React.MouseEvent<HTMLDivElement>) => {
closeMenu(event);
props.conversationId && props.onConversationBranch(props.conversationId, null);
};
const handleConversationFlatten = (event: React.MouseEvent<HTMLDivElement>) => {
closeMenu(event);
props.conversationId && props.onConversationFlatten(props.conversationId);
};
const handleToggleMessageSelectionMode = (event: React.MouseEvent) => {
closeMenu(event);
props.setIsMessageSelectionMode(!props.isMessageSelectionMode);
};
const handleToggleSystemMessages = () => setShowSystemMessages(!showSystemMessages);
return <>
{/* System Message(s) */}
<MenuItem onClick={handleToggleSystemMessages}>
<ListItemDecorator><SettingsSuggestOutlinedIcon /></ListItemDecorator>
System messages
<Switch checked={showSystemMessages} onChange={handleToggleSystemMessages} sx={{ ml: 'auto' }} />
</MenuItem>
{/* Un /Split */}
<MenuItem onClick={handleToggleMultiPane}>
<ListItemDecorator>{props.isMobile
? (isMultiPane ? <HorizontalSplitIcon /> : <HorizontalSplitOutlinedIcon />)
: (isMultiPane ? <VerticalSplitIcon /> : <VerticalSplitOutlinedIcon />)
}</ListItemDecorator>
{/* Unsplit / Split text*/}
{isMultiPane ? 'Unsplit' : props.isMobile ? 'Split Down' : 'Split Right'}
{/* '+' */}
{isMultiPane && (
<Tooltip title='Add Another Split'>
<IconButton
size='sm'
variant='outlined'
disabled={!canAddPane}
onClick={handleIncreaseMultiPane}
sx={{ ml: 'auto', /*mr: '2px',*/ my: '-0.25rem' /* absorb the menuItem padding */ }}
>
<AddIcon />
</IconButton>
</Tooltip>
)}
</MenuItem>
<MenuItem disabled={props.disableItems} onClick={handleConversationBranch}>
<ListItemDecorator><ForkRightIcon /></ListItemDecorator>
Branch
</MenuItem>
<ListDivider />
<MenuItem disabled={props.disableItems} onClick={handleToggleMessageSelectionMode} sx={props.isMessageSelectionMode ? { fontWeight: 'lg' } : {}}>
<ListItemDecorator>{props.isMessageSelectionMode ? <CheckBoxOutlinedIcon /> : <CheckBoxOutlineBlankOutlinedIcon />}</ListItemDecorator>
Cleanup ...
</MenuItem>
<MenuItem disabled={props.disableItems} onClick={handleConversationFlatten}>
<ListItemDecorator><CompressIcon color='success' /></ListItemDecorator>
Compress ...
</MenuItem>
<ListDivider />
<MenuItem disabled={props.disableItems} onClick={handleConversationClear}>
<ListItemDecorator><ClearIcon /></ListItemDecorator>
<Box sx={{ flexGrow: 1, display: 'flex', justifyContent: 'space-between', gap: 1 }}>
Reset Chat
{!props.disableItems && <KeyStroke combo='Ctrl + Alt + X' />}
</Box>
</MenuItem>
</>;
}
+168 -87
View File
@@ -1,14 +1,22 @@
import * as React from 'react';
import type { SxProps } from '@mui/joy/styles/types';
import { Box, Grid, IconButton, Sheet, styled, Typography } from '@mui/joy';
import { SxProps } from '@mui/joy/styles/types';
import CloseRoundedIcon from '@mui/icons-material/CloseRounded';
import MaximizeIcon from '@mui/icons-material/Maximize';
import MinimizeIcon from '@mui/icons-material/Minimize';
import VerticalSplitIcon from '@mui/icons-material/VerticalSplit';
import VerticalSplitOutlinedIcon from '@mui/icons-material/VerticalSplitOutlined';
import { ConversationManager } from '~/common/chats/ConversationHandler';
import { DConversationId } from '~/common/state/store-chats';
import { DEphemeral } from '~/common/chats/EphemeralsStore';
import { lineHeightChatTextMd } from '~/common/app.theme';
import { ScaledTextBlockRenderer } from '~/modules/blocks/ScaledTextBlockRenderer';
import type { DEphemeral } from '~/common/chat-overlay/store-perchat-ephemerals_slice';
import { ConversationHandler } from '~/common/chat-overlay/ConversationHandler';
import { adjustContentScaling, ContentScaling, lineHeightChatTextMd } from '~/common/app.theme';
import { useUIPreferencesStore } from '~/common/state/store-ui';
// State Pane
const StateLine = styled(Typography)(({ theme }) => ({
textOverflow: 'ellipsis',
@@ -46,8 +54,7 @@ function ObjectRenderer({ name }: { name: string }) {
return <StateLine><b>{name}</b>: <i>object not displayed</i></StateLine>;
}
function StateRenderer(props: { state: object }) {
function StateRenderer(props: { state: object, contentScaling: ContentScaling }) {
if (typeof props.state !== 'object')
return <pre>Developer Warning: state is not an object: {JSON.stringify(props.state, null, 2)}</pre>;
@@ -55,10 +62,17 @@ function StateRenderer(props: { state: object }) {
return (
<Box>
<Typography fontSize='smaller' sx={{ mb: 1 }}>
## Internal State
</Typography>
<Sheet sx={{ p: 1 }}>
<ScaledTextBlockRenderer
text='**Internal State**'
contentScaling={props.contentScaling}
textRenderVariant='markdown'
/>
<Box sx={{
mt: 1,
p: 1,
borderRadius: 'md',
background: 'linear-gradient(180deg, var(--joy-palette-success-softHoverBg), transparent)',
}}>
{!entries && <Typography level='body-sm'>No state variables</Typography>}
{entries.map(([key, value]) =>
isPrimitive(value)
@@ -69,97 +83,164 @@ function StateRenderer(props: { state: object }) {
? <ObjectRenderer key={'state-' + key} name={key} />
: <Typography key={'state-' + key} level='body-sm'>{key}: {value}</Typography>,
)}
</Sheet>
</Box>
</Box>
);
}
function EphemeralItem({ conversationId, ephemeral }: { conversationId: string, ephemeral: DEphemeral }) {
const leftPaneSx = {
// <pre> looks
overflowWrap: 'anywhere',
whiteSpace: 'break-spaces',
// 'undo' some of the github-markdown CSS customizations
'.markdown-body': { mx: '0!important' },
'.markdown-body p': { mb: 0 },
};
const rightPaneSx = {
borderLeft: { md: `1px dashed` },
borderTop: { xs: `1px dashed`, md: 'none' },
};
function EphemeralItem(props: {
ephemeral: DEphemeral,
conversationHandler: ConversationHandler,
contentScaling: ContentScaling,
}) {
const { ephemeral, conversationHandler } = props;
// Event handlers
const handleDelete = React.useCallback(() => {
ConversationManager.getHandler(conversationId).ephemeralsStore.delete(ephemeral.id);
}, [conversationId, ephemeral.id]);
conversationHandler.overlayActions.ephemeralsDelete(ephemeral.id);
}, [conversationHandler, ephemeral.id]);
return <Box
sx={{
p: { xs: 1, md: 2 },
position: 'relative',
// border: (i < ephemerals.length - 1) ? `2px solid ${theme.palette.divider}` : undefined,
'&:hover > button': { opacity: 1 },
}}>
const handleToggleMinimized = React.useCallback(() => {
conversationHandler.overlayActions.ephemeralsToggleMinimized(ephemeral.id);
}, [conversationHandler, ephemeral.id]);
{/* Title */}
{ephemeral.title && <Typography level='title-sm' sx={{ mb: 1.5 }}>
{ephemeral.title} Development Tools
</Typography>}
{/* Vertical | split */}
<Grid container spacing={2}>
{/* Left pane (console) */}
<Grid xs={12} md={ephemeral.state ? 6 : 12}>
<Typography fontSize='smaller' sx={{ overflowWrap: 'anywhere', whiteSpace: 'break-spaces', lineHeight: lineHeightChatTextMd }}>
{ephemeral.text}
</Typography>
</Grid>
{/* Right pane (state) */}
{!!ephemeral.state && <Grid
xs={12} md={6}
sx={{
borderLeft: { md: `1px dashed` },
borderTop: { xs: `1px dashed`, md: 'none' },
}}>
<StateRenderer state={ephemeral.state} />
</Grid>}
</Grid>
{/* Close button (right of title) */}
<IconButton
size='sm'
onClick={handleDelete}
sx={{
position: 'absolute', top: 8, right: 8,
opacity: { xs: 1, sm: 0.5 }, transition: 'opacity 0.3s',
}}>
<CloseRoundedIcon />
</IconButton>
</Box>;
}
// const dashedBorderSVG = encodeURIComponent(`
// <svg xmlns='http://www.w3.org/2000/svg' width='100%' height='100%'>
// <rect x='0' y='0' width='100%' height='100%' fill='none' stroke='currentColor' stroke-width='2' stroke-dasharray='16, 2' />
// </svg>
// `);
const handleToggleShowState = React.useCallback(() => {
conversationHandler.overlayActions.ephemeralsToggleShowStatePane(ephemeral.id);
}, [conversationHandler, ephemeral.id]);
export function Ephemerals(props: { ephemerals: DEphemeral[], conversationId: DConversationId | null, sx?: SxProps }) {
// global state
// const ephemerals = useChatStore(state => {
// const conversation = state.conversations.find(conversation => conversation.id === props.conversationId);
// return conversation ? conversation.ephemerals : [];
// }, shallow);
const ephemerals = props.ephemerals;
// if (!ephemerals?.length) return null;
const showStatePane = ephemeral.showStatePane && !!ephemeral.state;
return (
<Sheet
variant='soft' color='success' invertedColors
sx={{
borderTop: '1px solid',
borderTopColor: 'divider',
// backgroundImage: `url("data:image/svg+xml,${dashedBorderSVG.replace('currentColor', '%23A1E8A1')}")`,
// backgroundSize: '100% 100%',
// backgroundRepeat: 'no-repeat',
...(props.sx || {}),
<Box sx={{
borderTop: '1px solid',
borderTopColor: 'divider',
// border: (i < ephemerals.length - 1) ? `2px solid ${theme.palette.divider}` : undefined,
display: 'flex',
flexDirection: 'column',
}}>
{/* Top Line - Title and Buttons */}
<Box sx={{
py: 1,
px: { xs: 1, md: 2 },
backgroundColor: 'success.softHoverBg',
display: 'flex',
gap: 1,
alignItems: 'center'
}}>
{ephemerals.map((ephemeral, i) =>
props.conversationId && <EphemeralItem key={`ephemeral-${i}`} conversationId={props.conversationId} ephemeral={ephemeral} />)}
<Typography level='title-sm' sx={{ flex: 1, color: 'success.solidBg' }}>
{ephemeral.title} Internal Monologue
</Typography>
{/* Show State */}
{!ephemeral.minimized && (
<IconButton
size='sm'
variant={ephemeral.showStatePane ? 'solid' : 'outlined'}
onClick={handleToggleShowState}
>
{ephemeral.showStatePane ? <VerticalSplitIcon /> : <VerticalSplitOutlinedIcon />}
</IconButton>
)}
{/* Minimize/Expand Button */}
<IconButton
size='sm'
variant={'outlined'}
onClick={handleToggleMinimized}
>
{ephemeral.minimized ? <MaximizeIcon /> : <MinimizeIcon />}
</IconButton>
{/* Close */}
<IconButton
size='sm'
variant={ephemeral.done ? 'solid' : 'outlined'}
onClick={handleDelete}
>
<CloseRoundedIcon />
</IconButton>
</Box>
{/* Content */}
{!ephemeral.minimized && <Box sx={{
py: 1,
px: { xs: 1, md: 2 },
}}>
{/* Content Grid */}
<Grid container spacing={2} sx={{ mt: 0.5 }}>
{/* Left pane (log) */}
<Grid xs={12} md={showStatePane ? 6 : 12}>
{/* New renderer, with */}
<Box sx={leftPaneSx}>
<ScaledTextBlockRenderer
text={ephemeral.text}
contentScaling={props.contentScaling}
textRenderVariant='markdown'
/>
</Box>
</Grid>
{/* Right pane (state) */}
{showStatePane && (
<Grid xs={12} md={6} sx={rightPaneSx}>
<StateRenderer
state={ephemeral.state}
contentScaling={props.contentScaling}
/>
</Grid>
)}
</Grid>
</Box>}
</Box>
);
}
export function Ephemerals(props: {
ephemerals: DEphemeral[],
conversationHandler: ConversationHandler,
sx?: SxProps
}) {
// external state
const adjContentScaling = useUIPreferencesStore(state => adjustContentScaling(state.contentScaling, -1));
return (
<Sheet variant='soft' color='success' invertedColors sx={props.sx}>
{props.ephemerals.map((ephemeral, i) => (
<EphemeralItem
key={ephemeral.id}
ephemeral={ephemeral}
conversationHandler={props.conversationHandler}
contentScaling={adjContentScaling}
/>
))}
</Sheet>
);
+228
View File
@@ -0,0 +1,228 @@
import * as React from 'react';
import { useShallow } from 'zustand/react/shallow';
import type { SxProps } from '@mui/joy/styles/types';
import { Box, IconButton, styled, Typography } from '@mui/joy';
import CloseRoundedIcon from '@mui/icons-material/CloseRounded';
import ExpandLessIcon from '@mui/icons-material/ExpandLess';
import MinimizeIcon from '@mui/icons-material/Minimize';
// import { isMacUser } from '~/common/util/pwaUtils';
import type { ShortcutObject } from '~/common/components/shortcuts/useGlobalShortcuts';
import { ConfirmationModal } from '~/common/components/modals/ConfirmationModal';
import { GoodTooltip } from '~/common/components/GoodTooltip';
import { useGlobalShortcutsStore } from '~/common/components/shortcuts/store-global-shortcuts';
import { useOverlayComponents } from '~/common/layout/overlays/useOverlayComponents';
import { useUXLabsStore } from '~/common/state/store-ux-labs';
// configuration
const COMPOSER_ENABLE_MINIMIZE = false;
const hideButtonTooltip = (
<Box sx={{ px: 1, py: 0.75, lineHeight: '1.5rem' }}>
Hide Shortcuts<br />
Enable again in Settings &gt; Labs
</Box>
);
const hideButtonSx: SxProps = {
'--IconButton-size': '28px',
'--Icon-fontSize': '16px',
'--Icon-color': 'var(--joy-palette-text-tertiary)',
mr: -0.5,
};
// const animateAppear = keyframes`
// from {
// opacity: 0;
// transform: translateY(10px);
// }
// to {
// opacity: 1;
// transform: translateY(0);
// }
// `;
const StatusBarContainer = styled(Box)({
borderBottom: '1px solid',
// borderBottomColor: 'var(--joy-palette-divider)',
borderBottomColor: 'rgba(var(--joy-palette-neutral-mainChannel) / 0.1)',
// borderTopColor: 'rgba(var(--joy-palette-neutral-mainChannel, 99 107 116) / 0.4)',
// backgroundColor: 'var(--joy-palette-background-surface)',
// paddingBlock: '0.25rem',
paddingInline: '0.5rem',
// layout
display: 'flex',
flexFlow: 'row nowrap',
columnGap: '1.5rem', // space between shortcuts
lineHeight: '1em',
// animation: `${animateAppear} 0.3s ease-out`,
// transition: 'all 0.2s ease',
// '&:hover': {
// backgroundColor: 'var(--joy-palette-background-level1)',
// },
});
const ShortcutContainer = styled(Box)({
display: 'flex',
alignItems: 'center',
whiteSpace: 'nowrap',
gap: '2px', // space between modifiers
marginBlock: '0.25rem',
// transition: 'transform 0.2s ease',
// '&:hover': {
// transform: 'scale(1.05)',
// },
'&:hover > div': {
backgroundColor: 'var(--joy-palette-background-level1)',
},
cursor: 'pointer',
[`&[aria-disabled="true"]`]: {
opacity: 0.5,
pointerEvents: 'none',
}
});
const ShortcutKey = styled(Box)({
fontSize: 'var(--joy-fontSize-xs)',
fontWeight: 'var(--joy-fontWeight-md)',
border: '1px solid',
borderColor: 'var(--joy-palette-neutral-outlinedBorder)',
borderRadius: 'var(--joy-radius-xs)',
// backgroundColor: 'var(--joy-palette-neutral-outlinedBorder)',
backgroundColor: 'var(--joy-palette-background-popup)',
// boxShadow: 'inset 2px 0px 4px -2px var(--joy-palette-background-backdrop)',
boxShadow: 'var(--joy-shadow-xs)',
// minWidth: '1rem',
paddingBlock: '1px',
paddingInline: '4px',
// pointerEvents: 'none',
cursor: 'pointer',
transition: 'background-color 1s ease',
});
// Display mac-style shortcuts on windows as well
const displayMacModifiers = true;
function _platformAwareModifier(symbol: 'Ctrl' | 'Alt' | 'Shift') {
switch (symbol) {
case 'Ctrl':
return displayMacModifiers ? '⌃' : 'Ctrl';
case 'Shift':
return displayMacModifiers ? '⇧' : '⇧';
case 'Alt':
return displayMacModifiers ? '⌥' /* Option */ : 'Alt';
}
}
function ShortcutItem(props: { shortcut: ShortcutObject }) {
const handleClicked = React.useCallback(() => {
if (props.shortcut.action !== '_specialPrintShortcuts')
props.shortcut.action();
}, [props.shortcut]);
return (
<ShortcutContainer onClick={!props.shortcut.disabled ? handleClicked : undefined} aria-disabled={props.shortcut.disabled}>
{!!props.shortcut.ctrl && <ShortcutKey>{_platformAwareModifier('Ctrl')}</ShortcutKey>}
{!!props.shortcut.shift && <ShortcutKey>{_platformAwareModifier('Shift')}</ShortcutKey>}
{/*{!!props.shortcut.altForNonMac && <ShortcutKey onClick={handleClicked}>{_platformAwareModifier('Alt')}</ShortcutKey>}*/}
<ShortcutKey>{props.shortcut.key === 'Escape' ? 'Esc' : props.shortcut.key === 'Enter' ? '↵' : props.shortcut.key.toUpperCase()}</ShortcutKey>
&nbsp;<Typography level='body-xs'>{props.shortcut.description}</Typography>
{props.shortcut.endDecoratorIcon && <props.shortcut.endDecoratorIcon sx={{ fontSize: 'md' }} />}
</ShortcutContainer>
);
}
export function StatusBar(props: { toggleMinimized?: () => void, isMinimized?: boolean }) {
// state (modifiers pressed/not)
const { showPromisedOverlay } = useOverlayComponents();
// const [ctrlPressed, setCtrlPressed] = React.useState(false);
// const [shiftPressed, setShiftPressed] = React.useState(false);
// external state
const labsShowShortcutBar = useUXLabsStore(state => state.labsShowShortcutBar);
const shortcuts = useGlobalShortcutsStore(useShallow(state => {
let visibleShortcuts = !labsShowShortcutBar ? [] : state.getAllShortcuts().filter(shortcut => !!shortcut.description);
const maxLevel = Math.max(...visibleShortcuts.map(s => s.level ?? 0));
if (maxLevel > 0)
visibleShortcuts = visibleShortcuts.filter(s => s.level === maxLevel);
visibleShortcuts.sort((a, b) => {
// if they don't have a 'shift', they are sorted first
if (a.shift !== b.shift)
return a.shift ? 1 : -1;
// (Hack) If the description is 'Beam', it goes last
if (a.description === 'Beam Edit')
return 1;
// alphabetical for the rest
return a.key.localeCompare(b.key);
});
return visibleShortcuts;
}));
// handlers
const handleHideShortcuts = React.useCallback((event: React.MouseEvent) => {
if (event.shiftKey) {
console.log('shortcutGroups', useGlobalShortcutsStore.getState().shortcutGroups);
return;
}
showPromisedOverlay('shortcuts-confirm-close', {}, ({ onResolve, onUserReject }) =>
<ConfirmationModal
open onClose={onUserReject} onPositive={() => onResolve(true)}
confirmationText='Remove productivity tips and shortcuts? You can add it back in Settings > Labs.'
positiveActionText='Remove'
/>,
).then(() => useUXLabsStore.getState().setLabsShowShortcutBar(false)).catch(() => null /* ignore closure */);
}, [showPromisedOverlay]);
// React to modifiers
// React.useEffect(() => {
// const handleKeyDown = (e: KeyboardEvent) => {
// if (e.key === 'Control') setCtrlPressed(true);
// if (e.key === 'Shift') setShiftPressed(true);
// };
// const handleKeyUp = (e: KeyboardEvent) => {
// if (e.key === 'Control') setCtrlPressed(false);
// if (e.key === 'Shift') setShiftPressed(false);
// };
// window.addEventListener('keydown', handleKeyDown);
// window.addEventListener('keyup', handleKeyUp);
// return () => {
// window.removeEventListener('keydown', handleKeyDown);
// window.removeEventListener('keyup', handleKeyUp);
// };
// }, []);
if (!labsShowShortcutBar)
return null;
return (
<StatusBarContainer aria-label='Status bar'>
{(!props.toggleMinimized || !COMPOSER_ENABLE_MINIMIZE) && !props.isMinimized ? (
// Close Button
<GoodTooltip variantOutlined arrow placement='top' title={hideButtonTooltip}>
<IconButton size='sm' sx={hideButtonSx} onClick={handleHideShortcuts}>
<CloseRoundedIcon />
</IconButton>
</GoodTooltip>
) : (
// Minimize / Maximize Button - note the Maximize icon would be more correct, but also less discoverable
<IconButton size='sm' sx={hideButtonSx} onClick={props.toggleMinimized}>
{props.isMinimized ? <ExpandLessIcon /> : <MinimizeIcon />}
</IconButton>
)}
{/* Show all shortcuts */}
{shortcuts.map((shortcut, idx) => (
<ShortcutItem key={shortcut.key + idx} shortcut={shortcut} />
))}
</StatusBarContainer>
);
}
-137
View File
@@ -1,137 +0,0 @@
import * as React from 'react';
import type { SxProps } from '@mui/joy/styles/types';
import { Alert, Box, Sheet, Typography } from '@mui/joy';
import { ConversationHandler } from '~/common/chats/ConversationHandler';
import { useBeam } from '~/common/chats/BeamStore';
import { useLLMSelect } from '~/common/components/forms/useLLMSelect';
export function Beam(props: {
conversationHandler: ConversationHandler | null,
isMobile: boolean,
sx?: SxProps
}) {
// state
const { config, candidates } = useBeam(props.conversationHandler);
// external state
const [allChatLlm, allChatLlmComponent] = useLLMSelect(true, 'Beam LLM');
if (!config)
return null;
const lastMessage = config.history.slice(-1)[0] ?? null;
return (
<Box sx={{ ...props.sx, px: 2, display: 'flex', flexDirection: 'column', gap: 2 }}>
{/* Issues */}
{!!config.configError && (
<Alert>
{config.configError}
</Alert>
)}
{/* Models, [x] all same, */}
<Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'start', gap: 2 }}>
<Box sx={{ minWidth: 200 }}>
{allChatLlmComponent}
</Box>
{!!lastMessage && (
<Box sx={{
backgroundColor: 'background.surface',
boxShadow: 'xs',
borderRadius: 'lg',
borderTopRightRadius: 0,
borderTopLeftRadius: 0,
py: 1,
px: 1,
mb: 'auto',
flex: 1,
}}>
{lastMessage.text}
</Box>
// <ChatMessageMemo
// message={lastMessage}
// fitScreen={props.isMobile}
// sx={{
// borderRadius: 'lg',
// borderBottomRightRadius: lastMessage.role === 'assistant' ? undefined : 0,
// borderBottomLeftRadius: lastMessage.role === 'user' ? undefined : 0,
// boxShadow: 'xs',
// my: 2,
// px: 0,
// py: 1,
// alignSelf: 'self-end',
// flex: 1,
// maxHeight: '5rem',
// overflow: 'hidden',
// }}
// />
)}
</Box>
{/* Grid */}
<Box sx={{
// my: 'auto',
// display: 'flex', flexDirection: 'column', alignItems: 'center',
border: '1px solid purple',
minHeight: '300px',
// layout
display: 'grid',
gridTemplateColumns: props.isMobile ? 'repeat(auto-fit, minmax(320px, 1fr))' : 'repeat(auto-fit, minmax(400px, 1fr))',
gap: { xs: 2, md: 2 },
}}>
<Sheet sx={{ minHeight: '50%' }}>
b
</Sheet>
<Sheet>
a
</Sheet>
<Sheet>
a
</Sheet>
<Sheet>
a
</Sheet>
</Box>
{/* Auto-Gatherer: All-in-one, Best-Of */}
<Box>
Gatherer
</Box>
<Box sx={{ flex: 1 }}>
<Typography level='body-sm' sx={{ whiteSpace: 'break-spaces' }}>
{/*{JSON.stringify(config, null, 2)}*/}
</Typography>
</Box>
<Box sx={{
height: '100%',
borderRadius: 'lg',
borderBottomLeftRadius: 0,
backgroundColor: 'background.surface',
boxShadow: 'lg',
m: 2,
p: '0.25rem 1rem',
}}>
</Box>
<Box>
a
</Box>
</Box>
);
}
@@ -1,25 +1,71 @@
import * as React from 'react';
import { Box, Button, IconButton, Modal, ModalClose, Option, Select, Sheet, Typography } from '@mui/joy';
import CameraAltIcon from '@mui/icons-material/CameraAlt';
import type { SxProps } from '@mui/joy/styles/types';
import { Box, Button, ButtonGroup, IconButton, Modal, ModalClose, Option, Select, Sheet, Tooltip, Typography } from '@mui/joy';
import AddRoundedIcon from '@mui/icons-material/AddRounded';
import CameraEnhanceIcon from '@mui/icons-material/CameraEnhance';
import CameraFrontIcon from '@mui/icons-material/CameraFront';
import CameraRearIcon from '@mui/icons-material/CameraRear';
import DownloadIcon from '@mui/icons-material/Download';
import InfoIcon from '@mui/icons-material/Info';
import FlipCameraAndroidOutlinedIcon from '@mui/icons-material/FlipCameraAndroidOutlined';
import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';
import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
import { InlineError } from '~/common/components/InlineError';
import { downloadVideoFrameAsPNG, renderVideoFrameAsPNGFile } from '~/common/util/videoUtils';
import { Is } from '~/common/util/pwaUtils';
import { animationBackgroundCameraFlash } from '~/common/util/animUtils';
import { downloadVideoFrame, renderVideoFrameAsFile } from '~/common/util/videoUtils';
import { useCameraCapture } from '~/common/components/useCameraCapture';
// configuration
const DEBUG_NO_CAMERA_OPTION = false;
const FLASH_DURATION_MS = 600;
const ADD_COOLDOWN_MS = 300;
const captureButtonContainerSx: SxProps = {
display: 'flex',
gap: 1,
justifyContent: 'space-between',
alignItems: 'center',
};
const captureButtonGroupSx: SxProps = {
'--ButtonGroup-separatorColor': 'none !important',
// '--ButtonGroup-separatorSize': '2px',
borderRadius: '3rem',
// boxShadow: 'md',
boxShadow: '0 8px 12px -6px rgb(var(--joy-palette-neutral-darkChannel) / 50%)',
};
const captureButtonSx: SxProps = {
backgroundColor: 'neutral.solidHoverBg',
pl: 3.25,
pr: 4.5,
py: 1.5,
minWidth: { md: 200 },
'&:hover': {
backgroundColor: 'neutral.plainHoverColor',
},
};
const addButtonSx: SxProps = {
pl: 2.5,
pr: 2,
};
export function CameraCaptureModal(props: {
onCloseModal: () => void,
onAttachImage: (file: File) => void
onCloseModal: () => void;
onAttachImage: (file: File) => void;
// onOCR: (ocrText: string) => void }
}) {
// state
const [showInfo, setShowInfo] = React.useState(false);
// const [ocrProgress/*, setOCRProgress*/] = React.useState<number | null>(null);
const [isFlashing, setIsFlashing] = React.useState(false); // For flash effect
const [isAddButtonDisabled, setIsAddButtonDisabled] = React.useState(false); // Cooldown state
// external state
const {
@@ -39,29 +85,28 @@ export function CameraCaptureModal(props: {
onCloseModal();
}, [onCloseModal, resetVideo]);
/*const handleVideoOCRClicked = async () => {
if (!videoRef.current) return;
const renderedFrame = renderVideoFrameToCanvas(videoRef.current);
setOCRProgress(0);
const { recognize } = await import('tesseract.js');
const result = await recognize(renderedFrame, undefined, {
logger: m => {
// noinspection SuspiciousTypeOfGuard
if (typeof m.progress === 'number')
setOCRProgress(m.progress);
},
errorHandler: e => console.error(e),
});
setOCRProgress(null);
stopAndClose();
props.onOCR(result.data.text);
};*/
const handleFlashEffect = React.useCallback((cooldownMs: number) => {
// Flash effect
setIsFlashing(true);
setTimeout(() => {
setIsFlashing(false);
}, FLASH_DURATION_MS); // Flash duration in milliseconds
// Cooldown
if (cooldownMs) {
setIsAddButtonDisabled(true);
setTimeout(() => {
setIsAddButtonDisabled(false);
}, cooldownMs);
}
}, []);
const handleVideoSnapClicked = React.useCallback(async () => {
if (!videoRef.current) return;
try {
const file = await renderVideoFrameAsPNGFile(videoRef.current, 'camera');
// handleFlashEffect(0); // Trigger flash
const file = await renderVideoFrameAsFile(videoRef.current, 'camera', 'image/jpeg', 0.95);
onAttachImage(file);
stopAndClose();
} catch (error) {
@@ -69,96 +114,250 @@ export function CameraCaptureModal(props: {
}
}, [onAttachImage, stopAndClose, videoRef]);
const handleVideoDownloadClicked = React.useCallback(() => {
const handleVideoAddClicked = React.useCallback(async () => {
if (!videoRef.current) return;
downloadVideoFrameAsPNG(videoRef.current, 'camera');
try {
handleFlashEffect(ADD_COOLDOWN_MS); // Trigger flash and cooldown
const file = await renderVideoFrameAsFile(videoRef.current, 'camera', 'image/jpeg', 0.95);
onAttachImage(file);
} catch (error) {
console.error('Error capturing video frame:', error);
}
}, [handleFlashEffect, onAttachImage, videoRef]);
const handleVideoDownloadClicked = React.useCallback(async () => {
if (!videoRef.current) return;
await downloadVideoFrame(videoRef.current, 'camera', 'image/jpeg', 0.98);
}, [videoRef]);
// Reduced set of cameras
const displayCameras = React.useMemo(() => {
// iOS/English: "Front Camera", "Back Camera"
if (Is.OS.iOS) {
let reducedCameras = cameras.filter((device) => ['Front Camera', 'Back Camera'].includes(device.label));
if (reducedCameras.length > 0)
return reducedCameras;
}
return cameras;
}, [cameras]);
const { canSwitchCameras, isFrontCamera, isBackCamera } = React.useMemo(() => {
// determine if the current device is a front or back camera
let isFrontCamera = false;
let isBackCamera = false;
if (cameraIdx !== -1) {
const currentDevice = displayCameras[cameraIdx];
if (currentDevice) {
isFrontCamera = currentDevice.label.includes('Front Camera') || currentDevice.label.toLowerCase().includes('front');
isBackCamera = currentDevice.label.includes('Back Camera') || currentDevice.label.toLowerCase().includes('back');
}
}
// quick out if we only have 1 or 0 cameras
if (displayCameras.length <= 1)
return { canSwitchCameras: false, isFrontCamera, isBackCamera };
// use a reduction to find both the front and back cameras
const foundCameras = displayCameras.reduce((acc, device) => {
if (acc.front && acc.back) return acc;
if (device.label.includes('Front Camera')) acc.front = true;
else if (device.label.toLowerCase().includes('front')) acc.front = true;
if (device.label.includes('Back Camera')) acc.back = true;
else if (device.label.toLowerCase().includes('back')) acc.back = true;
return acc;
}, { front: false, back: false });
return { canSwitchCameras: (foundCameras.front && foundCameras.back) || displayCameras.length === 2, isFrontCamera, isBackCamera };
}, [cameraIdx, displayCameras]);
const handleCameraSwitch = React.useCallback(() => {
// safety checks: has multiple cameras, and current camera is valid
if (displayCameras.length <= 1 || cameraIdx === -1) return;
const currentCamera = displayCameras[cameraIdx] || undefined;
if (!currentCamera) return;
// finds the camera to switch to
let nextIdx: number | undefined = undefined;
// iOS
if (currentCamera.label.includes('Front Camera'))
nextIdx = displayCameras.findIndex((device) => device.label.includes('Back Camera'));
else if (currentCamera.label.includes('Back Camera'))
nextIdx = displayCameras.findIndex((device) => device.label.includes('Front Camera'));
// Android
if (nextIdx === undefined && currentCamera.label.includes('facing front'))
nextIdx = displayCameras.map((device) => device.label).findLastIndex((label) => label.includes('facing back'));
else if (nextIdx === undefined && currentCamera.label.includes('facing back'))
nextIdx = displayCameras.map((device) => device.label).findLastIndex((label) => label.includes('facing front'));
// Generic: if we have 2 cameras, flip to the other one
if (nextIdx === undefined && displayCameras.length === 2)
nextIdx = cameraIdx === 0 ? 1 : 0;
// if we found a valid camera, switch to it
if (nextIdx !== undefined && nextIdx !== -1)
setCameraIdx(nextIdx);
}, [cameraIdx, displayCameras, setCameraIdx]);
return (
<Modal open onClose={stopAndClose} sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
<Modal
open
onClose={stopAndClose}
sx={{
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
}}
slotProps={{
backdrop: {
sx: {
backdropFilter: 'none', // using none because this is heavy
// backdropFilter: 'blur(4px)',
// backgroundColor: 'rgba(11 13 14 / 0.75)',
backgroundColor: 'rgba(var(--joy-palette-neutral-darkChannel) / 0.5)',
},
},
}}
>
<Box sx={{
display: 'flex', flexDirection: 'column', m: 1,
borderRadius: 'md', overflow: 'hidden',
boxShadow: 'sm',
boxShadow: 'lg',
}}>
{/* Top bar */}
<Sheet variant='solid' invertedColors sx={{ zIndex: 10, display: 'flex', justifyContent: 'space-between', p: 1 }}>
<Select
variant='solid' color='neutral'
value={cameraIdx} onChange={(_event: any, value: number | null) => setCameraIdx(value === null ? -1 : value)}
indicator={<KeyboardArrowDownIcon />}
>
<Option value={-1}>
No Camera
</Option>
{cameras.map((device: MediaDeviceInfo, camIndex) => (
<Option key={'video-dev-' + camIndex} value={camIndex}>
{device.label}
</Option>
))}
</Select>
<Sheet variant='solid' invertedColors={true} sx={{
p: 1,
backgroundColor: 'neutral.800',
display: 'flex',
justifyContent: 'space-between',
}}>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
<Select
size='sm'
variant={displayCameras.length > 1 ? 'soft' : 'plain'}
color='neutral'
value={cameraIdx} onChange={(_event: any, value: number | null) => setCameraIdx(value === null ? -1 : value)}
indicator={<KeyboardArrowDownIcon />}
sx={{ background: 'transparent' }}
slotProps={{ listbox: { size: 'md' } }}
>
{(!displayCameras.length || DEBUG_NO_CAMERA_OPTION) && (
<Option key='video-dev-none' value={-1}>
No Camera
</Option>
)}
{displayCameras.map((device: MediaDeviceInfo, camIndex) => (
<Option key={'video-dev-' + camIndex} value={camIndex}>
{/*{device.label?.includes('Face') ? <CameraFrontIcon />*/}
{/* : device.label?.includes('tual') ? <CameraRearIcon />*/}
{/* : null}*/}
{device.label
?.replace('camera2 ', 'Camera ')
.replace('facing front', 'Front')
.replace('facing back', 'Back')}
</Option>
))}
</Select>
<ModalClose onClick={stopAndClose} sx={{ position: 'static' }} />
{canSwitchCameras && (
<IconButton size='sm' onClick={handleCameraSwitch}>
{isFrontCamera ? <CameraRearIcon /> : isBackCamera ? <CameraFrontIcon /> : <FlipCameraAndroidOutlinedIcon />}
</IconButton>
)}
</Box>
<ModalClose size='lg' onClick={stopAndClose} sx={{ position: 'static' }} />
</Sheet>
{/* (main) Video */}
<Box sx={{ position: 'relative' }}>
<Box sx={{ position: 'relative', backgroundColor: 'background.level3' }}>
<video
ref={videoRef} autoPlay playsInline
style={{
display: 'block', width: '100%', maxHeight: 'calc(100vh - 200px)',
display: 'block',
width: !Is.Browser.Safari ? '100%' : undefined,
marginLeft: 'auto', marginRight: 'auto',
maxHeight: 'calc(100vh - 200px)',
background: '#8888', //opacity: ocrProgress !== null ? 0.5 : 1,
}}
/>
{showInfo && !!info && <Typography
sx={{
position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, zIndex: 1,
background: 'rgba(0,0,0,0.5)', color: 'white',
whiteSpace: 'pre', overflowY: 'scroll',
}}>
{info}
</Typography>}
{/* Flash overlay */}
{isFlashing && (
<Box
sx={{
position: 'absolute', inset: 0, zIndex: 2,
animation: `${animationBackgroundCameraFlash} ${FLASH_DURATION_MS / 1000}s`,
}}
/>
)}
{showInfo && !!info && (
<Typography
sx={{
position: 'absolute', inset: 0, zIndex: 1, /* camera info on top of video */
background: 'rgba(0,0,0,0.5)', color: 'white',
whiteSpace: 'pre', overflowY: 'scroll',
}}>
{info}
</Typography>
)}
{/*{ocrProgress !== null && <CircularProgress sx={{ position: 'absolute', top: 'calc(50% - 34px / 2)', left: 'calc(50% - 34px / 2)', zIndex: 2 }} />}*/}
</Box>
{/* Bottom controls (zoom, ocr, download) & progress */}
<Sheet variant='soft' sx={{ display: 'flex', flexDirection: 'column', zIndex: 20, gap: 1, p: 1 }}>
{/* Bottom controls (zoom, download) & progress */}
<Sheet
variant='soft'
sx={{
p: 1,
display: 'flex',
flexDirection: 'column',
gap: 1,
}}
>
{!!error && <InlineError error={error} />}
{zoomControl}
{/*{ocrProgress !== null && <LinearProgress color='primary' determinate value={100 * ocrProgress} sx={{ px: 2 }} />}*/}
<Box sx={{ display: 'flex', gap: 1, justifyContent: 'space-between' }}>
<Box paddingBottom={zoomControl ? 1 : undefined} sx={captureButtonContainerSx}>
{/* Info */}
<IconButton size='lg' disabled={!info} variant='soft' onClick={() => setShowInfo(info => !info)} sx={{ zIndex: 30 }}>
<InfoIcon />
<IconButton disabled={!info} onClick={() => setShowInfo((prev) => !prev)}>
<InfoOutlinedIcon />
</IconButton>
{/*<Button disabled={ocrProgress !== null} fullWidth variant='solid' size='lg' onClick={handleVideoOCRClicked} sx={{ flex: 1, maxWidth: 260 }}>*/}
{/* Extract Text*/}
{/*</Button>*/}
{/* Capture */}
<Button
fullWidth
variant='solid' color='neutral'
onClick={handleVideoSnapClicked}
endDecorator={<CameraAltIcon />}
sx={{ flex: 1, maxWidth: 200, py: 2, borderRadius: '3rem' }}
>
Capture
</Button>
<ButtonGroup variant='solid' sx={captureButtonGroupSx}>
<Tooltip disableInteractive arrow placement='top' title='Add to message'>
<IconButton size='sm' disabled={isAddButtonDisabled} onClick={handleVideoAddClicked} sx={addButtonSx}>
<AddRoundedIcon />
</IconButton>
</Tooltip>
<Button size='lg' onClick={handleVideoSnapClicked} endDecorator={<CameraEnhanceIcon />} sx={captureButtonSx}>
Capture
</Button>
</ButtonGroup>
{/* Download */}
<IconButton size='lg' variant='soft' onClick={handleVideoDownloadClicked}>
<IconButton onClick={handleVideoDownloadClicked}>
<DownloadIcon />
</IconButton>
</Box>
</Sheet>
@@ -1,94 +0,0 @@
import * as React from 'react';
import { Box, MenuItem, Radio, Typography } from '@mui/joy';
import { CloseableMenu } from '~/common/components/CloseableMenu';
import { KeyStroke } from '~/common/components/KeyStroke';
import { useUIPreferencesStore } from '~/common/state/store-ui';
import { ChatModeId } from '../../AppChat';
import { useUXLabsStore } from '~/common/state/store-ux-labs';
interface ChatModeDescription {
label: string;
description: string | React.JSX.Element;
shortcut?: string;
requiresTTI?: boolean;
}
const ChatModeItems: { [key in ChatModeId]: ChatModeDescription } = {
'generate-text': {
label: 'Chat',
description: 'Persona replies',
},
'append-user': {
label: 'Write',
description: 'Appends a message',
shortcut: 'Alt + Enter',
},
'generate-image': {
label: 'Draw',
description: 'AI Image Generation',
requiresTTI: true,
},
'generate-text-beam': {
label: 'Best-Of', // Best of, Auto-Prime, Top Pick, Select Best
description: 'Smarter: best of multiple replies',
},
'generate-react': {
label: 'Reason + Act', // · α
description: 'Answers questions in multiple steps',
},
};
function fixNewLineShortcut(shortcut: string, enterIsNewLine: boolean) {
if (shortcut === 'ENTER')
return enterIsNewLine ? 'Shift + Enter' : 'Enter';
return shortcut;
}
export function ChatModeMenu(props: {
anchorEl: HTMLAnchorElement | null, onClose: () => void,
chatModeId: ChatModeId, onSetChatModeId: (chatMode: ChatModeId) => void
capabilityHasTTI: boolean,
}) {
// external state
const labsChatBeam = useUXLabsStore(state => state.labsChatBeam);
const enterIsNewline = useUIPreferencesStore(state => state.enterIsNewline);
return (
<CloseableMenu
placement='top-end'
open anchorEl={props.anchorEl} onClose={props.onClose}
sx={{ minWidth: 320 }}
>
{/*<MenuItem color='neutral' selected>*/}
{/* Conversation Mode*/}
{/*</MenuItem>*/}
{/**/}
{/*<ListDivider />*/}
{/* ChatMode items */}
{Object.entries(ChatModeItems)
.filter(([key, data]) => key !== 'generate-text-beam' || labsChatBeam)
.map(([key, data]) =>
<MenuItem key={'chat-mode-' + key} onClick={() => props.onSetChatModeId(key as ChatModeId)}>
<Box sx={{ flexGrow: 1, display: 'flex', flexDirection: 'row', alignItems: 'center', gap: 2 }}>
<Radio checked={key === props.chatModeId} />
<Box sx={{ flexGrow: 1 }}>
<Typography>{data.label}</Typography>
<Typography level='body-xs'>{data.description}{(data.requiresTTI && !props.capabilityHasTTI) ? 'Unconfigured' : ''}</Typography>
</Box>
{(key === props.chatModeId || !!data.shortcut) && (
<KeyStroke combo={fixNewLineShortcut((key === props.chatModeId) ? 'ENTER' : data.shortcut ? data.shortcut : 'ENTER', enterIsNewline)} />
)}
</Box>
</MenuItem>)}
</CloseableMenu>
);
}
File diff suppressed because it is too large Load Diff
@@ -1,113 +0,0 @@
import * as React from 'react';
import { Badge, Box, ColorPaletteProp, Tooltip } from '@mui/joy';
function alignRight(value: number, columnSize: number = 7) {
const str = value.toLocaleString();
return str.padStart(columnSize);
}
export function tokensPrettyMath(tokenLimit: number | 0, directTokens: number, historyTokens?: number, responseMaxTokens?: number): {
color: ColorPaletteProp, message: string, remainingTokens: number
} {
const usedTokens = directTokens + (historyTokens || 0) + (responseMaxTokens || 0);
const remainingTokens = tokenLimit - usedTokens;
const gteLimit = (remainingTokens <= 0 && tokenLimit > 0);
// message
let message: string = gteLimit ? '⚠️ ' : '';
// no limit: show used tokens only
if (!tokenLimit) {
message += `Requested: ${usedTokens.toLocaleString()} tokens`;
}
// has full information (d + i < l)
else if (historyTokens || responseMaxTokens) {
message +=
`${Math.abs(remainingTokens).toLocaleString()} ${remainingTokens >= 0 ? 'available' : 'excess'} message tokens\n\n` +
` = Model max tokens: ${alignRight(tokenLimit)}\n` +
` - This message: ${alignRight(directTokens)}\n` +
` - History: ${alignRight(historyTokens || 0)}\n` +
` - Max response: ${alignRight(responseMaxTokens || 0)}`;
}
// Cleaner mode: d + ? < R (total is the remaining in this case)
else {
message +=
`${(tokenLimit + usedTokens).toLocaleString()} available tokens after deleting this\n\n` +
` = Currently free: ${alignRight(tokenLimit)}\n` +
` + This message: ${alignRight(usedTokens)}`;
}
const color: ColorPaletteProp =
(tokenLimit && remainingTokens < 0)
? 'danger'
: remainingTokens < tokenLimit / 4
? 'warning'
: 'primary';
return { color, message, remainingTokens };
}
export const TokenTooltip = (props: { message: string | null, color: ColorPaletteProp, placement?: 'top' | 'top-end', children: React.JSX.Element }) =>
<Tooltip
placement={props.placement}
variant={props.color !== 'primary' ? 'solid' : 'soft'} color={props.color}
title={props.message
? <Box sx={{ p: 2, whiteSpace: 'pre' }}>
{props.message}
</Box>
: null
}
sx={{
fontFamily: 'code',
boxShadow: 'xl',
}}
>
{props.children}
</Tooltip>;
/**
* Simple little component to show the token count (and a tooltip on hover)
*/
export const TokenBadgeMemo = React.memo(TokenBadge);
function TokenBadge(props: {
direct: number, history?: number, responseMax?: number, limit: number,
showExcess?: boolean, absoluteBottomRight?: boolean, inline?: boolean,
}) {
const { message, color, remainingTokens } = tokensPrettyMath(props.limit, props.direct, props.history, props.responseMax);
// show the direct tokens, unless we exceed the limit and 'showExcess' is enabled
const value = (props.showExcess && (props.limit && remainingTokens <= 0))
? Math.abs(remainingTokens)
: props.direct;
return (
<Badge
variant='solid' color={color} max={100000}
invisible={!props.direct && remainingTokens >= 0}
badgeContent={
<TokenTooltip color={color} message={message}>
<span>{value.toLocaleString()}</span>
</TokenTooltip>
}
sx={{
...((props.absoluteBottomRight) && { position: 'absolute', bottom: 8, right: 8 }),
cursor: 'help',
}}
slotProps={{
badge: {
sx: {
fontFamily: 'code',
...((props.absoluteBottomRight || props.inline) && { position: 'static', transform: 'none' }),
},
},
}}
/>
);
}
@@ -0,0 +1,179 @@
import * as React from 'react';
import { Controller, useFieldArray, useForm } from 'react-hook-form';
import { Box, Button, FormControl, FormHelperText, IconButton, Input, Stack, Typography } from '@mui/joy';
import AddIcon from '@mui/icons-material/Add';
import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline';
import LanguageRoundedIcon from '@mui/icons-material/LanguageRounded';
import YouTubeIcon from '@mui/icons-material/YouTube';
import { extractYoutubeVideoIDFromURL } from '~/modules/youtube/youtube.utils';
import { GoodModal } from '~/common/components/modals/GoodModal';
import { addSnackbar } from '~/common/components/snackbar/useSnackbarsStore';
import { asValidURL } from '~/common/util/urlUtils';
// configuration
const MAX_URLS = 5;
type WebInputData = {
url: string,
// attachImages?: boolean,
}
type WebInputModalInputs = {
links: WebInputData[];
}
function WebInputModal(props: {
onClose: () => void,
onWebLinks: (urls: WebInputData[]) => void,
}) {
// state
const { control: formControl, handleSubmit: formHandleSubmit, formState: { isValid: formIsValid, isDirty: formIsDirty } } = useForm<WebInputModalInputs>({
values: { links: [{ url: '' }] },
// mode: 'onChange', // validate on change
});
const { fields: formFields, append: formFieldsAppend, remove: formFieldsRemove } = useFieldArray({ control: formControl, name: 'links' });
// derived
const urlFieldCount = formFields.length;
// handlers
const { onClose, onWebLinks } = props;
const handleClose = React.useCallback(() => onClose(), [onClose]);
const handleSubmit = React.useCallback(({ links }: WebInputModalInputs) => {
// clean and prefix URLs
const cleanUrls = links.reduce((acc, { url, ...linkRest }) => {
const trimmed = (url || '').trim();
if (trimmed) {
// this form uses a 'relaxed' URL validation, meaning one can write 'big-agi.com' and we'll assume https://
const relaxedUrl = asValidURL(trimmed, true);
if (relaxedUrl)
acc.push({ url: relaxedUrl, ...linkRest });
}
return acc;
}, [] as WebInputData[]);
if (!cleanUrls.length) {
addSnackbar({ key: 'invalid-urls', message: 'Please enter at least one valid web address', type: 'issue', overrides: { autoHideDuration: 2000 } });
return;
}
onWebLinks(cleanUrls);
handleClose();
}, [handleClose, onWebLinks]);
return (
<GoodModal
open
onClose={handleClose}
title='Add Web Content'
titleStartDecorator={<LanguageRoundedIcon />}
closeText={'Cancel'}
// unfilterBackdrop
// themedColor='neutral'
hideBottomClose
>
<Box fontSize='md'>
Enter web page addresses to import their content.
</Box>
<Typography level='body-sm'>
Works on most websites and for YouTube videos (e.g., youtube.com/...) the transcript will be imported.
{/*You can add up to {MAX_URLS} URLs.*/}
</Typography>
<form onSubmit={formHandleSubmit(handleSubmit)}>
<Stack spacing={1}>
{formFields.map((field, index) => (
<Controller
key={field.id}
control={formControl}
name={`links.${index}.url`}
rules={{ required: 'Please enter a valid URL' }}
render={({ field: { value, onChange }, fieldState: { error } }) => (
<FormControl error={!!error}>
<Box sx={{ display: 'flex', gap: 1 }}>
<Input
autoFocus={index === 0}
required={index === 0}
placeholder='https://...'
endDecorator={extractYoutubeVideoIDFromURL(value) ? <YouTubeIcon sx={{ color: 'red' }} /> : undefined}
value={value}
onChange={onChange}
sx={{ flex: 1 }}
/>
{urlFieldCount > 1 && (
<IconButton
size='sm'
variant='plain'
color='neutral'
onClick={() => formFieldsRemove(index)}
>
<DeleteOutlineIcon />
</IconButton>
)}
</Box>
{error && <FormHelperText>{error.message}</FormHelperText>}
</FormControl>
)}
/>
))}
</Stack>
{/* Add a new link */}
<Box sx={{ display: 'flex', justifyContent: 'space-between', gap: 1, mt: 2.5 }}>
{formIsDirty && <Button
color='neutral'
variant='soft'
disabled={urlFieldCount >= MAX_URLS}
onClick={() => formFieldsAppend({ url: '' })}
startDecorator={<AddIcon />}
>
Another
{/*{urlFieldCount >= MAX_URLS ? 'Enough URLs' : urlFieldCount === 1 ? 'Add URL' : urlFieldCount === 2 ? 'Add another' : urlFieldCount === 3 ? 'And another one' : urlFieldCount === 4 ? 'Why stopping' : 'Just one more'}*/}
</Button>}
<Button
variant='solid'
type='submit'
disabled={!formIsValid || !formIsDirty}
sx={{ minWidth: 160, ml: 'auto' }}
>
Add {urlFieldCount > 1 ? `(${urlFieldCount})` : ''}
</Button>
</Box>
</form>
</GoodModal>
);
}
export function useWebInputModal(onAttachWebLinks: (urls: WebInputData[]) => void) {
// state
const [open, setOpen] = React.useState(false);
const openWebInputDialog = React.useCallback(() => setOpen(true), []);
const webInputDialogComponent = React.useMemo(() => open && (
<WebInputModal
onClose={() => setOpen(false)}
onWebLinks={onAttachWebLinks}
/>
), [onAttachWebLinks, open]);
return {
openWebInputDialog,
webInputDialogComponent,
};
}
@@ -2,40 +2,46 @@ import * as React from 'react';
import { Box, ListItem, ListItemButton, ListItemDecorator, Sheet, Typography } from '@mui/joy';
import { CloseableMenu } from '~/common/components/CloseableMenu';
import type { ActileItem } from './ActileProvider';
import { CloseablePopup } from '~/common/components/CloseablePopup';
import type { ActileItem, ActileProvider } from './ActileProvider';
export function ActilePopup(props: {
anchorEl: HTMLElement | null,
onClose: () => void,
title?: string,
items: ActileItem[],
activeItemIndex: number | undefined,
itemsByProvider: { provider: ActileProvider, items: ActileItem[] }[],
activeItemIndex: number,
activePrefixLength: number,
onItemClick: (item: ActileItem) => void,
children?: React.ReactNode
}) {
const hasAnyIcon = props.items.some(item => !!item.Icon);
// We need to keep track of the overall item index to correctly match with activeItemIndex
const itemIndices = React.useMemo(() => {
const indices: { providerKey: string, itemKey: string, isActive: boolean }[] = [];
let indexCounter = 0;
props.itemsByProvider.forEach(({ provider, items }) => {
items.forEach((item) => {
indices.push({
providerKey: provider.key,
itemKey: item.key,
isActive: indexCounter === props.activeItemIndex,
});
indexCounter += 1;
});
});
return indices;
}, [props.itemsByProvider, props.activeItemIndex]);
return (
<CloseableMenu
noTopPadding noBottomPadding
open anchorEl={props.anchorEl} onClose={props.onClose}
sx={{ minWidth: 320 }}
<CloseablePopup
menu anchorEl={props.anchorEl} onClose={props.onClose}
maxHeightGapPx={320}
minWidth={320}
noBottomPadding
noTopPadding
>
{!!props.title && (
<Sheet variant='soft' sx={{ p: 1, borderBottom: '1px solid', borderBottomColor: 'neutral.softActiveBg' }}>
<Typography level='title-sm'>
{props.title}
</Typography>
</Sheet>
)}
{!props.items.length && (
{!props.itemsByProvider.length && (
<ListItem variant='soft' color='warning'>
<Typography level='body-md'>
No matching command
@@ -43,46 +49,65 @@ export function ActilePopup(props: {
</ListItem>
)}
{props.items.map((item, idx) => {
const isActive = idx === props.activeItemIndex;
const labelBold = item.label.slice(0, props.activePrefixLength);
const labelNormal = item.label.slice(props.activePrefixLength);
return (
<ListItem
key={item.id}
variant={isActive ? 'soft' : undefined}
color={isActive ? 'primary' : undefined}
onClick={() => props.onItemClick(item)}
>
<ListItemButton color='primary'>
{hasAnyIcon && (
<ListItemDecorator>
{item.Icon ? <item.Icon /> : null}
</ListItemDecorator>
)}
<Box>
{props.itemsByProvider.map(({ provider, items }) => (
<React.Fragment key={provider.key}>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
<Typography level='title-sm' color={isActive ? 'primary' : undefined}>
<span style={{ textDecoration: 'underline' }}><b>{labelBold}</b></span>{labelNormal}
</Typography>
{item.argument && <Typography level='body-sm'>
{item.argument}
{/* Provider Label */}
<Sheet variant='soft' sx={{ p: 1, borderBottom: '1px solid', borderBottomColor: 'neutral.softActiveBg' }}>
<Typography level='title-sm'>
{provider.label}
</Typography>
</Sheet>
{/* Items */}
{items.map((item) => {
const index = itemIndices.findIndex(idx => idx.providerKey === provider.key && idx.itemKey === item.key);
const isActive = itemIndices[index]?.isActive;
const labelBold = item.label.slice(0, props.activePrefixLength);
const labelNormal = item.label.slice(props.activePrefixLength);
return (
<ListItem
key={`${provider.key}-${item.key}`}
variant={isActive ? 'soft' : undefined}
color={isActive ? 'primary' : undefined}
onClick={() => props.onItemClick(item)}
>
<ListItemButton color='primary'>
{item.Icon && (
<ListItemDecorator>
<item.Icon />
</ListItemDecorator>
)}
{/* Item*/}
<Box>
{/* Item main text */}
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
<Typography level='title-sm' color={isActive ? 'primary' : undefined}>
<span style={{ textDecoration: 'underline' }}><b>{labelBold}</b></span>{labelNormal}
</Typography>
{item.argument && <Typography level='body-sm'>
{item.argument}
</Typography>}
</Box>
{/* Item description */}
{!!item.description && <Typography level='body-xs'>
{item.description}
</Typography>}
</Box>
{!!item.description && <Typography level='body-xs'>
{item.description}
</Typography>}
</Box>
</ListItemButton>
</ListItem>
);
},
)}
</ListItemButton>
</ListItem>
);
})}
</React.Fragment>
))}
{props.children}
</CloseableMenu>
</CloseablePopup>
);
}
}
@@ -1,22 +1,27 @@
import type { FunctionComponent } from 'react';
export interface ActileProvider<TItem extends ActileItem = ActileItem> {
// Unique key for the provider
readonly key: 'pcmd' | 'pstrmsg' | 'pattlbl';
// Label for display
get label(): string;
// Interface for the provider
fastCheckTriggerText: (trailingText: string) => boolean;
fetchItems: () => ActileProviderItems<TItem>;
onItemSelect: (item: ActileItem) => void;
}
export type ActileProviderItems<TItem extends ActileItem = ActileItem> = Promise<{ searchPrefix: string, items: TItem[] }>;
export interface ActileItem {
id: string;
key: string;
providerKey: ActileProvider['key'];
label: string;
argument?: string;
description?: string;
Icon?: FunctionComponent;
}
type ActileProviderIds = 'actile-commands' | 'actile-attach-reference';
export interface ActileProvider {
id: ActileProviderIds;
title: string;
searchPrefix: string;
checkTriggerText: (trailingText: string) => boolean;
fetchItems: () => Promise<ActileItem[]>;
onItemSelect: (item: ActileItem) => void;
}
@@ -1,24 +0,0 @@
//import { ActileItem, ActileProvider } from './ActileProvider';
/*export const providerAttachReference: ActileProvider = {
id: 'actile-attach-reference',
title: 'Attach Reference',
searchPrefix: '@',
checkTriggerText: (trailingText: string) =>
trailingText.endsWith(' @'),
fetchItems: async () => {
return [{
id: 'test-1',
label: 'Attach This',
description: 'Attach this to the message',
Icon: undefined,
}];
},
onItemSelect: (item: ActileItem) => {
console.log('Selected item:', item);
},
};*/
@@ -0,0 +1,37 @@
import type { ActileItem, ActileProvider, ActileProviderItems } from './ActileProvider';
import type { AttachmentDraftsStoreApi } from '~/common/attachment-drafts/store-attachment-drafts_slice';
export interface AttachmentLabelItem extends ActileItem {
// nothing to do do here, this is really just a label
}
export const providerAttachmentLabels = (
attachmentsStoreApi: AttachmentDraftsStoreApi | null,
onLabelSelect: (item: ActileItem, searchPrefix: string) => void,
): ActileProvider<AttachmentLabelItem> => ({
key: 'pattlbl',
get label() {
return 'Attachment Labels';
},
// Uses '@' as the trigger
fastCheckTriggerText: (trailingText: string) => trailingText === '@' || trailingText.endsWith(' @'),
fetchItems: async (): ActileProviderItems<AttachmentLabelItem> => ({
searchPrefix: '',
items: attachmentsStoreApi?.getState()?.attachmentDrafts.map(draft => ({
key: draft.id,
providerKey: 'pattlbl',
label: draft.label,
argument: undefined,
description: 'name',
Icon: undefined,
} as AttachmentLabelItem)) ?? [],
}),
onItemSelect: item => onLabelSelect(item as AttachmentLabelItem, '@'),
});
@@ -1,24 +1,35 @@
import { ActileItem, ActileProvider } from './ActileProvider';
import { findAllChatCommands } from '../../../commands/commands.registry';
import type { ActileItem, ActileProvider, ActileProviderItems } from './ActileProvider';
export const providerCommands = (onItemSelect: (item: ActileItem) => void): ActileProvider => ({
id: 'actile-commands',
title: 'Chat Commands',
searchPrefix: '/',
checkTriggerText: (trailingText: string) =>
trailingText.trim() === '/',
export const providerCommands = (
onCommandSelect: (item: ActileItem, searchPrefix: string) => void,
): ActileProvider => ({
fetchItems: async () => {
return findAllChatCommands().map((cmd) => ({
id: cmd.primary,
key: 'pcmd',
get label() {
return 'Chat Commands';
},
fastCheckTriggerText: (trailingText: string) => {
// only the literal '/' is a trigger
return trailingText === '/';
},
fetchItems: async (): ActileProviderItems => ({
searchPrefix: '/',
items: findAllChatCommands().map((cmd) => ({
key: cmd.primary,
providerKey: 'pcmd',
label: cmd.primary,
argument: cmd.arguments?.join(' ') ?? undefined,
description: cmd.description,
Icon: cmd.Icon,
}));
},
} satisfies ActileItem)),
}),
onItemSelect: (item) => onCommandSelect(item as ActileItem, '/'),
onItemSelect,
});
@@ -0,0 +1,53 @@
import { conversationTitle, DConversationId } from '~/common/stores/chat/chat.conversation';
import { MESSAGE_FLAG_STARRED, messageFragmentsReduceText, messageHasUserFlag } from '~/common/stores/chat/chat.message';
import { useChatStore } from '~/common/stores/chat/store-chats';
import type { ActileItem, ActileProvider, ActileProviderItems } from './ActileProvider';
export interface StarredMessageItem extends ActileItem {
conversationId: DConversationId,
messageId: string,
}
export const providerStarredMessages = (onMessageSelect: (item: StarredMessageItem) => void): ActileProvider<StarredMessageItem> => ({
key: 'pstrmsg',
get label() {
return 'Starred Messages';
},
// only the literal '@' at start of chat, or ' @' at end of chat
fastCheckTriggerText: (trailingText: string) => trailingText === '@' || trailingText.endsWith(' @'),
// finds all the starred messages in all the conversations - this could be heavy
fetchItems: async (): ActileProviderItems<StarredMessageItem> => {
const { conversations } = useChatStore.getState();
const starredMessages: StarredMessageItem[] = [];
conversations.forEach((conversation) => {
conversation.messages.forEach((message) => {
messageHasUserFlag(message, MESSAGE_FLAG_STARRED) && starredMessages.push({
key: message.id,
providerKey: 'pstrmsg',
// data
conversationId: conversation.id,
messageId: message.id,
// looks
label: conversationTitle(conversation) + ' - ' + messageFragmentsReduceText(message.fragments).slice(0, 32) + '...',
// description: message.text.slice(32, 100),
Icon: undefined,
} satisfies StarredMessageItem);
});
});
return {
searchPrefix: '',
items: starredMessages,
};
},
onItemSelect: item => onMessageSelect(item as StarredMessageItem),
});
@@ -1,5 +1,6 @@
import * as React from 'react';
import { ActileItem, ActileProvider } from './ActileProvider';
import type { ActileItem, ActileProvider } from './ActileProvider';
import { ActilePopup } from './ActilePopup';
@@ -7,63 +8,74 @@ export const useActileManager = (providers: ActileProvider[], anchorRef: React.R
// state
const [popupOpen, setPopupOpen] = React.useState(false);
const [provider, setProvider] = React.useState<ActileProvider | null>(null);
const [items, setItems] = React.useState<ActileItem[]>([]);
const [itemsByProvider, setItemsByProvider] = React.useState<{ provider: ActileProvider, items: ActileItem[] }[]>([]);
const [activeSearchString, setActiveSearchString] = React.useState<string>('');
const [activeItemIndex, setActiveItemIndex] = React.useState<number>(0);
// derived state
const activeItems = React.useMemo(() => {
const activeItemsByProvider = React.useMemo(() => {
const search = activeSearchString.trim().toLowerCase();
return items.filter(item => item.label.toLowerCase().startsWith(search));
}, [items, activeSearchString]);
const activeItem = activeItemIndex >= 0 && activeItemIndex < activeItems.length ? activeItems[activeItemIndex] : null;
return itemsByProvider.map(({ provider, items }) => ({
provider,
items: items.filter(item => item.label?.toLowerCase().startsWith(search)),
})).filter(({ items }) => items.length > 0);
}, [itemsByProvider, activeSearchString]);
const flatActiveItems = React.useMemo(() => {
return activeItemsByProvider.flatMap(({ items }) => items);
}, [activeItemsByProvider]);
const totalItems = flatActiveItems.length;
const activeItem = totalItems > 0 && activeItemIndex >= 0 && activeItemIndex < totalItems ? flatActiveItems[activeItemIndex] : null;
const handleClose = React.useCallback(() => {
setPopupOpen(false);
setProvider(null);
setItems([]);
setItemsByProvider([]);
setActiveSearchString('');
setActiveItemIndex(0);
}, []);
const handlePopupItemClicked = React.useCallback((item: ActileItem) => {
const provider = providers.find(p => p.key === item.providerKey);
provider?.onItemSelect(item);
handleClose();
}, [handleClose, provider]);
}, [providers, handleClose]);
const handleEnterKey = React.useCallback(() => {
activeItem && handlePopupItemClicked(activeItem);
if (activeItem)
handlePopupItemClicked(activeItem);
}, [activeItem, handlePopupItemClicked]);
const actileInterceptTextChange = React.useCallback((trailingText: string) => {
for (const provider of providers) {
if (provider.checkTriggerText(trailingText)) {
setProvider(provider);
setPopupOpen(true);
setActiveSearchString(provider.searchPrefix);
provider
.fetchItems()
.then(items => setItems(items))
.catch(error => {
handleClose();
console.error('Failed to fetch popup items:', error);
});
return true;
}
// Collect all providers whose trigger matches
const matchingProviders = providers.filter(provider => provider.fastCheckTriggerText(trailingText));
if (matchingProviders.length > 0) {
// Fetch items from all matching providers
Promise.all(matchingProviders.map(provider =>
provider.fetchItems().then(({ searchPrefix, items }) => ({
provider,
searchPrefix,
items: items.map(item => ({ ...item, providerKey: provider.key })),
})),
)).then((results) => {
// Filter out empty results
results = results.filter(result => result.items.length > 0);
if (results.length) {
setPopupOpen(true);
setItemsByProvider(results.map(result => ({ provider: result.provider, items: result.items })));
setActiveSearchString(results[0].searchPrefix); // Assuming all search prefixes are the same
setActiveItemIndex(0);
}
}).catch(error => {
handleClose();
console.error('Failed to fetch popup items:', error);
});
return true;
}
return false;
}, [handleClose, providers]);
const actileInterceptKeydown = React.useCallback((_event: React.KeyboardEvent<HTMLTextAreaElement>): boolean => {
// Popup open: Intercept
const { key, currentTarget, ctrlKey, metaKey } = _event;
if (popupOpen) {
@@ -72,11 +84,11 @@ export const useActileManager = (providers: ActileProvider[], anchorRef: React.R
handleClose();
} else if (key === 'ArrowUp') {
_event.preventDefault();
setActiveItemIndex((prevIndex) => (prevIndex > 0 ? prevIndex - 1 : activeItems.length - 1));
setActiveItemIndex((prevIndex) => (prevIndex > 0 ? prevIndex - 1 : totalItems - 1));
} else if (key === 'ArrowDown') {
_event.preventDefault();
setActiveItemIndex((prevIndex) => (prevIndex < activeItems.length - 1 ? prevIndex + 1 : 0));
} else if (key === 'Enter' || key === 'ArrowRight' || key === 'Tab' || (key === ' ' && activeItems.length === 1)) {
setActiveItemIndex((prevIndex) => (prevIndex < totalItems - 1 ? prevIndex + 1 : 0));
} else if (key === 'Enter' || key === 'ArrowRight' || key === 'Tab' || (key === ' ' && totalItems === 1)) {
_event.preventDefault();
handleEnterKey();
} else if (key === 'Backspace') {
@@ -92,26 +104,24 @@ export const useActileManager = (providers: ActileProvider[], anchorRef: React.R
const trailingText = (currentTarget.value || '') + key;
return actileInterceptTextChange(trailingText);
}, [actileInterceptTextChange, activeItems.length, handleClose, handleEnterKey, popupOpen]);
}, [actileInterceptTextChange, handleClose, handleEnterKey, popupOpen, totalItems]);
const actileComponent = React.useMemo(() => {
return !popupOpen ? null : (
<ActilePopup
anchorEl={anchorRef.current}
onClose={handleClose}
title={provider?.title}
items={activeItems}
itemsByProvider={activeItemsByProvider}
activeItemIndex={activeItemIndex}
activePrefixLength={activeSearchString.length}
onItemClick={handlePopupItemClicked}
/>
);
}, [activeItemIndex, activeItems, activeSearchString.length, anchorRef, handleClose, handlePopupItemClicked, popupOpen, provider?.title]);
}, [activeItemIndex, activeItemsByProvider, activeSearchString.length, anchorRef, handleClose, handlePopupItemClicked, popupOpen]);
return {
actileComponent,
actileInterceptKeydown,
actileInterceptTextChange,
};
};
};

Some files were not shown because too many files have changed in this diff Show More