fastworkflow 2.8.18__py3-none-any.whl → 2.8.20__py3-none-any.whl

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.
@@ -416,7 +416,10 @@ class CommandDirectory(BaseModel):
416
416
  parts = os.path.splitext(rel_path)[0].split(os.sep)
417
417
  qualified_name = "/".join(parts) if len(parts) > 1 else parts[0]
418
418
  discovered_commands.add(qualified_name)
419
-
419
+
420
+ if not discovered_commands:
421
+ raise RuntimeError("No core commands discovered in internal workflow: {internal_wf_path}")
422
+
420
423
  return discovered_commands
421
424
 
422
425
  @classmethod
@@ -244,6 +244,7 @@ class RoutingDefinition(BaseModel):
244
244
 
245
245
  # Use dynamically discovered core commands
246
246
  core_commands = command_directory.core_command_names
247
+ logger.debug(f"Core commands: {str(core_commands)}, Workflow folderpath {workflow_folderpath}")
247
248
 
248
249
  resolved_contexts = {}
249
250
  for context_name in context_model._command_contexts:
@@ -279,7 +280,7 @@ class RoutingDefinition(BaseModel):
279
280
  if resolved_contexts != {"*": []}:
280
281
  routing_definition.save()
281
282
  else:
282
- logger.error(f"Could not build command_routing_defintion.json for workflow folderpath {workflow_folderpath}")
283
+ logger.error(f"Could not build command_routing_definition.json for workflow folderpath {workflow_folderpath}")
283
284
 
284
285
  return routing_definition
285
286
 
@@ -15,6 +15,7 @@ from rich.text import Text
15
15
  from rich.console import Group
16
16
 
17
17
  import fastworkflow
18
+ from fastworkflow.utils.logging import logger
18
19
  from fastworkflow.command_executor import CommandExecutor
19
20
 
20
21
 
@@ -79,6 +80,11 @@ def run_main(args):
79
80
  console.print(f"[bold red]Error:[/bold red] The specified workflow path '{args.workflow_path}' is not a valid directory.")
80
81
  exit(1)
81
82
 
