跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScriptAI大前端

前端调用 AI 接口全流程实战:从配置到流式响应

前端调用 AI 接口涉及跨域配置、请求封装及流式响应处理。通过智能文本处理工具案例,详解 Vite 代理设置、HTTP 请求工具封装、流式数据实时读取及 Vue 组件集成方案。重点解析如何通过流式传输实时展示 AI 生成内容,并提供润色与扩写功能的完整代码实现,帮助开发者快速上手 AI 能力接入。

片刻发布于 2026/3/23更新于 2026/5/1519 浏览

很多前端开发者在接入 AI 能力时,常对参数传递、流式响应处理感到困惑。其实流程是固定的,本文以'智能文本处理工具'为例,带你梳理从项目配置到 Vue 组件集成的完整链路。

项目结构梳理

核心依赖三个文件:vite.config.js 负责代理转发,apiClient.js 封装请求逻辑,aiService.js 提供具体业务函数。

1. 跨域代理配置 (vite.config.js)

Vite 开发环境下,直接请求后端容易触发跨域。通过配置代理,将 /writer_api 开头的请求自动转发到目标服务器。

// vite.config.js
import { defineConfig } from 'vite';

export default defineConfig({
  server: {
    proxy: {
      // AI 功能接口代理(润色/扩写等)
      '/writer_api': {
        target: 'http://192.168.0.1:3000', // 后端服务器地址
        changeOrigin: true,                // 解决跨域
        rewrite: path => path.replace(/^\/writer_api/, '') // 去掉前缀
      }
    }
  }
});
2. 请求工具封装 (apiClient.js)

不需要每次重复写 fetch 细节,封装一个 HTTP 客户端即可。这里使用原生 Fetch API,保持轻量。

// apiClient.js
class HttpClient {
  async post(url, data) {
    return fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(data)
    });
  }
}

export default new HttpClient();
3. AI 功能封装 (aiService.js)

这里定义了具体的业务方法,包括流式响应的处理逻辑。AI 生成内容通常是逐字返回的,我们需要实时读取流并更新 UI。

// aiService.js
import apiClient from './apiClient.js';

// 润色功能
export const polishText = async (text, style) => {
  return apiClient.post('/writer_api/generate/', {
    writing_mode: `润色${style}`,
    text: text
  });
};

// 扩写功能
export const expandText = async (text) => {
  return apiClient.post('/writer_api/generate/', {
    writing_mode: '扩写',
    text: text
  });
};

// 处理流式响应(AI 逐字返回结果时用)
export const readStreamResponse = async (response, onUpdate) => {
  const reader = response.body.getReader();
  const decoder = new TextDecoder();
  let result = '';
  
  while (true) {
    const { done, value } = await reader.read();
    if (done) break;
    result += decoder.decode(value);
    onUpdate(result); // 实时更新结果
  }
  return result;
};

动手实践:Vue 组件集成

接下来我们构建一个简单的页面,包含输入框、功能按钮和结果展示区。

页面结构与逻辑

在 Vue 组件中,我们将上述服务函数引入,并通过异步函数绑定点击事件。注意处理用户输入校验和异常捕获。

<template>
  <div class="ai-tool">
    <!-- 输入区域 -->
    <textarea v-model="userText" placeholder="请输入需要处理的文本..."></textarea>
    
    <!-- 功能按钮 -->
    <div class="buttons">
      <button @click="handlePolish">润色</button>
      <button @click="handleExpand">扩写</button>
    </div>
    
    <!-- 结果展示 -->
    <div class="result">
      <h3>处理结果:</h3>
      <p>{{ resultText }}</p>
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import { polishText, expandText, readStreamResponse } from './aiService.js';

const userText = ref('');
const resultText = ref('');

// 1. 调用润色功能
const handlePolish = async () => {
  if (!userText.value) {
    alert('请输入文本!');
    return;
  }
  try {
    const response = await polishText(userText.value, '更正式');
    await readStreamResponse(response, (partialResult) => {
      resultText.value = partialResult; // 实时显示到页面
    });
  } catch (error) {
    alert('润色失败,请重试!');
    console.error(error);
  }
};

// 2. 调用扩写功能
const handleExpand = async () => {
  if (!userText.value) {
    alert('请输入文本!');
    return;
  }
  try {
    const response = await expandText(userText.value);
    await readStreamResponse(response, (partialResult) => {
      resultText.value = partialResult;
    });
  } catch (error) {
    alert('扩写失败,请重试!');
  }
};
</script>

<style scoped>
.ai-tool {
  max-width: 800px;
  margin: 20px auto;
  padding: 20px;
}
textarea {
  width: 100%;
  height: 150px;
  padding: 10px;
  margin-bottom: 10px;
}
.buttons {
  margin-bottom: 20px;
}
button {
  margin-right: 10px;
  padding: 8px 16px;
  cursor: pointer;
}
.result {
  padding: 10px;
  border: 1px solid #eee;
}
</style>

关键步骤总结

不管调用哪种 AI 功能,核心链路是一致的:

  1. 获取输入:确保用户已填写内容。
  2. 调用接口:根据需求选择 polishText 或 expandText。
  3. 流式处理:利用 readStreamResponse 实现打字机效果,提升体验。
  4. 异常捕获:用 try/catch 包裹异步操作,防止页面卡死。

常见问题与扩展

  • 为什么要处理流式响应? AI 生成内容是逐字返回的,流式处理能让用户实时看到进度,避免长时间等待白屏。
  • 想加翻译功能怎么办? 在 aiService.js 中添加 translateText 函数,并在页面增加对应按钮,逻辑复用扩写部分。
  • 后端接口地址变了怎么办? 只需修改 vite.config.js 中的 target 地址,无需改动业务代码。

调用 AI 接口本质就是'传参→接收流→渲染'。掌握这套模式后,无论是润色、扩写还是其他功能,都能快速接入。

目录

  1. 项目结构梳理
  2. 1. 跨域代理配置 (vite.config.js)
  3. 2. 请求工具封装 (apiClient.js)
  4. 3. AI 功能封装 (aiService.js)
  5. 动手实践:Vue 组件集成
  6. 页面结构与逻辑
  7. 关键步骤总结
  8. 常见问题与扩展
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Dify MCP-Server 插件将工作流发布为第三方可调用服务
  • DeepSeek 中冷启动数据与多阶段训练的作用
  • DeepSeek-R1 大模型基于 MS-Swift 框架的部署、推理与微调指南
  • 融合手术导板与增强现实的椎弓根螺钉置入技术验证
  • 本地部署 Z-Image-Turbo:16GB 显存实现高效 AI 绘画
  • DeepSeek-R1 大模型基于 MS-Swift 框架的部署、推理与微调实践
  • Git 多 IDE 项目共用远程仓库及子模块问题解决方案
  • 时序数据库选型指南:Apache IoTDB 核心优势与实践
  • 分布式配置中心深度解析:Spring Cloud Config 与 Apollo 架构对比
  • 大语言模型(LLM)入门指南与核心技术解析
  • Servlet 原生 Response 实现文件下载
  • Flutter package:web 在 OpenHarmony 中的 Wasm GC 与 DOM 互操作适配
  • 二分查找算法详解与常见变种实战
  • CRC-8 算法详细解析
  • MCPHost:通过命令行让大模型与外部工具交互
  • Python HTTP 客户端库 HTTPX 核心用法与异步支持详解
  • Web 自动化测试入门:从概念到 Selenium 实战
  • Python 电商大数据分析可视化大屏实现方案
  • Mac Mini M4 本地部署大模型实战:Ollama 与 Llama 环境搭建
  • Lua 元表与元方法详解

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online