Lyt.js AI:让前端开发进入智能生成时代

414 阅读8分钟

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-keyAI API Key
--modelAI 模型名称
--providerAI 提供商(openai/anthropic/custom)
--base-urlAI 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 ModePrompt 中包含 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