From b2a06ed994b38d32220688c90b3166596df2700b Mon Sep 17 00:00:00 2001 From: Evandro Fonseca Junior Date: Wed, 19 Nov 2025 00:01:14 -0300 Subject: [PATCH] fix: address issues in model pull and chat API - Refactored model pull logic to improve error handling and user feedback. - Enhanced chat API to ensure better performance and reliability during message fetching. - Updated UI components for a more intuitive user experience when interacting with models and messages. --- .gitignore | 41 + README.md | 36 + app/chat/page.tsx | 208 + app/favicon.ico | Bin 0 -> 25931 bytes app/globals.css | 122 + app/layout.tsx | 42 + app/page.tsx | 66 + app/setup/page.tsx | 41 + components.json | 22 + components/chat/chat-input.tsx | 72 + components/chat/chat-message.tsx | 33 + components/chat/prompt-generator.tsx | 114 + components/chat/system-panel.tsx | 105 + components/landing/hero.tsx | 26 + components/landing/stopped-card.tsx | 85 + components/modals/install-modal.tsx | 86 + components/setup/hardware-scan.tsx | 72 + components/setup/model-selector.tsx | 163 + components/theme-provider.tsx | 12 + components/ui/badge.tsx | 46 + components/ui/button.tsx | 60 + components/ui/card.tsx | 92 + components/ui/dialog.tsx | 143 + components/ui/progress.tsx | 27 + components/ui/resizable.tsx | 44 + components/ui/select.tsx | 159 + components/ui/separator.tsx | 28 + components/ui/tabs.tsx | 66 + components/ui/textarea.tsx | 23 + data/models/alfred.json | 20 + data/models/all-minilm.json | 26 + data/models/athene-v2.json | 20 + data/models/aya-expanse.json | 26 + data/models/aya.json | 26 + data/models/bakllava.json | 20 + data/models/bespoke-minicheck.json | 20 + data/models/bge-large.json | 20 + data/models/bge-m3.json | 20 + data/models/codebooga.json | 20 + data/models/codegeex4.json | 20 + data/models/codegemma.json | 26 + data/models/codellama.json | 38 + data/models/codeqwen.json | 20 + data/models/codestral.json | 20 + data/models/codeup.json | 20 + data/models/cogito.json | 44 + data/models/command-a.json | 20 + data/models/command-r-plus.json | 20 + data/models/command-r.json | 20 + data/models/command-r7b-arabic.json | 20 + data/models/command-r7b.json | 20 + data/models/dbrx.json | 20 + data/models/deepcoder.json | 26 + data/models/deepscaler.json | 20 + data/models/deepseek-coder-v2.json | 26 + data/models/deepseek-coder.json | 32 + data/models/deepseek-llm.json | 26 + data/models/deepseek-r1.json | 56 + data/models/deepseek-v2.5.json | 20 + data/models/deepseek-v2.json | 26 + data/models/deepseek-v3.1.json | 26 + data/models/deepseek-v3.json | 20 + data/models/devstral.json | 20 + data/models/dolphin-llama3.json | 26 + data/models/dolphin-mistral.json | 20 + data/models/dolphin-mixtral.json | 26 + data/models/dolphin-phi.json | 20 + data/models/dolphin3.json | 20 + data/models/dolphincoder.json | 26 + data/models/duckdb-nsql.json | 20 + data/models/embeddinggemma.json | 20 + data/models/everythinglm.json | 20 + data/models/exaone-deep.json | 32 + data/models/exaone3.5.json | 32 + data/models/falcon.json | 32 + data/models/falcon2.json | 20 + data/models/falcon3.json | 38 + data/models/firefunction-v2.json | 20 + data/models/gemini-3-pro-preview.json | 14 + data/models/gemma.json | 26 + data/models/gemma2.json | 32 + data/models/gemma3.json | 44 + data/models/gemma3n.json | 26 + data/models/glm-4.6.json | 14 + data/models/glm4.json | 20 + data/models/goliath.json | 104 + data/models/gpt-oss-safeguard.json | 26 + data/models/gpt-oss.json | 38 + data/models/granite-code.json | 38 + data/models/granite-embedding.json | 26 + data/models/granite3-dense.json | 26 + data/models/granite3-guardian.json | 26 + data/models/granite3-moe.json | 26 + data/models/granite3.1-dense.json | 26 + data/models/granite3.1-moe.json | 26 + data/models/granite3.2-vision.json | 20 + data/models/granite3.2.json | 26 + data/models/granite3.3.json | 26 + data/models/granite4.json | 32 + data/models/hermes3.json | 38 + data/models/internlm2.json | 38 + data/models/kimi-k2-thinking.json | 14 + data/models/kimi-k2.json | 14 + data/models/llama-guard3.json | 26 + data/models/llama-pro.json | 206 + data/models/llama2-chinese.json | 26 + data/models/llama2-uncensored.json | 26 + data/models/llama2.json | 32 + data/models/llama3-chatqa.json | 26 + data/models/llama3-gradient.json | 26 + data/models/llama3-groq-tool-use.json | 26 + data/models/llama3.1.json | 32 + data/models/llama3.2-vision.json | 26 + data/models/llama3.2.json | 26 + data/models/llama3.3.json | 20 + data/models/llama3.json | 26 + data/models/llama4.json | 26 + data/models/llava-llama3.json | 20 + data/models/llava-phi3.json | 20 + data/models/llava.json | 32 + data/models/magicoder.json | 20 + data/models/magistral.json | 20 + data/models/marco-o1.json | 20 + data/models/mathstral.json | 20 + data/models/meditron.json | 26 + data/models/medllama2.json | 20 + data/models/megadolphin.json | 20 + data/models/minicpm-v.json | 20 + data/models/minimax-m2.json | 14 + data/models/mistral-large.json | 20 + data/models/mistral-nemo.json | 20 + data/models/mistral-openorca.json | 20 + data/models/mistral-small.json | 26 + data/models/mistral-small3.1.json | 20 + data/models/mistral-small3.2.json | 20 + data/models/mistral.json | 20 + data/models/mistrallite.json | 20 + data/models/mixtral.json | 26 + data/models/moondream.json | 20 + data/models/mxbai-embed-large.json | 20 + data/models/nemotron-mini.json | 20 + data/models/nemotron.json | 20 + data/models/neural-chat.json | 20 + data/models/nexusraven.json | 20 + data/models/nomic-embed-text.json | 26 + data/models/notus.json | 20 + data/models/notux.json | 20 + data/models/nous-hermes.json | 26 + data/models/nous-hermes2-mixtral.json | 20 + data/models/nous-hermes2.json | 26 + data/models/nuextract.json | 20 + data/models/olmo2.json | 26 + data/models/open-orca-platypus2.json | 20 + data/models/openchat.json | 20 + data/models/opencoder.json | 26 + data/models/openhermes.json | 218 + data/models/openthinker.json | 26 + data/models/orca-mini.json | 38 + data/models/orca2.json | 26 + data/models/paraphrase-multilingual.json | 20 + data/models/phi.json | 20 + data/models/phi3.5.json | 20 + data/models/phi3.json | 26 + data/models/phi4-mini-reasoning.json | 20 + data/models/phi4-mini.json | 20 + data/models/phi4-reasoning.json | 20 + data/models/phi4.json | 20 + data/models/phind-codellama.json | 20 + data/models/qwen.json | 62 + data/models/qwen2-math.json | 32 + data/models/qwen2.5-coder.json | 50 + data/models/qwen2.5.json | 56 + data/models/qwen2.5vl.json | 38 + data/models/qwen2.json | 38 + data/models/qwen3-coder.json | 32 + data/models/qwen3-embedding.json | 32 + data/models/qwen3-vl.json | 62 + data/models/qwen3.json | 62 + data/models/qwq.json | 20 + data/models/r1-1776.json | 26 + data/models/reader-lm.json | 26 + data/models/reflection.json | 20 + data/models/sailor2.json | 32 + data/models/samantha-mistral.json | 20 + data/models/shieldgemma.json | 32 + data/models/smallthinker.json | 20 + data/models/smollm.json | 32 + data/models/smollm2.json | 32 + data/models/snowflake-arctic-embed.json | 44 + data/models/snowflake-arctic-embed2.json | 20 + data/models/solar-pro.json | 20 + data/models/solar.json | 20 + data/models/sqlcoder.json | 26 + data/models/stable-beluga.json | 32 + data/models/stable-code.json | 20 + data/models/stablelm-zephyr.json | 20 + data/models/stablelm2.json | 26 + data/models/starcoder.json | 38 + data/models/starcoder2.json | 32 + data/models/starling-lm.json | 20 + data/models/tinydolphin.json | 20 + data/models/tinyllama.json | 20 + data/models/tulu3.json | 26 + data/models/vicuna.json | 32 + data/models/wizard-math.json | 32 + data/models/wizard-vicuna-uncensored.json | 32 + data/models/wizard-vicuna.json | 20 + data/models/wizardcoder.json | 20 + data/models/wizardlm-uncensored.json | 20 + data/models/wizardlm.json | 446 ++ data/models/wizardlm2.json | 26 + data/models/xwinlm.json | 26 + data/models/yarn-llama2.json | 26 + data/models/yarn-mistral.json | 20 + data/models/yi-coder.json | 26 + data/models/yi.json | 32 + data/models/zephyr.json | 26 + data/prompts/prompt-gen.md | 32 + eslint.config.mjs | 18 + hooks/use-chat.ts | 106 + hooks/use-hardware.ts | 28 + hooks/use-local-models.ts | 43 + hooks/use-ollama-check.ts | 41 + hooks/use-prompt-generator.ts | 70 + hooks/use-system-monitor.ts | 29 + lib/recommendation.ts | 54 + lib/utils.ts | 6 + next.config.ts | 10 + package.json | 44 + pnpm-lock.yaml | 5988 +++++++++++++++++++++ postcss.config.mjs | 7 + public/file.svg | 1 + public/globe.svg | 1 + public/next.svg | 1 + public/vercel.svg | 1 + public/window.svg | 1 + src-tauri/.gitignore | 4 + src-tauri/Cargo.lock | 5409 +++++++++++++++++++ src-tauri/Cargo.toml | 27 + src-tauri/build.rs | 3 + src-tauri/capabilities/default.json | 11 + src-tauri/icons/128x128.png | Bin 0 -> 11059 bytes src-tauri/icons/128x128@2x.png | Bin 0 -> 23137 bytes src-tauri/icons/32x32.png | Bin 0 -> 2225 bytes src-tauri/icons/Square107x107Logo.png | Bin 0 -> 9202 bytes src-tauri/icons/Square142x142Logo.png | Bin 0 -> 12530 bytes src-tauri/icons/Square150x150Logo.png | Bin 0 -> 13032 bytes src-tauri/icons/Square284x284Logo.png | Bin 0 -> 25943 bytes src-tauri/icons/Square30x30Logo.png | Bin 0 -> 2078 bytes src-tauri/icons/Square310x310Logo.png | Bin 0 -> 28507 bytes src-tauri/icons/Square44x44Logo.png | Bin 0 -> 3419 bytes src-tauri/icons/Square71x71Logo.png | Bin 0 -> 6027 bytes src-tauri/icons/Square89x89Logo.png | Bin 0 -> 7551 bytes src-tauri/icons/StoreLogo.png | Bin 0 -> 3971 bytes src-tauri/icons/icon.icns | Bin 0 -> 277003 bytes src-tauri/icons/icon.ico | Bin 0 -> 37710 bytes src-tauri/icons/icon.png | Bin 0 -> 49979 bytes src-tauri/src/lib.rs | 230 + src-tauri/src/main.rs | 6 + src-tauri/tauri.conf.json | 37 + tsconfig.json | 34 + 261 files changed, 19968 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app/chat/page.tsx create mode 100644 app/favicon.ico create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/page.tsx create mode 100644 app/setup/page.tsx create mode 100644 components.json create mode 100644 components/chat/chat-input.tsx create mode 100644 components/chat/chat-message.tsx create mode 100644 components/chat/prompt-generator.tsx create mode 100644 components/chat/system-panel.tsx create mode 100644 components/landing/hero.tsx create mode 100644 components/landing/stopped-card.tsx create mode 100644 components/modals/install-modal.tsx create mode 100644 components/setup/hardware-scan.tsx create mode 100644 components/setup/model-selector.tsx create mode 100644 components/theme-provider.tsx create mode 100644 components/ui/badge.tsx create mode 100644 components/ui/button.tsx create mode 100644 components/ui/card.tsx create mode 100644 components/ui/dialog.tsx create mode 100644 components/ui/progress.tsx create mode 100644 components/ui/resizable.tsx create mode 100644 components/ui/select.tsx create mode 100644 components/ui/separator.tsx create mode 100644 components/ui/tabs.tsx create mode 100644 components/ui/textarea.tsx create mode 100644 data/models/alfred.json create mode 100644 data/models/all-minilm.json create mode 100644 data/models/athene-v2.json create mode 100644 data/models/aya-expanse.json create mode 100644 data/models/aya.json create mode 100644 data/models/bakllava.json create mode 100644 data/models/bespoke-minicheck.json create mode 100644 data/models/bge-large.json create mode 100644 data/models/bge-m3.json create mode 100644 data/models/codebooga.json create mode 100644 data/models/codegeex4.json create mode 100644 data/models/codegemma.json create mode 100644 data/models/codellama.json create mode 100644 data/models/codeqwen.json create mode 100644 data/models/codestral.json create mode 100644 data/models/codeup.json create mode 100644 data/models/cogito.json create mode 100644 data/models/command-a.json create mode 100644 data/models/command-r-plus.json create mode 100644 data/models/command-r.json create mode 100644 data/models/command-r7b-arabic.json create mode 100644 data/models/command-r7b.json create mode 100644 data/models/dbrx.json create mode 100644 data/models/deepcoder.json create mode 100644 data/models/deepscaler.json create mode 100644 data/models/deepseek-coder-v2.json create mode 100644 data/models/deepseek-coder.json create mode 100644 data/models/deepseek-llm.json create mode 100644 data/models/deepseek-r1.json create mode 100644 data/models/deepseek-v2.5.json create mode 100644 data/models/deepseek-v2.json create mode 100644 data/models/deepseek-v3.1.json create mode 100644 data/models/deepseek-v3.json create mode 100644 data/models/devstral.json create mode 100644 data/models/dolphin-llama3.json create mode 100644 data/models/dolphin-mistral.json create mode 100644 data/models/dolphin-mixtral.json create mode 100644 data/models/dolphin-phi.json create mode 100644 data/models/dolphin3.json create mode 100644 data/models/dolphincoder.json create mode 100644 data/models/duckdb-nsql.json create mode 100644 data/models/embeddinggemma.json create mode 100644 data/models/everythinglm.json create mode 100644 data/models/exaone-deep.json create mode 100644 data/models/exaone3.5.json create mode 100644 data/models/falcon.json create mode 100644 data/models/falcon2.json create mode 100644 data/models/falcon3.json create mode 100644 data/models/firefunction-v2.json create mode 100644 data/models/gemini-3-pro-preview.json create mode 100644 data/models/gemma.json create mode 100644 data/models/gemma2.json create mode 100644 data/models/gemma3.json create mode 100644 data/models/gemma3n.json create mode 100644 data/models/glm-4.6.json create mode 100644 data/models/glm4.json create mode 100644 data/models/goliath.json create mode 100644 data/models/gpt-oss-safeguard.json create mode 100644 data/models/gpt-oss.json create mode 100644 data/models/granite-code.json create mode 100644 data/models/granite-embedding.json create mode 100644 data/models/granite3-dense.json create mode 100644 data/models/granite3-guardian.json create mode 100644 data/models/granite3-moe.json create mode 100644 data/models/granite3.1-dense.json create mode 100644 data/models/granite3.1-moe.json create mode 100644 data/models/granite3.2-vision.json create mode 100644 data/models/granite3.2.json create mode 100644 data/models/granite3.3.json create mode 100644 data/models/granite4.json create mode 100644 data/models/hermes3.json create mode 100644 data/models/internlm2.json create mode 100644 data/models/kimi-k2-thinking.json create mode 100644 data/models/kimi-k2.json create mode 100644 data/models/llama-guard3.json create mode 100644 data/models/llama-pro.json create mode 100644 data/models/llama2-chinese.json create mode 100644 data/models/llama2-uncensored.json create mode 100644 data/models/llama2.json create mode 100644 data/models/llama3-chatqa.json create mode 100644 data/models/llama3-gradient.json create mode 100644 data/models/llama3-groq-tool-use.json create mode 100644 data/models/llama3.1.json create mode 100644 data/models/llama3.2-vision.json create mode 100644 data/models/llama3.2.json create mode 100644 data/models/llama3.3.json create mode 100644 data/models/llama3.json create mode 100644 data/models/llama4.json create mode 100644 data/models/llava-llama3.json create mode 100644 data/models/llava-phi3.json create mode 100644 data/models/llava.json create mode 100644 data/models/magicoder.json create mode 100644 data/models/magistral.json create mode 100644 data/models/marco-o1.json create mode 100644 data/models/mathstral.json create mode 100644 data/models/meditron.json create mode 100644 data/models/medllama2.json create mode 100644 data/models/megadolphin.json create mode 100644 data/models/minicpm-v.json create mode 100644 data/models/minimax-m2.json create mode 100644 data/models/mistral-large.json create mode 100644 data/models/mistral-nemo.json create mode 100644 data/models/mistral-openorca.json create mode 100644 data/models/mistral-small.json create mode 100644 data/models/mistral-small3.1.json create mode 100644 data/models/mistral-small3.2.json create mode 100644 data/models/mistral.json create mode 100644 data/models/mistrallite.json create mode 100644 data/models/mixtral.json create mode 100644 data/models/moondream.json create mode 100644 data/models/mxbai-embed-large.json create mode 100644 data/models/nemotron-mini.json create mode 100644 data/models/nemotron.json create mode 100644 data/models/neural-chat.json create mode 100644 data/models/nexusraven.json create mode 100644 data/models/nomic-embed-text.json create mode 100644 data/models/notus.json create mode 100644 data/models/notux.json create mode 100644 data/models/nous-hermes.json create mode 100644 data/models/nous-hermes2-mixtral.json create mode 100644 data/models/nous-hermes2.json create mode 100644 data/models/nuextract.json create mode 100644 data/models/olmo2.json create mode 100644 data/models/open-orca-platypus2.json create mode 100644 data/models/openchat.json create mode 100644 data/models/opencoder.json create mode 100644 data/models/openhermes.json create mode 100644 data/models/openthinker.json create mode 100644 data/models/orca-mini.json create mode 100644 data/models/orca2.json create mode 100644 data/models/paraphrase-multilingual.json create mode 100644 data/models/phi.json create mode 100644 data/models/phi3.5.json create mode 100644 data/models/phi3.json create mode 100644 data/models/phi4-mini-reasoning.json create mode 100644 data/models/phi4-mini.json create mode 100644 data/models/phi4-reasoning.json create mode 100644 data/models/phi4.json create mode 100644 data/models/phind-codellama.json create mode 100644 data/models/qwen.json create mode 100644 data/models/qwen2-math.json create mode 100644 data/models/qwen2.5-coder.json create mode 100644 data/models/qwen2.5.json create mode 100644 data/models/qwen2.5vl.json create mode 100644 data/models/qwen2.json create mode 100644 data/models/qwen3-coder.json create mode 100644 data/models/qwen3-embedding.json create mode 100644 data/models/qwen3-vl.json create mode 100644 data/models/qwen3.json create mode 100644 data/models/qwq.json create mode 100644 data/models/r1-1776.json create mode 100644 data/models/reader-lm.json create mode 100644 data/models/reflection.json create mode 100644 data/models/sailor2.json create mode 100644 data/models/samantha-mistral.json create mode 100644 data/models/shieldgemma.json create mode 100644 data/models/smallthinker.json create mode 100644 data/models/smollm.json create mode 100644 data/models/smollm2.json create mode 100644 data/models/snowflake-arctic-embed.json create mode 100644 data/models/snowflake-arctic-embed2.json create mode 100644 data/models/solar-pro.json create mode 100644 data/models/solar.json create mode 100644 data/models/sqlcoder.json create mode 100644 data/models/stable-beluga.json create mode 100644 data/models/stable-code.json create mode 100644 data/models/stablelm-zephyr.json create mode 100644 data/models/stablelm2.json create mode 100644 data/models/starcoder.json create mode 100644 data/models/starcoder2.json create mode 100644 data/models/starling-lm.json create mode 100644 data/models/tinydolphin.json create mode 100644 data/models/tinyllama.json create mode 100644 data/models/tulu3.json create mode 100644 data/models/vicuna.json create mode 100644 data/models/wizard-math.json create mode 100644 data/models/wizard-vicuna-uncensored.json create mode 100644 data/models/wizard-vicuna.json create mode 100644 data/models/wizardcoder.json create mode 100644 data/models/wizardlm-uncensored.json create mode 100644 data/models/wizardlm.json create mode 100644 data/models/wizardlm2.json create mode 100644 data/models/xwinlm.json create mode 100644 data/models/yarn-llama2.json create mode 100644 data/models/yarn-mistral.json create mode 100644 data/models/yi-coder.json create mode 100644 data/models/yi.json create mode 100644 data/models/zephyr.json create mode 100644 data/prompts/prompt-gen.md create mode 100644 eslint.config.mjs create mode 100644 hooks/use-chat.ts create mode 100644 hooks/use-hardware.ts create mode 100644 hooks/use-local-models.ts create mode 100644 hooks/use-ollama-check.ts create mode 100644 hooks/use-prompt-generator.ts create mode 100644 hooks/use-system-monitor.ts create mode 100644 lib/recommendation.ts create mode 100644 lib/utils.ts create mode 100644 next.config.ts create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 postcss.config.mjs create mode 100644 public/file.svg create mode 100644 public/globe.svg create mode 100644 public/next.svg create mode 100644 public/vercel.svg create mode 100644 public/window.svg create mode 100644 src-tauri/.gitignore create mode 100644 src-tauri/Cargo.lock create mode 100644 src-tauri/Cargo.toml create mode 100644 src-tauri/build.rs create mode 100644 src-tauri/capabilities/default.json create mode 100644 src-tauri/icons/128x128.png create mode 100644 src-tauri/icons/128x128@2x.png create mode 100644 src-tauri/icons/32x32.png create mode 100644 src-tauri/icons/Square107x107Logo.png create mode 100644 src-tauri/icons/Square142x142Logo.png create mode 100644 src-tauri/icons/Square150x150Logo.png create mode 100644 src-tauri/icons/Square284x284Logo.png create mode 100644 src-tauri/icons/Square30x30Logo.png create mode 100644 src-tauri/icons/Square310x310Logo.png create mode 100644 src-tauri/icons/Square44x44Logo.png create mode 100644 src-tauri/icons/Square71x71Logo.png create mode 100644 src-tauri/icons/Square89x89Logo.png create mode 100644 src-tauri/icons/StoreLogo.png create mode 100644 src-tauri/icons/icon.icns create mode 100644 src-tauri/icons/icon.ico create mode 100644 src-tauri/icons/icon.png create mode 100644 src-tauri/src/lib.rs create mode 100644 src-tauri/src/main.rs create mode 100644 src-tauri/tauri.conf.json create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ef6a52 --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/README.md b/README.md new file mode 100644 index 0000000..e215bc4 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/app/chat/page.tsx b/app/chat/page.tsx new file mode 100644 index 0000000..345b630 --- /dev/null +++ b/app/chat/page.tsx @@ -0,0 +1,208 @@ +'use client'; + +import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from "@/components/ui/resizable"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { Button } from "@/components/ui/button"; +import { Textarea } from "@/components/ui/textarea"; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; +import { MessageSquare, Settings, Server, Moon, Sun, PanelLeftClose, PanelLeftOpen } from "lucide-react"; +import { ChatInput } from "@/components/chat/chat-input"; +import { ChatMessage } from "@/components/chat/chat-message"; +import { SystemPanel } from "@/components/chat/system-panel"; +import { PromptGeneratorDialog } from "@/components/chat/prompt-generator"; +import { useChat } from "@/hooks/use-chat"; +import { useLocalModels } from "@/hooks/use-local-models"; +import { useState, useEffect, useRef } from "react"; +import { useTheme } from "next-themes"; +import { ImperativePanelHandle } from "react-resizable-panels"; + +export default function ChatPage() { + const { messages, sendMessage, isLoading, stop } = useChat(); + const { models } = useLocalModels(); + const { theme, setTheme } = useTheme(); + + const [selectedModel, setSelectedModel] = useState(""); + const [systemPrompt, setSystemPrompt] = useState("Você é um assistente útil e prestativo."); + const [isSidebarCollapsed, setIsSidebarCollapsed] = useState(false); + + const sidebarRef = useRef(null); + + // Auto-select first model + useEffect(() => { + if (models.length > 0 && !selectedModel) { + setSelectedModel(models[0].name); + } + }, [models, selectedModel]); + + const handleSend = (content: string) => { + if (!selectedModel) return; + sendMessage(content, selectedModel, systemPrompt); + }; + + const toggleSidebar = () => { + const panel = sidebarRef.current; + if (panel) { + if (isSidebarCollapsed) { + panel.expand(); + } else { + panel.collapse(); + } + } + }; + + return ( +
+ {/* Left Sidebar (Nav) */} + + + setIsSidebarCollapsed(true)} + onExpand={() => setIsSidebarCollapsed(false)} + className="border-r flex flex-col items-center py-4 gap-4 bg-muted/20 min-w-[60px]" + > + + +
+ + + + + + + {/* Main Chat Area */} + +
+ {/* Header */} +
+
+ {isSidebarCollapsed && ( + + )} + {!isSidebarCollapsed && ( + + )} +
Chat
+
+ +
+ +
+
+ + {/* Messages */} +
+ {messages.length === 0 ? ( +
+
+ +
+

Inicie uma conversa com {selectedModel}

+
+ ) : ( +
+ {messages.map((msg, i) => ( + + ))} + {isLoading && ( +
+ Gerando resposta... +
+ )} +
+ )} +
+ + {/* Input */} + +
+
+ + + + {/* Right Sidebar (Settings & Monitor) */} + + +
+ + + Parâmetros + + + Sistema + + +
+ + +
+
+ + +
+