Lyt.js AI:让前端开发进入智能生成时代
从模板脚手架到 AI 智能生成,Lyt.js v5.0.1 的 @lytjs/ai 包用约 5,360 行源码实现了多模型支持、CLI 工具、智能代码补全和优雅降级,让前端开发真正进入智能生成时代。
前言
2024 年以来,AI 编程助手(Copilot、Cursor、Trae 等)已经成为前端开发者的标配工具。但大多数 AI 集成方案存在一个共同问题:AI 生成的代码与框架 API 不匹配。LLM 可能生成 v-if 而不是 if,可能从 vue 导入而不是 @lytjs/reactivity,导致生成的代码无法直接运行。
Lyt.js 的解决方案是:把 AI 能力直接内置到框架中。@lytjs/ai 包作为 Lyt.js v5.0.1 的官方 AI 子包,通过精心设计的 Prompt 工程、结构化输出解析和多层配置体系,确保 AI 生成的每一行代码都符合 Lyt.js 规范。
架构全景
@lytjs/ai 包位于 packages/ai/ 目录,约 5,360 行 TypeScript 源码,导出 8 个核心模块:
@lytjs/ai (v5.0.1)
├── AIGenerator # 门面类,统一生成入口
├── AIClient # AI API 客户端
├── LytAIAssistant # 高级 AI 助手(流式/对话/修复)
├── ComponentGenerator # 组件生成器
├── createComponent # 便捷函数
├── TemplateEngine # 模板引擎(12 种内置模板)
├── CodeCompleter # 本地代码补全
└── ConfigLoader # 三层配置加载器
此外还有支撑模块:parser(结构化输出解析器)、prompts(Prompt 模板体系)和 providers(多模型 Provider 层)。
多模型 Provider 架构
@lytjs/ai 采用统一的 AIProviderInterface 接口,实现了三个 Provider:
interface AIProviderInterface {
readonly name: string
readonly models: string[]
model: string
complete(prompt: string, options?: CompleteOptions): Promise<AIResponse>
chat(messages: ChatMessage[], options?: CompleteOptions): Promise<AIResponse>
stream(prompt: string, options?: CompleteOptions): AsyncGenerator<StreamChunk>
streamChat(messages: ChatMessage[], options?: CompleteOptions): AsyncGenerator<StreamChunk>
validateApiKey(): Promise<boolean>
}
OpenAIProvider
支持 OpenAI 全系列模型,同时兼容所有 OpenAI API 格式的服务(Azure OpenAI、DeepSeek 等):
const provider = new OpenAIProvider({
apiKey: 'sk-xxx',
model: 'gpt-4o', // 默认模型
baseUrl: 'https://api.openai.com/v1',
temperature: 0.7,
maxTokens: 2000,
timeout: 30000,
})
支持的模型列表:gpt-4o、gpt-4o-mini、gpt-4-turbo、gpt-4、gpt-4-32k、gpt-3.5-turbo、gpt-3.5-turbo-16k。
ClaudeProvider
支持 Anthropic Claude 全系列模型,使用 x-api-key 认证头和 anthropic-version 版本控制:
const provider = new ClaudeProvider({
apiKey: 'sk-ant-xxx',
model: 'claude-3-5-sonnet-20241022', // 默认模型
apiVersion: '2023-06-01',
})
支持的模型:claude-sonnet-4-20250514、claude-3-5-sonnet-20241022、claude-3-5-haiku-20241022、claude-3-opus-20240229、claude-3-haiku-20240307。
OllamaProvider
支持本地 Ollama 运行的模型(llama3、qwen2、codellama 等),无需 API Key,默认超时延长至 60 秒以适应本地推理速度:
const provider = new OllamaProvider({
model: 'llama3',
baseUrl: 'http://localhost:11434',
timeout: 60000, // 本地推理可能较慢
})
// 获取本地可用模型列表
const models = await provider.getAvailableModels()
// 拉取新模型
await provider.pullModel('qwen2:7b')
三个 Provider 都完整实现了同步和流式两种调用模式,并通过 AbortController 实现请求超时控制。
AIClient:统一的 API 客户端
AIClient 是对底层 Provider 的进一步封装,提供开箱即用的默认配置:
const client = new AIClient({
provider: 'openai',
apiKey: 'sk-xxx',
model: 'gpt-4o',
baseUrl: 'https://api.openai.com/v1',
temperature: 0.7, // 默认温度
maxTokens: 2000, // 默认最大 token
timeout: 30000, // 默认 30 秒超时
})
默认参数经过精心调优:temperature=0.7 在创意性和确定性之间取得平衡,maxTokens=2000 足以生成完整的组件代码,timeout=30000ms 兼顾响应速度和稳定性。
AIGenerator:一行代码生成万物
AIGenerator 是整个 AI 模块的门面类(Facade Pattern),提供四个核心生成方法:
import { AIGenerator } from '@lytjs/ai'
const generator = new AIGenerator({ useAI: true })
// 生成组件
const component = await generator.generateComponent({
name: 'UserCard',
type: 'card',
description: '用户信息卡片',
style: true,
})
// 生成 Store
const store = await generator.generateStore({
name: 'counter',
state: { count: 0 },
actions: ['increment', 'decrement', 'reset'],
})
// 生成页面
const page = await generator.generatePage({
name: 'Dashboard',
path: '/dashboard',
})
// 生成 API
const api = await generator.generateAPI({
name: 'users',
path: '/api/users',
method: 'GET',
})
每个生成方法都返回 GenerateResult,包含生成的代码、提示信息和 AI 使用状态:
interface GenerateResult {
code: string // 生成的代码
messages: string[] // 提示信息(如 Token 使用量)
usedAI?: boolean // 是否使用了 AI
}
LytAIAssistant:高级 AI 助手
LytAIAssistant 是面向复杂场景的高级 API,支持组件生成、代码补全、错误修复和对话式交互四大能力。
智能组件生成
支持自然语言描述生成组件,内置中文关键词识别:
const assistant = new LytAIAssistant({ provider: 'openai', openai: { apiKey: 'sk-xxx' } })
// 根据描述生成
const result = await assistant.generateComponent('一个带搜索功能的下拉选择器', {
name: 'SearchSelect',
validate: true, // 自动验证生成的代码
})
LytAIAssistant 内置了智能组件名推断:输入"用户列表组件"会自动识别为 LytList,输入"登录表单"会推断为 LytForm。
流式生成
支持流式输出,适合实时预览场景:
for await (const chunk of assistant.streamGenerateComponent('数据表格组件')) {
process.stdout.write(chunk.content)
if (chunk.done) {
console.log(`\nToken 使用: ${chunk.usage?.totalTokens}`)
}
}
智能代码补全
根据上下文自动判断补全类型(行内补全、函数补全、组件补全、导入补全):
const completion = await assistant.completeCode(
'const count = ref(0)\nconst doubled = ',
{ afterCursor: '', filePath: 'src/Counter.lyt' }
)
// 返回: "computed(() => count.value * 2)"
错误修复
自动检测错误类型(编译错误、运行时错误、类型错误)并生成修复建议:
const fix = await assistant.fixError(
'TypeError: Cannot read property "name" of undefined',
code,
{ filePath: 'src/UserCard.lyt', validate: true }
)
// fix.fixedCode: 修复后的代码
// fix.explanation: 修复说明
// fix.validation: 验证结果
对话式交互
支持多轮对话,自动维护对话历史:
for await (const response of assistant.chat([
{ role: 'user', content: '帮我创建一个带分页的表格组件' }
])) {
process.stdout.write(response.content)
}
// 继续对话
for await (const response of assistant.chat([
{ role: 'user', content: '给表格加上排序功能' }
])) {
process.stdout.write(response.content)
}
// 管理历史
assistant.clearHistory()
const history = assistant.getHistory()
Prompt 工程:让 LLM 理解 Lyt.js
@lytjs/ai 的 Prompt 体系是其核心竞争力的关键。所有 Prompt 都内置了 Lyt.js 的语法规范,确保 LLM 生成的代码符合框架要求。
系统提示词
你是一个专业的 Lyt.js 前端开发助手。
Lyt.js 是一个纯原生、零运行时依赖、超轻量的前端框架,提供与 Vue 3 兼容的 API。
- 使用 Composition API 和 script setup 语法
Lyt.js 的模板语法特点:
- 插值:{{ msg }}
- 属性绑定::class="cls"
- 事件绑定:@click="fn"
- 条件渲染:if="show" (没有 v- 前缀)
- 列表渲染:each="item in list" (没有 v- 前缀)
- 双向绑定:model="value" (没有 v- 前缀)
分层 Prompt 模板
Prompt 按场景分为三大类:
| 模块 | 文件 | 功能 |
|---|---|---|
| 组件生成 | component-prompts.ts | 基础组件/复合组件/自定义组件 Prompt |
| 代码补全 | code-prompts.ts | 行内补全/函数补全/组件补全/智能补全 |
| 错误修复 | fix-prompts.ts | 编译错误/运行时错误/类型错误/自动检测 |
组件生成 Prompt 进一步按复杂度分层:
- 基础组件:Button、Input、Select 等标准 UI 组件,有详细的属性要求
- 复合组件:Form、Table、Modal 等复杂组件,包含完整的交互逻辑要求
- 自定义组件:根据自然语言描述生成,灵活度最高
结构化输出解析
AI 生成的代码需要经过解析和验证才能使用。parser.ts 实现了完整的 SFC 解析器:
import { parseComponentCode, validateComponentCode } from '@lytjs/ai'
// 解析 AI 输出
const parsed = parseComponentCode(aiResponse)
// parsed.template: <template> 内容
// parsed.script: <script> 内容
// parsed.style: <style> 内容
// parsed.isScriptSetup: 是否使用 script setup
// parsed.isScopedStyle: 是否使用 scoped
// parsed.props: 提取的 Props 定义
// parsed.emits: 提取的 Emits 定义
// parsed.slots: 提取的 Slots 使用
// 验证代码质量
const validation = validateComponentCode(aiResponse)
// validation.valid: 是否通过验证
// validation.errors: 错误列表(如缺少 template、括号未闭合)
// validation.warnings: 警告列表(如使用了 v- 前缀、导入了 vue 包)
验证器会检查 Lyt.js 特有的兼容性问题:
- 检测
v-if、v-for等 Vue 前缀指令,建议改为 Lyt.js 的无前缀语法 - 检测
import from 'vue',建议改为@lytjs/*包 - 检测
v-html、v-text等指令,提示 Lyt.js 的替代写法 - 验证 template/script/style 三段式结构的完整性
TemplateEngine:12 种内置模板
当 AI 不可用时,TemplateEngine 提供了 12 种高质量的内置模板作为降级方案:
| 模板类型 | 说明 | 特性 |
|---|---|---|
functional | 函数式组件 | Props/Emits/Slots 定义 |
button | 按钮组件 | disabled/type/事件 |
input | 输入框组件 | v-model/placeholder/disabled |
form | 表单组件 | submit 事件/数据绑定 |
card | 卡片组件 | header/default/footer 三插槽 |
list | 列表组件 | each 渲染/item 插槽 |
table | 表格组件 | header/row 插槽 |
modal | 对话框组件 | 遮罩关闭/ESC 关闭/动画 |
dropdown | 下拉菜单 | 选项列表/选中状态 |
tabs | 标签页 | 切换动画/active 状态 |
navigation | 导航栏 | flex 布局 |
custom | 自定义组件 | 通用模板 |
模板引擎支持条件渲染({{#if}})和循环({{#each}})两种块级指令,以及嵌套处理:
import { TemplateEngine } from '@lytjs/ai'
const engine = new TemplateEngine()
const code = engine.render(engine.getComponentTemplate('button'), {
name: 'MyButton',
pascalName: 'MyButton',
camelName: 'myButton',
kebabName: 'my-button',
style: true,
props: [
{ name: 'size', type: 'String', default: "'medium'" },
{ name: 'loading', type: 'Boolean', required: false },
],
emits: ['click'],
})
CodeCompleter:本地智能补全
CodeCompleter 提供基于规则的本地代码补全,无需网络请求,零延迟:
import { CodeCompleter } from '@lytjs/ai'
const completer = new CodeCompleter()
// API 补全
completer.getCompletions('ref', '')
// => [{ label: 'ref', kind: 'function', detail: 'import { ref } from "@lytjs/reactivity"', documentation: '创建响应式引用' }]
// 模板指令补全
completer.getCompletions('v-i', '')
// => [{ label: 'v-if', kind: 'directive', documentation: '条件渲染' }]
内置的补全项覆盖了 Lyt.js 核心 API 和全部模板指令:
- API 补全:
ref、reactive、computed、watch、watchEffect、nextTick、defineProps、defineEmits、onMounted、onUpdated、onUnmounted、provide、inject - 指令补全:
v-if、v-else、v-else-if、v-each、v-model、v-on、v-bind、v-show
CLI 工具:lyt-ai
lyt-ai 是 @lytjs/ai 自带的命令行工具,支持五个命令:
# 初始化配置文件
lyt-ai init
# 生成组件
lyt-ai component MyButton --type button --ai
lyt-ai component UserCard --type card -o ./src/components/UserCard.lyt
# 生成 Store
lyt-ai store counter --ai -d "一个计数器 Store"
# 生成页面
lyt-ai page Dashboard --ai
# 生成 API
lyt-ai api users --ai --method GET
完整的命令行选项:
| 选项 | 说明 |
|---|---|
--ai / --no-ai | 启用/禁用 AI 生成 |
-t / --type | 组件类型 |
-o / --output | 输出文件路径 |
-d / --description | 生成描述 |
--api-key | AI API Key |
--model | AI 模型名称 |
--provider | AI 提供商(openai/anthropic/custom) |
--base-url | AI API 基础 URL |
--no-style | 不添加样式 |
三层配置体系
ConfigLoader 实现了灵活的三层配置合并机制:
第一层:配置文件 .lytrc.json
{
"ai": {
"provider": "openai",
"apiKey": "sk-xxx",
"model": "gpt-4o",
"baseUrl": "https://api.openai.com/v1",
"temperature": 0.7,
"maxTokens": 2000
}
}
配置文件支持向上查找(类似 .eslintrc),从当前目录逐级向上搜索。
第二层:环境变量
export LYT_AI_PROVIDER=openai
export LYT_AI_APIKEY=sk-xxx
export LYT_AI_MODEL=gpt-4o
export LYT_AI_BASEURL=https://api.openai.com/v1
export LYT_AI_TEMPERATURE=0.7
export LYT_AI_MAXTOKENS=2000
环境变量支持自动类型转换(字符串转数字、布尔值等)。
第三层:命令行选项
命令行选项优先级最高,可以覆盖前两层配置。
三层配置通过 ConfigLoader.mergeConfig() 进行深度合并,确保灵活性和可预测性。
优雅降级:AI 不可用时怎么办?
@lytjs/ai 的设计哲学是:AI 是增强,不是依赖。
当 AI 服务不可用时(API Key 缺失、网络超时、服务宕机),系统会自动回退到内置的 TemplateEngine,使用预设模板生成代码。整个过程对开发者透明:
const generator = new AIGenerator({ useAI: true })
// AI 可用 => 使用 AI 生成,返回 usedAI: true
// AI 不可用 => 自动降级到模板生成,返回 usedAI: false
const result = await generator.generateComponent({
name: 'MyButton',
type: 'button',
})
降级逻辑在 AIGenerator 的每个生成方法中都有体现:
async generateComponent(config: ComponentConfig): Promise<GenerateResult> {
if (this.useAI && this.aiClient) {
try {
// 尝试 AI 生成
const response = await this.aiClient.chat([...])
return { code: this.extractCode(response.content), usedAI: true }
} catch (error) {
messages.push(`AI 生成失败,使用模板生成: ${error.message}`)
// 自动降级
}
}
// 使用模板引擎生成
const result = this.componentGenerator.generate(config)
return { ...result, usedAI: false }
}
AI IDE 集成
@lytjs/ai 专门为 AI IDE(Trae、Cursor 等)提供了完整的集成方案,位于项目的 .trae/ 目录:
.trae/
├── README.md # AI IDE 集成指南
├── context.md # 项目上下文(帮助 AI 理解项目结构)
├── api-reference.md # API 快速参考
├── quick-start.md # 快速入门指南
├── best-practices.md # 最佳实践
├── ai-integration-examples.md # AI 使用示例
└── prompts/
├── component.md # 组件生成专用 Prompt
├── store.md # Store 生成专用 Prompt
├── page.md # 页面生成专用 Prompt
└── api.md # API 生成专用 Prompt
这些文件可以被 AI IDE 直接引用,作为系统上下文使用,确保 AI 助手在对话中始终遵循 Lyt.js 的规范。
LLM 友好文档
除了 .trae/ 目录的 IDE 集成文档,项目根目录还提供了两个 LLM 友好的文档文件:
llms.txt(约 150 行精简版):包含核心特性、包结构、API 概览等关键信息,适合作为 AI 的系统上下文llms-full.txt(完整版):包含完整的 API 文档、使用示例和最佳实践
这两个文件遵循 llms.txt 标准,可以被 AI 搜索引擎和编程助手直接索引。
实战示例
场景一:快速生成 CRUD 组件
# 生成用户列表组件
lyt-ai component UserList --type table --ai -d "用户管理列表,支持搜索和分页"
# 生成用户表单组件
lyt-ai component UserForm --type form --ai -d "用户新增/编辑表单"
# 生成对应的 Store
lyt-ai store user --ai -d "用户状态管理"
场景二:使用 LytAIAssistant 构建自定义工具
import { LytAIAssistant } from '@lytjs/ai'
const assistant = new LytAIAssistant({
provider: 'openai',
openai: { apiKey: process.env.LYT_AI_APIKEY! },
})
// 验证连接
const isValid = await assistant.validateConnection()
console.log('AI 连接状态:', isValid)
// 生成组件并验证
const result = await assistant.generateComponent('一个带图标的导航菜单', {
name: 'IconNav',
validate: true,
})
if (result.valid) {
console.log('生成成功:', result.parsed.template)
} else {
console.log('验证警告:', result.validation?.warnings)
}
场景三:使用本地 Ollama 实现完全离线开发
# 启动 Ollama
ollama serve
# 拉取代码模型
ollama pull codellama
# 使用本地模型生成
lyt-ai component DataTable --type table --ai \
--provider ollama \
--model codellama \
--base-url http://localhost:11434
// .lytrc.json
{
"ai": {
"provider": "ollama",
"model": "codellama",
"baseUrl": "http://localhost:11434",
"temperature": 0.3,
"maxTokens": 4000,
"timeout": 120000
}
}
完全离线,数据不出本地,适合对数据安全有严格要求的场景。
设计亮点总结
1. Prompt 即规范
所有 Prompt 都内置了 Lyt.js 的语法规范和 API 参考,LLM 生成的代码天然符合框架要求。这不是简单的"在提示词里提一句",而是将框架的完整知识体系编码到 Prompt 中。
2. 结构化输出 + 验证
AI 生成的是自然语言,但前端需要的是结构化代码。parser.ts 实现了完整的 SFC 解析器,能从 AI 输出中提取 template/script/style 三段,并验证语法正确性和框架兼容性。
3. 优雅降级
AI 是增强而非依赖。当 AI 不可用时,12 种内置模板确保开发流程不中断。usedAI 标志让开发者清楚知道代码的来源。
4. 零依赖的 AI 包
@lytjs/ai 本身没有运行时依赖,使用原生 fetch API 调用 LLM 服务,与 Lyt.js 框架"零运行时依赖"的理念一脉相承。
5. 多模型自由切换
统一的 AIProviderInterface 让开发者可以在 OpenAI、Claude、Ollama 之间自由切换,甚至可以注入自定义 Provider。switchProvider() 方法支持运行时动态切换。
与 Lyt.js 框架的协同
@lytjs/ai 不是孤立的 AI 工具,而是深度集成到 Lyt.js v5.0.1 生态中的有机组成部分:
| Lyt.js 能力 | AI 集成 |
|---|---|
| 50+ UI 组件 | AI 可生成符合组件规范的代码 |
| 32 个子包 | Prompt 内置完整的包结构知识 |
| 零运行时依赖 | AI 包本身也是零依赖 |
| 2833+ 测试用例 | 生成的代码可被测试框架验证 |
| Vapor Mode | Prompt 中包含 Vapor 优化建议 |
结语
@lytjs/ai 用约 5,360 行代码实现了一个完整的前端 AI 开发工具链:从多模型 Provider 抽象到 Prompt 工程,从结构化输出解析到优雅降级,从 CLI 工具到 AI IDE 集成。它不是简单的"套壳 OpenAI API",而是一个经过深思熟虑的、与框架深度耦合的 AI 开发体验。
在 AI 编程助手日益普及的今天,框架级别的 AI 集成将成为差异化竞争的关键。Lyt.js 的实践表明:最好的 AI 集成不是让开发者去学 AI,而是让 AI 来学框架。
本文所有代码和数据均来自 Lyt.js v5.0.1 实际源码(
packages/ai/目录),项目地址:gitee.com/lytjs/lytjs