mirror of
https://github.com/tiennm99/DocsGPT.git
synced 2026-10-17 22:14:02 +00:00
Add document I/O to workflows and surface run artifacts
Let workflow runs consume and produce documents end to end: bridge uploaded attachments into run-scoped artifacts so nodes receive the input documents (with a per-run cap and server-computed size/sha256, and the run row pre-created so produced artifacts are authorized during the run); emit the run id to the client and add a builder panel that lists, previews, and downloads a run's artifacts; and allow attaching documents to a Preview run via the existing upload flow. Also fixes issues a compliance workflow surfaced: attachment ownership now keys on the raw identity instead of a sanitized one (the sanitized form could not be read back and could collide across users); workflow code nodes read prior state from a state.json data file instead of templating it into the program, so untrusted document content can never be interpolated into executed code; structured node output wrapped in code fences is recovered; and the live speech-to-text ownership check compares the raw identity.
This commit is contained in:
1 parent
396eb92ab0
commit
5a87fa6258
20 files changed
+1186
-47
No files matched your search
@@ -0,0 +1,44 @@
|
||||
"""Engine robustness: fenced/prose structured output recovery in _parse_structured_output."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from application.agents.workflows.workflow_engine import WorkflowEngine
|
||||
|
||||
|
||||
def _engine() -> WorkflowEngine:
|
||||
return WorkflowEngine.__new__(WorkflowEngine)
|
||||
|
||||
|
||||
def test_parse_structured_output_bare_json():
|
||||
ok, val = _engine()._parse_structured_output('{"x": true}')
|
||||
assert ok and val == {"x": True}
|
||||
|
||||
|
||||
def test_parse_structured_output_json_fence():
|
||||
ok, val = _engine()._parse_structured_output('```json\n{"a": 1, "b": null}\n```')
|
||||
assert ok and val == {"a": 1, "b": None}
|
||||
|
||||
|
||||
def test_parse_structured_output_unlabelled_fence():
|
||||
ok, val = _engine()._parse_structured_output("text\n```\n{\"y\": [1, 2]}\n```\nmore")
|
||||
assert ok and val == {"y": [1, 2]}
|
||||
|
||||
|
||||
def test_parse_structured_output_prose_wrapped_object():
|
||||
ok, val = _engine()._parse_structured_output('Result: {"z": "v"} done')
|
||||
assert ok and val == {"z": "v"}
|
||||
|
||||
|
||||
def test_parse_structured_output_non_json():
|
||||
ok, val = _engine()._parse_structured_output("not json at all")
|
||||
assert ok is False and val is None
|
||||
|
||||
|
||||
def test_parse_structured_output_empty():
|
||||
ok, val = _engine()._parse_structured_output(" ")
|
||||
assert ok is False and val is None
|
||||
|
||||
|
||||
def test_strip_json_fence_prefers_fence_over_braces():
|
||||
out = WorkflowEngine._strip_json_fence('lead {"outer": 1} ```json\n{"in": 2}\n```')
|
||||
assert out == '{"in": 2}'
|
||||
Reference in new issue
Block a user