Ava2lon commited on
Commit
9d33f09
·
verified ·
1 Parent(s): 3e93464

Upload 5 files

Browse files
Files changed (4) hide show
  1. Dockerfile +12 -0
  2. README_HF.md +13 -0
  3. flowforge_cli.py +53 -0
  4. pyproject.toml +14 -0
Dockerfile ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.12-slim
2
+
3
+ ENV PYTHONDONTWRITEBYTECODE=1
4
+ ENV PYTHONUNBUFFERED=1
5
+
6
+ WORKDIR /app
7
+ COPY requirements.txt .
8
+ RUN pip install --no-cache-dir -r requirements.txt
9
+ COPY app ./app
10
+
11
+ EXPOSE 7860
12
+ CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "7860"]
README_HF.md ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: FlowForge API
3
+ emoji: ⚙️
4
+ colorFrom: gray
5
+ colorTo: red
6
+ sdk: docker
7
+ app_port: 7860
8
+ pinned: false
9
+ ---
10
+
11
+ # FlowForge API
12
+
13
+ FastAPI backend for the FlowForge AI n8n workflow builder.
flowforge_cli.py ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ import argparse
3
+ import json
4
+ from pathlib import Path
5
+
6
+ from app.models.workflow import WorkflowPackageRequest
7
+ from app.services.adapters import adapters
8
+ from app.services.intelligence import documentation, package_workflow, quality
9
+ from app.services.validation import validator
10
+
11
+
12
+ def load_workflow(path: Path):
13
+ return adapters.importers["json"].load(path.read_text(encoding="utf-8"))
14
+
15
+
16
+ def main() -> int:
17
+ parser = argparse.ArgumentParser(prog="flowforge", description="Validate and package n8n workflows")
18
+ subparsers = parser.add_subparsers(dest="command", required=True)
19
+ for command in ("validate", "quality", "docs", "package"):
20
+ subparser = subparsers.add_parser(command)
21
+ subparser.add_argument("workflow", type=Path)
22
+ if command in {"docs", "package"}:
23
+ subparser.add_argument("--output", type=Path)
24
+ args = parser.parse_args()
25
+ workflow = load_workflow(args.workflow)
26
+
27
+ if args.command == "validate":
28
+ result = validator.validate(workflow)
29
+ print(result.model_dump_json(indent=2))
30
+ return 0 if result.valid else 1
31
+ if args.command == "quality":
32
+ result = quality(workflow)
33
+ print(result.model_dump_json(indent=2))
34
+ return 0 if result.overall >= 70 else 1
35
+ if args.command == "docs":
36
+ content = documentation(workflow).markdown
37
+ if args.output:
38
+ args.output.write_text(content, encoding="utf-8")
39
+ else:
40
+ print(content)
41
+ return 0
42
+
43
+ content = package_workflow(WorkflowPackageRequest(workflow=workflow)).model_dump(mode="json")
44
+ serialized = json.dumps(content, indent=2)
45
+ if args.output:
46
+ args.output.write_text(serialized, encoding="utf-8")
47
+ else:
48
+ print(serialized)
49
+ return 0
50
+
51
+
52
+ if __name__ == "__main__":
53
+ raise SystemExit(main())
pyproject.toml ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ name = "flowforge-api"
3
+ version = "0.1.0"
4
+ description = "AI workflow generation and validation service for FlowForge"
5
+ requires-python = ">=3.11"
6
+
7
+ [tool.pytest.ini_options]
8
+ pythonpath = ["."]
9
+ testpaths = ["tests"]
10
+ asyncio_mode = "auto"
11
+
12
+ [tool.ruff]
13
+ line-length = 100
14
+ target-version = "py311"