processforge 0.2.22__tar.gz → 0.2.24__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.
Potentially problematic release.
This version of processforge might be problematic. Click here for more details.
- {processforge-0.2.22/src/processforge.egg-info → processforge-0.2.24}/PKG-INFO +7 -5
- {processforge-0.2.22 → processforge-0.2.24}/README.md +6 -4
- {processforge-0.2.22 → processforge-0.2.24}/pyproject.toml +1 -1
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/api/app.py +14 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/api/models.py +7 -2
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/api/runner.py +58 -5
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/api/serve.py +9 -9
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/result.py +16 -1
- {processforge-0.2.22 → processforge-0.2.24/src/processforge.egg-info}/PKG-INFO +7 -5
- {processforge-0.2.22 → processforge-0.2.24}/LICENSE +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/MANIFEST.in +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/flowsheets/closed-loop-chain.json +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/flowsheets/festim/festim_2d.json +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/flowsheets/festim/festim_dynamic_loop.json +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/flowsheets/hydraulic-chain.json +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/flowsheets/openmc/msre_eigenvalue.json +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/setup.cfg +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/__init__.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/__main__.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/_schema.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/analysis/__init__.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/analysis/dof.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/api/__init__.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/__init__.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/backends/__init__.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/backends/base.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/backends/casadi_backend.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/backends/pyomo_backend.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/backends/scipy_backend.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/flowsheet.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/jacobian.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/mixin.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/solver.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/stream_var.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/units/__init__.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/units/flash_eo.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/units/heater_eo.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/units/pipes_eo.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/units/pump_eo.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/units/strainer_eo.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/units/valve_eo.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/flowsheet.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/fmu/__init__.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/fmu/_fmi_vars.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/fmu/builder.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/fmu/slave_template.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/modelica/__init__.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/modelica/mo_writer.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/modelica/omc_runner.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/modelica/transpiler.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/modelica/unit_equations.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/pcl/__init__.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/pcl/compiler.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/pcl/namespace.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/provenance.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/__init__.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/base.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/base_jacobian_mixin.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/cantera_jacobian.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/cantera_provider.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/coolprop_provider.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/festim_provider.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/jacobian_contributor.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/manager.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/modelica_jacobian.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/modelica_provider.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/openmc_provider.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/reference_state_registry.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/registry.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/schemas/__init__.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/schemas/flowsheet_schema.json +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/schemas/openmc/openmc_model.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/simulate.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/solver.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/state.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/thermo.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/types.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/__init__.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/cstr.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/festim_membrane.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/flash.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/heater.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/pfr.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/pipes.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/provider_mixin.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/pump.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/solver.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/solver_unit.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/strainer.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/tank.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/valve.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/utils/__init__.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/utils/flowsheet_diagram.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/utils/mermaid_diagram.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/utils/topology.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/utils/unit_consistency.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/utils/validate_flowsheet.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge/utils/validation.py +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge.egg-info/SOURCES.txt +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge.egg-info/dependency_links.txt +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge.egg-info/entry_points.txt +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge.egg-info/requires.txt +0 -0
- {processforge-0.2.22 → processforge-0.2.24}/src/processforge.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: processforge
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.24
|
|
4
4
|
Summary: A Python-based process simulation framework for chemical engineering applications.
|
|
5
5
|
Author-email: Process Forge Team <team@processforge.dev>
|
|
6
6
|
License-Expression: BSD-3-Clause
|
|
@@ -415,13 +415,15 @@ Run a simulation and map an output folder:
|
|
|
415
415
|
|
|
416
416
|
```Bash
|
|
417
417
|
docker run -p 8080:8080 \
|
|
418
|
-
-e
|
|
419
|
-
-e
|
|
420
|
-
-e
|
|
418
|
+
-e S3_ACCESS_KEY='XXXXXX' \
|
|
419
|
+
-e S3_SECRET_KEY='YYYYYYYYY' \
|
|
420
|
+
-e S3_ENDPOINT_URL='https://processforge-files.ams3.s3.com' \
|
|
421
|
+
-e S3_REGION_NAME='ams3' \
|
|
422
|
+
-e S3_BUCKET_NAME='Dev' \
|
|
421
423
|
ghcr.io/urjanova/processforge:latest \
|
|
422
424
|
pf-serve
|
|
423
425
|
```
|
|
424
|
-
(
|
|
426
|
+
(Ensure you provide your S3-compatible credentials and endpoint URL; output and results will be synced directly to the specified bucket.)
|
|
425
427
|
## Logo credit
|
|
426
428
|
Google Gemini / Nano Banana
|
|
427
429
|
|
|
@@ -354,13 +354,15 @@ Run a simulation and map an output folder:
|
|
|
354
354
|
|
|
355
355
|
```Bash
|
|
356
356
|
docker run -p 8080:8080 \
|
|
357
|
-
-e
|
|
358
|
-
-e
|
|
359
|
-
-e
|
|
357
|
+
-e S3_ACCESS_KEY='XXXXXX' \
|
|
358
|
+
-e S3_SECRET_KEY='YYYYYYYYY' \
|
|
359
|
+
-e S3_ENDPOINT_URL='https://processforge-files.ams3.s3.com' \
|
|
360
|
+
-e S3_REGION_NAME='ams3' \
|
|
361
|
+
-e S3_BUCKET_NAME='Dev' \
|
|
360
362
|
ghcr.io/urjanova/processforge:latest \
|
|
361
363
|
pf-serve
|
|
362
364
|
```
|
|
363
|
-
(
|
|
365
|
+
(Ensure you provide your S3-compatible credentials and endpoint URL; output and results will be synced directly to the specified bucket.)
|
|
364
366
|
## Logo credit
|
|
365
367
|
Google Gemini / Nano Banana
|
|
366
368
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "processforge"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.24"
|
|
8
8
|
description = "A Python-based process simulation framework for chemical engineering applications."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "BSD-3-Clause"
|
|
@@ -19,6 +19,20 @@ app = FastAPI(title="ProcessForge API", version=_version)
|
|
|
19
19
|
_jobs: dict[str, dict] = {}
|
|
20
20
|
|
|
21
21
|
|
|
22
|
+
@app.on_event("startup")
|
|
23
|
+
async def startup_event():
|
|
24
|
+
import os
|
|
25
|
+
required_env_vars = [
|
|
26
|
+
"S3_ACCESS_KEY",
|
|
27
|
+
"S3_SECRET_KEY",
|
|
28
|
+
"S3_ENDPOINT_URL",
|
|
29
|
+
"S3_BUCKET_NAME",
|
|
30
|
+
]
|
|
31
|
+
missing = [v for v in required_env_vars if not os.environ.get(v)]
|
|
32
|
+
if missing:
|
|
33
|
+
raise RuntimeError(f"Missing required S3 environment variables: {', '.join(missing)}")
|
|
34
|
+
|
|
35
|
+
|
|
22
36
|
async def _run_job_in_thread(
|
|
23
37
|
job_id: str,
|
|
24
38
|
flowsheet: dict,
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import os
|
|
3
4
|
from typing import Literal
|
|
4
5
|
|
|
5
|
-
from pydantic import BaseModel
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _get_default_bucket() -> str:
|
|
10
|
+
return os.environ.get("S3_BUCKET_NAME", "")
|
|
6
11
|
|
|
7
12
|
|
|
8
13
|
class RunRequest(BaseModel):
|
|
9
14
|
flowsheet: dict
|
|
10
|
-
s3_bucket: str
|
|
15
|
+
s3_bucket: str = Field(default_factory=_get_default_bucket)
|
|
11
16
|
s3_prefix: str | None = None
|
|
12
17
|
|
|
13
18
|
|
|
@@ -6,8 +6,11 @@ from pathlib import Path
|
|
|
6
6
|
import boto3
|
|
7
7
|
from loguru import logger
|
|
8
8
|
|
|
9
|
+
import os
|
|
10
|
+
import shutil
|
|
11
|
+
import tempfile
|
|
9
12
|
from processforge.provenance import build_dynamic_x0, build_run_info
|
|
10
|
-
from processforge.result import
|
|
13
|
+
from processforge.result import save_results_zarr
|
|
11
14
|
from processforge.utils.validate_flowsheet import validate_flowsheet_dict
|
|
12
15
|
|
|
13
16
|
|
|
@@ -60,6 +63,12 @@ def run_job_sync(
|
|
|
60
63
|
This is called from an async background task via asyncio.to_thread so
|
|
61
64
|
the FastAPI event loop remains free to handle status-poll requests.
|
|
62
65
|
"""
|
|
66
|
+
|
|
67
|
+
log_file = tempfile.NamedTemporaryFile(delete=False, suffix=".log")
|
|
68
|
+
log_file.close()
|
|
69
|
+
|
|
70
|
+
logger_id = logger.add(log_file.name)
|
|
71
|
+
|
|
63
72
|
jobs_store[job_id]["status"] = "running"
|
|
64
73
|
jobs_store[job_id]["started_at"] = datetime.datetime.utcnow().isoformat() + "Z"
|
|
65
74
|
|
|
@@ -67,13 +76,36 @@ def run_job_sync(
|
|
|
67
76
|
validate_flowsheet_dict(flowsheet)
|
|
68
77
|
results, run_info = _run_simulation(flowsheet)
|
|
69
78
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
79
|
+
s3_client = boto3.client(
|
|
80
|
+
"s3",
|
|
81
|
+
aws_access_key_id=os.environ.get("S3_ACCESS_KEY"),
|
|
82
|
+
aws_secret_access_key=os.environ.get("S3_SECRET_KEY"),
|
|
83
|
+
endpoint_url=os.environ.get("S3_ENDPOINT_URL"),
|
|
84
|
+
region_name=os.environ.get("S3_REGION_NAME", "ams3"),
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
88
|
+
local_zarr_path = os.path.join(tmpdir, "results.zarr")
|
|
89
|
+
save_results_zarr(results, local_zarr_path, run_info=run_info)
|
|
90
|
+
|
|
91
|
+
zip_base_name = os.path.join(tmpdir, "results")
|
|
92
|
+
shutil.make_archive(zip_base_name, "zip", root_dir=tmpdir, base_dir="results.zarr")
|
|
93
|
+
zip_path = f"{zip_base_name}.zip"
|
|
73
94
|
|
|
74
|
-
|
|
95
|
+
zip_s3_key = f"{s3_prefix}/results.zip"
|
|
96
|
+
s3_client.upload_file(zip_path, s3_bucket, zip_s3_key)
|
|
97
|
+
zarr_uri = f"s3://{s3_bucket}/{zip_s3_key}"
|
|
98
|
+
|
|
99
|
+
logger.info(f"[{job_id}] Zipped Zarr written to {zarr_uri}")
|
|
75
100
|
output_urls = _upload_outputs_dir(s3_client, s3_bucket, s3_prefix)
|
|
76
101
|
|
|
102
|
+
logger.remove(logger_id)
|
|
103
|
+
|
|
104
|
+
log_s3_key = f"{s3_prefix}/run.log"
|
|
105
|
+
s3_client.upload_file(log_file.name, s3_bucket, log_s3_key)
|
|
106
|
+
log_uri = f"s3://{s3_bucket}/{log_s3_key}"
|
|
107
|
+
os.unlink(log_file.name)
|
|
108
|
+
|
|
77
109
|
jobs_store[job_id].update(
|
|
78
110
|
{
|
|
79
111
|
"status": "complete",
|
|
@@ -81,11 +113,14 @@ def run_job_sync(
|
|
|
81
113
|
"s3_urls": {
|
|
82
114
|
"zarr": zarr_uri,
|
|
83
115
|
"outputs": output_urls,
|
|
116
|
+
"log": log_uri,
|
|
84
117
|
},
|
|
85
118
|
}
|
|
86
119
|
)
|
|
87
120
|
except Exception as exc:
|
|
88
121
|
logger.exception(f"[{job_id}] Job failed: {exc}")
|
|
122
|
+
logger.remove(logger_id)
|
|
123
|
+
|
|
89
124
|
jobs_store[job_id].update(
|
|
90
125
|
{
|
|
91
126
|
"status": "failed",
|
|
@@ -93,3 +128,21 @@ def run_job_sync(
|
|
|
93
128
|
"error": str(exc),
|
|
94
129
|
}
|
|
95
130
|
)
|
|
131
|
+
|
|
132
|
+
try:
|
|
133
|
+
log_s3_key = f"{s3_prefix}/run.log"
|
|
134
|
+
s3_client = boto3.client(
|
|
135
|
+
"s3",
|
|
136
|
+
aws_access_key_id=os.environ.get("S3_ACCESS_KEY"),
|
|
137
|
+
aws_secret_access_key=os.environ.get("S3_SECRET_KEY"),
|
|
138
|
+
endpoint_url=os.environ.get("S3_ENDPOINT_URL"),
|
|
139
|
+
region_name=os.environ.get("S3_REGION_NAME", "ams3"),
|
|
140
|
+
)
|
|
141
|
+
s3_client.upload_file(log_file.name, s3_bucket, log_s3_key)
|
|
142
|
+
log_uri = f"s3://{s3_bucket}/{log_s3_key}"
|
|
143
|
+
jobs_store[job_id].setdefault("s3_urls", {})["log"] = log_uri
|
|
144
|
+
except Exception as e:
|
|
145
|
+
logger.error(f"Failed to upload log file: {e}")
|
|
146
|
+
finally:
|
|
147
|
+
if os.path.exists(log_file.name):
|
|
148
|
+
os.unlink(log_file.name)
|
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
Usage::
|
|
4
4
|
|
|
5
5
|
# Via registered script
|
|
6
|
-
pf-serve [--host 0.0.0.0] [--port
|
|
6
|
+
pf-serve [--host 0.0.0.0] [--port 9000]
|
|
7
7
|
|
|
8
8
|
# Or directly
|
|
9
|
-
python -m processforge.api.serve [--host 0.0.0.0] [--port
|
|
9
|
+
python -m processforge.api.serve [--host 0.0.0.0] [--port 9000]
|
|
10
10
|
|
|
11
11
|
# Or via Docker (override entrypoint)
|
|
12
|
-
docker run -p
|
|
12
|
+
docker run -p 9000:9000 ghcr.io/urjanova/processforge:latest pf-serve
|
|
13
13
|
|
|
14
14
|
AWS credentials are read from the standard environment variables
|
|
15
15
|
(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_DEFAULT_REGION) or from an
|
|
@@ -21,19 +21,19 @@ from __future__ import annotations
|
|
|
21
21
|
import argparse
|
|
22
22
|
|
|
23
23
|
|
|
24
|
+
import uvicorn
|
|
25
|
+
|
|
26
|
+
from processforge.api.app import app
|
|
27
|
+
|
|
28
|
+
|
|
24
29
|
def main() -> None:
|
|
25
30
|
parser = argparse.ArgumentParser(
|
|
26
31
|
description="Start the ProcessForge FastAPI server",
|
|
27
32
|
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
|
28
33
|
)
|
|
29
34
|
parser.add_argument("--host", default="0.0.0.0", help="Bind host")
|
|
30
|
-
parser.add_argument("--port", type=int, default=
|
|
35
|
+
parser.add_argument("--port", type=int, default=9000, help="Bind port")
|
|
31
36
|
args = parser.parse_args()
|
|
32
|
-
|
|
33
|
-
import uvicorn
|
|
34
|
-
|
|
35
|
-
from processforge.api.app import app
|
|
36
|
-
|
|
37
37
|
uvicorn.run(app, host=args.host, port=args.port, workers=1)
|
|
38
38
|
|
|
39
39
|
|
|
@@ -140,8 +140,23 @@ def save_results_zarr_s3(results, s3_uri: str, run_info: RunInfo | dict | None =
|
|
|
140
140
|
run_info: Optional provenance metadata (same as :func:`save_results_zarr`).
|
|
141
141
|
"""
|
|
142
142
|
import s3fs # noqa: F401 – registers the s3:// protocol with fsspec
|
|
143
|
+
import os
|
|
143
144
|
|
|
144
|
-
|
|
145
|
+
storage_options = {
|
|
146
|
+
"key": os.environ.get("S3_ACCESS_KEY"),
|
|
147
|
+
"secret": os.environ.get("S3_SECRET_KEY"),
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
client_kwargs = {}
|
|
151
|
+
if endpoint := os.environ.get("S3_ENDPOINT_URL"):
|
|
152
|
+
client_kwargs["endpoint_url"] = endpoint
|
|
153
|
+
if region := os.environ.get("S3_REGION_NAME", "ams3"):
|
|
154
|
+
client_kwargs["region_name"] = region
|
|
155
|
+
|
|
156
|
+
if client_kwargs:
|
|
157
|
+
storage_options["client_kwargs"] = client_kwargs
|
|
158
|
+
|
|
159
|
+
store = zarr.storage.FsspecStore.from_url(s3_uri, storage_options=storage_options)
|
|
145
160
|
root = zarr.group(store=store, overwrite=True)
|
|
146
161
|
mode = "dynamic" if _is_dynamic(results) else "steady"
|
|
147
162
|
root.attrs["mode"] = mode
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: processforge
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.24
|
|
4
4
|
Summary: A Python-based process simulation framework for chemical engineering applications.
|
|
5
5
|
Author-email: Process Forge Team <team@processforge.dev>
|
|
6
6
|
License-Expression: BSD-3-Clause
|
|
@@ -415,13 +415,15 @@ Run a simulation and map an output folder:
|
|
|
415
415
|
|
|
416
416
|
```Bash
|
|
417
417
|
docker run -p 8080:8080 \
|
|
418
|
-
-e
|
|
419
|
-
-e
|
|
420
|
-
-e
|
|
418
|
+
-e S3_ACCESS_KEY='XXXXXX' \
|
|
419
|
+
-e S3_SECRET_KEY='YYYYYYYYY' \
|
|
420
|
+
-e S3_ENDPOINT_URL='https://processforge-files.ams3.s3.com' \
|
|
421
|
+
-e S3_REGION_NAME='ams3' \
|
|
422
|
+
-e S3_BUCKET_NAME='Dev' \
|
|
421
423
|
ghcr.io/urjanova/processforge:latest \
|
|
422
424
|
pf-serve
|
|
423
425
|
```
|
|
424
|
-
(
|
|
426
|
+
(Ensure you provide your S3-compatible credentials and endpoint URL; output and results will be synced directly to the specified bucket.)
|
|
425
427
|
## Logo credit
|
|
426
428
|
Google Gemini / Nano Banana
|
|
427
429
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/base_jacobian_mixin.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/jacobian_contributor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/reference_state_registry.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|