MPRester import error

running simply this:

from mp_api.client import MPRester

produces

ValidationError: 23 validation errors for EmmetSettings

  • Ive tried different versions of mp_api and I’ve tried to downgrade to different versions of emmet-core
  • These are all installed in a custom conda environment with only mp-api installed

What exact versions of each mp-api/dependency work together? can someone paste in their requirements file?

Hi @edwardghbaker,

Running a pip install --upgrade --no-cache-dir mp-api in a fresh conda environment works on my end.

The current versions pip will resolve to are mp-api==0.45.12 and emmet-core==0.86.0rc1

Running the same thing with the latest dev release (mp-api==0.45.13rc4) is also working on my end.

Hello, sorry to ask again but im getting a new error with mp-api.

Im trying to make a pourbaix diagram, so I have the mpcontribs-client package too.

with MPRester(my_api) as mpr:
entries = mpr.get_pourbaix_entries([“Cu”])
NB there is an indent but it just doesnt show here.

The “entries” line errors with the following code:

AttributeError: ‘FieldInfo’ object has no attribute ‘_copy’

pip install --upgrade --no-cache-dir mp-api worked to solve the first problem :slight_smile: so i can import the MPRester package now.

@edwardghbaker Do you happen to have the full traceback for the error? Which mpcontribs-client version are you running? Did you install all dependencies in a fresh environment?

Hi @tschaume,

thanks for helping me with this one.

It is in a fresh environment, version: mpcontribs-client==5.10.4

Ive copied the full error traceback below:


AttributeError Traceback (most recent call last)
Cell In[2], line 9
6 my_api = “XXXXX”
8 with MPRester(my_api) as mpr: ---->
9 entries = mpr.get_pourbaix_entries([“Cu”])
11 # Build the PourbaixDiagram object
12 pbx = PourbaixDiagram(entries)

