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.
Files changed (154) hide show
  1. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/CHANGELOG.md +27 -0
  2. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/PKG-INFO +7 -7
  3. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/usage.rst +1 -1
  4. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/agent_executor.py +23 -16
  5. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/interrupt_agent/agent.py +16 -5
  6. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/react_so/agent.py +5 -2
  7. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/components/creators/create_react_agent.py +6 -2
  8. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/components/utils.py +1 -1
  9. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/client/client.py +14 -13
  10. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/models/factory.py +1 -1
  11. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/helper/constants.py +2 -2
  12. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/helper/utils.py +16 -2
  13. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/run_agent.py +1 -1
  14. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/run_service.py +1 -0
  15. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/schema/__init__.py +2 -0
  16. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/schema/schema.py +22 -5
  17. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/service/routes.py +1 -3
  18. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/service/utils.py +1 -1
  19. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/streamlit_app.py +2 -2
  20. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/pyproject.toml +7 -7
  21. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/python/06-test-custom-chat-prompt-template.py +59 -0
  22. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/agents/test_agent_executor.py +48 -20
  23. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/app/test_streamlit_app.py +2 -2
  24. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/client/test_client.py +16 -16
  25. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/integration/test_docker_e2e.py +2 -1
  26. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/service/test_auth.py +3 -3
  27. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/service/test_service.py +24 -16
  28. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/service/test_service_e2e.py +2 -1
  29. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/uv.lock +80 -80
  30. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.coveragerc +0 -0
  31. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.dockerignore +0 -0
  32. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.env.example +0 -0
  33. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  34. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  35. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  36. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/RELEASE_TEMPLATE/release-template.md +0 -0
  37. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/codecov.yml +0 -0
  38. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/dependabot.yml +0 -0
  39. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/scripts/tag_from_pyproject.sh +0 -0
  40. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/workflows/deploy.yml +0 -0
  41. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/workflows/release.yml +0 -0
  42. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/workflows/sphinx.yml +0 -0
  43. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.github/workflows/test.yml +0 -0
  44. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.gitignore +0 -0
  45. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.pre-commit-config.yaml +0 -0
  46. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/.project-root +0 -0
  47. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/CONTRIBUTING.md +0 -0
  48. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/LICENSE +0 -0
  49. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/Makefile +0 -0
  50. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/README.md +0 -0
  51. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/configs/clickhouse/.clickhouse.env.example +0 -0
  52. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/configs/langfuse/.langfuse.env.example +0 -0
  53. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/configs/litellm/.litellm.env.example +0 -0
  54. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/configs/litellm/config.example.yaml +0 -0
  55. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/configs/minio/.minio.env.example +0 -0
  56. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/configs/postgres/.postgres.env.example +0 -0
  57. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/configs/redis/.redis.env.example +0 -0
  58. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docker/app/Dockerfile +0 -0
  59. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docker/service/Dockerfile +0 -0
  60. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docker-compose.yaml +0 -0
  61. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/.gitignore +0 -0
  62. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/Makefile +0 -0
  63. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/_static/custom.css +0 -0
  64. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/_templates/class.rst +0 -0
  65. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/_templates/layout.html +0 -0
  66. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/_templates/module.rst +0 -0
  67. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/conf.py +0 -0
  68. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/contributing.rst +0 -0
  69. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/environment_setup.rst +0 -0
  70. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/index.rst +0 -0
  71. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/installation.rst +0 -0
  72. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/make.bat +0 -0
  73. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/media/agent_architecture.excalidraw +0 -0
  74. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/media/agent_architecture.png +0 -0
  75. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/media/agent_diagram.png +0 -0
  76. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/docs/media/logo.svg +0 -0
  77. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph.json +0 -0
  78. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/__init__.py +0 -0
  79. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/__init__.py +0 -0
  80. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/agent.py +0 -0
  81. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/__init__.py +0 -0
  82. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/bg_task_agent/__init__.py +0 -0
  83. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/bg_task_agent/agent.py +0 -0
  84. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/bg_task_agent/task.py +0 -0
  85. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/bg_task_agent/utils.py +0 -0
  86. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/chatbot/__init__.py +0 -0
  87. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/chatbot/agent.py +0 -0
  88. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/command_agent/__init__.py +0 -0
  89. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/command_agent/agent.py +0 -0
  90. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/interrupt_agent/__init__.py +0 -0
  91. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/knowledge_base_agent/__init__.py +0 -0
  92. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/knowledge_base_agent/agent.py +0 -0
  93. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/react/__init__.py +0 -0
  94. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/react/agent.py +0 -0
  95. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/react_so/__init__.py +0 -0
  96. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/supervisor_agent/__init__.py +0 -0
  97. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/blueprints/supervisor_agent/agent.py +0 -0
  98. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/components/__init__.py +0 -0
  99. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/components/creators/__init__.py +0 -0
  100. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/agents/components/tools.py +0 -0
  101. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/client/__init__.py +0 -0
  102. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/__init__.py +0 -0
  103. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/memory/__init__.py +0 -0
  104. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/memory/base.py +0 -0
  105. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/memory/factory.py +0 -0
  106. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/memory/postgres.py +0 -0
  107. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/memory/sqlite.py +0 -0
  108. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/memory/types.py +0 -0
  109. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/models/__init__.py +0 -0
  110. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/models/chat_openai.py +0 -0
  111. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/models/fake.py +0 -0
  112. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/observability/__init__.py +0 -0
  113. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/observability/base.py +0 -0
  114. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/observability/empty.py +0 -0
  115. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/observability/factory.py +0 -0
  116. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/observability/langfuse.py +0 -0
  117. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/observability/langsmith.py +0 -0
  118. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/observability/types.py +0 -0
  119. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/prompts/__init__.py +0 -0
  120. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/prompts/chat_prompt_template.py +0 -0
  121. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/core/settings.py +0 -0
  122. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/helper/__init__.py +0 -0
  123. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/helper/logging.py +0 -0
  124. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/helper/types.py +0 -0
  125. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/run_client.py +0 -0
  126. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/schema/models.py +0 -0
  127. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/schema/task_data.py +0 -0
  128. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/service/__init__.py +0 -0
  129. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/service/exception_handlers.py +0 -0
  130. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/service/factory.py +0 -0
  131. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/service/handler.py +0 -0
  132. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/service/middleware.py +0 -0
  133. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/langgraph_agent_toolkit/service/types.py +0 -0
  134. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/postgres-init/create_databases.sql +0 -0
  135. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/python/01-invoke-proxy.py +0 -0
  136. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/python/02-test-local-pm.py +0 -0
  137. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/python/03-test-langfuse-pm.py +0 -0
  138. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/python/04-test-langsmith-pm.py +0 -0
  139. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/python/05-test-prompt-types.py +0 -0
  140. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/python/07-test-get-chat-history.py +0 -0
  141. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/python/08-test-update-chat-history.py +0 -0
  142. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/scripts/python/09-test-clear-chat-history.py +0 -0
  143. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/agents/test_service_streaming.py +0 -0
  144. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/app/conftest.py +0 -0
  145. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/client/conftest.py +0 -0
  146. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/conftest.py +0 -0
  147. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/core/test_llm.py +0 -0
  148. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/core/test_memory.py +0 -0
  149. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/core/test_observability.py +0 -0
  150. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/core/test_prompts.py +0 -0
  151. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/core/test_settings.py +0 -0
  152. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/service/conftest.py +0 -0
  153. {langgraph_agent_toolkit-0.5.0 → langgraph_agent_toolkit-0.7.0}/tests/service/test_factory.py +0 -0
  154. {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.5.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.9.0
30
+ Requires-Dist: jiter~=0.10.0
31
31
  Requires-Dist: joblib>=1.4.2
32
- Requires-Dist: langchain-community~=0.3.23
33
- Requires-Dist: langchain-core~=0.3.59
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.8
36
+ Requires-Dist: langgraph-cli[inmem]~=0.2.10
37
37
  Requires-Dist: langgraph-supervisor~=0.0.21
38
- Requires-Dist: langgraph~=0.4.3
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.21.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
- message: str,
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
- message: User message to send to the agent
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=message)
257
+ input_data = Command(resume=_input)
257
258
  else:
