Я пишу агент, используя библиотеки LangChain и LangGraph. Я хочу, чтобы мой агент мог взаимодействовать с файлами, но только внутри локального каталога, поэтому я пишу семейство инструментов, которые на самом деле являются функциями-членами экземпляра класса для хранения местоположения локального каталога (который позже можно расширить, чтобы иметь функции отслеживания/отката). Структура такая:
class FileInterface:
def __init__(self):
self.localdir = Path.cwd() # memorize local directory
def get_tools(self):
return [self.read_file,...]
@tool
def read_file(self, path:str) -> str:
"""tool for reading file at path"""
if ... path is inside self.localdir ...:
return path.read()
и т. д.
Затем я передаю список функции langchain.agents.create_agent для проверки возможностей этого простого агента:
file_interface = FileInterface()
agent = create_agent(
model=init_model(...),
state_schema=MyState,
tools=file_interface.get_tools(),
system_prompt="You are a helpful agent [...]",
checkpointer=InMemorySaver()
)
print(agent.invoke({"messages":[{"role":"human","content":"tell me the contents of file example.txt"}]},context=context))
Но когда я вызываю агент с запросом, который предлагает ему использовать один такой инструмент, я получаю ошибку:
TypeError: StructuredTool._run() got multiple values for argument 'self'
Мне хотелось бы иметь семейство инструментов, которые бы обращались к данным внутри объекта. Каков предполагаемый способ добиться этого?
Вот полная трассировка вызова агента с вызовом инструмента:
Traceback (most recent call last):
File "/home/ubuntu/dev/elster/.venv/bin/elster", line 10, in
sys.exit(main())
~~~~^^
File "/home/ubuntu/dev/elster/src/elster/main.py", line 49, in main
resp = agent.invoke(args.command,args.request)
File "/home/ubuntu/dev/elster/src/elster/agent.py", line 61, in invoke
return self.agent.invoke(
~~~~~~~~~~~~~~~~~^
{"messages":[{"role":"human","content":request}]},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
config=CONFIG
^^^^^^^^^^^^^
)
^
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langgraph/pregel/main.py", line 3094, in invoke
for chunk in self.stream(
~~~~~~~~~~~^
input,
^^^^^^
......
**kwargs,
^^^^^^^^^
):
^
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langgraph/pregel/main.py", line 2679, in stream
for _ in runner.tick(
~~~~~~~~~~~^
[t for t in loop.tasks.values() if not t.writes],
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
......
schedule_task=loop.accept_push,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
):
^
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langgraph/pregel/_runner.py", line 167, in tick
run_with_retry(
~~~~~~~~~~~~~~^
t,
^^
......
},
^^
)
^
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langgraph/pregel/_retry.py", line 42, in run_with_retry
return task.proc.invoke(task.input, config)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langgraph/_internal/_runnable.py", line 656, in invoke
input = context.run(step.invoke, input, config, **kwargs)
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langgraph/_internal/_runnable.py", line 400, in invoke
ret = self.func(*args, **kwargs)
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain/tools/tool_node.py", line 702, in _func
outputs = list(executor.map(self._run_one, tool_calls, input_types, tool_runtimes))
File "/home/ubuntu/.local/share/uv/python/cpython-3.13.9-linux-x86_64-gnu/lib/python3.13/concurrent/futures/_base.py", line 619, in result_iterator
yield _result_or_cancel(fs.pop())
~~~~~~~~~~~~~~~~~^^^^^^^^^^
File "/home/ubuntu/.local/share/uv/python/cpython-3.13.9-linux-x86_64-gnu/lib/python3.13/concurrent/futures/_base.py", line 317, in _result_or_cancel
return fut.result(timeout)
~~~~~~~~~~^^^^^^^^^
File "/home/ubuntu/.local/share/uv/python/cpython-3.13.9-linux-x86_64-gnu/lib/python3.13/concurrent/futures/_base.py", line 449, in result
return self.__get_result()
~~~~~~~~~~~~~~~~~^^
File "/home/ubuntu/.local/share/uv/python/cpython-3.13.9-linux-x86_64-gnu/lib/python3.13/concurrent/futures/_base.py", line 401, in __get_result
raise self._exception
File "/home/ubuntu/.local/share/uv/python/cpython-3.13.9-linux-x86_64-gnu/lib/python3.13/concurrent/futures/thread.py", line 59, in run
result = self.fn(*self.args, **self.kwargs)
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain_core/runnables/config.py", line 546, in _wrapped_fn
return contexts.pop().run(fn, *args)
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain/tools/tool_node.py", line 911, in _run_one
return self._execute_tool_sync(tool_request, input_type, config)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain/tools/tool_node.py", line 860, in _execute_tool_sync
content = _handle_tool_error(e, flag=self._handle_tool_errors)
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain/tools/tool_node.py", line 389, in _handle_tool_error
content = flag(e) # type: ignore [assignment, call-arg]
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain/tools/tool_node.py", line 352, in _default_handle_tool_errors
raise e
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain/tools/tool_node.py", line 815, in _execute_tool_sync
response = tool.invoke(call_args, config)
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain_core/tools/base.py", line 591, in invoke
return self.run(tool_input, **kwargs)
~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain_core/tools/base.py", line 856, in run
raise error_to_raise
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain_core/tools/base.py", line 825, in run
response = context.run(self._run, *tool_args, **tool_kwargs)
TypeError: StructuredTool._run() got multiple values for argument 'self'
During task with name 'tools' and id 'da9f60b1-3238-488d-27f9-b25e894f60b0'
Подробнее здесь: https://stackoverflow.com/questions/798 ... raph-tools
Использование функций-членов класса в качестве инструментов LangGraph ⇐ Python
Программы на Python
1762164175
Anonymous
Я пишу агент, используя библиотеки LangChain и LangGraph. Я хочу, чтобы мой агент мог взаимодействовать с файлами, но только внутри локального каталога, поэтому я пишу семейство инструментов, которые на самом деле являются функциями-членами экземпляра класса для хранения местоположения локального каталога (который позже можно расширить, чтобы иметь функции отслеживания/отката). Структура такая:
class FileInterface:
def __init__(self):
self.localdir = Path.cwd() # memorize local directory
def get_tools(self):
return [self.read_file,...]
@tool
def read_file(self, path:str) -> str:
"""tool for reading file at path"""
if ... path is inside self.localdir ...:
return path.read()
и т. д.
Затем я передаю список функции langchain.agents.create_agent для проверки возможностей этого простого агента:
file_interface = FileInterface()
agent = create_agent(
model=init_model(...),
state_schema=MyState,
tools=file_interface.get_tools(),
system_prompt="You are a helpful agent [...]",
checkpointer=InMemorySaver()
)
print(agent.invoke({"messages":[{"role":"human","content":"tell me the contents of file example.txt"}]},context=context))
Но когда я вызываю агент с запросом, который предлагает ему использовать один такой инструмент, я получаю ошибку:
TypeError: StructuredTool._run() got multiple values for argument 'self'
Мне хотелось бы иметь семейство инструментов, которые бы обращались к данным внутри объекта. Каков предполагаемый способ добиться этого?
Вот полная трассировка вызова агента с вызовом инструмента:
Traceback (most recent call last):
File "/home/ubuntu/dev/elster/.venv/bin/elster", line 10, in
sys.exit(main())
~~~~^^
File "/home/ubuntu/dev/elster/src/elster/main.py", line 49, in main
resp = agent.invoke(args.command,args.request)
File "/home/ubuntu/dev/elster/src/elster/agent.py", line 61, in invoke
return self.agent.invoke(
~~~~~~~~~~~~~~~~~^
{"messages":[{"role":"human","content":request}]},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
config=CONFIG
^^^^^^^^^^^^^
)
^
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langgraph/pregel/main.py", line 3094, in invoke
for chunk in self.stream(
~~~~~~~~~~~^
input,
^^^^^^
......
**kwargs,
^^^^^^^^^
):
^
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langgraph/pregel/main.py", line 2679, in stream
for _ in runner.tick(
~~~~~~~~~~~^
[t for t in loop.tasks.values() if not t.writes],
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
......
schedule_task=loop.accept_push,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
):
^
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langgraph/pregel/_runner.py", line 167, in tick
run_with_retry(
~~~~~~~~~~~~~~^
t,
^^
......
},
^^
)
^
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langgraph/pregel/_retry.py", line 42, in run_with_retry
return task.proc.invoke(task.input, config)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langgraph/_internal/_runnable.py", line 656, in invoke
input = context.run(step.invoke, input, config, **kwargs)
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langgraph/_internal/_runnable.py", line 400, in invoke
ret = self.func(*args, **kwargs)
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain/tools/tool_node.py", line 702, in _func
outputs = list(executor.map(self._run_one, tool_calls, input_types, tool_runtimes))
File "/home/ubuntu/.local/share/uv/python/cpython-3.13.9-linux-x86_64-gnu/lib/python3.13/concurrent/futures/_base.py", line 619, in result_iterator
yield _result_or_cancel(fs.pop())
~~~~~~~~~~~~~~~~~^^^^^^^^^^
File "/home/ubuntu/.local/share/uv/python/cpython-3.13.9-linux-x86_64-gnu/lib/python3.13/concurrent/futures/_base.py", line 317, in _result_or_cancel
return fut.result(timeout)
~~~~~~~~~~^^^^^^^^^
File "/home/ubuntu/.local/share/uv/python/cpython-3.13.9-linux-x86_64-gnu/lib/python3.13/concurrent/futures/_base.py", line 449, in result
return self.__get_result()
~~~~~~~~~~~~~~~~~^^
File "/home/ubuntu/.local/share/uv/python/cpython-3.13.9-linux-x86_64-gnu/lib/python3.13/concurrent/futures/_base.py", line 401, in __get_result
raise self._exception
File "/home/ubuntu/.local/share/uv/python/cpython-3.13.9-linux-x86_64-gnu/lib/python3.13/concurrent/futures/thread.py", line 59, in run
result = self.fn(*self.args, **self.kwargs)
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain_core/runnables/config.py", line 546, in _wrapped_fn
return contexts.pop().run(fn, *args)
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain/tools/tool_node.py", line 911, in _run_one
return self._execute_tool_sync(tool_request, input_type, config)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain/tools/tool_node.py", line 860, in _execute_tool_sync
content = _handle_tool_error(e, flag=self._handle_tool_errors)
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain/tools/tool_node.py", line 389, in _handle_tool_error
content = flag(e) # type: ignore [assignment, call-arg]
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain/tools/tool_node.py", line 352, in _default_handle_tool_errors
raise e
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain/tools/tool_node.py", line 815, in _execute_tool_sync
response = tool.invoke(call_args, config)
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain_core/tools/base.py", line 591, in invoke
return self.run(tool_input, **kwargs)
~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain_core/tools/base.py", line 856, in run
raise error_to_raise
File "/home/ubuntu/dev/elster/.venv/lib/python3.13/site-packages/langchain_core/tools/base.py", line 825, in run
response = context.run(self._run, *tool_args, **tool_kwargs)
TypeError: StructuredTool._run() got multiple values for argument 'self'
During task with name 'tools' and id 'da9f60b1-3238-488d-27f9-b25e894f60b0'
Подробнее здесь: [url]https://stackoverflow.com/questions/79807713/using-member-functions-of-a-class-as-langgraph-tools[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия