fix: Refactor import statements and enhance error logging (#4071)
* Refactor import paths for `get_patched_openai_client` in astra_assistants components * Enhance error logging with file information in directory_reader.py * Refactor MetaphorToolkit to use new input/output structure and update imports * Enhance error message with code snippet preview in class validation function * update import statements and refactoring input handling in JSON files. * [autofix.ci] apply automated fixes * Remove unused import of 'Tool' from Metaphor.py --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
parent
4a745aae5d
commit
f74b58f22a
24 changed files with 88 additions and 72 deletions
|
|
@ -2,7 +2,7 @@ import asyncio
|
||||||
|
|
||||||
from astra_assistants.astra_assistants_manager import AssistantManager
|
from astra_assistants.astra_assistants_manager import AssistantManager
|
||||||
|
|
||||||
from langflow.components.astra_assistants.util import (
|
from langflow.base.astra_assistants.util import (
|
||||||
get_patched_openai_client,
|
get_patched_openai_client,
|
||||||
litellm_model_names,
|
litellm_model_names,
|
||||||
tool_names,
|
tool_names,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from langflow.components.astra_assistants.util import get_patched_openai_client
|
from langflow.base.astra_assistants.util import get_patched_openai_client
|
||||||
from langflow.custom.custom_component.component_with_cache import ComponentWithCache
|
from langflow.custom.custom_component.component_with_cache import ComponentWithCache
|
||||||
from langflow.inputs import MultilineInput, StrInput
|
from langflow.inputs import MultilineInput, StrInput
|
||||||
from langflow.schema.message import Message
|
from langflow.schema.message import Message
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from langflow.components.astra_assistants.util import get_patched_openai_client
|
from langflow.base.astra_assistants.util import get_patched_openai_client
|
||||||
from langflow.custom.custom_component.component_with_cache import ComponentWithCache
|
from langflow.custom.custom_component.component_with_cache import ComponentWithCache
|
||||||
from langflow.inputs import MultilineInput
|
from langflow.inputs import MultilineInput
|
||||||
from langflow.schema.message import Message
|
from langflow.schema.message import Message
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from langflow.components.astra_assistants.util import get_patched_openai_client
|
from langflow.base.astra_assistants.util import get_patched_openai_client
|
||||||
from langflow.custom.custom_component.component_with_cache import ComponentWithCache
|
from langflow.custom.custom_component.component_with_cache import ComponentWithCache
|
||||||
from langflow.inputs import MultilineInput, StrInput
|
from langflow.inputs import MultilineInput, StrInput
|
||||||
from langflow.schema.message import Message
|
from langflow.schema.message import Message
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from langflow.components.astra_assistants.util import get_patched_openai_client
|
from langflow.base.astra_assistants.util import get_patched_openai_client
|
||||||
from langflow.custom.custom_component.component_with_cache import ComponentWithCache
|
from langflow.custom.custom_component.component_with_cache import ComponentWithCache
|
||||||
from langflow.schema.message import Message
|
from langflow.schema.message import Message
|
||||||
from langflow.template.field.base import Output
|
from langflow.template.field.base import Output
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ from astra_assistants import patch
|
||||||
from openai import OpenAI
|
from openai import OpenAI
|
||||||
from openai.lib.streaming import AssistantEventHandler
|
from openai.lib.streaming import AssistantEventHandler
|
||||||
|
|
||||||
from langflow.components.astra_assistants.util import get_patched_openai_client
|
from langflow.base.astra_assistants.util import get_patched_openai_client
|
||||||
from langflow.custom.custom_component.component_with_cache import ComponentWithCache
|
from langflow.custom.custom_component.component_with_cache import ComponentWithCache
|
||||||
from langflow.inputs import MultilineInput
|
from langflow.inputs import MultilineInput
|
||||||
from langflow.schema import dotdict
|
from langflow.schema import dotdict
|
||||||
|
|
@ -12,10 +12,6 @@ from langflow.schema.message import Message
|
||||||
from langflow.template import Output
|
from langflow.template import Output
|
||||||
|
|
||||||
|
|
||||||
class AssistantsRunError(Exception):
|
|
||||||
"""Error running assistant"""
|
|
||||||
|
|
||||||
|
|
||||||
class AssistantsRun(ComponentWithCache):
|
class AssistantsRun(ComponentWithCache):
|
||||||
display_name = "Run Assistant"
|
display_name = "Run Assistant"
|
||||||
description = "Executes an Assistant Run against a thread"
|
description = "Executes an Assistant Run against a thread"
|
||||||
|
|
@ -101,3 +97,7 @@ class AssistantsRun(ComponentWithCache):
|
||||||
print(e)
|
print(e)
|
||||||
msg = f"Error running assistant: {e}"
|
msg = f"Error running assistant: {e}"
|
||||||
raise AssistantsRunError(msg) from e
|
raise AssistantsRunError(msg) from e
|
||||||
|
|
||||||
|
|
||||||
|
class AssistantsRunError(Exception):
|
||||||
|
"""AssistantsRun error"""
|
||||||
|
|
|
||||||
|
|
@ -6,10 +6,6 @@ from langflow.io import BoolInput, DictInput, DropdownInput, IntInput, Output, S
|
||||||
from langflow.schema import Data
|
from langflow.schema import Data
|
||||||
|
|
||||||
|
|
||||||
class SpiderToolError(Exception):
|
|
||||||
"""SpiderTool error"""
|
|
||||||
|
|
||||||
|
|
||||||
class SpiderTool(Component):
|
class SpiderTool(Component):
|
||||||
display_name: str = "Spider Web Crawler & Scraper"
|
display_name: str = "Spider Web Crawler & Scraper"
|
||||||
description: str = "Spider API for web crawling and scraping."
|
description: str = "Spider API for web crawling and scraping."
|
||||||
|
|
@ -130,3 +126,7 @@ class SpiderTool(Component):
|
||||||
else:
|
else:
|
||||||
records.append(Data(data={"content": record["content"], "url": record["url"]}))
|
records.append(Data(data={"content": record["content"], "url": record["url"]}))
|
||||||
return records
|
return records
|
||||||
|
|
||||||
|
|
||||||
|
class SpiderToolError(Exception):
|
||||||
|
"""SpiderTool error"""
|
||||||
|
|
|
||||||
|
|
@ -1,36 +1,51 @@
|
||||||
from langchain_community.agent_toolkits.base import BaseToolkit
|
from langchain_core.tools import tool
|
||||||
from langchain_core.tools import Tool, tool
|
|
||||||
from metaphor_python import Metaphor
|
from metaphor_python import Metaphor
|
||||||
|
|
||||||
from langflow.custom import CustomComponent
|
from langflow.custom import Component
|
||||||
|
from langflow.field_typing import Tool
|
||||||
|
from langflow.io import BoolInput, IntInput, Output, SecretStrInput
|
||||||
|
|
||||||
|
|
||||||
class MetaphorToolkit(CustomComponent):
|
class MetaphorToolkit(Component):
|
||||||
display_name: str = "Metaphor"
|
display_name = "Metaphor"
|
||||||
description: str = "Metaphor Toolkit"
|
description = "Metaphor Toolkit for search and content retrieval"
|
||||||
documentation = "https://python.langchain.com/docs/integrations/tools/metaphor_search"
|
documentation = "https://python.langchain.com/docs/integrations/tools/metaphor_search"
|
||||||
beta: bool = True
|
beta = True
|
||||||
name = "Metaphor"
|
|
||||||
# api key should be password = True
|
|
||||||
field_config = {
|
|
||||||
"metaphor_api_key": {"display_name": "Metaphor API Key", "password": True},
|
|
||||||
"code": {"advanced": True},
|
|
||||||
}
|
|
||||||
|
|
||||||
def build(
|
inputs = [
|
||||||
self,
|
SecretStrInput(
|
||||||
metaphor_api_key: str,
|
name="metaphor_api_key",
|
||||||
use_autoprompt: bool = True,
|
display_name="Metaphor API Key",
|
||||||
search_num_results: int = 5,
|
password=True,
|
||||||
similar_num_results: int = 5,
|
),
|
||||||
) -> Tool | BaseToolkit:
|
BoolInput(
|
||||||
# If documents, then we need to create a Vectara instance using .from_documents
|
name="use_autoprompt",
|
||||||
client = Metaphor(api_key=metaphor_api_key)
|
display_name="Use Autoprompt",
|
||||||
|
value=True,
|
||||||
|
),
|
||||||
|
IntInput(
|
||||||
|
name="search_num_results",
|
||||||
|
display_name="Search Number of Results",
|
||||||
|
value=5,
|
||||||
|
),
|
||||||
|
IntInput(
|
||||||
|
name="similar_num_results",
|
||||||
|
display_name="Similar Number of Results",
|
||||||
|
value=5,
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
outputs = [
|
||||||
|
Output(name="tools", display_name="Tools", method="build_toolkit"),
|
||||||
|
]
|
||||||
|
|
||||||
|
def build_toolkit(self) -> Tool:
|
||||||
|
client = Metaphor(api_key=self.metaphor_api_key)
|
||||||
|
|
||||||
@tool
|
@tool
|
||||||
def search(query: str):
|
def search(query: str):
|
||||||
"""Call search engine with a query."""
|
"""Call search engine with a query."""
|
||||||
return client.search(query, use_autoprompt=use_autoprompt, num_results=search_num_results)
|
return client.search(query, use_autoprompt=self.use_autoprompt, num_results=self.search_num_results)
|
||||||
|
|
||||||
@tool
|
@tool
|
||||||
def get_contents(ids: list[str]):
|
def get_contents(ids: list[str]):
|
||||||
|
|
@ -46,6 +61,6 @@ class MetaphorToolkit(CustomComponent):
|
||||||
|
|
||||||
The url passed in should be a URL returned from `search`
|
The url passed in should be a URL returned from `search`
|
||||||
"""
|
"""
|
||||||
return client.find_similar(url, num_results=similar_num_results)
|
return client.find_similar(url, num_results=self.similar_num_results)
|
||||||
|
|
||||||
return [search, get_contents, find_similar]
|
return [search, get_contents, find_similar]
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ from typing import TYPE_CHECKING, Any, ClassVar, get_type_hints
|
||||||
|
|
||||||
import nanoid
|
import nanoid
|
||||||
import yaml
|
import yaml
|
||||||
from loguru import logger
|
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
from langflow.base.tools.constants import TOOL_OUTPUT_NAME
|
from langflow.base.tools.constants import TOOL_OUTPUT_NAME
|
||||||
|
|
@ -340,7 +339,6 @@ class Component(CustomComponent):
|
||||||
source_code = inspect.getsource(method)
|
source_code = inspect.getsource(method)
|
||||||
ast_tree = ast.parse(dedent(source_code))
|
ast_tree = ast.parse(dedent(source_code))
|
||||||
except Exception: # noqa: BLE001
|
except Exception: # noqa: BLE001
|
||||||
logger.opt(exception=True).debug(f"Could not get source code for method {method}")
|
|
||||||
source_code = self._code
|
source_code = self._code
|
||||||
ast_tree = ast.parse(dedent(source_code))
|
ast_tree = ast.parse(dedent(source_code))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ class DirectoryReader:
|
||||||
component_tuple = (*build_component(component), component)
|
component_tuple = (*build_component(component), component)
|
||||||
components.append(component_tuple)
|
components.append(component_tuple)
|
||||||
except Exception: # noqa: BLE001
|
except Exception: # noqa: BLE001
|
||||||
logger.opt(exception=True).debug(f"Error while loading component {component['name']}")
|
logger.debug(f"Error while loading component {component['name']} from {component['file']}")
|
||||||
continue
|
continue
|
||||||
items.append({"name": menu["name"], "path": menu["path"], "components": components})
|
items.append({"name": menu["name"], "path": menu["path"], "components": components})
|
||||||
filtered = [menu for menu in items if menu["components"]]
|
filtered = [menu for menu in items if menu["components"]]
|
||||||
|
|
|
||||||
|
|
@ -370,9 +370,12 @@ class Vertex:
|
||||||
val = field.get("value")
|
val = field.get("value")
|
||||||
if field.get("type") == "code":
|
if field.get("type") == "code":
|
||||||
try:
|
try:
|
||||||
params[field_name] = ast.literal_eval(val) if val else None
|
if field_name == "code":
|
||||||
|
params[field_name] = val
|
||||||
|
else:
|
||||||
|
params[field_name] = ast.literal_eval(val) if val else None
|
||||||
except Exception: # noqa: BLE001
|
except Exception: # noqa: BLE001
|
||||||
logger.opt(exception=True).debug(f"Error evaluating code for {field_name}")
|
logger.debug(f"Error evaluating code for {field_name}")
|
||||||
params[field_name] = val
|
params[field_name] = val
|
||||||
elif field.get("type") in ["dict", "NestedDict"]:
|
elif field.get("type") in ["dict", "NestedDict"]:
|
||||||
# When dict comes from the frontend it comes as a
|
# When dict comes from the frontend it comes as a
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -328,5 +328,5 @@ def extract_class_name(code):
|
||||||
for node in module.body:
|
for node in module.body:
|
||||||
if isinstance(node, ast.ClassDef):
|
if isinstance(node, ast.ClassDef):
|
||||||
return node.name
|
return node.name
|
||||||
msg = "No class definition found in the code string"
|
msg = f"No class definition found in the code string. Code snippet: {code[:100]}"
|
||||||
raise ValueError(msg)
|
raise ValueError(msg)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue