agentseek-api 0.0.2__tar.gz → 0.1.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.
- agentseek_api-0.1.0/.env.example +20 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/.github/workflows/ci.yml +21 -0
- agentseek_api-0.1.0/.gitignore +21 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/PKG-INFO +248 -54
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/README.md +244 -51
- agentseek_api-0.1.0/README.zh-CN.md +799 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/README.md +5 -2
- agentseek_api-0.1.0/examples/auth/api_key_auth.py +38 -0
- agentseek_api-0.1.0/examples/auth/bearer_token_auth.py +40 -0
- agentseek_api-0.1.0/examples/auth/jwt.md +19 -0
- agentseek_api-0.1.0/examples/auth/jwt_auth.py +86 -0
- agentseek_api-0.1.0/examples/docker_ci_auth/auth_backend.py +36 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/pyproject.toml +6 -3
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/scripts/test_cli_dev_studio_smoke.py +5 -9
- agentseek_api-0.1.0/scripts/test_cli_embed_serve_smoke.py +167 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/scripts/test_cli_serve_smoke.py +8 -3
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/scripts/verify_docker_api.py +8 -102
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/a2a_server.py +8 -28
- agentseek_api-0.1.0/src/agentseek_api/api/assistants.py +394 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/api/crons.py +34 -13
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/api/runs.py +352 -177
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/api/stateless_runs.py +34 -12
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/api/store.py +6 -7
- agentseek_api-0.1.0/src/agentseek_api/api/streaming.py +282 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/api/threads.py +343 -395
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/cli.py +21 -10
- agentseek_api-0.1.0/src/agentseek_api/core/app_loader.py +60 -0
- agentseek_api-0.1.0/src/agentseek_api/core/auth_deps.py +68 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/core/auth_middleware.py +103 -121
- agentseek_api-0.1.0/src/agentseek_api/core/content_type_fix.py +59 -0
- agentseek_api-0.1.0/src/agentseek_api/core/cors_config.py +28 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/core/database.py +104 -40
- agentseek_api-0.1.0/src/agentseek_api/core/http_config.py +30 -0
- agentseek_api-0.1.0/src/agentseek_api/core/oceanbase_checkpointer.py +106 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/main.py +152 -42
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/models/api.py +157 -39
- agentseek_api-0.1.0/src/agentseek_api/models/auth.py +26 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/services/cron_service.py +27 -14
- agentseek_api-0.1.0/src/agentseek_api/services/default_assistants.py +79 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/services/run_executor.py +269 -38
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/services/run_jobs.py +1 -1
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/services/run_preparation.py +22 -16
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/services/sse.py +22 -1
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/services/stream_persistence.py +3 -3
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/services/thread_checkpoint_store.py +189 -4
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/services/thread_protocol.py +131 -1
- agentseek_api-0.1.0/src/agentseek_api/services/thread_service.py +64 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/settings.py +3 -4
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/conftest.py +14 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/e2e/conftest.py +0 -1
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/e2e/test_a2a_live.py +0 -2
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/e2e/test_langsmith_compat_live.py +32 -48
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/e2e/test_mcp_live.py +0 -2
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/e2e/test_real_api_flow.py +2 -2
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_a2a_endpoint.py +9 -5
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_agent_card.py +0 -33
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_agents_aliases.py +10 -11
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_assistants_compat.py +2 -2
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_assistants_crud.py +3 -3
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_assistants_ordering.py +1 -1
- agentseek_api-0.1.0/tests/integration/test_auth_coverage_gaps.py +838 -0
- agentseek_api-0.1.0/tests/integration/test_auth_handlers.py +193 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_auth_route_enforcement.py +31 -18
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_auth_scope_matrix.py +10 -7
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_langsmith_compat_coverage.py +6 -6
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_langsmith_compat_extra.py +29 -26
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_mcp_endpoint.py +9 -13
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_metadata_db_config.py +6 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_protocol_v2_streaming.py +6 -6
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_run_cancellation_async.py +1 -2
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_runs_compat.py +35 -53
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_runs_crud.py +4 -3
- agentseek_api-0.1.0/tests/integration/test_runs_ordering.py +71 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_runs_streaming_errors.py +3 -2
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_runs_wait_and_get.py +6 -4
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_stateless_runs_crud.py +3 -3
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_store_api.py +13 -14
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_stream_persistence.py +31 -33
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_system_endpoints.py +0 -5
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_threads_compat.py +4 -9
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_threads_crud.py +10 -11
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_threads_ordering.py +2 -2
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_a2a_server.py +3 -26
- agentseek_api-0.1.0/tests/unit/test_app_loader.py +55 -0
- agentseek_api-0.1.0/tests/unit/test_assistant_routes_unit.py +448 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_auth.py +200 -173
- agentseek_api-0.1.0/tests/unit/test_auth_internals.py +204 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_cli.py +12 -43
- agentseek_api-0.1.0/tests/unit/test_content_type_fix.py +37 -0
- agentseek_api-0.1.0/tests/unit/test_custom_routers.py +216 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_database_manager.py +48 -0
- agentseek_api-0.1.0/tests/unit/test_default_assistants.py +164 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_executor.py +24 -0
- agentseek_api-0.1.0/tests/unit/test_http_config.py +36 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_openapi_auth_config.py +2 -2
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_run_executor.py +111 -14
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_run_jobs.py +111 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_run_preparation.py +16 -16
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_runtime_store.py +6 -1
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_sample_graphs.py +21 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_seekdb_embed_launcher.py +1 -0
- agentseek_api-0.1.0/tests/unit/test_sse_keepalive.py +60 -0
- agentseek_api-0.1.0/tests/unit/test_store_config.py +224 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_stream_persistence_helpers.py +2 -6
- agentseek_api-0.1.0/tests/unit/test_thread_checkpoint_store.py +273 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_thread_routes_unit.py +71 -68
- agentseek_api-0.1.0/tests/unit/test_thread_service.py +91 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/uv.lock +701 -28
- agentseek_api-0.0.2/.env.example +0 -15
- agentseek_api-0.0.2/.gitignore +0 -9
- agentseek_api-0.0.2/docs/superpowers/plans/2026-05-23-mcp-endpoint-implementation.md +0 -1010
- agentseek_api-0.0.2/docs/superpowers/plans/2026-05-24-a2a-endpoint-implementation.md +0 -942
- agentseek_api-0.0.2/docs/superpowers/plans/2026-05-25-cron-support-implementation.md +0 -625
- agentseek_api-0.0.2/docs/superpowers/specs/2026-05-23-mcp-endpoint-design.md +0 -389
- agentseek_api-0.0.2/docs/superpowers/specs/2026-05-24-a2a-endpoint-design.md +0 -365
- agentseek_api-0.0.2/docs/superpowers/specs/2026-05-25-agent-server-release-hardening-design.md +0 -240
- agentseek_api-0.0.2/docs/superpowers/specs/2026-05-25-cron-support-design.md +0 -370
- agentseek_api-0.0.2/examples/auth/jwt.md +0 -5
- agentseek_api-0.0.2/examples/docker_ci_auth/auth_backend.py +0 -9
- agentseek_api-0.0.2/src/agentseek_api/api/assistants.py +0 -251
- agentseek_api-0.0.2/src/agentseek_api/core/auth_deps.py +0 -18
- agentseek_api-0.0.2/src/agentseek_api/core/oceanbase_checkpointer.py +0 -50
- agentseek_api-0.0.2/src/agentseek_api/models/auth.py +0 -6
- agentseek_api-0.0.2/src/agentseek_api/services/thread_service.py +0 -23
- agentseek_api-0.0.2/tests/integration/test_runs_ordering.py +0 -29
- agentseek_api-0.0.2/tests/unit/test_assistant_routes_unit.py +0 -285
- agentseek_api-0.0.2/tests/unit/test_store_config.py +0 -109
- agentseek_api-0.0.2/tests/unit/test_thread_checkpoint_store.py +0 -98
- agentseek_api-0.0.2/tests/unit/test_thread_service.py +0 -34
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/.dockerignore +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/.github/workflows/live-provider-streaming.yml +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/.github/workflows/release.yml +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/AGENTS.md +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/CONTRIBUTING.md +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/LICENSE +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/Makefile +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/__init__.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/assistant_config/agentseek.json +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/assistant_config/graph.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/auth/custom_backend.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/custom_routes/app.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/docker_ci_auth/manifest.json +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/external_graph/__init__.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/external_graph/graph.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/external_graph/manifest.json +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/external_graph/run.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/graphs/__init__.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/graphs/react_agent/__init__.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/graphs/react_agent/graph.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/graphs/store_memory/graph.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/graphs/stress_test/__init__.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/graphs/stress_test/graph.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/graphs/stress_tool_agent/__init__.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/graphs/stress_tool_agent/graph.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/graphs/subgraph_agent/__init__.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/graphs/subgraph_agent/graph.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/graphs/subgraph_hitl_agent/__init__.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/graphs/subgraph_hitl_agent/graph.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/live_provider_graphs/__init__.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/live_provider_graphs/graph.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/live_provider_graphs/manifest.json +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/minimal_agentseek/agentseek.json +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/minimal_agentseek/graph.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/run_sample_graphs.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/examples/sample_graphs_manifest.json +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/scripts/build_live_provider_matrix.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/scripts/seekdb_checkpoint_smoke.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/scripts/seekdb_embed_launcher.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/scripts/test-checkpoints.sh +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/scripts/test-cli-dev-samples.sh +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/scripts/test-cli-docker.sh +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/scripts/test-live-provider.sh +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/scripts/test-redis-runtime.sh +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/scripts/test-seekdb.sh +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/scripts/test_cli_config_autodiscovery.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/__init__.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/api/__init__.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/core/__init__.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/core/a2a_config.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/core/config_file.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/core/mcp_config.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/core/orm.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/core/runtime_store.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/core/store_config.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/mcp_server.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/models/__init__.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/models/protocol.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/scheduler.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/services/__init__.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/services/cron_models.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/services/cron_rrule.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/services/cron_scheduler.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/services/cron_webhooks.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/services/executor.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/services/langgraph_service.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/services/redis_queue.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/services/run_state.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/services/sample_graphs.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/src/agentseek_api/worker.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/__init__.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/e2e/__init__.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/e2e/e2e_inprocess_flow.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/e2e/e2e_live_http_flow.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/e2e/e2e_live_http_multi_graph.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/e2e/e2e_live_http_resume_flow.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/e2e/fixtures/langgraph.store-e2e.json +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/e2e/live_provider_helpers.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/e2e/test_live_provider_api.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/e2e/test_live_provider_mcp.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_core_api_flow.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_cron_api.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_live_provider_streaming.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_runs_resume.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_runs_streaming.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_runs_validation.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_runs_wait_timeout.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/integration/test_scheduler_runtime.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_a2a_config.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_auth_deps.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_checkpoint_guards.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_cron_rrule.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_cron_service.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_cron_webhooks.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_examples.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_graph_manifest.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_langgraph_service.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_live_provider_e2e_config.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_live_provider_graphs.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_live_provider_matrix.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_mcp_config.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_mcp_server.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_oceanbase_checkpointer.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_redis_queue.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_run_state.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_scheduler.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_scheduler_process.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_seekdb_checkpoint_smoke.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_thread_protocol.py +0 -0
- {agentseek_api-0.0.2 → agentseek_api-0.1.0}/tests/unit/test_worker.py +0 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
METADATA_DB_URL=
|
|
2
|
+
METADATA_DB_BACKEND=auto
|
|
3
|
+
SEEKDB_URL=mysql+aiomysql://root%40test:@localhost:2881/seekdb
|
|
4
|
+
AGENTSEEK_GRAPHS=
|
|
5
|
+
# Auth: configure via agentseek.json "auth.path" or set AUTH_MODULE_PATH directly.
|
|
6
|
+
# Format: "./path/to/auth.py:auth" (langgraph_sdk.Auth object)
|
|
7
|
+
# If not set, all requests pass through as default_user (noop).
|
|
8
|
+
AUTH_MODULE_PATH=
|
|
9
|
+
|
|
10
|
+
# Embedded SeekDB — set to true for a zero-config local backend.
|
|
11
|
+
# Data stored in SEEKDB_EMBED_DIR (default: ~/.agentseek/seekdb_data).
|
|
12
|
+
# Requires: uv sync --dev --extra embedded
|
|
13
|
+
# SEEKDB_EMBED=true
|
|
14
|
+
# SEEKDB_EMBED_DIR=
|
|
15
|
+
|
|
16
|
+
OCEANBASE_HOST=localhost
|
|
17
|
+
OCEANBASE_PORT=2881
|
|
18
|
+
OCEANBASE_USER=root@test
|
|
19
|
+
OCEANBASE_PASSWORD=
|
|
20
|
+
OCEANBASE_DB_NAME=seekdb
|
|
@@ -90,6 +90,27 @@ jobs:
|
|
|
90
90
|
- name: CLI config and Docker planning tests
|
|
91
91
|
run: uv run pytest tests/unit/test_cli.py tests/unit/test_graph_manifest.py -q
|
|
92
92
|
|
|
93
|
+
embedded-seekdb-smoke:
|
|
94
|
+
name: Embedded SeekDB Smoke
|
|
95
|
+
runs-on: ubuntu-latest
|
|
96
|
+
timeout-minutes: 15
|
|
97
|
+
steps:
|
|
98
|
+
- name: Checkout
|
|
99
|
+
uses: actions/checkout@v4
|
|
100
|
+
|
|
101
|
+
- name: Setup UV
|
|
102
|
+
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
|
103
|
+
with:
|
|
104
|
+
enable-cache: true
|
|
105
|
+
cache-python: true
|
|
106
|
+
python-version: "3.12"
|
|
107
|
+
|
|
108
|
+
- name: Sync with embedded extra
|
|
109
|
+
run: uv sync --dev --extra embedded
|
|
110
|
+
|
|
111
|
+
- name: Embedded seekdb serve smoke (SEEKDB_EMBED=true)
|
|
112
|
+
run: uv run python scripts/test_cli_embed_serve_smoke.py
|
|
113
|
+
|
|
93
114
|
cli-docker-runtime:
|
|
94
115
|
name: CLI Docker Runtime
|
|
95
116
|
runs-on: ubuntu-latest
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
.DS_Store
|
|
2
|
+
.vscode/
|
|
3
|
+
.coverage
|
|
4
|
+
.agentseek/
|
|
5
|
+
.pytest_cache/
|
|
6
|
+
.ruff_cache/
|
|
7
|
+
.tmp/
|
|
8
|
+
.venv/
|
|
9
|
+
__pycache__/
|
|
10
|
+
*.pyc
|
|
11
|
+
*.cover
|
|
12
|
+
.env
|
|
13
|
+
.envrc
|
|
14
|
+
.venv
|
|
15
|
+
env/
|
|
16
|
+
venv/
|
|
17
|
+
ENV/
|
|
18
|
+
env.bak/
|
|
19
|
+
venv.bak/
|
|
20
|
+
.claude
|
|
21
|
+
docs/superpowers/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentseek-api
|
|
3
|
-
Version: 0.0
|
|
3
|
+
Version: 0.1.0
|
|
4
4
|
Summary: AgentSeek API core runtime with OceanBase checkpoints.
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Requires-Python: >=3.12
|
|
@@ -12,7 +12,7 @@ Requires-Dist: fastapi>=0.110.1
|
|
|
12
12
|
Requires-Dist: greenlet>=3.1.0
|
|
13
13
|
Requires-Dist: langchain-anthropic>=1.0.0
|
|
14
14
|
Requires-Dist: langchain-core>=1.0.0
|
|
15
|
-
Requires-Dist: langchain-oceanbase==0.5.
|
|
15
|
+
Requires-Dist: langchain-oceanbase==0.5.2
|
|
16
16
|
Requires-Dist: langchain-openai>=1.0.0
|
|
17
17
|
Requires-Dist: langchain>=0.3.9
|
|
18
18
|
Requires-Dist: langgraph-sdk>=0.3.5
|
|
@@ -22,33 +22,41 @@ Requires-Dist: pydantic-settings>=2.4.0
|
|
|
22
22
|
Requires-Dist: pydantic>=2.8.0
|
|
23
23
|
Requires-Dist: pymysql>=1.1.0
|
|
24
24
|
Requires-Dist: redis>=5.0.0
|
|
25
|
+
Requires-Dist: scalar-fastapi>=1.0.3
|
|
25
26
|
Requires-Dist: sqlalchemy>=2.0.0
|
|
26
27
|
Requires-Dist: uvicorn>=0.30.0
|
|
27
28
|
Provides-Extra: embedded
|
|
28
|
-
Requires-Dist: langchain-oceanbase[pyseekdb]==0.5.
|
|
29
|
+
Requires-Dist: langchain-oceanbase[pyseekdb]==0.5.2; extra == 'embedded'
|
|
29
30
|
Description-Content-Type: text/markdown
|
|
30
31
|
|
|
31
32
|
# AgentSeek API
|
|
32
33
|
|
|
34
|
+
**English** | [中文](README.zh-CN.md)
|
|
35
|
+
|
|
36
|
+
> [!WARNING]
|
|
37
|
+
> This project is under active development and is **not production-ready**.
|
|
38
|
+
> Pull requests for bug fixes and enhancements are warmly welcomed!
|
|
39
|
+
|
|
33
40
|
Run LangGraph and LangChain apps behind a FastAPI runtime with a standalone
|
|
34
41
|
`agentseek-api` CLI.
|
|
35
42
|
|
|
36
43
|
> [!NOTE]
|
|
37
44
|
> AgentSeek API uses
|
|
38
45
|
> [Agent Protocol](https://github.com/langchain-ai/agent-protocol) as the main
|
|
39
|
-
> external compatibility reference. The current runtime
|
|
40
|
-
> thread, run, cron, streaming
|
|
41
|
-
>
|
|
42
|
-
>
|
|
43
|
-
>
|
|
44
|
-
>
|
|
46
|
+
> external compatibility reference. The current runtime covers the core
|
|
47
|
+
> thread, run, cron, streaming (including subgraph and expanded stream modes),
|
|
48
|
+
> and protocol-v2 event flows. Auth uses the `langgraph_sdk.Auth` pattern with
|
|
49
|
+
> `@auth.authenticate` and `@auth.on` handlers. Agent resources are exposed
|
|
50
|
+
> through `/assistants`, direct `/agents` aliases, Streamable HTTP MCP, and
|
|
51
|
+
> LangSmith-style A2A endpoints. This is workable OSS parity for the core
|
|
52
|
+
> agent-server surfaces, not full LangSmith Agent Server parity.
|
|
45
53
|
|
|
46
54
|
Current release boundary:
|
|
47
55
|
|
|
48
|
-
- Implemented: assistants, threads, runs, crons, streaming
|
|
49
|
-
and A2A
|
|
50
|
-
- Explicitly not implemented: distributed runtime parity
|
|
51
|
-
|
|
56
|
+
- Implemented: assistants, threads, runs, crons, streaming (including subgraph
|
|
57
|
+
and expanded stream modes), Store API, MCP, and A2A
|
|
58
|
+
- Explicitly not implemented: distributed runtime parity and assistant
|
|
59
|
+
version-promotion workflows
|
|
52
60
|
|
|
53
61
|
## 🚀 Quickstart
|
|
54
62
|
|
|
@@ -62,19 +70,110 @@ Current release boundary:
|
|
|
62
70
|
| Workflow | Use it when | Recommended command |
|
|
63
71
|
| --- | --- | --- |
|
|
64
72
|
| `langgraph dev` | You want the fastest mocked or in-memory local API loop for graph prototyping or Studio experimentation. | `langgraph dev` |
|
|
65
|
-
| `agentseek-api dev` | You want the real AgentSeek API surface with your actual MySQL-family /
|
|
73
|
+
| `agentseek-api dev` | You want the real AgentSeek API surface with your actual MySQL-family / seekdb / OceanBase-style persistence, auth, and Docker/runtime behavior. | `uv run agentseek-api dev` |
|
|
66
74
|
|
|
67
75
|
Use `langgraph dev` when you do not need real backend validation. Use
|
|
68
76
|
`agentseek-api dev` when you want to exercise the actual API contract this repo
|
|
69
77
|
ships.
|
|
70
78
|
|
|
71
|
-
### 1. Install
|
|
79
|
+
### 1. Install
|
|
80
|
+
|
|
81
|
+
**Install as a project dependency** (recommended):
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# In your project directory
|
|
85
|
+
uv add agentseek-api
|
|
86
|
+
|
|
87
|
+
# With embedded seekdb backend (no Docker needed)
|
|
88
|
+
uv add agentseek-api[embedded]
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Global install** (if you prefer a system-wide command):
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
pip install agentseek-api
|
|
95
|
+
|
|
96
|
+
# Then install your graph's dependencies into the same environment
|
|
97
|
+
pip install ...
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
> [!WARNING]
|
|
101
|
+
> Global install only supports `pip install`. **Do NOT use `uv tool install`**.
|
|
102
|
+
|
|
103
|
+
**Install from source** (for contributors):
|
|
72
104
|
|
|
73
105
|
```bash
|
|
74
106
|
uv sync
|
|
107
|
+
|
|
108
|
+
# With embedded seekdb backend
|
|
109
|
+
uv sync --extra embedded
|
|
75
110
|
```
|
|
76
111
|
|
|
77
|
-
### 2.
|
|
112
|
+
### 2. Configure seekdb embed as the default backend (recommended)
|
|
113
|
+
|
|
114
|
+
The fastest way to get a real backend running locally is **seekdb embed** — an
|
|
115
|
+
in-process SeekDB instance, no Docker or separate process required:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
SEEKDB_EMBED=true agentseek-api dev
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Data is stored in `~/.agentseek/seekdb_data` by default. Set `SEEKDB_EMBED_DIR`
|
|
122
|
+
to change the location.
|
|
123
|
+
|
|
124
|
+
<details>
|
|
125
|
+
<summary>Using a seekdb Docker container instead</summary>
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
docker run -d --name seekdb-dev \
|
|
129
|
+
-p 2881:2881 -p 2886:2886 \
|
|
130
|
+
oceanbase/seekdb:latest
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Wait for the container to become healthy, then export:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
export OCEANBASE_HOST=127.0.0.1
|
|
137
|
+
export OCEANBASE_PORT=2881
|
|
138
|
+
export OCEANBASE_USER=root
|
|
139
|
+
export OCEANBASE_PASSWORD=
|
|
140
|
+
export OCEANBASE_DB_NAME=seekdb
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
</details>
|
|
144
|
+
|
|
145
|
+
<details>
|
|
146
|
+
<summary>Using an OceanBase instance instead</summary>
|
|
147
|
+
|
|
148
|
+
Start an OceanBase-CE container in mini mode:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
docker run -d --name ob-dev \
|
|
152
|
+
-e MODE=mini \
|
|
153
|
+
-p 2881:2881 \
|
|
154
|
+
oceanbase/oceanbase-ce:latest
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
OceanBase-CE in mini mode takes a few minutes to initialize. Wait for readiness,
|
|
158
|
+
then export:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
export OCEANBASE_HOST=127.0.0.1
|
|
162
|
+
export OCEANBASE_PORT=2881
|
|
163
|
+
export OCEANBASE_USER=root@test
|
|
164
|
+
export OCEANBASE_PASSWORD=
|
|
165
|
+
export OCEANBASE_DB_NAME=seekdb
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Create the database:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
mysql -h 127.0.0.1 -P 2881 -u root@test -e "CREATE DATABASE IF NOT EXISTS seekdb"
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
</details>
|
|
175
|
+
|
|
176
|
+
### 3. Create a config file
|
|
78
177
|
|
|
79
178
|
`agentseek-api` looks for config in this order:
|
|
80
179
|
|
|
@@ -94,7 +193,7 @@ Minimal `langgraph.json`:
|
|
|
94
193
|
}
|
|
95
194
|
```
|
|
96
195
|
|
|
97
|
-
###
|
|
196
|
+
### 4. Start the local API
|
|
98
197
|
|
|
99
198
|
```bash
|
|
100
199
|
uv run agentseek-api dev
|
|
@@ -106,19 +205,24 @@ Run with an explicit config when needed:
|
|
|
106
205
|
uv run agentseek-api dev --config ./langgraph.json
|
|
107
206
|
```
|
|
108
207
|
|
|
109
|
-
When the server
|
|
208
|
+
When the server starts it prints the banner and local URLs:
|
|
110
209
|
|
|
111
210
|
```text
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
211
|
+
Welcome to
|
|
212
|
+
|
|
213
|
+
╔═╗┌─┐┌─┐┌┐┌┌┬┐╔═╗┌─┐┌─┐┬┌─
|
|
214
|
+
╠═╣│ ┬├┤ │││ │ ╚═╗├┤ ├┤ ├┴┐
|
|
215
|
+
╩ ╩└─┘└─┘┘└┘ ┴ ╚═╝└─┘└─┘┴ ┴
|
|
216
|
+
|
|
217
|
+
AgentSeek v0.1.0
|
|
218
|
+
|
|
219
|
+
- 🚀 API: http://localhost:2024
|
|
220
|
+
- 📚 Docs: http://localhost:2024/docs
|
|
221
|
+
- 🎨 Studio UI: https://smith.langchain.com/studio/?baseUrl=http://127.0.0.1:2024
|
|
222
|
+
|
|
119
223
|
```
|
|
120
224
|
|
|
121
|
-
###
|
|
225
|
+
### 5. Check that it is up
|
|
122
226
|
|
|
123
227
|
```bash
|
|
124
228
|
curl http://127.0.0.1:2024/health
|
|
@@ -126,6 +230,37 @@ curl http://127.0.0.1:2024/info
|
|
|
126
230
|
curl http://127.0.0.1:2024/openapi.json
|
|
127
231
|
```
|
|
128
232
|
|
|
233
|
+
### 6. Test by using LangGraph SDK
|
|
234
|
+
|
|
235
|
+
```python
|
|
236
|
+
from langgraph_sdk import get_client
|
|
237
|
+
|
|
238
|
+
client = get_client(url="http://localhost:2024/")
|
|
239
|
+
|
|
240
|
+
async def main():
|
|
241
|
+
# List all assistants
|
|
242
|
+
assistants = await client.assistants.search(graph_id="agent")
|
|
243
|
+
|
|
244
|
+
# We auto-create an assistant for each graph you register in config.
|
|
245
|
+
agent = assistants[0]
|
|
246
|
+
|
|
247
|
+
# Start a new thread
|
|
248
|
+
thread = await client.threads.create()
|
|
249
|
+
|
|
250
|
+
# Start a streaming run
|
|
251
|
+
input = {"messages": [{"role": "human", "content": "hello?"}]}
|
|
252
|
+
async for chunk in client.runs.stream(
|
|
253
|
+
thread["thread_id"], agent["assistant_id"], input=input
|
|
254
|
+
):
|
|
255
|
+
print(chunk)
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
if __name__ == "__main__":
|
|
259
|
+
import asyncio
|
|
260
|
+
|
|
261
|
+
asyncio.run(main())
|
|
262
|
+
```
|
|
263
|
+
|
|
129
264
|
## 🧰 CLI
|
|
130
265
|
|
|
131
266
|
The package installs `agentseek-api` as the standalone executable. It does not
|
|
@@ -202,7 +337,8 @@ in-memory, or tunneled local workflows, prefer `langgraph dev`.
|
|
|
202
337
|
- ⚙️ Standalone CLI plus embeddable subcommand registration for parent CLIs
|
|
203
338
|
- 🔌 Manifest-driven graph loading through `agentseek.json`, `langgraph.json`,
|
|
204
339
|
or `AGENTSEEK_GRAPHS`
|
|
205
|
-
- 🌊 SSE streaming with
|
|
340
|
+
- 🌊 SSE streaming with subgraph support and expanded stream modes
|
|
341
|
+
(values, updates, messages, messages-tuple, events, tasks, checkpoints, custom, debug)
|
|
206
342
|
- 🧰 MCP tool exposure for registered graphs over Streamable HTTP
|
|
207
343
|
- 🤝 A2A assistant endpoints with agent-card discovery, streaming, and task lookup/cancel
|
|
208
344
|
- 🧵 Thread, run, wait, cancel, history, state, and protocol-v2 stream flows
|
|
@@ -210,13 +346,14 @@ in-memory, or tunneled local workflows, prefer `langgraph dev`.
|
|
|
210
346
|
- 🤖 Agent resources exposed through both `/assistants` and `/agents`
|
|
211
347
|
- 🧑💻 Human-in-the-loop resume through
|
|
212
348
|
`POST /threads/{thread_id}/runs/{run_id}/resume`
|
|
213
|
-
- 🗄️
|
|
349
|
+
- 🗄️ seekdb / OceanBase-first checkpoint persistence via
|
|
214
350
|
`langchain-oceanbase`
|
|
215
351
|
- 📦 Redis-backed durable execution with a dedicated worker process
|
|
216
352
|
- ♻️ Persisted run and thread stream replay for resume-after-restart flows
|
|
217
|
-
- 🔐 `
|
|
353
|
+
- 🔐 `langgraph_sdk.Auth`-based authentication with `@auth.authenticate` and
|
|
354
|
+
`@auth.on` handlers; noop fallback when unconfigured
|
|
218
355
|
- 🐳 Dockerfile generation, image build, and local Docker runtime helpers
|
|
219
|
-
- 🧪 Real backend CI coverage across MySQL,
|
|
356
|
+
- 🧪 Real backend CI coverage across MySQL, seekdb, OceanBase, and Redis runtime paths
|
|
220
357
|
- 🧪 Manual provider-backed streaming checks for live SSE proof
|
|
221
358
|
|
|
222
359
|
## 🎯 Compatibility Scope
|
|
@@ -224,12 +361,13 @@ in-memory, or tunneled local workflows, prefer `langgraph dev`.
|
|
|
224
361
|
Treat AgentSeek API as a practical OSS-compatible core for Agent Server-style
|
|
225
362
|
apps.
|
|
226
363
|
|
|
227
|
-
- Shipped: assistant CRUD, thread/run lifecycle APIs, resumable SSE streams
|
|
228
|
-
|
|
229
|
-
execution, and Docker/runtime
|
|
364
|
+
- Shipped: assistant CRUD, thread/run lifecycle APIs, resumable SSE streams
|
|
365
|
+
with subgraph and expanded stream modes, cron APIs and scheduler dispatch,
|
|
366
|
+
Store API, MCP, A2A, Redis-backed durable execution, and Docker/runtime
|
|
367
|
+
helpers
|
|
230
368
|
- Intentionally missing: distributed runtime orchestration parity, full
|
|
231
|
-
assistant version management, assistant
|
|
232
|
-
|
|
369
|
+
assistant version management, and full assistant helper parity beyond the
|
|
370
|
+
core CRUD and schema flows
|
|
233
371
|
|
|
234
372
|
## 🚚 Deployment Roles
|
|
235
373
|
|
|
@@ -271,7 +409,7 @@ Useful config fields:
|
|
|
271
409
|
Endpoint-level LangGraph config keys such as `http` and `api_version` are
|
|
272
410
|
tolerated by the CLI layer where possible. Store config is used by the HTTP
|
|
273
411
|
Store API and the injected LangGraph `BaseStore` runtime for TTL and semantic
|
|
274
|
-
search. This repo uses the published `langchain-oceanbase==0.5.
|
|
412
|
+
search. This repo uses the published `langchain-oceanbase==0.5.2` package from
|
|
275
413
|
PyPI.
|
|
276
414
|
|
|
277
415
|
Config-driven custom auth can live in `agentseek.json` or `langgraph.json`:
|
|
@@ -518,14 +656,12 @@ parent api build --config ./langgraph.json -t my-api:dev
|
|
|
518
656
|
- `METADATA_DB_BACKEND=auto` normalizes drivers:
|
|
519
657
|
- PostgreSQL: `postgresql+asyncpg://...`
|
|
520
658
|
- OceanBase / MySQL: `mysql+aiomysql://...`
|
|
521
|
-
- Checkpoint persistence defaults to OceanBase /
|
|
522
|
-
- Auth
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
- `AUTH_TYPE=api_key` with `AUTH_API_KEYS=key=user_id[,key2=user2]`
|
|
526
|
-
- `AUTH_TYPE=jwt` with `AUTH_JWT_SECRET`, optional
|
|
527
|
-
`AUTH_JWT_ALGORITHM=HS256`, and `sub` as the user identity
|
|
659
|
+
- Checkpoint persistence defaults to OceanBase / seekdb settings
|
|
660
|
+
- Auth: configure via `agentseek.json` `"auth.path"` or `AUTH_MODULE_PATH` env var.
|
|
661
|
+
Uses `langgraph_sdk.Auth` with `@auth.authenticate` and `@auth.on` handlers.
|
|
662
|
+
If not set, all requests pass through as default_user (noop).
|
|
528
663
|
- Assistant management, thread, and run endpoints enforce configured auth.
|
|
664
|
+
Resource-level filtering is supported via `@auth.on` handlers.
|
|
529
665
|
|
|
530
666
|
### Durable execution
|
|
531
667
|
|
|
@@ -540,6 +676,9 @@ parent api build --config ./langgraph.json -t my-api:dev
|
|
|
540
676
|
|
|
541
677
|
- `examples/minimal_agentseek/agentseek.json`: minimal first-time config
|
|
542
678
|
- `examples/assistant_config/`: assistant config/context/metadata starter
|
|
679
|
+
- `examples/auth/api_key_auth.py`: API key authentication using `langgraph_sdk.Auth`
|
|
680
|
+
- `examples/auth/bearer_token_auth.py`: bearer token authentication
|
|
681
|
+
- `examples/auth/jwt_auth.py`: JWT authentication with JWKS validation
|
|
543
682
|
- `examples/auth/custom_backend.py`: custom auth backend
|
|
544
683
|
- `examples/auth/jwt.md`: JWT auth environment contract
|
|
545
684
|
- `examples/custom_routes/app.py`: mounting custom FastAPI routes around the
|
|
@@ -577,10 +716,10 @@ make test-redis-docker
|
|
|
577
716
|
```
|
|
578
717
|
|
|
579
718
|
GitHub Actions also runs the Docker-backed backend matrix against MySQL,
|
|
580
|
-
|
|
719
|
+
seekdb, and OceanBase, including the dedicated `Redis Durable Execution`
|
|
581
720
|
workflow jobs.
|
|
582
721
|
|
|
583
|
-
For local embedded
|
|
722
|
+
For local embedded seekdb smoke coverage, install the optional extra first:
|
|
584
723
|
|
|
585
724
|
```bash
|
|
586
725
|
uv sync --dev --extra embedded
|
|
@@ -616,7 +755,7 @@ The live-provider workflow is the canonical proof for real SSE
|
|
|
616
755
|
`message_chunk` events from provider-backed graphs, and it now also covers
|
|
617
756
|
provider-backed Store, MCP, and HITL flows in a tiered backend matrix:
|
|
618
757
|
|
|
619
|
-
-
|
|
758
|
+
- seekdb: full Streaming + Store + MCP + HITL acceptance
|
|
620
759
|
- OceanBase: full Streaming + Store + MCP + HITL acceptance
|
|
621
760
|
- MySQL: Streaming + HITL compatibility
|
|
622
761
|
- PostgreSQL metadata: Streaming + MCP compatibility while runtime
|
|
@@ -636,11 +775,66 @@ Use `ci.yml` for the normal development signal, and use
|
|
|
636
775
|
`live-provider-streaming.yml` when you need explicit proof that real providers
|
|
637
776
|
still satisfy the intended streaming, Store, MCP, and HITL contracts.
|
|
638
777
|
|
|
639
|
-
##
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
778
|
+
## 🧱 Built On
|
|
779
|
+
|
|
780
|
+
AgentSeek API is glue around a small set of upstream projects and infra.
|
|
781
|
+
|
|
782
|
+
**Core pillars**
|
|
783
|
+
|
|
784
|
+
- [LangGraph](https://github.com/langchain-ai/langgraph) — graph runtime that
|
|
785
|
+
executes registered assistants
|
|
786
|
+
- [langchain-oceanbase](https://pypi.org/project/langchain-oceanbase/) —
|
|
787
|
+
checkpointer and store implementation, the primary path for graph state
|
|
788
|
+
- [OceanBase](https://github.com/oceanbase/oceanbase) /
|
|
789
|
+
[seekdb](https://github.com/oceanbase/seekdb) — first-class supported
|
|
790
|
+
databases for checkpoint and store persistence
|
|
791
|
+
- [Redis](https://github.com/redis/redis) — run queue, worker lease, and
|
|
792
|
+
stream-event persistence when `EXECUTOR_BACKEND=redis`
|
|
793
|
+
- [FastAPI](https://github.com/tiangolo/fastapi) — HTTP framework for every
|
|
794
|
+
`/assistants`, `/threads`, `/runs`, `/mcp`, `/a2a` surface
|
|
795
|
+
- [Model Context Protocol (MCP)](https://github.com/modelcontextprotocol/python-sdk)
|
|
796
|
+
— registered graphs exposed as MCP tools over Streamable HTTP at `/mcp`
|
|
797
|
+
- [A2A SDK](https://github.com/a2aproject/a2a-python) — assistant-to-assistant
|
|
798
|
+
RPC and agent-card discovery shape under `/a2a`
|
|
799
|
+
|
|
800
|
+
<details>
|
|
801
|
+
<summary>Full dependency list</summary>
|
|
802
|
+
|
|
803
|
+
**Runtime & API**
|
|
804
|
+
- [Uvicorn](https://github.com/encode/uvicorn) — ASGI server used by
|
|
805
|
+
`agentseek-api dev` and `serve`
|
|
806
|
+
- [Pydantic](https://github.com/pydantic/pydantic) and pydantic-settings —
|
|
807
|
+
request/response models and env-driven configuration
|
|
808
|
+
- [scalar-fastapi](https://github.com/scalar/scalar) — alternate API docs
|
|
809
|
+
rendering at `/scalar`
|
|
810
|
+
|
|
811
|
+
**LangChain / LangGraph stack**
|
|
812
|
+
- [LangChain Core](https://github.com/langchain-ai/langchain) and
|
|
813
|
+
[langgraph-sdk](https://github.com/langchain-ai/langgraph) — message,
|
|
814
|
+
tool, and SDK contracts the API speaks
|
|
815
|
+
- [langchain-openai](https://github.com/langchain-ai/langchain) /
|
|
816
|
+
[langchain-anthropic](https://github.com/langchain-ai/langchain) —
|
|
817
|
+
provider integrations used by sample graphs and live-provider CI
|
|
818
|
+
- [Agent Protocol](https://github.com/langchain-ai/agent-protocol) —
|
|
819
|
+
external compatibility reference for the assistants/threads/runs surface
|
|
820
|
+
|
|
821
|
+
**Database drivers**
|
|
822
|
+
- [SQLAlchemy](https://github.com/sqlalchemy/sqlalchemy) (async) plus
|
|
823
|
+
[asyncpg](https://github.com/MagicStack/asyncpg) (PostgreSQL),
|
|
824
|
+
[aiomysql](https://github.com/aio-libs/aiomysql) and
|
|
825
|
+
[PyMySQL](https://github.com/PyMySQL/PyMySQL) (MySQL family),
|
|
826
|
+
[aiosqlite](https://github.com/omnilib/aiosqlite) (SQLite)
|
|
827
|
+
- [redis-py](https://github.com/redis/redis-py) — async Redis client
|
|
828
|
+
|
|
829
|
+
**Interop**
|
|
830
|
+
- [LangSmith Studio](https://smith.langchain.com/) — external UI that
|
|
831
|
+
connects to the local API for graph inspection and runs
|
|
832
|
+
|
|
833
|
+
**Packaging & runtime delivery**
|
|
834
|
+
- [uv](https://github.com/astral-sh/uv) — dependency resolution and the
|
|
835
|
+
recommended way to run the CLI
|
|
836
|
+
- [Hatchling](https://github.com/pypa/hatch) — wheel build backend
|
|
837
|
+
- [Docker](https://www.docker.com/) — `dockerfile`, `build`, and `up`
|
|
838
|
+
commands generate and run a containerized API
|
|
839
|
+
|
|
840
|
+
</details>
|