chatgpt-vue3-light-mvp: a single-turn Vue 3 chat template you fork, not a chat product
💭 一个可二次开发 Chat Bot 单轮对话 Web 端 MVP 原型模板, 基于 Vue 3, Vite8, TypeScript, Naive UI, Pinia(v3), UnoCSS 等主流技术构建, 🧤简单集成大模型 API, 采用单轮 AI 问答对话模式, 每次提问独立响应, 无需上下文, 支持 SSE 打字机效果流式输出, 集成 markdown-it Mermaid/KaTex/LaTex 公式高亮预览, 星火, 智谱, 硅基流动, Deepseek V4/V3/R1 深度思考推理模型预览, 兼容 <think> 标签, 包含蒸馏 skill 💼 易于定制和快速搭建 Chat 类大语言模型产品 (附示例截图)
At a glance
- What is it?
- The repository is a front-end-only MVP for building a chat UI: Vue 3, Vite 8, TypeScript, Naive UI and Pinia, with SSE streaming and Markdown, KaTeX and Mermaid rendering. The hard constraint is that every question is independent, because the project keeps no conversation context.
- Who is it for?
- Adopt it if you need a Vue 3 front end that already renders streaming Markdown, code, math and Mermaid output, and you accept that conversation history is out of scope. Do not adopt it if your product depends on multi-turn context, server-side key handling or persisted sessions, since the README names none of those.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 47 days ago.
- What is it written in?
- Mainly Vue, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What chatgpt-vue3-light-mvp actually solves
The repository is a prototype template, not a deployed assistant. Its stated purpose is to give a Vue 3 codebase where the chat surface already exists: input box, streaming reply area, Markdown rendering, code highlighting, math formulas and Mermaid diagrams. Someone building a chat product spends the first weeks on that plumbing rather than on the product idea, and this project ships that plumbing as a forkable starting point.
The audience is narrow and specific. You need to be comfortable in Vue 3 and TypeScript, and you need to want a front end only. The README is explicit that the project is pure front end and that every backend service comes from an external or local provider. That means no server component ships with it, so API keys live in the browser bundle through Vite environment variables. For a prototype or an internal demo that is a normal trade-off. For a public product it is a decision you have to revisit before launch.
The second audience is less obvious: people who want the streaming and rendering logic without the repository. The project distills its own implementation into an Agent Skill under .agents/skills, in English and Chinese, described as an architecture blueprint rather than a runtime feature or an npm package. If you are building a similar chat UI in another framework, that skill is the part worth reading first.
Single-turn by design: the constraint that shapes everything
The README marks single-turn mode as important. Each question gets an independent response and no context is kept between turns. This is not an oversight left for later; the note says multi-turn support may come in the future but there is no concrete plan, and suggests extending the project yourself if you need it.
That choice simplifies a surprising amount of code. There is no message history to serialize, no token budget to manage, no truncation strategy, no server-side session store. The request payload for a turn is essentially the current input plus model parameters. If you fork this and add multi-turn behaviour, you are not extending an existing history pipeline; you are writing one, including the part where long conversations exceed the model context window.
For a demo, a documentation assistant, a translation box or a one-shot code explainer, single-turn is fine and arguably better, because the UI stays honest about what it does. For a support agent or a coding assistant, it is the wrong tool. The failure mode is subtle: users do not read the note, they type a follow-up like "make that shorter", and the model, having no idea what "that" refers to, answers something unrelated. If you ship this template, the interface needs to make statelessness visible.
How the streaming pipeline and model adapters fit together
The architecture is documented in the Agent Skill references, which split the work into streaming, model adapters, typewriter rendering, Markdown rendering and a migration checklist. The streaming path starts from fetch(Response.body), passes through TextDecoderStream and TransformStream, and lands in a reader that unpacks SSE, JSON or plain text frames. Writing that unpacking by hand is where most chat front ends break, because providers disagree about frame boundaries and about where a chunk ends.
Model adapters sit on top of that layer. A model mapping table isolates DeepSeek, Spark, Moonshot, SiliconFlow, Ollama and the mock stream from each other, so each provider's response shape is translated in one place instead of leaking into components. The supported model table lists identifiers including standard for the built-in mock data, ollama3 for a local Ollama service, deepseek-v3 and deepseek-deep for the reasoning model, plus spark, siliconflow and moonshot. Only standard and ollama3 are marked as runnable locally without an API key.
The typewriter effect is deliberately decoupled from the network. Network reads land in a buffer and the UI drains that buffer frame by frame, so a fast provider does not make text appear in one jump and a slow one does not stutter. Rendering then goes through a pipeline for Markdown, code highlighting, KaTeX math, Mermaid diagrams and <think> reasoning blocks. That last one matters for reasoning models: the tag is stripped from the visible answer and shown as a separate thinking block, which is the difference between a readable reply and a wall of internal monologue.
Installing it and getting a first reply on screen
The prerequisites are Node >= 22.12.x and pnpm 10.x, and the package.json engines field enforces the same ranges. The README also asks for the VS Code ESLint extension at version 3.0.5 or later in pre-release, which is a linting convenience rather than a runtime requirement.
Install dependencies with pnpm:
pnpm iStart the development server:
pnpm devThe README states that after the local server starts you can open http://localhost:2048 to view the application. Because the default model is the built-in mock stream, you should see a reply appear with the typewriter effect without configuring any key. That is the fastest way to confirm the streaming and rendering path works before you touch a real provider.
When you want a real model, copy the environment template and fill in the keys you have:
cp .env.template .envThe README lists four keys: VITE_SPARK_KEY, VITE_SILICONFLOW_KEY, VITE_MOONSHOT_KEY and VITE_DEEPSEEK_KEY. The Spark key is unusual because it must be assembled as key and secret joined by a colon, while the other three are described as normally starting with sk-. You only need the entries for the providers you intend to call.
Cross-origin requests are handled in development by Vite's server.proxy. The repository's vite.config.ts defines a proxy entry for /spark pointing at https://spark-api-open.xf-yun.com with changeOrigin and ws enabled, and the README points to the Vite server options documentation for the mechanism. If you add a provider that is not already proxied, that configuration file is where the route belongs.
Where the template stops being enough
The most consequential limitation is the one the README states outright: keys are managed through .env files and the project is pure front end. Vite environment variables prefixed with VITE_ are embedded in the client build. Anyone who opens the deployed bundle can read them. For a prototype behind a login, or for a local Ollama instance, this is acceptable. For a public deployment against a paid provider, it is not, and the fix is a proxy or serverless function that holds the key and forwards the stream. The repository does not ship one, so that work is yours.
The second gap is persistence. Nothing in the README describes saving conversations, because single-turn mode has nothing to save. If your product needs history, search across past sessions, or a share link, you are adding a data layer, not toggling a feature.
The third is version sensitivity. The README notes that katex is held at 0.16.x for compatibility with @vscode/markdown-it-katex, and that Vite 8 requires explicitly using the KaTeX ESM entry to avoid CommonJS prebuild interference with formula parsing. That is a real constraint on dependency upgrades: bumping katex independently of its markdown-it plugin is likely to break math rendering, and the README does not describe a test that would catch it. Treat those two packages as a pair.
Compared with a framework that owns the chat loop
The natural alternative is a full chat framework, such as Vercel's AI SDK with a Next.js front end, where the streaming protocol, message history and provider abstraction are maintained by the project rather than by you. The difference is ownership, not features. A framework gives you a useChat-style hook that already tracks messages and resends history, and it gives you server routes where keys stay off the client. In exchange you accept its routing model, its release cadence and its opinions about where state lives.
chatgpt-vue3-light-mvp takes the opposite position. It gives you a Vue 3 codebase you own outright, with the streaming reader, adapter table and rendering pipeline visible and editable, and no server at all. If your team is a Vue shop that wants to control the last mile of rendering, that is a better fit than adopting a React-centric framework and fighting it. If you want history, server-side keys and a maintained protocol, the framework is the shorter path, because here you would build those yourself.
A narrower alternative is to keep the framework for transport and copy only the rendering ideas from this project's Agent Skill, which is written for exactly that kind of borrowing. That option costs you the working UI but avoids inheriting a template whose single-turn assumption you would immediately have to remove.
Maintenance, licence and upgrade cost
The repository is not archived, and the last push was on 2026-07-31, which corresponds to the v3.2.0 release on the same date. The two preceding releases, v3.1.0 and v3.0.0, are dated 2026-06-22 and 2026-04-21. That is a steady release rhythm across the spring and summer, with major-version jumps rather than patch-only tags, so you should expect the upgrade path to include breaking changes between major versions. The README does not document a migration procedure between releases, and the Agent Skill's migration checklist is aimed at moving these ideas into other projects, not at upgrading this one.
The dependency set is large and current, including Vue 3.5, Vite 8, Pinia 3, Naive UI 2.x, ESLint 10 and UnoCSS with Iconify. Packages pinned to exact versions rather than ranges, such as axios at 1.18.0, are the ones to watch, because they will not move until someone edits package.json. The engines field pins Node to 22.12.x or later and pnpm to 10.x or later, so older CI images will fail before the build starts.
The licence is MIT, which permits commercial use, modification and redistribution provided the copyright notice and permission notice are retained. That is the standard permissive arrangement and is compatible with shipping this in a closed product. It says nothing about the terms of the model providers you call, and those are separate agreements you have to check yourself.
Editorial conclusion
Adopt it if you need a Vue 3 front end that already renders streaming Markdown, code, math and Mermaid output, and you accept that conversation history is out of scope. Do not adopt it if your product depends on multi-turn context, server-side key handling or persisted sessions, since the README names none of those. Before committing, verify that Node >= 22.12.x and pnpm 10.x are available on your machines, that the model identifiers in the table match the providers you actually use, and that the .env.template keys line up with your accounts.
Frequently asked questions
Does chatgpt-vue3-light-mvp support multi-turn conversation?
No. The README states the project is an MVP that only supports single-turn mode, where each question gets an independent response and no context is kept. It says multi-turn may be supported in the future but there is no concrete plan, and suggests extending the project yourself.
Which models can I use with chatgpt-vue3-light-mvp?
The README lists a standard mock data model, Ollama with Llama 3, DeepSeek-V3, DeepSeek-R1, Spark, SiliconFlow and Kimi Moonshot. Only the standard mock and ollama3 are marked as runnable locally without an API key.
How do I run chatgpt-vue3-light-mvp locally?
Install with pnpm i and start the dev server with pnpm dev. The README says you can then open http://localhost:2048, and the default mock model means you can see streaming output before configuring any API key.
Where do I put the API keys for chatgpt-vue3-light-mvp?
The README instructs you to run cp .env.template .env and edit the resulting .env file. It lists VITE_SPARK_KEY, VITE_SILICONFLOW_KEY, VITE_MOONSHOT_KEY and VITE_DEEPSEEK_KEY, with the Spark key formatted as key and secret joined by a colon.
Is chatgpt-vue3-light-mvp safe to deploy publicly with my API keys?
The project is pure front end and manages keys through Vite environment variables, so the keys are part of the client build. For a public deployment against a paid provider you would need to add your own proxy or server component, which the repository does not ship.
What Node and pnpm versions does chatgpt-vue3-light-mvp require?
The README and the package.json engines field both require Node >= 22.12.x and pnpm 10.x. The repository also lists the VS Code ESLint extension at version 3.0.5 or later in pre-release as a prerequisite.
Community notes