langflow-ai / langflow

Langflow is a low-code app builder for RAG and multi-agent AI applications. It’s Python-based and agnostic to any model, API, or database.
http://www.langflow.org
MIT License
34.26k stars 4.14k forks source link

Component field 'llm' might not be a valid input #3639

Closed wrench1997 closed 2 months ago

wrench1997 commented 2 months ago

Bug Description

I ran it according to the flow chart and found that llm reported an error. Untitled document.json QQ20240831-214350

Reproduction

错误信息

Expected behavior

In the component Self Query Retriever, an error will be reported when running.

Who can help?

No response

Operating System

windows10

Langflow Version

ex 1.0.17

Python Version

3.10

Screenshot

No response

Flow File

No response

dosubot[bot] commented 2 months ago

Hey there, @wrench1997! 👋 I'm here to help you with any bugs, questions, or even to chat and become a contributor.

To resolve the ValueError indicating that the component field llm might not be a valid input in the langflow package, specifically in the edge/base.py file, ensure that the llm parameter passed to the build method is an instance of LanguageModel.

Here is the relevant code snippet from the SelfQueryRetrieverComponent class:

class SelfQueryRetrieverComponent(CustomComponent):
    display_name: str = "Self Query Retriever"
    description: str = "Retriever that uses a vector store and an LLM to generate the vector store queries."
    icon = "LangChain"

    def build_config(self):
        return {
            "query": {
                "display_name": "Query",
                "input_types": ["Message", "Text"],
                "info": "Query to be passed as input.",
            },
            "vectorstore": {
                "display_name": "Vector Store",
                "info": "Vector Store to be passed as input.",
            },
            "attribute_infos": {
                "display_name": "Metadata Field Info",
                "info": "Metadata Field Info to be passed as input.",
            },
            "document_content_description": {
                "display_name": "Document Content Description",
                "info": "Document Content Description to be passed as input.",
            },
            "llm": {
                "display_name": "LLM",
                "info": "LLM to be passed as input.",
            },
        }

    def build(
        self,
        query: Message,
        vectorstore: VectorStore,
        attribute_infos: list[Data],
        document_content_description: Text,
        llm: LanguageModel,
    ) -> Data:
        metadata_field_infos = [AttributeInfo(**value.data) for value in attribute_infos]
        self_query_retriever = SelfQueryRetriever.from_llm(
            llm=llm,
            vectorstore=vectorstore,
            document_contents=document_content_description,
            metadata_field_info=metadata_field_infos,
            enable_limit=True,
        )

        if isinstance(query, Message):
            input_text = query.text
        elif isinstance(query, str):
            input_text = query
        else:
            raise ValueError(f"Query type {type(query)} not supported.")

        documents = self_query_retriever.invoke(input=input_text)
        data = [Data.from_document(document) for document in documents]
        self.status = data
        return data

Ensure that the llm parameter is correctly instantiated and passed as an instance of LanguageModel when calling the build method. Additionally, verify that the llm field is properly configured in the build_config method of the SelfQueryRetrieverComponent class:

def build_config(self):
    return {
        "query": {
            "display_name": "Query",
            "input_types": ["Message", "Text"],
            "info": "Query to be passed as input.",
        },
        "vectorstore": {
            "display_name": "Vector Store",
            "info": "Vector Store to be passed as input.",
        },
        "attribute_infos": {
            "display_name": "Metadata Field Info",
            "info": "Metadata Field Info to be passed as input.",
        },
        "document_content_description": {
            "display_name": "Document Content Description",
            "info": "Document Content Description to be passed as input.",
        },
        "llm": {
            "display_name": "LLM",
            "info": "LLM to be passed as input.",
        },
    }

This should resolve the ValueError related to the llm field [1][2][3][4][5].

To continue talking to Dosu, mention @dosu.

wrench1997 commented 2 months ago
from typing import Any

import httpx
from langchain_community.chat_models import ChatOllama

from langflow.base.models.model import LCModelComponent
from langflow.field_typing import LanguageModel
from langflow.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, StrInput

class ChatOllamaComponent(LCModelComponent):
    display_name = "Ollama"
    description = "Generate text using Ollama Local LLMs."
    icon = "Ollama"
    name = "OllamaModel"

    def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None):
        if field_name == "mirostat":
            if field_value == "Disabled":
                build_config["mirostat_eta"]["advanced"] = True
                build_config["mirostat_tau"]["advanced"] = True
                build_config["mirostat_eta"]["value"] = None
                build_config["mirostat_tau"]["value"] = None

            else:
                build_config["mirostat_eta"]["advanced"] = False
                build_config["mirostat_tau"]["advanced"] = False

                if field_value == "Mirostat 2.0":
                    build_config["mirostat_eta"]["value"] = 0.2
                    build_config["mirostat_tau"]["value"] = 10
                else:
                    build_config["mirostat_eta"]["value"] = 0.1
                    build_config["mirostat_tau"]["value"] = 5

        if field_name == "model_name":
            base_url_dict = build_config.get("base_url", {})
            base_url_load_from_db = base_url_dict.get("load_from_db", False)
            base_url_value = base_url_dict.get("value")
            if base_url_load_from_db:
                base_url_value = self.variables(base_url_value)
            elif not base_url_value:
                base_url_value = "http://localhost:11434"
            build_config["model_name"]["options"] = self.get_model(base_url_value + "/api/tags")

        if field_name == "keep_alive_flag":
            if field_value == "Keep":
                build_config["keep_alive"]["value"] = "-1"
                build_config["keep_alive"]["advanced"] = True
            elif field_value == "Immediately":
                build_config["keep_alive"]["value"] = "0"
                build_config["keep_alive"]["advanced"] = True
            else:
                build_config["keep_alive"]["advanced"] = False

        return build_config

    def get_model(self, url: str) -> list[str]:
        try:
            with httpx.Client() as client:
                response = client.get(url)
                response.raise_for_status()
                data = response.json()

                model_names = [model["name"] for model in data.get("models", [])]
                return model_names
        except Exception as e:
            raise ValueError("Could not retrieve models. Please, make sure Ollama is running.") from e

    inputs = LCModelComponent._base_inputs + [
        StrInput(
            name="base_url",
            display_name="Base URL",
            info="Endpoint of the Ollama API. Defaults to 'http://localhost:11434' if not specified.",
            value="http://localhost:11434",
        ),
        DropdownInput(
            name="model_name",
            display_name="Model Name",
            value="llama3.1",
            info="Refer to https://ollama.com/library for more models.",
            refresh_button=True,
        ),
        FloatInput(
            name="temperature",
            display_name="Temperature",
            value=0.2,
            info="Controls the creativity of model responses.",
        ),
        StrInput(
            name="format",
            display_name="Format",
            info="Specify the format of the output (e.g., json).",
            advanced=True,
        ),
        DictInput(
            name="metadata",
            display_name="Metadata",
            info="Metadata to add to the run trace.",
            advanced=True,
        ),
        DropdownInput(
            name="mirostat",
            display_name="Mirostat",
            options=["Disabled", "Mirostat", "Mirostat 2.0"],
            info="Enable/disable Mirostat sampling for controlling perplexity.",
            value="Disabled",
            advanced=True,
            real_time_refresh=True,
        ),
        FloatInput(
            name="mirostat_eta",
            display_name="Mirostat Eta",
            info="Learning rate for Mirostat algorithm. (Default: 0.1)",
            advanced=True,
        ),
        FloatInput(
            name="mirostat_tau",
            display_name="Mirostat Tau",
            info="Controls the balance between coherence and diversity of the output. (Default: 5.0)",
            advanced=True,
        ),
        IntInput(
            name="num_ctx",
            display_name="Context Window Size",
            info="Size of the context window for generating tokens. (Default: 2048)",
            advanced=True,
        ),
        IntInput(
            name="num_gpu",
            display_name="Number of GPUs",
            info="Number of GPUs to use for computation. (Default: 1 on macOS, 0 to disable)",
            advanced=True,
        ),
        IntInput(
            name="num_thread",
            display_name="Number of Threads",
            info="Number of threads to use during computation. (Default: detected for optimal performance)",
            advanced=True,
        ),
        IntInput(
            name="repeat_last_n",
            display_name="Repeat Last N",
            info="How far back the model looks to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)",
            advanced=True,
        ),
        FloatInput(
            name="repeat_penalty",
            display_name="Repeat Penalty",
            info="Penalty for repetitions in generated text. (Default: 1.1)",
            advanced=True,
        ),
        FloatInput(
            name="tfs_z",
            display_name="TFS Z",
            info="Tail free sampling value. (Default: 1)",
            advanced=True,
        ),
        IntInput(
            name="timeout",
            display_name="Timeout",
            info="Timeout for the request stream.",
            advanced=True,
        ),
        IntInput(
            name="top_k",
            display_name="Top K",
            info="Limits token selection to top K. (Default: 40)",
            advanced=True,
        ),
        FloatInput(
            name="top_p",
            display_name="Top P",
            info="Works together with top-k. (Default: 0.9)",
            advanced=True,
        ),
        BoolInput(
            name="verbose",
            display_name="Verbose",
            info="Whether to print out response text.",
        ),
        StrInput(
            name="tags",
            display_name="Tags",
            info="Comma-separated list of tags to add to the run trace.",
            advanced=True,
        ),
        StrInput(
            name="stop_tokens",
            display_name="Stop Tokens",
            info="Comma-separated list of tokens to signal the model to stop generating text.",
            advanced=True,
        ),
        StrInput(
            name="system",
            display_name="System",
            info="System to use for generating text.",
            advanced=True,
        ),
        StrInput(
            name="template",
            display_name="Template",
            info="Template to use for generating text.",
            advanced=True,
        ),
    ]

    def build_model(self) -> LanguageModel:  # type: ignore[type-var]
        # Mapping mirostat settings to their corresponding values
        mirostat_options = {"Mirostat": 1, "Mirostat 2.0": 2}

        # Default to 0 for 'Disabled'
        mirostat_value = mirostat_options.get(self.mirostat, 0)  # type: ignore

        # Set mirostat_eta and mirostat_tau to None if mirostat is disabled
        if mirostat_value == 0:
            mirostat_eta = None
            mirostat_tau = None
        else:
            mirostat_eta = self.mirostat_eta
            mirostat_tau = self.mirostat_tau

        # Mapping system settings to their corresponding values
        llm_params = {
            "base_url": self.base_url,
            "model": self.model_name,
            "mirostat": mirostat_value,
            "format": self.format,
            "metadata": self.metadata,
            "tags": self.tags.split(",") if self.tags else None,
            "mirostat_eta": mirostat_eta,
            "mirostat_tau": mirostat_tau,
            "num_ctx": self.num_ctx or None,
            "num_gpu": self.num_gpu or None,
            "num_thread": self.num_thread or None,
            "repeat_last_n": self.repeat_last_n or None,
            "repeat_penalty": self.repeat_penalty or None,
            "temperature": self.temperature or None,
            "stop": self.stop_tokens.split(",") if self.stop_tokens else None,
            "system": self.system,
            "template": self.template,
            "tfs_z": self.tfs_z or None,
            "timeout": self.timeout or None,
            "top_k": self.top_k or None,
            "top_p": self.top_p or None,
            "verbose": self.verbose,
        }

        # Remove parameters with None values
        llm_params = {k: v for k, v in llm_params.items() if v is not None}

        try:
            output = ChatOllama(**llm_params)  # type: ignore
        except Exception as e:
            raise ValueError("Could not initialize Ollama LLM.") from e

        return output  # type: ignore

