




























@@ -0,0 +1,145 @@
1+import type { AgentRuntimePolicyConfig } from "../config/types.agents-shared.js";
2+import type { OpenClawConfig } from "../config/types.openclaw.js";
3+import { normalizeAgentId } from "../routing/session-key.js";
4+import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js";
5+import { resolveAgentRuntimePolicy } from "./agent-runtime-policy.js";
6+import { listAgentEntries } from "./agent-scope.js";
7+import {
8+normalizeEmbeddedAgentRuntime,
9+resolveEmbeddedAgentHarnessFallback,
10+type EmbeddedAgentHarnessFallback,
11+type EmbeddedAgentRuntime,
12+} from "./pi-embedded-runner/runtime.js";
13+14+export type AgentRuntimeMetadata = {
15+id: string;
16+fallback?: "pi" | "none";
17+source: "env" | "agent" | "defaults" | "implicit";
18+};
19+20+function normalizeRuntimeValue(value: unknown): EmbeddedAgentRuntime | undefined {
21+const normalized = typeof value === "string" ? normalizeLowercaseStringOrEmpty(value) : "";
22+return normalized ? normalizeEmbeddedAgentRuntime(normalized) : undefined;
23+}
24+25+function normalizeAgentHarnessFallback(
26+value: EmbeddedAgentHarnessFallback | undefined,
27+runtime: EmbeddedAgentRuntime,
28+): EmbeddedAgentHarnessFallback {
29+if (value) {
30+return value === "none" ? "none" : "pi";
31+}
32+return runtime === "auto" ? "pi" : "none";
33+}
34+35+function isPluginAgentRuntime(runtime: string): boolean {
36+return runtime !== "auto" && runtime !== "pi";
37+}
38+39+function resolveEffectiveFallback(params: {
40+envFallback?: EmbeddedAgentHarnessFallback;
41+envRuntime?: string;
42+runtime: EmbeddedAgentRuntime;
43+agentPolicy?: AgentRuntimePolicyConfig;
44+defaultsPolicy?: AgentRuntimePolicyConfig;
45+}): EmbeddedAgentHarnessFallback | undefined {
46+if (params.envFallback) {
47+return params.envFallback;
48+}
49+50+if (params.envRuntime && isPluginAgentRuntime(params.runtime)) {
51+return normalizeAgentHarnessFallback(undefined, params.runtime);
52+}
53+54+if (params.agentPolicy?.id) {
55+return normalizeAgentHarnessFallback(params.agentPolicy.fallback, params.runtime);
56+}
57+58+if (
59+params.envRuntime ||
60+params.defaultsPolicy?.id ||
61+params.agentPolicy?.fallback ||
62+params.defaultsPolicy?.fallback
63+) {
64+return normalizeAgentHarnessFallback(
65+params.agentPolicy?.fallback ?? params.defaultsPolicy?.fallback,
66+params.runtime,
67+);
68+}
69+70+return undefined;
71+}
72+73+export function resolveAgentRuntimeMetadata(
74+cfg: OpenClawConfig,
75+agentId: string,
76+env: NodeJS.ProcessEnv = process.env,
77+): AgentRuntimeMetadata {
78+const envFallback = resolveEmbeddedAgentHarnessFallback(env);
79+const envRuntime = normalizeRuntimeValue(env.OPENCLAW_AGENT_RUNTIME);
80+const normalizedAgentId = normalizeAgentId(agentId);
81+const agentEntry = listAgentEntries(cfg).find(
82+(entry) => normalizeAgentId(entry.id) === normalizedAgentId,
83+);
84+const agentPolicy = resolveAgentRuntimePolicy(agentEntry);
85+const defaultsPolicy = resolveAgentRuntimePolicy(cfg.agents?.defaults);
86+87+if (envRuntime) {
88+return {
89+id: envRuntime,
90+fallback: resolveEffectiveFallback({
91+ envFallback,
92+ envRuntime,
93+runtime: envRuntime,
94+ agentPolicy,
95+ defaultsPolicy,
96+}),
97+source: "env",
98+};
99+}
100+101+const agentRuntime = normalizeRuntimeValue(agentPolicy?.id);
102+if (agentRuntime) {
103+return {
104+id: agentRuntime,
105+fallback: resolveEffectiveFallback({
106+ envFallback,
107+runtime: agentRuntime,
108+ agentPolicy,
109+ defaultsPolicy,
110+}),
111+source: envFallback ? "env" : "agent",
112+};
113+}
114+115+const defaultsRuntime = normalizeRuntimeValue(defaultsPolicy?.id);
116+if (defaultsRuntime) {
117+return {
118+id: defaultsRuntime,
119+fallback: resolveEffectiveFallback({
120+ envFallback,
121+runtime: defaultsRuntime,
122+ agentPolicy,
123+ defaultsPolicy,
124+}),
125+source: envFallback ? "env" : agentPolicy?.fallback ? "agent" : "defaults",
126+};
127+}
128+129+return {
130+id: "pi",
131+fallback: resolveEffectiveFallback({
132+ envFallback,
133+runtime: "pi",
134+ agentPolicy,
135+ defaultsPolicy,
136+}),
137+source: envFallback
138+ ? "env"
139+ : agentPolicy?.fallback
140+ ? "agent"
141+ : defaultsPolicy?.fallback
142+ ? "defaults"
143+ : "implicit",
144+};
145+}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。