Files

28 lines
1.9 KiB
JavaScript

'use strict';
// 모델 참조(ref)에 따라 실행 엔진을 고른다: anthropic → Claude Code CLI, 그 외 → OpenAI 호환 에이전트.
const { runClaude } = require('./claude');
const { runAgent } = require('./engine-openai');
const { runCodex } = require('./engine-codex');
const providers = require('./providers');
const CLAUDE_TOOLSETS = { files: 'Write,Edit,MultiEdit,Read,Glob,Grep', read: 'Read,Glob,Grep,WebFetch', none: 'Read' };
/**
* @param {object} o ref(모델 참조), userId, siteDir, prompt, systemPrompt, toolset('files'|'read'|'none'), sessionId, resume, noPersist, onEvent, onStart
* @returns runClaude 와 동일한 결과 형태 + {ref, provider, source}
*/
async function runModel(o) {
const m = providers.resolveModel(o.ref, o.userId);
let r;
if (m.kind === 'claude-cli') {
r = await runClaude({ siteDir: o.siteDir, prompt: o.prompt, systemPrompt: o.systemPrompt, tools: CLAUDE_TOOLSETS[o.toolset || 'files'], sessionId: o.sessionId, resume: o.resume, noPersist: o.noPersist, model: m.model, authEnv: m.source === 'user' ? (m.apiKey ? { ANTHROPIC_API_KEY: m.apiKey } : { CLAUDE_CODE_OAUTH_TOKEN: m.oauthToken }) : null, onEvent: o.onEvent, onStart: o.onStart });
} else if (m.kind === 'codex-cli') {
r = await runCodex({ siteDir: o.siteDir, prompt: o.prompt, systemPrompt: o.systemPrompt, toolset: o.toolset || 'files', model: m.model, price: m.price, onEvent: o.onEvent, onStart: o.onStart });
} else {
r = await runAgent({ siteDir: o.siteDir, prompt: o.prompt, systemPrompt: o.systemPrompt, toolset: o.toolset || 'files', model: m.model, provider: m.provider, apiKey: m.apiKey, baseUrl: m.baseUrl, price: m.price, onEvent: o.onEvent, onStart: o.onStart });
}
if (m.source === 'user' && m.connId) { try { providers.updateUserConn(o.userId, m.connId, { lastUsedAt: new Date().toISOString() }); } catch (_) {} }
return { ...r, ref: m.ref, provider: m.provider, source: m.source, model: m.ref };
}
module.exports = { runModel };