Verwenden von Mitgliedsfunktionen einer Klasse als LangGraph-ToolsPython

Python-Programme
Anonymous
 Verwenden von Mitgliedsfunktionen einer Klasse als LangGraph-Tools

Post by Anonymous »

Ich schreibe einen Agenten unter Verwendung der LangChain- und LangGraph-Bibliotheken. Ich möchte, dass mein Agent mit Dateien interagieren kann, aber nur innerhalb des lokalen Verzeichnisses. Deshalb schreibe ich eine Familie von Tools, die eigentlich Mitgliedsfunktionen einer Klasseninstanz zum Speichern des Speicherorts des lokalen Verzeichnisses sind (das später um Tracing-/Rollback-Funktionen erweitert werden kann). Die Struktur ist wie folgt:

Code: Select all

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()
usw.
Ich übergebe die Liste dann an eine langchain.agents.create_agent-Funktion, um die Fähigkeiten dieses einfachen Agenten zu testen:

Code: Select all

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))
Aber wenn ich den Agenten mit einer Abfrage aufrufe, die ihn auffordert, ein solches Tool zu verwenden, erhalte ich die Fehlermeldung:

Code: Select all

TypeError: StructuredTool._run() got multiple values for argument 'self'
Ich hätte gerne eine Familie von Tools, die sich alle auf die Daten innerhalb eines Objekts beziehen. Wie soll dies erreicht werden?
Hier ist die vollständige Rückverfolgung eines Agentenanrufs mit Tool-Aufruf:

Code: Select all

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'

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post