graph-agents-cli 0.3.1__py3-none-any.whl
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.
- graph_agents_cli/__init__.py +26 -0
- graph_agents_cli/_api_policy.py +2145 -0
- graph_agents_cli/_approvals.py +400 -0
- graph_agents_cli/_build.py +186 -0
- graph_agents_cli/_build_info.json +7 -0
- graph_agents_cli/_chat_client.py +462 -0
- graph_agents_cli/_click.py +157 -0
- graph_agents_cli/_defaults.py +139 -0
- graph_agents_cli/_experiments.py +64 -0
- graph_agents_cli/_http.py +192 -0
- graph_agents_cli/_output.py +83 -0
- graph_agents_cli/_project.py +462 -0
- graph_agents_cli/_remote.py +220 -0
- graph_agents_cli/_response_schema.py +264 -0
- graph_agents_cli/_runner.py +319 -0
- graph_agents_cli/_skills_check.py +274 -0
- graph_agents_cli/_tools.py +189 -0
- graph_agents_cli/_trust.py +66 -0
- graph_agents_cli/api/__init__.py +15 -0
- graph_agents_cli/api/_changes.py +506 -0
- graph_agents_cli/api/_files.py +658 -0
- graph_agents_cli/api/cmd_api.py +2480 -0
- graph_agents_cli/deploy/__init__.py +15 -0
- graph_agents_cli/deploy/_config.py +171 -0
- graph_agents_cli/deploy/_image.py +128 -0
- graph_agents_cli/deploy/_kube.py +286 -0
- graph_agents_cli/deploy/_modes.py +234 -0
- graph_agents_cli/deploy/_preflight.py +370 -0
- graph_agents_cli/deploy/_values.py +168 -0
- graph_agents_cli/deploy/cmd_deploy.py +1866 -0
- graph_agents_cli/deploy/gitops.py +562 -0
- graph_agents_cli/deploy/local_load.py +273 -0
- graph_agents_cli/dev/__init__.py +13 -0
- graph_agents_cli/dev/cmd_build.py +131 -0
- graph_agents_cli/dev/cmd_install.py +78 -0
- graph_agents_cli/dev/cmd_lint.py +119 -0
- graph_agents_cli/dev/cmd_playground.py +297 -0
- graph_agents_cli/dev/policy_check.py +1287 -0
- graph_agents_cli/eval/__init__.py +22 -0
- graph_agents_cli/eval/_client.py +670 -0
- graph_agents_cli/eval/_common.py +177 -0
- graph_agents_cli/eval/_judge.py +168 -0
- graph_agents_cli/eval/_judge_runner.py +238 -0
- graph_agents_cli/eval/_paths.py +212 -0
- graph_agents_cli/eval/checks.py +581 -0
- graph_agents_cli/eval/cmd_analyze.py +278 -0
- graph_agents_cli/eval/cmd_compare.py +284 -0
- graph_agents_cli/eval/cmd_eval_group.py +80 -0
- graph_agents_cli/eval/cmd_generate.py +558 -0
- graph_agents_cli/eval/cmd_grade.py +466 -0
- graph_agents_cli/eval/cmd_metric.py +156 -0
- graph_agents_cli/eval/cmd_run.py +370 -0
- graph_agents_cli/eval/cmd_submit.py +400 -0
- graph_agents_cli/eval/config.py +435 -0
- graph_agents_cli/eval/dataset.py +350 -0
- graph_agents_cli/eval/gate.py +420 -0
- graph_agents_cli/eval/transcript.py +192 -0
- graph_agents_cli/extension/__init__.py +13 -0
- graph_agents_cli/extension/_compat.py +86 -0
- graph_agents_cli/extension/_loader.py +293 -0
- graph_agents_cli/extension/_manifest.py +135 -0
- graph_agents_cli/extension/_overrides.py +195 -0
- graph_agents_cli/extension/_paths.py +91 -0
- graph_agents_cli/extension/_refs.py +193 -0
- graph_agents_cli/extension/_resolver.py +453 -0
- graph_agents_cli/extension/_schema.py +106 -0
- graph_agents_cli/extension/_spec.py +253 -0
- graph_agents_cli/extension/_sync.py +102 -0
- graph_agents_cli/extension/_trust.py +58 -0
- graph_agents_cli/extension/cmd_extension_add.py +259 -0
- graph_agents_cli/extension/cmd_extension_group.py +57 -0
- graph_agents_cli/extension/cmd_extension_list.py +56 -0
- graph_agents_cli/extension/cmd_extension_remove.py +61 -0
- graph_agents_cli/extension/cmd_extension_update.py +195 -0
- graph_agents_cli/info/__init__.py +13 -0
- graph_agents_cli/info/cmd_info.py +222 -0
- graph_agents_cli/infra/__init__.py +15 -0
- graph_agents_cli/infra/checks.py +1169 -0
- graph_agents_cli/infra/cmd_infra.py +103 -0
- graph_agents_cli/main.py +591 -0
- graph_agents_cli/peer/__init__.py +15 -0
- graph_agents_cli/peer/_generate.py +254 -0
- graph_agents_cli/peer/cmd_peer.py +1151 -0
- graph_agents_cli/run/__init__.py +13 -0
- graph_agents_cli/run/_local_server.py +1157 -0
- graph_agents_cli/run/_signals.py +141 -0
- graph_agents_cli/run/cmd_approvals.py +530 -0
- graph_agents_cli/run/cmd_run.py +1421 -0
- graph_agents_cli/scaffold/__init__.py +19 -0
- graph_agents_cli/scaffold/agents/README.md +24 -0
- graph_agents_cli/scaffold/agents/empty_py/.template/templateconfig.yaml +22 -0
- graph_agents_cli/scaffold/agents/langgraph/.env.example +292 -0
- graph_agents_cli/scaffold/agents/langgraph/.template/templateconfig.yaml +28 -0
- graph_agents_cli/scaffold/agents/langgraph/Dockerfile +59 -0
- graph_agents_cli/scaffold/agents/langgraph/Dockerfile.langgraph-server +59 -0
- graph_agents_cli/scaffold/agents/langgraph/README.md +571 -0
- graph_agents_cli/scaffold/agents/langgraph/api-policy.yaml +60 -0
- graph_agents_cli/scaffold/agents/langgraph/app/__init__.py +20 -0
- graph_agents_cli/scaffold/agents/langgraph/app/agent.py +174 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/__init__.py +15 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/a2a.py +2162 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/a2a_client.py +1167 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/api_client.py +4220 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/approvals.py +1349 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/auth.py +1986 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/chat.py +2962 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/checkpointer.py +432 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/content.py +569 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/db.py +580 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/limits.py +203 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/metrics.py +231 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/middleware.py +361 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/model.py +611 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/playground.py +230 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/run_locks.py +459 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/structured.py +755 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/telemetry.py +681 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/threads.py +493 -0
- graph_agents_cli/scaffold/agents/langgraph/app/app_utils/token_exchange.py +959 -0
- graph_agents_cli/scaffold/agents/langgraph/app/fast_api_app.py +770 -0
- graph_agents_cli/scaffold/agents/langgraph/app/policies/__init__.py +55 -0
- graph_agents_cli/scaffold/agents/langgraph/app/policies/custom.py +97 -0
- graph_agents_cli/scaffold/agents/langgraph/app/tools/__init__.py +46 -0
- graph_agents_cli/scaffold/agents/langgraph/app/tools/example_api.py +92 -0
- graph_agents_cli/scaffold/agents/langgraph/app/tools/weather.py +33 -0
- graph_agents_cli/scaffold/agents/langgraph/langgraph.json +14 -0
- graph_agents_cli/scaffold/agents/langgraph/pyproject.toml +78 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/conftest.py +376 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/eval/datasets/basic-dataset.json +53 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/eval/eval_config.yaml +32 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/approval_graph.py +137 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/fake_issuer.py +216 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/fake_openai.py +357 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_a2a_outcomes.py +569 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_a2a_relay.py +479 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_api_surface.py +812 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_approvals.py +1367 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_approvals_server.py +794 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_cross_actor.py +497 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_cross_actor_server.py +247 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_history_repair.py +278 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_model_apis.py +242 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_postgres.py +637 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_resilience_postgres.py +770 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_runtime_guardrails.py +854 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_server_e2e.py +340 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_server_runtime.py +989 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_structured_answers.py +584 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_structured_server.py +222 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_token_exchange_issuer.py +650 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/load_test/.results/.placeholder +0 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/load_test/README.md +22 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/load_test/conftest.py +21 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/load_test/load_test.py +81 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_a2a_client.py +824 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_a2a_scoping.py +724 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_api_client.py +1214 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_api_client_hardening.py +716 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_api_policy_rpc.py +767 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_approval_ledger.py +1536 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_fake_model.py +115 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_jwt_policy.py +991 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_limits.py +310 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_logging.py +148 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_logging_hardening.py +271 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_policy.py +378 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_resilience.py +610 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_server_auth.py +702 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_structured.py +673 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_telemetry.py +404 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_thread_listing.py +255 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_threads.py +268 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_token_exchange.py +1320 -0
- graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_untrusted_content.py +393 -0
- graph_agents_cli/scaffold/agents/langgraph/uv-fastapi.lock +2084 -0
- graph_agents_cli/scaffold/agents/langgraph/uv-langgraph-server.lock +2106 -0
- graph_agents_cli/scaffold/agents/langgraph/{{cookiecutter.agent_guidance_filename}} +129 -0
- graph_agents_cli/scaffold/base_templates/_shared/graph-agents-cli-manifest.yaml +36 -0
- graph_agents_cli/scaffold/base_templates/python/.dockerignore +32 -0
- graph_agents_cli/scaffold/base_templates/python/.github/CODEOWNERS +30 -0
- graph_agents_cli/scaffold/base_templates/python/.github/agent.env +7 -0
- graph_agents_cli/scaffold/base_templates/python/.github/workflows/pr_checks.yaml +214 -0
- graph_agents_cli/scaffold/base_templates/python/.gitignore +209 -0
- graph_agents_cli/scaffold/base_templates/python/tests/unit/test_dummy.py +23 -0
- graph_agents_cli/scaffold/base_templates/python/{{cookiecutter.agent_guidance_filename}} +35 -0
- graph_agents_cli/scaffold/cmd_scaffold_group.py +49 -0
- graph_agents_cli/scaffold/commands/__init__.py +13 -0
- graph_agents_cli/scaffold/commands/create.py +1424 -0
- graph_agents_cli/scaffold/commands/enhance.py +1652 -0
- graph_agents_cli/scaffold/commands/upgrade.py +570 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/.github/agent.env +12 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/.github/workflows/promote-to-prod.yaml +371 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/.github/workflows/staging.yaml +450 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/argocd/application-dev.yaml +43 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/argocd/application-prod.yaml +41 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/argocd/application-staging.yaml +43 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/.helmignore +14 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/Chart.yaml +21 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/examples/networkpolicy.yaml +103 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/NOTES.txt +48 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/_helpers.tpl +189 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/certificate.yaml +15 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/configmap.yaml +10 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/deployment.yaml +199 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/hpa.yaml +22 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/httproute.yaml +30 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/ingress.yaml +39 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/networkpolicy.yaml +48 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/pdb.yaml +13 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/postgresql-secret.yaml +37 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/service.yaml +15 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/serviceaccount.yaml +13 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/servicemonitor.yaml +42 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/values-dev.yaml +22 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/values-prod.yaml +45 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/values-staging.yaml +29 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/values.yaml +396 -0
- graph_agents_cli/scaffold/deployment_targets/kubernetes/python/tests/integration/test_chart.py +269 -0
- graph_agents_cli/scaffold/deployment_targets/none/README.md +5 -0
- graph_agents_cli/scaffold/deployment_targets/none/python/README.md +6 -0
- graph_agents_cli/scaffold/utils/__init__.py +13 -0
- graph_agents_cli/scaffold/utils/backup.py +212 -0
- graph_agents_cli/scaffold/utils/build_record.py +257 -0
- graph_agents_cli/scaffold/utils/cli_options.py +184 -0
- graph_agents_cli/scaffold/utils/fs.py +83 -0
- graph_agents_cli/scaffold/utils/generate_locks.py +214 -0
- graph_agents_cli/scaffold/utils/generation_metadata.py +88 -0
- graph_agents_cli/scaffold/utils/keyedit.py +768 -0
- graph_agents_cli/scaffold/utils/keymerge.py +537 -0
- graph_agents_cli/scaffold/utils/language.py +138 -0
- graph_agents_cli/scaffold/utils/lock_utils.py +94 -0
- graph_agents_cli/scaffold/utils/logging.py +77 -0
- graph_agents_cli/scaffold/utils/manifest.py +292 -0
- graph_agents_cli/scaffold/utils/merge.py +970 -0
- graph_agents_cli/scaffold/utils/merge3.py +216 -0
- graph_agents_cli/scaffold/utils/openapi_seed.py +199 -0
- graph_agents_cli/scaffold/utils/remote_template.py +376 -0
- graph_agents_cli/scaffold/utils/template.py +1352 -0
- graph_agents_cli/scaffold/utils/upgrade.py +894 -0
- graph_agents_cli/scaffold/utils/version.py +438 -0
- graph_agents_cli/secrets/__init__.py +15 -0
- graph_agents_cli/secrets/_apply.py +954 -0
- graph_agents_cli/secrets/_required.py +188 -0
- graph_agents_cli/secrets/cmd_secrets.py +211 -0
- graph_agents_cli/setup/__init__.py +13 -0
- graph_agents_cli/setup/_antigravity.py +221 -0
- graph_agents_cli/setup/cmd_auth.py +1030 -0
- graph_agents_cli/setup/cmd_dev_token.py +513 -0
- graph_agents_cli/setup/cmd_setup.py +428 -0
- graph_agents_cli/setup/cmd_update.py +140 -0
- graph_agents_cli/skills/__init__.py +13 -0
- graph_agents_cli/skills/_bundle.py +65 -0
- graph_agents_cli/skills/data/README.md +19 -0
- graph_agents_cli/skills/data/graph-agents-cli-deploy/SKILL.md +357 -0
- graph_agents_cli/skills/data/graph-agents-cli-deploy/references/github-settings.md +113 -0
- graph_agents_cli/skills/data/graph-agents-cli-deploy/references/gitops.md +137 -0
- graph_agents_cli/skills/data/graph-agents-cli-deploy/references/kubernetes.md +315 -0
- graph_agents_cli/skills/data/graph-agents-cli-deploy/references/secrets.md +160 -0
- graph_agents_cli/skills/data/graph-agents-cli-eval/SKILL.md +303 -0
- graph_agents_cli/skills/data/graph-agents-cli-eval/references/dataset_schema.md +282 -0
- graph_agents_cli/skills/data/graph-agents-cli-eval/references/metrics-guide.md +143 -0
- graph_agents_cli/skills/data/graph-agents-cli-langgraph-code/SKILL.md +659 -0
- graph_agents_cli/skills/data/graph-agents-cli-langgraph-code/references/langchain-models.md +124 -0
- graph_agents_cli/skills/data/graph-agents-cli-langgraph-code/references/langgraph.md +235 -0
- graph_agents_cli/skills/data/graph-agents-cli-langgraph-code/references/template-contract.md +477 -0
- graph_agents_cli/skills/data/graph-agents-cli-observability/SKILL.md +231 -0
- graph_agents_cli/skills/data/graph-agents-cli-observability/references/langsmith.md +46 -0
- graph_agents_cli/skills/data/graph-agents-cli-observability/references/otel.md +59 -0
- graph_agents_cli/skills/data/graph-agents-cli-scaffold/SKILL.md +414 -0
- graph_agents_cli/skills/data/graph-agents-cli-scaffold/references/flags.md +134 -0
- graph_agents_cli/skills/data/graph-agents-cli-workflow/SKILL.md +478 -0
- graph_agents_cli/skills/data/graph-agents-cli-workflow/references/brainstorming.md +118 -0
- graph_agents_cli/skills/data/graph-agents-cli-workflow/references/commands.md +419 -0
- graph_agents_cli/skills/data/graph-agents-cli-workflow/references/extension.md +156 -0
- graph_agents_cli/skills/data/graph-agents-cli-workflow/references/internals.md +67 -0
- graph_agents_cli/skills/data/graph-agents-cli-workflow/references/spec-template.md +56 -0
- graph_agents_cli/skills/data/graph-agents-cli-workflow/references/terminology.md +119 -0
- graph_agents_cli/system/__init__.py +15 -0
- graph_agents_cli/system/_apply.py +519 -0
- graph_agents_cli/system/_checks.py +1023 -0
- graph_agents_cli/system/_deploy.py +215 -0
- graph_agents_cli/system/_model.py +363 -0
- graph_agents_cli/system/_system.py +664 -0
- graph_agents_cli/system/_views.py +208 -0
- graph_agents_cli/system/cmd_system.py +423 -0
- graph_agents_cli-0.3.1.dist-info/METADATA +162 -0
- graph_agents_cli-0.3.1.dist-info/RECORD +291 -0
- graph_agents_cli-0.3.1.dist-info/WHEEL +4 -0
- graph_agents_cli-0.3.1.dist-info/entry_points.txt +2 -0
- graph_agents_cli-0.3.1.dist-info/licenses/LICENSE +201 -0
- graph_agents_cli-0.3.1.dist-info/licenses/NOTICE +19 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Copyright 2026 graph-agents-cli contributors
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
"""AuthPolicy registry: `AUTH_POLICY` value -> policy factory.
|
|
16
|
+
|
|
17
|
+
Agent code, never touched by `graph-agents-cli scaffold upgrade`. Add a policy
|
|
18
|
+
by registering its factory here.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from collections.abc import Callable
|
|
24
|
+
|
|
25
|
+
from {{cookiecutter.agent_directory}}.app_utils.auth import (
|
|
26
|
+
CUSTOM,
|
|
27
|
+
JWT,
|
|
28
|
+
SHARED_BEARER,
|
|
29
|
+
AuthPolicy,
|
|
30
|
+
JwtPolicy,
|
|
31
|
+
SharedBearerPolicy,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _custom() -> AuthPolicy:
|
|
36
|
+
from {{cookiecutter.agent_directory}}.policies.custom import CustomPolicy
|
|
37
|
+
|
|
38
|
+
return CustomPolicy()
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
REGISTRY: dict[str, Callable[[], AuthPolicy]] = {
|
|
42
|
+
SHARED_BEARER: SharedBearerPolicy,
|
|
43
|
+
JWT: JwtPolicy,
|
|
44
|
+
CUSTOM: _custom,
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def build_policy(name: str) -> AuthPolicy:
|
|
49
|
+
try:
|
|
50
|
+
factory = REGISTRY[name]
|
|
51
|
+
except KeyError:
|
|
52
|
+
raise RuntimeError(
|
|
53
|
+
f"Unknown AUTH_POLICY {name!r}; expected one of {sorted(REGISTRY)}."
|
|
54
|
+
) from None
|
|
55
|
+
return factory()
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Copyright 2026 graph-agents-cli contributors
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
"""`custom` policy: the interface the project implements, shipped as a fail-closed stub.
|
|
16
|
+
|
|
17
|
+
Use it when callers authenticate with something the built-in policies do not
|
|
18
|
+
cover, for example the session cookie of an existing application (for OIDC
|
|
19
|
+
bearer tokens use the built-in `jwt` policy instead). The same policy object
|
|
20
|
+
guards every surface: the chat and thread routes, the A2A card and JSON-RPC
|
|
21
|
+
endpoint, and, under `langgraph-server`, the server's native API.
|
|
22
|
+
|
|
23
|
+
Implement `CustomPolicy` so that, on every request:
|
|
24
|
+
|
|
25
|
+
* `authenticate(request)` validates the caller's credential (a cookie, a
|
|
26
|
+
header, a token) against the system that issued it and returns a
|
|
27
|
+
`Principal`:
|
|
28
|
+
- `id`: stable and unique per caller. It owns threads and A2A tasks (two
|
|
29
|
+
callers with the same id see each other's conversations), and is hashed
|
|
30
|
+
into traces and run records.
|
|
31
|
+
- `roles`: matched against `AUTH_READ_ACROSS_ROLES` (may read other
|
|
32
|
+
principals' threads) and `AUTH_ADMIN_ROLES` (may manage assistants, crons
|
|
33
|
+
and the store under langgraph-server). Role names must not contain commas.
|
|
34
|
+
- `permissions`: usually `set(ACTIONS)`; `authorize` decides per action.
|
|
35
|
+
- `attributes`: optional, for example `tenant`. Secrets go only under
|
|
36
|
+
`attributes["credentials"][<api name>]` (see below). Keys starting with
|
|
37
|
+
`@` belong to the framework.
|
|
38
|
+
- `actor`: None when the caller is the user. When the credential shows that
|
|
39
|
+
another agent presents it for the user, `Actor(id=<that agent>)` (with
|
|
40
|
+
`chain`, the agents before it). A policy through which other agents
|
|
41
|
+
forward users' credentials must set it, or this agent treats the calling
|
|
42
|
+
agent as the person. `app_utils.auth.actor_from_claims` reads an RFC 8693
|
|
43
|
+
`act` claim as the `jwt` policy does.
|
|
44
|
+
Ids (`id`, the actor's) are 1-256 characters without control characters;
|
|
45
|
+
anything else fails the request with 500 (a bug in the policy).
|
|
46
|
+
`finalize_principal` then applies `AUTH_ALLOWED_ACTORS`,
|
|
47
|
+
`AUTH_DELEGATED_ROLES` and `AUTH_MAX_DELEGATION_DEPTH` to every policy.
|
|
48
|
+
A missing or invalid credential raises `HTTPException(401)` with a
|
|
49
|
+
`WWW-Authenticate` header; a server-side problem (the issuer cannot be
|
|
50
|
+
reached) raises `HTTPException(503)`. Never put the credential itself in an
|
|
51
|
+
error detail or a log line.
|
|
52
|
+
* `authorize(principal, action, resource)` allows or refuses `action` (see
|
|
53
|
+
`app_utils.auth.ACTIONS`) on `resource` (a thread id or None) with
|
|
54
|
+
`HTTPException(403)`. Thread ownership is enforced separately, by
|
|
55
|
+
`app_utils.threads` (fastapi) and the owner filters in `app_utils.auth`
|
|
56
|
+
(langgraph-server).
|
|
57
|
+
* Optionally `startup_problems() -> list[str]`: configuration problems found
|
|
58
|
+
when the app starts. Any problem stops the process outside `APP_ENV=dev`
|
|
59
|
+
(see `app_utils.auth.check_startup`).
|
|
60
|
+
|
|
61
|
+
Both methods are awaited on the request path: do blocking I/O through an
|
|
62
|
+
async client, and cache what you can (sessions, keys) with a short TTL.
|
|
63
|
+
|
|
64
|
+
To let tools call an `auth: forward` API of `api-policy.yaml` with the caller's
|
|
65
|
+
own credential, put it in `attributes["credentials"][<api name>]`; that is the
|
|
66
|
+
only attribute that may hold a secret (`Principal.public_attributes()` is what
|
|
67
|
+
gets persisted, logged or traced).
|
|
68
|
+
|
|
69
|
+
Until it is implemented every request fails with 503, and
|
|
70
|
+
`graph-agents-cli deploy --env staging|prod` refuses while the manifest says
|
|
71
|
+
`auth_policy_implemented: false`. Flip that flag after replacing this stub,
|
|
72
|
+
and add tests beside `tests/unit/test_policy.py` (a valid credential, a
|
|
73
|
+
missing one, an invalid one, and two principals that must not see each
|
|
74
|
+
other's threads).
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
from __future__ import annotations
|
|
78
|
+
|
|
79
|
+
from fastapi import HTTPException, Request
|
|
80
|
+
|
|
81
|
+
from {{cookiecutter.agent_directory}}.app_utils.auth import Principal
|
|
82
|
+
|
|
83
|
+
NOT_IMPLEMENTED = (
|
|
84
|
+
"AUTH_POLICY=custom is scaffolded as a fail-closed stub. Implement CustomPolicy in "
|
|
85
|
+
"{{cookiecutter.agent_directory}}/policies/custom.py (authenticate the caller, load roles "
|
|
86
|
+
"and permissions) and set auth_policy_implemented: true in graph-agents-cli-manifest.yaml."
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class CustomPolicy:
|
|
91
|
+
"""The project's own authentication and authorization. Stub: fails closed."""
|
|
92
|
+
|
|
93
|
+
async def authenticate(self, request: Request) -> Principal:
|
|
94
|
+
raise HTTPException(status_code=503, detail=NOT_IMPLEMENTED)
|
|
95
|
+
|
|
96
|
+
async def authorize(self, principal: Principal, action: str, resource: str | None) -> None:
|
|
97
|
+
raise HTTPException(status_code=503, detail=NOT_IMPLEMENTED)
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Copyright 2026 graph-agents-cli contributors
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
"""Tool registry.
|
|
16
|
+
|
|
17
|
+
Convention: every module in this package declares ``API_CALLS``, a
|
|
18
|
+
module-level list of ``{"api", "method", "operation_id", "path"}`` dicts naming
|
|
19
|
+
every external API call it makes (``[]`` when it makes none), and ``TOOLS``,
|
|
20
|
+
the list of tool objects it contributes. External calls go through
|
|
21
|
+
``app_utils.api_client.get_client`` only, which enforces `api-policy.yaml` at
|
|
22
|
+
runtime; `graph-agents-cli lint` checks the declarations against the same file.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
import importlib
|
|
28
|
+
import logging
|
|
29
|
+
import pkgutil
|
|
30
|
+
from typing import Any
|
|
31
|
+
|
|
32
|
+
logger = logging.getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def get_tools() -> list[Any]:
|
|
36
|
+
"""Every tool contributed by the modules of this package, in module-name order."""
|
|
37
|
+
tools: list[Any] = []
|
|
38
|
+
for info in sorted(pkgutil.iter_modules(__path__), key=lambda i: i.name):
|
|
39
|
+
module = importlib.import_module(f"{__name__}.{info.name}")
|
|
40
|
+
if not hasattr(module, "API_CALLS"):
|
|
41
|
+
logger.warning(
|
|
42
|
+
"%s declares no API_CALLS (use [] when it calls no external API).",
|
|
43
|
+
module.__name__,
|
|
44
|
+
)
|
|
45
|
+
tools.extend(getattr(module, "TOOLS", []))
|
|
46
|
+
return tools
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
{% if cookiecutter.example_api -%}
|
|
2
|
+
# Copyright 2026 graph-agents-cli contributors
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
"""Example API tool: one explicit call through the policy-enforcing client.
|
|
17
|
+
|
|
18
|
+
Generated from `api-policy.yaml`: the call is the first operation its first API
|
|
19
|
+
allows, whatever its method (an `allowed_operations` entry, else an operation
|
|
20
|
+
of its OpenAPI spec), so it passes `graph-agents-cli lint` and the policy test
|
|
21
|
+
as generated. It is one concrete, declared call rather than a generic
|
|
22
|
+
"any method, any path" tool, because lint can only check calls a tool declares.
|
|
23
|
+
It shows the pattern every tool that calls an external API follows: declare
|
|
24
|
+
each call in `API_CALLS` (checked by `graph-agents-cli lint`), send it through
|
|
25
|
+
`app_utils.api_client.get_client` (which refuses anything outside
|
|
26
|
+
`api-policy.yaml` before sending), and pass the run context so an
|
|
27
|
+
`auth: forward` API receives the caller's own credential. Replace the call with
|
|
28
|
+
the one your agent needs, or delete this module.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
from __future__ import annotations
|
|
32
|
+
|
|
33
|
+
import json
|
|
34
|
+
from typing import Any
|
|
35
|
+
|
|
36
|
+
from langchain.tools import ToolRuntime
|
|
37
|
+
from langchain_core.tools import tool
|
|
38
|
+
|
|
39
|
+
from {{cookiecutter.agent_directory}}.app_utils.api_client import get_client
|
|
40
|
+
|
|
41
|
+
API_CALLS: list[dict[str, str]] = [
|
|
42
|
+
{
|
|
43
|
+
"api": "{{ cookiecutter.example_api.api }}",
|
|
44
|
+
"method": "{{ cookiecutter.example_api.method }}",
|
|
45
|
+
{%- if cookiecutter.example_api.operation_id %}
|
|
46
|
+
"operation_id": "{{ cookiecutter.example_api.operation_id }}",
|
|
47
|
+
{%- endif %}
|
|
48
|
+
"path": "{{ cookiecutter.example_api.path }}",
|
|
49
|
+
},
|
|
50
|
+
]
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@tool
|
|
54
|
+
async def call_{{ cookiecutter.example_api.api }}_api(
|
|
55
|
+
{%- for name in cookiecutter.example_api.params %}
|
|
56
|
+
{{ name }}: str,
|
|
57
|
+
{%- endfor %}
|
|
58
|
+
{%- if cookiecutter.example_api.has_body %}
|
|
59
|
+
body: dict[str, Any],
|
|
60
|
+
{%- endif %}
|
|
61
|
+
runtime: ToolRuntime[Any],
|
|
62
|
+
) -> str:
|
|
63
|
+
"""{{ cookiecutter.example_api.method }} {{ cookiecutter.example_api.path }} on the {{ cookiecutter.example_api.api }} API{% if cookiecutter.example_api.has_body %} with `body` as the JSON request body{% endif %}; return the response as JSON."""
|
|
64
|
+
context: Any = getattr(runtime, "context", None)
|
|
65
|
+
client = get_client("{{ cookiecutter.example_api.api }}", context=context)
|
|
66
|
+
# The path stays the declared template; the client encodes each path
|
|
67
|
+
# parameter as one segment and refuses `.`/`..`, so model input cannot reach
|
|
68
|
+
# another endpoint. A refusal (ApiPolicyError, also when the API's limits are
|
|
69
|
+
# reached) or a failed call (ApiCallError) propagates: agent.py turns it
|
|
70
|
+
# into a tool error the model can read.
|
|
71
|
+
data = await client.request(
|
|
72
|
+
"{{ cookiecutter.example_api.method }}",
|
|
73
|
+
"{{ cookiecutter.example_api.path }}",
|
|
74
|
+
{%- if cookiecutter.example_api.operation_id %}
|
|
75
|
+
operation_id="{{ cookiecutter.example_api.operation_id }}",
|
|
76
|
+
{%- endif %}
|
|
77
|
+
{%- if cookiecutter.example_api.params %}
|
|
78
|
+
path_params={
|
|
79
|
+
{%- for name in cookiecutter.example_api.params %}
|
|
80
|
+
"{{ name }}": {{ name }},
|
|
81
|
+
{%- endfor %}
|
|
82
|
+
},
|
|
83
|
+
{%- endif %}
|
|
84
|
+
{%- if cookiecutter.example_api.has_body %}
|
|
85
|
+
json_body=body,
|
|
86
|
+
{%- endif %}
|
|
87
|
+
)
|
|
88
|
+
return data if isinstance(data, str) else json.dumps(data)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
TOOLS = [call_{{ cookiecutter.example_api.api }}_api]
|
|
92
|
+
{% endif -%}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Copyright 2026 Google LLC
|
|
2
|
+
# Modifications Copyright 2026 graph-agents-cli contributors
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
"""Example tool: a simulated weather lookup. Calls no external API."""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
from langchain_core.tools import tool
|
|
21
|
+
|
|
22
|
+
API_CALLS: list[dict[str, str]] = []
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@tool
|
|
26
|
+
def get_weather(query: str) -> str:
|
|
27
|
+
"""Get the current weather for a place. Use it whenever the user asks about the weather."""
|
|
28
|
+
if "sf" in query.lower() or "san francisco" in query.lower():
|
|
29
|
+
return "It's 60 degrees and foggy."
|
|
30
|
+
return "It's 90 degrees and sunny."
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
TOOLS = [get_weather]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"dependencies": ["."],
|
|
3
|
+
"graphs": {
|
|
4
|
+
"agent": "./{{cookiecutter.agent_directory}}/agent.py:graph"
|
|
5
|
+
},
|
|
6
|
+
"env": ".env",
|
|
7
|
+
"http": {
|
|
8
|
+
"app": "./{{cookiecutter.agent_directory}}/fast_api_app.py:app"
|
|
9
|
+
},
|
|
10
|
+
"auth": {
|
|
11
|
+
"path": "./{{cookiecutter.agent_directory}}/app_utils/auth.py:auth"
|
|
12
|
+
},
|
|
13
|
+
"python_version": "3.12"
|
|
14
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "{{cookiecutter.project_name}}"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "LangGraph agent scaffolded by graph-agents-cli"
|
|
5
|
+
requires-python = ">=3.12,<3.14"
|
|
6
|
+
dependencies = [
|
|
7
|
+
# Agent framework
|
|
8
|
+
"langchain>=1.0,<2",
|
|
9
|
+
"langgraph>=1.0,<2",
|
|
10
|
+
"langchain-core>=1.0,<2",
|
|
11
|
+
# Model providers. All four are installed so MODEL_PROVIDER is a runtime
|
|
12
|
+
# setting (openai-compatible endpoints use langchain-openai).
|
|
13
|
+
"langchain-openai>=1.0,<2",
|
|
14
|
+
"langchain-anthropic>=1.0,<2",
|
|
15
|
+
"langchain-google-genai>=3.0,<5",
|
|
16
|
+
# Server
|
|
17
|
+
"fastapi>=0.115,<1",
|
|
18
|
+
"uvicorn>=0.30,<1",
|
|
19
|
+
"httpx>=0.27,<1",
|
|
20
|
+
"python-dotenv>=1.0,<2",
|
|
21
|
+
"pydantic>=2.7,<3",
|
|
22
|
+
"pyyaml>=6.0,<7",
|
|
23
|
+
# Auth (AUTH_POLICY=jwt verifies OIDC tokens) and Prometheus metrics
|
|
24
|
+
"pyjwt[crypto]>=2.8,<3",
|
|
25
|
+
"prometheus-client>=0.20,<1",
|
|
26
|
+
# Persistence (fastapi runtime binds the checkpointer itself)
|
|
27
|
+
"langgraph-checkpoint-postgres>=2.0,<4",
|
|
28
|
+
"psycopg[binary]>=3.1,<4",
|
|
29
|
+
"psycopg-pool>=3.2,<4",
|
|
30
|
+
# A2A protocol
|
|
31
|
+
"a2a-sdk[http-server]>=1.0,<2",
|
|
32
|
+
# Observability (opt-in at runtime, see .env.example)
|
|
33
|
+
"opentelemetry-sdk>=1.25,<2",
|
|
34
|
+
"opentelemetry-exporter-otlp-proto-http>=1.25,<2",
|
|
35
|
+
"openinference-instrumentation-langchain>=0.1.40,<1",
|
|
36
|
+
"langsmith>=0.3,<1",
|
|
37
|
+
{% if cookiecutter.runtime == 'langgraph-server' %}
|
|
38
|
+
# LangGraph Server runtime: the server package, its SDK (loopback client
|
|
39
|
+
# used by /chat) and the local dev server used by `run` and `playground`.
|
|
40
|
+
"langgraph-api>=0.2,<1",
|
|
41
|
+
"langgraph-sdk>=0.1,<1",
|
|
42
|
+
"langgraph-cli[inmem]>=0.2,<1",
|
|
43
|
+
{% endif %}
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
[dependency-groups]
|
|
47
|
+
dev = [
|
|
48
|
+
"pytest>=8.3,<10",
|
|
49
|
+
"pytest-asyncio>=0.24,<2",
|
|
50
|
+
"httpx>=0.27,<1",
|
|
51
|
+
"ruff>=0.6,<1",
|
|
52
|
+
"langgraph-cli[inmem]>=0.2,<1",
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
[build-system]
|
|
56
|
+
requires = ["hatchling>=1.25"]
|
|
57
|
+
build-backend = "hatchling.build"
|
|
58
|
+
|
|
59
|
+
[tool.hatch.build.targets.wheel]
|
|
60
|
+
packages = ["{{cookiecutter.agent_directory}}"]
|
|
61
|
+
|
|
62
|
+
[tool.pytest.ini_options]
|
|
63
|
+
pythonpath = ["."]
|
|
64
|
+
asyncio_mode = "auto"
|
|
65
|
+
asyncio_default_fixture_loop_scope = "function"
|
|
66
|
+
filterwarnings = ["ignore::DeprecationWarning"]
|
|
67
|
+
|
|
68
|
+
[tool.ruff]
|
|
69
|
+
line-length = 100
|
|
70
|
+
target-version = "py312"
|
|
71
|
+
extend-exclude = [".venv", "tests/load_test/.results"]
|
|
72
|
+
|
|
73
|
+
[tool.ruff.lint]
|
|
74
|
+
select = ["E", "F", "W", "I", "B", "UP", "RUF"]
|
|
75
|
+
ignore = ["E501", "B008"]
|
|
76
|
+
|
|
77
|
+
[tool.ruff.lint.isort]
|
|
78
|
+
known-first-party = ["{{cookiecutter.agent_directory}}"]
|