diff --git a/libs/partners/perplexity/langchain_perplexity/__init__.py b/libs/partners/perplexity/langchain_perplexity/__init__.py index 1ea258a47e5..b02dcfd7792 100644 --- a/libs/partners/perplexity/langchain_perplexity/__init__.py +++ b/libs/partners/perplexity/langchain_perplexity/__init__.py @@ -1,4 +1,4 @@ -"""This package provides the Perplexity integration for LangChain.""" +"""Provides the Perplexity integration for LangChain.""" from langchain_perplexity.chat_models import ChatPerplexity diff --git a/libs/partners/perplexity/langchain_perplexity/chat_models.py b/libs/partners/perplexity/langchain_perplexity/chat_models.py index 5b809896516..b206aeee6d5 100644 --- a/libs/partners/perplexity/langchain_perplexity/chat_models.py +++ b/libs/partners/perplexity/langchain_perplexity/chat_models.py @@ -183,7 +183,8 @@ class ChatPerplexity(BaseChatModel): extra = values.get("model_kwargs", {}) for field_name in list(values): if field_name in extra: - raise ValueError(f"Found {field_name} supplied twice.") + msg = f"Found {field_name} supplied twice." + raise ValueError(msg) if field_name not in all_required_field_names: logger.warning( f"""WARNING! {field_name} is not a default parameter. @@ -194,10 +195,11 @@ class ChatPerplexity(BaseChatModel): invalid_model_kwargs = all_required_field_names.intersection(extra.keys()) if invalid_model_kwargs: - raise ValueError( + msg = ( f"Parameters {invalid_model_kwargs} should be specified explicitly. " f"Instead they were passed in as part of `model_kwargs` parameter." ) + raise ValueError(msg) values["model_kwargs"] = extra return values @@ -213,11 +215,12 @@ class ChatPerplexity(BaseChatModel): base_url="https://api.perplexity.ai", ) except AttributeError: - raise ValueError( + msg = ( "`openai` has no `ChatCompletion` attribute, this is likely " "due to an old version of the openai package. Try upgrading it " "with `pip install --upgrade openai`." ) + raise ValueError(msg) from None return self @property @@ -240,7 +243,8 @@ class ChatPerplexity(BaseChatModel): elif isinstance(message, AIMessage): message_dict = {"role": "assistant", "content": message.content} else: - raise TypeError(f"Got unknown type {message}") + msg = f"Got unknown type {message}" + raise TypeError(msg) return message_dict def _create_message_dicts( @@ -249,7 +253,8 @@ class ChatPerplexity(BaseChatModel): params = dict(self._invocation_params) if stop is not None: if "stop" in params: - raise ValueError("`stop` found in both the input and default params.") + msg = "`stop` found in both the input and default params." + raise ValueError(msg) params["stop"] = stop message_dicts = [self._convert_message_to_dict(m) for m in messages] return message_dicts, params @@ -270,18 +275,17 @@ class ChatPerplexity(BaseChatModel): if role == "user" or default_class == HumanMessageChunk: return HumanMessageChunk(content=content) - elif role == "assistant" or default_class == AIMessageChunk: + if role == "assistant" or default_class == AIMessageChunk: return AIMessageChunk(content=content, additional_kwargs=additional_kwargs) - elif role == "system" or default_class == SystemMessageChunk: + if role == "system" or default_class == SystemMessageChunk: return SystemMessageChunk(content=content) - elif role == "function" or default_class == FunctionMessageChunk: + if role == "function" or default_class == FunctionMessageChunk: return FunctionMessageChunk(content=content, name=_dict["name"]) - elif role == "tool" or default_class == ToolMessageChunk: + if role == "tool" or default_class == ToolMessageChunk: return ToolMessageChunk(content=content, tool_call_id=_dict["tool_call_id"]) - elif role or default_class == ChatMessageChunk: + if role or default_class == ChatMessageChunk: return ChatMessageChunk(content=content, role=role) # type: ignore[arg-type] - else: - return default_class(content=content) # type: ignore[call-arg] + return default_class(content=content) # type: ignore[call-arg] def _stream( self, @@ -409,8 +413,9 @@ class ChatPerplexity(BaseChatModel): **kwargs: Any, ) -> Runnable[LanguageModelInput, _DictOrPydantic]: """Model wrapper that returns outputs formatted to match the given schema for Preplexity. + Currently, Perplexity only supports "json_schema" method for structured output - as per their official documentation: https://docs.perplexity.ai/guides/structured-outputs + as per their official documentation: https://docs.perplexity.ai/guides/structured-outputs. Args: schema: @@ -456,10 +461,11 @@ class ChatPerplexity(BaseChatModel): method = "json_schema" if method == "json_schema": if schema is None: - raise ValueError( + msg = ( "schema must be specified when method is not 'json_schema'. " "Received None." ) + raise ValueError(msg) is_pydantic_schema = _is_pydantic_class(schema) response_format = convert_to_json_schema(schema) llm = self.bind( @@ -478,10 +484,9 @@ class ChatPerplexity(BaseChatModel): else JsonOutputParser() ) else: - raise ValueError( - f"Unrecognized method argument. Expected 'json_schema' Received:\ + msg = f"Unrecognized method argument. Expected 'json_schema' Received:\ '{method}'" - ) + raise ValueError(msg) if include_raw: parser_assign = RunnablePassthrough.assign( @@ -492,5 +497,4 @@ class ChatPerplexity(BaseChatModel): [parser_none], exception_key="parsing_error" ) return RunnableMap(raw=llm) | parser_with_fallback - else: - return llm | output_parser + return llm | output_parser diff --git a/libs/partners/perplexity/pyproject.toml b/libs/partners/perplexity/pyproject.toml index 822a725aa19..589b3708b92 100644 --- a/libs/partners/perplexity/pyproject.toml +++ b/libs/partners/perplexity/pyproject.toml @@ -59,8 +59,63 @@ ignore_missing_imports = true target-version = "py39" [tool.ruff.lint] -select = ["E", "F", "I", "T201", "UP", "S"] -ignore = [ "UP007", ] +select = [ + "A", # flake8-builtins + "B", # flake8-bugbear + "ASYNC", # flake8-async + "C4", # flake8-comprehensions + "COM", # flake8-commas + "D", # pydocstyle + "DOC", # pydoclint + "E", # pycodestyle error + "EM", # flake8-errmsg + "F", # pyflakes + "FA", # flake8-future-annotations + "FBT", # flake8-boolean-trap + "FLY", # flake8-flynt + "I", # isort + "ICN", # flake8-import-conventions + "INT", # flake8-gettext + "ISC", # isort-comprehensions + "PGH", # pygrep-hooks + "PIE", # flake8-pie + "PERF", # flake8-perf + "PYI", # flake8-pyi + "Q", # flake8-quotes + "RET", # flake8-return + "RSE", # flake8-rst-docstrings + "RUF", # ruff + "S", # flake8-bandit + "SLF", # flake8-self + "SLOT", # flake8-slots + "SIM", # flake8-simplify + "T10", # flake8-debugger + "T20", # flake8-print + "TID", # flake8-tidy-imports + "UP", # pyupgrade + "W", # pycodestyle warning + "YTT", # flake8-2020 +] +ignore = [ + "D100", # pydocstyle: Missing docstring in public module + "D101", # pydocstyle: Missing docstring in public class + "D102", # pydocstyle: Missing docstring in public method + "D103", # pydocstyle: Missing docstring in public function + "D104", # pydocstyle: Missing docstring in public package + "D105", # pydocstyle: Missing docstring in magic method + "D107", # pydocstyle: Missing docstring in __init__ + "D203", # Messes with the formatter + "D407", # pydocstyle: Missing-dashed-underline-after-section + "COM812", # Messes with the formatter + "ISC001", # Messes with the formatter + "PERF203", # Rarely useful + "S112", # Rarely useful + "RUF012", # Doesn't play well with Pydantic + "SLF001", # Private member access + "UP007", # pyupgrade: non-pep604-annotation-union + "UP045", # pyupgrade: non-pep604-annotation-optional +] +unfixable = ["B028"] # People should intentionally tune the stacklevel [tool.ruff.format] docstring-code-format = true diff --git a/libs/partners/perplexity/tests/integration_tests/test_compile.py b/libs/partners/perplexity/tests/integration_tests/test_compile.py index 5196f4c0f8c..5c812af3144 100644 --- a/libs/partners/perplexity/tests/integration_tests/test_compile.py +++ b/libs/partners/perplexity/tests/integration_tests/test_compile.py @@ -4,4 +4,3 @@ import pytest # type: ignore[import-not-found] @pytest.mark.compile def test_placeholder() -> None: """Used for compiling integration tests without running any real tests.""" - pass diff --git a/libs/partners/perplexity/tests/unit_tests/test_chat_models.py b/libs/partners/perplexity/tests/unit_tests/test_chat_models.py index a160c5f24c9..24076a4ef99 100644 --- a/libs/partners/perplexity/tests/unit_tests/test_chat_models.py +++ b/libs/partners/perplexity/tests/unit_tests/test_chat_models.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Any, Optional from unittest.mock import MagicMock