I'm using ollama, there's nothing wrong with it?

wrench1997 commented 2 months ago

@dosu

···shell File "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\graph\edg e\base.py", line 27, in init self.target_handle: TargetHandle = TargetHandle(**self._target_handle) | | | -> {'fieldName': 'llm', 'id': 'SelfQueryRetriever-iQMll', 'inputTypes': None, 'type': 'LanguageModel'} | | -> OllamaModel-bRsfW -[None]-> SelfQueryRetriever-iQMll | -> <class 'langflow.graph.edge.schema.TargetHandle'> -> OllamaModel-bRsfW -[None]-> SelfQueryRetriever-iQMll

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\pydantic\main.py",
                         line 193, in __init__
                             self.__pydantic_validator__.validate_python(data, self_instance=self)
                             |    |                      |               |                   ->
                         TargetHandle()
                             |    |                      |               -> {'fieldName': 'llm', 'id':
                         'SelfQueryRetriever-iQMll', 'inputTypes': None, 'type': 'LanguageModel'}
                             |    |                      -> <method 'validate_python' of
                         'pydantic_core._pydantic_core.SchemaValidator' objects>
                             |    -> SchemaValidator(title="TargetHandle", validator=Model(
                             |           ModelValidator {
                             |               revalidate: Never,
                             |               validator: Mod...
                             -> TargetHandle()

                         pydantic_core._pydantic_core.ValidationError: 1 validation error for
                         TargetHandle
                         inputTypes
                           Input should be a valid list
                             For further information visit https://errors.pydantic.dev/2.8/v/list_type

                         The above exception was the direct cause of the following exception:

                         Traceback (most recent call last):

                           File "C:\ProgramData\Anaconda3\envs\py310torch\lib\runpy.py", line 196, in
                         _run_module_as_main
                             return _run_code(code, main_globals, None,
                                    |         |     -> {'__name__': '__main__', '__doc__': None,
                         '__package__': '', '__loader__': <zipimporter object
                         "C:\ProgramData\Anaconda3\envs...
                                    |         -> <code object <module> at 0x000001DA01888030, file
                         "C:\ProgramData\Anaconda3\envs\py310torch\Scripts\langflow.exe\__main__.py"...
                                    -> <function _run_code at 0x000001DA01865BD0>

                           File "C:\ProgramData\Anaconda3\envs\py310torch\lib\runpy.py", line 86, in
                         _run_code
                             exec(code, run_globals)
                                  |     -> {'__name__': '__main__', '__doc__': None, '__package__': '',
                         '__loader__': <zipimporter object "C:\ProgramData\Anaconda3\envs...
                                  -> <code object <module> at 0x000001DA01888030, file
                         "C:\ProgramData\Anaconda3\envs\py310torch\Scripts\langflow.exe\__main__.py"...

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\Scripts\langflow.exe\__main__.py",
                         line 7, in <module>

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\__main__.
                         py", line 566, in main
                             app()
                             -> <typer.main.Typer object at 0x000001DA053DA1D0>

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\typer\main.py",
                         line 321, in __call__
                             return get_command(self)(*args, **kwargs)
                                    |           |      |       -> {}
                                    |           |      -> ()
                                    |           -> <typer.main.Typer object at 0x000001DA053DA1D0>
                                    -> <function get_command at 0x000001DA052D8F70>

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\click\core.py",
                         line 1157, in __call__
                             return self.main(*args, **kwargs)
                                    |    |     |       -> {}
                                    |    |     -> ()
                                    |    -> <function TyperGroup.main at 0x000001DA052C1F30>
                                    -> <TyperGroup >

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\typer\core.py",
                         line 728, in main
                             return _main(
                                    -> <function _main at 0x000001DA052C12D0>

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\typer\core.py",
                         line 197, in _main
                             rv = self.invoke(ctx)
                                  |    |      -> <click.core.Context object at 0x000001DA01835FC0>
                                  |    -> <function MultiCommand.invoke at 0x000001DA03564670>
                                  -> <TyperGroup >

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\click\core.py",
                         line 1688, in invoke
                             return _process_result(sub_ctx.command.invoke(sub_ctx))
                                    |               |       |       |      -> <click.core.Context
                         object at 0x000001DA0FDD95A0>
                                    |               |       |       -> <function Command.invoke at
                         0x000001DA03564160>
                                    |               |       -> <TyperCommand run>
                                    |               -> <click.core.Context object at
                         0x000001DA0FDD95A0>
                                    -> <function MultiCommand.invoke.<locals>._process_result at
                         0x000001DA0FDE8940>

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\click\core.py",
                         line 1434, in invoke
                             return ctx.invoke(self.callback, **ctx.params)
                                    |   |      |    |           |   -> {'host': '127.0.0.1', 'workers':
                         1, 'timeout': 300, 'port': 7860, 'components_path':
                         WindowsPath('C:/ProgramData/Anaconda3/en...
                                    |   |      |    |           -> <click.core.Context object at
                         0x000001DA0FDD95A0>
                                    |   |      |    -> <function run at 0x000001DA0FDE8D30>
                                    |   |      -> <TyperCommand run>
                                    |   -> <function Context.invoke at 0x000001DA03552E60>
                                    -> <click.core.Context object at 0x000001DA0FDD95A0>

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\click\core.py",
                         line 783, in invoke
                             return __callback(*args, **kwargs)
                                                |       -> {'host': '127.0.0.1', 'workers': 1,
                         'timeout': 300, 'port': 7860, 'components_path':
                         WindowsPath('C:/ProgramData/Anaconda3/en...
                                                -> ()

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\typer\main.py",
                         line 703, in wrapper
                             return callback(**use_params)
                                    |          -> {'host': '127.0.0.1', 'workers': 1, 'timeout': 300,
                         'port': 7860, 'components_path': WindowsPath('C:/ProgramData/Anaconda3/en...
                                    -> <function run at 0x000001DA0FCB7F40>

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\__main__.
                         py", line 185, in run
                             process = run_on_windows(host, port, log_level, options, app)
                                       |              |     |     |          |        ->
                         <fastapi.applications.FastAPI object at 0x000001DA0FDF8730>
                                       |              |     |     |          -> {'bind':
                         '127.0.0.1:7860', 'workers': 1, 'timeout': 300}
                                       |              |     |     -> 'critical'
                                       |              |     -> 7860
                                       |              -> '127.0.0.1'
                                       -> <function run_on_windows at 0x000001DA0FCB7E20>

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\__main__.
                         py", line 228, in run_on_windows
                             run_langflow(host, port, log_level, options, app)
                             |            |     |     |          |        ->
                         <fastapi.applications.FastAPI object at 0x000001DA0FDF8730>
                             |            |     |     |          -> {'bind': '127.0.0.1:7860',
                         'workers': 1, 'timeout': 300}
                             |            |     |     -> 'critical'
                             |            |     -> 7860
                             |            -> '127.0.0.1'
                             -> <function run_langflow at 0x000001DA0FDE92D0>

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\__main__.
                         py", line 395, in run_langflow
                             uvicorn.run(
                             |       -> <function run at 0x000001DA108A9870>
                             -> <module 'uvicorn' from
                         'C:\\ProgramData\\Anaconda3\\envs\\py310torch\\lib\\site-packages\\uvicorn\\__
                         init__.py'>

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\uvicorn\main.py",
                         line 577, in run
                             server.run()
                             |      -> <function Server.run at 0x000001DA108A91B0>
                             -> <uvicorn.server.Server object at 0x000001DA118B8220>

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\uvicorn\server.py"
                         , line 65, in run
                             return asyncio.run(self.serve(sockets=sockets))
                                    |       |   |    |             -> None
                                    |       |   |    -> <function Server.serve at 0x000001DA108A9240>
                                    |       |   -> <uvicorn.server.Server object at 0x000001DA118B8220>
                                    |       -> <function _patch_asyncio.<locals>.run at
                         0x000001DA11965120>
                                    -> <module 'asyncio' from
                         'C:\\ProgramData\\Anaconda3\\envs\\py310torch\\lib\\asyncio\\__init__.py'>

                           File "C:\ProgramData\Anaconda3\envs\py310torch\lib\asyncio\runners.py", line
                         44, in run
                             return loop.run_until_complete(main)
                                    |    |                  -> <coroutine object Server.serve at
                         0x000001DA1083B530>
                                    |    -> <function _patch_loop.<locals>.run_until_complete at
                         0x000001DA11965360>
                                    -> <ProactorEventLoop running=True closed=False debug=False>

                           File "C:\ProgramData\Anaconda3\envs\py310torch\lib\asyncio\base_events.py",
                         line 636, in run_until_complete
                             self.run_forever()
                             |    -> <function _patch_loop.<locals>.run_forever at 0x000001DA119652D0>
                             -> <ProactorEventLoop running=True closed=False debug=False>

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\asyncio\windows_events.py", line
                         321, in run_forever
                             super().run_forever()

                           File "C:\ProgramData\Anaconda3\envs\py310torch\lib\asyncio\base_events.py",
                         line 603, in run_forever
                             self._run_once()
                             |    -> <function _patch_loop.<locals>._run_once at 0x000001DA119653F0>
                             -> <ProactorEventLoop running=True closed=False debug=False>

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\nest_asyncio.py",
                         line 133, in _run_once
                             handle._run()
                             |      -> <function Handle._run at 0x000001DA041108B0>
                             -> <Handle Task.__step()>

                           File "C:\ProgramData\Anaconda3\envs\py310torch\lib\asyncio\events.py", line
                         80, in _run
                             self._context.run(self._callback, *self._args)
                             |    |            |    |           |    -> <member '_args' of 'Handle'
                         objects>
                             |    |            |    |           -> <Handle Task.__step()>
                             |    |            |    -> <member '_callback' of 'Handle' objects>
                             |    |            -> <Handle Task.__step()>
                             |    -> <member '_context' of 'Handle' objects>
                             -> <Handle Task.__step()>

                           File "C:\ProgramData\Anaconda3\envs\py310torch\lib\asyncio\tasks.py", line
                         232, in __step
                             result = coro.send(None)
                                      |    -> <method 'send' of 'coroutine' objects>
                                      -> <coroutine object build_flow.<locals>.event_generator at
                         0x000001DA28D7B140>

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\api\v1\ch
                         at.py", line 377, in event_generator
                             ids, vertices_to_run, graph = await build_graph_and_get_order()
                                                                 -> <function
                         build_flow.<locals>.build_graph_and_get_order at 0x000001DA28BE8B80>

                         > File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\api\v1\ch
                         at.py", line 163, in build_graph_and_get_order
                             graph = await build_graph_from_data(flow_id_str, data.model_dump())
                                           |                     |            |    -> <function
                         BaseModel.model_dump at 0x000001DA05BD00D0>
                                           |                     |            ->
                         FlowDataRequest(nodes=[{'id': 'OllamaEmbeddings-GbbAE', 'type': 'genericNode',
                         'position': {'x': 695.0777561052839, 'y': 2925...
                                           |                     ->
                         'd1948b23-6b6c-4783-b8ea-7ea97cad2130'
                                           -> <function build_graph_from_data at 0x000001DA0F8657E0>

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\api\utils
                         .py", line 127, in build_graph_from_data
                             graph = Graph.from_payload(payload, flow_id, **kwargs)
                                     |     |            |        |          -> {}
                                     |     |            |        ->
                         'd1948b23-6b6c-4783-b8ea-7ea97cad2130'
                                     |     |            -> {'nodes': [{'id': 'OllamaEmbeddings-GbbAE',
                         'type': 'genericNode', 'position': {'x': 695.0777561052839, 'y':
                         2925.04615338104...
                                     |     -> <classmethod(<function Graph.from_payload at
                         0x000001DA0F79C940>)>
                                     -> <class 'langflow.graph.graph.base.Graph'>

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\graph\gra
                         ph\base.py", line 942, in from_payload
                             graph.add_nodes_and_edges(vertices, edges)
                             |     |                   |         -> [{'source':
                         'OllamaEmbeddings-GbbAE', 'target': 'pgvector-j7TRK', 'sourceHandle':
                         '{œdataTypeœ:œOllamaEmbeddingsœ,œidœ:œOllam...
                             |     |                   -> [{'id': 'OllamaEmbeddings-GbbAE', 'type':
                         'genericNode', 'position': {'x': 695.0777561052839, 'y': 2925.046153381045},
                         'data'...
                             |     -> <function Graph.add_nodes_and_edges at 0x000001DA0F793010>
                             -> Graph Representation:
                                ----------------------
                                Vertices (9):
                                  OllamaEmbeddings-GbbAE, pgvector-j7TRK, postgresql_query-422HV, ...

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\graph\gra
                         ph\base.py", line 195, in add_nodes_and_edges
                             self.initialize()
                             |    -> <function Graph.initialize at 0x000001DA0F7935B0>
                             -> Graph Representation:
                                ----------------------
                                Vertices (9):
                                  OllamaEmbeddings-GbbAE, pgvector-j7TRK, postgresql_query-422HV, ...

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\graph\gra
                         ph\base.py", line 332, in initialize
                             self._build_graph()
                             |    -> <function Graph._build_graph at 0x000001DA0F79CF70>
                             -> Graph Representation:
                                ----------------------
                                Vertices (9):
                                  OllamaEmbeddings-GbbAE, pgvector-j7TRK, postgresql_query-422HV, ...

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\graph\gra
                         ph\base.py", line 1094, in _build_graph
                             self.edges = self._build_edges()
                             |    |       |    -> <function Graph._build_edges at 0x000001DA0F79DD80>
                             |    |       -> Graph Representation:
                             |    |          ----------------------
                             |    |          Vertices (9):
                             |    |            OllamaEmbeddings-GbbAE, pgvector-j7TRK,
                         postgresql_query-422HV, ...
                             |    -> []
                             -> Graph Representation:
                                ----------------------
                                Vertices (9):
                                  OllamaEmbeddings-GbbAE, pgvector-j7TRK, postgresql_query-422HV, ...

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\graph\gra
                         ph\base.py", line 1548, in _build_edges
                             new_edge = self.build_edge(edge)
                                        |    |          -> {'source': 'OllamaModel-bRsfW',
                         'sourceHandle':
                         '{œdataTypeœ:œOllamaModelœ,œidœ:œOllamaModel-bRsfWœ,œnameœ:œmodel_outputœ,œou.
                         ..
                                        |    -> <function Graph.build_edge at 0x000001DA0F79DE10>
                                        -> Graph Representation:
                                           ----------------------
                                           Vertices (9):
                                             OllamaEmbeddings-GbbAE, pgvector-j7TRK,
                         postgresql_query-422HV, ...

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\graph\gra
                         ph\base.py", line 1562, in build_edge
                             new_edge = CycleEdge(source, target, edge)
                                        |         |       |       -> {'source': 'OllamaModel-bRsfW',
                         'sourceHandle':
                         '{œdataTypeœ:œOllamaModelœ,œidœ:œOllamaModel-bRsfWœ,œnameœ:œmodel_outputœ,œou.
                         ..
                                        |         |       -> Vertex(display_name=Self Query Retriever,
                         id=SelfQueryRetriever-iQMll, data={'type': 'SelfQueryRetriever', 'node':
                         {'template...
                                        |         -> Vertex(display_name=Ollama, id=OllamaModel-bRsfW,
                         data={'type': 'OllamaModel', 'node': {'template': {'_type': 'Component', 'b...
                                        -> <class 'langflow.graph.edge.base.CycleEdge'>

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\graph\edg
                         e\base.py", line 203, in __init__
                             super().__init__(source, target, raw_edge)
                                              |       |       -> {'source': 'OllamaModel-bRsfW',
                         'sourceHandle':
                         '{œdataTypeœ:œOllamaModelœ,œidœ:œOllamaModel-bRsfWœ,œnameœ:œmodel_outputœ,œou.
                         ..
                                              |       -> Vertex(display_name=Self Query Retriever,
                         id=SelfQueryRetriever-iQMll, data={'type': 'SelfQueryRetriever', 'node':
                         {'template...
                                              -> Vertex(display_name=Ollama, id=OllamaModel-bRsfW,
                         data={'type': 'OllamaModel', 'node': {'template': {'_type': 'Component', 'b...

                           File
                         "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\graph\edg
                         e\base.py", line 33, in __init__
                             raise ValueError(

                         ValueError: Component  field 'llm' might not be a valid input.

··· stack traceback

dosubot[bot] commented 2 months ago

The issue you're encountering with the llm field in the ChatOllamaComponent is related to the inputTypes field being None, which causes a ValueError during the validation process in the TargetHandle class.

To resolve this, ensure that the inputTypes field is properly defined as a list of acceptable input types. Here is the relevant structure for the TargetHandle class:

class TargetHandle(BaseModel):
    field_name: str = Field(..., description="Field name for the target handle.")
    id: str = Field(..., description="Unique identifier for the target handle.")
    input_types: Optional[List[str]] = Field(None, description="List of input types for the target handle.")
    type: str = Field(..., description="Type of the target handle.")

The inputTypes field should be a list of strings specifying the types of inputs that the target handle can accept. For example, it could be defined as follows:

{
  "targetHandle": {
    "fieldName": "llm",
    "id": "SelfQueryRetriever-iQMll",
    "inputTypes": ["LanguageModel"],
    "type": "LanguageModel"
  }
}

Ensure that the inputTypes field is not None and contains the appropriate input types. This should resolve the ValueError related to the llm field [1][2].

Additionally, verify that the build_model method in the ChatOllamaComponent class correctly initializes the ChatOllama object with the necessary parameters. If any parameter is incorrect or missing, it could also cause initialization issues:

def build_model(self) -> LanguageModel:  # type: ignore[type-var]
    # Mapping mirostat settings to their corresponding values
    mirostat_options = {"Mirostat": 1, "Mirostat 2.0": 2}

    # Default to 0 for 'Disabled'
    mirostat_value = mirostat_options.get(self.mirostat, 0)  # type: ignore

    # Set mirostat_eta and mirostat_tau to None if mirostat is disabled
    if mirostat_value == 0:
        mirostat_eta = None
        mirostat_tau = None
    else:
        mirostat_eta = self.mirostat_eta
        mirostat_tau = self.mirostat_tau

    # Mapping system settings to their corresponding values
    llm_params = {
        "base_url": self.base_url,
        "model": self.model_name,
        "mirostat": mirostat_value,
        "format": self.format,
        "metadata": self.metadata,
        "tags": self.tags.split(",") if self.tags else None,
        "mirostat_eta": mirostat_eta,
        "mirostat_tau": mirostat_tau,
        "num_ctx": self.num_ctx or None,
        "num_gpu": self.num_gpu or None,
        "num_thread": self.num_thread or None,
        "repeat_last_n": self.repeat_last_n or None,
        "repeat_penalty": self.repeat_penalty or None,
        "temperature": self.temperature or None,
        "stop": self.stop_tokens.split(",") if self.stop_tokens else None,
        "system": self.system,
        "template": self.template,
        "tfs_z": self.tfs_z or None,
        "timeout": self.timeout or None,
        "top_k": self.top_k or None,
        "top_p": self.top_p or None,
        "verbose": self.verbose,
    }

    # Remove parameters with None values
    llm_params = {k: v for k, v in llm_params.items() if v is not None}

    try:
        output = ChatOllama(**llm_params)  # type: ignore
    except Exception as e:
        raise ValueError("Could not initialize Ollama LLM.") from e

    return output  # type: ignore

By ensuring the inputTypes field is correctly defined and the parameters for ChatOllama are accurate, you should be able to resolve the issue [3].

To continue talking to Dosu, mention @dosu.

wrench1997 commented 2 months ago

@dosu How should I modify it?I can guarantee that my parameters are all correct

dosubot[bot] commented 2 months ago

To ensure the inputTypes field is correctly defined and avoid the ValueError related to the llm field in the ChatOllamaComponent, you need to make sure that the inputs list is properly defined and that the build_model method correctly initializes the ChatOllama object with the required parameters.

Here is the corrected code for the ChatOllamaComponent class:

from typing import Any, Dict, List, Optional

import httpx
from langchain_community.chat_models import ChatOllama

from langflow.base.constants import STREAM_INFO_TEXT
from langflow.base.models.model import LCModelComponent
from langflow.field_typing import Text
from langflow.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, MessageInput, Output, StrInput

class ChatOllamaComponent(LCModelComponent):
    display_name = "Ollama"
    description = "Generate text using Ollama Local LLMs."
    icon = "Ollama"

    inputs = [
        MessageInput(name="input_value", display_name="Input"),
        StrInput(
            name="base_url",
            display_name="Base URL",
            info="Endpoint of the Ollama API. Defaults to 'http://localhost:11434' if not specified.",
            value="http://localhost:11434",
        ),
        DropdownInput(
            name="model",
            display_name="Model Name",
            value="llama2",
            info="Refer to https://ollama.ai/library for more models.",
            refresh_button=True,
        ),
        FloatInput(
            name="temperature",
            display_name="Temperature",
            value=0.2,
            info="Controls the creativity of model responses.",
        ),
        StrInput(
            name="format",
            display_name="Format",
            info="Specify the format of the output (e.g., json).",
            advanced=True,
        ),
        DictInput(
            name="metadata",
            display_name="Metadata",
            info="Metadata to add to the run trace.",
            advanced=True,
        ),
        DropdownInput(
            name="mirostat",
            display_name="Mirostat",
            options=["Disabled", "Mirostat", "Mirostat 2.0"],
            info="Enable/disable Mirostat sampling for controlling perplexity.",
            value="Disabled",
            advanced=True,
        ),
        FloatInput(
            name="mirostat_eta",
            display_name="Mirostat Eta",
            info="Learning rate for Mirostat algorithm. (Default: 0.1)",
            advanced=True,
        ),
        FloatInput(
            name="mirostat_tau",
            display_name="Mirostat Tau",
            info="Controls the balance between coherence and diversity of the output. (Default: 5.0)",
            advanced=True,
        ),
        IntInput(
            name="num_ctx",
            display_name="Context Window Size",
            info="Size of the context window for generating tokens. (Default: 2048)",
            advanced=True,
        ),
        IntInput(
            name="num_gpu",
            display_name="Number of GPUs",
            info="Number of GPUs to use for computation. (Default: 1 on macOS, 0 to disable)",
            advanced=True,
        ),
        IntInput(
            name="num_thread",
            display_name="Number of Threads",
            info="Number of threads to use during computation. (Default: detected for optimal performance)",
            advanced=True,
        ),
        IntInput(
            name="repeat_last_n",
            display_name="Repeat Last N",
            info="How far back the model looks to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)",
            advanced=True,
        ),
        FloatInput(
            name="repeat_penalty",
            display_name="Repeat Penalty",
            info="Penalty for repetitions in generated text. (Default: 1.1)",
            advanced=True,
        ),
        FloatInput(
            name="tfs_z",
            display_name="TFS Z",
            info="Tail free sampling value. (Default: 1)",
            advanced=True,
        ),
        IntInput(
            name="timeout",
            display_name="Timeout",
            info="Timeout for the request stream.",
            advanced=True,
        ),
        IntInput(
            name="top_k",
            display_name="Top K",
            info="Limits token selection to top K. (Default: 40)",
            advanced=True,
        ),
        FloatInput(
            name="top_p",
            display_name="Top P",
            info="Works together with top-k. (Default: 0.9)",
            advanced=True,
        ),
        BoolInput(
            name="verbose",
            display_name="Verbose",
            info="Whether to print out response text.",
        ),
        StrInput(
            name="tags",
            display_name="Tags",
            info="Comma-separated list of tags to add to the run trace.",
            advanced=True,
        ),
        StrInput(
            name="stop_tokens",
            display_name="Stop Tokens",
            info="Comma-separated list of tokens to signal the model to stop generating text.",
            advanced=True,
        ),
        StrInput(
            name="system",
            display_name="System",
            info="System to use for generating text.",
            advanced=True,
        ),
        StrInput(
            name="template",
            display_name="Template",
            info="Template to use for generating text.",
            advanced=True,
        ),
        BoolInput(
            name="stream",
            display_name="Stream",
            info=STREAM_INFO_TEXT,
            advanced=True,
        ),
        StrInput(
            name="system_message",
            display_name="System Message",
            info="System message to pass to the model.",
            advanced=True,
        ),
    ]

    outputs = [
        Output(display_name="Text", name="text_output", method="text_response"),
        Output(display_name="Language Model", name="model_output", method="build_model"),
    ]

    def build_model(self) -> LanguageModel:
        # Mapping mirostat settings to their corresponding values
        mirostat_options = {"Mirostat": 1, "Mirostat 2.0": 2}

        # Default to 0 for 'Disabled'
        mirostat_value = mirostat_options.get(self.mirostat, 0)  # type: ignore

        # Set mirostat_eta and mirostat_tau to None if mirostat is disabled
        if (mirostat_value == 0):
            mirostat_eta = None
            mirostat_tau = None
        else:
            mirostat_eta = self.mirostat_eta
            mirostat_tau = self.mirostat_tau

        # Mapping system settings to their corresponding values
        llm_params = {
            "base_url": self.base_url,
            "model": self.model,
            "mirostat": mirostat_value,
            "format": self.format,
            "metadata": self.metadata,
            "tags": self.tags.split(",") if self.tags else None,
            "mirostat_eta": mirostat_eta,
            "mirostat_tau": mirostat_tau,
            "num_ctx": self.num_ctx or None,
            "num_gpu": self.num_gpu or None,
            "num_thread": self.num_thread or None,
            "repeat_last_n": self.repeat_last_n or None,
            "repeat_penalty": self.repeat_penalty or None,
            "temperature": self.temperature or None,
            "stop": self.stop_tokens.split(",") if self.stop_tokens else None,
            "system": self.system,
            "template": self.template,
            "tfs_z": self.tfs_z or None,
            "timeout": self.timeout or None,
            "top_k": self.top_k or None,
            "top_p": self.top_p or None,
            "verbose": self.verbose,
        }

        # Remove parameters with None values
        llm_params = {k: v for k, v in llm_params.items() if v is not None}

        try:
            output = ChatOllama(**llm_params)  # type: ignore
        except Exception as e:
            raise ValueError("Could not initialize Ollama LLM.") from e

        return output

This modification ensures that the inputTypes field is correctly defined and that the build_model method initializes the ChatOllama object with the necessary parameters, avoiding the ValueError related to the llm field [1][2][3][4][5].

To continue talking to Dosu, mention @dosu.

wrench1997 commented 2 months ago

@dosu It seems that no error is reported?But I think it’s a problem with the Self Query Retriever component. Because there is a new error

ERROR    2024-08-31 22:51:18 - ERROR    - chat - Component  field 'attribute_infos'     chat.py:204
                             might not be a valid input.Traceback (most recent call last):

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\graph\edg
                             e\base.py", line 27, in __init__
                                 self.target_handle: TargetHandle = TargetHandle(**self._target_handle)
                                 |                                  |              |    -> {'fieldName':
                             'attribute_infos', 'id': 'SelfQueryRetriever-iQMll', 'inputTypes': None,
                             'type': 'Data'}
                                 |                                  |              -> SplitText-tJguV
                             -[None]-> SelfQueryRetriever-iQMll
                                 |                                  -> <class
                             'langflow.graph.edge.schema.TargetHandle'>
                                 -> SplitText-tJguV -[None]-> SelfQueryRetriever-iQMll

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\pydantic\main.py",
                             line 193, in __init__
                                 self.__pydantic_validator__.validate_python(data, self_instance=self)
                                 |    |                      |               |                   ->
                             TargetHandle()
                                 |    |                      |               -> {'fieldName':
                             'attribute_infos', 'id': 'SelfQueryRetriever-iQMll', 'inputTypes': None,
                             'type': 'Data'}
                                 |    |                      -> <method 'validate_python' of
                             'pydantic_core._pydantic_core.SchemaValidator' objects>
                                 |    -> SchemaValidator(title="TargetHandle", validator=Model(
                                 |           ModelValidator {
                                 |               revalidate: Never,
                                 |               validator: Mod...
                                 -> TargetHandle()

                             pydantic_core._pydantic_core.ValidationError: 1 validation error for
                             TargetHandle
                             inputTypes
                               Input should be a valid list
                                 For further information visit https://errors.pydantic.dev/2.8/v/list_type

                             The above exception was the direct cause of the following exception:

                             Traceback (most recent call last):

                               File "C:\ProgramData\Anaconda3\envs\py310torch\lib\runpy.py", line 196, in
                             _run_module_as_main
                                 return _run_code(code, main_globals, None,
                                        |         |     -> {'__name__': '__main__', '__doc__': None,
                             '__package__': '', '__loader__': <zipimporter object
                             "C:\ProgramData\Anaconda3\envs...
                                        |         -> <code object <module> at 0x0000021352288030, file
                             "C:\ProgramData\Anaconda3\envs\py310torch\Scripts\langflow.exe\__main__.py"...
                                        -> <function _run_code at 0x0000021352265BD0>

                               File "C:\ProgramData\Anaconda3\envs\py310torch\lib\runpy.py", line 86, in
                             _run_code
                                 exec(code, run_globals)
                                      |     -> {'__name__': '__main__', '__doc__': None, '__package__': '',
                             '__loader__': <zipimporter object "C:\ProgramData\Anaconda3\envs...
                                      -> <code object <module> at 0x0000021352288030, file
                             "C:\ProgramData\Anaconda3\envs\py310torch\Scripts\langflow.exe\__main__.py"...

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\Scripts\langflow.exe\__main__.py",
                             line 7, in <module>

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\__main__.
                             py", line 566, in main
                                 app()
                                 -> <typer.main.Typer object at 0x0000021355DAA1D0>

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\typer\main.py",
                             line 321, in __call__
                                 return get_command(self)(*args, **kwargs)
                                        |           |      |       -> {}
                                        |           |      -> ()
                                        |           -> <typer.main.Typer object at 0x0000021355DAA1D0>
                                        -> <function get_command at 0x0000021355CA8F70>

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\click\core.py",
                             line 1157, in __call__
                                 return self.main(*args, **kwargs)
                                        |    |     |       -> {}
                                        |    |     -> ()
                                        |    -> <function TyperGroup.main at 0x0000021355C91F30>
                                        -> <TyperGroup >

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\typer\core.py",
                             line 728, in main
                                 return _main(
                                        -> <function _main at 0x0000021355C912D0>

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\typer\core.py",
                             line 197, in _main
                                 rv = self.invoke(ctx)
                                      |    |      -> <click.core.Context object at 0x0000021352235FC0>
                                      |    -> <function MultiCommand.invoke at 0x0000021353F34670>
                                      -> <TyperGroup >

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\click\core.py",
                             line 1688, in invoke
                                 return _process_result(sub_ctx.command.invoke(sub_ctx))
                                        |               |       |       |      -> <click.core.Context
                             object at 0x00000213607B95A0>
                                        |               |       |       -> <function Command.invoke at
                             0x0000021353F34160>
                                        |               |       -> <TyperCommand run>
                                        |               -> <click.core.Context object at
                             0x00000213607B95A0>
                                        -> <function MultiCommand.invoke.<locals>._process_result at
                             0x00000213607C4940>

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\click\core.py",
                             line 1434, in invoke
                                 return ctx.invoke(self.callback, **ctx.params)
                                        |   |      |    |           |   -> {'host': '127.0.0.1', 'workers':
                             1, 'timeout': 300, 'port': 7860, 'components_path':
                             WindowsPath('C:/ProgramData/Anaconda3/en...
                                        |   |      |    |           -> <click.core.Context object at
                             0x00000213607B95A0>
                                        |   |      |    -> <function run at 0x00000213607C4D30>
                                        |   |      -> <TyperCommand run>
                                        |   -> <function Context.invoke at 0x0000021353F22E60>
                                        -> <click.core.Context object at 0x00000213607B95A0>

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\click\core.py",
                             line 783, in invoke
                                 return __callback(*args, **kwargs)
                                                    |       -> {'host': '127.0.0.1', 'workers': 1,
                             'timeout': 300, 'port': 7860, 'components_path':
                             WindowsPath('C:/ProgramData/Anaconda3/en...
                                                    -> ()

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\typer\main.py",
                             line 703, in wrapper
                                 return callback(**use_params)
                                        |          -> {'host': '127.0.0.1', 'workers': 1, 'timeout': 300,
                             'port': 7860, 'components_path': WindowsPath('C:/ProgramData/Anaconda3/en...
                                        -> <function run at 0x0000021360697F40>

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\__main__.
                             py", line 185, in run
                                 process = run_on_windows(host, port, log_level, options, app)
                                           |              |     |     |          |        ->
                             <fastapi.applications.FastAPI object at 0x00000213607D8730>
                                           |              |     |     |          -> {'bind':
                             '127.0.0.1:7860', 'workers': 1, 'timeout': 300}
                                           |              |     |     -> 'critical'
                                           |              |     -> 7860
                                           |              -> '127.0.0.1'
                                           -> <function run_on_windows at 0x0000021360697E20>

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\__main__.
                             py", line 228, in run_on_windows
                                 run_langflow(host, port, log_level, options, app)
                                 |            |     |     |          |        ->
                             <fastapi.applications.FastAPI object at 0x00000213607D8730>
                                 |            |     |     |          -> {'bind': '127.0.0.1:7860',
                             'workers': 1, 'timeout': 300}
                                 |            |     |     -> 'critical'
                                 |            |     -> 7860
                                 |            -> '127.0.0.1'
                                 -> <function run_langflow at 0x00000213607C52D0>

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\__main__.
                             py", line 395, in run_langflow
                                 uvicorn.run(
                                 |       -> <function run at 0x0000021361295870>
                                 -> <module 'uvicorn' from
                             'C:\\ProgramData\\Anaconda3\\envs\\py310torch\\lib\\site-packages\\uvicorn\\__
                             init__.py'>

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\uvicorn\main.py",
                             line 577, in run
                                 server.run()
                                 |      -> <function Server.run at 0x00000213612951B0>
                                 -> <uvicorn.server.Server object at 0x0000021362298220>

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\uvicorn\server.py"
                             , line 65, in run
                                 return asyncio.run(self.serve(sockets=sockets))
                                        |       |   |    |             -> None
                                        |       |   |    -> <function Server.serve at 0x0000021361295240>
                                        |       |   -> <uvicorn.server.Server object at 0x0000021362298220>
                                        |       -> <function _patch_asyncio.<locals>.run at
                             0x0000021362345120>
                                        -> <module 'asyncio' from
                             'C:\\ProgramData\\Anaconda3\\envs\\py310torch\\lib\\asyncio\\__init__.py'>

                               File "C:\ProgramData\Anaconda3\envs\py310torch\lib\asyncio\runners.py", line
                             44, in run
                                 return loop.run_until_complete(main)
                                        |    |                  -> <coroutine object Server.serve at
                             0x000002136121B530>
                                        |    -> <function _patch_loop.<locals>.run_until_complete at
                             0x0000021362345360>
                                        -> <ProactorEventLoop running=True closed=False debug=False>

                               File "C:\ProgramData\Anaconda3\envs\py310torch\lib\asyncio\base_events.py",
                             line 636, in run_until_complete
                                 self.run_forever()
                                 |    -> <function _patch_loop.<locals>.run_forever at 0x00000213623452D0>
                                 -> <ProactorEventLoop running=True closed=False debug=False>

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\asyncio\windows_events.py", line
                             321, in run_forever
                                 super().run_forever()

                               File "C:\ProgramData\Anaconda3\envs\py310torch\lib\asyncio\base_events.py",
                             line 603, in run_forever
                                 self._run_once()
                                 |    -> <function _patch_loop.<locals>._run_once at 0x00000213623453F0>
                                 -> <ProactorEventLoop running=True closed=False debug=False>

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\nest_asyncio.py",
                             line 133, in _run_once
                                 handle._run()
                                 |      -> <function Handle._run at 0x0000021354AE08B0>
                                 -> <Handle Task.__step()>

                               File "C:\ProgramData\Anaconda3\envs\py310torch\lib\asyncio\events.py", line
                             80, in _run
                                 self._context.run(self._callback, *self._args)
                                 |    |            |    |           |    -> <member '_args' of 'Handle'
                             objects>
                                 |    |            |    |           -> <Handle Task.__step()>
                                 |    |            |    -> <member '_callback' of 'Handle' objects>
                                 |    |            -> <Handle Task.__step()>
                                 |    -> <member '_context' of 'Handle' objects>
                                 -> <Handle Task.__step()>

                               File "C:\ProgramData\Anaconda3\envs\py310torch\lib\asyncio\tasks.py", line
                             232, in __step
                                 result = coro.send(None)
                                          |    -> <method 'send' of 'coroutine' objects>
                                          -> <coroutine object build_flow.<locals>.event_generator at
                             0x000002137B847680>

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\api\v1\ch
                             at.py", line 377, in event_generator
                                 ids, vertices_to_run, graph = await build_graph_and_get_order()
                                                                     -> <function
                             build_flow.<locals>.build_graph_and_get_order at 0x00000213628088B0>

                             > File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\api\v1\ch
                             at.py", line 163, in build_graph_and_get_order
                                 graph = await build_graph_from_data(flow_id_str, data.model_dump())
                                               |                     |            |    -> <function
                             BaseModel.model_dump at 0x00000213565A00D0>
                                               |                     |            ->
                             FlowDataRequest(nodes=[{'id': 'OllamaEmbeddings-GbbAE', 'type': 'genericNode',
                             'position': {'x': 695.0777561052839, 'y': 2925...
                                               |                     ->
                             'd1948b23-6b6c-4783-b8ea-7ea97cad2130'
                                               -> <function build_graph_from_data at 0x00000213602417E0>

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\api\utils
                             .py", line 127, in build_graph_from_data
                                 graph = Graph.from_payload(payload, flow_id, **kwargs)
                                         |     |            |        |          -> {}
                                         |     |            |        ->
                             'd1948b23-6b6c-4783-b8ea-7ea97cad2130'
                                         |     |            -> {'nodes': [{'id': 'OllamaEmbeddings-GbbAE',
                             'type': 'genericNode', 'position': {'x': 695.0777561052839, 'y':
                             2925.04615338104...
                                         |     -> <classmethod(<function Graph.from_payload at
                             0x000002136017C940>)>
                                         -> <class 'langflow.graph.graph.base.Graph'>

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\graph\gra
                             ph\base.py", line 942, in from_payload
                                 graph.add_nodes_and_edges(vertices, edges)
                                 |     |                   |         -> [{'source':
                             'OllamaEmbeddings-GbbAE', 'target': 'pgvector-j7TRK', 'sourceHandle':
                             '{œdataTypeœ:œOllamaEmbeddingsœ,œidœ:œOllam...
                                 |     |                   -> [{'id': 'OllamaEmbeddings-GbbAE', 'type':
                             'genericNode', 'position': {'x': 695.0777561052839, 'y': 2925.046153381045},
                             'data'...
                                 |     -> <function Graph.add_nodes_and_edges at 0x0000021360173010>
                                 -> Graph Representation:
                                    ----------------------
                                    Vertices (9):
                                      OllamaEmbeddings-GbbAE, pgvector-j7TRK, postgresql_query-422HV, ...

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\graph\gra
                             ph\base.py", line 195, in add_nodes_and_edges
                                 self.initialize()
                                 |    -> <function Graph.initialize at 0x00000213601735B0>
                                 -> Graph Representation:
                                    ----------------------
                                    Vertices (9):
                                      OllamaEmbeddings-GbbAE, pgvector-j7TRK, postgresql_query-422HV, ...

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\graph\gra
                             ph\base.py", line 332, in initialize
                                 self._build_graph()
                                 |    -> <function Graph._build_graph at 0x000002136017CF70>
                                 -> Graph Representation:
                                    ----------------------
                                    Vertices (9):
                                      OllamaEmbeddings-GbbAE, pgvector-j7TRK, postgresql_query-422HV, ...

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\graph\gra
                             ph\base.py", line 1094, in _build_graph
                                 self.edges = self._build_edges()
                                 |    |       |    -> <function Graph._build_edges at 0x000002136017DD80>
                                 |    |       -> Graph Representation:
                                 |    |          ----------------------
                                 |    |          Vertices (9):
                                 |    |            OllamaEmbeddings-GbbAE, pgvector-j7TRK,
                             postgresql_query-422HV, ...
                                 |    -> []
                                 -> Graph Representation:
                                    ----------------------
                                    Vertices (9):
                                      OllamaEmbeddings-GbbAE, pgvector-j7TRK, postgresql_query-422HV, ...

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\graph\gra
                             ph\base.py", line 1548, in _build_edges
                                 new_edge = self.build_edge(edge)
                                            |    |          -> {'source': 'SplitText-tJguV',
                             'sourceHandle':
                             '{œdataTypeœ:œSplitTextœ,œidœ:œSplitText-tJguVœ,œnameœ:œchunksœ,œoutput_typesœ
                             :...
                                            |    -> <function Graph.build_edge at 0x000002136017DE10>
                                            -> Graph Representation:
                                               ----------------------
                                               Vertices (9):
                                                 OllamaEmbeddings-GbbAE, pgvector-j7TRK,
                             postgresql_query-422HV, ...

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\graph\gra
                             ph\base.py", line 1562, in build_edge
                                 new_edge = CycleEdge(source, target, edge)
                                            |         |       |       -> {'source': 'SplitText-tJguV',
                             'sourceHandle':
                             '{œdataTypeœ:œSplitTextœ,œidœ:œSplitText-tJguVœ,œnameœ:œchunksœ,œoutput_typesœ
                             :...
                                            |         |       -> Vertex(display_name=Self Query Retriever,
                             id=SelfQueryRetriever-iQMll, data={'type': 'SelfQueryRetriever', 'node':
                             {'template...
                                            |         -> Vertex(display_name=Split Text,
                             id=SplitText-tJguV, data={'type': 'SplitText', 'node': {'template': {'_type':
                             'Component', 'd...
                                            -> <class 'langflow.graph.edge.base.CycleEdge'>

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\graph\edg
                             e\base.py", line 203, in __init__
                                 super().__init__(source, target, raw_edge)
                                                  |       |       -> {'source': 'SplitText-tJguV',
                             'sourceHandle':
                             '{œdataTypeœ:œSplitTextœ,œidœ:œSplitText-tJguVœ,œnameœ:œchunksœ,œoutput_typesœ
                             :...
                                                  |       -> Vertex(display_name=Self Query Retriever,
                             id=SelfQueryRetriever-iQMll, data={'type': 'SelfQueryRetriever', 'node':
                             {'template...
                                                  -> Vertex(display_name=Split Text, id=SplitText-tJguV,
                             data={'type': 'SplitText', 'node': {'template': {'_type': 'Component', 'd...

                               File
                             "C:\ProgramData\Anaconda3\envs\py310torch\lib\site-packages\langflow\graph\edg
                             e\base.py", line 33, in __init__
                                 raise ValueError(

                             ValueError: Component  field 'attribute_infos' might not be a valid input.
dosubot[bot] commented 2 months ago

The error you're encountering with the attribute_infos field in the Self Query Retriever component is due to the inputTypes field being None, which causes a ValueError during the validation process in the TargetHandle class.

To resolve this, ensure that the inputTypes field is properly defined as a list of acceptable input types. Here is the relevant structure for the TargetHandle class:

class TargetHandle(BaseModel):
    field_name: str = Field(..., description="Field name for the target handle.")
    id: str = Field(..., description="Unique identifier for the target handle.")
    input_types: Optional[List[str]] = Field(None, description="List of input types for the target handle.")
    type: str = Field(..., description="Type of the target handle.")

The inputTypes field should be a list of strings specifying the types of inputs that the target handle can accept. For example, it could be defined as follows:

{
  "targetHandle": {
    "fieldName": "attribute_infos",
    "id": "SelfQueryRetriever-iQMll",
    "inputTypes": ["Data"],
    "type": "Data"
  }
}

Ensure that the inputTypes field is not None and contains the appropriate input types. This should resolve the ValueError related to the attribute_infos field [1][2].

Additionally, ensure that the attribute_infos field is correctly formatted and passed as a list of JSON strings. Each JSON string should contain the necessary information to instantiate AttributeInfo. For example:

metadata_field_info = [
    '{"name": "field1", "type": "string", "description": "Description of field1"}',
    '{"name": "field2", "type": "integer", "description": "Description of field2"}',
]

This way, the metadata_field_obj list will be correctly populated with AttributeInfo objects, and the SelfQueryRetriever can be instantiated without errors [3][4].

To continue talking to Dosu, mention @dosu.

wrench1997 commented 2 months ago

@dosu I just want to change whether the SelfQueryRetriever component can be run directly?

dosubot[bot] commented 2 months ago

No, the SelfQueryRetriever component cannot be run directly. The provided code defines a VectaraSelfQueryRetriverComponent class that wraps around the SelfQueryRetriever from LangChain, but it does not include any standalone execution logic. The component is designed to be used within a larger framework or application where it can be instantiated and its build method can be called with the appropriate inputs [1][2].

To continue talking to Dosu, mention @dosu.

wrench1997 commented 2 months ago

@dosu Are there any examples of successful calls SelfQueryRetriever ? Can you give me a reference?

dosubot[bot] commented 2 months ago

Here is an example of how to successfully instantiate and use the SelfQueryRetriever component within a Langflow application or workflow:

Example Code

from langchain_community.chat_models import ChatOllama
from langflow.base.models.model import LCModelComponent
from langflow.field_typing import LanguageModel, VectorStore, Data, Text, Message
from langflow.components.retrievers import SelfQueryRetriever
from langflow.components.retrievers.VectaraSelfQueryRetriver import AttributeInfo

# Define the necessary inputs
query = "What is the capital of France?"
vectorstore = VectorStore()  # Replace with an actual instance of VectorStore
attribute_infos = [
    Data(name="field1", type="string", description="Description of field1"),
    Data(name="field2", type="integer", description="Description of field2"),
]
document_content_description = "This is a description of the document content."
llm = ChatOllama(base_url="http://localhost:11434", model="llama2")  # Replace with actual LLM instance

# Instantiate the SelfQueryRetriever
metadata_field_infos = [AttributeInfo(**value.data) for value in attribute_infos]
self_query_retriever = SelfQueryRetriever.from_llm(
    llm=llm,
    vectorstore=vectorstore,
    document_contents=document_content_description,
    metadata_field_info=metadata_field_infos,
    enable_limit=True,
)

# Process the query
if isinstance(query, Message):
    input_text = query.text
elif isinstance(query, str):
    input_text = query
else:
    raise ValueError(f"Query type {type(query)} not supported.")

documents = self_query_retriever.invoke(input=input_text)
data = [Data.from_document(document) for document in documents]

# Output the results
for doc in data:
    print(doc)

Explanation

  1. Define Inputs: Set up the necessary inputs such as query, vectorstore, attribute_infos, document_content_description, and llm.

  2. Instantiate SelfQueryRetriever: Use the SelfQueryRetriever.from_llm method to create an instance of SelfQueryRetriever with the provided inputs.

  3. Process the Query: Check the type of the query and convert it to a string if necessary. Then, use the invoke method of SelfQueryRetriever to process the query and retrieve documents.

  4. Output the Results: Convert the retrieved documents to Data objects and print the results.

This example demonstrates how to set up and use the SelfQueryRetriever component within a Langflow application or workflow [1][2][3].

To continue talking to Dosu, mention @dosu.

wrench1997 commented 2 months ago

@dosu vectorstore = VectorStore() # Replace with an actual instance of VectorStore TypeError: Can't instantiate abstract class VectorStore with abstract methods from_texts, similarity_search

dosubot[bot] commented 2 months ago

To avoid the TypeError when instantiating the VectorStore class, you need to use a concrete implementation of the VectorStore class that provides the required methods (from_texts and similarity_search). Here is an example using the SupabaseVectorStoreComponent:

Example Code

from langflow.base.vectorstores.model import LCVectorStoreComponent
from langflow.io import DataInput, StrInput, SecretStrInput, MultilineInput, IntInput
from langchain_community.vectorstores import SupabaseVectorStore
from supabase.client import Client, create_client
from langflow.helpers.data import docs_to_data
from langflow.schema import Data
from langflow.components.retrievers import SelfQueryRetriever
from langflow.components.retrievers.VectaraSelfQueryRetriver import AttributeInfo

class SupabaseVectorStoreComponent(LCVectorStoreComponent):
    display_name = "Supabase"
    description = "Supabase Vector Store with search capabilities"
    documentation = "https://python.langchain.com/v0.2/docs/integrations/vectorstores/supabase/"
    icon = "Supabase"

    inputs = [
        StrInput(name="supabase_url", display_name="Supabase URL", required=True),
        SecretStrInput(name="supabase_service_key", display_name="Supabase Service Key", required=True),
        StrInput(name="table_name", display_name="Table Name", advanced=True),
        StrInput(name="query_name", display_name="Query Name"),
        MultilineInput(name="search_query", display_name="Search Query"),
        DataInput(name="ingest_data", display_name="Ingest Data", is_list=True),
        IntInput(name="number_of_results", display_name="Number of Results", info="Number of results to return.", value=4, advanced=True),
    ]

    def build_vector_store(self) -> SupabaseVectorStore:
        return self._build_supabase()

    def _build_supabase(self) -> SupabaseVectorStore:
        supabase: Client = create_client(self.supabase_url, self.supabase_service_key)

        documents = []
        for _input in self.ingest_data or []:
            if isinstance(_input, Data):
                documents.append(_input.to_lc_document())
            else:
                documents.append(_input)

        if documents:
            supabase_vs = SupabaseVectorStore.from_documents(
                documents=documents,
                embedding=self.embedding,
                query_name=self.query_name,
                client=supabase,
                table_name=self.table_name,
            )
        else:
            supabase_vs = SupabaseVectorStore(
                client=supabase,
                embedding=self.embedding,
                table_name=self.table_name,
                query_name=self.query_name,
            )

        return supabase_vs

    def search_documents(self) -> list[Data]:
        vector_store = self._build_supabase()

        if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
            docs = vector_store.similarity_search(
                query=self.search_query,
                k=self.number_of_results,
            )

            data = docs_to_data(docs)
            self.status = data
            return data
        else:
            return []

# Define the necessary inputs
query = "What is the capital of France?"
vectorstore_component = SupabaseVectorStoreComponent(
    supabase_url="your_supabase_url",
    supabase_service_key="your_supabase_service_key",
    table_name="your_table_name",
    query_name="your_query_name",
    search_query="your_search_query",
    ingest_data=[],  # Add your data here
    number_of_results=4
)
vectorstore = vectorstore_component.build_vector_store()

attribute_infos = [
    Data(name="field1", type="string", description="Description of field1"),
    Data(name="field2", type="integer", description="Description of field2"),
]
document_content_description = "This is a description of the document content."
llm = ChatOllama(base_url="http://localhost:11434", model="llama2")  # Replace with actual LLM instance

# Instantiate the SelfQueryRetriever
metadata_field_infos = [AttributeInfo(**value.data) for value in attribute_infos]
self_query_retriever = SelfQueryRetriever.from_llm(
    llm=llm,
    vectorstore=vectorstore,
    document_contents=document_content_description,
    metadata_field_info=metadata_field_infos,
    enable_limit=True,
)

# Process the query
if isinstance(query, Message):
    input_text = query.text
elif isinstance(query, str):
    input_text = query
else:
    raise ValueError(f"Query type {type(query)} not supported.")

documents = self_query_retriever.invoke(input=input_text)
data = [Data.from_document(document) for document in documents]

# Output the results
for doc in data:
    print(doc)

Explanation

  1. SupabaseVectorStoreComponent: This class provides a concrete implementation of the VectorStore class using Supabase.
  2. Instantiate VectorStore: Use the SupabaseVectorStoreComponent to create an instance of SupabaseVectorStore.
  3. Instantiate SelfQueryRetriever: Use the SelfQueryRetriever.from_llm method to create an instance of SelfQueryRetriever with the provided inputs.
  4. Process the Query: Check the type of the query and convert it to a string if necessary. Then, use the invoke method of SelfQueryRetriever to process the query and retrieve documents.
  5. Output the Results: Convert the retrieved documents to Data objects and print the results.

This approach ensures that the VectorStore is instantiated correctly without encountering the TypeError related to the abstract methods [1][2][3][4].

To continue talking to Dosu, mention @dosu.

wrench1997 commented 2 months ago

@dosu Pure code cannot solve my doubts. Is there any other staff who can answer and give examples?

dosubot[bot] commented 2 months ago

This is a tough nut to crack, could really use your help on this, @ogabrielluiz.

To continue talking to Dosu, mention @dosu.

Cristhianzl commented 2 months ago

Hi @wrench1997,

I hope you're doing well. You can follow up on PR #3653.

I will be sending you the updated code for the Self Query Retriever so you can use it right away, without waiting for my PR to be released.

Please add the content of this file to your component's code by clicking on the button below: image

Afterward, you'll need to reconnect all the edges. If you try to run the flow, the retriever will ask for a 'lark' package. Please make sure to install the 'lark' package by running poetry add lark, and don’t forget to restart your backend.

Once these changes are made, you should be able to run your flow with the Self Query Retriever component.

Here is the code you need: self_query_retriever.txt

Thanks!