actions-runtime 1.0.1__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.
- actions_runtime-1.0.1/PKG-INFO +153 -0
- actions_runtime-1.0.1/README.md +112 -0
- actions_runtime-1.0.1/build.py +183 -0
- actions_runtime-1.0.1/pyproject.toml +133 -0
- actions_runtime-1.0.1/setup.py +82 -0
- actions_runtime-1.0.1/src/actions/server/README.md +21 -0
- actions_runtime-1.0.1/src/actions/server/__init__.py +6 -0
- actions_runtime-1.0.1/src/actions/server/__main__.py +23 -0
- actions_runtime-1.0.1/src/actions/server/_action_package_handler.py +299 -0
- actions_runtime-1.0.1/src/actions/server/_actions_cloud.py +157 -0
- actions_runtime-1.0.1/src/actions/server/_actions_import.py +556 -0
- actions_runtime-1.0.1/src/actions/server/_actions_process_pool.py +1144 -0
- actions_runtime-1.0.1/src/actions/server/_actions_run.py +902 -0
- actions_runtime-1.0.1/src/actions/server/_actions_run_helpers.py +43 -0
- actions_runtime-1.0.1/src/actions/server/_api_action_package.py +65 -0
- actions_runtime-1.0.1/src/actions/server/_api_action_routes.py +317 -0
- actions_runtime-1.0.1/src/actions/server/_api_analytics.py +250 -0
- actions_runtime-1.0.1/src/actions/server/_api_oauth2.py +693 -0
- actions_runtime-1.0.1/src/actions/server/_api_robots.py +1174 -0
- actions_runtime-1.0.1/src/actions/server/_api_run.py +445 -0
- actions_runtime-1.0.1/src/actions/server/_api_schedules.py +1495 -0
- actions_runtime-1.0.1/src/actions/server/_api_secrets.py +164 -0
- actions_runtime-1.0.1/src/actions/server/_api_triggers.py +664 -0
- actions_runtime-1.0.1/src/actions/server/_api_work_items.py +372 -0
- actions_runtime-1.0.1/src/actions/server/_app.py +138 -0
- actions_runtime-1.0.1/src/actions/server/_artifact_storage.py +280 -0
- actions_runtime-1.0.1/src/actions/server/_ask_user.py +109 -0
- actions_runtime-1.0.1/src/actions/server/_build_common/__init__.py +1 -0
- actions_runtime-1.0.1/src/actions/server/_build_common/build_executable.py +45 -0
- actions_runtime-1.0.1/src/actions/server/_build_common/entitlements.py +23 -0
- actions_runtime-1.0.1/src/actions/server/_build_common/file_from_function.py +37 -0
- actions_runtime-1.0.1/src/actions/server/_build_common/process_call.py +43 -0
- actions_runtime-1.0.1/src/actions/server/_build_common/py.typed +0 -0
- actions_runtime-1.0.1/src/actions/server/_build_common/root_dir.py +19 -0
- actions_runtime-1.0.1/src/actions/server/_build_common/signing.py +272 -0
- actions_runtime-1.0.1/src/actions/server/_build_common/version_from_github_actions.py +83 -0
- actions_runtime-1.0.1/src/actions/server/_build_common/workflows.py +245 -0
- actions_runtime-1.0.1/src/actions/server/_build_common/zip_assets.py +43 -0
- actions_runtime-1.0.1/src/actions/server/_cli_helpers.py +102 -0
- actions_runtime-1.0.1/src/actions/server/_cli_impl.py +1039 -0
- actions_runtime-1.0.1/src/actions/server/_common/__init__.py +12 -0
- actions_runtime-1.0.1/src/actions/server/_common/action_package_handling/__init__.py +445 -0
- actions_runtime-1.0.1/src/actions/server/_common/action_package_handling/cli_errors.py +5 -0
- actions_runtime-1.0.1/src/actions/server/_common/app_mutex.py +125 -0
- actions_runtime-1.0.1/src/actions/server/_common/autoexit.py +78 -0
- actions_runtime-1.0.1/src/actions/server/_common/callback.py +79 -0
- actions_runtime-1.0.1/src/actions/server/_common/gallery.py +203 -0
- actions_runtime-1.0.1/src/actions/server/_common/gen_certificate.py +67 -0
- actions_runtime-1.0.1/src/actions/server/_common/locations.py +47 -0
- actions_runtime-1.0.1/src/actions/server/_common/ls_protocols.py +66 -0
- actions_runtime-1.0.1/src/actions/server/_common/monitor.py +41 -0
- actions_runtime-1.0.1/src/actions/server/_common/null.py +61 -0
- actions_runtime-1.0.1/src/actions/server/_common/oauth2_settings.py +308 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_deps/__init__.py +0 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_deps/_conda_deps.py +57 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_deps/_deps_protocols.py +173 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_deps/_package_deps.py +45 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_deps/_pip_deps.py +78 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_deps/analyzer.py +636 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_deps/conda_cloud.py +699 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_deps/conda_impl/__init__.py +0 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_deps/conda_impl/conda_channel.py +39 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_deps/conda_impl/conda_match_spec.py +311 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_deps/conda_impl/conda_path.py +306 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_deps/conda_impl/conda_url.py +458 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_deps/conda_impl/conda_version.py +703 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_deps/pip_impl/__init__.py +0 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_deps/pip_impl/pip_distlib_util.py +238 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_deps/pip_impl/pip_packaging_structure.py +61 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_deps/pip_impl/pip_packaging_version.py +505 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_deps/pypi_cloud.py +215 -0
- actions_runtime-1.0.1/src/actions/server/_common/package_exclude.py +164 -0
- actions_runtime-1.0.1/src/actions/server/_common/process.py +799 -0
- actions_runtime-1.0.1/src/actions/server/_common/protocols.py +91 -0
- actions_runtime-1.0.1/src/actions/server/_common/py.typed +0 -0
- actions_runtime-1.0.1/src/actions/server/_common/run_in_thread.py +67 -0
- actions_runtime-1.0.1/src/actions/server/_common/system_mutex.py +441 -0
- actions_runtime-1.0.1/src/actions/server/_common/termcolors/__init__.py +20 -0
- actions_runtime-1.0.1/src/actions/server/_common/text.py +40 -0
- actions_runtime-1.0.1/src/actions/server/_common/tools.py +360 -0
- actions_runtime-1.0.1/src/actions/server/_common/uris.py +189 -0
- actions_runtime-1.0.1/src/actions/server/_common/url_callback_server.py +283 -0
- actions_runtime-1.0.1/src/actions/server/_common/wait_for.py +101 -0
- actions_runtime-1.0.1/src/actions/server/_common/yaml_with_location.py +246 -0
- actions_runtime-1.0.1/src/actions/server/_community_expose.py +897 -0
- actions_runtime-1.0.1/src/actions/server/_database.py +1328 -0
- actions_runtime-1.0.1/src/actions/server/_datadir_commands.py +50 -0
- actions_runtime-1.0.1/src/actions/server/_devenv.py +161 -0
- actions_runtime-1.0.1/src/actions/server/_download_rcc.py +112 -0
- actions_runtime-1.0.1/src/actions/server/_encryption.py +293 -0
- actions_runtime-1.0.1/src/actions/server/_errors.py +124 -0
- actions_runtime-1.0.1/src/actions/server/_errors_action_server.py +6 -0
- actions_runtime-1.0.1/src/actions/server/_gen_ids.py +36 -0
- actions_runtime-1.0.1/src/actions/server/_mode.py +273 -0
- actions_runtime-1.0.1/src/actions/server/_models.py +535 -0
- actions_runtime-1.0.1/src/actions/server/_new_project.py +160 -0
- actions_runtime-1.0.1/src/actions/server/_new_project_helpers.py +233 -0
- actions_runtime-1.0.1/src/actions/server/_notifications.py +333 -0
- actions_runtime-1.0.1/src/actions/server/_oauth2.py +98 -0
- actions_runtime-1.0.1/src/actions/server/_oauth2_config.py +7 -0
- actions_runtime-1.0.1/src/actions/server/_preload_actions/__init__.py +0 -0
- actions_runtime-1.0.1/src/actions/server/_preload_actions/preload_actions.py +21 -0
- actions_runtime-1.0.1/src/actions/server/_preload_actions/preload_actions_autoexit.py +192 -0
- actions_runtime-1.0.1/src/actions/server/_preload_actions/preload_actions_server_main.py +332 -0
- actions_runtime-1.0.1/src/actions/server/_preload_actions/preload_actions_streams.py +252 -0
- actions_runtime-1.0.1/src/actions/server/_preload_actions/preload_actions_teardown.py +31 -0
- actions_runtime-1.0.1/src/actions/server/_protocols.py +326 -0
- actions_runtime-1.0.1/src/actions/server/_rcc.py +489 -0
- actions_runtime-1.0.1/src/actions/server/_rcc_robot_utils.py +462 -0
- actions_runtime-1.0.1/src/actions/server/_rcc_runtime_adapter.py +468 -0
- actions_runtime-1.0.1/src/actions/server/_robo_utils/auth.py +22 -0
- actions_runtime-1.0.1/src/actions/server/_robo_utils/callback.py +52 -0
- actions_runtime-1.0.1/src/actions/server/_robo_utils/constants.py +63 -0
- actions_runtime-1.0.1/src/actions/server/_robo_utils/log_custom_handler.py +34 -0
- actions_runtime-1.0.1/src/actions/server/_robo_utils/log_formatter.py +69 -0
- actions_runtime-1.0.1/src/actions/server/_robo_utils/process.py +393 -0
- actions_runtime-1.0.1/src/actions/server/_robo_utils/run_in_thread.py +43 -0
- actions_runtime-1.0.1/src/actions/server/_robo_utils/system_mutex.py +404 -0
- actions_runtime-1.0.1/src/actions/server/_runs_state_cache.py +203 -0
- actions_runtime-1.0.1/src/actions/server/_scheduler.py +1090 -0
- actions_runtime-1.0.1/src/actions/server/_selftest.py +806 -0
- actions_runtime-1.0.1/src/actions/server/_server.py +789 -0
- actions_runtime-1.0.1/src/actions/server/_server_websockets.py +342 -0
- actions_runtime-1.0.1/src/actions/server/_settings.py +560 -0
- actions_runtime-1.0.1/src/actions/server/_slugify.py +40 -0
- actions_runtime-1.0.1/src/actions/server/_static_contents.py +8 -0
- actions_runtime-1.0.1/src/actions/server/_storage.py +204 -0
- actions_runtime-1.0.1/src/actions/server/_triggers.py +596 -0
- actions_runtime-1.0.1/src/actions/server/_user_session.py +284 -0
- actions_runtime-1.0.1/src/actions/server/_watcher.py +37 -0
- actions_runtime-1.0.1/src/actions/server/_whitelist.py +70 -0
- actions_runtime-1.0.1/src/actions/server/_work_items_import.py +98 -0
- actions_runtime-1.0.1/src/actions/server/_work_items_paths.py +19 -0
- actions_runtime-1.0.1/src/actions/server/api.py +42 -0
- actions_runtime-1.0.1/src/actions/server/bin/.gitignore +1 -0
- actions_runtime-1.0.1/src/actions/server/cli.py +69 -0
- actions_runtime-1.0.1/src/actions/server/env/__init__.py +26 -0
- actions_runtime-1.0.1/src/actions/server/index.html +213 -0
- actions_runtime-1.0.1/src/actions/server/mcp/__init__.py +0 -0
- actions_runtime-1.0.1/src/actions/server/mcp/gateway_metadata.py +512 -0
- actions_runtime-1.0.1/src/actions/server/mcp/setup_mcp_server_from_actions.py +5 -0
- actions_runtime-1.0.1/src/actions/server/mcp/setup_mcp_server_v2.py +407 -0
- actions_runtime-1.0.1/src/actions/server/migrations/__init__.py +217 -0
- actions_runtime-1.0.1/src/actions/server/migrations/migration_add_action_enabled.py +15 -0
- actions_runtime-1.0.1/src/actions/server/migrations/migration_add_action_managed_params.py +15 -0
- actions_runtime-1.0.1/src/actions/server/migrations/migration_add_action_options.py +15 -0
- actions_runtime-1.0.1/src/actions/server/migrations/migration_add_code_verifier.py +15 -0
- actions_runtime-1.0.1/src/actions/server/migrations/migration_add_is_consequential.py +15 -0
- actions_runtime-1.0.1/src/actions/server/migrations/migration_add_request_id_to_run.py +19 -0
- actions_runtime-1.0.1/src/actions/server/migrations/migration_add_robot_run_columns.py +31 -0
- actions_runtime-1.0.1/src/actions/server/migrations/migration_add_schedules.py +210 -0
- actions_runtime-1.0.1/src/actions/server/migrations/migration_add_session_and_indexes.py +57 -0
- actions_runtime-1.0.1/src/actions/server/migrations/migration_align_schema_indexes.py +49 -0
- actions_runtime-1.0.1/src/actions/server/migrations/migration_initial.py +9 -0
- actions_runtime-1.0.1/src/actions/server/migrations/migration_reconcile_run_columns.py +79 -0
- actions_runtime-1.0.1/src/actions/server/migrations/migration_reconcile_schema.py +22 -0
- actions_runtime-1.0.1/src/actions/server/package/__init__.py +0 -0
- actions_runtime-1.0.1/src/actions/server/package/_package_build.py +157 -0
- actions_runtime-1.0.1/src/actions/server/package/_package_build_cli.py +651 -0
- actions_runtime-1.0.1/src/actions/server/package/_package_metadata.py +198 -0
- actions_runtime-1.0.1/src/actions/server/package/_package_publish.py +120 -0
- actions_runtime-1.0.1/src/actions/server/package/_package_publish_api.py +461 -0
- actions_runtime-1.0.1/src/actions/server/package/_package_reader.py +54 -0
- actions_runtime-1.0.1/src/actions/server/package/package_exclude.py +138 -0
- actions_runtime-1.0.1/src/actions/server/py.typed +0 -0
- actions_runtime-1.0.1/src/actions/server/templates/action-templates.yaml +10 -0
- actions_runtime-1.0.1/src/actions/server/templates/action-templates.zip +0 -0
- actions_runtime-1.0.1/src/actions/server/templates/zips/advanced.zip +0 -0
- actions_runtime-1.0.1/src/actions/server/templates/zips/basic.zip +0 -0
- actions_runtime-1.0.1/src/actions/server/templates/zips/minimal.zip +0 -0
- actions_runtime-1.0.1/src/actions/server/templates/zips/workflow-producer-consumer.zip +0 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/README.md +8 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/__init__.py +0 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/action_package_handling/__init__.py +445 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/action_package_handling/cli_errors.py +5 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/gen_certificate.py +71 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/ls_protocols.py +66 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/oauth2_settings.py +288 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/__init__.py +0 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/_conda_deps.py +57 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/_deps_protocols.py +173 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/_package_deps.py +45 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/_pip_deps.py +78 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/analyzer.py +636 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/conda_cloud.py +699 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/conda_impl/__init__.py +0 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/conda_impl/conda_channel.py +39 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/conda_impl/conda_match_spec.py +311 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/conda_impl/conda_path.py +306 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/conda_impl/conda_url.py +458 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/conda_impl/conda_version.py +703 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/pip_impl/__init__.py +0 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/pip_impl/pip_distlib_util.py +238 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/pip_impl/pip_packaging_structure.py +61 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/pip_impl/pip_packaging_version.py +505 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/pypi_cloud.py +215 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/termcolors/__init__.py +20 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/url_callback_server.py +293 -0
- actions_runtime-1.0.1/src/actions/server/vendored_deps/yaml_with_location.py +246 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: actions-runtime
|
|
3
|
+
Version: 1.0.1
|
|
4
|
+
Summary: Community Action Server
|
|
5
|
+
License: Apache-2.0
|
|
6
|
+
Author: Sema4.ai, Inc.
|
|
7
|
+
Author-email: dev@sema4.ai
|
|
8
|
+
Requires-Python: >=3.12,<3.14
|
|
9
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
13
|
+
Requires-Dist: actions-core (>=1.0.0,<2.0.0)
|
|
14
|
+
Requires-Dist: actions-http-helper (>=1.0.0,<2.0.0)
|
|
15
|
+
Requires-Dist: actions-work-items (>=0.4.4,<0.5.0)
|
|
16
|
+
Requires-Dist: aiohttp (>=3.13.2,<4.0.0)
|
|
17
|
+
Requires-Dist: aiosmtplib (>=3.0.0,<4.0.0)
|
|
18
|
+
Requires-Dist: croniter (>=2.0.0,<3.0.0)
|
|
19
|
+
Requires-Dist: cryptography (>=46.0.3,<47.0.0)
|
|
20
|
+
Requires-Dist: fastapi-slim (>=0.121.1,<0.122.0)
|
|
21
|
+
Requires-Dist: jsonschema (>=4.23.0,<5.0.0)
|
|
22
|
+
Requires-Dist: jsonschema-specifications (>=2024.10.1,<2025.0.0)
|
|
23
|
+
Requires-Dist: mcp (>=2.0.0,<3.0.0)
|
|
24
|
+
Requires-Dist: msgspec (>=0.19,<0.20)
|
|
25
|
+
Requires-Dist: psutil (>=5.0,<8.0)
|
|
26
|
+
Requires-Dist: psycopg[binary] (>=3.2.0,<4.0.0)
|
|
27
|
+
Requires-Dist: pydantic (>=2.12.4,<3.0.0)
|
|
28
|
+
Requires-Dist: pytz (>=2024.1,<2025.0)
|
|
29
|
+
Requires-Dist: pyyaml (>=6.0.3,<7.0.0)
|
|
30
|
+
Requires-Dist: redis (>=5.0.0,<6.0.0)
|
|
31
|
+
Requires-Dist: requests (>=2,<3)
|
|
32
|
+
Requires-Dist: requests_oauthlib (>=2.0,<3.0)
|
|
33
|
+
Requires-Dist: termcolor (>=3.2.0,<4.0.0)
|
|
34
|
+
Requires-Dist: uvicorn (>=0.38.0,<0.39.0)
|
|
35
|
+
Requires-Dist: watchfiles (>=1.1.1,<2.0.0)
|
|
36
|
+
Requires-Dist: websockets (>=15.0.1,<16.0.0)
|
|
37
|
+
Project-URL: Homepage, https://github.com/joshyorko/actions/tree/community
|
|
38
|
+
Project-URL: Repository, https://github.com/joshyorko/actions/tree/community
|
|
39
|
+
Description-Content-Type: text/markdown
|
|
40
|
+
|
|
41
|
+
# actions-runtime
|
|
42
|
+
|
|
43
|
+
[Sema4.ai Action Server](https://github.com/sema4ai/actions#readme) is a Python framework designed to provide your Python functions to AI Agents. It works both as an MCP Server (hosting tools, resources and prompts) and also provides an OpenAPI compatible API.
|
|
44
|
+
|
|
45
|
+
A `tool` or `action` in this case is defined as a Python function (which has inputs/outputs defined), which is served by the `Sema4.ai Action Server`.
|
|
46
|
+
|
|
47
|
+
The `Sema4.ai Action Server` automatically provides a `/mcp` endpoint for connecting `MCP` clients and also generates an OpenAPI spec for your Python code, enabling different AI/LLM Agents to understand and call your Action. It also manages the Action lifecycle and provides full traceability of what happened during any tool or action call (open the `/runs` endpoint in a browser to see not only inputs and output, but also a full `log.html` with internal details, such as variables and function calls that your Python function executed).
|
|
48
|
+
|
|
49
|
+
## 1. Install Action Server
|
|
50
|
+
|
|
51
|
+
Action Server is available as a stand-alone fully signed executable and via `pip install actions-runtime`.
|
|
52
|
+
|
|
53
|
+
> We recommend the executable to prevent confusion in case you have multiple/crowded Python environments, etc.
|
|
54
|
+
|
|
55
|
+
#### For macOS
|
|
56
|
+
|
|
57
|
+
```sh
|
|
58
|
+
# Install Actions Runtime
|
|
59
|
+
python -m pip install actions-runtime
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
#### For Windows
|
|
63
|
+
|
|
64
|
+
```sh
|
|
65
|
+
# Download Sema4.ai Action Server
|
|
66
|
+
curl -o action-server.exe https://cdn.sema4.ai/action-server/releases/latest/windows64/action-server.exe
|
|
67
|
+
|
|
68
|
+
# Add to PATH or move to a folder that is in PATH
|
|
69
|
+
setx PATH=%PATH%;%CD%
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
#### For Linux
|
|
73
|
+
|
|
74
|
+
```sh
|
|
75
|
+
# Download Sema4.ai Action Server
|
|
76
|
+
curl -o action-server https://cdn.sema4.ai/action-server/releases/latest/linux64/action-server
|
|
77
|
+
chmod a+x action-server
|
|
78
|
+
|
|
79
|
+
# Add to PATH or move to a folder that is in PATH
|
|
80
|
+
sudo mv action-server /usr/local/bin/
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 2. Run your first MCP tool
|
|
84
|
+
|
|
85
|
+
```sh
|
|
86
|
+
# Bootstrap a new project using this template.
|
|
87
|
+
# You'll be prompted for the name of the project (directory):
|
|
88
|
+
action-server new
|
|
89
|
+
|
|
90
|
+
# Start Action Server
|
|
91
|
+
cd my-project
|
|
92
|
+
action-server start
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
👉 You should now have an Action Server running locally at: [http://localhost:8080](http://localhost:8080), so open that in your browser and the web UI will guide you further.
|
|
96
|
+
|
|
97
|
+
### MCP compatibility
|
|
98
|
+
|
|
99
|
+
`/mcp` supports the MCP `2026-07-28` per-request contract through the Python
|
|
100
|
+
MCP SDK v2. Clients use `server/discover` and then send calls without an
|
|
101
|
+
`initialize`/`initialized` exchange or `Mcp-Session-Id`. The legacy `/sse`
|
|
102
|
+
endpoint and initialization/session-era compatibility path are intentionally
|
|
103
|
+
not provided.
|
|
104
|
+
|
|
105
|
+
## What do you need in your Action Package
|
|
106
|
+
|
|
107
|
+
An `Action Package` is currently defined as a local folder that contains at least one Python file containing an action entry point (a Python function marked with `@action` -decorator from `actions`).
|
|
108
|
+
|
|
109
|
+
The `package.yaml` file is required for specifying the Python environment and dependencies for your Action ([RCC](https://github.com/joshyorko/rcc/) will be used to automatically bootstrap it and keep it updated given the `package.yaml` contents).
|
|
110
|
+
|
|
111
|
+
> Note: the `package.yaml` is optional if the action server is not being used as a standalone (i.e.: if it was pip-installed it can use the same python environment where it's installed).
|
|
112
|
+
|
|
113
|
+
### Community RCC Fork
|
|
114
|
+
|
|
115
|
+
This Action Server uses the **joshyorko/rcc v18.19.3** community fork, which provides:
|
|
116
|
+
- **Faster startup** - no proprietary cloud service calls
|
|
117
|
+
- **Official sources** - downloads micromamba directly from conda-forge instead of Robocorp CDN
|
|
118
|
+
- **Decoupled infrastructure** - works fully offline after initial environment bootstrap
|
|
119
|
+
- **Security hardening** - includes upstream archive extraction and TLS fixes, built with Go 1.25.7
|
|
120
|
+
|
|
121
|
+
Environment caching means subsequent startups are near-instant once the holotree is built.
|
|
122
|
+
|
|
123
|
+
### Bootstrapping a new Action
|
|
124
|
+
|
|
125
|
+
Start new projects with:
|
|
126
|
+
|
|
127
|
+
`action-server new`
|
|
128
|
+
|
|
129
|
+
Note: the `action-server` executable should be automatically added to your Python installation after `pip install actions-runtime`; if it was not, use `python -m actions.server` instead.
|
|
130
|
+
|
|
131
|
+
After creating the project, it's possible to serve the actions under the current directory with:
|
|
132
|
+
|
|
133
|
+
`action-server start`
|
|
134
|
+
|
|
135
|
+
For example: When running `action-server start`, the action server will scan for existing actions under the current directory, and it'll start serving those.
|
|
136
|
+
|
|
137
|
+
After it's started, it's possible to access the following URLs:
|
|
138
|
+
|
|
139
|
+
- `/index.html`: UI for the Action Server.
|
|
140
|
+
- `/openapi.json`: Provides the openapi spec for the action server.
|
|
141
|
+
- `/docs`: Provides access to the APIs available in the server and a UI to test it.
|
|
142
|
+
|
|
143
|
+
## Documentation
|
|
144
|
+
|
|
145
|
+
Explore our [docs](https://github.com/sema4ai/actions/tree/master/action_server/docs) for extensive documentation.
|
|
146
|
+
|
|
147
|
+
## Changelog
|
|
148
|
+
|
|
149
|
+
Clean-break Actions Runtime releases and `actions-runtime-*` tags use the
|
|
150
|
+
[Actions Runtime changelog](./docs/ACTIONS_RUNTIME_CHANGELOG.md). The historical
|
|
151
|
+
[Action Server changelog](https://github.com/sema4ai/actions/blob/master/action_server/docs/CHANGELOG.md)
|
|
152
|
+
is retained for the older `action-server-v1.2.x` delivery line.
|
|
153
|
+
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# actions-runtime
|
|
2
|
+
|
|
3
|
+
[Sema4.ai Action Server](https://github.com/sema4ai/actions#readme) is a Python framework designed to provide your Python functions to AI Agents. It works both as an MCP Server (hosting tools, resources and prompts) and also provides an OpenAPI compatible API.
|
|
4
|
+
|
|
5
|
+
A `tool` or `action` in this case is defined as a Python function (which has inputs/outputs defined), which is served by the `Sema4.ai Action Server`.
|
|
6
|
+
|
|
7
|
+
The `Sema4.ai Action Server` automatically provides a `/mcp` endpoint for connecting `MCP` clients and also generates an OpenAPI spec for your Python code, enabling different AI/LLM Agents to understand and call your Action. It also manages the Action lifecycle and provides full traceability of what happened during any tool or action call (open the `/runs` endpoint in a browser to see not only inputs and output, but also a full `log.html` with internal details, such as variables and function calls that your Python function executed).
|
|
8
|
+
|
|
9
|
+
## 1. Install Action Server
|
|
10
|
+
|
|
11
|
+
Action Server is available as a stand-alone fully signed executable and via `pip install actions-runtime`.
|
|
12
|
+
|
|
13
|
+
> We recommend the executable to prevent confusion in case you have multiple/crowded Python environments, etc.
|
|
14
|
+
|
|
15
|
+
#### For macOS
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
# Install Actions Runtime
|
|
19
|
+
python -m pip install actions-runtime
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
#### For Windows
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
# Download Sema4.ai Action Server
|
|
26
|
+
curl -o action-server.exe https://cdn.sema4.ai/action-server/releases/latest/windows64/action-server.exe
|
|
27
|
+
|
|
28
|
+
# Add to PATH or move to a folder that is in PATH
|
|
29
|
+
setx PATH=%PATH%;%CD%
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
#### For Linux
|
|
33
|
+
|
|
34
|
+
```sh
|
|
35
|
+
# Download Sema4.ai Action Server
|
|
36
|
+
curl -o action-server https://cdn.sema4.ai/action-server/releases/latest/linux64/action-server
|
|
37
|
+
chmod a+x action-server
|
|
38
|
+
|
|
39
|
+
# Add to PATH or move to a folder that is in PATH
|
|
40
|
+
sudo mv action-server /usr/local/bin/
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 2. Run your first MCP tool
|
|
44
|
+
|
|
45
|
+
```sh
|
|
46
|
+
# Bootstrap a new project using this template.
|
|
47
|
+
# You'll be prompted for the name of the project (directory):
|
|
48
|
+
action-server new
|
|
49
|
+
|
|
50
|
+
# Start Action Server
|
|
51
|
+
cd my-project
|
|
52
|
+
action-server start
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
👉 You should now have an Action Server running locally at: [http://localhost:8080](http://localhost:8080), so open that in your browser and the web UI will guide you further.
|
|
56
|
+
|
|
57
|
+
### MCP compatibility
|
|
58
|
+
|
|
59
|
+
`/mcp` supports the MCP `2026-07-28` per-request contract through the Python
|
|
60
|
+
MCP SDK v2. Clients use `server/discover` and then send calls without an
|
|
61
|
+
`initialize`/`initialized` exchange or `Mcp-Session-Id`. The legacy `/sse`
|
|
62
|
+
endpoint and initialization/session-era compatibility path are intentionally
|
|
63
|
+
not provided.
|
|
64
|
+
|
|
65
|
+
## What do you need in your Action Package
|
|
66
|
+
|
|
67
|
+
An `Action Package` is currently defined as a local folder that contains at least one Python file containing an action entry point (a Python function marked with `@action` -decorator from `actions`).
|
|
68
|
+
|
|
69
|
+
The `package.yaml` file is required for specifying the Python environment and dependencies for your Action ([RCC](https://github.com/joshyorko/rcc/) will be used to automatically bootstrap it and keep it updated given the `package.yaml` contents).
|
|
70
|
+
|
|
71
|
+
> Note: the `package.yaml` is optional if the action server is not being used as a standalone (i.e.: if it was pip-installed it can use the same python environment where it's installed).
|
|
72
|
+
|
|
73
|
+
### Community RCC Fork
|
|
74
|
+
|
|
75
|
+
This Action Server uses the **joshyorko/rcc v18.19.3** community fork, which provides:
|
|
76
|
+
- **Faster startup** - no proprietary cloud service calls
|
|
77
|
+
- **Official sources** - downloads micromamba directly from conda-forge instead of Robocorp CDN
|
|
78
|
+
- **Decoupled infrastructure** - works fully offline after initial environment bootstrap
|
|
79
|
+
- **Security hardening** - includes upstream archive extraction and TLS fixes, built with Go 1.25.7
|
|
80
|
+
|
|
81
|
+
Environment caching means subsequent startups are near-instant once the holotree is built.
|
|
82
|
+
|
|
83
|
+
### Bootstrapping a new Action
|
|
84
|
+
|
|
85
|
+
Start new projects with:
|
|
86
|
+
|
|
87
|
+
`action-server new`
|
|
88
|
+
|
|
89
|
+
Note: the `action-server` executable should be automatically added to your Python installation after `pip install actions-runtime`; if it was not, use `python -m actions.server` instead.
|
|
90
|
+
|
|
91
|
+
After creating the project, it's possible to serve the actions under the current directory with:
|
|
92
|
+
|
|
93
|
+
`action-server start`
|
|
94
|
+
|
|
95
|
+
For example: When running `action-server start`, the action server will scan for existing actions under the current directory, and it'll start serving those.
|
|
96
|
+
|
|
97
|
+
After it's started, it's possible to access the following URLs:
|
|
98
|
+
|
|
99
|
+
- `/index.html`: UI for the Action Server.
|
|
100
|
+
- `/openapi.json`: Provides the openapi spec for the action server.
|
|
101
|
+
- `/docs`: Provides access to the APIs available in the server and a UI to test it.
|
|
102
|
+
|
|
103
|
+
## Documentation
|
|
104
|
+
|
|
105
|
+
Explore our [docs](https://github.com/sema4ai/actions/tree/master/action_server/docs) for extensive documentation.
|
|
106
|
+
|
|
107
|
+
## Changelog
|
|
108
|
+
|
|
109
|
+
Clean-break Actions Runtime releases and `actions-runtime-*` tags use the
|
|
110
|
+
[Actions Runtime changelog](./docs/ACTIONS_RUNTIME_CHANGELOG.md). The historical
|
|
111
|
+
[Action Server changelog](https://github.com/sema4ai/actions/blob/master/action_server/docs/CHANGELOG.md)
|
|
112
|
+
is retained for the older `action-server-v1.2.x` delivery line.
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
import platform
|
|
4
|
+
import sys
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
log = logging.getLogger(__name__)
|
|
8
|
+
|
|
9
|
+
# No real build, just download RCC at this point.
|
|
10
|
+
|
|
11
|
+
# Note: referenced here and in actions.server._download_rcc
|
|
12
|
+
# Using joshyorko/rcc open-source version
|
|
13
|
+
RCC_VERSION = "18.19.3"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
CURDIR = Path(__file__).parent.absolute()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _download_with_resume(url: str, target: Path) -> Path:
|
|
20
|
+
import stat
|
|
21
|
+
|
|
22
|
+
log.info(f"Downloading '{url}' to '{target}'")
|
|
23
|
+
|
|
24
|
+
chunk_size = 1024 * 5
|
|
25
|
+
with _open_urllib(url) as response:
|
|
26
|
+
content_size = int(response.getheader("Content-Length") or -1)
|
|
27
|
+
try:
|
|
28
|
+
with open(target, "wb") as stream:
|
|
29
|
+
while True:
|
|
30
|
+
chunk = response.read(chunk_size)
|
|
31
|
+
if not chunk:
|
|
32
|
+
# Note: in a bad connection it can return an empty chunk
|
|
33
|
+
# even before finishing (so, we resume it afterward if
|
|
34
|
+
# that was the case).
|
|
35
|
+
break
|
|
36
|
+
stream.write(chunk)
|
|
37
|
+
except Exception:
|
|
38
|
+
# Non-resumable case, just raise.
|
|
39
|
+
if content_size <= 0:
|
|
40
|
+
raise
|
|
41
|
+
# Otherwise, keep on going to resume the download if it still
|
|
42
|
+
# hasn't finished.
|
|
43
|
+
|
|
44
|
+
MAX_TRIES = 10
|
|
45
|
+
for i in range(MAX_TRIES):
|
|
46
|
+
curr_file_size = _get_file_size(target)
|
|
47
|
+
|
|
48
|
+
if content_size > 0:
|
|
49
|
+
# It can be resumed.
|
|
50
|
+
if content_size > curr_file_size:
|
|
51
|
+
log.info(
|
|
52
|
+
f"Resuming download of '{url}' to '{target}' (downloaded {curr_file_size} of {content_size} (bytes))"
|
|
53
|
+
)
|
|
54
|
+
try:
|
|
55
|
+
_resume_download(url, target, chunk_size)
|
|
56
|
+
except Exception:
|
|
57
|
+
if i == MAX_TRIES - 1:
|
|
58
|
+
raise
|
|
59
|
+
else:
|
|
60
|
+
break
|
|
61
|
+
else:
|
|
62
|
+
# It cannot be resumed: raise if everything wasn't downloaded.
|
|
63
|
+
if content_size > curr_file_size:
|
|
64
|
+
raise RuntimeError(
|
|
65
|
+
f"Unable to download {url} to {target}. Please retry later."
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
st = os.stat(target)
|
|
69
|
+
os.chmod(target, st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
|
|
70
|
+
|
|
71
|
+
return target
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _open_urllib(url: str, headers=None):
|
|
75
|
+
import urllib.request
|
|
76
|
+
|
|
77
|
+
# Cloudflare seems to be blocking "User-Agent: Python-urllib/3.9".
|
|
78
|
+
# Use a different one as that must be sorted out.
|
|
79
|
+
use_headers = {"User-Agent": "Mozilla"}
|
|
80
|
+
if headers:
|
|
81
|
+
use_headers.update(headers)
|
|
82
|
+
return urllib.request.urlopen(
|
|
83
|
+
urllib.request.Request(url, headers=use_headers), timeout=20
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _get_file_size(filename: str | Path) -> int:
|
|
88
|
+
# Check if file already exists and get downloaded size (if any)
|
|
89
|
+
file_size = 0
|
|
90
|
+
if os.path.exists(filename):
|
|
91
|
+
with open(filename, "rb") as f:
|
|
92
|
+
file_size = os.fstat(f.fileno()).st_size
|
|
93
|
+
return file_size
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _resume_download(url: str, filename: str | Path, chunk_size: int = 1024):
|
|
97
|
+
"""Downloads a file in chunks with resume support.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
url: The URL of the file to download.
|
|
101
|
+
filename: The filename to save the downloaded file.
|
|
102
|
+
chunk_size: The size of each chunk to download (in bytes).
|
|
103
|
+
"""
|
|
104
|
+
downloaded_size = _get_file_size(filename)
|
|
105
|
+
# Set headers for resume download
|
|
106
|
+
headers = {}
|
|
107
|
+
if downloaded_size > 0:
|
|
108
|
+
headers["Range"] = f"bytes={downloaded_size}-"
|
|
109
|
+
|
|
110
|
+
with _open_urllib(url, headers) as response, open(filename, "ab") as stream:
|
|
111
|
+
content_size = response.getheader("Content-Length")
|
|
112
|
+
|
|
113
|
+
if not content_size:
|
|
114
|
+
raise RuntimeError("Resuming downloads is not supported.")
|
|
115
|
+
|
|
116
|
+
while True:
|
|
117
|
+
chunk = response.read(chunk_size)
|
|
118
|
+
if not chunk:
|
|
119
|
+
break
|
|
120
|
+
stream.write(chunk)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def _download_rcc():
|
|
124
|
+
"""
|
|
125
|
+
Downloads RCC in the place where the action server expects it.
|
|
126
|
+
"""
|
|
127
|
+
|
|
128
|
+
if sys.platform == "win32":
|
|
129
|
+
rcc_path = (
|
|
130
|
+
CURDIR
|
|
131
|
+
/ "src"
|
|
132
|
+
/ "actions"
|
|
133
|
+
/ "server"
|
|
134
|
+
/ "bin"
|
|
135
|
+
/ f"rcc-{RCC_VERSION}.exe"
|
|
136
|
+
)
|
|
137
|
+
else:
|
|
138
|
+
rcc_path = (
|
|
139
|
+
CURDIR / "src" / "actions" / "server" / "bin" / f"rcc-{RCC_VERSION}"
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
machine = platform.machine()
|
|
143
|
+
is_64 = not machine or "64" in machine
|
|
144
|
+
|
|
145
|
+
# Using joshyorko/rcc GitHub releases
|
|
146
|
+
# Asset names: rcc-windows64.exe, rcc-macosarm64, rcc-macos64, rcc-linux64
|
|
147
|
+
if sys.platform == "win32":
|
|
148
|
+
if is_64:
|
|
149
|
+
asset_name = "rcc-windows64.exe"
|
|
150
|
+
else:
|
|
151
|
+
raise RuntimeError("Unsupported platform (windows 32 bits)")
|
|
152
|
+
|
|
153
|
+
elif sys.platform == "darwin":
|
|
154
|
+
if machine == "arm64":
|
|
155
|
+
asset_name = "rcc-macosarm64"
|
|
156
|
+
else:
|
|
157
|
+
asset_name = "rcc-macos64"
|
|
158
|
+
|
|
159
|
+
else:
|
|
160
|
+
if is_64:
|
|
161
|
+
asset_name = "rcc-linux64"
|
|
162
|
+
else:
|
|
163
|
+
raise RuntimeError("Unsupported platform (linux 32 bits)")
|
|
164
|
+
|
|
165
|
+
# GitHub releases URL format
|
|
166
|
+
rcc_url = f"https://github.com/joshyorko/rcc/releases/download/v{RCC_VERSION}/{asset_name}"
|
|
167
|
+
|
|
168
|
+
print(f"Downloading '{rcc_url}' to '{rcc_path}'")
|
|
169
|
+
return _download_with_resume(rcc_url, rcc_path)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def build(*args, **kwarg):
|
|
173
|
+
if os.environ.get("ACTION_SERVER_SKIP_DOWNLOAD_IN_BUILD", "").lower().strip() in (
|
|
174
|
+
"1",
|
|
175
|
+
"true",
|
|
176
|
+
):
|
|
177
|
+
return
|
|
178
|
+
|
|
179
|
+
_download_rcc()
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
if __name__ == "__main__":
|
|
183
|
+
build()
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
[tool.poetry]
|
|
2
|
+
name = "actions-runtime"
|
|
3
|
+
version = "1.0.1"
|
|
4
|
+
description = """Community Action Server"""
|
|
5
|
+
authors = [
|
|
6
|
+
"Sema4.ai, Inc. <dev@sema4.ai>",
|
|
7
|
+
"Fabio Z. <fabio@sema4.ai>"
|
|
8
|
+
]
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
repository = "https://github.com/joshyorko/actions/tree/community"
|
|
11
|
+
license = "Apache-2.0"
|
|
12
|
+
packages = [{ include = "actions", from = "src" }]
|
|
13
|
+
include = [
|
|
14
|
+
"src/actions/server/_static_contents.py",
|
|
15
|
+
"src/actions/server/_oauth2_config.py",
|
|
16
|
+
"src/actions/server/bin/rcc*",
|
|
17
|
+
"src/actions/server/templates/action-templates.zip",
|
|
18
|
+
"src/actions/server/templates/action-templates.yaml",
|
|
19
|
+
]
|
|
20
|
+
homepage = "https://github.com/joshyorko/actions/tree/community"
|
|
21
|
+
|
|
22
|
+
[tool.poetry.scripts]
|
|
23
|
+
action-server = "actions.server.cli:main"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
[tool.poetry.dependencies]
|
|
27
|
+
aiohttp = "^3.13.2"
|
|
28
|
+
fastapi-slim = "^0.121.1"
|
|
29
|
+
jsonschema = "^4.23.0"
|
|
30
|
+
# This one needs a `_fix_jsonschema_specifications` hack
|
|
31
|
+
# See: https://github.com/python-jsonschema/jsonschema-specifications/issues/61
|
|
32
|
+
jsonschema-specifications = "^2024.10.1"
|
|
33
|
+
msgspec = "^0.19"
|
|
34
|
+
psutil = ">=5.0,<8.0"
|
|
35
|
+
pydantic = "^2.12.4"
|
|
36
|
+
pyyaml = "^6.0.3"
|
|
37
|
+
python = ">=3.12,<3.14"
|
|
38
|
+
requests = "^2"
|
|
39
|
+
actions-core = "^1.0.0"
|
|
40
|
+
actions-http-helper = "^1.0.0"
|
|
41
|
+
termcolor = "^3.2.0"
|
|
42
|
+
uvicorn = "^0.38.0"
|
|
43
|
+
websockets = "^15.0.1"
|
|
44
|
+
cryptography = "^46.0.3"
|
|
45
|
+
requests_oauthlib = "^2.0"
|
|
46
|
+
watchfiles = "^1.1.1"
|
|
47
|
+
mcp = "^2.0.0"
|
|
48
|
+
actions-work-items = "^0.4.4"
|
|
49
|
+
# Scheduling dependencies
|
|
50
|
+
croniter = "^2.0.0"
|
|
51
|
+
pytz = "^2024.1"
|
|
52
|
+
aiosmtplib = "^3.0.0"
|
|
53
|
+
# Redis for control-room-lite mode (bundled so it just works)
|
|
54
|
+
redis = "^5.0.0"
|
|
55
|
+
psycopg = { version = "^3.2.0", extras = ["binary"] }
|
|
56
|
+
|
|
57
|
+
[tool.poetry.group.dev.dependencies]
|
|
58
|
+
actions-local-devutils = { path = "../devutils/", develop = true }
|
|
59
|
+
httpx = "^0.28.1"
|
|
60
|
+
types-requests = "^2"
|
|
61
|
+
types-PyYAML = "^6"
|
|
62
|
+
robocorp-log-pytest = "^0.0.5"
|
|
63
|
+
types-psutil = "^7"
|
|
64
|
+
types-jsonschema = "^4.22.0"
|
|
65
|
+
pyinstaller = "6.16.0"
|
|
66
|
+
pyinstaller-hooks-contrib = "2025.9"
|
|
67
|
+
|
|
68
|
+
[tool.mypy]
|
|
69
|
+
mypy_path = "src:tests"
|
|
70
|
+
|
|
71
|
+
[tool.black]
|
|
72
|
+
skip-string-normalization = false
|
|
73
|
+
skip-magic-trailing-comma = false
|
|
74
|
+
|
|
75
|
+
[tool.isort]
|
|
76
|
+
profile = "black"
|
|
77
|
+
|
|
78
|
+
[build-system]
|
|
79
|
+
requires = ["poetry-core", "setuptools"]
|
|
80
|
+
build-backend = "poetry.core.masonry.api"
|
|
81
|
+
|
|
82
|
+
[tool.poetry.build]
|
|
83
|
+
script = "build.py"
|
|
84
|
+
generate-setup-file = true
|
|
85
|
+
|
|
86
|
+
[tool.pytest.ini_options]
|
|
87
|
+
norecursedirs = "tests/action_server_tests/test_devenv/* dist build build-binary"
|
|
88
|
+
testpaths = ["tests"]
|
|
89
|
+
markers = [
|
|
90
|
+
"real_rcc: gated real RCC Environment Artifact execution proof",
|
|
91
|
+
"postgresql: requires a PostgreSQL service",
|
|
92
|
+
]
|
|
93
|
+
filterwarnings = [
|
|
94
|
+
"ignore:ast.Str is deprecated.*:DeprecationWarning:robocorp\\.log\\._ast_utils",
|
|
95
|
+
"ignore:ast.Str is deprecated.*:DeprecationWarning:robocorp\\.log\\._rewrite_ast_add_callbacks",
|
|
96
|
+
"ignore:Attribute s is deprecated.*:DeprecationWarning:robocorp\\.log\\._rewrite_ast_add_callbacks",
|
|
97
|
+
]
|
|
98
|
+
|
|
99
|
+
# This is for backward compatibility.
|
|
100
|
+
[[tool.mypy.overrides]]
|
|
101
|
+
module = "robocorp.actions.*"
|
|
102
|
+
ignore_missing_imports = true
|
|
103
|
+
|
|
104
|
+
# Ignore missing build system modules (tests for unimplemented features)
|
|
105
|
+
[[tool.mypy.overrides]]
|
|
106
|
+
module = [
|
|
107
|
+
"tree_shaker",
|
|
108
|
+
"tier_selector",
|
|
109
|
+
"artifact_validator",
|
|
110
|
+
"build_artifact",
|
|
111
|
+
"package_resolver",
|
|
112
|
+
"package_manifest"
|
|
113
|
+
]
|
|
114
|
+
ignore_missing_imports = true
|
|
115
|
+
|
|
116
|
+
[[tool.mypy.overrides]]
|
|
117
|
+
module = "robocorp.tasks.*"
|
|
118
|
+
ignore_missing_imports = true
|
|
119
|
+
|
|
120
|
+
[[tool.mypy.overrides]]
|
|
121
|
+
module = [
|
|
122
|
+
"actions.server._oauth2_config",
|
|
123
|
+
"actions.server._static_contents",
|
|
124
|
+
"croniter",
|
|
125
|
+
"cronstrue",
|
|
126
|
+
"pytz",
|
|
127
|
+
]
|
|
128
|
+
ignore_missing_imports = true
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
[tool.robocorp.log]
|
|
132
|
+
default_library_filter_kind = "exclude"
|
|
133
|
+
log_filter_rules = [{ name = "sema4ai", kind = "full_log" }]
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
from setuptools import setup
|
|
3
|
+
|
|
4
|
+
package_dir = \
|
|
5
|
+
{'': 'src'}
|
|
6
|
+
|
|
7
|
+
packages = \
|
|
8
|
+
['actions',
|
|
9
|
+
'actions.server',
|
|
10
|
+
'actions.server._build_common',
|
|
11
|
+
'actions.server._common',
|
|
12
|
+
'actions.server._common.action_package_handling',
|
|
13
|
+
'actions.server._common.package_deps',
|
|
14
|
+
'actions.server._common.package_deps.conda_impl',
|
|
15
|
+
'actions.server._common.package_deps.pip_impl',
|
|
16
|
+
'actions.server._common.termcolors',
|
|
17
|
+
'actions.server._preload_actions',
|
|
18
|
+
'actions.server._robo_utils',
|
|
19
|
+
'actions.server.env',
|
|
20
|
+
'actions.server.mcp',
|
|
21
|
+
'actions.server.migrations',
|
|
22
|
+
'actions.server.package',
|
|
23
|
+
'actions.server.vendored_deps',
|
|
24
|
+
'actions.server.vendored_deps.action_package_handling',
|
|
25
|
+
'actions.server.vendored_deps.package_deps',
|
|
26
|
+
'actions.server.vendored_deps.package_deps.conda_impl',
|
|
27
|
+
'actions.server.vendored_deps.package_deps.pip_impl',
|
|
28
|
+
'actions.server.vendored_deps.termcolors']
|
|
29
|
+
|
|
30
|
+
package_data = \
|
|
31
|
+
{'': ['*'], 'actions.server': ['bin/*', 'templates/*', 'templates/zips/*']}
|
|
32
|
+
|
|
33
|
+
install_requires = \
|
|
34
|
+
['actions-core>=1.0.0,<2.0.0',
|
|
35
|
+
'actions-http-helper>=1.0.0,<2.0.0',
|
|
36
|
+
'actions-work-items>=0.4.4,<0.5.0',
|
|
37
|
+
'aiohttp>=3.13.2,<4.0.0',
|
|
38
|
+
'aiosmtplib>=3.0.0,<4.0.0',
|
|
39
|
+
'croniter>=2.0.0,<3.0.0',
|
|
40
|
+
'cryptography>=46.0.3,<47.0.0',
|
|
41
|
+
'fastapi-slim>=0.121.1,<0.122.0',
|
|
42
|
+
'jsonschema-specifications>=2024.10.1,<2025.0.0',
|
|
43
|
+
'jsonschema>=4.23.0,<5.0.0',
|
|
44
|
+
'mcp>=2.0.0,<3.0.0',
|
|
45
|
+
'msgspec>=0.19,<0.20',
|
|
46
|
+
'psutil>=5.0,<8.0',
|
|
47
|
+
'psycopg[binary]>=3.2.0,<4.0.0',
|
|
48
|
+
'pydantic>=2.12.4,<3.0.0',
|
|
49
|
+
'pytz>=2024.1,<2025.0',
|
|
50
|
+
'pyyaml>=6.0.3,<7.0.0',
|
|
51
|
+
'redis>=5.0.0,<6.0.0',
|
|
52
|
+
'requests>=2,<3',
|
|
53
|
+
'requests_oauthlib>=2.0,<3.0',
|
|
54
|
+
'termcolor>=3.2.0,<4.0.0',
|
|
55
|
+
'uvicorn>=0.38.0,<0.39.0',
|
|
56
|
+
'watchfiles>=1.1.1,<2.0.0',
|
|
57
|
+
'websockets>=15.0.1,<16.0.0']
|
|
58
|
+
|
|
59
|
+
entry_points = \
|
|
60
|
+
{'console_scripts': ['action-server = actions.server.cli:main']}
|
|
61
|
+
|
|
62
|
+
setup_kwargs = {
|
|
63
|
+
'name': 'actions-runtime',
|
|
64
|
+
'version': '1.0.1',
|
|
65
|
+
'description': 'Community Action Server',
|
|
66
|
+
'long_description': "# actions-runtime\n\n[Sema4.ai Action Server](https://github.com/sema4ai/actions#readme) is a Python framework designed to provide your Python functions to AI Agents. It works both as an MCP Server (hosting tools, resources and prompts) and also provides an OpenAPI compatible API.\n\nA `tool` or `action` in this case is defined as a Python function (which has inputs/outputs defined), which is served by the `Sema4.ai Action Server`.\n\nThe `Sema4.ai Action Server` automatically provides a `/mcp` endpoint for connecting `MCP` clients and also generates an OpenAPI spec for your Python code, enabling different AI/LLM Agents to understand and call your Action. It also manages the Action lifecycle and provides full traceability of what happened during any tool or action call (open the `/runs` endpoint in a browser to see not only inputs and output, but also a full `log.html` with internal details, such as variables and function calls that your Python function executed).\n\n## 1. Install Action Server\n\nAction Server is available as a stand-alone fully signed executable and via `pip install actions-runtime`.\n\n> We recommend the executable to prevent confusion in case you have multiple/crowded Python environments, etc.\n\n#### For macOS\n\n```sh\n# Install Actions Runtime\npython -m pip install actions-runtime\n```\n\n#### For Windows\n\n```sh\n# Download Sema4.ai Action Server\ncurl -o action-server.exe https://cdn.sema4.ai/action-server/releases/latest/windows64/action-server.exe\n\n# Add to PATH or move to a folder that is in PATH\nsetx PATH=%PATH%;%CD%\n```\n\n#### For Linux\n\n```sh\n# Download Sema4.ai Action Server\ncurl -o action-server https://cdn.sema4.ai/action-server/releases/latest/linux64/action-server\nchmod a+x action-server\n\n# Add to PATH or move to a folder that is in PATH\nsudo mv action-server /usr/local/bin/\n```\n\n## 2. Run your first MCP tool\n\n```sh\n# Bootstrap a new project using this template.\n# You'll be prompted for the name of the project (directory):\naction-server new\n\n# Start Action Server\ncd my-project\naction-server start\n```\n\n👉 You should now have an Action Server running locally at: [http://localhost:8080](http://localhost:8080), so open that in your browser and the web UI will guide you further.\n\n### MCP compatibility\n\n`/mcp` supports the MCP `2026-07-28` per-request contract through the Python\nMCP SDK v2. Clients use `server/discover` and then send calls without an\n`initialize`/`initialized` exchange or `Mcp-Session-Id`. The legacy `/sse`\nendpoint and initialization/session-era compatibility path are intentionally\nnot provided.\n\n## What do you need in your Action Package\n\nAn `Action Package` is currently defined as a local folder that contains at least one Python file containing an action entry point (a Python function marked with `@action` -decorator from `actions`).\n\nThe `package.yaml` file is required for specifying the Python environment and dependencies for your Action ([RCC](https://github.com/joshyorko/rcc/) will be used to automatically bootstrap it and keep it updated given the `package.yaml` contents).\n\n> Note: the `package.yaml` is optional if the action server is not being used as a standalone (i.e.: if it was pip-installed it can use the same python environment where it's installed).\n\n### Community RCC Fork\n\nThis Action Server uses the **joshyorko/rcc v18.19.3** community fork, which provides:\n- **Faster startup** - no proprietary cloud service calls\n- **Official sources** - downloads micromamba directly from conda-forge instead of Robocorp CDN\n- **Decoupled infrastructure** - works fully offline after initial environment bootstrap\n- **Security hardening** - includes upstream archive extraction and TLS fixes, built with Go 1.25.7\n\nEnvironment caching means subsequent startups are near-instant once the holotree is built.\n\n### Bootstrapping a new Action\n\nStart new projects with:\n\n`action-server new`\n\nNote: the `action-server` executable should be automatically added to your Python installation after `pip install actions-runtime`; if it was not, use `python -m actions.server` instead.\n\nAfter creating the project, it's possible to serve the actions under the current directory with:\n\n`action-server start`\n\nFor example: When running `action-server start`, the action server will scan for existing actions under the current directory, and it'll start serving those.\n\nAfter it's started, it's possible to access the following URLs:\n\n- `/index.html`: UI for the Action Server.\n- `/openapi.json`: Provides the openapi spec for the action server.\n- `/docs`: Provides access to the APIs available in the server and a UI to test it.\n\n## Documentation\n\nExplore our [docs](https://github.com/sema4ai/actions/tree/master/action_server/docs) for extensive documentation.\n\n## Changelog\n\nClean-break Actions Runtime releases and `actions-runtime-*` tags use the\n[Actions Runtime changelog](./docs/ACTIONS_RUNTIME_CHANGELOG.md). The historical\n[Action Server changelog](https://github.com/sema4ai/actions/blob/master/action_server/docs/CHANGELOG.md)\nis retained for the older `action-server-v1.2.x` delivery line.\n",
|
|
67
|
+
'author': 'Sema4.ai, Inc.',
|
|
68
|
+
'author_email': 'dev@sema4.ai',
|
|
69
|
+
'maintainer': 'None',
|
|
70
|
+
'maintainer_email': 'None',
|
|
71
|
+
'url': 'https://github.com/joshyorko/actions/tree/community',
|
|
72
|
+
'package_dir': package_dir,
|
|
73
|
+
'packages': packages,
|
|
74
|
+
'package_data': package_data,
|
|
75
|
+
'install_requires': install_requires,
|
|
76
|
+
'entry_points': entry_points,
|
|
77
|
+
'python_requires': '>=3.12,<3.14',
|
|
78
|
+
}
|
|
79
|
+
from build import *
|
|
80
|
+
build(setup_kwargs)
|
|
81
|
+
|
|
82
|
+
setup(**setup_kwargs)
|