async def _feed_document_async(self, semaphore: asyncio.Semaphore, async_client: httpx.AsyncClient,
                                   document: VespaDocument, schema: str,
                                   timeout: int) -> FeedBatchDocumentResponse:
        """An async method to feed a document to Vespa.

        Note: This method is used by the async feed batch method to feed documents concurrently. Unhandled exceptions
        will be raised in the main thread and leads a 500 error for the whole batch. Therefore, exceptions should be
        handled gracefully in this method for the specific document. We should keep the error message as similar as the
        Vespa error messages since this is a low level method. Overwrite the error message in higher level methods.

        Exceptions that are handled in this method:
        1. httpx.RequestError: We convert this error to a 500 error for the specific document and put 'Network Error' in
        the message.
        2. JSONDecodeError: If the Vespa response is 200 but the response can not be decoded, we raise a VespaError and
        this will block the whole batch as this indicates an unexpected response from Vespa.
        3. httpx.status_codes.HTTPStatusError: We catch the error and return it to marqo.core.document methods to handle
        it.

        Raises:
            VespaError: If the Vespa response is 200 but the response can not be decoded.

        Returns:
            FeedDocumentResponse object
        """
        doc_id = document.id
        data = {'fields': document.fields}

        async with semaphore:
            end_point = f'{self.document_url}/document/v1/{schema}/{schema}/docid/{doc_id}'
            # Handle httpx.RequestError
            try:
                resp = await async_client.post(end_point, json=data, timeout=timeout)
            except httpx.RequestError as e:
                logger.error(e, exc_info=True)
                return FeedBatchDocumentResponse(status=500, message="Network Error", id=doc_id)

        # Handle other exceptions
        try:
            return FeedBatchDocumentResponse(**resp.json(), status=resp.status_code)
        except JSONDecodeError as e:
            if resp.status_code == 200:
                # A 200 response shouldn't reach here, so we error out the whole batch
                raise VespaError(cause=e, message=f"Unexpected response from Vespa: {resp.text}") from e

            try:
                self._raise_for_status(resp)
            except VespaStatusError as e:
                logger.error(e, exc_info=True)
                return FeedBatchDocumentResponse(status=resp.status_code, message=e.message, id=doc_id)
An async method to feed a document to Vespa.

        Note: This method is used by the async feed batch method to feed documents concurrently. Unhandled exceptions
        will be raised in the main thread and leads a 500 error for the whole batch. Therefore, exceptions should be
        handled gracefully in this method for the specific document. We should keep the error message as similar as the
        Vespa error messages since this is a low level method. Overwrite the error message in higher level methods.

        Exceptions that are handled in this method:
        1. httpx.RequestError: We convert this error to a 500 error for the specific document and put 'Network Error' in
        the message.
        2. JSONDecodeError: If the Vespa response is 200 but the response can not be decoded, we raise a VespaError and
        this will block the whole batch as this indicates an unexpected response from Vespa.
        3. httpx.status_codes.HTTPStatusError: We catch the error and return it to marqo.core.document methods to handle
        it.

        Raises:
            VespaError: If the Vespa response is 200 but the response can not be decoded.

        Returns:
            FeedDocumentResponse object
        
src/marqo/vespa/vespa_client.py