Lei Zhang
|
f203229b51
|
community: Fix the failure of ChatSparkLLM after upgrading to Pydantic V2 (#27418)
**Description:**
The test_sparkllm.py can reproduce this issue.
https://github.com/langchain-ai/langchain/blob/master/libs/community/tests/integration_tests/chat_models/test_sparkllm.py#L66
```
Testing started at 18:27 ...
Launching pytest with arguments test_sparkllm.py::test_chat_spark_llm --no-header --no-summary -q in /Users/zhanglei/Work/github/langchain/libs/community/tests/integration_tests/chat_models
============================= test session starts ==============================
collecting ... collected 1 item
test_sparkllm.py::test_chat_spark_llm
============================== 1 failed in 0.45s ===============================
FAILED [100%]
tests/integration_tests/chat_models/test_sparkllm.py:65 (test_chat_spark_llm)
def test_chat_spark_llm() -> None:
> chat = ChatSparkLLM(
spark_app_id="your spark_app_id",
spark_api_key="your spark_api_key",
spark_api_secret="your spark_api_secret",
) # type: ignore[call-arg]
test_sparkllm.py:67:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../../../../core/langchain_core/load/serializable.py:111: in __init__
super().__init__(*args, **kwargs)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
cls = <class 'langchain_community.chat_models.sparkllm.ChatSparkLLM'>
values = {'spark_api_key': 'your spark_api_key', 'spark_api_secret': 'your spark_api_secret', 'spark_api_url': 'wss://spark-api.xf-yun.com/v3.5/chat', 'spark_app_id': 'your spark_app_id', ...}
@model_validator(mode="before")
@classmethod
def validate_environment(cls, values: Dict) -> Any:
values["spark_app_id"] = get_from_dict_or_env(
values,
["spark_app_id", "app_id"],
"IFLYTEK_SPARK_APP_ID",
)
values["spark_api_key"] = get_from_dict_or_env(
values,
["spark_api_key", "api_key"],
"IFLYTEK_SPARK_API_KEY",
)
values["spark_api_secret"] = get_from_dict_or_env(
values,
["spark_api_secret", "api_secret"],
"IFLYTEK_SPARK_API_SECRET",
)
values["spark_api_url"] = get_from_dict_or_env(
values,
"spark_api_url",
"IFLYTEK_SPARK_API_URL",
SPARK_API_URL,
)
values["spark_llm_domain"] = get_from_dict_or_env(
values,
"spark_llm_domain",
"IFLYTEK_SPARK_LLM_DOMAIN",
SPARK_LLM_DOMAIN,
)
# put extra params into model_kwargs
default_values = {
name: field.default
for name, field in get_fields(cls).items()
if field.default is not None
}
> values["model_kwargs"]["temperature"] = default_values.get("temperature")
E KeyError: 'model_kwargs'
../../../langchain_community/chat_models/sparkllm.py:368: KeyError
```
I found that when upgrading to Pydantic v2, @root_validator was changed
to @model_validator. When a class declares multiple
@model_validator(model=before), the execution order in V1 and V2 is
opposite. This is the reason for ChatSparkLLM's failure.
The correct execution order is to execute build_extra first.
https://github.com/langchain-ai/langchain/blob/langchain%3D%3D0.2.16/libs/community/langchain_community/chat_models/sparkllm.py#L302
And then execute validate_environment.
https://github.com/langchain-ai/langchain/blob/langchain%3D%3D0.2.16/libs/community/langchain_community/chat_models/sparkllm.py#L329
The Pydantic community also discusses it, but there hasn't been a
conclusion yet. https://github.com/pydantic/pydantic/discussions/7434
**Issus:** #27416
**Twitter handle:** coolbeevip
---------
Co-authored-by: vbarda <vadym@langchain.dev>
|
2024-10-23 21:17:10 -04:00 |
|