seclab-taskflow-agent 0.2.0__tar.gz → 0.3.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.
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.github/workflows/publish-to-pypi.yaml +7 -8
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.github/workflows/publish-to-testpypi.yaml +7 -8
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/PKG-INFO +127 -10
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/README.md +114 -2
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/doc/GRAMMAR.md +37 -2
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/model_configs/model_config.yaml +1 -3
- seclab_taskflow_agent-0.3.0/examples/model_configs/responses_api.yaml +17 -0
- seclab_taskflow_agent-0.3.0/examples/taskflows/comprehensive_test.yaml +125 -0
- seclab_taskflow_agent-0.3.0/examples/taskflows/echo_responses_api.yaml +20 -0
- seclab_taskflow_agent-0.3.0/examples/taskflows/edge_case_test.yaml +69 -0
- seclab_taskflow_agent-0.3.0/examples/taskflows/example_responses_api.yaml +19 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/pyproject.toml +92 -72
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/__about__.py +1 -1
- seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/__init__.py +50 -0
- seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/__main__.py +28 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/agent.py +71 -28
- seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/available_tools.py +167 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/banner.py +8 -2
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/capi.py +43 -35
- seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/cli.py +178 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/env_utils.py +11 -3
- seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/mcp_lifecycle.py +167 -0
- seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/mcp_prompt.py +105 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/client.py +1 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/jsonrpyc/__init__.py +1 -1
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/memcache/memcache_backend/dictionary_file.py +2 -2
- seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/mcp_transport.py +313 -0
- seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/mcp_utils.py +282 -0
- seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/models.py +228 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/path_utils.py +21 -3
- seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/prompt_parser.py +73 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/render_utils.py +11 -5
- seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/runner.py +733 -0
- seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/session.py +136 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/shell_utils.py +15 -4
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/template_utils.py +19 -7
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/test_api_endpoint_config.py +6 -7
- seclab_taskflow_agent-0.3.0/tests/test_capi_extended.py +97 -0
- seclab_taskflow_agent-0.3.0/tests/test_cli.py +84 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/test_cli_parser.py +8 -8
- seclab_taskflow_agent-0.3.0/tests/test_mcp_transport.py +45 -0
- seclab_taskflow_agent-0.3.0/tests/test_models.py +324 -0
- seclab_taskflow_agent-0.3.0/tests/test_prompt_parser_edge.py +123 -0
- seclab_taskflow_agent-0.3.0/tests/test_runner.py +443 -0
- seclab_taskflow_agent-0.3.0/tests/test_session.py +94 -0
- seclab_taskflow_agent-0.3.0/tests/test_session_edge.py +107 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/test_template_utils.py +1 -1
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/test_yaml_parser.py +18 -17
- seclab_taskflow_agent-0.2.0/src/seclab_taskflow_agent/__main__.py +0 -671
- seclab_taskflow_agent-0.2.0/src/seclab_taskflow_agent/available_tools.py +0 -111
- seclab_taskflow_agent-0.2.0/src/seclab_taskflow_agent/mcp_servers/memcache/memcache_backend/__init__.py +0 -2
- seclab_taskflow_agent-0.2.0/src/seclab_taskflow_agent/mcp_utils.py +0 -467
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.devcontainer/Dockerfile +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.devcontainer/devcontainer.json +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.devcontainer/post-attach.sh +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.devcontainer/post-create.sh +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.dockerignore +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.github/workflows/ci.yml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.github/workflows/codeql.yml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.github/workflows/release.yml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.github/workflows/smoketest.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.gitignore +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/CODEOWNERS +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/CODE_OF_CONDUCT.md +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/CONTRIBUTING.md +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/LICENSE +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/NOTICE +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/SECURITY.md +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/SUPPORT.md +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/doc/MIGRATION.md +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/docker/Dockerfile +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/docker/run.sh +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/personalities/apple_expert.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/personalities/banana_expert.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/personalities/echo.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/personalities/example_triage_agent.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/personalities/fruit_expert.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/personalities/orange_expert.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/prompts/example_prompt.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/CVE-2023-2283.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/echo.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example_globals.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example_inputs.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example_large_list_result_iter.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example_repeat_prompt.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example_repeat_prompt_async.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example_repeat_prompt_dictionary.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example_reusable_prompt.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example_reusable_taskflows.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example_triage_taskflow.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/single_step_taskflow.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/misc/codeql_fetch_db.sh +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/release_tools/HOWTO.md +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/release_tools/copy_files.py +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/release_tools/publish_docker.py +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/release_tools/release.sh +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/release_tools/version_bump.sh +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/release_tools/version_tag.sh +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/scripts/migrate_to_jinja2.py +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/scripts/test_examples.sh +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/jsonrpyc/LICENSE +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/jsonrpyc/__meta__.py +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/jsonrpyc/py.typed +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/mcp_server.py +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/README.md +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/absolute_to_relative.ql +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/call_graph_from.ql +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/call_graph_from_to.ql +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/call_graph_to.ql +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/codeql-pack.lock.yml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/declaration_location_for_variable.ql +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/definition_location_for_function.ql +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/list_functions.ql +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/locations.qll +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/qlpack.yml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/relative_to_absolute.ql +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/stmt_location.ql +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-js/absolute_to_relative.ql +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-js/call_graph_from.ql +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-js/call_graph_to.ql +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-js/definition_location_for_function.ql +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-js/locations.qll +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-js/qlpack.yml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-js/relative_to_absolute.ql +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/echo/echo.py +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/logbook/logbook.py +0 -0
- {seclab_taskflow_agent-0.2.0/src/seclab_taskflow_agent → seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/mcp_servers/memcache}/__init__.py +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/memcache/memcache.py +0 -0
- {seclab_taskflow_agent-0.2.0/src/seclab_taskflow_agent/mcp_servers/memcache → seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/mcp_servers/memcache/memcache_backend}/__init__.py +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/memcache/memcache_backend/backend.py +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/memcache/memcache_backend/sql_models.py +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/memcache/memcache_backend/sqlite.py +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/personalities/assistant.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/personalities/c_auditer.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/toolboxes/codeql.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/toolboxes/echo.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/toolboxes/github_official.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/toolboxes/logbook.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/toolboxes/memcache.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/README.md +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/__init__.py +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/data/test_globals_taskflow.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/data/test_prompt_with_variables.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/data/test_reusable_taskflow_with_variables.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/data/test_taskflow_using_reusable.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/data/test_version_float.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/data/test_version_integer.yaml +0 -0
- {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/data/test_yaml_parser_personality000.yaml +0 -0
{seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.github/workflows/publish-to-pypi.yaml
RENAMED
|
@@ -21,6 +21,7 @@ jobs:
|
|
|
21
21
|
permissions:
|
|
22
22
|
contents: write
|
|
23
23
|
id-token: write # For trusted publishing
|
|
24
|
+
attestations: write # For artifact attestation
|
|
24
25
|
|
|
25
26
|
steps:
|
|
26
27
|
- name: Checkout repository
|
|
@@ -39,24 +40,22 @@ jobs:
|
|
|
39
40
|
- name: Build the wheel
|
|
40
41
|
run: python3 -m hatch build
|
|
41
42
|
|
|
43
|
+
- name: Attest build provenance
|
|
44
|
+
uses: actions/attest-build-provenance@96278af6caaf10aea03fd8d33a09a777ca52d62f # v3.2.0
|
|
45
|
+
with:
|
|
46
|
+
subject-path: ./dist/*
|
|
47
|
+
|
|
42
48
|
- name: Upload artifacts
|
|
43
49
|
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
|
44
50
|
with:
|
|
45
51
|
name: python-package-distributions
|
|
46
|
-
path: dist/
|
|
52
|
+
path: ./dist/
|
|
47
53
|
|
|
48
54
|
- name: Publish to PyPI
|
|
49
55
|
uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
|
|
50
56
|
with:
|
|
51
57
|
verbose: true
|
|
52
58
|
|
|
53
|
-
- name: Sign with sigstore
|
|
54
|
-
uses: sigstore/gh-action-sigstore-python@f832326173235dcb00dd5d92cd3f353de3188e6c # v3.1.0
|
|
55
|
-
with:
|
|
56
|
-
inputs: >-
|
|
57
|
-
./dist/*.tar.gz
|
|
58
|
-
./dist/*.whl
|
|
59
|
-
|
|
60
59
|
- name: Create GitHub Release
|
|
61
60
|
env:
|
|
62
61
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -18,6 +18,7 @@ jobs:
|
|
|
18
18
|
permissions:
|
|
19
19
|
contents: write
|
|
20
20
|
id-token: write # For trusted publishing
|
|
21
|
+
attestations: write # For artifact attestation
|
|
21
22
|
|
|
22
23
|
steps:
|
|
23
24
|
- name: Checkout repository
|
|
@@ -51,11 +52,16 @@ jobs:
|
|
|
51
52
|
- name: Build the wheel
|
|
52
53
|
run: python3 -m hatch build
|
|
53
54
|
|
|
55
|
+
- name: Attest build provenance
|
|
56
|
+
uses: actions/attest-build-provenance@96278af6caaf10aea03fd8d33a09a777ca52d62f # v3.2.0
|
|
57
|
+
with:
|
|
58
|
+
subject-path: ./dist/*
|
|
59
|
+
|
|
54
60
|
- name: Upload artifacts
|
|
55
61
|
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
|
56
62
|
with:
|
|
57
63
|
name: python-package-distributions
|
|
58
|
-
path: dist/
|
|
64
|
+
path: ./dist/
|
|
59
65
|
|
|
60
66
|
- name: Publish to TestPyPI
|
|
61
67
|
uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
|
|
@@ -63,13 +69,6 @@ jobs:
|
|
|
63
69
|
repository-url: https://test.pypi.org/legacy/
|
|
64
70
|
verbose: true
|
|
65
71
|
|
|
66
|
-
- name: Sign with sigstore
|
|
67
|
-
uses: sigstore/gh-action-sigstore-python@f832326173235dcb00dd5d92cd3f353de3188e6c # v3.1.0
|
|
68
|
-
with:
|
|
69
|
-
inputs: >-
|
|
70
|
-
./dist/*.tar.gz
|
|
71
|
-
./dist/*.whl
|
|
72
|
-
|
|
73
72
|
- name: Create GitHub Release
|
|
74
73
|
env:
|
|
75
74
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: seclab-taskflow-agent
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: A taskflow agent for the SecLab project, enabling secure and automated workflow execution.
|
|
5
5
|
Project-URL: Source, https://github.com/GitHubSecurityLab/seclab-taskflow-agent
|
|
6
6
|
Project-URL: Issues, https://github.com/GitHubSecurityLab/seclab-taskflow-agent/issues
|
|
@@ -8,25 +8,30 @@ Author-email: GitHub Security Lab <securitylab@github.com>
|
|
|
8
8
|
License-Expression: MIT
|
|
9
9
|
License-File: LICENSE
|
|
10
10
|
License-File: NOTICE
|
|
11
|
+
Keywords: agentic-workflows,mcp,openai-agents,pydantic,security-research,taskflow,yaml
|
|
11
12
|
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
12
14
|
Classifier: Programming Language :: Python
|
|
13
15
|
Classifier: Programming Language :: Python :: 3.10
|
|
14
16
|
Classifier: Programming Language :: Python :: 3.11
|
|
15
17
|
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
16
19
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
17
20
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
21
|
+
Classifier: Topic :: Security
|
|
22
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
18
23
|
Requires-Python: >=3.10
|
|
19
24
|
Requires-Dist: aiofiles==24.1.0
|
|
20
25
|
Requires-Dist: annotated-types==0.7.0
|
|
21
26
|
Requires-Dist: anyio==4.9.0
|
|
22
27
|
Requires-Dist: attrs==25.3.0
|
|
23
|
-
Requires-Dist: authlib==1.6.
|
|
28
|
+
Requires-Dist: authlib==1.6.9
|
|
24
29
|
Requires-Dist: certifi==2025.6.15
|
|
25
30
|
Requires-Dist: cffi==2.0.0
|
|
26
31
|
Requires-Dist: charset-normalizer==3.4.2
|
|
27
32
|
Requires-Dist: click==8.2.1
|
|
28
33
|
Requires-Dist: colorama==0.4.6
|
|
29
|
-
Requires-Dist: cryptography==46.0.
|
|
34
|
+
Requires-Dist: cryptography==46.0.6
|
|
30
35
|
Requires-Dist: cyclopts==4.0.0
|
|
31
36
|
Requires-Dist: distro==1.9.0
|
|
32
37
|
Requires-Dist: dnspython==2.8.0
|
|
@@ -34,7 +39,7 @@ Requires-Dist: docstring-parser==0.17.0
|
|
|
34
39
|
Requires-Dist: docutils==0.22
|
|
35
40
|
Requires-Dist: email-validator==2.3.0
|
|
36
41
|
Requires-Dist: exceptiongroup==1.3.0
|
|
37
|
-
Requires-Dist: fastmcp==2.14.
|
|
42
|
+
Requires-Dist: fastmcp==2.14.2
|
|
38
43
|
Requires-Dist: griffe==1.7.3
|
|
39
44
|
Requires-Dist: h11==0.16.0
|
|
40
45
|
Requires-Dist: httpcore==1.0.9
|
|
@@ -52,7 +57,7 @@ Requires-Dist: jsonschema==4.24.0
|
|
|
52
57
|
Requires-Dist: lazy-object-proxy==1.12.0
|
|
53
58
|
Requires-Dist: markdown-it-py==3.0.0
|
|
54
59
|
Requires-Dist: markupsafe==3.0.2
|
|
55
|
-
Requires-Dist: mcp==1.
|
|
60
|
+
Requires-Dist: mcp==1.24.0
|
|
56
61
|
Requires-Dist: mdurl==0.1.2
|
|
57
62
|
Requires-Dist: more-itertools==10.8.0
|
|
58
63
|
Requires-Dist: openai-agents==0.2.11
|
|
@@ -70,7 +75,7 @@ Requires-Dist: pycparser==2.23
|
|
|
70
75
|
Requires-Dist: pydantic-core==2.33.2
|
|
71
76
|
Requires-Dist: pydantic-settings==2.10.1
|
|
72
77
|
Requires-Dist: pydantic==2.11.7
|
|
73
|
-
Requires-Dist: pygments==2.
|
|
78
|
+
Requires-Dist: pygments==2.20.0
|
|
74
79
|
Requires-Dist: pyperclip==1.9.0
|
|
75
80
|
Requires-Dist: python-dotenv==1.1.1
|
|
76
81
|
Requires-Dist: python-lsp-jsonrpc==1.1.2
|
|
@@ -78,7 +83,7 @@ Requires-Dist: python-lsp-server==1.12.2
|
|
|
78
83
|
Requires-Dist: python-multipart==0.0.22
|
|
79
84
|
Requires-Dist: pyyaml==6.0.2
|
|
80
85
|
Requires-Dist: referencing==0.36.2
|
|
81
|
-
Requires-Dist: requests==2.
|
|
86
|
+
Requires-Dist: requests==2.33.0
|
|
82
87
|
Requires-Dist: rfc3339-validator==0.1.4
|
|
83
88
|
Requires-Dist: rich-rst==1.3.1
|
|
84
89
|
Requires-Dist: rich==14.0.0
|
|
@@ -95,7 +100,7 @@ Requires-Dist: typer==0.16.0
|
|
|
95
100
|
Requires-Dist: types-requests==2.32.4.20250611
|
|
96
101
|
Requires-Dist: typing-extensions==4.15.0
|
|
97
102
|
Requires-Dist: typing-inspection==0.4.1
|
|
98
|
-
Requires-Dist: ujson==5.
|
|
103
|
+
Requires-Dist: ujson==5.12.0
|
|
99
104
|
Requires-Dist: urllib3==2.6.3
|
|
100
105
|
Requires-Dist: uvicorn==0.35.0
|
|
101
106
|
Requires-Dist: zipp==3.23.0
|
|
@@ -103,9 +108,12 @@ Description-Content-Type: text/markdown
|
|
|
103
108
|
|
|
104
109
|
# GitHub Security Lab Taskflow Agent
|
|
105
110
|
|
|
106
|
-
The Security Lab Taskflow Agent is an MCP
|
|
111
|
+
The Security Lab Taskflow Agent is an MCP-enabled multi-Agent framework for
|
|
112
|
+
declarative, YAML-driven agentic workflows.
|
|
107
113
|
|
|
108
|
-
|
|
114
|
+
Built on top of the [OpenAI Agents SDK](https://openai.github.io/openai-agents-python/),
|
|
115
|
+
it uses [Pydantic](https://docs.pydantic.dev/) for grammar validation and
|
|
116
|
+
[Jinja2](https://jinja.palletsprojects.com/) for template rendering.
|
|
109
117
|
|
|
110
118
|
## Core Concepts
|
|
111
119
|
|
|
@@ -119,6 +127,115 @@ Agents can cooperate to complete sequences of tasks through so-called [taskflows
|
|
|
119
127
|
|
|
120
128
|
You can find a detailed overview of the taskflow grammar [here](doc/GRAMMAR.md) and example taskflows [here](examples/taskflows/).
|
|
121
129
|
|
|
130
|
+
## Architecture
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
┌─────────────────────────────────────────────────────┐
|
|
134
|
+
│ CLI (cli.py) │
|
|
135
|
+
│ Typer-based entry point: -p, -t, -l, -g, --resume │
|
|
136
|
+
└─────────────────────┬───────────────────────────────┘
|
|
137
|
+
│
|
|
138
|
+
┌─────────────────────▼───────────────────────────────┐
|
|
139
|
+
│ Runner (runner.py) │
|
|
140
|
+
│ Taskflow execution loop, model resolution, │
|
|
141
|
+
│ template rendering, session checkpointing │
|
|
142
|
+
└─────────────────────┬───────────────────────────────┘
|
|
143
|
+
│
|
|
144
|
+
┌─────────────────────▼───────────────────────────────┐
|
|
145
|
+
│ MCP Lifecycle (mcp_lifecycle.py) │
|
|
146
|
+
│ Server connection, cleanup, process management │
|
|
147
|
+
└─────────────────────┬───────────────────────────────┘
|
|
148
|
+
│
|
|
149
|
+
┌─────────────────────▼───────────────────────────────┐
|
|
150
|
+
│ Agent (agent.py) │
|
|
151
|
+
│ TaskAgent wrapper, hooks, OpenAI Agents SDK bridge │
|
|
152
|
+
└─────────────────────────────────────────────────────┘
|
|
153
|
+
|
|
154
|
+
Supporting modules:
|
|
155
|
+
models.py — Pydantic v2 grammar models (validation)
|
|
156
|
+
session.py — Task-level checkpoint / resume
|
|
157
|
+
available_tools.py — YAML resource loader with caching
|
|
158
|
+
template_utils.py — Jinja2 template environment
|
|
159
|
+
mcp_utils.py — MCP client parameter resolution
|
|
160
|
+
mcp_transport.py — MCP transport implementations (stdio, streamable)
|
|
161
|
+
mcp_prompt.py — System prompt construction
|
|
162
|
+
prompt_parser.py — Legacy prompt argument parser
|
|
163
|
+
capi.py — AI API endpoint and token management
|
|
164
|
+
path_utils.py — Platform-aware data/log directories
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### API Types
|
|
168
|
+
|
|
169
|
+
The agent supports both the **Chat Completions** and **Responses** OpenAI APIs.
|
|
170
|
+
The API type can be configured globally or per model in a `model_config` file:
|
|
171
|
+
|
|
172
|
+
```yaml
|
|
173
|
+
seclab-taskflow-agent:
|
|
174
|
+
version: "1.0"
|
|
175
|
+
filetype: model_config
|
|
176
|
+
api_type: chat_completions # default for all models
|
|
177
|
+
models:
|
|
178
|
+
gpt_default: gpt-4.1
|
|
179
|
+
gpt_responses: gpt-5.1
|
|
180
|
+
model_settings:
|
|
181
|
+
gpt_responses:
|
|
182
|
+
api_type: responses # override for this model
|
|
183
|
+
endpoint: https://api.githubcopilot.com
|
|
184
|
+
token: CAPI_TOKEN # env var name containing the API key
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Per-model `model_settings` can include:
|
|
188
|
+
- **`api_type`** — `"chat_completions"` (default) or `"responses"`
|
|
189
|
+
- **`endpoint`** — API base URL override for this model
|
|
190
|
+
- **`token`** — name of an environment variable containing the API key
|
|
191
|
+
|
|
192
|
+
### Session Recovery
|
|
193
|
+
|
|
194
|
+
Taskflow runs are automatically checkpointed at the task level. If a task
|
|
195
|
+
fails after exhausting retries, the session is saved and can be resumed:
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
** 🤖💾 Session saved: abc123def456
|
|
199
|
+
** 🤖💡 Resume with: --resume abc123def456
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Resume from the last successful checkpoint:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
python -m seclab_taskflow_agent --resume abc123def456
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Failed tasks are automatically retried up to 3 times with increasing backoff
|
|
209
|
+
before the session is saved. Session checkpoints are stored in the
|
|
210
|
+
platform-specific application data directory.
|
|
211
|
+
|
|
212
|
+
### Error Output
|
|
213
|
+
|
|
214
|
+
By default, errors are shown as concise one-line messages. Use `--debug` (or
|
|
215
|
+
set `TASK_AGENT_DEBUG=1`) for full tracebacks:
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
# Concise (default)
|
|
219
|
+
Error: [BadRequestError] model 'foo' not found
|
|
220
|
+
(use --debug for full traceback)
|
|
221
|
+
|
|
222
|
+
# Full traceback
|
|
223
|
+
python -m seclab_taskflow_agent --debug -t examples.taskflows.echo
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### MCP Environment Denylist
|
|
227
|
+
|
|
228
|
+
By default, MCP server subprocesses inherit the parent environment. To prevent
|
|
229
|
+
specific variables from leaking to MCP servers, set `TASKFLOW_ENV_DENYLIST` to
|
|
230
|
+
a comma-separated list of variable names:
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
export TASKFLOW_ENV_DENYLIST="MY_SECRET_TOKEN,PRIVATE_KEY,OTHER_CREDENTIAL"
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Toolbox-level `env:` declarations in YAML still inject exactly what each server
|
|
237
|
+
needs, so explicitly configured variables are unaffected.
|
|
238
|
+
|
|
122
239
|
## Use Cases and Examples
|
|
123
240
|
|
|
124
241
|
The Seclab Taskflow Agent framework was primarily designed to fit the iterative feedback loop driven work involved in Agentic security research workflows and vulnerability triage tasks.
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
# GitHub Security Lab Taskflow Agent
|
|
2
2
|
|
|
3
|
-
The Security Lab Taskflow Agent is an MCP
|
|
3
|
+
The Security Lab Taskflow Agent is an MCP-enabled multi-Agent framework for
|
|
4
|
+
declarative, YAML-driven agentic workflows.
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
Built on top of the [OpenAI Agents SDK](https://openai.github.io/openai-agents-python/),
|
|
7
|
+
it uses [Pydantic](https://docs.pydantic.dev/) for grammar validation and
|
|
8
|
+
[Jinja2](https://jinja.palletsprojects.com/) for template rendering.
|
|
6
9
|
|
|
7
10
|
## Core Concepts
|
|
8
11
|
|
|
@@ -16,6 +19,115 @@ Agents can cooperate to complete sequences of tasks through so-called [taskflows
|
|
|
16
19
|
|
|
17
20
|
You can find a detailed overview of the taskflow grammar [here](doc/GRAMMAR.md) and example taskflows [here](examples/taskflows/).
|
|
18
21
|
|
|
22
|
+
## Architecture
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
┌─────────────────────────────────────────────────────┐
|
|
26
|
+
│ CLI (cli.py) │
|
|
27
|
+
│ Typer-based entry point: -p, -t, -l, -g, --resume │
|
|
28
|
+
└─────────────────────┬───────────────────────────────┘
|
|
29
|
+
│
|
|
30
|
+
┌─────────────────────▼───────────────────────────────┐
|
|
31
|
+
│ Runner (runner.py) │
|
|
32
|
+
│ Taskflow execution loop, model resolution, │
|
|
33
|
+
│ template rendering, session checkpointing │
|
|
34
|
+
└─────────────────────┬───────────────────────────────┘
|
|
35
|
+
│
|
|
36
|
+
┌─────────────────────▼───────────────────────────────┐
|
|
37
|
+
│ MCP Lifecycle (mcp_lifecycle.py) │
|
|
38
|
+
│ Server connection, cleanup, process management │
|
|
39
|
+
└─────────────────────┬───────────────────────────────┘
|
|
40
|
+
│
|
|
41
|
+
┌─────────────────────▼───────────────────────────────┐
|
|
42
|
+
│ Agent (agent.py) │
|
|
43
|
+
│ TaskAgent wrapper, hooks, OpenAI Agents SDK bridge │
|
|
44
|
+
└─────────────────────────────────────────────────────┘
|
|
45
|
+
|
|
46
|
+
Supporting modules:
|
|
47
|
+
models.py — Pydantic v2 grammar models (validation)
|
|
48
|
+
session.py — Task-level checkpoint / resume
|
|
49
|
+
available_tools.py — YAML resource loader with caching
|
|
50
|
+
template_utils.py — Jinja2 template environment
|
|
51
|
+
mcp_utils.py — MCP client parameter resolution
|
|
52
|
+
mcp_transport.py — MCP transport implementations (stdio, streamable)
|
|
53
|
+
mcp_prompt.py — System prompt construction
|
|
54
|
+
prompt_parser.py — Legacy prompt argument parser
|
|
55
|
+
capi.py — AI API endpoint and token management
|
|
56
|
+
path_utils.py — Platform-aware data/log directories
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### API Types
|
|
60
|
+
|
|
61
|
+
The agent supports both the **Chat Completions** and **Responses** OpenAI APIs.
|
|
62
|
+
The API type can be configured globally or per model in a `model_config` file:
|
|
63
|
+
|
|
64
|
+
```yaml
|
|
65
|
+
seclab-taskflow-agent:
|
|
66
|
+
version: "1.0"
|
|
67
|
+
filetype: model_config
|
|
68
|
+
api_type: chat_completions # default for all models
|
|
69
|
+
models:
|
|
70
|
+
gpt_default: gpt-4.1
|
|
71
|
+
gpt_responses: gpt-5.1
|
|
72
|
+
model_settings:
|
|
73
|
+
gpt_responses:
|
|
74
|
+
api_type: responses # override for this model
|
|
75
|
+
endpoint: https://api.githubcopilot.com
|
|
76
|
+
token: CAPI_TOKEN # env var name containing the API key
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Per-model `model_settings` can include:
|
|
80
|
+
- **`api_type`** — `"chat_completions"` (default) or `"responses"`
|
|
81
|
+
- **`endpoint`** — API base URL override for this model
|
|
82
|
+
- **`token`** — name of an environment variable containing the API key
|
|
83
|
+
|
|
84
|
+
### Session Recovery
|
|
85
|
+
|
|
86
|
+
Taskflow runs are automatically checkpointed at the task level. If a task
|
|
87
|
+
fails after exhausting retries, the session is saved and can be resumed:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
** 🤖💾 Session saved: abc123def456
|
|
91
|
+
** 🤖💡 Resume with: --resume abc123def456
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Resume from the last successful checkpoint:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
python -m seclab_taskflow_agent --resume abc123def456
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Failed tasks are automatically retried up to 3 times with increasing backoff
|
|
101
|
+
before the session is saved. Session checkpoints are stored in the
|
|
102
|
+
platform-specific application data directory.
|
|
103
|
+
|
|
104
|
+
### Error Output
|
|
105
|
+
|
|
106
|
+
By default, errors are shown as concise one-line messages. Use `--debug` (or
|
|
107
|
+
set `TASK_AGENT_DEBUG=1`) for full tracebacks:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# Concise (default)
|
|
111
|
+
Error: [BadRequestError] model 'foo' not found
|
|
112
|
+
(use --debug for full traceback)
|
|
113
|
+
|
|
114
|
+
# Full traceback
|
|
115
|
+
python -m seclab_taskflow_agent --debug -t examples.taskflows.echo
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### MCP Environment Denylist
|
|
119
|
+
|
|
120
|
+
By default, MCP server subprocesses inherit the parent environment. To prevent
|
|
121
|
+
specific variables from leaking to MCP servers, set `TASKFLOW_ENV_DENYLIST` to
|
|
122
|
+
a comma-separated list of variable names:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
export TASKFLOW_ENV_DENYLIST="MY_SECRET_TOKEN,PRIVATE_KEY,OTHER_CREDENTIAL"
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Toolbox-level `env:` declarations in YAML still inject exactly what each server
|
|
129
|
+
needs, so explicitly configured variables are unaffected.
|
|
130
|
+
|
|
19
131
|
## Use Cases and Examples
|
|
20
132
|
|
|
21
133
|
The Seclab Taskflow Agent framework was primarily designed to fit the iterative feedback loop driven work involved in Agentic security research workflows and vulnerability triage tasks.
|
|
@@ -89,7 +89,7 @@ Tasks can optionally specify which Model to use on the configured inference endp
|
|
|
89
89
|
This is a user prompt.
|
|
90
90
|
```
|
|
91
91
|
|
|
92
|
-
Note that model identifiers may differ between OpenAI compatible endpoint providers, make sure you change your model identifier accordingly when switching providers. If not specified, a default LLM model (`gpt-
|
|
92
|
+
Note that model identifiers may differ between OpenAI compatible endpoint providers, make sure you change your model identifier accordingly when switching providers. If not specified, a default LLM model (such as `gpt-4.1`) is used.
|
|
93
93
|
|
|
94
94
|
Parameters to the model can also be specified in the task using the `model_settings` section:
|
|
95
95
|
|
|
@@ -509,4 +509,39 @@ When `gpt_latest` is used in the taskflow to specify a model, the value `gpt-5`
|
|
|
509
509
|
|
|
510
510
|
```
|
|
511
511
|
|
|
512
|
-
This provides
|
|
512
|
+
This provides an easy way to update model versions in a taskflow.
|
|
513
|
+
|
|
514
|
+
#### Per-model settings
|
|
515
|
+
|
|
516
|
+
A `model_config` file can include per-model settings via `model_settings` and a
|
|
517
|
+
global `api_type` that applies to all models unless overridden:
|
|
518
|
+
|
|
519
|
+
```yaml
|
|
520
|
+
seclab-taskflow-agent:
|
|
521
|
+
version: "1.0"
|
|
522
|
+
filetype: model_config
|
|
523
|
+
api_type: chat_completions # default for all models
|
|
524
|
+
models:
|
|
525
|
+
gpt_default: gpt-4.1
|
|
526
|
+
gpt_responses: gpt-5.1
|
|
527
|
+
model_settings:
|
|
528
|
+
gpt_default:
|
|
529
|
+
temperature: 0.7
|
|
530
|
+
gpt_responses:
|
|
531
|
+
api_type: responses # use the Responses API for this model
|
|
532
|
+
endpoint: https://api.githubcopilot.com
|
|
533
|
+
token: CAPI_TOKEN # env var name containing the API key
|
|
534
|
+
temperature: 0.5
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
The following keys in `model_settings` are handled by the engine and are not
|
|
538
|
+
passed to the underlying model provider:
|
|
539
|
+
|
|
540
|
+
| Key | Description | Default |
|
|
541
|
+
|-----|-------------|---------|
|
|
542
|
+
| `api_type` | `"chat_completions"` or `"responses"` | Inherited from top-level `api_type`, or `"chat_completions"` |
|
|
543
|
+
| `endpoint` | API base URL for this model | The global `AI_API_ENDPOINT` env var |
|
|
544
|
+
| `token` | Name of an environment variable containing the API key | Uses `AI_API_TOKEN` / `COPILOT_TOKEN` |
|
|
545
|
+
|
|
546
|
+
All other keys (e.g. `temperature`, `top_p`) are passed through as model
|
|
547
|
+
parameters to the OpenAI SDK.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: GitHub, Inc.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
|
|
4
|
+
# Example: per-model API type and endpoint configuration.
|
|
5
|
+
# gpt_responses uses the Responses API on the CAPI endpoint,
|
|
6
|
+
# reading its token from the CAPI_TOKEN env var.
|
|
7
|
+
|
|
8
|
+
seclab-taskflow-agent:
|
|
9
|
+
version: "1.0"
|
|
10
|
+
filetype: model_config
|
|
11
|
+
models:
|
|
12
|
+
gpt_responses: gpt-5.1
|
|
13
|
+
model_settings:
|
|
14
|
+
gpt_responses:
|
|
15
|
+
api_type: responses
|
|
16
|
+
endpoint: https://api.githubcopilot.com
|
|
17
|
+
token: CAPI_TOKEN
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: GitHub, Inc.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
|
|
4
|
+
# Comprehensive test taskflow that exercises every grammar feature:
|
|
5
|
+
# - model_config reference with model aliases
|
|
6
|
+
# - globals (with CLI override via -g)
|
|
7
|
+
# - inputs (task-level template variables)
|
|
8
|
+
# - env (task-scoped environment variables)
|
|
9
|
+
# - must_complete
|
|
10
|
+
# - exclude_from_context
|
|
11
|
+
# - max_steps
|
|
12
|
+
# - MCP toolboxes (echo)
|
|
13
|
+
# - shell task (run)
|
|
14
|
+
# - repeat_prompt + async iteration
|
|
15
|
+
# - reusable tasks (uses)
|
|
16
|
+
# - reusable prompts ({% include %})
|
|
17
|
+
# - agent handoffs (multi-agent)
|
|
18
|
+
# - headless mode
|
|
19
|
+
# - blocked_tools
|
|
20
|
+
|
|
21
|
+
seclab-taskflow-agent:
|
|
22
|
+
version: "1.0"
|
|
23
|
+
filetype: taskflow
|
|
24
|
+
|
|
25
|
+
model_config: examples.model_configs.model_config
|
|
26
|
+
|
|
27
|
+
globals:
|
|
28
|
+
topic: fruit
|
|
29
|
+
detail_level: brief
|
|
30
|
+
|
|
31
|
+
taskflow:
|
|
32
|
+
# ---------------------------------------------------------------
|
|
33
|
+
# Task 1: Shell task — produces a JSON array for repeat_prompt
|
|
34
|
+
# Features: run, must_complete
|
|
35
|
+
# ---------------------------------------------------------------
|
|
36
|
+
- task:
|
|
37
|
+
name: generate-items
|
|
38
|
+
must_complete: true
|
|
39
|
+
run: |
|
|
40
|
+
echo '[{"name": "apple", "color": "red"}, {"name": "banana", "color": "yellow"}, {"name": "orange", "color": "orange"}]'
|
|
41
|
+
|
|
42
|
+
# ---------------------------------------------------------------
|
|
43
|
+
# Task 2: Repeat prompt over shell output, async iteration
|
|
44
|
+
# Features: repeat_prompt, async, async_limit, exclude_from_context,
|
|
45
|
+
# model (alias), inputs, globals, env, max_steps
|
|
46
|
+
# ---------------------------------------------------------------
|
|
47
|
+
- task:
|
|
48
|
+
name: describe-items
|
|
49
|
+
repeat_prompt: true
|
|
50
|
+
async: true
|
|
51
|
+
async_limit: 3
|
|
52
|
+
exclude_from_context: true
|
|
53
|
+
must_complete: true
|
|
54
|
+
model: gpt_default
|
|
55
|
+
max_steps: 10
|
|
56
|
+
agents:
|
|
57
|
+
- examples.personalities.fruit_expert
|
|
58
|
+
inputs:
|
|
59
|
+
format: one-sentence
|
|
60
|
+
env:
|
|
61
|
+
FRUIT_MODE: "analysis"
|
|
62
|
+
user_prompt: |
|
|
63
|
+
The topic is {{ globals.topic }} at {{ globals.detail_level }} detail level.
|
|
64
|
+
Describe the {{ result.name }} (which is {{ result.color }}) in {{ inputs.format }} format.
|
|
65
|
+
|
|
66
|
+
# ---------------------------------------------------------------
|
|
67
|
+
# Task 3: MCP tool call with echo server
|
|
68
|
+
# Features: toolboxes, headless, blocked_tools
|
|
69
|
+
# ---------------------------------------------------------------
|
|
70
|
+
- task:
|
|
71
|
+
name: echo-test
|
|
72
|
+
must_complete: true
|
|
73
|
+
headless: true
|
|
74
|
+
agents:
|
|
75
|
+
- examples.personalities.echo
|
|
76
|
+
user_prompt: |
|
|
77
|
+
Echo the following message: "All {{ globals.topic }} items processed successfully"
|
|
78
|
+
blocked_tools:
|
|
79
|
+
- nonexistent_tool_to_test_filtering
|
|
80
|
+
|
|
81
|
+
# ---------------------------------------------------------------
|
|
82
|
+
# Task 4: Reusable task via `uses`
|
|
83
|
+
# Features: uses (inherits from single_step_taskflow)
|
|
84
|
+
# ---------------------------------------------------------------
|
|
85
|
+
- task:
|
|
86
|
+
name: reusable-task
|
|
87
|
+
uses: examples.taskflows.single_step_taskflow
|
|
88
|
+
model: gpt_default
|
|
89
|
+
|
|
90
|
+
# ---------------------------------------------------------------
|
|
91
|
+
# Task 5: Reusable prompt via {% include %}
|
|
92
|
+
# Features: Jinja2 include directive, reusable prompts
|
|
93
|
+
# ---------------------------------------------------------------
|
|
94
|
+
- task:
|
|
95
|
+
name: include-prompt
|
|
96
|
+
agents:
|
|
97
|
+
- examples.personalities.fruit_expert
|
|
98
|
+
model: gpt_default
|
|
99
|
+
max_steps: 5
|
|
100
|
+
user_prompt: |
|
|
101
|
+
Tell me about apples.
|
|
102
|
+
|
|
103
|
+
{% include 'examples.prompts.example_prompt' %}
|
|
104
|
+
|
|
105
|
+
Keep your answer to two sentences per fruit.
|
|
106
|
+
|
|
107
|
+
# ---------------------------------------------------------------
|
|
108
|
+
# Task 6: Agent handoffs (multi-agent)
|
|
109
|
+
# Features: multiple agents (first=primary, rest=handoff targets)
|
|
110
|
+
# ---------------------------------------------------------------
|
|
111
|
+
- task:
|
|
112
|
+
name: handoff-test
|
|
113
|
+
model: gpt_default
|
|
114
|
+
max_steps: 15
|
|
115
|
+
agents:
|
|
116
|
+
- examples.personalities.fruit_expert
|
|
117
|
+
- examples.personalities.apple_expert
|
|
118
|
+
- examples.personalities.banana_expert
|
|
119
|
+
- examples.personalities.orange_expert
|
|
120
|
+
user_prompt: |
|
|
121
|
+
You are a fruit coordinator. I need specific expert advice on each fruit.
|
|
122
|
+
Please hand off to the apple expert for a one-sentence fact about apples,
|
|
123
|
+
then to the banana expert for a one-sentence fact about bananas,
|
|
124
|
+
then to the orange expert for a one-sentence fact about oranges.
|
|
125
|
+
Each expert should provide exactly one interesting fact.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: GitHub, Inc.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
|
|
4
|
+
# Echo taskflow using the Responses API with MCP tool calls.
|
|
5
|
+
|
|
6
|
+
seclab-taskflow-agent:
|
|
7
|
+
version: "1.0"
|
|
8
|
+
filetype: taskflow
|
|
9
|
+
|
|
10
|
+
model_config: examples.model_configs.responses_api
|
|
11
|
+
|
|
12
|
+
taskflow:
|
|
13
|
+
- task:
|
|
14
|
+
max_steps: 5
|
|
15
|
+
must_complete: true
|
|
16
|
+
agents:
|
|
17
|
+
- examples.personalities.echo
|
|
18
|
+
model: gpt_responses
|
|
19
|
+
user_prompt: |
|
|
20
|
+
Hello from the Responses API
|