pdca
Version:
🎯 AI 驅動的 PDCA 多代理開發系統 - 智能循環控制 + 成本管理 + Token 優化 + 多 AI 引擎支援
191 lines • 5.59 kB
JavaScript
/**
* AI 引擎適配器
* 統一支援多種 AI CLI (Claude, Gemini, OpenAI 等)
*/
import { execSync, spawn } from 'child_process';
import { EventEmitter } from 'events';
/**
* Claude CLI 適配器
*/
export class ClaudeEngine {
name = 'Claude CLI';
command = 'claude';
checkCommand = 'claude --version';
async isAvailable() {
try {
execSync(this.checkCommand, { stdio: 'ignore' });
return true;
}
catch {
return false;
}
}
async executePrompt(prompt) {
// Claude CLI 不支援直接執行 prompt
// 需要透過檔案系統或其他方式
throw new Error('Claude CLI 不支援直接執行 prompt,請使用互動模式');
}
startInteractive() {
return spawn(this.command, [], {
stdio: 'pipe',
shell: true
});
}
}
/**
* Gemini CLI 適配器
*/
export class GeminiEngine {
name = 'Gemini CLI';
command = 'gemini';
checkCommand = 'gemini --version';
promptFlag = '-p';
async isAvailable() {
try {
execSync(this.checkCommand, { stdio: 'ignore' });
return true;
}
catch {
return false;
}
}
async executePrompt(prompt) {
try {
// 使用 gemini -p 執行 prompt
const result = execSync(`gemini -p "${prompt.replace(/"/g, '\\"')}"`, {
encoding: 'utf8',
maxBuffer: 10 * 1024 * 1024 // 10MB
});
return result;
}
catch (error) {
throw new Error(`Gemini 執行失敗: ${error.message}`);
}
}
startInteractive() {
return spawn(this.command, [], {
stdio: 'pipe',
shell: true
});
}
}
/**
* OpenAI CLI 適配器
*/
export class OpenAIEngine {
name = 'OpenAI CLI';
command = 'openai';
checkCommand = 'openai --version';
async isAvailable() {
try {
execSync(this.checkCommand, { stdio: 'ignore' });
return true;
}
catch {
return false;
}
}
async executePrompt(prompt) {
try {
const result = execSync(`openai complete --prompt "${prompt.replace(/"/g, '\\"')}"`, {
encoding: 'utf8',
maxBuffer: 10 * 1024 * 1024
});
return result;
}
catch (error) {
throw new Error(`OpenAI 執行失敗: ${error.message}`);
}
}
}
/**
* AI 引擎管理器
*/
export class AIEngineManager extends EventEmitter {
engines = [
new ClaudeEngine(),
new GeminiEngine(),
new OpenAIEngine()
];
selectedEngine;
/**
* 檢測所有可用的 AI 引擎
*/
async detectAvailableEngines() {
const available = [];
console.log('🔍 檢測可用的 AI CLI...');
for (const engine of this.engines) {
if (await engine.isAvailable()) {
available.push(engine);
console.log(`✅ 檢測到 ${engine.name}`);
this.emit('engine-detected', engine);
}
else {
console.log(`❌ 未找到 ${engine.name}`);
}
}
if (available.length === 0) {
console.log('\n⚠️ 未檢測到任何 AI CLI');
console.log('請安裝至少一個 AI CLI:');
console.log('- Gemini CLI (免費): npm install -g @google/gemini-cli');
console.log('- Claude CLI: https://claude.ai/cli');
}
return available;
}
/**
* 自動選擇最佳引擎
*/
async selectBestEngine() {
const available = await this.detectAvailableEngines();
if (available.length === 0) {
throw new Error('未檢測到任何 AI CLI,請至少安裝一個');
}
// 優先順序:Claude > Gemini > 其他
const priorityOrder = ['claude', 'gemini', 'openai'];
for (const cmd of priorityOrder) {
const engine = available.find(e => e.command === cmd);
if (engine) {
this.selectedEngine = engine;
console.log(`\n🚀 使用 ${engine.name} 作為 AI 引擎`);
this.emit('engine-selected', engine);
return engine;
}
}
// 使用第一個可用的
this.selectedEngine = available[0];
console.log(`\n🚀 使用 ${this.selectedEngine.name} 作為 AI 引擎`);
this.emit('engine-selected', this.selectedEngine);
return this.selectedEngine;
}
/**
* 根據名稱選擇引擎
*/
async selectEngineByName(name) {
const engine = this.engines.find(e => e.command === name ||
e.name.toLowerCase().includes(name.toLowerCase()));
if (!engine) {
throw new Error(`未知的 AI 引擎: ${name}`);
}
if (!await engine.isAvailable()) {
throw new Error(`${engine.name} 未安裝或不可用`);
}
this.selectedEngine = engine;
console.log(`🚀 使用 ${engine.name} 作為 AI 引擎`);
this.emit('engine-selected', engine);
return engine;
}
/**
* 獲取當前選擇的引擎
*/
getSelectedEngine() {
return this.selectedEngine;
}
/**
* 添加自定義引擎
*/
addEngine(engine) {
this.engines.push(engine);
}
}
export default AIEngineManager;
//# sourceMappingURL=ai-engine-adapter.js.map