{"record":{"id":"cd7cf88234c4d893","repo":"microsoft/semantic-kernel","slug":"no-iexternalkernelprocessmessagechannel-found-nee","errorCode":null,"errorMessage":"No IExternalKernelProcessMessageChannel found, need at least 1 to emit external messages","messagePattern":"No IExternalKernelProcessMessageChannel found, need at least 1 to emit external messages","errorType":"exception","errorClass":"KernelException","httpStatus":null,"severity":"error","filePath":"dotnet/src/Experimental/Process.LocalRuntime/LocalProxy.cs","lineNumber":75,"sourceCode":"\n        if (this._proxy.ProxyMetadata != null && message.SourceEventId != null && this._proxy.ProxyMetadata.EventMetadata.TryGetValue(message.SourceEventId, out var metadata) && metadata != null)\n        {\n            functionParameters![kvp.Key] = KernelProcessProxyMessageFactory.CreateProxyMessage(this.ParentProcessId!, message.SourceEventId, metadata.TopicName, kvp.Value);\n        }\n    }\n\n    /// <inheritdoc/>\n    protected override async ValueTask InitializeStepAsync()\n    {\n        if (this._isInitialized)\n        {\n            return;\n        }\n\n        // Ensure initialization happens only once if first time or again if \"deinitialization\" was called\n        if (this.ExternalMessageChannel == null)\n        {\n            throw new KernelException(\"No IExternalKernelProcessMessageChannel found, need at least 1 to emit external messages\");\n        }\n\n        await this.ExternalMessageChannel.Initialize().ConfigureAwait(false);\n        await base.InitializeStepAsync().ConfigureAwait(false);\n        this._isInitialized = true;\n    }\n\n    /// <summary>\n    /// Deinitialization of the Proxy Step, calling <see cref=\"KernelProxyStep.DeactivateAsync(KernelProcessStepExternalContext)\"/>\n    /// </summary>\n    /// <returns></returns>\n    public override async Task DeinitializeStepAsync()\n    {\n        MethodInfo? derivedMethod = this._stepInfo.InnerStepType.GetMethod(\n            nameof(KernelProxyStep.DeactivateAsync),\n            BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,\n            binder: null,\n            types: [typeof(KernelProcessStepExternalContext)],","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/microsoft/semantic-kernel/blob/c028a0c7dc4f0814cdcbaba9d998f187a41197bf/dotnet/src/Experimental/Process.LocalRuntime/LocalProxy.cs#L57-L93","documentation":"Thrown by LocalProxy.InitializeStepAsync when ExternalMessageChannel is null. A proxy step's purpose is to bridge process messages to an external system (e.g., a Dapr actor or another messaging infrastructure); without an IExternalKernelProcessMessageChannel it cannot emit external messages and initialization fails.","triggerScenarios":"A KernelProcessProxy step is added to a process, but no ExternalMessageChannel is provided to the LocalProxy instance. The channel is typically injected when the proxy step is constructed within a process that supports external messaging.","commonSituations":"Using a KernelProcessProxy in the LocalProcess runtime (in-process) which does not provide an external message channel by default; forgetting to wire the ExternalMessageChannel when programmatically constructing the process; using proxy steps that require Dapr or another external runtime but running in local mode.","solutions":["Provide an IExternalKernelProcessMessageChannel implementation when using KernelProcessProxy steps.","If running in the local runtime, avoid KernelProcessProxy steps or supply a custom ExternalMessageChannel.","If using the Dapr runtime, ensure the DaprKernelProcessContext wires the channel correctly."],"exampleFix":"// before - proxy step with no external channel\nvar proxy = new KernelProcessProxy { ... };\nprocess.AddStep(proxy);\n// after - provide an external message channel\nlocalProxy.ExternalMessageChannel = new MyExternalMessageChannel();","handlingStrategy":"validation","validationCode":"// Before using a KernelProcessProxy, verify an external message channel is available\nif (step is KernelProcessProxy && externalMessageChannel is null)\n{\n    throw new InvalidOperationException(\"KernelProcessProxy steps require an IExternalKernelProcessMessageChannel.\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Only use KernelProcessProxy steps in runtimes that provide an IExternalKernelProcessMessageChannel (e.g., Dapr).","Implement and inject a custom channel when running in local mode.","Review the runtime documentation to confirm external channel support before adding proxy steps."],"tags":["process-framework","proxy-step","external-channel","initialization","configuration"],"backgroundTag":null,"analyzedSha":"c028a0c7dc4f0814cdcbaba9d998f187a41197bf","analyzedAt":"2026-08-13T13:48:05.040Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}