File [m:\Shared\Ebaker\gitlab\geochem-tools.venv\Lib\site-packages\mp_api\client\mprester.py:858](file:///M:/Shared/Ebaker/gitlab/geochem-tools/.venv/Lib/site-packages/mp_api/client/mprester.py:858), in MPRester.get_pourbaix_entries(self, chemsys, solid_compat, use_gibbs)
851 ion_ref_elts = set(
852 itertools.chain.from_iterable(i.elements for i in ion_ref_comps)
853 )
854 # TODO - would be great if the commented line below would work
855 # However for some reason you cannot process GibbsComputedStructureEntry with
856 # MaterialsProjectAqueousCompatibility
857 ion_ref_entries = ( →
858 self.get_entries_in_chemsys(
859 list([str(e) for e in ion_ref_elts] + [“O”, “H”]),
860 additional_criteria={“thermo_types”: thermo_types},
861 # use_gibbs=use_gibbs
862 )
863 + user_entries
864 )
866 # suppress the warning about supplying the required energies; they will be calculated from the
867 # entries we get from MPRester
868 with warnings.catch_warnings():

File [m:\Shared\Ebaker\gitlab\geochem-tools.venv\Lib\site-packages\mp_api\client\mprester.py:1187](file:///M:/Shared/Ebaker/gitlab/geochem-tools/.venv/Lib/site-packages/mp_api/client/mprester.py:
1187), in MPRester.get_entries_in_chemsys(self, elements, use_gibbs, compatible_only, inc_structure, property_data, conventional_unit_cell, additional_criteria)
1178 all_chemsyses = [
1179 “-”.join(sorted(els))
1180 for i in range(len(elements_set))
1181 for els in itertools.combinations(elements_set, i + 1)
1182 ]
1184 entries =
1186 entries.extend( →
1187 self.get_entries(
1188 all_chemsyses,
1189 compatible_only=compatible_only,
1190 inc_structure=inc_structure,
1191 property_data=property_data,
1192 conventional_unit_cell=conventional_unit_cell,
1193 additional_criteria=additional_criteria or DEFAULT_THERMOTYPE_CRITERIA,
1194 )
1195 )
1197 if not self.monty_decode:
1198 entries = [ComputedStructureEntry.from_dict(entry) for entry in entries]

File [m:\Shared\Ebaker\gitlab\geochem-tools.venv\Lib\site-packages\mp_api\client\mprester.py:718](file:///M:/Shared/Ebaker/gitlab/geochem-tools/.venv/Lib/site-packages/mp_api/client/mprester.py:718), in MPRester.get_entries(self, chemsys_formula_mpids, compatible_only, inc_structure, property_data, conventional_unit_cell, additional_criteria)
710 entries: set[ComputedStructureEntry] = set()
712 fields = (
713 [“entries”, “thermo_type”]
714 if not property_data
715 else [“entries”, “thermo_type”] + property_data
716 ) →
718 docs = self.materials.thermo.search(
719 **input_params, # type: ignore
720 all_fields=False,
721 fields=fields,
722 )
724 for doc in docs:
725 entry_list = doc[“entries”].values()

File [m:\Shared\Ebaker\gitlab\geochem-tools.venv\Lib\site-packages\mp_api\client\routes\materials\thermo.py:141](file:///M:/Shared/Ebaker/gitlab/geochem-tools/.venv/Lib/site-packages/mp_api/client/routes/materials/thermo.py:141), in ThermoRester.search(self, material_ids, chemsys, energy_above_hull, equilibrium_reaction_energy, formation_energy, formula, is_stable, num_elements, thermo_ids, thermo_types, total_energy, uncorrected_energy, num_chunks, chunk_size, all_fields, fields)
128 query_params.update(
129 {
130 f"{name_dict[param]}_min": value[0],
131 f"{name_dict[param]}_max": value[1],
132 }
133 )
135 query_params = {
136 entry: query_params[entry]
137 for entry in query_params
138 if query_params[entry] is not None
139 } →
141 return super()._search(
142 num_chunks=num_chunks,
143 chunk_size=chunk_size,
144 all_fields=all_fields,
145 fields=fields,
146 **query_params,
147 )

File [m:\Shared\Ebaker\gitlab\geochem-tools.venv\Lib\site-packages\mp_api\client\core\client.py:1205](file:///M:/Shared/Ebaker/gitlab/geochem-tools/.venv/Lib/site-packages/mp_api/client/core/client.py:1205), in BaseRester._search(self, num_chunks, chunk_size, all_fields, fields, **kwargs)
1183 “”“A generic search method to retrieve documents matching specific parameters.
1184
1185 Arguments: (…)
1200 A list of documents.
1201 “””
1202 # This method should be customized for each end point to give more user friendly,
1203 # documented kwargs. →
1205 return self._get_all_documents(
1206 kwargs,
1207 all_fields=all_fields,
1208 fields=fields,
1209 chunk_size=chunk_size,
1210 num_chunks=num_chunks,
1211 )

File [m:\Shared\Ebaker\gitlab\geochem-tools.venv\Lib\site-packages\mp_api\client\core\client.py:1284](file:///M:/Shared/Ebaker/gitlab/geochem-tools/.venv/Lib/site-packages/mp_api/client/core/client.py:
1284), in BaseRester._get_all_documents(self, query_params, all_fields, fields, chunk_size, num_chunks)
1270 list_entries = sorted(
1271 (
1272 (key, len(entry.split(“,”))) (…)
1279 reverse=True, 1280 )
1282 chosen_param = list_entries[0][0] if len(list_entries) > 0 else None →
1284 results = self._query_resource(
1285 query_params,
1286 fields=fields,
1287 parallel_param=chosen_param,
1288 chunk_size=chunk_size,
1289 num_chunks=num_chunks,
1290 )
1292 return results[“data”]

File [m:\Shared\Ebaker\gitlab\geochem-tools.venv\Lib\site-packages\mp_api\client\core\client.py:
561](file:///M:/Shared/Ebaker/gitlab/geochem-tools/.venv/Lib/site-packages/mp_api/client/core/client.py:
561), in BaseRester._query_resource(self, criteria, fields, suburl, use_document_model, parallel_param, num_chunks, chunk_size, timeout)
559 data[“meta”][“total_doc”] = len(data[“data”])
560 else: →
561 data = self._submit_requests(
562 url=url,
563 criteria=criteria,
564 use_document_model=not query_s3 and use_document_model,
565 parallel_param=parallel_param,
566 num_chunks=num_chunks,
567 chunk_size=chunk_size,
568 timeout=timeout,
569 )
570 return data
572 except RequestException as ex:

File [m:\Shared\Ebaker\gitlab\geochem-tools.venv\Lib\site-packages\mp_api\client\core\client.py:708](file:///M:/Shared/Ebaker/gitlab/geochem-tools/.venv/Lib/site-packages/mp_api/client/core/client.py:708), in BaseRester._submit_requests(self, url, criteria, use_document_model, chunk_size, parallel_param, num_chunks, timeout)
695 remaining_docs_avail = {}
697 initial_params_list = [
698 {
699 “url”: url, (…)
705 for crit in new_criteria
706 ] →
708 initial_data_tuples = self._multi_thread(
709 self._submit_request_and_process, initial_params_list
710 )
712 for data, subtotal, crit_ind in initial_data_tuples:
713 subtotals.append(subtotal)

File [m:\Shared\Ebaker\gitlab\geochem-tools.venv\Lib\site-packages\mp_api\client\core\client.py:930](file:///M:/Shared/Ebaker/gitlab/geochem-tools/.venv/Lib/site-packages/mp_api/client/core/client.py:930), in BaseRester._multi_thread(self, func, params_list, progress_bar)
927 finished, futures = wait(futures, return_when=FIRST_COMPLETED)
929 for future in finished: →
930 data, subtotal = future.result()
932 if progress_bar is not None:
933 if isinstance(data, dict):

File ~\AppData\Local\Programs\Python\Python312\Lib\concurrent\futures_base.py:449, in Future.result(self, timeout)
447 raise CancelledError()
448 elif self._state == FINISHED: →
449 return self.__get_result()
451 self._condition.wait(timeout)
453 if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]:

File [~\AppData\Local\Programs\Python\Python312\Lib\concurrent\futures_base.py:401]> (https://file+.vscode-resource.vscode-cdn.net/m%3A/Shared/Ebaker/gitlab/geochem-tools/~/AppData/Local/Programs/Python/Python312/Lib/concurrent/futures/_base.py:401), in Future.__get_result(self)
399 if self._exception:
400 try: →
401 raise self._exception
402 finally:
403 # Break a reference cycle with the exception in self._exception
404 self = None

File ~\AppData\Local\Programs\Python\Python312\Lib\concurrent\futures\thread.py:58, in _WorkItem.run(self)
55 return
57 try: —>
58 result = self.fn(*self.args, **self.kwargs)
59 except BaseException as exc:
60 self.future.set_exception(exc)

File [m:\Shared\Ebaker\gitlab\geochem-tools.venv\Lib\site-packages\mp_api\client\core\client.py:1004](file:///M:/Shared/Ebaker/gitlab/geochem-tools/.venv/Lib/site-packages/mp_api/client/core/client.py:1004), in BaseRester._submit_request_and_process(self, url, verify, params, use_document_model, timeout)
1001 # other sub-urls may use different document models
1002 # the client does not handle this in a particularly smart way currently
1003 if self.document_model and use_document_model: →
1004 data[“data”] = self._convert_to_model(data[“data”])
1006 meta_total_doc_num = data.get(“meta”, {}).get(“total_doc”, 1)
1008 return data, meta_total_doc_num

File [m:\Shared\Ebaker\gitlab\geochem-tools.venv\Lib\site-packages\mp_api\client\core\client.py:1041](file:///M:/Shared/Ebaker/gitlab/geochem-tools/.venv/Lib/site-packages/mp_api/client/core/client.py:1041), in BaseRester._convert_to_model(self, data)
1031 “”“Converts dictionary documents to instantiated MPDataDoc objects.
1032
1033 Args:
(…) 1038
1039 “””
1040 if len(data) > 0: →
1041 data_model, set_fields, _ = self._generate_returned_model(data[0])
1043 data = [
1044 data_model(
1045 **{
(…) 1051 for raw_doc in data
1052 ]
1054 return data

File [m:\Shared\Ebaker\gitlab\geochem-tools.venv\Lib\site-packages\mp_api\client\core\client.py:1076](file:///M:/Shared/Ebaker/gitlab/geochem-tools/.venv/Lib/site-packages/mp_api/client/core/client.py:1076), in BaseRester._generate_returned_model(self, doc)
1074 include_fields: dict[str, tuple[type, FieldInfo]] = {}
1075 for name in set_fields:
1076 field_copy = model_fields[name]._copy() 1077 if not field_copy.default_factory:
1078 # Fields with a default_factory cannot also have a default in pydantic>=2.12.3
1079 field_copy.default = None

AttributeError: ‘FieldInfo’ object has no attribute ‘_copy’

We’ve been working to resolve compatibility issues with pydantic, can you try:

pip install mp-api==v0.45.13rc5 emmet-core==v0.86.0rc1 pydantic==2.12.3

to see if that fixes it?