From d14bb2aecafdf184fe567934ff335e1a8f8d71f5 Mon Sep 17 00:00:00 2001 From: Cyber MacGeddon Date: Wed, 23 Apr 2025 11:47:49 +0100 Subject: [PATCH] Flow stop, add tests and flow list --- tests/test-flow-get-class | 19 +++++++ tests/test-flow-put-class | 22 ++++++++ tests/test-flow-start-flow | 23 ++++++++ tests/test-flow-stop-flow | 22 ++++++++ trustgraph-cli/scripts/tg-show-flows | 53 +++++++++++++++++++ .../trustgraph/config/service/flow.py | 6 ++- 6 files changed, 143 insertions(+), 2 deletions(-) create mode 100755 tests/test-flow-get-class create mode 100755 tests/test-flow-put-class create mode 100755 tests/test-flow-start-flow create mode 100755 tests/test-flow-stop-flow create mode 100755 trustgraph-cli/scripts/tg-show-flows diff --git a/tests/test-flow-get-class b/tests/test-flow-get-class new file mode 100755 index 00000000..20707b51 --- /dev/null +++ b/tests/test-flow-get-class @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 + +import requests + +url = "http://localhost:8088/" + +resp = requests.post( + f"{url}/api/v1/flow", + json={ + "operation": "get-class", + "class-name": "default", + } +) + +resp = resp.json() + +print(resp["class-definition"]) + + diff --git a/tests/test-flow-put-class b/tests/test-flow-put-class new file mode 100755 index 00000000..8fd4d9f2 --- /dev/null +++ b/tests/test-flow-put-class @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 + +import requests +import json + +url = "http://localhost:8088/" + +defn = {"class": {"de-query:{class}": {"request": "non-persistent://tg/request/document-embeddings:{class}", "response": "non-persistent://tg/response/document-embeddings:{class}"}, "document-rag:{class}": {"document-embeddings-request": "non-persistent://tg/request/document-embeddings:{class}", "document-embeddings-response": "non-persistent://tg/response/document-embeddings:{class}", "embeddings-request": "non-persistent://tg/request/embeddings:{class}", "embeddings-response": "non-persistent://tg/response/embeddings:{class}", "prompt-request": "non-persistent://tg/request/prompt-rag:{class}", "prompt-response": "non-persistent://tg/response/prompt-rag:{class}", "request": "non-persistent://tg/request/document-rag:{class}", "response": "non-persistent://tg/response/document-rag:{class}"}, "embeddings:{class}": {"request": "non-persistent://tg/request/embeddings:{class}", "response": "non-persistent://tg/response/embeddings:{class}"}, "ge-query:{class}": {"request": "non-persistent://tg/request/graph-embeddings:{class}", "response": "non-persistent://tg/response/graph-embeddings:{class}"}, "graph-rag:{class}": {"embeddings-request": "non-persistent://tg/request/embeddings:{class}", "embeddings-response": "non-persistent://tg/response/embeddings:{class}", "graph-embeddings-request": "non-persistent://tg/request/graph-embeddings:{class}", "graph-embeddings-response": "non-persistent://tg/response/graph-embeddings:{class}", "prompt-request": "non-persistent://tg/request/prompt-rag:{class}", "prompt-response": "non-persistent://tg/response/prompt-rag:{class}", "request": "non-persistent://tg/request/graph-rag:{class}", "response": "non-persistent://tg/response/graph-rag:{class}", "triples-request": "non-persistent://tg/request/triples:{class}", "triples-response": "non-persistent://tg/response/triples:{class}"}, "metering-rag:{class}": {"input": "non-persistent://tg/response/text-completion-rag:{class}"}, "metering:{class}": {"input": "non-persistent://tg/response/text-completion:{class}"}, "prompt-rag:{class}": {"request": "non-persistent://tg/request/prompt-rag:{class}", "response": "non-persistent://tg/response/prompt-rag:{class}", "text-completion-request": "non-persistent://tg/request/text-completion-rag:{class}", "text-completion-response": "non-persistent://tg/response/text-completion-rag:{class}"}, "prompt:{class}": {"request": "non-persistent://tg/request/prompt:{class}", "response": "non-persistent://tg/response/prompt:{class}", "text-completion-request": "non-persistent://tg/request/text-completion:{class}", "text-completion-response": "non-persistent://tg/response/text-completion:{class}"}, "text-completion-rag:{class}": {"request": "non-persistent://tg/request/text-completion-rag:{class}", "response": "non-persistent://tg/response/text-completion-rag:{class}"}, "text-completion:{class}": {"request": "non-persistent://tg/request/text-completion:{class}", "response": "non-persistent://tg/response/text-completion:{class}"}, "triples-query:{class}": {"request": "non-persistent://tg/request/triples:{class}", "response": "non-persistent://tg/response/triples:{class}"}}, "description": "Default flow class, supports GraphRAG and document RAG", "flow": {"agent-manager:{id}": {"graph-rag-request": "non-persistent://tg/request/graph-rag:{class}", "graph-rag-response": "non-persistent://tg/response/graph-rag:{class}", "next": "non-persistent://tg/request/agent:{id}", "prompt-request": "non-persistent://tg/request/prompt:{class}", "prompt-response": "non-persistent://tg/response/prompt:{class}", "request": "non-persistent://tg/request/agent:{id}", "response": "non-persistent://tg/response/agent:{id}", "text-completion-request": "non-persistent://tg/request/text-completion:{class}", "text-completion-response": "non-persistent://tg/response/text-completion:{class}"}, "chunker:{id}": {"input": "persistent://tg/flow/text-document-load:{id}", "output": "persistent://tg/flow/chunk-load:{id}"}, "de-write:{id}": {"input": "persistent://tg/flow/document-embeddings-store:{id}"}, "document-embeddings:{id}": {"embeddings-request": "non-persistent://tg/request/embeddings:{class}", "embeddings-response": "non-persistent://tg/response/embeddings:{class}", "input": "persistent://tg/flow/chunk-load:{id}", "output": "persistent://tg/flow/document-embeddings-store:{id}"}, "ge-write:{id}": {"input": "persistent://tg/flow/graph-embeddings-store:{id}"}, "graph-embeddings:{id}": {"embeddings-request": "non-persistent://tg/request/embeddings:{class}", "embeddings-response": "non-persistent://tg/response/embeddings:{class}", "input": "persistent://tg/flow/entity-contexts-load:{id}", "output": "persistent://tg/flow/graph-embeddings-store:{id}"}, "kg-extract-definitions:{id}": {"entity-contexts": "persistent://tg/flow/entity-contexts-load:{id}", "input": "persistent://tg/flow/chunk-load:{id}", "prompt-request": "non-persistent://tg/request/prompt:{class}", "prompt-response": "non-persistent://tg/response/prompt:{class}", "triples": "persistent://tg/flow/triples-store:{id}"}, "kg-extract-relationships:{id}": {"input": "persistent://tg/flow/chunk-load:{id}", "prompt-request": "non-persistent://tg/request/prompt:{class}", "prompt-response": "non-persistent://tg/response/prompt:{class}", "triples": "persistent://tg/flow/triples-store:{id}"}, "pdf-decoder:{id}": {"input": "persistent://tg/flow/document-load:{id}", "output": "persistent://tg/flow/text-document-load:{id}"}, "triples-write:{id}": {"input": "persistent://tg/flow/triples-store:{id}"}}, "tags": ["document-rag", "graph-rag", "knowledge-extraction"]} + +resp = requests.post( + f"{url}/api/v1/flow", + json={ + "operation": "put-class", + "class-name": "default", + "class-definition": json.dumps(defn), + } +) + +resp = resp.json() + +print(resp) + diff --git a/tests/test-flow-start-flow b/tests/test-flow-start-flow new file mode 100755 index 00000000..15a3c0cc --- /dev/null +++ b/tests/test-flow-start-flow @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 + +import requests +import json + +url = "http://localhost:8088/" + +resp = requests.post( + f"{url}/api/v1/flow", + json={ + "operation": "start-flow", + "flow-id": "0003", + "class-name": "default", + } +) + +print(resp) +print(resp.text) +resp = resp.json() + + +print(resp) + diff --git a/tests/test-flow-stop-flow b/tests/test-flow-stop-flow new file mode 100755 index 00000000..62ea1aa9 --- /dev/null +++ b/tests/test-flow-stop-flow @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 + +import requests +import json + +url = "http://localhost:8088/" + +resp = requests.post( + f"{url}/api/v1/flow", + json={ + "operation": "stop-flow", + "flow-id": "0003", + } +) + +print(resp) +print(resp.text) +resp = resp.json() + + +print(resp) + diff --git a/trustgraph-cli/scripts/tg-show-flows b/trustgraph-cli/scripts/tg-show-flows new file mode 100755 index 00000000..70ac195e --- /dev/null +++ b/trustgraph-cli/scripts/tg-show-flows @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 + +""" +Dumps out the current configuration +""" + +import argparse +import os +from trustgraph.api import Api +import json + +default_url = os.getenv("TRUSTGRAPH_URL", 'http://localhost:8088/') + +def show_flows(url): + + api = Api(url) + + BROKEN + + + + config, version = api.config_all() + + print("Version:", version) + print(json.dumps(config, indent=4)) + +def main(): + + parser = argparse.ArgumentParser( + prog='tg-show-config', + description=__doc__, + ) + + parser.add_argument( + '-u', '--api-url', + default=default_url, + help=f'API URL (default: {default_url})', + ) + + args = parser.parse_args() + + try: + + show_config( + url=args.api_url, + ) + + except Exception as e: + + print("Exception:", e, flush=True) + +main() + diff --git a/trustgraph-flow/trustgraph/config/service/flow.py b/trustgraph-flow/trustgraph/config/service/flow.py index 9d803213..4457fa9d 100644 --- a/trustgraph-flow/trustgraph/config/service/flow.py +++ b/trustgraph-flow/trustgraph/config/service/flow.py @@ -110,14 +110,16 @@ class FlowConfig: async def handle_stop_flow(self, msg): + class_name = self.config["flows"][msg.flow_id]["class-name"] + def repl_template(tmp): return tmp.replace( - "{class}", msg.class_name + "{class}", class_name ).replace( "{id}", msg.flow_id ) - cls = json.loads(self.config["flow-classes"][msg.class_name]) + cls = json.loads(self.config["flow-classes"][class_name]) plumb = {}