Использование функций-членов класса в качестве инструментов LangGraphPython

Программы на Python
Ответить
Anonymous
 Использование функций-членов класса в качестве инструментов LangGraph

Сообщение 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'


Подробнее здесь: https://stackoverflow.com/questions/798 ... raph-tools
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»