{"record":{"id":"abe6cadb276ad6b8","repo":"microsoft/semantic-kernel","slug":"failed-to-get-a-response-from-the-chat-completion-abe6ca","errorCode":null,"errorMessage":"Failed to get a response from the chat completion service.","messagePattern":"Failed to get a response from the chat completion service\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/samples/getting_started_with_processes/step01/step01_processes.py","lineNumber":147,"sourceCode":"        self.state = state.state or ChatBotState()\n        self.state.chat_messages = self.state.chat_messages or []\n\n    @kernel_function(name=GET_CHAT_RESPONSE)\n    async def get_chat_response(self, context: \"KernelProcessStepContext\", user_message: str, kernel: \"Kernel\"):\n        \"\"\"Generates a response from the chat completion service.\"\"\"\n        # Add user message to the state\n        self.state.chat_messages.append({\"role\": \"user\", \"message\": user_message})\n\n        # Get chat completion service and generate a response\n        chat_service: ChatCompletionClientBase = kernel.get_service(service_id=SERVICE_ID)\n        settings = chat_service.instantiate_prompt_execution_settings(service_id=SERVICE_ID)\n\n        chat_history = ChatHistory()\n        chat_history.add_user_message(user_message)\n        response = await chat_service.get_chat_message_contents(chat_history=chat_history, settings=settings)\n\n        if response is None:\n            raise ValueError(\"Failed to get a response from the chat completion service.\")\n\n        answer = response[0].content\n\n        print(f\"ASSISTANT: {answer}\")\n\n        # Update state with the response\n        self.state.chat_messages.append(answer)\n\n        # Emit an event: assistantResponse\n        await context.emit_event(process_event=ChatBotEvents.AssistantResponseGenerated, data=answer)\n\n\nkernel = Kernel()\n\n\nasync def step01_processes(scripted: bool = True):\n    kernel.add_service(OpenAIChatCompletion(service_id=\"default\"))\n","sourceCodeStart":129,"sourceCodeEnd":165,"githubUrl":"https://github.com/microsoft/semantic-kernel/blob/c028a0c7dc4f0814cdcbaba9d998f187a41197bf/python/samples/getting_started_with_processes/step01/step01_processes.py#L129-L165","documentation":"Thrown by the chat step after calling chat_service.get_chat_message_contents: a None response is treated as a hard failure. get_chat_message_contents normally returns a list (possibly empty), so a true None is an abnormal service result. Note an empty list would instead fail later at response[0]; this guard targets the explicit-None case.","triggerScenarios":"The chat completion service returns None (custom/buggy connector); the service is misconfigured so it yields no completion object; an upstream exception is masked and returns None.","commonSituations":"Using a custom ChatCompletionClientBase subclass that returns None; pointing SERVICE_ID at a non-chat service; missing model/API settings causing a no-op response.","solutions":["Verify the service registered under SERVICE_ID is a real chat completion service with valid model/credentials and returns a non-empty list.","If using a custom connector, ensure it returns list[ChatMessageContent] and never None.","Handle empty-list responses (guard response before indexing) so an empty completion doesn't crash with IndexError.","Check logs for upstream errors that produced the None/empty result."],"exampleFix":"# before\nresponse = await chat_service.get_chat_message_contents(chat_history=chat_history, settings=settings)\nif response is None:\n    raise ValueError(\"Failed to get a response from the chat completion service.\")\nanswer = response[0].content\n# after (also guard empty list)\nresponse = await chat_service.get_chat_message_contents(chat_history=chat_history, settings=settings)\nif not response:\n    raise ValueError(\"Failed to get a response from the chat completion service.\")\nanswer = response[0].content","handlingStrategy":"validation","validationCode":"svc = kernel.get_service(service_id=SERVICE_ID)\nfrom semantic_kernel.connectors.ai.chat_completion_client_base import ChatCompletionClientBase\nassert isinstance(svc, ChatCompletionClientBase), f'{SERVICE_ID} is not a chat service'\nresponse = await svc.get_chat_message_contents(chat_history=chat_history, settings=settings)\nassert response, 'chat service returned an empty/None response'","typeGuard":"from semantic_kernel.connectors.ai.chat_completion_client_base import ChatCompletionClientBase\ndef is_chat_service(svc) -> bool:\n    return isinstance(svc, ChatCompletionClientBase)","tryCatchPattern":"try:\n    response = await chat_service.get_chat_message_contents(chat_history=chat_history, settings=settings)\n    if not response:\n        raise ValueError('Failed to get a response from the chat completion service.')\nexcept ValueError:\n    # handle empty/None completion (retry or surface to user)\n    raise","preventionTips":["Validate the service under SERVICE_ID is a chat completion service before calling.","Ensure custom connectors return non-empty list[ChatMessageContent].","Guard against empty lists before indexing response[0].","Provide valid model/credentials so the service actually completes."],"tags":["processes","semantic-kernel","chat-completion","ai-service","sample"],"backgroundTag":null,"analyzedSha":"c028a0c7dc4f0814cdcbaba9d998f187a41197bf","analyzedAt":"2026-08-13T13:48:05.040Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}