langgraph-agent-toolkit 0.5.0__tar.gz → 0.7.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/CHANGELOG.md +27 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/PKG-INFO +7 -7
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/usage.rst +1 -1
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/agent_executor.py +23 -16
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/interrupt_agent/agent.py +16 -5
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/react_so/agent.py +5 -2
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/components/creators/create_react_agent.py +6 -2
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/components/utils.py +1 -1
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/client/client.py +14 -13
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/models/factory.py +1 -1
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/helper/constants.py +2 -2
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/helper/utils.py +16 -2
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/run_agent.py +1 -1
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/run_service.py +1 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/schema/__init__.py +2 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/schema/schema.py +22 -5
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/service/routes.py +1 -3
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/service/utils.py +1 -1
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/streamlit_app.py +2 -2
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/pyproject.toml +7 -7
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/python/06-test-custom-chat-prompt-template.py +59 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/agents/test_agent_executor.py +48 -20
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/app/test_streamlit_app.py +2 -2
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/client/test_client.py +16 -16
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/integration/test_docker_e2e.py +2 -1
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/service/test_auth.py +3 -3
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/service/test_service.py +24 -16
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/service/test_service_e2e.py +2 -1
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/uv.lock +80 -80
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.coveragerc +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.dockerignore +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.env.example +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/RELEASE_TEMPLATE/release-template.md +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/codecov.yml +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/dependabot.yml +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/scripts/tag_from_pyproject.sh +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/workflows/deploy.yml +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/workflows/release.yml +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/workflows/sphinx.yml +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/workflows/test.yml +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.gitignore +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.pre-commit-config.yaml +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.project-root +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/CONTRIBUTING.md +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/LICENSE +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/Makefile +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/README.md +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/configs/clickhouse/.clickhouse.env.example +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/configs/langfuse/.langfuse.env.example +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/configs/litellm/.litellm.env.example +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/configs/litellm/config.example.yaml +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/configs/minio/.minio.env.example +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/configs/postgres/.postgres.env.example +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/configs/redis/.redis.env.example +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docker/app/Dockerfile +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docker/service/Dockerfile +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docker-compose.yaml +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/.gitignore +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/Makefile +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/_static/custom.css +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/_templates/class.rst +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/_templates/layout.html +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/_templates/module.rst +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/conf.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/contributing.rst +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/environment_setup.rst +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/index.rst +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/installation.rst +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/make.bat +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/media/agent_architecture.excalidraw +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/media/agent_architecture.png +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/media/agent_diagram.png +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/media/logo.svg +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph.json +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/agent.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/bg_task_agent/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/bg_task_agent/agent.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/bg_task_agent/task.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/bg_task_agent/utils.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/chatbot/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/chatbot/agent.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/command_agent/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/command_agent/agent.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/interrupt_agent/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/knowledge_base_agent/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/knowledge_base_agent/agent.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/react/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/react/agent.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/react_so/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/supervisor_agent/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/supervisor_agent/agent.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/components/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/components/creators/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/components/tools.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/client/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/memory/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/memory/base.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/memory/factory.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/memory/postgres.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/memory/sqlite.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/memory/types.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/models/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/models/chat_openai.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/models/fake.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/observability/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/observability/base.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/observability/empty.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/observability/factory.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/observability/langfuse.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/observability/langsmith.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/observability/types.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/prompts/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/prompts/chat_prompt_template.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/settings.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/helper/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/helper/logging.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/helper/types.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/run_client.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/schema/models.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/schema/task_data.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/service/__init__.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/service/exception_handlers.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/service/factory.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/service/handler.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/service/middleware.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/service/types.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/postgres-init/create_databases.sql +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/python/01-invoke-proxy.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/python/02-test-local-pm.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/python/03-test-langfuse-pm.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/python/04-test-langsmith-pm.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/python/05-test-prompt-types.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/python/07-test-get-chat-history.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/python/08-test-update-chat-history.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/python/09-test-clear-chat-history.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/agents/test_service_streaming.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/app/conftest.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/client/conftest.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/conftest.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/core/test_llm.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/core/test_memory.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/core/test_observability.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/core/test_prompts.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/core/test_settings.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/service/conftest.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/service/test_factory.py +0 -0
- {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/service/test_utils.py +0 -0
|
@@ -6,6 +6,33 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
|
6
6
|
and this project adheres to
|
|
7
7
|
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
8
8
|
|
|
9
|
+
## [0.7.0]
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- React Agent with SO
|
|
14
|
+
|
|
15
|
+
### Updated
|
|
16
|
+
|
|
17
|
+
- Dependencies
|
|
18
|
+
- Name of default configurable parameters
|
|
19
|
+
|
|
20
|
+
## [0.6.0]
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
|
|
24
|
+
- React Agent with SO
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
- Complex input
|
|
29
|
+
|
|
30
|
+
### Updated
|
|
31
|
+
|
|
32
|
+
- Dependencies
|
|
33
|
+
- Error handling
|
|
34
|
+
- Tests
|
|
35
|
+
|
|
9
36
|
## [0.5.0]
|
|
10
37
|
|
|
11
38
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: langgraph-agent-toolkit
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
4
4
|
Summary: Full toolkit for running an AI agent service built with LangGraph, FastAPI and Streamlit
|
|
5
5
|
Project-URL: documentation, https://kryvokhyzha.github.io/langgraph-agent-toolkit
|
|
6
6
|
Project-URL: repository, https://github.com/kryvokhyzha/langgraph-agent-toolkit
|
|
@@ -27,20 +27,20 @@ Requires-Dist: fire~=0.7.0
|
|
|
27
27
|
Requires-Dist: grpcio>=1.68.0
|
|
28
28
|
Requires-Dist: httpx~=0.28.1
|
|
29
29
|
Requires-Dist: jinja2~=3.1.6
|
|
30
|
-
Requires-Dist: jiter~=0.
|
|
30
|
+
Requires-Dist: jiter~=0.10.0
|
|
31
31
|
Requires-Dist: joblib>=1.4.2
|
|
32
|
-
Requires-Dist: langchain-community~=0.3.
|
|
33
|
-
Requires-Dist: langchain-core~=0.3.
|
|
32
|
+
Requires-Dist: langchain-community~=0.3.24
|
|
33
|
+
Requires-Dist: langchain-core~=0.3.60
|
|
34
34
|
Requires-Dist: langgraph-checkpoint-postgres~=2.0.21
|
|
35
35
|
Requires-Dist: langgraph-checkpoint-sqlite~=2.0.7
|
|
36
|
-
Requires-Dist: langgraph-cli[inmem]~=0.2.
|
|
36
|
+
Requires-Dist: langgraph-cli[inmem]~=0.2.10
|
|
37
37
|
Requires-Dist: langgraph-supervisor~=0.0.21
|
|
38
|
-
Requires-Dist: langgraph~=0.4.
|
|
38
|
+
Requires-Dist: langgraph~=0.4.5
|
|
39
39
|
Requires-Dist: loguru~=0.7.3
|
|
40
40
|
Requires-Dist: multidict>6.3.2
|
|
41
41
|
Requires-Dist: numpy~=1.26.4; python_version <= '3.12'
|
|
42
42
|
Requires-Dist: numpy~=2.2.3; python_version >= '3.13'
|
|
43
|
-
Requires-Dist: onnxruntime~=1.
|
|
43
|
+
Requires-Dist: onnxruntime~=1.22.0
|
|
44
44
|
Requires-Dist: pandas~=2.2.3
|
|
45
45
|
Requires-Dist: psycopg[binary,pool]~=3.2.4
|
|
46
46
|
Requires-Dist: pyarrow>=19.0.1
|
|
@@ -76,7 +76,7 @@ The toolkit includes ``AgentClient`` for interacting with the agent service:
|
|
|
76
76
|
from client import AgentClient
|
|
77
77
|
client = AgentClient()
|
|
78
78
|
|
|
79
|
-
response = client.invoke("Tell me a brief joke?")
|
|
79
|
+
response = client.invoke({"message": "Tell me a brief joke?"})
|
|
80
80
|
response.pretty_print()
|
|
81
81
|
# ================================== Ai Message ==================================
|
|
82
82
|
#
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import functools
|
|
3
3
|
import importlib
|
|
4
|
-
import json
|
|
5
4
|
import os
|
|
5
|
+
import sys
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
from typing import Any, AsyncGenerator, Callable, Dict, List, Optional, Tuple, TypeVar
|
|
8
8
|
from uuid import UUID, uuid4
|
|
@@ -143,9 +143,9 @@ class AgentExecutor:
|
|
|
143
143
|
def _handle_error(e: Exception):
|
|
144
144
|
"""Handle and re-raise errors with logging."""
|
|
145
145
|
if isinstance(e, GraphRecursionError):
|
|
146
|
-
logger.error(f"GraphRecursionError occurred: {e}")
|
|
146
|
+
logger.opt(exception=sys.exc_info()).error(f"GraphRecursionError occurred: {e}")
|
|
147
147
|
else:
|
|
148
|
-
logger.error(f"Error during agent execution: {e}")
|
|
148
|
+
logger.opt(exception=sys.exc_info()).error(f"Error during agent execution: {e}")
|
|
149
149
|
|
|
150
150
|
raise e
|
|
151
151
|
|
|
@@ -171,7 +171,7 @@ class AgentExecutor:
|
|
|
171
171
|
async def _setup_agent_execution(
|
|
172
172
|
self,
|
|
173
173
|
agent_id: str,
|
|
174
|
-
|
|
174
|
+
input: Dict[str, Any],
|
|
175
175
|
thread_id: Optional[str] = None,
|
|
176
176
|
user_id: Optional[str] = None,
|
|
177
177
|
model_name: Optional[str] = None,
|
|
@@ -184,7 +184,7 @@ class AgentExecutor:
|
|
|
184
184
|
|
|
185
185
|
Args:
|
|
186
186
|
agent_id: ID of the agent to invoke
|
|
187
|
-
|
|
187
|
+
input: User message to send to the agent
|
|
188
188
|
thread_id: Optional thread ID for conversation history
|
|
189
189
|
user_id: Optional user ID for the agent
|
|
190
190
|
model_name: Optional model name to override the default
|
|
@@ -250,12 +250,14 @@ class AgentExecutor:
|
|
|
250
250
|
state = await agent_graph.aget_state(config=config)
|
|
251
251
|
interrupted_tasks = [task for task in state.tasks if hasattr(task, "interrupts") and task.interrupts]
|
|
252
252
|
|
|
253
|
+
_input = input.model_dump()
|
|
253
254
|
input_data: Command | dict[str, Any]
|
|
254
255
|
if interrupted_tasks:
|
|
255
256
|
# User input is a response to resume agent execution from interrupt
|
|
256
|
-
input_data = Command(resume=
|
|
257
|
+
input_data = Command(resume=_input)
|
|
257
258
|
else:
|
|
258
|
-
|
|
259
|
+
message = _input.pop("message", "")
|
|
260
|
+
input_data = {"messages": [HumanMessage(content=message)], **_input}
|
|
259
261
|
|
|
260
262
|
return agent, input_data, config, run_id
|
|
261
263
|
|
|
@@ -263,7 +265,7 @@ class AgentExecutor:
|
|
|
263
265
|
async def invoke(
|
|
264
266
|
self,
|
|
265
267
|
agent_id: str,
|
|
266
|
-
|
|
268
|
+
input: Dict[str, Any],
|
|
267
269
|
thread_id: Optional[str] = None,
|
|
268
270
|
user_id: Optional[str] = None,
|
|
269
271
|
model_name: Optional[str] = None,
|
|
@@ -276,7 +278,7 @@ class AgentExecutor:
|
|
|
276
278
|
|
|
277
279
|
Args:
|
|
278
280
|
agent_id: ID of the agent to invoke
|
|
279
|
-
|
|
281
|
+
input: User message to send to the agent
|
|
280
282
|
thread_id: Optional thread ID for conversation history
|
|
281
283
|
user_id: Optional user ID for the agent
|
|
282
284
|
model_name: Optional model name to override the default
|
|
@@ -291,12 +293,12 @@ class AgentExecutor:
|
|
|
291
293
|
"""
|
|
292
294
|
agent, input_data, config, run_id = await self._setup_agent_execution(
|
|
293
295
|
agent_id=agent_id,
|
|
294
|
-
|
|
296
|
+
input=input,
|
|
295
297
|
thread_id=thread_id,
|
|
296
298
|
user_id=user_id,
|
|
297
299
|
model_name=model_name,
|
|
298
300
|
model_provider=model_provider,
|
|
299
|
-
model_config_key=model_config_key,
|
|
301
|
+
model_config_key=model_config_key,
|
|
300
302
|
agent_config=agent_config,
|
|
301
303
|
recursion_limit=recursion_limit,
|
|
302
304
|
)
|
|
@@ -309,9 +311,14 @@ class AgentExecutor:
|
|
|
309
311
|
)
|
|
310
312
|
|
|
311
313
|
response_type, response = response_events[-1]
|
|
314
|
+
|
|
312
315
|
if response_type == "values":
|
|
316
|
+
generated_message = response.get("structured_response")
|
|
317
|
+
if not generated_message:
|
|
318
|
+
generated_message = response["messages"][-1]
|
|
319
|
+
|
|
313
320
|
# Normal response, the agent completed successfully
|
|
314
|
-
output = langchain_to_chat_message(
|
|
321
|
+
output = langchain_to_chat_message(generated_message)
|
|
315
322
|
elif response_type == "updates" and "__interrupt__" in response:
|
|
316
323
|
# The last thing to occur was an interrupt
|
|
317
324
|
# Return the value of the first interrupt as an AIMessage
|
|
@@ -326,7 +333,7 @@ class AgentExecutor:
|
|
|
326
333
|
async def stream(
|
|
327
334
|
self,
|
|
328
335
|
agent_id: str,
|
|
329
|
-
|
|
336
|
+
input: Dict[str, Any],
|
|
330
337
|
thread_id: Optional[str] = None,
|
|
331
338
|
user_id: Optional[str] = None,
|
|
332
339
|
model_name: Optional[str] = None,
|
|
@@ -340,7 +347,7 @@ class AgentExecutor:
|
|
|
340
347
|
|
|
341
348
|
Args:
|
|
342
349
|
agent_id: ID of the agent to invoke
|
|
343
|
-
|
|
350
|
+
input: User message to send to the agent
|
|
344
351
|
thread_id: Optional thread ID for conversation history
|
|
345
352
|
user_id: Optional user ID for the agent
|
|
346
353
|
model_name: Optional model name to override the default
|
|
@@ -356,7 +363,7 @@ class AgentExecutor:
|
|
|
356
363
|
"""
|
|
357
364
|
agent, input_data, config, run_id = await self._setup_agent_execution(
|
|
358
365
|
agent_id=agent_id,
|
|
359
|
-
|
|
366
|
+
input=input,
|
|
360
367
|
thread_id=thread_id,
|
|
361
368
|
user_id=user_id,
|
|
362
369
|
model_name=model_name,
|
|
@@ -445,7 +452,7 @@ class AgentExecutor:
|
|
|
445
452
|
if current_message:
|
|
446
453
|
processed_messages.append(create_ai_message(current_message))
|
|
447
454
|
|
|
448
|
-
for msg in
|
|
455
|
+
for msg in processed_messages:
|
|
449
456
|
try:
|
|
450
457
|
chat_message = langchain_to_chat_message(msg)
|
|
451
458
|
chat_message.run_id = str(run_id)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from datetime import datetime
|
|
2
|
-
from typing import Any
|
|
2
|
+
from typing import Any
|
|
3
3
|
|
|
4
4
|
from langchain.prompts import SystemMessagePromptTemplate
|
|
5
5
|
from langchain_core.language_models.base import LanguageModelInput
|
|
@@ -83,20 +83,31 @@ async def determine_birthdate(state: AgentState, config: RunnableConfig) -> Agen
|
|
|
83
83
|
m = ModelFactory.create(
|
|
84
84
|
model_provider=config["configurable"].get("model_provider", ModelProvider.OPENAI),
|
|
85
85
|
model_name=config["configurable"].get("model_name", settings.OPENAI_MODEL_NAME),
|
|
86
|
+
config_prefix="",
|
|
87
|
+
configurable_fields=(),
|
|
88
|
+
model_parameter_values=(("temperature", 0.0), ("top_p", 0.7), ("streaming", False)),
|
|
86
89
|
openai_api_base=settings.OPENAI_API_BASE_URL,
|
|
87
90
|
openai_api_key=settings.OPENAI_API_KEY,
|
|
88
91
|
)
|
|
89
92
|
model_runnable = wrap_model(
|
|
90
|
-
m.with_structured_output(BirthdateExtraction),
|
|
93
|
+
m.with_structured_output(BirthdateExtraction, strict=True, include_raw=True),
|
|
91
94
|
birthdate_extraction_prompt.format(),
|
|
92
95
|
).with_config(tags=["skip_stream"])
|
|
93
|
-
|
|
96
|
+
raw_response: BirthdateExtraction = await model_runnable.ainvoke(state, config)
|
|
97
|
+
|
|
98
|
+
if raw_response["parsed"] is not None:
|
|
99
|
+
response: BirthdateExtraction = raw_response["parsed"]
|
|
100
|
+
elif raw_response["raw"].tool_calls is not None:
|
|
101
|
+
raw_result = raw_response["raw"].tool_calls[-1]["args"]
|
|
102
|
+
response = BirthdateExtraction(**raw_result)
|
|
103
|
+
else:
|
|
104
|
+
raise ValueError("No valid response from the model")
|
|
94
105
|
|
|
95
106
|
# If no birthdate found, interrupt
|
|
96
107
|
if response.birthdate is None:
|
|
97
108
|
birthdate_input = interrupt(f"{response.reasoning}\nPlease tell me your birthdate?")
|
|
98
109
|
# Re-run extraction with the new input
|
|
99
|
-
state["messages"].append(HumanMessage(birthdate_input))
|
|
110
|
+
state["messages"].append(HumanMessage(birthdate_input["message"]))
|
|
100
111
|
return await determine_birthdate(state, config)
|
|
101
112
|
|
|
102
113
|
# Birthdate found - convert string to datetime
|
|
@@ -107,7 +118,7 @@ async def determine_birthdate(state: AgentState, config: RunnableConfig) -> Agen
|
|
|
107
118
|
birthdate_input = interrupt(
|
|
108
119
|
"I couldn't understand the date format. Please provide your birthdate in YYYY-MM-DD format."
|
|
109
120
|
)
|
|
110
|
-
state["messages"].append(HumanMessage(birthdate_input))
|
|
121
|
+
state["messages"].append(HumanMessage(birthdate_input["message"]))
|
|
111
122
|
return await determine_birthdate(state, config)
|
|
112
123
|
|
|
113
124
|
# Birthdate found
|
|
@@ -15,7 +15,7 @@ from langgraph_agent_toolkit.schema.models import ModelProvider
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class ResponseSchema(BaseModel):
|
|
18
|
-
response:
|
|
18
|
+
response: str = Field(
|
|
19
19
|
description="The response on user query.",
|
|
20
20
|
)
|
|
21
21
|
alternative_response: str = Field(
|
|
@@ -30,6 +30,9 @@ react_agent_so = Agent(
|
|
|
30
30
|
model=ModelFactory.create(
|
|
31
31
|
model_provider=ModelProvider.OPENAI,
|
|
32
32
|
model_name=settings.OPENAI_MODEL_NAME,
|
|
33
|
+
config_prefix="",
|
|
34
|
+
configurable_fields=(),
|
|
35
|
+
model_parameter_values=(("temperature", 0.0), ("top_p", 0.7), ("streaming", False)),
|
|
33
36
|
openai_api_base=settings.OPENAI_API_BASE_URL,
|
|
34
37
|
openai_api_key=settings.OPENAI_API_KEY,
|
|
35
38
|
),
|
|
@@ -40,7 +43,7 @@ react_agent_so = Agent(
|
|
|
40
43
|
"You can also ask clarifying questions to the user. "
|
|
41
44
|
),
|
|
42
45
|
pre_model_hook=pre_model_hook_standard,
|
|
43
|
-
|
|
46
|
+
response_format=ResponseSchema,
|
|
44
47
|
state_schema=AgentStateWithStructuredResponseAndRemainingSteps,
|
|
45
48
|
checkpointer=MemorySaver(),
|
|
46
49
|
immediate_step_threshold=5,
|
|
@@ -319,7 +319,9 @@ def create_react_agent(
|
|
|
319
319
|
messages = [SystemMessage(content=system_prompt)] + list(messages)
|
|
320
320
|
|
|
321
321
|
model_with_structured_output = _get_model(model, config).with_structured_output(
|
|
322
|
-
cast(StructuredResponseSchema, structured_response_schema)
|
|
322
|
+
cast(StructuredResponseSchema, structured_response_schema),
|
|
323
|
+
strict=True,
|
|
324
|
+
# include_raw=True,
|
|
323
325
|
)
|
|
324
326
|
response = model_with_structured_output.invoke(messages, config)
|
|
325
327
|
return {"structured_response": response}
|
|
@@ -332,7 +334,9 @@ def create_react_agent(
|
|
|
332
334
|
messages = [SystemMessage(content=system_prompt)] + list(messages)
|
|
333
335
|
|
|
334
336
|
model_with_structured_output = _get_model(model, config).with_structured_output(
|
|
335
|
-
cast(StructuredResponseSchema, structured_response_schema)
|
|
337
|
+
cast(StructuredResponseSchema, structured_response_schema),
|
|
338
|
+
strict=True,
|
|
339
|
+
# include_raw=True,
|
|
336
340
|
)
|
|
337
341
|
response = await model_with_structured_output.ainvoke(messages, config)
|
|
338
342
|
return {"structured_response": response}
|
|
@@ -20,7 +20,7 @@ class AgentStateWithStructuredResponseAndRemainingSteps(AgentStateWithStructured
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
def pre_model_hook_standard(state: T, config: RunnableConfig):
|
|
23
|
-
_max_messages = config.get("configurable", {}).get("
|
|
23
|
+
_max_messages = config.get("configurable", {}).get("checkpointer_params", {}).get("k", None)
|
|
24
24
|
|
|
25
25
|
updated_messages = trim_messages(
|
|
26
26
|
state["messages"],
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import os
|
|
3
3
|
from collections.abc import AsyncGenerator, Generator
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any, Dict
|
|
5
5
|
|
|
6
6
|
import httpx
|
|
7
7
|
|
|
@@ -18,6 +18,7 @@ from langgraph_agent_toolkit.schema import (
|
|
|
18
18
|
MessageInput,
|
|
19
19
|
ServiceMetadata,
|
|
20
20
|
StreamInput,
|
|
21
|
+
UserComplexInput,
|
|
21
22
|
UserInput,
|
|
22
23
|
)
|
|
23
24
|
|
|
@@ -92,7 +93,7 @@ class AgentClient:
|
|
|
92
93
|
|
|
93
94
|
async def ainvoke(
|
|
94
95
|
self,
|
|
95
|
-
|
|
96
|
+
input: Dict[str, Any],
|
|
96
97
|
model_name: str | None = None,
|
|
97
98
|
model_provider: str | None = None,
|
|
98
99
|
model_config_key: str | None = None,
|
|
@@ -104,7 +105,7 @@ class AgentClient:
|
|
|
104
105
|
"""Invoke the agent asynchronously. Only the final message is returned.
|
|
105
106
|
|
|
106
107
|
Args:
|
|
107
|
-
|
|
108
|
+
input (Dict[str, Any]): The input to send to the agent
|
|
108
109
|
model_name (str, optional): LLM model to use for the agent
|
|
109
110
|
model_provider (str, optional): LLM model provider to use for the agent
|
|
110
111
|
model_config_key (str, optional): Key for predefined model configuration
|
|
@@ -120,7 +121,7 @@ class AgentClient:
|
|
|
120
121
|
if not self.agent:
|
|
121
122
|
raise AgentClientError("No agent selected. Use update_agent() to select an agent.")
|
|
122
123
|
|
|
123
|
-
request = UserInput(
|
|
124
|
+
request = UserInput(input=UserComplexInput(**input))
|
|
124
125
|
if thread_id:
|
|
125
126
|
request.thread_id = thread_id
|
|
126
127
|
if model_name:
|
|
@@ -152,7 +153,7 @@ class AgentClient:
|
|
|
152
153
|
|
|
153
154
|
def invoke(
|
|
154
155
|
self,
|
|
155
|
-
|
|
156
|
+
input: Dict[str, Any],
|
|
156
157
|
model_name: str | None = None,
|
|
157
158
|
model_provider: str | None = None,
|
|
158
159
|
model_config_key: str | None = None,
|
|
@@ -164,7 +165,7 @@ class AgentClient:
|
|
|
164
165
|
"""Invoke the agent synchronously. Only the final message is returned.
|
|
165
166
|
|
|
166
167
|
Args:
|
|
167
|
-
|
|
168
|
+
input (Dict[str, Any]): The input to send to the agent
|
|
168
169
|
model_name (str, optional): LLM model to use for the agent
|
|
169
170
|
model_provider (str, optional): LLM model provider to use for the agent
|
|
170
171
|
model_config_key (str, optional): Key for predefined model configuration
|
|
@@ -180,7 +181,7 @@ class AgentClient:
|
|
|
180
181
|
if not self.agent:
|
|
181
182
|
raise AgentClientError("No agent selected. Use update_agent() to select an agent.")
|
|
182
183
|
|
|
183
|
-
request = UserInput(
|
|
184
|
+
request = UserInput(input=UserComplexInput(**input))
|
|
184
185
|
if thread_id:
|
|
185
186
|
request.thread_id = thread_id
|
|
186
187
|
if model_name:
|
|
@@ -236,7 +237,7 @@ class AgentClient:
|
|
|
236
237
|
|
|
237
238
|
def stream(
|
|
238
239
|
self,
|
|
239
|
-
|
|
240
|
+
input: Dict[str, Any],
|
|
240
241
|
model_name: str | None = None,
|
|
241
242
|
model_provider: str | None = None,
|
|
242
243
|
model_config_key: str | None = None,
|
|
@@ -253,7 +254,7 @@ class AgentClient:
|
|
|
253
254
|
content tokens from streaming models as they are generated.
|
|
254
255
|
|
|
255
256
|
Args:
|
|
256
|
-
|
|
257
|
+
input (Dict[str, Any]): The input to send to the agent
|
|
257
258
|
model_name (str, optional): LLM model to use for the agent
|
|
258
259
|
model_provider (str, optional): LLM model provider to use for the agent
|
|
259
260
|
model_config_key (str, optional): Key for predefined model configuration
|
|
@@ -271,7 +272,7 @@ class AgentClient:
|
|
|
271
272
|
if not self.agent:
|
|
272
273
|
raise AgentClientError("No agent selected. Use update_agent() to select an agent.")
|
|
273
274
|
|
|
274
|
-
request = StreamInput(
|
|
275
|
+
request = StreamInput(input=UserComplexInput(**input), stream_tokens=stream_tokens)
|
|
275
276
|
if thread_id:
|
|
276
277
|
request.thread_id = thread_id
|
|
277
278
|
if model_name:
|
|
@@ -307,7 +308,7 @@ class AgentClient:
|
|
|
307
308
|
|
|
308
309
|
async def astream(
|
|
309
310
|
self,
|
|
310
|
-
|
|
311
|
+
input: Dict[str, Any],
|
|
311
312
|
model_name: str | None = None,
|
|
312
313
|
model_provider: str | None = None,
|
|
313
314
|
model_config_key: str | None = None,
|
|
@@ -324,7 +325,7 @@ class AgentClient:
|
|
|
324
325
|
content tokens from streaming models as they are generated.
|
|
325
326
|
|
|
326
327
|
Args:
|
|
327
|
-
|
|
328
|
+
input (Dict[str, Any]): The input to send to the agent
|
|
328
329
|
model_name (str, optional): LLM model to use for the agent
|
|
329
330
|
model_provider (str, optional): LLM model provider to use for the agent
|
|
330
331
|
model_config_key (str, optional): Key for predefined model configuration
|
|
@@ -342,7 +343,7 @@ class AgentClient:
|
|
|
342
343
|
if not self.agent:
|
|
343
344
|
raise AgentClientError("No agent selected. Use update_agent() to select an agent.")
|
|
344
345
|
|
|
345
|
-
request = StreamInput(
|
|
346
|
+
request = StreamInput(input=UserComplexInput(**input), stream_tokens=stream_tokens)
|
|
346
347
|
if thread_id:
|
|
347
348
|
request.thread_id = thread_id
|
|
348
349
|
if model_name:
|
|
@@ -87,7 +87,7 @@ class ModelFactory:
|
|
|
87
87
|
model_name: Optional[str] = None,
|
|
88
88
|
configurable_fields: Optional[Union[Literal["any"], List[str], Tuple[str, ...]]] = None,
|
|
89
89
|
config_prefix: Optional[str] = None,
|
|
90
|
-
model_parameter_values: Optional[Tuple[Tuple[str, Any], ...]] = None,
|
|
90
|
+
model_parameter_values: Optional[Tuple[Tuple[str, Any], ...]] = None,
|
|
91
91
|
**kwargs: Any,
|
|
92
92
|
) -> ModelT:
|
|
93
93
|
"""Create and return a model instance.
|
|
@@ -17,8 +17,8 @@ def set_default_agent(agent_name):
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
DEFAULT_MAX_MESSAGE_HISTORY_LENGTH = os.getenv("DEFAULT_MAX_MESSAGE_HISTORY_LENGTH", 18)
|
|
20
|
-
DEFAULT_RECURSION_LIMIT = 25
|
|
21
|
-
DEFAULT_CONFIG_PREFIX = "agent"
|
|
20
|
+
DEFAULT_RECURSION_LIMIT = os.getenv("DEFAULT_RECURSION_LIMIT", 25)
|
|
21
|
+
DEFAULT_CONFIG_PREFIX = os.getenv("DEFAULT_CONFIG_PREFIX", "agent")
|
|
22
22
|
DEFAULT_CONFIGURABLE_FIELDS = ("temperature", "max_tokens", "top_p", "streaming")
|
|
23
23
|
DEFAULT_MODEL_PARAMETER_VALUES = dict(
|
|
24
24
|
temperature=0.0,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import inspect
|
|
2
|
+
import json
|
|
2
3
|
|
|
3
4
|
from langchain_core.messages import (
|
|
4
5
|
AIMessage,
|
|
@@ -9,7 +10,7 @@ from langchain_core.messages import (
|
|
|
9
10
|
from langchain_core.messages import (
|
|
10
11
|
ChatMessage as LangchainChatMessage,
|
|
11
12
|
)
|
|
12
|
-
from pydantic import HttpUrl, TypeAdapter
|
|
13
|
+
from pydantic import BaseModel, HttpUrl, TypeAdapter
|
|
13
14
|
|
|
14
15
|
from langgraph_agent_toolkit.schema import ChatMessage
|
|
15
16
|
|
|
@@ -22,7 +23,9 @@ def check_str_is_http(x: str) -> str:
|
|
|
22
23
|
def convert_message_content_to_string(content: str | list[str | dict]) -> str:
|
|
23
24
|
if isinstance(content, str):
|
|
24
25
|
return content
|
|
26
|
+
|
|
25
27
|
text: list[str] = []
|
|
28
|
+
|
|
26
29
|
for content_item in content:
|
|
27
30
|
if isinstance(content_item, str):
|
|
28
31
|
text.append(content_item)
|
|
@@ -32,8 +35,14 @@ def convert_message_content_to_string(content: str | list[str | dict]) -> str:
|
|
|
32
35
|
return "".join(text)
|
|
33
36
|
|
|
34
37
|
|
|
35
|
-
def langchain_to_chat_message(message: BaseMessage) -> ChatMessage:
|
|
38
|
+
def langchain_to_chat_message(message: BaseMessage | dict | BaseModel) -> ChatMessage:
|
|
36
39
|
"""Create a ChatMessage from a LangChain message."""
|
|
40
|
+
if not isinstance(message, (BaseMessage, AIMessage, HumanMessage, ToolMessage, LangchainChatMessage)):
|
|
41
|
+
if isinstance(message, BaseModel):
|
|
42
|
+
message = message.model_dump()
|
|
43
|
+
elif isinstance(message, dict):
|
|
44
|
+
message = message["raw"].content
|
|
45
|
+
|
|
37
46
|
match message:
|
|
38
47
|
case HumanMessage():
|
|
39
48
|
human_message = ChatMessage(
|
|
@@ -68,6 +77,11 @@ def langchain_to_chat_message(message: BaseMessage) -> ChatMessage:
|
|
|
68
77
|
return custom_message
|
|
69
78
|
else:
|
|
70
79
|
raise ValueError(f"Unsupported chat message role: {message.role}")
|
|
80
|
+
case str() | dict():
|
|
81
|
+
return ChatMessage(
|
|
82
|
+
type="ai",
|
|
83
|
+
content=message,
|
|
84
|
+
)
|
|
71
85
|
case _:
|
|
72
86
|
raise ValueError(f"Unsupported message type: {message.__class__.__name__}")
|
|
73
87
|
|
|
@@ -27,6 +27,7 @@ def run_service(
|
|
|
27
27
|
"langgraph_agent_toolkit.agents.blueprints.react_so.agent:react_agent_so",
|
|
28
28
|
"langgraph_agent_toolkit.agents.blueprints.supervisor_agent.agent:supervisor_agent",
|
|
29
29
|
"langgraph_agent_toolkit.agents.blueprints.chatbot.agent:chatbot_agent",
|
|
30
|
+
"langgraph_agent_toolkit.agents.blueprints.interrupt_agent.agent:interrupt_agent",
|
|
30
31
|
]
|
|
31
32
|
),
|
|
32
33
|
)
|
|
@@ -13,6 +13,7 @@ from langgraph_agent_toolkit.schema.schema import (
|
|
|
13
13
|
MessageInput,
|
|
14
14
|
ServiceMetadata,
|
|
15
15
|
StreamInput,
|
|
16
|
+
UserComplexInput,
|
|
16
17
|
UserInput,
|
|
17
18
|
)
|
|
18
19
|
|
|
@@ -21,6 +22,7 @@ __all__ = [
|
|
|
21
22
|
"AddMessagesInput",
|
|
22
23
|
"AddMessagesResponse",
|
|
23
24
|
"AgentInfo",
|
|
25
|
+
"UserComplexInput",
|
|
24
26
|
"UserInput",
|
|
25
27
|
"ChatMessage",
|
|
26
28
|
"ClearHistoryInput",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import Any, Literal, NotRequired
|
|
1
|
+
from typing import Any, Dict, Literal, NotRequired
|
|
2
2
|
|
|
3
3
|
from pydantic import BaseModel, Field
|
|
4
4
|
from typing_extensions import TypedDict
|
|
@@ -35,13 +35,30 @@ class ServiceMetadata(BaseModel):
|
|
|
35
35
|
)
|
|
36
36
|
|
|
37
37
|
|
|
38
|
-
class
|
|
39
|
-
"""Basic user input for the agent."""
|
|
38
|
+
class UserComplexInput(BaseModel):
|
|
39
|
+
"""Basic user input for the agent, supporting dynamic fields."""
|
|
40
40
|
|
|
41
41
|
message: str = Field(
|
|
42
42
|
description="User input to the agent.",
|
|
43
43
|
examples=["What is the weather in Tokyo?"],
|
|
44
44
|
)
|
|
45
|
+
|
|
46
|
+
model_config = {
|
|
47
|
+
"extra": "allow" # allow unknown fields
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class UserInput(BaseModel):
|
|
52
|
+
"""Basic user input for the agent."""
|
|
53
|
+
|
|
54
|
+
input: UserComplexInput = Field(
|
|
55
|
+
description="Structured input from the user, including a message and optional dynamic fields.",
|
|
56
|
+
examples=[
|
|
57
|
+
{
|
|
58
|
+
"message": "What is the weather in Tokyo?",
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
)
|
|
45
62
|
model_name: str | None = Field(
|
|
46
63
|
title="Model",
|
|
47
64
|
description="LLM Model Name to use for the agent.",
|
|
@@ -75,7 +92,7 @@ class UserInput(BaseModel):
|
|
|
75
92
|
default={},
|
|
76
93
|
examples=[
|
|
77
94
|
{
|
|
78
|
-
"
|
|
95
|
+
"checkpointer_params": {"k": 6},
|
|
79
96
|
**DEFAULT_MODEL_PARAMETER_VALUES,
|
|
80
97
|
},
|
|
81
98
|
],
|
|
@@ -115,7 +132,7 @@ class ChatMessage(BaseModel):
|
|
|
115
132
|
description="Role of the message.",
|
|
116
133
|
examples=["human", "ai", "tool", "custom"],
|
|
117
134
|
)
|
|
118
|
-
content: str = Field(
|
|
135
|
+
content: str | Dict[str, Any] = Field(
|
|
119
136
|
description="Content of the message.",
|
|
120
137
|
examples=["Hello, world!"],
|
|
121
138
|
)
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from typing import Optional
|
|
2
|
-
|
|
3
1
|
from fastapi import APIRouter, Depends, HTTPException, Request, status
|
|
4
2
|
from fastapi.responses import RedirectResponse, StreamingResponse
|
|
5
3
|
from langchain_core.messages import AnyMessage, RemoveMessage
|
|
@@ -83,7 +81,7 @@ async def invoke(user_input: UserInput, agent_id: str = None, request: Request =
|
|
|
83
81
|
try:
|
|
84
82
|
return await executor.invoke(
|
|
85
83
|
agent_id=agent_id,
|
|
86
|
-
|
|
84
|
+
input=user_input.input,
|
|
87
85
|
thread_id=user_input.thread_id,
|
|
88
86
|
user_id=user_input.user_id,
|
|
89
87
|
model_name=user_input.model_name,
|
|
@@ -78,7 +78,7 @@ async def message_generator(
|
|
|
78
78
|
try:
|
|
79
79
|
async for message in executor.stream(
|
|
80
80
|
agent_id=agent_id,
|
|
81
|
-
|
|
81
|
+
input=stream_input.input,
|
|
82
82
|
thread_id=stream_input.thread_id,
|
|
83
83
|
user_id=stream_input.user_id,
|
|
84
84
|
model_name=stream_input.model_name,
|
|
@@ -187,14 +187,14 @@ async def main() -> None:
|
|
|
187
187
|
try:
|
|
188
188
|
if use_streaming:
|
|
189
189
|
stream = agent_client.astream(
|
|
190
|
-
message=user_input,
|
|
190
|
+
input=dict(message=user_input),
|
|
191
191
|
thread_id=st.session_state.thread_id,
|
|
192
192
|
user_id=DEFAULT_STREAMLIT_USER_ID,
|
|
193
193
|
)
|
|
194
194
|
await draw_messages(stream, is_new=True)
|
|
195
195
|
else:
|
|
196
196
|
response = await agent_client.ainvoke(
|
|
197
|
-
message=user_input,
|
|
197
|
+
input=dict(message=user_input),
|
|
198
198
|
thread_id=st.session_state.thread_id,
|
|
199
199
|
user_id=DEFAULT_STREAMLIT_USER_ID,
|
|
200
200
|
)
|