83
+ commands_dir = os.path.join(args.workflow_path, "_commands")
84
+ if not os.path.isdir(commands_dir):
85
+ logger.info(f"No _commands directory found at {args.workflow_path}, existing...")
86
+ return
87
+
82
88
  env_vars = {
83
89
  **dotenv_values(args.env_file_path),
84
90
  **dotenv_values(args.passwords_file_path)
@@ -5,8 +5,10 @@ import shutil
5
5
  from dotenv import dotenv_values
6
6
 
7
7
  from colorama import Fore, Style
8
- from fastworkflow.utils import python_utils
8
+
9
9
  import fastworkflow
10
+ from fastworkflow.utils.logging import logger
11
+ from fastworkflow.utils import python_utils
10
12
  from fastworkflow import ModuleType
11
13
  from fastworkflow.model_pipeline_training import train, get_route_layer_filepath_model
12
14
  from fastworkflow.utils.generate_param_examples import generate_dspy_examples
@@ -16,6 +18,11 @@ from fastworkflow.command_context_model import CommandContextModel
16
18
 
17
19
 
18
20
  def train_workflow(workflow_path: str):
21
+ commands_dir = os.path.join(workflow_path, "_commands")
22
+ if not os.path.isdir(commands_dir):
23
+ logger.info(f"No _commands directory found at {workflow_path}, skipping training")
24
+ return
25
+
19
26
  # Ensure context model is parsed so downstream helpers have contexts
20
27
  CommandContextModel.load(workflow_path)
21
28
  RoutingDefinition.build(workflow_path)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastworkflow
3
- Version: 2.8.18
3
+ Version: 2.8.20
4
4
  Summary: A framework for rapidly building large-scale, deterministic, interactive workflows with a fault-tolerant, conversational UX
5
5
  License: Apache-2.0
6
6
  Keywords: fastworkflow,ai,workflow,llm,openai
@@ -33,10 +33,10 @@ fastworkflow/cache_matching.py,sha256=WoSQ7QuVGqOnecsIIdwb3A6gBpt0OJdSzx_a51nHoF
33
33
  fastworkflow/chat_session.py,sha256=lEpJmU_2a-4pB4QR7wACl8jHWZls1ROtQGgdVObY3BA,12308
34
34
  fastworkflow/cli.py,sha256=SVIvd-GEfwAdWQT7om5DC9MC5wLivP_bXlgMF0T5Cjw,21736
35
35
  fastworkflow/command_context_model.py,sha256=nWxLP3TR7WJr3yWCedqcdFOxo_kwae_mS3VRN2cOmK8,13437
36
- fastworkflow/command_directory.py,sha256=apnLv4o-Z2Hpa3B6tFtRb3YAVUimgiIbxQhmjlfM9jY,27014
36
+ fastworkflow/command_directory.py,sha256=S-QRHW66VHH10YIpm3-dQs8fvtXM5VKFyBLocGkduF8,27134
37
37
  fastworkflow/command_executor.py,sha256=bKqOHBEVhCunE3B-zh6DNLERUiSmEiVJdfEoVVUq-zM,6412
38
38
  fastworkflow/command_interfaces.py,sha256=PWIKlcp0G8nmYl0vkrg1o6QzJL0pxXkfrn1joqTa0eU,460
39
- fastworkflow/command_routing.py,sha256=TZ8SahPEEBxmUBx-E2mdUzvVbOUKOW5xLxsQ73QMUgw,15632
39
+ fastworkflow/command_routing.py,sha256=K4WSV_GZVIJCOIuB3nPsGclgxmyjaCuI1_9gWsSQPOo,15737
40
40
  fastworkflow/docs/context_modules_prd.txt,sha256=9wvs3LgNoIVXAczo1sXBIV4YmFqVhzC2ja1T3K7FG04,2199
41
41
  fastworkflow/examples/fastworkflow.env,sha256=5yQTfQpK99TR5dLwKVOwFatuC1G73Rkng2hv2IjX6cg,645
42
42
  fastworkflow/examples/fastworkflow.passwords.env,sha256=zucqjXFPsp-SRtDBNn_v7h_N1l8uNBcMEHqQoIcQa6M,355
@@ -124,12 +124,12 @@ fastworkflow/examples/todo_list/startup_action.json,sha256=gj0-B4CqTYCs8OwHKhTu9
124
124
  fastworkflow/mcp_server.py,sha256=Q1_KBwXg5EaJMz232OHNjH1fRg7BuZcJ7T7872qfDco,7783
125
125
  fastworkflow/model_pipeline_training.py,sha256=St4Qgcf6Yq-xfX2txJ9S2mL1jRTO9g3OMvJ06vnzLQ4,44226
126
126
  fastworkflow/run/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
127
- fastworkflow/run/__main__.py,sha256=uFENKUAPEJKOH5o7KzYtwkyKSI1sDFEwx1TNodeLVnA,5789
127
+ fastworkflow/run/__main__.py,sha256=ZgdzyGm482xPubNpwa82KoiejPovBGbksDz1o1thoyY,6046
128
128
  fastworkflow/run_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
129
  fastworkflow/run_agent/__main__.py,sha256=vpCGO3Ido69kSKzT5Yw-c0oFC2zl482TCKzZEsu9cNw,8068
130
130
  fastworkflow/run_agent/agent_module.py,sha256=Hjej9x3a8IhqAWlST6-EjhsgZb-_BeowG3TRJBffJiM,18899
131
131
  fastworkflow/train/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
132
- fastworkflow/train/__main__.py,sha256=3f2N4vKJTBqMhTIkoJQ7Dat6SMIuEEf6QJu-dL5A6aw,8282
132
+ fastworkflow/train/__main__.py,sha256=AEbuBhFST-hCgdqwNFTak5tGur1plBjA4gIhtr3GSqc,8536
133
133
  fastworkflow/train/generate_synthetic.py,sha256=Uiv9urpdZ05-apJ88kuOhnCskxBio3fggQZSWZwFklg,5340
134
134
  fastworkflow/user_message_queues.py,sha256=svbuFxQ16q6Tz6urPWfD4IEsOTMxtS1Kc1PP8EE8AWg,1422
135
135
  fastworkflow/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -146,8 +146,8 @@ fastworkflow/utils/pydantic_model_2_dspy_signature_class.py,sha256=w1pvl8rJq48ul
146
146
  fastworkflow/utils/python_utils.py,sha256=Lt6P8lBMbLuLZaP9gd_7Kl7UvSPLm-NKPN6cPUdn53w,8194
147
147
  fastworkflow/utils/signatures.py,sha256=4ksF-65Q-22ZR_SW8O_cv5RhKKk0ecmWgykoAGKxr-k,19957
148
148
  fastworkflow/workflow.py,sha256=URYIgoBObL4Ota1BMdW4kqmepi6E_tCoZBXCFS33qOw,16453
149
- fastworkflow-2.8.18.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
150
- fastworkflow-2.8.18.dist-info/METADATA,sha256=28UVosFRzlnPp1TPTFHUj85hJ1bXPErETU0uOhm5BO0,15387
151
- fastworkflow-2.8.18.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
152
- fastworkflow-2.8.18.dist-info/entry_points.txt,sha256=m8HqoPzCyaZLAx-V5X8MJgw3Lx3GiPDlxNEZ7K-Gb-U,54
153
- fastworkflow-2.8.18.dist-info/RECORD,,
149
+ fastworkflow-2.8.20.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
150
+ fastworkflow-2.8.20.dist-info/METADATA,sha256=NXjjZOU_Qbq3cPgO8hciPgjEZrBIMOBm_u2jk_X5MJo,15387
151
+ fastworkflow-2.8.20.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
152
+ fastworkflow-2.8.20.dist-info/entry_points.txt,sha256=m8HqoPzCyaZLAx-V5X8MJgw3Lx3GiPDlxNEZ7K-Gb-U,54
153
+ fastworkflow-2.8.20.dist-info/RECORD,,