microsoft/autogen · error · ValueError

kernel must be an instance of semantic_kernel.kernel.Kernel

Error message

kernel must be an instance of semantic_kernel.kernel.Kernel

What it means

Thrown by SKChatCompletionAdapter._get_kernel when a kernel value is present but is not an instance of semantic_kernel.kernel.Kernel. This guards against wrong-typed objects (mocks, config dicts, other framework kernels) being passed via the constructor or extra_create_args['kernel'] and failing later deep inside Semantic Kernel.

Source

Thrown at python/packages/autogen-ext/src/autogen_ext/models/semantic_kernel/_sk_chat_completion_adapter.py:434

                    full_name = function_name

                if item.id is None:
                    raise ValueError("Function call ID is required")

                if isinstance(item.arguments, Mapping):
                    arguments = json.dumps(item.arguments)
                else:
                    arguments = item.arguments or "{}"

                function_calls.append(FunctionCall(id=item.id, name=full_name, arguments=arguments))
        return function_calls

    def _get_kernel(self, extra_create_args: Mapping[str, Any]) -> Kernel:
        kernel = extra_create_args.get("kernel", self._kernel)
        if not kernel:
            raise ValueError("kernel must be provided either in constructor or extra_create_args")
        if not isinstance(kernel, Kernel):
            raise ValueError("kernel must be an instance of semantic_kernel.kernel.Kernel")
        return kernel

    def _get_prompt_settings(self, extra_create_args: Mapping[str, Any]) -> Optional[PromptExecutionSettings]:
        return extra_create_args.get("prompt_execution_settings", None) or self._prompt_settings

    async def create(
        self,
        messages: Sequence[LLMMessage],
        *,
        tools: Sequence[Tool | ToolSchema] = [],
        tool_choice: Tool | Literal["auto", "required", "none"] = "auto",
        json_output: Optional[bool | type[BaseModel]] = None,
        extra_create_args: Mapping[str, Any] = {},
        cancellation_token: Optional[CancellationToken] = None,
    ) -> CreateResult:
        """Create a chat completion using the Semantic Kernel client.

        The `extra_create_args` dictionary can include two special keys:

View on GitHub (pinned to 027ecf0a37)

Solutions

  1. Construct and pass a real semantic_kernel.Kernel instance with at least one AI service registered
  2. In tests, use MagicMock(spec=Kernel) or build a real Kernel
  3. Verify the import: from semantic_kernel import Kernel, and that you pass an instance not the class

Example fix

# before
adapter = SKChatCompletionAdapter(kernel={"services": [...]}, model_id="gpt-4o")  # dict

# after
from semantic_kernel import Kernel
kernel = Kernel()
kernel.add_service(OpenAIChatCompletion(service_id="openai", kernel=kernel, ...))
adapter = SKChatCompletionAdapter(kernel=kernel, model_id="gpt-4o")
Defensive patterns

Strategy: type-guard

Validate before calling

from semantic_kernel import Kernel

assert isinstance(kernel, Kernel), f"expected Kernel, got {type(kernel).__name__}"
adapter = SKChatCompletionAdapter(kernel=kernel, ...)

Type guard

from semantic_kernel import Kernel

def is_kernel_instance(obj) -> bool:
    return isinstance(obj, Kernel)

Try / catch

try:
    result = await adapter.create(messages, extra_create_args={"kernel": kernel})
except ValueError as e:
    if "instance of semantic_kernel.kernel.Kernel" in str(e):
        raise TypeError("passed a non-Kernel object; build a real semantic_kernel.Kernel") from e
    raise

Prevention

When it happens

Trigger: Passing kernel=some_dict, a Mock/kernel stub, or a kernel class (not an instance) to the constructor, or extra_create_args={'kernel': <non-Kernel>}. The isinstance check runs on every create/create_stream call.

Common situations: Test doubles using unittest.Mock without spec=Kernel; passing a serialized kernel config dict expecting the adapter to build it; name collisions with other 'Kernel' classes imported from different packages.

Related errors


AI-assisted analysis of microsoft/autogen@027ecf0a37 (2026-08-15). Data as JSON: /api/errors/1a379f212e5782a4. Report an issue: GitHub.