Files
writing-agent/src/runtime/llm-factory.ts
T

71 lines
2.0 KiB
TypeScript

import { profileToLlmConfig } from "../config/api-profiles.js";
import {
ensureActiveProfileDefault,
resolveActiveProfile,
} from "../config/settings.js";
import {
createMockMainAgentResponse,
MockLlmProvider,
OpenAiCompatibleProvider,
type LlmProvider,
} from "../llm/client.js";
import type { PresetPackage } from "../types/preset.js";
import {
wrapLlmForSession,
type LlmTrackingRef,
} from "../llm/preset-wrapper.js";
export type { LlmTrackingRef };
function buildInnerLlm(): LlmProvider {
ensureActiveProfileDefault();
const profile = resolveActiveProfile();
if (profile?.apiKey?.trim()) {
return new OpenAiCompatibleProvider(profileToLlmConfig(profile));
}
return new MockLlmProvider([
createMockMainAgentResponse({
action: "run_worker",
reason: "信息已足够,建议运行 outline-worker 生成大纲。",
workerId: "outline-worker",
requiresApproval: true,
}),
createMockMainAgentResponse({
action: "finish",
reason: "创作流程结束",
requiresApproval: false,
}),
]);
}
/** Web/CLI 默认 LLM:本地 profile + 全局 preset + token 统计 */
export function createDefaultMainAgentLlm(
trackingRef?: LlmTrackingRef,
): LlmProvider {
return wrapLlmForSession(buildInnerLlm(), trackingRef);
}
export function hasRealLlmConfig(): boolean {
ensureActiveProfileDefault();
return Boolean(resolveActiveProfile()?.apiKey?.trim());
}
/** @deprecated 包装层下 instanceof 不可靠,请用 hasRealLlmConfig */
export function isMockLlm(_llm: LlmProvider): boolean {
return !hasRealLlmConfig();
}
/** 设置页切换 profile / preset 后调用,返回新 LLM 实例 */
export function reloadDefaultMainAgentLlm(
trackingRef?: LlmTrackingRef,
): LlmProvider {
return createDefaultMainAgentLlm(trackingRef);
}
/** 试跑指定预设:生成参数跟这条预设走,不依赖当前选用。 */
export function createLlmForPreset(preset: PresetPackage): LlmProvider {
return wrapLlmForSession(buildInnerLlm(), undefined, () => preset);
}