본문으로 건너뛰기

[openclaw] OpenClaw: 런타임 플러그인 레지스트리 재사용을 통한 성능 최적화

PR 링크: openclaw/openclaw#76004 상태: Merged | 변경: +None / -None

들어가며

OpenClaw 프로젝트에서 resolvePreparedExtraParams 함수는 에이전트 런타임 플랜(buildAgentRuntimePlan)을 구축하는 과정에서 모든 임베디드 턴마다 실행되는 중요한 부분입니다. 이 함수는 prepareProviderExtraParamsresolveProviderExtraParamsForTransport라는 두 가지 프로바이더 플러그인 훅을 호출하며, 이 과정에서 프로바이더 런타임 플러그인 해상도가 트리거됩니다. 문제는 에이전트, 모델, 설정 등 아무것도 변경되지 않았음에도 불구하고, 이 함수가 매 턴마다 약 1.9초의 동기 비용을 발생시킨다는 점이 프로파일링을 통해 확인되었습니다. 이는 안정적인 입력(프로바이더, modelId, agentId 등)에 대해 결과가 결정적임에도 불구하고 매번 재계산되어 불필요한 오버헤드를 유발하고 있었습니다.

이 PR은 이러한 비효율성을 해결하기 위해 resolvePreparedExtraParams 함수의 결과를 캐싱하여, 동일한 입력에 대해서는 재계산을 피하고 캐시된 값을 재사용함으로써 성능을 크게 향상시키는 것을 목표로 합니다.

코드 분석: resolvePreparedExtraParams 최적화

src/agents/pi-embedded-runner/extra-params.ts 파일 변경

이 PR의 핵심 변경사항은 src/agents/pi-embedded-runner/extra-params.ts 파일에 캐싱 로직을 도입한 것입니다. resolvePreparedExtraParams 함수는 이제 WeakMapMap을 조합한 캐시 메커니즘을 사용하여 이전에 계산된 결과를 저장하고 재사용합니다.

1. 캐시 저장소 초기화

--- a/src/agents/pi-embedded-runner/extra-params.ts
+++ b/src/agents/pi-embedded-runner/extra-params.ts
@@ -38,6 +38,8 @@ const providerRuntimeDeps = {
   ...defaultProviderRuntimeDeps,
 };
 
+let preparedExtraParamsCache = new WeakMap<OpenClawConfig, Map<string, Record<string, unknown>>>();
+
 export const __testing = {
   setProviderRuntimeDepsForTest(
     deps: Partial<typeof defaultProviderRuntimeDeps> | undefined,
@@ -51,6 +53,7 @@ export const __testing = {
       deps?.wrapProviderStreamFn ?? defaultProviderRuntimeDeps.wrapProviderStreamFn;
   },
   resetProviderRuntimeDepsForTest(): void {
+    clearPreparedExtraParamsCache();
     providerRuntimeDeps.prepareProviderExtraParams =
       defaultProviderRuntimeDeps.prepareProviderExtraParams;
     providerRuntimeDeps.resolveProviderExtraParamsForTransport =

preparedExtraParamsCache라는 WeakMap이 새로 추가되었습니다. 이 WeakMapOpenClawConfig 객체 참조를 키로 사용합니다. WeakMap을 사용하면 OpenClawConfig 객체가 더 이상 참조되지 않을 때 가비지 컬렉션될 수 있으므로, 수동으로 캐시를 무효화할 필요 없이 메모리 누수를 방지할 수 있습니다. 각 OpenClawConfig 객체에 대해서는 내부적으로 Map<string, Record<string, unknown>>을 사용하여 실제 캐시된 데이터를 저장합니다. __testing.resetProviderRuntimeDepsForTest 함수에 clearPreparedExtraParamsCache() 호출이 추가되어 테스트 환경에서 캐시를 쉽게 초기화할 수 있도록 했습니다.

2. 캐시 키 생성 로직

--- a/src/agents/pi-embedded-runner/extra-params.ts
+++ b/src/agents/pi-embedded-runner/extra-params.ts
@@ -134,6 +137,60 @@ function hasExplicitTransportSetting(settings: { transport?: unknown }): boolean
   return Object.hasOwn(settings, 

> ⚠️ **알림:** 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.

댓글

관련 포스트

PR Analysis 의 다른글