code: async def create_cred_req(self, cred_offer_json: str, cd_id: str) -> (str, str):
          
  
          LOGGER.debug('HolderProver.create_cred_req >>> cred_offer_json: %s, cd_id: %s', cred_offer_json, cd_id)
  
          self._assert_link_secret('create_cred_req')
  
          # Check that ledger has schema on ledger where cred def expects - in case of pool reset with extant wallet
          cred_def_json = await self.get_cred_def(cd_id)
          schema_seq_no = int(json.loads(cred_def_json)['schemaId'])
          schema_json = await self.get_schema(schema_seq_no)
          schema = json.loads(schema_json)
          if not schema:
              LOGGER.debug(
                  'HolderProver.create_cred_req: <!< absent schema@#%s, cred req may be for another ledger',
                  schema_seq_no)
              raise AbsentSchema('Absent schema@#{}, cred req may be for another ledger'.format(schema_seq_no))
          (cred_req_json, cred_req_metadata_json) = await anoncreds.prover_create_credential_req(
              self.wallet.handle,
              self.did,
              cred_offer_json,
              cred_def_json,
              self._link_secret)
          rv = (cred_req_json, cred_req_metadata_json)
  
          LOGGER.debug('HolderProver.create_cred_req <<< %s', rv)
          return rv
docs: Create credential request as HolderProver and store in wallet; return credential json and metadata json.
  
          Raise AbsentLinkSecret if link secret not set.
  
          :param cred_offer_json: credential offer json
          :param cd_id: credential definition identifier
          :return: cred request json and corresponding metadata json as created and stored in wallet