fastworkflow 2.15.7__py3-none-any.whl → 2.15.9__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.
fastworkflow/cli.py CHANGED
@@ -12,7 +12,6 @@ import time
12
12
  from pathlib import Path
13
13
  import importlib.resources
14
14
  from rich import print as rprint
15
- from rich.console import Console
16
15
  from rich.live import Live
17
16
  from rich.spinner import Spinner
18
17
 
@@ -175,72 +174,6 @@ def fetch_example(args):
175
174
  traceback.print_exc(file=sys.stderr)
176
175
  sys.exit(1)
177
176
 
178
- def train_example(args):
179
- # sourcery skip: extract-duplicate-method, extract-method, remove-redundant-fstring, split-or-ifs
180
- """Train an existing example workflow."""
181
- # Create a spinner for the initial check
182
- spinner = Spinner("dots", text="[bold green]Preparing to train example...[/bold green]")
183
-
184
- with Live(spinner, refresh_per_second=10):
185
- # Check if example exists in the local examples directory
186
- local_examples_dir = Path("./examples")
187
- workflow_path = local_examples_dir / args.name
188
-
189
- if workflow_path.is_dir():
190
- # Get the appropriate env files for this example workflow
191
- env_file_path, passwords_file_path = find_default_env_files(local_examples_dir)
192
-
193
- # Check if the files exist
194
- env_file = Path(env_file_path)
195
- passwords_file = Path(passwords_file_path)
196
-
197
- # Create args object for train_main
198
- train_args = argparse.Namespace(
199
- workflow_folderpath=str(workflow_path),
200
- env_file_path=str(env_file),
201
- passwords_file_path=str(passwords_file)
202
- )
203
-
204
- # After the spinner, handle any errors or proceed with training
205
- if not workflow_path.is_dir():
206
- rprint(f"[bold red]Error:[/bold red] Example '{args.name}' not found in '{local_examples_dir}'.")
207
- rprint(f"Use 'fastworkflow examples fetch {args.name}' to fetch the example first.")
208
- rprint("Or use 'fastworkflow examples list' to see available examples.")
209
- sys.exit(1)
210
-
211
- if not env_file.exists() or not passwords_file.exists():
212
- rprint(f"[bold red]Error:[/bold red] Required environment files not found:")
213
- if not env_file.exists():
214
- rprint(f" - {env_file} (not found)")
215
- if not passwords_file.exists():
216
- rprint(f" - {passwords_file} (not found)")
217
- rprint("\nPlease run the following command to fetch the example and its environment files:")
218
- rprint(f" fastworkflow examples fetch {args.name}")
219
- rprint("\nAfter fetching, edit the passwords file to add your API keys:")
220
- rprint(f" {local_examples_dir}/fastworkflow.passwords.env")
221
- sys.exit(1)
222
-
223
- rprint(f"[bold green]Training example[/bold green] '{args.name}' in '{workflow_path}'...")
224
-
225
- try:
226
- # Lazy import train_main only when actually training
227
- from .train.__main__ import train_main as _train_main
228
- # Call train_main directly instead of using subprocess
229
- result = _train_main(train_args)
230
-
231
- if result is None or result == 0:
232
- rprint(f"\n✅ Successfully trained example '{args.name}'.")
233
- rprint(f"You can now run it with:\nfastworkflow examples run {args.name}")
234
- else:
235
- rprint(f"\n❌ Training failed.")
236
- sys.exit(1)
237
-
238
- except Exception as e:
239
- rprint(f"[bold red]An unexpected error occurred during training:[/bold red] {e}")
240
- import traceback
241
- traceback.print_exc(file=sys.stderr)
242
- sys.exit(1)
243
-
244
177
  def find_default_env_files(workflow_path):
