+
38
-

acejs代码编辑器如何调用openai api实现选择代码修改与代码自动补全?

acejs代码编辑器如何调用openai api实现选择代码修改与代码自动补全?


网友回复

+
9
-

这个任务的核心分为三个部分:

构建一个智能的 Prompt: 我们不能只把用户的要求发给 OpenAI。我们需要将用户的要求、上下文(选中的代码或光标周围的代码)、以及明确的指令(比如“只返回代码”)打包成一个高质量的“提示工程”(Prompt Engineering)字符串。

安全的后端代理: 永远不要在前端暴露你的 OpenAI API 密钥。你需要一个简单的后端服务来接收前端的请求,附加上你的密钥,然后安全地调用 OpenAI API,并将结果流式传回给前端。

前端的交互逻辑: 前端负责处理用户输入、管理编辑器状态、调用后端代理,并以流式的方式将结果渲染回编辑器。

下面,我将提供一个完整的、可直接运行的前端实现,并为您提供一个非常简单的后端代理示例(使用 Node.js)

第 1 步:前端实现 (HTML + JS)

这个文件包含了所有用户能看到和交互的部分。它会模拟后端调用,让你即使没有后端也能测试前端的完整逻辑。

ai-editor.html 文件:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI 智能代码助手 (ACE Editor + OpenAI)</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; margin: 0; display: flex; flex-direction: column; height: 100vh; background-color: #f4f7f9; }
.header { padding: 10px 15px; background: #fff; border-bottom: 1px solid #ddd; box-shadow: 0 2px 5px rgba(0,0,0,0.05); z-index: 10; }
.main-content { display: flex; flex-grow: 1; }
#editor { width: 100%; height: 100%; font-size: 14px; }
.control-panel { padding: 15px; background: #fff; border-top: 1px solid #ddd; display: flex; align-items: center; gap: 15px; }
#ai-prompt-input { flex-grow: 1; padding: 10px; border: 1px solid #ccc; border-radius: 5px; font-size: 14px; }
.btn { padding: 10px 15px; border: none; border-radius: 5px; cursor: pointer; font-size: 14px; transition: background-color 0.2s; }
.btn-primary { background-color: #007bff; color: white; }
.btn-primary:hover { background-color: #0056b3; }
.btn-danger { background-color: #dc3545; color: white; }
.btn-danger:hover { background-color: #c82333; }
</style>
</head>
<body>

<header class="header">
<h1>AI 智能代码助手</h1>
</header>

<main class="main-content">
<div id="editor"></div>
</main>

<footer class="control-panel">
<input type="text" id="ai-prompt-input" placeholder="输入您的要求,例如:将此函数转换为箭头函数">
<button id="run-ai-btn" class="btn btn-primary">执行 AI 操作</button>
<button id="cancel-ai-btn" class="btn btn-danger" style="display: none;">取消</button>
</footer>

<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.15.2/ace.js"></script>
<script>
// --- 1. 初始化 ACE 编辑器 ---
var editor = ace.edit("editor");
editor.setTheme("ace/theme/monokai");
editor.session.setMode("ace/mode/javascript");
editor.setValue(`// 示例代码:您可以选中代码或将光标放在某处

function calculateFactorial(n) {
// 这是一个计算阶乘的函数
if (n < 0) {
return "错误:不支持负数";
}
let result = 1;
for (let i = 2; i <= n; i++) {
result *= i;
}
return result;
}

console.log('光标放在这里,然后输入 "创建一个打印 hello world 的函数" 试试');
`, -1);

// --- 2. 获取 UI 元素 ---
var runAiBtn = document.getElementById("run-ai-btn");
var cancelAiBtn = document.getElementById("cancel-ai-btn");
var promptInput = document.getElementById("ai-prompt-input");

var isRequestActive = false;
var isRequestCancelled = false;

// --- 3. 核心功能:AI 任务处理器 ---
function runAIAssist() {
if (isRequestActive) {
alert("AI 正在处理中,请稍候...");
return;
}

var userInstruction = promptInput.value.trim();
if (!userInstruction) {
alert("请输入您的要求!");
return;
}

// --- 准备编辑器和状态 ---
var session = editor.getSession();
var doc = session.getDocument();
var undoManager = session.getUndoManager();

// --- 构建智能 Prompt ---
var selectionRange = editor.getSelectionRange();
var selectedText = editor.getSelectedText();
var fullCode = editor.getValue();
var engineeredPrompt = constructOpenAIPrompt(userInstruction, selectedText, fullCode, selectionRange.start);

// --- 开始请求流程 ---
isRequestActive = true;
isRequestCancelled = false;
runAiBtn.disabled = true;
promptInput.disabled = true;
cancelAiBtn.style.disp...

点击查看剩余70%

我知道答案,我要回答