258
- input_data = {"messages": [HumanMessage(content=message)]}
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
- message: str,
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
- message: User message to send to the agent
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
- message=message,
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, # Pass this parameter
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(response["messages"][-1])
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
- message: str,
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
- message: User message to send to the agent
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
- message=message,
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 new_messages:
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, cast
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
- response: BirthdateExtraction = await model_runnable.ainvoke(state, config)
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: list[str] = Field(
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
- # response_format=ResponseSchema,
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("memory_saver_params", {}).get("k", None)
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
- message: str,
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
- message (str): The message to send to the agent
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(message=message)
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
- message: str,
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
- message (str): The message to send to the agent
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(message=message)
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
- message: str,
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
- message (str): The message to send to the agent
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(message=message, stream_tokens=stream_tokens)
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
- message: str,
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
- message (str): The message to send to the agent
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(message=message, stream_tokens=stream_tokens)
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, # Changed to tuple of tuples
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
 
@@ -47,7 +47,7 @@ async def main() -> None:
47
47
  "agent_temperature": 0.9,
48
48
  "agent_top_p": 0.75,
49
49
  "agent_max_tokens": 512,
50
- "memory_saver_params": {"k": 3},
50
+ "checkpointer_params": {"k": 3},
51
51
  },
52
52
  callbacks=[handler],
53
53
  recursion_limit=15,
@@ -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 UserInput(BaseModel):
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
- "memory_saver_params": {"k": 6},
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
- message=user_input.message,
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
- message=stream_input.message,
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
  )