245
178
  """Find the appropriate default env files based on context.
246
179
 
@@ -338,12 +271,6 @@ def add_run_parser(subparsers):
338
271
  parser_run.add_argument("--startup_action", help="Optional startup action", default="")
339
272
  parser_run.add_argument("--keep_alive", help="Optional keep_alive", default=True)
340
273
  parser_run.add_argument("--project_folderpath", help="Optional path to project folder containing application code", default=None)
341
- parser_run.add_argument(
342
- "--run_as_agent",
343
- help="Run in agent mode (uses DSPy for tool selection)",
344
- action="store_true",
345
- default=False,
346
- )
347
274
  parser_run.set_defaults(func=lambda args: run_with_defaults(args))
348
275
 
349
276
  def train_with_defaults(args): # sourcery skip: extract-duplicate-method
@@ -363,7 +290,7 @@ def train_with_defaults(args): # sourcery skip: extract-duplicate-method
363
290
  example_name = os.path.basename(args.workflow_folderpath)
364
291
  print("\nThis appears to be an example workflow. Please run:")
365
292
  print(f" fastworkflow examples fetch {example_name}")
366
- print(f" fastworkflow examples train {example_name}")
293
+ print(f" fastworkflow train ./examples/{example_name} ./examples/fastworkflow.env ./examples/fastworkflow.passwords.env")
367
294
  else:
368
295
  print("\nPlease ensure this file exists with required environment variables.")
369
296
  print("You can create a basic .env file in your current directory.")
@@ -376,7 +303,7 @@ def train_with_defaults(args): # sourcery skip: extract-duplicate-method
376
303
  example_name = os.path.basename(args.workflow_folderpath)
377
304
  print("\nThis appears to be an example workflow. Please run:")
378
305
  print(f" fastworkflow examples fetch {example_name}")
379
- print(f" fastworkflow examples train {example_name}")
306
+ print(f" fastworkflow train ./examples/{example_name} ./examples/fastworkflow.env ./examples/fastworkflow.passwords.env")
380
307
  else:
381
308
  print("\nPlease ensure this file exists with required API keys.")
382
309
  print("You can create a basic passwords.env file in your current directory.")
@@ -403,7 +330,7 @@ def run_with_defaults(args): # sourcery skip: extract-duplicate-method
403
330
  example_name = os.path.basename(args.workflow_path)
404
331
  print("\nThis appears to be an example workflow. Please run:")
405
332
  print(f" fastworkflow examples fetch {example_name}")
406
- print(f" fastworkflow examples train {example_name}")
333
+ print(f" fastworkflow train ./examples/{example_name} ./examples/fastworkflow.env ./examples/fastworkflow.passwords.env")
407
334
  else:
408
335
  print("\nPlease ensure this file exists with required environment variables.")
409
336
  print("You can create a basic .env file in your current directory.")
@@ -416,7 +343,7 @@ def run_with_defaults(args): # sourcery skip: extract-duplicate-method
416
343
  example_name = os.path.basename(args.workflow_path)
417
344
  print("\nThis appears to be an example workflow. Please run:")
418
345
  print(f" fastworkflow examples fetch {example_name}")
419
- print(f" fastworkflow examples train {example_name}")
346
+ print(f" fastworkflow train ./examples/{example_name} ./examples/fastworkflow.env ./examples/fastworkflow.passwords.env")
420
347
  else:
421
348
  print("\nPlease ensure this file exists with required API keys.")
422
349
  print("You can create a basic passwords.env file in your current directory.")
@@ -426,86 +353,6 @@ def run_with_defaults(args): # sourcery skip: extract-duplicate-method
426
353
  from .run.__main__ import run_main as _run_main
427
354
  return _run_main(args)
428
355
 
429
- def run_example(args):
430
- # sourcery skip: extract-duplicate-method, extract-method, remove-redundant-fstring, split-or-ifs
431
- """Run an existing example workflow."""
432
- # Create a spinner for the initial check
433
- spinner = Spinner("dots", text="[bold green]Preparing to run example...[/bold green]")
434
-
435
- with Live(spinner, refresh_per_second=10):
436
- # Check if example exists in the local examples directory
437
- local_examples_dir = Path("./examples")
438
- workflow_path = local_examples_dir / args.name
439
-
440
- if workflow_path.is_dir():
441
- # Get the appropriate env files for this example workflow
442
- env_file_path, passwords_file_path = find_default_env_files(local_examples_dir)
443
-
444
- # Check if the files exist
445
- env_file = Path(env_file_path)
446
- passwords_file = Path(passwords_file_path)
447
-
448
- # Check if the example has been trained
449
- command_info_dir = workflow_path / "___command_info"
450
-
451
- # After the spinner, handle any errors or proceed with running
452
- if not workflow_path.is_dir():
453
- rprint(f"[bold red]Error:[/bold red] Example '{args.name}' not found in '{local_examples_dir}'.")
454
- rprint(f"Use 'fastworkflow examples fetch {args.name}' to fetch the example first.")
455
- rprint("Or use 'fastworkflow examples list' to see available examples.")
456
- sys.exit(1)
457
-
458
- if not env_file.exists() or not passwords_file.exists():
459
- rprint(f"[bold red]Error:[/bold red] Required environment files not found:")
460
- if not env_file.exists():
461
- rprint(f" - {env_file} (not found)")
462
- if not passwords_file.exists():
463
- rprint(f" - {passwords_file} (not found)")
464
- rprint("\nPlease run the following command to fetch the example and its environment files:")
465
- rprint(f" fastworkflow examples fetch {args.name}")
466
- rprint("\nAfter fetching, edit the passwords file to add your API keys:")
467
- rprint(f" {local_examples_dir}/fastworkflow.passwords.env")
468
- rprint("\nThen train the example before running it:")
469
- rprint(f" fastworkflow examples train {args.name}")
470
- sys.exit(1)
471
-
472
- # Check if the example has been trained
473
- if not command_info_dir.exists() or not any(command_info_dir.iterdir()):
474
- rprint(f"[bold yellow]Warning:[/bold yellow] Example '{args.name}' does not appear to be trained yet.")
475
- rprint(f"Please train the example first with:")
476
- rprint(f" fastworkflow examples train {args.name}")
477
- response = input("Do you want to continue anyway? [y/N] ")
478
- if response.lower() != 'y':
479
- rprint("Operation cancelled.")
480
- sys.exit(0)
481
-
482
- rprint(f"[bold green]Running example[/bold green] '{args.name}'...")
483
-
484
- # For interactive applications, we need to use os.execvp to replace the current process
485
- # This ensures that stdin/stdout/stderr are properly connected for interactive use
486
- cmd = [
487
- sys.executable,
488
- "-m", "fastworkflow.run",
489
- str(workflow_path),
490
- str(env_file),
491
- str(passwords_file)
492
- ]
493
-
494
- # Forward agent mode flag if requested
495
- if getattr(args, "run_as_agent", False):
496
- cmd.append("--run_as_agent")
497
-
498
- try:
499
- rprint(f"[bold green]Starting interactive session...[/bold green]")
500
- # Replace the current process with the run command
501
- # This ensures that the interactive prompt works correctly
502
- os.execvp(sys.executable, cmd)
503
- except Exception as e:
504
- rprint(f"[bold red]An unexpected error occurred while running the example:[/bold red] {e}")
505
- import traceback
506
- traceback.print_exc(file=sys.stderr)
507
- sys.exit(1)
508
-
509
356
  def main():
510
357
  """Main function for the fastworkflow CLI."""
511
358
 
@@ -528,22 +375,6 @@ def main():
528
375
  parser_fetch.add_argument("--force", action="store_true", help="Force overwrite if example already exists")
529
376
  parser_fetch.set_defaults(func=fetch_example)
530
377
 
531
- # 'examples train' command
532
- parser_train_example = examples_subparsers.add_parser("train", help="Train a specific example")
533
- parser_train_example.add_argument("name", help="The name of the example to train")
534
- parser_train_example.set_defaults(func=train_example)
535
-
536
- # 'examples run' command
537
- parser_run_example = examples_subparsers.add_parser("run", help="Run a specific example")
538
- parser_run_example.add_argument("name", help="The name of the example to run")
539
- parser_run_example.add_argument(
540
- "--run_as_agent",
541
- help="Run the example in agent mode (uses DSPy for tool selection)",
542
- action="store_true",
543
- default=False,
544
- )
545
- parser_run_example.set_defaults(func=run_example)
546
-
547
378
  # Add top-level commands
548
379
  add_build_parser(subparsers)
549
380
  add_refine_parser(subparsers)
@@ -1,7 +1,7 @@
1
1
  LLM_SYNDATA_GEN=mistral/mistral-small-latest
2
2
  LLM_PARAM_EXTRACTION=mistral/mistral-small-latest
3
3
  LLM_RESPONSE_GEN=mistral/mistral-small-latest
4
- LLM_PLANNER=openrouter/openai/gpt-oss-20b:free
4
+ LLM_PLANNER=mistral/mistral-small-latest
5
5
  LLM_AGENT=mistral/mistral-small-latest
6
6
 
7
7
  SPEEDDICT_FOLDERNAME=___workflow_contexts
@@ -139,7 +139,9 @@ def run_main(args):
139
139
  raise ValueError("Cannot provide both startup_command and startup_action")
140
140
 
141
141
  console.print(Panel(f"Running fastWorkflow: [bold]{args.workflow_path}[/bold]", title="[bold green]fastworkflow[/bold green]", border_style="green"))
142
- console.print("[bold green]Tips:[/bold green] Type '/exit' to quit the application. Type '/new' to start a new conversation.")
142
+ console.print(
143
+ "[bold green]Tips:[/bold green] Type '//exit' to quit the application. Type '//new' to start a new conversation. "
144
+ "[bold green]Tips:[/bold green] Prefix natural language commands with a single '/' to execute them in deterministic (non-agentic) mode")
143
145
 
144
146
  # ------------------------------------------------------------------
145
147
  # Startup progress bar ------------------------------------------------
@@ -169,9 +171,9 @@ def run_main(args):
169
171
  with open(args.context_file_path, 'r') as file:
170
172
  context_dict = json.load(file)
171
173
 
172
- # Create the chat session with agent mode if specified
173
- run_as_agent = args.run_as_agent if hasattr(args, 'run_as_agent') else False
174
- fastworkflow.chat_session = fastworkflow.ChatSession(run_as_agent=run_as_agent)
174
+ # Create the chat session in agent mode always
175
+ # run_as_agent = args.run_as_agent if hasattr(args, 'run_as_agent') else False
176
+ fastworkflow.chat_session = fastworkflow.ChatSession(run_as_agent=True)
175
177
 
176
178
  # Start the workflow within the chat session
177
179
  fastworkflow.chat_session.start_workflow(
@@ -194,9 +196,9 @@ def run_main(args):
194
196
  while not fastworkflow.chat_session.workflow_is_complete or args.keep_alive:
195
197
  with patch_stdout():
196
198
  user_command = prompt_session.prompt()
197
- if user_command == "/exit":
199
+ if user_command.startswith("//exit"):
198
200
  break
199
- if user_command.startswith("/new"):
201
+ if user_command.startswith("//new"):
200
202
  fastworkflow.chat_session.clear_conversation_history()
201
203
  console.print("[bold]Agent >[/bold] New conversation started!\n", end="")
202
204
  user_command = prompt_session.prompt()
@@ -224,26 +226,25 @@ def run_main(args):
224
226
  with console.status("[bold cyan]Processing command...[/bold cyan]", spinner="dots") as status:
225
227
  counter = 0
226
228
  while wait_thread.is_alive():
227
- # Check for agent traces if in agent mode
228
- if args.run_as_agent:
229
- while True:
230
- try:
231
- evt = fastworkflow.chat_session.command_trace_queue.get_nowait()
232
- except queue.Empty:
233
- break
234
-
235
- # Choose styles based on success
236
- info_style = "dim orange3" if (evt.success is False) else "dim yellow"
237
- resp_style = "dim orange3" if (evt.success is False) else "dim green"
229
+ # Always show agent traces (run mode is always agentic)
230
+ while True:
231
+ try:
232
+ evt = fastworkflow.chat_session.command_trace_queue.get_nowait()
233
+ except queue.Empty:
234
+ break
235
+
236
+ # Choose styles based on success
237
+ info_style = "dim orange3" if (evt.success is False) else "dim yellow"
238
+ resp_style = "dim orange3" if (evt.success is False) else "dim green"
238
239
 
239
- if evt.direction == fastworkflow.CommandTraceEventDirection.AGENT_TO_WORKFLOW:
240
- console.print(f'[bold]Agent >[/bold] {evt.raw_command}', style=info_style)
241
- else:
242
- # command info (dim yellow or dim orange3)
243
- info = f"[bold]Workflow >[/bold] {evt.command_name or ''}, {evt.parameters}: "
244
- console.print(info, style=info_style, end="")
245
- # response (dim green or dim orange3)
246
- console.print(f'[bold]Workflow >[/bold] {evt.response_text}', style=resp_style)
240
+ if evt.direction == fastworkflow.CommandTraceEventDirection.AGENT_TO_WORKFLOW:
241
+ console.print(f'[bold]Agent >[/bold] {evt.raw_command}', style=info_style)
242
+ else:
243
+ # command info (dim yellow or dim orange3)
244
+ info = f"[bold]Workflow >[/bold] {evt.command_name or ''}, {evt.parameters}: "
245
+ console.print(info, style=info_style, end="")
246
+ # response (dim green or dim orange3)
247
+ console.print(f'[bold]Workflow >[/bold] {evt.response_text}', style=resp_style)
247
248
 
248
249
  time.sleep(0.5)
249
250
  counter += 1
@@ -276,11 +277,6 @@ if __name__ == "__main__":
276
277
  parser.add_argument(
277
278
  "--project_folderpath", help="Optional path to project folder containing application code", default=None
278
279
  )
279
- parser.add_argument(
280
- "--run_as_agent",
281
- help="Run in agent mode (uses DSPy for tool selection)",
282
- action="store_true",
283
- default=False
284
- )
280
+ # run mode is always agentic; deterministic NL execution can be forced by prefixing '/' to a command
285
281
  args = parser.parse_args()
286
282
  run_main(args)
@@ -290,7 +290,7 @@ Today's date is {today}.
290
290
  # return 0 if it extracts an example value instead of correct value | None
291
291
  extracted_param_value = getattr(pred, field_name)
292
292
  examples = model_class.model_fields[field_name].examples
293
- if extracted_param_value in examples:
293
+ if examples and extracted_param_value in examples:
294
294
  return 0.0
295
295
  return 1.0
296
296
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastworkflow
3
- Version: 2.15.7
3
+ Version: 2.15.9
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
@@ -50,7 +50,7 @@ While [DSPy](https://dspy.ai) ([Why DSPy](https://x.com/lateinteraction/status/1
50
50
 
51
51
  ### Why fastWorkflow?
52
52
 
53
- - ✅ **Unlimited Tool Scaling**: fastworkflow can scale to an unlimited number of tools
53
+ - ✅ **Unlimited Tool Scaling**: fastworkflow organizes tools into context hierarchies so use any number of tools without sacrificing performance or efficiency
54
54
  - ✅ **Cost-Effective Performance**: fastWorkFlow with small, free models can match the quality of large expensive models
55
55
  - ✅ **Reliable Tool Execution**: fastworkflow validation pipeline virtually eliminates incorrect tool calling or parameter extraction, ensuring a reliable tool response
56
56
  - ✅ **Adaptive Learning**: 1-shot learning from intent detection mistakes. It learns your conversational vocabulary as you interact with it
@@ -202,14 +202,14 @@ LITELLM_API_KEY_PLANNER=your-mistral-api-key
202
202
  LITELLM_API_KEY_AGENT=your-mistral-api-key
203
203
  ```
204
204
 
205
- You can get a free API key from [Mistral AI](https://mistral.ai) - the example is configured to use the `mistral-small-latest` model which is available on their free tier.
205
+ You can get a free API key from [Mistral AI](https://mistral.ai) for the mistral small model. Or a free API key from [OpenRouter](https://openrouter.ai/openai/gpt-oss-20b:free) for the GPT-OSS-20B:free model. You can use different models for different LLM roles in the same workflow if you wish.
206
206
 
207
207
  ### Step 3: Train the Example
208
208
 
209
209
  Train the intent-detection models for the workflow:
210
210
 
211
211
  ```sh
212
- fastworkflow examples train hello_world
212
+ fastworkflow train ./examples/hello_world ./examples/fastworkflow.env ./examples/fastworkflow.passwords.env
213
213
  ```
214
214
 
215
215
  This step builds the NLP models that help the workflow understand user commands.
@@ -219,7 +219,7 @@ This step builds the NLP models that help the workflow understand user commands.
219
219
  Once training is complete, run the interactive assistant:
220
220
 
221
221
  ```sh
222
- fastworkflow examples run hello_world
222
+ fastworkflow run ./examples/hello_world ./examples/fastworkflow.env ./examples/fastworkflow.passwords.env
223
223
  ```
224
224
 
225
225
  You will be greeted with a `User >` prompt. Try it out by asking "what can you do?" or "add 49 + 51"!
@@ -240,12 +240,6 @@ fastworkflow examples list
240
240
 
241
241
  # Fetch an example to your local directory
242
242
  fastworkflow examples fetch <example_name>
243
-
244
- # Train an example workflow
245
- fastworkflow examples train <example_name>
246
-
247
- # Run an example workflow
248
- fastworkflow examples run <example_name>
249
243
  ```
250
244
 
251
245
  ### Workflow Operations
@@ -261,11 +255,8 @@ fastworkflow train <workflow_dir> <env_file> <passwords_file>
261
255
  fastworkflow run <workflow_dir> <env_file> <passwords_file>
262
256
  ```
263
257
 
264
- To run a workflow in agentic mode, add the `--run_as_agent` flag:
265
-
266
- ```sh
267
- fastworkflow run <workflow_dir> <env_file> <passwords_file> --run_as_agent
268
- ```
258
+ > [!tip]
259
+ > **Deterministic execution:** Prefix a natural language command with `/` to execute it deterministically (non‑agentic) during an interactive run.
269
260
 
270
261
  Each command has additional options that can be viewed with the `--help` flag:
271
262
 
@@ -10,8 +10,10 @@ fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/re
10
10
  fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/what_can_i_do.py,sha256=Fw8tsk3wyCujf8nBfUgPDxnTP9c2IE513FzqAWGm8pU,6216
11
11
  fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/what_is_current_context.py,sha256=S5RQLr62Q2MnKU85nw4IW_ueAK_FXvhcY9gXajFxujg,1464
12
12
  fastworkflow/_workflows/command_metadata_extraction/_commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- fastworkflow/_workflows/command_metadata_extraction/_commands/wildcard.py,sha256=0VDWnDUAoMwsfH7WEI1e9UWJz_rkVGYH8KqTv9Gwea8,33307
13
+ fastworkflow/_workflows/command_metadata_extraction/_commands/wildcard.py,sha256=fUOiCMGfzoK3UBan2vMp6yj71OsQKkdyLyknE5jHSg8,6962
14
14
  fastworkflow/_workflows/command_metadata_extraction/command_context_model.json,sha256=zGWBweQSmFf7WsfR_F2DE7AJ8S8-q7F9ZbvyccysJJI,117
15
+ fastworkflow/_workflows/command_metadata_extraction/intent_detection.py,sha256=6A1q1OsivlW98nbMMfE1b9vjvFuLGRuKpv1Qvm0zHBk,14516
16
+ fastworkflow/_workflows/command_metadata_extraction/parameter_extraction.py,sha256=6Sgt3foMFZg2RBPDbnPrxAdlZfnDyW8vPkGDr3PDadw,13117
15
17
  fastworkflow/build/__main__.py,sha256=NtedkZfM56qoEJ5vQECSURbE8AMTfwHN3tAZyZoWabk,15905
16
18
  fastworkflow/build/ast_class_extractor.py,sha256=F9OG4stkp7w3kadKqxMm8h3ZDSp_zg6mwcrKMl_XqdI,13527
17
19
  fastworkflow/build/class_analysis_structures.py,sha256=UWOKcs9pCiNuXc64hNywkTJq5X5KfG1pqdSZwWiZh-c,4053
@@ -34,7 +36,7 @@ fastworkflow/build/pydantic_model_generator.py,sha256=oNyoANyUWBpHG-fE3tGL911RNv
34
36
  fastworkflow/build/utterance_generator.py,sha256=UrtkF0wyAZ1hiFitHX0g8w7Wh-D0leLCrP1aUACSfHo,299
35
37
  fastworkflow/cache_matching.py,sha256=OoB--1tO6-O4BKCuCrUbB0CkUr76J62K4VAf6MShi-w,7984
36
38
  fastworkflow/chat_session.py,sha256=MVHSoygLIW4Gh3BRfDYSxmh5RMuBxc96c8E9QRW6ZyU,27563
37
- fastworkflow/cli.py,sha256=RB78V78NAZsZtNqF4_kk-TnEKCOy-cFLF6wSwz8aP14,26345
39
+ fastworkflow/cli.py,sha256=li9OFT05sxqz4BZJc9byKAeTmomjLfsWMVuy0OiRGSs,18953
38
40
  fastworkflow/command_context_model.py,sha256=nWxLP3TR7WJr3yWCedqcdFOxo_kwae_mS3VRN2cOmK8,13437
39
41
  fastworkflow/command_directory.py,sha256=aJ6UQCwevfF11KbcQB2Qz6mQ7Kj91pZtvHmQY6JFnao,29030
40
42
  fastworkflow/command_executor.py,sha256=IEcuHEqrqc6I-Hpv451VIHw6z64zkO4o51MpXUFnPGo,7936
@@ -48,7 +50,7 @@ fastworkflow/examples/extended_workflow_example/_commands/generate_report.py,sha
48
50
  fastworkflow/examples/extended_workflow_example/_commands/startup.py,sha256=V5Q29148SvXw6i3i0pKTuNWsv2xnkUMsHHuzt1ndxro,1028
49
51
  fastworkflow/examples/extended_workflow_example/simple_workflow_template.json,sha256=A-dAl5iD9ehdMGGn05O2Kjwq6ZetqQjAGzlM1st0K9U,1237
50
52
  fastworkflow/examples/extended_workflow_example/workflow_inheritance_model.json,sha256=TBk272pqfyRKzm4T-I6_nGfbcdmEzjwon7kFPWtgyhw,81
51
- fastworkflow/examples/fastworkflow.env,sha256=AtHxE3hf69DDIA8o27cOeV_0iKuMTpJCHf-CY_gzPzQ,629
53
+ fastworkflow/examples/fastworkflow.env,sha256=FNx41woSsG7ljcwI6H6Y3RCMw6mXiImcq8QMnqeqSao,623
52
54
  fastworkflow/examples/fastworkflow.passwords.env,sha256=CJemqCpj8HeSznTFUfCSc6I5r8noXuRWKfkrHaslD7E,424
53
55
  fastworkflow/examples/hello_world/_commands/README.md,sha256=pYOTGqVx41ZIuNc6hPTEJzNcMQ2Vwx3PN74ifSlayvU,1297
54
56
  fastworkflow/examples/hello_world/_commands/add_two_numbers.py,sha256=0lFGK1llT6u6fByvzCDPdegjY6gWcerM2cvxVSo7lIw,2232
@@ -142,7 +144,7 @@ fastworkflow/mcp_server.py,sha256=f6vqHiG-cuMpeoeRY-mvsFxApmQ28cAJFfMtqoJYy5k,88
142
144
  fastworkflow/model_pipeline_training.py,sha256=P_9wrYSfJVSYCTu8VEPkgXJ16eH58LLCK4rCRbRFAVg,46740
143
145
  fastworkflow/refine/__main__.py,sha256=bDLpPNMcdp8U4EFnMdjxx1sPDQCZuEJoBURr2KebTng,3398
144
146
  fastworkflow/run/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
- fastworkflow/run/__main__.py,sha256=LNcxQRiY3Jar-coqveyrszocHSqbcVAXw1aWYltVaPM,12438
147
+ fastworkflow/run/__main__.py,sha256=e3gTjcQwYuEz12LZIdL5w48aMRJ-42MdlyapINj7XWk,12430
146
148
  fastworkflow/run_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
149
  fastworkflow/run_agent/__main__.py,sha256=japXWziVDHdLl7Hk-jzwcYkImVY4j4k9SodMhiRK3ow,11986
148
150
  fastworkflow/run_agent/agent_module.py,sha256=XbOfX2K2CwmIRT45YtoROCN4en9Ud8gMQh2kGEhqw_A,8012
@@ -164,13 +166,13 @@ fastworkflow/utils/parameterize_func_decorator.py,sha256=V6YJnishWRCdwiBQW6P17hm
164
166
  fastworkflow/utils/pydantic_model_2_dspy_signature_class.py,sha256=w1pvl8rJq48ulFwaAtBgfXYn_SBIDBgq1aLMUg1zJn8,12875
165
167
  fastworkflow/utils/python_utils.py,sha256=OzSf-bGve1401SHM3QXXFauBOBrlGQzPNgvvGJPavX0,8200
166
168
  fastworkflow/utils/react.py,sha256=HubwmM4H9UzLaLaeIkJseKCNMjyrOXvMZz-8sw4ycCE,11224
167
- fastworkflow/utils/signatures.py,sha256=pOQtvp5qXmA-ETD4xpax5Kj8abkRVbznywyCwanVpxY,20938
169
+ fastworkflow/utils/signatures.py,sha256=beDgLw54AN_IZra3d5ZhpDO7u1i5FJzVQeLhs6G_DRA,20951
168
170
  fastworkflow/utils/startup_progress.py,sha256=9icSdnpFAxzIq0sUliGpNaH0Efvrt5lDtGfURV5BD98,3539
169
171
  fastworkflow/workflow.py,sha256=F7kGoNQbAMwy71zT1V_KF8PbRTCY4Dz-16Zv4ApK8m8,18939
170
172
  fastworkflow/workflow_agent.py,sha256=iUcaE1fKLTiRNyDaochPpRHdijCiQBYaCWR8DdslO9Y,16028
171
173
  fastworkflow/workflow_inheritance_model.py,sha256=Pp-qSrQISgPfPjJVUfW84pc7HLmL2evuq0UVIYR51K0,7974
172
- fastworkflow-2.15.7.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
173
- fastworkflow-2.15.7.dist-info/METADATA,sha256=YZJQivXXFXM1M9Udw6xZ9ozbplFVSSwcZy1cTQ2xTkc,29867
174
- fastworkflow-2.15.7.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
175
- fastworkflow-2.15.7.dist-info/entry_points.txt,sha256=m8HqoPzCyaZLAx-V5X8MJgw3Lx3GiPDlxNEZ7K-Gb-U,54
176
- fastworkflow-2.15.7.dist-info/RECORD,,
174
+ fastworkflow-2.15.9.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
175
+ fastworkflow-2.15.9.dist-info/METADATA,sha256=o0zFSQTjmQVkWTTRwjRTKE94k_-6MDLE5kSUHW5GwQY,30065
176
+ fastworkflow-2.15.9.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
177
+ fastworkflow-2.15.9.dist-info/entry_points.txt,sha256=m8HqoPzCyaZLAx-V5X8MJgw3Lx3GiPDlxNEZ7K-Gb-U,54
178
+ fastworkflow-2.15.9.dist-info/RECORD,,