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.
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/10xgraph_api.egg-info/PKG-INFO +32 -12
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/10xgraph_api.egg-info/SOURCES.txt +6 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/10xgraph_api.egg-info/requires.txt +1 -4
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/CHANGELOG.md +106 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/PKG-INFO +32 -12
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/README.md +29 -5
- 10xgraph_api-0.8.0/RELEASE_NOTES.md +63 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/SECURITY.md +34 -2
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/pyproject.toml +4 -8
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/api.py +16 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/build.py +32 -2
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/config_editor/schema.py +114 -4
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/config_editor/validation.py +32 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/constants.py +1 -1
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/defaults.py +65 -45
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/.env.example +2 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/SKILL.md +3 -3
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/api-client.md +7 -7
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/architecture.md +4 -4
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/auth-and-authorization.md +1 -1
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/callbacks-and-command.md +1 -1
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/checkpointing-and-threads.md +1 -1
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/client-auth-and-errors.md +12 -12
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/client-messages-invoke-stream.md +8 -8
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/client-threads-memory-files.md +5 -5
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/media-and-files.md +1 -1
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/memory-and-store.md +1 -1
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/remote-tools.md +1 -1
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/state-and-messages.md +1 -1
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/streaming.md +2 -2
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/copilot/10xgraph.instructions.md +3 -3
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/auth/authorization.py +115 -25
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/auth/base_auth.py +5 -0
- 10xgraph_api-0.8.0/tenxgraph_api/src/app/core/auth/identity_cache.py +68 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/auth/jwt_auth.py +3 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/auth/ownership_resolver.py +75 -6
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/auth/permissions.py +58 -5
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/auth/request_config.py +59 -0
- 10xgraph_api-0.8.0/tenxgraph_api/src/app/core/auth/revocation.py +219 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/auth/route_guard.py +1 -0
- 10xgraph_api-0.8.0/tenxgraph_api/src/app/core/concurrency.py +200 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/config/graph_config.py +210 -4
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/config/media_settings.py +12 -3
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/config/settings.py +22 -5
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/config/setup_middleware.py +78 -82
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/exceptions/handle_errors.py +8 -2
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/rate_limit/keying.py +24 -9
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/rate_limit/middleware.py +39 -20
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/security_headers.py +44 -62
- 10xgraph_api-0.8.0/tenxgraph_api/src/app/core/utils/container.py +21 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/utils/log_sanitizer.py +10 -1
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/loader.py +138 -17
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/main.py +20 -2
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/ag_ui/converter.py +8 -6
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/ag_ui/router.py +16 -8
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/checkpointer/services/checkpointer_service.py +60 -9
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/graph/realtime_guard.py +54 -6
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/graph/router.py +144 -43
- 10xgraph_api-0.8.0/tenxgraph_api/src/app/routers/graph/run_limits.py +100 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/graph/services/graph_service.py +246 -73
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/graph/services/multimodal_preprocessor.py +5 -2
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/media/__init__.py +33 -8
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/media/router.py +58 -21
- 10xgraph_api-0.8.0/tenxgraph_api/src/app/routers/ping/readiness.py +142 -0
- 10xgraph_api-0.8.0/tenxgraph_api/src/app/routers/ping/router.py +65 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/response_helper.py +26 -5
- 10xgraph_api-0.7.0/RELEASE_NOTES.md +0 -51
- 10xgraph_api-0.7.0/tenxgraph_api/src/app/routers/ping/router.py +0 -28
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/10xgraph.json +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/10xgraph_api.egg-info/dependency_links.txt +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/10xgraph_api.egg-info/entry_points.txt +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/10xgraph_api.egg-info/not-zip-safe +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/10xgraph_api.egg-info/top_level.txt +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/CODE_OF_CONDUCT.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/CONTRIBUTING.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/LICENSE +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/MANIFEST.in +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/agentflow_cli/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/setup.cfg +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/capabilities.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/audit.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/config.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/demo.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/eval.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/init.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/skills.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/test.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/commands/version.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/config_editor/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/config_editor/server.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/config_editor/static/app.css +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/config_editor/static/app.js +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/config_editor/static/favicon.svg +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/config_editor/static/index.html +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/config_editor/store.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/context.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/core/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/core/animations.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/core/config.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/core/output.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/core/prompts.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/core/screen.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/core/steps.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/core/theme.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/core/validation.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/exceptions.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/logger.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/main.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/dev/.env.example +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/dev/10xgraph.json +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/dev/graph/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/dev/graph/agent.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/.pre-commit-config.yaml +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/.python-version +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/10xgraph.json +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/auth/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/auth/agent_auth.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/evals/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/evals/user_simulator_eval.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/evals/weather_agents_eval.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/agent.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/state.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/thread_name_generator.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/tools/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/tools/weather_tool.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/validators/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/validators/lifecyle.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/validators/manager.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/graph/validators/validators.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/pyproject.toml +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/tests/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/tests/conftest.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/tests/test_agent_eval.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/tests/test_catalog_tools.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/prod/tests/test_graph_nodes.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/agents-and-tools.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/api-configuration.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/api-settings-and-middleware.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/cli-commands.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/context-id-background.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/dependency-injection.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/evaluation.md +0 -0
- {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
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/prebuilt-agents-and-tools.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/production-runtime.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/providers-and-adapters.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/publishers-and-runtime-protocols.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/rate-limiting.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/realtime.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/rest-api-and-errors.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/security-and-validators.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/state-graph.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/stream-emitter.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/testing-and-evaluation.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/cli/templates/skills/10xgraph/references/unit-testing.md +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/py.typed +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/auth/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/auth/auth_backend.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/config/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/config/sentry_config.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/config/setup_logs.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/config/worker_middleware.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/exceptions/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/exceptions/general_exception.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/exceptions/resources_exceptions.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/exceptions/user_exception.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/rate_limit/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/rate_limit/base.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/rate_limit/factory.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/rate_limit/memory.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/rate_limit/redis.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/middleware/request_limits.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/core/utils/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/ag_ui/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/ag_ui/event_mapper.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/ag_ui/service.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/checkpointer/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/checkpointer/router.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/checkpointer/schemas/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/checkpointer/schemas/checkpointer_schemas.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/checkpointer/services/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/evals/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/evals/router.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/evals/services/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/evals/services/eval_report_service.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/graph/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/graph/schemas/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/graph/schemas/graph_schemas.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/graph/services/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/media/schemas.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/ping/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/setup_router.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/store/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/store/router.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/store/schemas/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/store/schemas/store_schemas.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/store/services/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/routers/store/services/store_service.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/tasks/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/tasks/user_tasks.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/callable_helper.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/media/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/media/extractor.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/media/pipeline.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/parse_output.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/schemas/__init__.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/schemas/output_schemas.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/schemas/user_schemas.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/snowflake_id_generator.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/swagger_helper.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/telemetry_store.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/utils/thread_name_generator.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tenxgraph_api/src/app/worker.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tests/test_agentflow_cli_alias.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tests/test_multimodal_sprint2_extraction.py +0 -0
- {10xgraph_api-0.7.0 → 10xgraph_api-0.8.0}/tests/test_sprint4_media_api.py +0 -0
- {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.
|
|
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
|
+
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`
|
|
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.
|
|
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
|
-
|
|
605
|
-
|
|
606
|
-
|
|
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.
|
|
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.
|
|
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
|
+
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`
|
|
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.
|
|
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
|
-
|
|
605
|
-
|
|
606
|
-
|
|
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`
|
|
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.
|
|
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
|
-
|
|
543
|
-
|
|
544
|
-
|
|
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 (
|
|
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>=
|
|
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
|
+
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 =
|
|
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.
|
|
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
|