10xgraph-api 0.7.0__tar.gz → 0.8.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 (228) hide show
  1. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/10xgraph_api.egg-info/PKG-INFO +32 -12
  2. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/10xgraph_api.egg-info/SOURCES.txt +6 -0
  3. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/10xgraph_api.egg-info/requires.txt +1 -4
  4. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/CHANGELOG.md +106 -0
  5. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/PKG-INFO +32 -12
  6. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/README.md +29 -5
  7. 10xgraph_api-0.8.0/RELEASE_NOTES.md +63 -0
  8. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/SECURITY.md +34 -2
  9. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/pyproject.toml +4 -8
  10. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/api.py +16 -0
  11. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/build.py +32 -2
  12. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/config_editor/schema.py +114 -4
  13. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/config_editor/validation.py +32 -0
  14. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/constants.py +1 -1
  15. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/defaults.py +65 -45
  16. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/.env.example +2 -0
  17. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/SKILL.md +3 -3
  18. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/api-client.md +7 -7
  19. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/architecture.md +4 -4
  20. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/auth-and-authorization.md +1 -1
  21. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/callbacks-and-command.md +1 -1
  22. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/checkpointing-and-threads.md +1 -1
  23. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/client-auth-and-errors.md +12 -12
  24. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/client-messages-invoke-stream.md +8 -8
  25. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/client-threads-memory-files.md +5 -5
  26. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/media-and-files.md +1 -1
  27. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/memory-and-store.md +1 -1
  28. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/remote-tools.md +1 -1
  29. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/state-and-messages.md +1 -1
  30. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/streaming.md +2 -2
  31. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/copilot/10xgraph.instructions.md +3 -3
  32. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/auth/authorization.py +115 -25
  33. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/auth/base_auth.py +5 -0
  34. 10xgraph_api-0.8.0/tenxgraph_api/src/app/core/auth/identity_cache.py +68 -0
  35. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/auth/jwt_auth.py +3 -0
  36. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/auth/ownership_resolver.py +75 -6
  37. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/auth/permissions.py +58 -5
  38. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/auth/request_config.py +59 -0
  39. 10xgraph_api-0.8.0/tenxgraph_api/src/app/core/auth/revocation.py +219 -0
  40. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/auth/route_guard.py +1 -0
  41. 10xgraph_api-0.8.0/tenxgraph_api/src/app/core/concurrency.py +200 -0
  42. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/config/graph_config.py +210 -4
  43. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/config/media_settings.py +12 -3
  44. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/config/settings.py +22 -5
  45. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/config/setup_middleware.py +78 -82
  46. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/exceptions/handle_errors.py +8 -2
  47. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/rate_limit/keying.py +24 -9
  48. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/rate_limit/middleware.py +39 -20
  49. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/security_headers.py +44 -62
  50. 10xgraph_api-0.8.0/tenxgraph_api/src/app/core/utils/container.py +21 -0
  51. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/utils/log_sanitizer.py +10 -1
  52. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/loader.py +138 -17
  53. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/main.py +20 -2
  54. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/ag_ui/converter.py +8 -6
  55. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/ag_ui/router.py +16 -8
  56. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/checkpointer/services/checkpointer_service.py +60 -9
  57. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/graph/realtime_guard.py +54 -6
  58. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/graph/router.py +144 -43
  59. 10xgraph_api-0.8.0/tenxgraph_api/src/app/routers/graph/run_limits.py +100 -0
  60. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/graph/services/graph_service.py +246 -73
  61. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/graph/services/multimodal_preprocessor.py +5 -2
  62. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/media/__init__.py +33 -8
  63. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/media/router.py +58 -21
  64. 10xgraph_api-0.8.0/tenxgraph_api/src/app/routers/ping/readiness.py +142 -0
  65. 10xgraph_api-0.8.0/tenxgraph_api/src/app/routers/ping/router.py +65 -0
  66. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/response_helper.py +26 -5
  67. 10xgraph_api-0.7.0/RELEASE_NOTES.md +0 -51
  68. 10xgraph_api-0.7.0/tenxgraph_api/src/app/routers/ping/router.py +0 -28
  69. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/10xgraph.json +0 -0
  70. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/10xgraph_api.egg-info/dependency_links.txt +0 -0
  71. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/10xgraph_api.egg-info/entry_points.txt +0 -0
  72. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/10xgraph_api.egg-info/not-zip-safe +0 -0
  73. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/10xgraph_api.egg-info/top_level.txt +0 -0
  74. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/CODE_OF_CONDUCT.md +0 -0
  75. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/CONTRIBUTING.md +0 -0
  76. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/LICENSE +0 -0
  77. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/MANIFEST.in +0 -0
  78. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/agentflow_cli/__init__.py +0 -0
  79. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/setup.cfg +0 -0
  80. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/__init__.py +0 -0
  81. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/__init__.py +0 -0
  82. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/capabilities.py +0 -0
  83. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/__init__.py +0 -0
  84. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/audit.py +0 -0
  85. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/config.py +0 -0
  86. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/demo.py +0 -0
  87. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/eval.py +0 -0
  88. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/init.py +0 -0
  89. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/skills.py +0 -0
  90. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/test.py +0 -0
  91. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/version.py +0 -0
  92. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/config_editor/__init__.py +0 -0
  93. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/config_editor/server.py +0 -0
  94. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/config_editor/static/app.css +0 -0
  95. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/config_editor/static/app.js +0 -0
  96. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/config_editor/static/favicon.svg +0 -0
  97. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/config_editor/static/index.html +0 -0
  98. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/config_editor/store.py +0 -0
  99. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/context.py +0 -0
  100. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/core/__init__.py +0 -0
  101. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/core/animations.py +0 -0
  102. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/core/config.py +0 -0
  103. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/core/output.py +0 -0
  104. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/core/prompts.py +0 -0
  105. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/core/screen.py +0 -0
  106. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/core/steps.py +0 -0
  107. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/core/theme.py +0 -0
  108. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/core/validation.py +0 -0
  109. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/exceptions.py +0 -0
  110. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/logger.py +0 -0
  111. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/main.py +0 -0
  112. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/__init__.py +0 -0
  113. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/dev/.env.example +0 -0
  114. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/dev/10xgraph.json +0 -0
  115. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/dev/graph/__init__.py +0 -0
  116. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/dev/graph/agent.py +0 -0
  117. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/.pre-commit-config.yaml +0 -0
  118. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/.python-version +0 -0
  119. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/10xgraph.json +0 -0
  120. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/auth/__init__.py +0 -0
  121. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/auth/agent_auth.py +0 -0
  122. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/evals/__init__.py +0 -0
  123. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/evals/user_simulator_eval.py +0 -0
  124. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/evals/weather_agents_eval.py +0 -0
  125. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/__init__.py +0 -0
  126. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/agent.py +0 -0
  127. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/state.py +0 -0
  128. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/thread_name_generator.py +0 -0
  129. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/tools/__init__.py +0 -0
  130. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/tools/weather_tool.py +0 -0
  131. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/validators/__init__.py +0 -0
  132. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/validators/lifecyle.py +0 -0
  133. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/validators/manager.py +0 -0
  134. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/validators/validators.py +0 -0
  135. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/pyproject.toml +0 -0
  136. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/tests/__init__.py +0 -0
  137. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/tests/conftest.py +0 -0
  138. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/tests/test_agent_eval.py +0 -0
  139. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/tests/test_catalog_tools.py +0 -0
  140. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/tests/test_graph_nodes.py +0 -0
  141. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/agents-and-tools.md +0 -0
  142. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/api-configuration.md +0 -0
  143. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/api-settings-and-middleware.md +0 -0
  144. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/cli-commands.md +0 -0
  145. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/context-id-background.md +0 -0
  146. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/dependency-injection.md +0 -0
  147. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/evaluation.md +0 -0
  148. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/id-and-thread-name-generators.md +0 -0
  149. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/prebuilt-agents-and-tools.md +0 -0
  150. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/production-runtime.md +0 -0
  151. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/providers-and-adapters.md +0 -0
  152. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/publishers-and-runtime-protocols.md +0 -0
  153. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/rate-limiting.md +0 -0
  154. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/realtime.md +0 -0
  155. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/rest-api-and-errors.md +0 -0
  156. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/security-and-validators.md +0 -0
  157. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/state-graph.md +0 -0
  158. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/stream-emitter.md +0 -0
  159. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/testing-and-evaluation.md +0 -0
  160. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/unit-testing.md +0 -0
  161. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/py.typed +0 -0
  162. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/__init__.py +0 -0
  163. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/__init__.py +0 -0
  164. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/__init__.py +0 -0
  165. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/auth/__init__.py +0 -0
  166. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/auth/auth_backend.py +0 -0
  167. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/config/__init__.py +0 -0
  168. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/config/sentry_config.py +0 -0
  169. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/config/setup_logs.py +0 -0
  170. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/config/worker_middleware.py +0 -0
  171. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/exceptions/__init__.py +0 -0
  172. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/exceptions/general_exception.py +0 -0
  173. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/exceptions/resources_exceptions.py +0 -0
  174. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/exceptions/user_exception.py +0 -0
  175. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/__init__.py +0 -0
  176. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/rate_limit/__init__.py +0 -0
  177. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/rate_limit/base.py +0 -0
  178. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/rate_limit/factory.py +0 -0
  179. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/rate_limit/memory.py +0 -0
  180. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/rate_limit/redis.py +0 -0
  181. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/request_limits.py +0 -0
  182. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/utils/__init__.py +0 -0
  183. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/__init__.py +0 -0
  184. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/ag_ui/__init__.py +0 -0
  185. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/ag_ui/event_mapper.py +0 -0
  186. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/ag_ui/service.py +0 -0
  187. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/checkpointer/__init__.py +0 -0
  188. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/checkpointer/router.py +0 -0
  189. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/checkpointer/schemas/__init__.py +0 -0
  190. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/checkpointer/schemas/checkpointer_schemas.py +0 -0
  191. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/checkpointer/services/__init__.py +0 -0
  192. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/evals/__init__.py +0 -0
  193. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/evals/router.py +0 -0
  194. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/evals/services/__init__.py +0 -0
  195. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/evals/services/eval_report_service.py +0 -0
  196. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/graph/__init__.py +0 -0
  197. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/graph/schemas/__init__.py +0 -0
  198. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/graph/schemas/graph_schemas.py +0 -0
  199. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/graph/services/__init__.py +0 -0
  200. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/media/schemas.py +0 -0
  201. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/ping/__init__.py +0 -0
  202. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/setup_router.py +0 -0
  203. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/store/__init__.py +0 -0
  204. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/store/router.py +0 -0
  205. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/store/schemas/__init__.py +0 -0
  206. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/store/schemas/store_schemas.py +0 -0
  207. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/store/services/__init__.py +0 -0
  208. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/store/services/store_service.py +0 -0
  209. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/tasks/__init__.py +0 -0
  210. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/tasks/user_tasks.py +0 -0
  211. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/__init__.py +0 -0
  212. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/callable_helper.py +0 -0
  213. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/media/__init__.py +0 -0
  214. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/media/extractor.py +0 -0
  215. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/media/pipeline.py +0 -0
  216. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/parse_output.py +0 -0
  217. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/schemas/__init__.py +0 -0
  218. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/schemas/output_schemas.py +0 -0
  219. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/schemas/user_schemas.py +0 -0
  220. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/snowflake_id_generator.py +0 -0
  221. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/swagger_helper.py +0 -0
  222. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/telemetry_store.py +0 -0
  223. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/thread_name_generator.py +0 -0
  224. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/worker.py +0 -0
  225. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tests/test_agentflow_cli_alias.py +0 -0
  226. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tests/test_multimodal_sprint2_extraction.py +0 -0
  227. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tests/test_sprint4_media_api.py +0 -0
  228. {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tests/test_utils_parse_and_callable.py +0 -0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: 10xgraph-api
3
- Version: 0.7.0
3
+ Version: 0.8.0
4
4
  Summary: Production server for 10xGraph agents (formerly 10xscale-agentflow-cli). Serves a compiled graph over REST, SSE, WebSocket, realtime audio and AG-UI with JWT or custom auth, scoped authorization on every endpoint, owner-only threads and rate limiting, and generates Docker Compose and Kubernetes files. Includes the 10xgraph CLI. MIT licensed, self-hosted.
5
5
  Author-email: Shudipto Trafder <shudiptotrafder@gmail.com>
6
6
  Maintainer-email: Shudipto Trafder <shudiptotrafder@gmail.com>, 10xScale <contact@10xscale.ai>
7
- License: MIT
7
+ License-Expression: MIT
8
8
  Project-URL: Homepage, https://10xgraph.com
9
9
  Project-URL: Repository, https://github.com/10xGraph/10xgraph-api
10
10
  Project-URL: Issues, https://github.com/10xGraph/10xgraph-api/issues
@@ -13,7 +13,6 @@ Project-URL: Changelog, https://github.com/10xGraph/10xgraph-api/blob/main/CHANG
13
13
  Keywords: 10xgraph,10xscale,agentflow,agents,ai-agents,multi-agent,agent-server,agent-deployment,llm,fastapi,api-server,rest-api,sse,websocket,realtime-audio,ag-ui,jwt,authentication,authorization,rbac,multi-tenant,rate-limiting,self-hosted,production,docker,kubernetes,cli
14
14
  Classifier: Development Status :: 4 - Beta
15
15
  Classifier: Intended Audience :: Developers
16
- Classifier: License :: OSI Approved :: MIT License
17
16
  Classifier: Operating System :: OS Independent
18
17
  Classifier: Programming Language :: Python :: 3
19
18
  Classifier: Programming Language :: Python :: 3.12
@@ -25,13 +24,10 @@ Description-Content-Type: text/markdown
25
24
  License-File: LICENSE
26
25
  Requires-Dist: 10xgraph<2.0,>=0.10.0
27
26
  Requires-Dist: fastapi<1.0,>=0.116
28
- Requires-Dist: gunicorn<24,>=23.0
29
- Requires-Dist: orjson<4,>=3.11
30
- Requires-Dist: platformdirs<5,>=4.0
31
27
  Requires-Dist: python-multipart<0.1,>=0.0.19
32
28
  Requires-Dist: pydantic<3,>=2.13
33
29
  Requires-Dist: pydantic-settings<3,>=2.3
34
- Requires-Dist: uvicorn<1.0,>=0.30
30
+ Requires-Dist: uvicorn<1.0,>=0.36
35
31
  Requires-Dist: typer<1.0,>=0.17
36
32
  Requires-Dist: python-dotenv<2,>=1.0
37
33
  Requires-Dist: questionary<3,>=2.0
@@ -93,7 +89,7 @@ Not built in: automatic per-tool permissions (user A may call `refund`, user B m
93
89
  |---|---|---|
94
90
  | [`10xgraph`](https://github.com/10xGraph/10xGraph) | Core engine: graph, state, replay-safe tools, checkpointing, memory | `pip install 10xgraph` (pulled in by this package) |
95
91
  | `10xgraph-api` (this repository) | Production server and the `10xgraph` command | `pip install 10xgraph-api` |
96
- | [`10xgraph-client`](https://github.com/10xGraph/10xgraph-client) | Typed TypeScript client for every endpoint | `npm install 10xgraph-client` (until it is published, `@10xscale/agentflow-client`) |
92
+ | [`10xgraph-client`](https://github.com/10xGraph/10xgraph-client) | Typed TypeScript client for every endpoint | `npm install 10xgraph-client` |
97
93
 
98
94
  Docs: [10xgraph.com](https://10xgraph.com).
99
95
 
@@ -577,7 +573,7 @@ sdist + wheel, checks the distribution metadata, and creates a GitHub Release wi
577
573
  notes and the artifacts attached. PyPI publishing is manual (`make publish`).
578
574
 
579
575
  ```bash
580
- git tag v0.7.0 && git push origin v0.7.0
576
+ git tag v0.8.0 && git push origin v0.8.0
581
577
  ```
582
578
 
583
579
  ---
@@ -601,9 +597,33 @@ git tag v0.7.0 && git push origin v0.7.0
601
597
 
602
598
  ## Contributing
603
599
 
604
- Contributions are welcome. Fork the repo, create a feature branch, run tests and linting, and open a
605
- Pull Request. See the [repository](https://github.com/10xGraph/10xgraph-api) for issue reporting and
606
- guidelines.
600
+ **Your avatar belongs on this wall.**
601
+
602
+ <a href="https://github.com/10xGraph/10xgraph-api/graphs/contributors">
603
+ <img src="https://contrib.rocks/image?repo=10xGraph/10xgraph-api" alt="People who have contributed to 10xgraph-api" />
604
+ </a>
605
+
606
+ Every person above shipped code that serves real agents in production. Merge one pull request and you join them, here and on the contributor page at [10xgraph.com/maintainers](https://10xgraph.com/maintainers).
607
+
608
+ Your first pull request can be small. These are real, self-contained, and useful today:
609
+
610
+ - **Type one module.** `pyproject.toml` lists the modules `mypy` still skips, each with its error count. Start with a one-error module, fix it, delete its line.
611
+ - **Add a test for an edge case you hit.** A request that should be rejected, a config that should fail at startup, a header that should be set.
612
+ - **Write the deployment recipe you needed.** Behind a reverse proxy, on a specific cloud, with your auth provider. Recipes go on [10xgraph.com](https://10xgraph.com), where every page has an "Edit this page" link.
613
+ - **Turn a bug into a failing test.** Open it as a draft pull request; the fix can come later.
614
+
615
+ From clone to a passing check:
616
+
617
+ ```bash
618
+ git clone https://github.com/10xGraph/10xgraph-api.git
619
+ cd 10xgraph-api
620
+ uv sync --dev
621
+ uv run pytest
622
+ uv run pre-commit run --all-files # ruff, bandit and hygiene checks, as in CI
623
+ uv run mypy
624
+ ```
625
+
626
+ Draft pull requests are welcome, so open early and ask questions in the PR. For bigger changes, start a thread in the core repository's [Discussions](https://github.com/10xGraph/10xGraph/discussions) first so the work does not overlap.
607
627
 
608
628
  ---
609
629
 
@@ -126,14 +126,17 @@ tenxgraph_api/src/app/loader.py
126
126
  tenxgraph_api/src/app/main.py
127
127
  tenxgraph_api/src/app/worker.py
128
128
  tenxgraph_api/src/app/core/__init__.py
129
+ tenxgraph_api/src/app/core/concurrency.py
129
130
  tenxgraph_api/src/app/core/auth/__init__.py
130
131
  tenxgraph_api/src/app/core/auth/auth_backend.py
131
132
  tenxgraph_api/src/app/core/auth/authorization.py
132
133
  tenxgraph_api/src/app/core/auth/base_auth.py
134
+ tenxgraph_api/src/app/core/auth/identity_cache.py
133
135
  tenxgraph_api/src/app/core/auth/jwt_auth.py
134
136
  tenxgraph_api/src/app/core/auth/ownership_resolver.py
135
137
  tenxgraph_api/src/app/core/auth/permissions.py
136
138
  tenxgraph_api/src/app/core/auth/request_config.py
139
+ tenxgraph_api/src/app/core/auth/revocation.py
137
140
  tenxgraph_api/src/app/core/auth/route_guard.py
138
141
  tenxgraph_api/src/app/core/config/__init__.py
139
142
  tenxgraph_api/src/app/core/config/graph_config.py
@@ -159,6 +162,7 @@ tenxgraph_api/src/app/core/middleware/rate_limit/memory.py
159
162
  tenxgraph_api/src/app/core/middleware/rate_limit/middleware.py
160
163
  tenxgraph_api/src/app/core/middleware/rate_limit/redis.py
161
164
  tenxgraph_api/src/app/core/utils/__init__.py
165
+ tenxgraph_api/src/app/core/utils/container.py
162
166
  tenxgraph_api/src/app/core/utils/log_sanitizer.py
163
167
  tenxgraph_api/src/app/routers/__init__.py
164
168
  tenxgraph_api/src/app/routers/setup_router.py
@@ -180,6 +184,7 @@ tenxgraph_api/src/app/routers/evals/services/eval_report_service.py
180
184
  tenxgraph_api/src/app/routers/graph/__init__.py
181
185
  tenxgraph_api/src/app/routers/graph/realtime_guard.py
182
186
  tenxgraph_api/src/app/routers/graph/router.py
187
+ tenxgraph_api/src/app/routers/graph/run_limits.py
183
188
  tenxgraph_api/src/app/routers/graph/schemas/__init__.py
184
189
  tenxgraph_api/src/app/routers/graph/schemas/graph_schemas.py
185
190
  tenxgraph_api/src/app/routers/graph/services/__init__.py
@@ -189,6 +194,7 @@ tenxgraph_api/src/app/routers/media/__init__.py
189
194
  tenxgraph_api/src/app/routers/media/router.py
190
195
  tenxgraph_api/src/app/routers/media/schemas.py
191
196
  tenxgraph_api/src/app/routers/ping/__init__.py
197
+ tenxgraph_api/src/app/routers/ping/readiness.py
192
198
  tenxgraph_api/src/app/routers/ping/router.py
193
199
  tenxgraph_api/src/app/routers/store/__init__.py
194
200
  tenxgraph_api/src/app/routers/store/router.py
@@ -1,12 +1,9 @@
1
1
  10xgraph<2.0,>=0.10.0
2
2
  fastapi<1.0,>=0.116
3
- gunicorn<24,>=23.0
4
- orjson<4,>=3.11
5
- platformdirs<5,>=4.0
6
3
  python-multipart<0.1,>=0.0.19
7
4
  pydantic<3,>=2.13
8
5
  pydantic-settings<3,>=2.3
9
- uvicorn<1.0,>=0.30
6
+ uvicorn<1.0,>=0.36
10
7
  typer<1.0,>=0.17
11
8
  python-dotenv<2,>=1.0
12
9
  questionary<3,>=2.0
@@ -20,6 +20,110 @@ project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
20
20
 
21
21
  ---
22
22
 
23
+ ## [Unreleased]
24
+
25
+ ## [0.8.0] - 2026-10-16
26
+
27
+ Security and scalability pass over the API, following an external review. Every item below
28
+ has tests; see the review notes for the full list. This release has breaking changes: read
29
+ the **Breaking** list before upgrading.
30
+
31
+ ### Breaking
32
+
33
+ - **Ownership checks fail closed.** With auth on, an ownership or `rbac` authorization
34
+ backend now refuses to start on a checkpointer that cannot resolve thread owners
35
+ (`aget_thread_owner` not implemented), and denies thread requests if none is available at
36
+ runtime. Implement `aget_thread_owner`, or set `"authorization": "allow_all"` or a custom
37
+ backend.
38
+ - **An unowned thread only allows actions that create it** (`graph:invoke`, `graph:stream`,
39
+ `checkpointer:write`). Reading, deleting, stopping or fixing a thread that does not exist
40
+ (or has no owner) now answers 403 instead of an empty result.
41
+ - **Authorization defaults to `ownership` whenever auth is configured**, in every mode. It
42
+ used to be `allow_all` unless `MODE=production`. Set `"authorization": "allow_all"` to keep
43
+ the old development behaviour.
44
+ - **Realtime init frames can no longer replace the system prompt by default.** Add
45
+ `"system_prompt"` to `websocket.realtime_client_overrides` to allow it.
46
+ - **`trusted_proxy_headers: true` without `trusted_proxies` trusts only loopback and private
47
+ networks**, not every peer. List your proxy networks (or `0.0.0.0/0` and `::/0`).
48
+ - **Production defaults:** `MEDIA_REQUIRE_OWNER` is on, `graph_introspection` is `scoped`
49
+ (graph structure, tools and state schema need the `graph:read` scope), and `IS_DEBUG` is
50
+ forced off.
51
+ - **`/v1/graph/invoke` no longer returns `meta.thread_name`**; the name is generated in the
52
+ background and appears on the thread (`GET /v1/threads`).
53
+ - **Production 4xx responses keep their message**; only 5xx are made generic. A 422 built
54
+ from an unexpected `ValueError` is still made generic.
55
+ - **`gunicorn` is no longer a dependency.** The generated Dockerfile installs it, so
56
+ `10xgraph build` images are unaffected. If you run `gunicorn` yourself outside that image,
57
+ install it alongside the API: `pip install gunicorn uvicorn-worker`.
58
+ - **Gunicorn's worker class is now `uvicorn_worker.UvicornWorker`** (from the `uvicorn-worker`
59
+ package). `uvicorn.workers.UvicornWorker` is deprecated in uvicorn. Regenerate the
60
+ Dockerfile and compose file with `10xgraph build --force`, or change `-k` in your own
61
+ command.
62
+ - **`POST /v1/graph/fix` returns `state` as a JSON object.** It used to be a JSON-encoded
63
+ string. Drop any `JSON.parse` / `json.loads` on that field; the TS client already types it
64
+ as an object.
65
+ - **Generated Dockerfiles install only the dependencies you list.** The `pyproject.toml` path
66
+ no longer adds `10xgraph-api` on top of your list. `10xgraph build` warns when the requirements file or `pyproject.toml` does not list
67
+ `10xgraph-api`.
68
+
69
+ ### Added
70
+
71
+ - `runs` key in `10xgraph.json`: `thread_ids` (`client` | `server`), `config_keys` and
72
+ `state_keys` allow-lists, `max_concurrent_per_user` (default 10) and `timeout`.
73
+ - `token_revocation` key (`redis`, `memory` or `module:attr`) and the
74
+ `TokenRevocationBackend` hook: revoked tokens are refused before they expire, on HTTP and
75
+ on every WebSocket run.
76
+ - `graph_introspection` key (`open` | `scoped`).
77
+ - `websocket.realtime_client_overrides` allow-list.
78
+ - `STRICT_PRODUCTION_CHECKS=true`: production refuses to start on wildcard `ALLOWED_HOST` or
79
+ `ORIGINS`, or enabled API docs.
80
+ - `GET /health/ready` readiness probe (checkpointer, Redis, store); the k8s manifest uses it.
81
+ - Run and WebSocket connection caps are shared across workers through Redis when it is
82
+ configured.
83
+
84
+ ### Changed
85
+
86
+ - `10xgraph play` and `10xgraph dev` open the hosted playground at its new address,
87
+ `https://play.10xgraph.com`. The previous address, `playground-463bd.web.app`, still
88
+ serves the same app for older releases.
89
+ - Thread delete leaves a short tombstone so a deleted id cannot be handed to another user
90
+ while other workers still cache the old owner.
91
+ - Every thread the API saves records its owner, which fixes owner lookups on the in-memory
92
+ and SQLite checkpointers.
93
+ - WebSocket JSON frames over `MAX_REQUEST_SIZE` are refused (close 1009); `10xgraph api`
94
+ passes the same limit to uvicorn as `ws_max_size`.
95
+ - Request ID, security headers and rate limiting are pure ASGI middleware; CORS is now the
96
+ outermost layer, so 429, 413 and Host rejections are readable by browsers.
97
+ - Route-set security headers (such as the download sandbox CSP) are no longer overwritten.
98
+ - The JWT is verified once per request when rate limiting by user.
99
+ - Local-store downloads stream from disk; uploads are read into memory once.
100
+ - JSON responses are serialized by pydantic-core (`model_dump_json`) instead of orjson.
101
+ FastAPI deprecated `ORJSONResponse` in 0.131; the FastAPI floor stays at 0.116.
102
+ - Dependencies: dropped `orjson` and the unused `platformdirs`; the `uvicorn` floor is now
103
+ 0.36 (required by `uvicorn-worker`).
104
+ - Generated Dockerfiles build in two stages: dependencies go into a virtualenv in a builder
105
+ stage, and only that virtualenv and your code reach the runtime image. The runtime image
106
+ has no compiler or curl, copies code with `COPY --chown` instead of a second `chown -R`
107
+ layer, and its healthcheck uses the Python standard library.
108
+ - A requirements file in a subfolder (for example `requirements/base.txt`) keeps its path in
109
+ the generated Dockerfile.
110
+ - Packaging: `license` is an SPDX expression (`MIT`), so builds no longer warn about the
111
+ deprecated table form; the build needs setuptools 77 or later.
112
+
113
+ ### Security
114
+
115
+ - **Log injection.** Values a client controls (user and thread ids, file ids, rate-limit
116
+ keys, request paths, run config and messages) are written to logs through `log_safe()`,
117
+ which escapes CR and LF, so a request cannot forge extra log lines. This covers the graph,
118
+ checkpointer and media services, the rate-limit middleware, the WebSocket guard and the
119
+ run limits.
120
+ - **ReDoS in the log sanitizer.** The JWT detection pattern backtracked polynomially on
121
+ crafted input (about 585 ms for a 16,000-character string). It now matches in linear time.
122
+ - **Security examples.** `examples/security/` no longer prints any part of an API key or of
123
+ the JWT secret. The API key example hashes keys with HMAC-SHA-256 and a server-side
124
+ `API_KEY_PEPPER`; hashes made with the previous example's plain SHA-256 must be
125
+ regenerated.
126
+
23
127
  ## [0.7.0] - 2026-10-10
24
128
 
25
129
  **First release as `10xgraph-api`.** 10xScale Agentflow is now 10xGraph. This package
@@ -351,6 +455,8 @@ can be pinned.
351
455
  Initial entry in this changelog. Releases before `0.5.0` were not tracked here; see the
352
456
  GitHub release history for their notes.
353
457
 
458
+ [Unreleased]: https://github.com/10xGraph/10xgraph-api/compare/v0.8.0...HEAD
459
+ [0.8.0]: https://github.com/10xGraph/10xgraph-api/compare/v0.7.0...v0.8.0
354
460
  [0.7.0]: https://github.com/10xGraph/10xgraph-api/compare/v0.6.0...v0.7.0
355
461
  [0.6.0]: https://github.com/10xHub/agentflow-cli/compare/v0.5.1...v0.6.0
356
462
  [0.5.1]: https://github.com/10xHub/agentflow-cli/compare/v0.5.0...v0.5.1
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: 10xgraph-api
3
- Version: 0.7.0
3
+ Version: 0.8.0
4
4
  Summary: Production server for 10xGraph agents (formerly 10xscale-agentflow-cli). Serves a compiled graph over REST, SSE, WebSocket, realtime audio and AG-UI with JWT or custom auth, scoped authorization on every endpoint, owner-only threads and rate limiting, and generates Docker Compose and Kubernetes files. Includes the 10xgraph CLI. MIT licensed, self-hosted.
5
5
  Author-email: Shudipto Trafder <shudiptotrafder@gmail.com>
6
6
  Maintainer-email: Shudipto Trafder <shudiptotrafder@gmail.com>, 10xScale <contact@10xscale.ai>
7
- License: MIT
7
+ License-Expression: MIT
8
8
  Project-URL: Homepage, https://10xgraph.com
9
9
  Project-URL: Repository, https://github.com/10xGraph/10xgraph-api
10
10
  Project-URL: Issues, https://github.com/10xGraph/10xgraph-api/issues
@@ -13,7 +13,6 @@ Project-URL: Changelog, https://github.com/10xGraph/10xgraph-api/blob/main/CHANG
13
13
  Keywords: 10xgraph,10xscale,agentflow,agents,ai-agents,multi-agent,agent-server,agent-deployment,llm,fastapi,api-server,rest-api,sse,websocket,realtime-audio,ag-ui,jwt,authentication,authorization,rbac,multi-tenant,rate-limiting,self-hosted,production,docker,kubernetes,cli
14
14
  Classifier: Development Status :: 4 - Beta
15
15
  Classifier: Intended Audience :: Developers
16
- Classifier: License :: OSI Approved :: MIT License
17
16
  Classifier: Operating System :: OS Independent
18
17
  Classifier: Programming Language :: Python :: 3
19
18
  Classifier: Programming Language :: Python :: 3.12
@@ -25,13 +24,10 @@ Description-Content-Type: text/markdown
25
24
  License-File: LICENSE
26
25
  Requires-Dist: 10xgraph<2.0,>=0.10.0
27
26
  Requires-Dist: fastapi<1.0,>=0.116
28
- Requires-Dist: gunicorn<24,>=23.0
29
- Requires-Dist: orjson<4,>=3.11
30
- Requires-Dist: platformdirs<5,>=4.0
31
27
  Requires-Dist: python-multipart<0.1,>=0.0.19
32
28
  Requires-Dist: pydantic<3,>=2.13
33
29
  Requires-Dist: pydantic-settings<3,>=2.3
34
- Requires-Dist: uvicorn<1.0,>=0.30
30
+ Requires-Dist: uvicorn<1.0,>=0.36
35
31
  Requires-Dist: typer<1.0,>=0.17
36
32
  Requires-Dist: python-dotenv<2,>=1.0
37
33
  Requires-Dist: questionary<3,>=2.0
@@ -93,7 +89,7 @@ Not built in: automatic per-tool permissions (user A may call `refund`, user B m
93
89
  |---|---|---|
94
90
  | [`10xgraph`](https://github.com/10xGraph/10xGraph) | Core engine: graph, state, replay-safe tools, checkpointing, memory | `pip install 10xgraph` (pulled in by this package) |
95
91
  | `10xgraph-api` (this repository) | Production server and the `10xgraph` command | `pip install 10xgraph-api` |
96
- | [`10xgraph-client`](https://github.com/10xGraph/10xgraph-client) | Typed TypeScript client for every endpoint | `npm install 10xgraph-client` (until it is published, `@10xscale/agentflow-client`) |
92
+ | [`10xgraph-client`](https://github.com/10xGraph/10xgraph-client) | Typed TypeScript client for every endpoint | `npm install 10xgraph-client` |
97
93
 
98
94
  Docs: [10xgraph.com](https://10xgraph.com).
99
95
 
@@ -577,7 +573,7 @@ sdist + wheel, checks the distribution metadata, and creates a GitHub Release wi
577
573
  notes and the artifacts attached. PyPI publishing is manual (`make publish`).
578
574
 
579
575
  ```bash
580
- git tag v0.7.0 && git push origin v0.7.0
576
+ git tag v0.8.0 && git push origin v0.8.0
581
577
  ```
582
578
 
583
579
  ---
@@ -601,9 +597,33 @@ git tag v0.7.0 && git push origin v0.7.0
601
597
 
602
598
  ## Contributing
603
599
 
604
- Contributions are welcome. Fork the repo, create a feature branch, run tests and linting, and open a
605
- Pull Request. See the [repository](https://github.com/10xGraph/10xgraph-api) for issue reporting and
606
- guidelines.
600
+ **Your avatar belongs on this wall.**
601
+
602
+ <a href="https://github.com/10xGraph/10xgraph-api/graphs/contributors">
603
+ <img src="https://contrib.rocks/image?repo=10xGraph/10xgraph-api" alt="People who have contributed to 10xgraph-api" />
604
+ </a>
605
+
606
+ Every person above shipped code that serves real agents in production. Merge one pull request and you join them, here and on the contributor page at [10xgraph.com/maintainers](https://10xgraph.com/maintainers).
607
+
608
+ Your first pull request can be small. These are real, self-contained, and useful today:
609
+
610
+ - **Type one module.** `pyproject.toml` lists the modules `mypy` still skips, each with its error count. Start with a one-error module, fix it, delete its line.
611
+ - **Add a test for an edge case you hit.** A request that should be rejected, a config that should fail at startup, a header that should be set.
612
+ - **Write the deployment recipe you needed.** Behind a reverse proxy, on a specific cloud, with your auth provider. Recipes go on [10xgraph.com](https://10xgraph.com), where every page has an "Edit this page" link.
613
+ - **Turn a bug into a failing test.** Open it as a draft pull request; the fix can come later.
614
+
615
+ From clone to a passing check:
616
+
617
+ ```bash
618
+ git clone https://github.com/10xGraph/10xgraph-api.git
619
+ cd 10xgraph-api
620
+ uv sync --dev
621
+ uv run pytest
622
+ uv run pre-commit run --all-files # ruff, bandit and hygiene checks, as in CI
623
+ uv run mypy
624
+ ```
625
+
626
+ Draft pull requests are welcome, so open early and ask questions in the PR. For bigger changes, start a thread in the core repository's [Discussions](https://github.com/10xGraph/10xGraph/discussions) first so the work does not overlap.
607
627
 
608
628
  ---
609
629
 
@@ -31,7 +31,7 @@ Not built in: automatic per-tool permissions (user A may call `refund`, user B m
31
31
  |---|---|---|
32
32
  | [`10xgraph`](https://github.com/10xGraph/10xGraph) | Core engine: graph, state, replay-safe tools, checkpointing, memory | `pip install 10xgraph` (pulled in by this package) |
33
33
  | `10xgraph-api` (this repository) | Production server and the `10xgraph` command | `pip install 10xgraph-api` |
34
- | [`10xgraph-client`](https://github.com/10xGraph/10xgraph-client) | Typed TypeScript client for every endpoint | `npm install 10xgraph-client` (until it is published, `@10xscale/agentflow-client`) |
34
+ | [`10xgraph-client`](https://github.com/10xGraph/10xgraph-client) | Typed TypeScript client for every endpoint | `npm install 10xgraph-client` |
35
35
 
36
36
  Docs: [10xgraph.com](https://10xgraph.com).
37
37
 
@@ -515,7 +515,7 @@ sdist + wheel, checks the distribution metadata, and creates a GitHub Release wi
515
515
  notes and the artifacts attached. PyPI publishing is manual (`make publish`).
516
516
 
517
517
  ```bash
518
- git tag v0.7.0 && git push origin v0.7.0
518
+ git tag v0.8.0 && git push origin v0.8.0
519
519
  ```
520
520
 
521
521
  ---
@@ -539,9 +539,33 @@ git tag v0.7.0 && git push origin v0.7.0
539
539
 
540
540
  ## Contributing
541
541
 
542
- Contributions are welcome. Fork the repo, create a feature branch, run tests and linting, and open a
543
- Pull Request. See the [repository](https://github.com/10xGraph/10xgraph-api) for issue reporting and
544
- guidelines.
542
+ **Your avatar belongs on this wall.**
543
+
544
+ <a href="https://github.com/10xGraph/10xgraph-api/graphs/contributors">
545
+ <img src="https://contrib.rocks/image?repo=10xGraph/10xgraph-api" alt="People who have contributed to 10xgraph-api" />
546
+ </a>
547
+
548
+ Every person above shipped code that serves real agents in production. Merge one pull request and you join them, here and on the contributor page at [10xgraph.com/maintainers](https://10xgraph.com/maintainers).
549
+
550
+ Your first pull request can be small. These are real, self-contained, and useful today:
551
+
552
+ - **Type one module.** `pyproject.toml` lists the modules `mypy` still skips, each with its error count. Start with a one-error module, fix it, delete its line.
553
+ - **Add a test for an edge case you hit.** A request that should be rejected, a config that should fail at startup, a header that should be set.
554
+ - **Write the deployment recipe you needed.** Behind a reverse proxy, on a specific cloud, with your auth provider. Recipes go on [10xgraph.com](https://10xgraph.com), where every page has an "Edit this page" link.
555
+ - **Turn a bug into a failing test.** Open it as a draft pull request; the fix can come later.
556
+
557
+ From clone to a passing check:
558
+
559
+ ```bash
560
+ git clone https://github.com/10xGraph/10xgraph-api.git
561
+ cd 10xgraph-api
562
+ uv sync --dev
563
+ uv run pytest
564
+ uv run pre-commit run --all-files # ruff, bandit and hygiene checks, as in CI
565
+ uv run mypy
566
+ ```
567
+
568
+ Draft pull requests are welcome, so open early and ask questions in the PR. For bigger changes, start a thread in the core repository's [Discussions](https://github.com/10xGraph/10xGraph/discussions) first so the work does not overlap.
545
569
 
546
570
  ---
547
571
 
@@ -0,0 +1,63 @@
1
+ # 10xgraph-api 0.8.0
2
+
3
+ A security and scalability pass over the API, following an external review. Authorization now
4
+ fails closed, defaults are stricter, and run and connection caps are shared across workers when
5
+ Redis is configured.
6
+
7
+ This release has **breaking changes**. Read "Before you upgrade" first.
8
+
9
+ ```bash
10
+ pip install -U "10xgraph-api==0.8.0"
11
+ ```
12
+
13
+ ## Before you upgrade
14
+
15
+ - **Authorization defaults to `ownership` whenever auth is on**, in every mode.
16
+ - Before, it was `allow_all` unless `MODE=production`.
17
+ - To keep the old development behaviour, set `"authorization": "allow_all"`.
18
+ - **Ownership checks fail closed.**
19
+ - With auth on, the server refuses to start if your checkpointer cannot resolve thread owners (`aget_thread_owner` not implemented).
20
+ - Implement it, or choose `allow_all` or a custom backend.
21
+ - **Unowned threads only allow creating actions.**
22
+ - Reading, deleting, stopping or fixing a thread that doesn't exist now answers 403.
23
+ - Before, these returned an empty result.
24
+ - **`gunicorn` is no longer a dependency.**
25
+ - Images built with `10xgraph build` install it themselves.
26
+ - If you run gunicorn yourself, install it alongside the API: `pip install gunicorn uvicorn-worker`.
27
+ - The worker class is now `uvicorn_worker.UvicornWorker`. Regenerate with `10xgraph build --force`, or update `-k`.
28
+ - **`POST /v1/graph/fix` returns `state` as a JSON object**, not a JSON-encoded string. Drop any `JSON.parse`/`json.loads` on that field.
29
+ - **`/v1/graph/invoke` no longer returns `meta.thread_name`.** The name is generated in the background and appears on the thread (`GET /v1/threads`).
30
+ - **Realtime init frames can no longer replace the system prompt** unless you add `"system_prompt"` to `websocket.realtime_client_overrides`.
31
+ - **`trusted_proxy_headers: true` now trusts only loopback and private networks.** List your proxies in `trusted_proxies`.
32
+ - **Production defaults are stricter:**
33
+ - `MEDIA_REQUIRE_OWNER` is on.
34
+ - `graph_introspection` is `scoped`, so the graph structure, tools and state schema need the `graph:read` scope.
35
+ - `IS_DEBUG` is forced off.
36
+ - **Production 4xx responses keep their message**; only 5xx responses are made generic.
37
+ - **Generated Dockerfiles install only the dependencies you list.** `10xgraph build` warns if your requirements file or `pyproject.toml` does not list `10xgraph-api`.
38
+
39
+ ## Security
40
+
41
+ - **Log injection:** values a client controls (ids, paths, rate-limit keys, run config, messages) are logged through `log_safe()`, so a request can't forge log lines.
42
+ - **ReDoS fix:** the JWT detection pattern in the log sanitizer now runs in linear time on crafted input.
43
+ - **Token revocation:** the new `token_revocation` key refuses revoked tokens before they expire, on HTTP and on every WebSocket run.
44
+ - **Size limit for WebSocket frames:** JSON frames over `MAX_REQUEST_SIZE` are refused.
45
+ - **Strict production checks:** `STRICT_PRODUCTION_CHECKS=true` refuses to start on wildcard `ALLOWED_HOST`/`ORIGINS` or enabled API docs.
46
+ - **Example fixes:** `examples/security/` no longer prints key or secret fragments, and API keys are hashed with HMAC-SHA-256 and `API_KEY_PEPPER`.
47
+
48
+ ## New
49
+
50
+ - **`runs` key:**
51
+ - `thread_ids` (`client` | `server`).
52
+ - `config_keys` and `state_keys` allow-lists.
53
+ - `max_concurrent_per_user`, default 10.
54
+ - `timeout`.
55
+ - **Readiness probe:** `GET /health/ready` checks the checkpointer, Redis and the store. The k8s manifest uses it.
56
+ - **Shared caps:** run and WebSocket connection caps are shared across workers through Redis when it is configured.
57
+ - **Lighter images:** Dockerfiles are built in two stages, so the runtime image ships only your code and a virtualenv: no compiler, no curl.
58
+ - **Dependency changes:**
59
+ - JSON responses are serialized by pydantic-core.
60
+ - `orjson` and `platformdirs` are dropped.
61
+ - The `uvicorn` floor is 0.36.
62
+
63
+ See `CHANGELOG.md` for the full list.
@@ -71,5 +71,37 @@ CORS combined with credentials in production. For anything else, in production s
71
71
  - `MODE=production` and `IS_DEBUG=false`
72
72
  - `ORIGINS` to an explicit comma-separated list, never `*`
73
73
  - `JWT_SECRET_KEY` to a random value of 32 characters or more
74
- - An `authorization` backend (production defaults to `ownership`; do not weaken it to
75
- `allow_all`)
74
+ - An `authorization` backend (it defaults to `ownership` whenever auth is on; do not weaken
75
+ it to `allow_all`)
76
+ - `STRICT_PRODUCTION_CHECKS=true` to refuse to start on wildcard `ALLOWED_HOST` or `ORIGINS`
77
+ or enabled API docs
78
+ - `runs.thread_ids: "server"` if thread ids could be guessed, so nobody can claim an id
79
+ before the user it was meant for
80
+ - `runs.config_keys` / `runs.state_keys` if a tool or node trusts a value such as `role` or
81
+ `plan` from request config or state; without them a client can send any non-reserved key
82
+ - `runs.timeout` and `runs.max_concurrent_per_user` to bound what one account can hold open
83
+ - `token_revocation` if you need logout or stolen-token revocation before a JWT expires
84
+ - `rate_limit.trusted_proxies` to your proxy's networks when `trusted_proxy_headers` is on
85
+ - Keep `graph_introspection: "scoped"` (the production default) unless every user may see
86
+ the graph's structure and tool schemas
87
+
88
+ ### Running more than one worker
89
+
90
+ Some protections keep state per process. With more than one worker or instance:
91
+
92
+ - **Thread ownership cache.** Each worker caches thread owners for 30 seconds. Configure
93
+ Redis (the `redis` key in `10xgraph.json` or `REDIS_URL`) so the cache, and the
94
+ tombstone a thread delete leaves behind, are shared. The tombstone stops a deleted thread
95
+ id from being given to a new owner while another worker may still cache the old one.
96
+ Without Redis the tombstone only exists on the worker that handled the delete, so for up
97
+ to 30 seconds another worker can still let the old owner into a thread recreated under
98
+ the same id.
99
+ - **Run and WebSocket caps** (`runs.max_concurrent_per_user`, `websocket.max_connections`,
100
+ `websocket.max_connections_per_user`). With Redis configured they are shared through
101
+ expiring leases, so the cap holds across workers and a crashed worker's slots free up on
102
+ their own within a minute. Without Redis each process counts its own, so the real cap is
103
+ the limit times the number of workers.
104
+ - **Rate limiting.** Use `"backend": "redis"` in `rate_limit`; the memory backend counts per
105
+ process.
106
+ - **Media extraction cache.** Extracted document text is cached per process. This only costs
107
+ repeated extraction work, not correctness.
@@ -1,13 +1,13 @@
1
1
  [build-system]
2
- requires = ["setuptools>=61.0", "wheel"]
2
+ requires = ["setuptools>=77.0", "wheel"]
3
3
  build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "10xgraph-api"
7
- version = "0.7.0"
7
+ version = "0.8.0"
8
8
  description = "Production server for 10xGraph agents (formerly 10xscale-agentflow-cli). Serves a compiled graph over REST, SSE, WebSocket, realtime audio and AG-UI with JWT or custom auth, scoped authorization on every endpoint, owner-only threads and rate limiting, and generates Docker Compose and Kubernetes files. Includes the 10xgraph CLI. MIT licensed, self-hosted."
9
9
  readme = "README.md"
10
- license = {text = "MIT"}
10
+ license = "MIT"
11
11
  requires-python = ">=3.12"
12
12
  authors = [
13
13
  {name = "Shudipto Trafder", email = "shudiptotrafder@gmail.com"},
@@ -48,7 +48,6 @@ keywords = [
48
48
  classifiers = [
49
49
  "Development Status :: 4 - Beta",
50
50
  "Intended Audience :: Developers",
51
- "License :: OSI Approved :: MIT License",
52
51
  "Operating System :: OS Independent",
53
52
  "Programming Language :: Python :: 3",
54
53
  "Programming Language :: Python :: 3.12",
@@ -64,13 +63,10 @@ dependencies = [
64
63
  # Pre-1.0 and major-version-risky deps are capped; floors are the versions
65
64
  # the suite is verified against.
66
65
  "fastapi>=0.116,<1.0",
67
- "gunicorn>=23.0,<24",
68
- "orjson>=3.11,<4",
69
- "platformdirs>=4.0,<5",
70
66
  "python-multipart>=0.0.19,<0.1",
71
67
  "pydantic>=2.13,<3",
72
68
  "pydantic-settings>=2.3,<3",
73
- "uvicorn>=0.30,<1.0",
69
+ "uvicorn>=0.36,<1.0",
74
70
  "typer>=0.17,<1.0",
75
71
  "python-dotenv>=1.0,<2",
76
72
  "questionary>=2.0,<3",
@@ -27,6 +27,19 @@ from tenxgraph_api.cli.core.validation import validate_cli_options
27
27
  from tenxgraph_api.cli.exceptions import ConfigurationError, ServerError
28
28
 
29
29
 
30
+ # Mirrors Settings.MAX_REQUEST_SIZE; read from the environment the command just loaded.
31
+ DEFAULT_MAX_REQUEST_SIZE = 10 * 1024 * 1024
32
+
33
+
34
+ def _max_request_size() -> int:
35
+ raw = os.environ.get("MAX_REQUEST_SIZE")
36
+ try:
37
+ value = int(raw) if raw else DEFAULT_MAX_REQUEST_SIZE
38
+ except ValueError:
39
+ return DEFAULT_MAX_REQUEST_SIZE
40
+ return value if value > 0 else DEFAULT_MAX_REQUEST_SIZE
41
+
42
+
30
43
  class APICommand(BaseCommand):
31
44
  """Command to start the 10xGraph API server."""
32
45
 
@@ -155,6 +168,9 @@ class APICommand(BaseCommand):
155
168
  port=validated_options["port"],
156
169
  reload=reload,
157
170
  workers=1,
171
+ # Refuse WebSocket frames over the HTTP body cap before buffering them
172
+ # (uvicorn's own default is 16 MiB).
173
+ ws_max_size=_max_request_size(),
158
174
  )
159
175
 
160
176
  return 0