10xgraph-api 0.7.0__tar.gz → 0.9.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 (232) hide show
  1. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/10xgraph_api.egg-info/PKG-INFO +60 -21
  2. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/10xgraph_api.egg-info/SOURCES.txt +7 -0
  3. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/10xgraph_api.egg-info/requires.txt +7 -4
  4. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/CHANGELOG.md +169 -0
  5. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/PKG-INFO +60 -21
  6. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/README.md +51 -14
  7. 10xgraph_api-0.9.0/RELEASE_NOTES.md +42 -0
  8. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/SECURITY.md +34 -2
  9. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/pyproject.toml +16 -13
  10. 10xgraph_api-0.9.0/tenxgraph_api/_slim_image.py +120 -0
  11. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/commands/api.py +17 -1
  12. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/commands/build.py +32 -2
  13. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/commands/demo.py +3 -4
  14. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/commands/init.py +128 -8
  15. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/config_editor/schema.py +133 -7
  16. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/config_editor/validation.py +32 -0
  17. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/constants.py +1 -1
  18. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/core/animations.py +0 -4
  19. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/main.py +14 -115
  20. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/defaults.py +83 -46
  21. 10xgraph_api-0.9.0/tenxgraph_api/cli/templates/dev/.env.example +1 -0
  22. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/dev/graph/agent.py +2 -2
  23. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/.env.example +3 -1
  24. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/evals/user_simulator_eval.py +2 -1
  25. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/graph/agent.py +7 -2
  26. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/pyproject.toml +2 -3
  27. 10xgraph_api-0.9.0/tenxgraph_api/cli/templates/prod/tests/conftest.py +6 -0
  28. 10xgraph_api-0.9.0/tenxgraph_api/cli/templates/prod/tests/test_graph_nodes.py +24 -0
  29. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/SKILL.md +5 -5
  30. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/api-client.md +7 -7
  31. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/architecture.md +5 -5
  32. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/auth-and-authorization.md +1 -1
  33. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/callbacks-and-command.md +1 -1
  34. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/checkpointing-and-threads.md +1 -1
  35. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/cli-commands.md +9 -13
  36. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/client-auth-and-errors.md +12 -12
  37. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/client-messages-invoke-stream.md +8 -8
  38. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/client-threads-memory-files.md +5 -5
  39. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/media-and-files.md +1 -1
  40. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/memory-and-store.md +1 -1
  41. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/production-runtime.md +2 -3
  42. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/realtime.md +1 -1
  43. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/remote-tools.md +1 -1
  44. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/state-and-messages.md +1 -1
  45. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/streaming.md +2 -2
  46. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/copilot/10xgraph.instructions.md +4 -4
  47. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/auth/authorization.py +115 -25
  48. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/auth/base_auth.py +5 -0
  49. 10xgraph_api-0.9.0/tenxgraph_api/src/app/core/auth/identity_cache.py +68 -0
  50. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/auth/jwt_auth.py +3 -0
  51. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/auth/ownership_resolver.py +75 -6
  52. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/auth/permissions.py +58 -5
  53. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/auth/request_config.py +59 -0
  54. 10xgraph_api-0.9.0/tenxgraph_api/src/app/core/auth/revocation.py +219 -0
  55. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/auth/route_guard.py +1 -0
  56. 10xgraph_api-0.9.0/tenxgraph_api/src/app/core/concurrency.py +200 -0
  57. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/config/graph_config.py +220 -5
  58. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/config/media_settings.py +12 -3
  59. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/config/settings.py +22 -5
  60. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/config/setup_middleware.py +78 -82
  61. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/exceptions/handle_errors.py +8 -2
  62. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/middleware/rate_limit/factory.py +5 -2
  63. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/middleware/rate_limit/keying.py +24 -9
  64. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/middleware/rate_limit/middleware.py +39 -20
  65. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/middleware/security_headers.py +44 -62
  66. 10xgraph_api-0.9.0/tenxgraph_api/src/app/core/utils/container.py +21 -0
  67. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/utils/log_sanitizer.py +10 -1
  68. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/loader.py +138 -17
  69. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/main.py +28 -5
  70. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/ag_ui/converter.py +8 -6
  71. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/ag_ui/router.py +16 -8
  72. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/checkpointer/services/checkpointer_service.py +60 -9
  73. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/graph/realtime_guard.py +54 -6
  74. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/graph/router.py +144 -43
  75. 10xgraph_api-0.9.0/tenxgraph_api/src/app/routers/graph/run_limits.py +100 -0
  76. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/graph/services/graph_service.py +246 -73
  77. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/graph/services/multimodal_preprocessor.py +5 -2
  78. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/media/__init__.py +33 -8
  79. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/media/router.py +58 -21
  80. 10xgraph_api-0.9.0/tenxgraph_api/src/app/routers/ping/readiness.py +142 -0
  81. 10xgraph_api-0.9.0/tenxgraph_api/src/app/routers/ping/router.py +65 -0
  82. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/setup_router.py +44 -2
  83. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/utils/callable_helper.py +1 -1
  84. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/utils/response_helper.py +26 -5
  85. 10xgraph_api-0.7.0/RELEASE_NOTES.md +0 -51
  86. 10xgraph_api-0.7.0/tenxgraph_api/cli/templates/dev/.env.example +0 -1
  87. 10xgraph_api-0.7.0/tenxgraph_api/cli/templates/prod/tests/conftest.py +0 -6
  88. 10xgraph_api-0.7.0/tenxgraph_api/cli/templates/prod/tests/test_graph_nodes.py +0 -57
  89. 10xgraph_api-0.7.0/tenxgraph_api/src/app/routers/ping/router.py +0 -28
  90. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/10xgraph.json +0 -0
  91. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/10xgraph_api.egg-info/dependency_links.txt +0 -0
  92. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/10xgraph_api.egg-info/entry_points.txt +0 -0
  93. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/10xgraph_api.egg-info/not-zip-safe +0 -0
  94. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/10xgraph_api.egg-info/top_level.txt +0 -0
  95. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/CODE_OF_CONDUCT.md +0 -0
  96. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/CONTRIBUTING.md +0 -0
  97. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/LICENSE +0 -0
  98. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/MANIFEST.in +0 -0
  99. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/agentflow_cli/__init__.py +0 -0
  100. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/setup.cfg +0 -0
  101. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/__init__.py +0 -0
  102. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/__init__.py +0 -0
  103. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/capabilities.py +0 -0
  104. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/commands/__init__.py +0 -0
  105. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/commands/audit.py +0 -0
  106. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/commands/config.py +0 -0
  107. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/commands/eval.py +0 -0
  108. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/commands/skills.py +0 -0
  109. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/commands/test.py +0 -0
  110. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/commands/version.py +0 -0
  111. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/config_editor/__init__.py +0 -0
  112. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/config_editor/server.py +0 -0
  113. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/config_editor/static/app.css +0 -0
  114. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/config_editor/static/app.js +0 -0
  115. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/config_editor/static/favicon.svg +0 -0
  116. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/config_editor/static/index.html +0 -0
  117. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/config_editor/store.py +0 -0
  118. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/context.py +0 -0
  119. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/core/__init__.py +0 -0
  120. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/core/config.py +0 -0
  121. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/core/output.py +0 -0
  122. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/core/prompts.py +0 -0
  123. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/core/screen.py +0 -0
  124. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/core/steps.py +0 -0
  125. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/core/theme.py +0 -0
  126. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/core/validation.py +0 -0
  127. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/exceptions.py +0 -0
  128. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/logger.py +0 -0
  129. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/__init__.py +0 -0
  130. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/dev/10xgraph.json +0 -0
  131. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/dev/graph/__init__.py +0 -0
  132. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/.pre-commit-config.yaml +0 -0
  133. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/.python-version +0 -0
  134. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/10xgraph.json +0 -0
  135. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/auth/__init__.py +0 -0
  136. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/auth/agent_auth.py +0 -0
  137. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/evals/__init__.py +0 -0
  138. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/evals/weather_agents_eval.py +0 -0
  139. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/graph/__init__.py +0 -0
  140. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/graph/state.py +0 -0
  141. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/graph/thread_name_generator.py +0 -0
  142. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/graph/tools/__init__.py +0 -0
  143. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/graph/tools/weather_tool.py +0 -0
  144. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/graph/validators/__init__.py +0 -0
  145. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/graph/validators/lifecyle.py +0 -0
  146. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/graph/validators/manager.py +0 -0
  147. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/graph/validators/validators.py +0 -0
  148. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/tests/__init__.py +0 -0
  149. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/tests/test_agent_eval.py +0 -0
  150. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/prod/tests/test_catalog_tools.py +0 -0
  151. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/agents-and-tools.md +0 -0
  152. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/api-configuration.md +0 -0
  153. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/api-settings-and-middleware.md +0 -0
  154. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/context-id-background.md +0 -0
  155. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/dependency-injection.md +0 -0
  156. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/evaluation.md +0 -0
  157. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/id-and-thread-name-generators.md +0 -0
  158. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/prebuilt-agents-and-tools.md +0 -0
  159. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/providers-and-adapters.md +0 -0
  160. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/publishers-and-runtime-protocols.md +0 -0
  161. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/rate-limiting.md +0 -0
  162. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/rest-api-and-errors.md +0 -0
  163. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/security-and-validators.md +0 -0
  164. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/state-graph.md +0 -0
  165. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/stream-emitter.md +0 -0
  166. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/testing-and-evaluation.md +0 -0
  167. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/unit-testing.md +0 -0
  168. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/py.typed +0 -0
  169. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/__init__.py +0 -0
  170. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/__init__.py +0 -0
  171. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/__init__.py +0 -0
  172. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/auth/__init__.py +0 -0
  173. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/auth/auth_backend.py +0 -0
  174. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/config/__init__.py +0 -0
  175. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/config/sentry_config.py +0 -0
  176. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/config/setup_logs.py +0 -0
  177. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/config/worker_middleware.py +0 -0
  178. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/exceptions/__init__.py +0 -0
  179. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/exceptions/general_exception.py +0 -0
  180. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/exceptions/resources_exceptions.py +0 -0
  181. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/exceptions/user_exception.py +0 -0
  182. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/middleware/__init__.py +0 -0
  183. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/middleware/rate_limit/__init__.py +0 -0
  184. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/middleware/rate_limit/base.py +0 -0
  185. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/middleware/rate_limit/memory.py +0 -0
  186. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/middleware/rate_limit/redis.py +0 -0
  187. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/middleware/request_limits.py +0 -0
  188. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/core/utils/__init__.py +0 -0
  189. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/__init__.py +0 -0
  190. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/ag_ui/__init__.py +0 -0
  191. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/ag_ui/event_mapper.py +0 -0
  192. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/ag_ui/service.py +0 -0
  193. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/checkpointer/__init__.py +0 -0
  194. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/checkpointer/router.py +0 -0
  195. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/checkpointer/schemas/__init__.py +0 -0
  196. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/checkpointer/schemas/checkpointer_schemas.py +0 -0
  197. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/checkpointer/services/__init__.py +0 -0
  198. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/evals/__init__.py +0 -0
  199. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/evals/router.py +0 -0
  200. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/evals/services/__init__.py +0 -0
  201. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/evals/services/eval_report_service.py +0 -0
  202. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/graph/__init__.py +0 -0
  203. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/graph/schemas/__init__.py +0 -0
  204. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/graph/schemas/graph_schemas.py +0 -0
  205. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/graph/services/__init__.py +0 -0
  206. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/media/schemas.py +0 -0
  207. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/ping/__init__.py +0 -0
  208. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/store/__init__.py +0 -0
  209. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/store/router.py +0 -0
  210. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/store/schemas/__init__.py +0 -0
  211. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/store/schemas/store_schemas.py +0 -0
  212. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/store/services/__init__.py +0 -0
  213. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/routers/store/services/store_service.py +0 -0
  214. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/tasks/__init__.py +0 -0
  215. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/tasks/user_tasks.py +0 -0
  216. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/utils/__init__.py +0 -0
  217. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/utils/media/__init__.py +0 -0
  218. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/utils/media/extractor.py +0 -0
  219. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/utils/media/pipeline.py +0 -0
  220. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/utils/parse_output.py +0 -0
  221. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/utils/schemas/__init__.py +0 -0
  222. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/utils/schemas/output_schemas.py +0 -0
  223. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/utils/schemas/user_schemas.py +0 -0
  224. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/utils/snowflake_id_generator.py +0 -0
  225. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/utils/swagger_helper.py +0 -0
  226. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/utils/telemetry_store.py +0 -0
  227. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/utils/thread_name_generator.py +0 -0
  228. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tenxgraph_api/src/app/worker.py +0 -0
  229. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tests/test_agentflow_cli_alias.py +0 -0
  230. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tests/test_multimodal_sprint2_extraction.py +0 -0
  231. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.0}/tests/test_sprint4_media_api.py +0 -0
  232. {10xgraph_api-0.7.0 → 10xgraph_api-0.9.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.9.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,11 +13,12 @@ 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
20
19
  Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
21
+ Classifier: Programming Language :: Python :: 3.15
21
22
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
23
  Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
23
24
  Requires-Python: >=3.12
@@ -25,13 +26,10 @@ Description-Content-Type: text/markdown
25
26
  License-File: LICENSE
26
27
  Requires-Dist: 10xgraph<2.0,>=0.10.0
27
28
  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
29
  Requires-Dist: python-multipart<0.1,>=0.0.19
32
30
  Requires-Dist: pydantic<3,>=2.13
33
31
  Requires-Dist: pydantic-settings<3,>=2.3
34
- Requires-Dist: uvicorn<1.0,>=0.30
32
+ Requires-Dist: uvicorn<1.0,>=0.36
35
33
  Requires-Dist: typer<1.0,>=0.17
36
34
  Requires-Dist: python-dotenv<2,>=1.0
37
35
  Requires-Dist: questionary<3,>=2.0
@@ -49,6 +47,8 @@ Provides-Extra: jwt
49
47
  Requires-Dist: PyJWT<3,>=2.8; extra == "jwt"
50
48
  Provides-Extra: media
51
49
  Requires-Dist: textxtract[docx,html,md,pdf,xml]>=0.2.0; extra == "media"
50
+ Provides-Extra: images
51
+ Requires-Dist: 10xgraph[images]<2.0,>=0.10.0; extra == "images"
52
52
  Provides-Extra: gcloud
53
53
  Requires-Dist: google-cloud-logging; extra == "gcloud"
54
54
  Provides-Extra: otel
@@ -58,6 +58,8 @@ Requires-Dist: opentelemetry-instrumentation-fastapi>=0.40b0; extra == "otel"
58
58
  Requires-Dist: opentelemetry-exporter-otlp>=1.20.0; extra == "otel"
59
59
  Provides-Extra: ag-ui
60
60
  Requires-Dist: ag-ui-protocol<2,>=1.0; extra == "ag-ui"
61
+ Provides-Extra: websocket
62
+ Requires-Dist: websockets<17,>=13.0; extra == "websocket"
61
63
  Dynamic: license-file
62
64
 
63
65
  # 10xGraph API
@@ -93,7 +95,7 @@ Not built in: automatic per-tool permissions (user A may call `refund`, user B m
93
95
  |---|---|---|
94
96
  | [`10xgraph`](https://github.com/10xGraph/10xGraph) | Core engine: graph, state, replay-safe tools, checkpointing, memory | `pip install 10xgraph` (pulled in by this package) |
95
97
  | `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`) |
98
+ | [`10xgraph-client`](https://github.com/10xGraph/10xgraph-client) | Typed TypeScript client for every endpoint | `npm install 10xgraph-client` |
97
99
 
98
100
  Docs: [10xgraph.com](https://10xgraph.com).
99
101
 
@@ -151,11 +153,17 @@ Optional extras; install only what you configure:
151
153
  pip install "10xgraph-api[redis]" # Redis rate-limit / cache backend
152
154
  pip install "10xgraph-api[jwt]" # JWT authentication
153
155
  pip install "10xgraph-api[media]" # Document text extraction (multimodal)
156
+ pip install "10xgraph-api[images]" # Image resize / EXIF / format conversion (Pillow)
157
+ pip install "10xgraph-api[ag-ui]" # AG-UI endpoint
158
+ pip install "10xgraph-api[websocket]" # WebSocket streaming + realtime audio
154
159
  pip install "10xgraph-api[otel]" # OpenTelemetry tracing
155
160
  pip install "10xgraph-api[snowflakekit]" # Snowflake ID generation
161
+ pip install "10xgraph-api[sentry]" # Sentry error reporting
162
+ pip install "10xgraph-api[firebase]" # Firebase Admin SDK
163
+ pip install "10xgraph-api[gcloud]" # Google Cloud Logging
156
164
  ```
157
165
 
158
- Requires Python 3.12 or newer. Installs the core `10xgraph` framework as a dependency.
166
+ Requires Python 3.12 or newer. Tested on 3.12, 3.13, 3.14 and 3.15. Installs the core `10xgraph` framework as a dependency.
159
167
 
160
168
  ---
161
169
 
@@ -175,9 +183,6 @@ Requires Python 3.12 or newer. Installs the core `10xgraph` framework as a depen
175
183
  10xgraph build --docker-compose
176
184
  ```
177
185
 
178
- `10xgraph api` (server only) and `10xgraph play` (server + playground) remain
179
- available; `dev` is the goal-oriented wrapper around them.
180
-
181
186
  ---
182
187
 
183
188
  ## CLI commands
@@ -195,9 +200,17 @@ Initialize a new project with configuration and a sample graph.
195
200
  10xgraph init --path ./my-app --name MyAgent --template quick-start \
196
201
  --non-interactive # reproducible CI/agent workflow
197
202
  10xgraph init --path ./my-app --template production --auth jwt \
198
- --rate-limit redis --yes --dry-run
203
+ --rate-limit redis --provider openai --yes --dry-run
199
204
  ```
200
205
 
206
+ `init` asks which AI provider to use (`--provider google|openai|anthropic`, default `google`)
207
+ and writes the matching model and API key variable. It also asks whether to enable WebSocket
208
+ streaming and realtime audio (`--websocket`, default off); off leaves `/v1/graph/ws` and
209
+ `/v1/graph/live` unmounted and installs no WebSocket library. A production project's `pyproject.toml`
210
+ lists only what your answers need, for example `10xgraph[openai]` and
211
+ `10xgraph-api[jwt,redis]`, and `10xgraph build` installs exactly that list, so no separate
212
+ `requirements.txt` is needed.
213
+
201
214
  ### `10xgraph dev`
202
215
 
203
216
  Start the development API server and open the hosted playground when it is ready.
@@ -209,16 +222,18 @@ Start the development API server and open the hosted playground when it is ready
209
222
  10xgraph dev --no-open --no-reload # API only, without auto-reload
210
223
  ```
211
224
 
212
- `10xgraph api` and `10xgraph play` remain available as compatibility commands.
225
+ `dev` is the only server command: the old `api` and `play` commands were removed
226
+ (use `10xgraph dev --no-open` and `10xgraph dev`). It runs Uvicorn with reload for local
227
+ work; production runs Gunicorn in the image from `10xgraph build`.
213
228
 
214
229
  ### Adaptive and structured output
215
230
 
216
231
  ```bash
217
- 10xgraph play # branded intro, then output in your scrollback
232
+ 10xgraph dev # branded intro, then output in your scrollback
218
233
  10xgraph demo # preview every animation theme safely
219
234
  10xgraph demo --style build # one theme: typing, network, init, build, or eval
220
- 10xgraph --fullscreen play # opt-in pinned header/footer surface
221
- 10xgraph --no-animation play # accessible/static workflow
235
+ 10xgraph --fullscreen dev # opt-in pinned header/footer surface
236
+ 10xgraph --no-animation dev # accessible/static workflow
222
237
  10xgraph --format plain --no-color audit
223
238
  10xgraph --format jsonl eval --parallel
224
239
  10xgraph --quiet build
@@ -577,7 +592,7 @@ sdist + wheel, checks the distribution metadata, and creates a GitHub Release wi
577
592
  notes and the artifacts attached. PyPI publishing is manual (`make publish`).
578
593
 
579
594
  ```bash
580
- git tag v0.7.0 && git push origin v0.7.0
595
+ git tag v0.9.0 && git push origin v0.9.0
581
596
  ```
582
597
 
583
598
  ---
@@ -601,9 +616,33 @@ git tag v0.7.0 && git push origin v0.7.0
601
616
 
602
617
  ## Contributing
603
618
 
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.
619
+ **Your avatar belongs on this wall.**
620
+
621
+ <a href="https://github.com/10xGraph/10xgraph-api/graphs/contributors">
622
+ <img src="https://contrib.rocks/image?repo=10xGraph/10xgraph-api" alt="People who have contributed to 10xgraph-api" />
623
+ </a>
624
+
625
+ 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).
626
+
627
+ Your first pull request can be small. These are real, self-contained, and useful today:
628
+
629
+ - **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.
630
+ - **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.
631
+ - **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.
632
+ - **Turn a bug into a failing test.** Open it as a draft pull request; the fix can come later.
633
+
634
+ From clone to a passing check:
635
+
636
+ ```bash
637
+ git clone https://github.com/10xGraph/10xgraph-api.git
638
+ cd 10xgraph-api
639
+ uv sync --dev
640
+ uv run pytest
641
+ uv run pre-commit run --all-files # ruff, bandit and hygiene checks, as in CI
642
+ uv run mypy
643
+ ```
644
+
645
+ 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
646
 
608
647
  ---
609
648
 
@@ -17,6 +17,7 @@ pyproject.toml
17
17
  10xgraph_api.egg-info/top_level.txt
18
18
  agentflow_cli/__init__.py
19
19
  tenxgraph_api/__init__.py
20
+ tenxgraph_api/_slim_image.py
20
21
  tenxgraph_api/py.typed
21
22
  tenxgraph_api/cli/__init__.py
22
23
  tenxgraph_api/cli/capabilities.py
@@ -126,14 +127,17 @@ tenxgraph_api/src/app/loader.py
126
127
  tenxgraph_api/src/app/main.py
127
128
  tenxgraph_api/src/app/worker.py
128
129
  tenxgraph_api/src/app/core/__init__.py
130
+ tenxgraph_api/src/app/core/concurrency.py
129
131
  tenxgraph_api/src/app/core/auth/__init__.py
130
132
  tenxgraph_api/src/app/core/auth/auth_backend.py
131
133
  tenxgraph_api/src/app/core/auth/authorization.py
132
134
  tenxgraph_api/src/app/core/auth/base_auth.py
135
+ tenxgraph_api/src/app/core/auth/identity_cache.py
133
136
  tenxgraph_api/src/app/core/auth/jwt_auth.py
134
137
  tenxgraph_api/src/app/core/auth/ownership_resolver.py
135
138
  tenxgraph_api/src/app/core/auth/permissions.py
136
139
  tenxgraph_api/src/app/core/auth/request_config.py
140
+ tenxgraph_api/src/app/core/auth/revocation.py
137
141
  tenxgraph_api/src/app/core/auth/route_guard.py
138
142
  tenxgraph_api/src/app/core/config/__init__.py
139
143
  tenxgraph_api/src/app/core/config/graph_config.py
@@ -159,6 +163,7 @@ tenxgraph_api/src/app/core/middleware/rate_limit/memory.py
159
163
  tenxgraph_api/src/app/core/middleware/rate_limit/middleware.py
160
164
  tenxgraph_api/src/app/core/middleware/rate_limit/redis.py
161
165
  tenxgraph_api/src/app/core/utils/__init__.py
166
+ tenxgraph_api/src/app/core/utils/container.py
162
167
  tenxgraph_api/src/app/core/utils/log_sanitizer.py
163
168
  tenxgraph_api/src/app/routers/__init__.py
164
169
  tenxgraph_api/src/app/routers/setup_router.py
@@ -180,6 +185,7 @@ tenxgraph_api/src/app/routers/evals/services/eval_report_service.py
180
185
  tenxgraph_api/src/app/routers/graph/__init__.py
181
186
  tenxgraph_api/src/app/routers/graph/realtime_guard.py
182
187
  tenxgraph_api/src/app/routers/graph/router.py
188
+ tenxgraph_api/src/app/routers/graph/run_limits.py
183
189
  tenxgraph_api/src/app/routers/graph/schemas/__init__.py
184
190
  tenxgraph_api/src/app/routers/graph/schemas/graph_schemas.py
185
191
  tenxgraph_api/src/app/routers/graph/services/__init__.py
@@ -189,6 +195,7 @@ tenxgraph_api/src/app/routers/media/__init__.py
189
195
  tenxgraph_api/src/app/routers/media/router.py
190
196
  tenxgraph_api/src/app/routers/media/schemas.py
191
197
  tenxgraph_api/src/app/routers/ping/__init__.py
198
+ tenxgraph_api/src/app/routers/ping/readiness.py
192
199
  tenxgraph_api/src/app/routers/ping/router.py
193
200
  tenxgraph_api/src/app/routers/store/__init__.py
194
201
  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
@@ -22,6 +19,9 @@ oauth2client>=4.1.3
22
19
  [gcloud]
23
20
  google-cloud-logging
24
21
 
22
+ [images]
23
+ 10xgraph[images]<2.0,>=0.10.0
24
+
25
25
  [jwt]
26
26
  PyJWT<3,>=2.8
27
27
 
@@ -42,3 +42,6 @@ sentry-sdk>=2.10.0
42
42
 
43
43
  [snowflakekit]
44
44
  snowflakekit<1.0,>=0.1.1
45
+
46
+ [websocket]
47
+ websockets<17,>=13.0
@@ -20,6 +20,173 @@ project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
20
20
 
21
21
  ---
22
22
 
23
+ ## [Unreleased]
24
+
25
+ ## [0.9.0] - 2026-10-22
26
+
27
+ One server command, a guided `10xgraph init`, leaner production images and Python 3.14 and
28
+ 3.15 support. This release has a breaking change: read the **Breaking** list before upgrading.
29
+
30
+ ### Breaking
31
+
32
+ - **`10xgraph api` and `10xgraph play` are removed; `10xgraph dev` is the only server command.**
33
+ All three ran the same local Uvicorn dev server. Migration: `10xgraph api` ->
34
+ `10xgraph dev --no-open`, `10xgraph play` -> `10xgraph dev`. Options are unchanged
35
+ (`--config`, `--host`, `--port`, `--reload/--no-reload`). `10xgraph demo --style` no longer
36
+ accepts the `play` / `api` aliases. Production is unaffected: the image from `10xgraph build`
37
+ runs Gunicorn directly.
38
+
39
+ ### Added
40
+
41
+ - **Python 3.14 and 3.15 are officially supported.** The test suite runs on 3.12, 3.13, 3.14
42
+ and 3.15 in CI, and the package classifiers list all four.
43
+ - **`websocket.enabled` in `10xgraph.json`** turns the WebSocket routes on or off. `false` leaves
44
+ out `/v1/graph/ws` and `/v1/graph/live`, so the server needs no WebSocket library. `true`
45
+ without one refuses to boot with the install hint. Unset keeps them mounted, as before, but
46
+ now logs a warning when no library is installed (previously a non-Google project silently
47
+ answered 404 on both routes, because only `google-genai` brought in `websockets`).
48
+ - **`10xgraph-api[websocket]` extra** (`websockets`) for those routes.
49
+ - **`10xgraph init` asks whether to enable WebSocket streaming and realtime audio**
50
+ (`--websocket/--no-websocket`, default off). Yes adds the `websocket` extra to a production
51
+ `pyproject.toml` and writes `"websocket": {"enabled": true}`; no writes `false`.
52
+ - **`10xgraph init` asks for the AI provider** (Google Gemini, OpenAI or Anthropic Claude;
53
+ `--provider` for non-interactive runs, default `google`). The scaffold's model, provider,
54
+ `.env.example` API key, test conftest and eval simulator model follow the answer.
55
+ - **`10xgraph-api[images]` extra.** Pillow is optional in core `10xgraph`; this extra installs it
56
+ for image resize, EXIF orientation and format conversion.
57
+
58
+ ### Changed
59
+
60
+ - Replaced `asyncio.iscoroutinefunction`, which is removed in Python 3.16, with
61
+ `inspect.iscoroutinefunction`. No behaviour change.
62
+ - **Production scaffolds list only the dependencies the answers need.** `pyproject.toml` now
63
+ depends on `10xgraph[<provider>]` and `10xgraph-api[jwt,redis]` as chosen (no extras when
64
+ neither is picked), and drops the hardcoded `google-genai`. The generated Dockerfile installs
65
+ this list, so JWT and Redis work in the image without a separate `requirements.txt`.
66
+ - **The generated Dockerfile removes pip and the CLI's own libraries from the image.** typer,
67
+ rich, questionary and what only they pull in (pygments, markdown-it-py, mdurl, prompt-toolkit,
68
+ wcwidth, shellingham) are uninstalled in the builder stage by `tenxgraph_api/_slim_image.py`,
69
+ unless another installed package still needs them. With pip, about 38 MB smaller.
70
+ - Dropped unused dev dependencies (`mkdocs-gen-files`, `mkdocstrings`, `mypy-extensions`,
71
+ `lib`, `markdown-it-py`).
72
+
73
+ ### Fixed
74
+
75
+ - **`10xgraph init` generated a `pyproject.toml` claiming Python 3.10.** The template said
76
+ `requires-python = ">=3.10"`, but `10xgraph` needs 3.12, so installing a generated project
77
+ on 3.10 or 3.11 failed. It now says `>=3.12`.
78
+ - **Redis rate limiting from a URL crashed at startup** with `NameError: Redis`: the class was
79
+ imported only for type checking but used at runtime to bind the client.
80
+ - **A production scaffold with the Redis rate limiter did not start:** `10xgraph.json` had no
81
+ Redis URL. It now reads `"redis": {"url": "${REDIS_URL}"}` from `.env`.
82
+ - **A production scaffold did not start at all:** `10xgraph.json` points at
83
+ `graph.agent:container`, which the template never defined. `graph/agent.py` now exports it.
84
+ - **The production scaffold's `tests/test_graph_nodes.py` failed on collection** (it imported
85
+ `graph.nodes` and `graph.utils`, which the template does not create). It now tests the agent
86
+ in `graph/agent.py`.
87
+
88
+ ## [0.8.0] - 2026-10-16
89
+
90
+ Security and scalability pass over the API, following an external review. Every item below
91
+ has tests; see the review notes for the full list. This release has breaking changes: read
92
+ the **Breaking** list before upgrading.
93
+
94
+ ### Breaking
95
+
96
+ - **Ownership checks fail closed.** With auth on, an ownership or `rbac` authorization
97
+ backend now refuses to start on a checkpointer that cannot resolve thread owners
98
+ (`aget_thread_owner` not implemented), and denies thread requests if none is available at
99
+ runtime. Implement `aget_thread_owner`, or set `"authorization": "allow_all"` or a custom
100
+ backend.
101
+ - **An unowned thread only allows actions that create it** (`graph:invoke`, `graph:stream`,
102
+ `checkpointer:write`). Reading, deleting, stopping or fixing a thread that does not exist
103
+ (or has no owner) now answers 403 instead of an empty result.
104
+ - **Authorization defaults to `ownership` whenever auth is configured**, in every mode. It
105
+ used to be `allow_all` unless `MODE=production`. Set `"authorization": "allow_all"` to keep
106
+ the old development behaviour.
107
+ - **Realtime init frames can no longer replace the system prompt by default.** Add
108
+ `"system_prompt"` to `websocket.realtime_client_overrides` to allow it.
109
+ - **`trusted_proxy_headers: true` without `trusted_proxies` trusts only loopback and private
110
+ networks**, not every peer. List your proxy networks (or `0.0.0.0/0` and `::/0`).
111
+ - **Production defaults:** `MEDIA_REQUIRE_OWNER` is on, `graph_introspection` is `scoped`
112
+ (graph structure, tools and state schema need the `graph:read` scope), and `IS_DEBUG` is
113
+ forced off.
114
+ - **`/v1/graph/invoke` no longer returns `meta.thread_name`**; the name is generated in the
115
+ background and appears on the thread (`GET /v1/threads`).
116
+ - **Production 4xx responses keep their message**; only 5xx are made generic. A 422 built
117
+ from an unexpected `ValueError` is still made generic.
118
+ - **`gunicorn` is no longer a dependency.** The generated Dockerfile installs it, so
119
+ `10xgraph build` images are unaffected. If you run `gunicorn` yourself outside that image,
120
+ install it alongside the API: `pip install gunicorn uvicorn-worker`.
121
+ - **Gunicorn's worker class is now `uvicorn_worker.UvicornWorker`** (from the `uvicorn-worker`
122
+ package). `uvicorn.workers.UvicornWorker` is deprecated in uvicorn. Regenerate the
123
+ Dockerfile and compose file with `10xgraph build --force`, or change `-k` in your own
124
+ command.
125
+ - **`POST /v1/graph/fix` returns `state` as a JSON object.** It used to be a JSON-encoded
126
+ string. Drop any `JSON.parse` / `json.loads` on that field; the TS client already types it
127
+ as an object.
128
+ - **Generated Dockerfiles install only the dependencies you list.** The `pyproject.toml` path
129
+ no longer adds `10xgraph-api` on top of your list. `10xgraph build` warns when the requirements file or `pyproject.toml` does not list
130
+ `10xgraph-api`.
131
+
132
+ ### Added
133
+
134
+ - `runs` key in `10xgraph.json`: `thread_ids` (`client` | `server`), `config_keys` and
135
+ `state_keys` allow-lists, `max_concurrent_per_user` (default 10) and `timeout`.
136
+ - `token_revocation` key (`redis`, `memory` or `module:attr`) and the
137
+ `TokenRevocationBackend` hook: revoked tokens are refused before they expire, on HTTP and
138
+ on every WebSocket run.
139
+ - `graph_introspection` key (`open` | `scoped`).
140
+ - `websocket.realtime_client_overrides` allow-list.
141
+ - `STRICT_PRODUCTION_CHECKS=true`: production refuses to start on wildcard `ALLOWED_HOST` or
142
+ `ORIGINS`, or enabled API docs.
143
+ - `GET /health/ready` readiness probe (checkpointer, Redis, store); the k8s manifest uses it.
144
+ - Run and WebSocket connection caps are shared across workers through Redis when it is
145
+ configured.
146
+
147
+ ### Changed
148
+
149
+ - `10xgraph play` and `10xgraph dev` open the hosted playground at its new address,
150
+ `https://play.10xgraph.com`. The previous address, `playground-463bd.web.app`, still
151
+ serves the same app for older releases.
152
+ - Thread delete leaves a short tombstone so a deleted id cannot be handed to another user
153
+ while other workers still cache the old owner.
154
+ - Every thread the API saves records its owner, which fixes owner lookups on the in-memory
155
+ and SQLite checkpointers.
156
+ - WebSocket JSON frames over `MAX_REQUEST_SIZE` are refused (close 1009); `10xgraph api`
157
+ passes the same limit to uvicorn as `ws_max_size`.
158
+ - Request ID, security headers and rate limiting are pure ASGI middleware; CORS is now the
159
+ outermost layer, so 429, 413 and Host rejections are readable by browsers.
160
+ - Route-set security headers (such as the download sandbox CSP) are no longer overwritten.
161
+ - The JWT is verified once per request when rate limiting by user.
162
+ - Local-store downloads stream from disk; uploads are read into memory once.
163
+ - JSON responses are serialized by pydantic-core (`model_dump_json`) instead of orjson.
164
+ FastAPI deprecated `ORJSONResponse` in 0.131; the FastAPI floor stays at 0.116.
165
+ - Dependencies: dropped `orjson` and the unused `platformdirs`; the `uvicorn` floor is now
166
+ 0.36 (required by `uvicorn-worker`).
167
+ - Generated Dockerfiles build in two stages: dependencies go into a virtualenv in a builder
168
+ stage, and only that virtualenv and your code reach the runtime image. The runtime image
169
+ has no compiler or curl, copies code with `COPY --chown` instead of a second `chown -R`
170
+ layer, and its healthcheck uses the Python standard library.
171
+ - A requirements file in a subfolder (for example `requirements/base.txt`) keeps its path in
172
+ the generated Dockerfile.
173
+ - Packaging: `license` is an SPDX expression (`MIT`), so builds no longer warn about the
174
+ deprecated table form; the build needs setuptools 77 or later.
175
+
176
+ ### Security
177
+
178
+ - **Log injection.** Values a client controls (user and thread ids, file ids, rate-limit
179
+ keys, request paths, run config and messages) are written to logs through `log_safe()`,
180
+ which escapes CR and LF, so a request cannot forge extra log lines. This covers the graph,
181
+ checkpointer and media services, the rate-limit middleware, the WebSocket guard and the
182
+ run limits.
183
+ - **ReDoS in the log sanitizer.** The JWT detection pattern backtracked polynomially on
184
+ crafted input (about 585 ms for a 16,000-character string). It now matches in linear time.
185
+ - **Security examples.** `examples/security/` no longer prints any part of an API key or of
186
+ the JWT secret. The API key example hashes keys with HMAC-SHA-256 and a server-side
187
+ `API_KEY_PEPPER`; hashes made with the previous example's plain SHA-256 must be
188
+ regenerated.
189
+
23
190
  ## [0.7.0] - 2026-10-10
24
191
 
25
192
  **First release as `10xgraph-api`.** 10xScale Agentflow is now 10xGraph. This package
@@ -351,6 +518,8 @@ can be pinned.
351
518
  Initial entry in this changelog. Releases before `0.5.0` were not tracked here; see the
352
519
  GitHub release history for their notes.
353
520
 
521
+ [Unreleased]: https://github.com/10xGraph/10xgraph-api/compare/v0.8.0...HEAD
522
+ [0.8.0]: https://github.com/10xGraph/10xgraph-api/compare/v0.7.0...v0.8.0
354
523
  [0.7.0]: https://github.com/10xGraph/10xgraph-api/compare/v0.6.0...v0.7.0
355
524
  [0.6.0]: https://github.com/10xHub/agentflow-cli/compare/v0.5.1...v0.6.0
356
525
  [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.9.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,11 +13,12 @@ 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
20
19
  Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
21
+ Classifier: Programming Language :: Python :: 3.15
21
22
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
23
  Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
23
24
  Requires-Python: >=3.12
@@ -25,13 +26,10 @@ Description-Content-Type: text/markdown
25
26
  License-File: LICENSE
26
27
  Requires-Dist: 10xgraph<2.0,>=0.10.0
27
28
  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
29
  Requires-Dist: python-multipart<0.1,>=0.0.19
32
30
  Requires-Dist: pydantic<3,>=2.13
33
31
  Requires-Dist: pydantic-settings<3,>=2.3
34
- Requires-Dist: uvicorn<1.0,>=0.30
32
+ Requires-Dist: uvicorn<1.0,>=0.36
35
33
  Requires-Dist: typer<1.0,>=0.17
36
34
  Requires-Dist: python-dotenv<2,>=1.0
37
35
  Requires-Dist: questionary<3,>=2.0
@@ -49,6 +47,8 @@ Provides-Extra: jwt
49
47
  Requires-Dist: PyJWT<3,>=2.8; extra == "jwt"
50
48
  Provides-Extra: media
51
49
  Requires-Dist: textxtract[docx,html,md,pdf,xml]>=0.2.0; extra == "media"
50
+ Provides-Extra: images
51
+ Requires-Dist: 10xgraph[images]<2.0,>=0.10.0; extra == "images"
52
52
  Provides-Extra: gcloud
53
53
  Requires-Dist: google-cloud-logging; extra == "gcloud"
54
54
  Provides-Extra: otel
@@ -58,6 +58,8 @@ Requires-Dist: opentelemetry-instrumentation-fastapi>=0.40b0; extra == "otel"
58
58
  Requires-Dist: opentelemetry-exporter-otlp>=1.20.0; extra == "otel"
59
59
  Provides-Extra: ag-ui
60
60
  Requires-Dist: ag-ui-protocol<2,>=1.0; extra == "ag-ui"
61
+ Provides-Extra: websocket
62
+ Requires-Dist: websockets<17,>=13.0; extra == "websocket"
61
63
  Dynamic: license-file
62
64
 
63
65
  # 10xGraph API
@@ -93,7 +95,7 @@ Not built in: automatic per-tool permissions (user A may call `refund`, user B m
93
95
  |---|---|---|
94
96
  | [`10xgraph`](https://github.com/10xGraph/10xGraph) | Core engine: graph, state, replay-safe tools, checkpointing, memory | `pip install 10xgraph` (pulled in by this package) |
95
97
  | `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`) |
98
+ | [`10xgraph-client`](https://github.com/10xGraph/10xgraph-client) | Typed TypeScript client for every endpoint | `npm install 10xgraph-client` |
97
99
 
98
100
  Docs: [10xgraph.com](https://10xgraph.com).
99
101
 
@@ -151,11 +153,17 @@ Optional extras; install only what you configure:
151
153
  pip install "10xgraph-api[redis]" # Redis rate-limit / cache backend
152
154
  pip install "10xgraph-api[jwt]" # JWT authentication
153
155
  pip install "10xgraph-api[media]" # Document text extraction (multimodal)
156
+ pip install "10xgraph-api[images]" # Image resize / EXIF / format conversion (Pillow)
157
+ pip install "10xgraph-api[ag-ui]" # AG-UI endpoint
158
+ pip install "10xgraph-api[websocket]" # WebSocket streaming + realtime audio
154
159
  pip install "10xgraph-api[otel]" # OpenTelemetry tracing
155
160
  pip install "10xgraph-api[snowflakekit]" # Snowflake ID generation
161
+ pip install "10xgraph-api[sentry]" # Sentry error reporting
162
+ pip install "10xgraph-api[firebase]" # Firebase Admin SDK
163
+ pip install "10xgraph-api[gcloud]" # Google Cloud Logging
156
164
  ```
157
165
 
158
- Requires Python 3.12 or newer. Installs the core `10xgraph` framework as a dependency.
166
+ Requires Python 3.12 or newer. Tested on 3.12, 3.13, 3.14 and 3.15. Installs the core `10xgraph` framework as a dependency.
159
167
 
160
168
  ---
161
169
 
@@ -175,9 +183,6 @@ Requires Python 3.12 or newer. Installs the core `10xgraph` framework as a depen
175
183
  10xgraph build --docker-compose
176
184
  ```
177
185
 
178
- `10xgraph api` (server only) and `10xgraph play` (server + playground) remain
179
- available; `dev` is the goal-oriented wrapper around them.
180
-
181
186
  ---
182
187
 
183
188
  ## CLI commands
@@ -195,9 +200,17 @@ Initialize a new project with configuration and a sample graph.
195
200
  10xgraph init --path ./my-app --name MyAgent --template quick-start \
196
201
  --non-interactive # reproducible CI/agent workflow
197
202
  10xgraph init --path ./my-app --template production --auth jwt \
198
- --rate-limit redis --yes --dry-run
203
+ --rate-limit redis --provider openai --yes --dry-run
199
204
  ```
200
205
 
206
+ `init` asks which AI provider to use (`--provider google|openai|anthropic`, default `google`)
207
+ and writes the matching model and API key variable. It also asks whether to enable WebSocket
208
+ streaming and realtime audio (`--websocket`, default off); off leaves `/v1/graph/ws` and
209
+ `/v1/graph/live` unmounted and installs no WebSocket library. A production project's `pyproject.toml`
210
+ lists only what your answers need, for example `10xgraph[openai]` and
211
+ `10xgraph-api[jwt,redis]`, and `10xgraph build` installs exactly that list, so no separate
212
+ `requirements.txt` is needed.
213
+
201
214
  ### `10xgraph dev`
202
215
 
203
216
  Start the development API server and open the hosted playground when it is ready.
@@ -209,16 +222,18 @@ Start the development API server and open the hosted playground when it is ready
209
222
  10xgraph dev --no-open --no-reload # API only, without auto-reload
210
223
  ```
211
224
 
212
- `10xgraph api` and `10xgraph play` remain available as compatibility commands.
225
+ `dev` is the only server command: the old `api` and `play` commands were removed
226
+ (use `10xgraph dev --no-open` and `10xgraph dev`). It runs Uvicorn with reload for local
227
+ work; production runs Gunicorn in the image from `10xgraph build`.
213
228
 
214
229
  ### Adaptive and structured output
215
230
 
216
231
  ```bash
217
- 10xgraph play # branded intro, then output in your scrollback
232
+ 10xgraph dev # branded intro, then output in your scrollback
218
233
  10xgraph demo # preview every animation theme safely
219
234
  10xgraph demo --style build # one theme: typing, network, init, build, or eval
220
- 10xgraph --fullscreen play # opt-in pinned header/footer surface
221
- 10xgraph --no-animation play # accessible/static workflow
235
+ 10xgraph --fullscreen dev # opt-in pinned header/footer surface
236
+ 10xgraph --no-animation dev # accessible/static workflow
222
237
  10xgraph --format plain --no-color audit
223
238
  10xgraph --format jsonl eval --parallel
224
239
  10xgraph --quiet build
@@ -577,7 +592,7 @@ sdist + wheel, checks the distribution metadata, and creates a GitHub Release wi
577
592
  notes and the artifacts attached. PyPI publishing is manual (`make publish`).
578
593
 
579
594
  ```bash
580
- git tag v0.7.0 && git push origin v0.7.0
595
+ git tag v0.9.0 && git push origin v0.9.0
581
596
  ```
582
597
 
583
598
  ---
@@ -601,9 +616,33 @@ git tag v0.7.0 && git push origin v0.7.0
601
616
 
602
617
  ## Contributing
603
618
 
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.
619
+ **Your avatar belongs on this wall.**
620
+
621
+ <a href="https://github.com/10xGraph/10xgraph-api/graphs/contributors">
622
+ <img src="https://contrib.rocks/image?repo=10xGraph/10xgraph-api" alt="People who have contributed to 10xgraph-api" />
623
+ </a>
624
+
625
+ 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).
626
+
627
+ Your first pull request can be small. These are real, self-contained, and useful today:
628
+
629
+ - **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.
630
+ - **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.
631
+ - **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.
632
+ - **Turn a bug into a failing test.** Open it as a draft pull request; the fix can come later.
633
+
634
+ From clone to a passing check:
635
+
636
+ ```bash
637
+ git clone https://github.com/10xGraph/10xgraph-api.git
638
+ cd 10xgraph-api
639
+ uv sync --dev
640
+ uv run pytest
641
+ uv run pre-commit run --all-files # ruff, bandit and hygiene checks, as in CI
642
+ uv run mypy
643
+ ```
644
+
645
+ 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
646
 
608
647
  ---
609
648