Initial commit

This commit is contained in:
Zhongwei Li
2025-11-30 08:47:21 +08:00
commit c605e2d4dd
8 changed files with 1125 additions and 0 deletions

View File

@@ -0,0 +1,162 @@
#!/usr/bin/env python3
"""
Workflow Creation Script
Creates a PhenoML workflow using configuration from .env or CLI arguments.
Usage:
python3 create_workflow.py
python3 create_workflow.py --name "My Workflow" --instructions "..." --sample-data '{"key": "value"}'
python3 create_workflow.py --help
Required .env variables:
PHENOML_USERNAME, PHENOML_PASSWORD, PHENOML_BASE_URL
FHIR_PROVIDER_ID (from setup_fhir_provider.py)
Workflow configuration (.env or CLI args):
WORKFLOW_NAME or --name
WORKFLOW_INSTRUCTIONS or --instructions
WORKFLOW_SAMPLE_DATA (JSON string) or --sample-data
Optional:
WORKFLOW_DYNAMIC_GENERATION (true/false) or --dynamic-generation
WORKFLOW_VERBOSE (true/false) or --verbose
"""
import os
import sys
import json
import argparse
from phenoml import Client
from dotenv import load_dotenv
def save_to_env(key, value):
"""Save or update a key-value pair in .env file"""
env_file = ".env"
if not os.path.exists(env_file):
with open(env_file, 'w') as f:
f.write(f"{key}={value}\n")
return
with open(env_file, 'r') as f:
lines = f.readlines()
found = False
for i, line in enumerate(lines):
if line.startswith(f"{key}="):
lines[i] = f"{key}={value}\n"
found = True
break
if not found:
if lines and not lines[-1].endswith('\n'):
lines.append('\n')
lines.append(f"{key}={value}\n")
with open(env_file, 'w') as f:
f.writelines(lines)
def str_to_bool(s):
"""Convert string to boolean"""
return s.lower() in ('true', '1', 'yes', 'y')
def main():
parser = argparse.ArgumentParser(description='Create a PhenoML workflow')
parser.add_argument('--name', help='Workflow name')
parser.add_argument('--instructions', help='Workflow instructions')
parser.add_argument('--sample-data', help='Sample data as JSON string')
parser.add_argument('--dynamic-generation', type=str_to_bool, help='Enable dynamic generation (true/false)')
parser.add_argument('--verbose', type=str_to_bool, help='Verbose mode (true/false)')
parser.add_argument('--provider-id', help='FHIR provider ID (overrides .env)')
args = parser.parse_args()
# Load environment
load_dotenv()
# Get configuration (CLI args override .env)
name = args.name or os.getenv("WORKFLOW_NAME")
instructions = args.instructions or os.getenv("WORKFLOW_INSTRUCTIONS")
sample_data_str = args.sample_data or os.getenv("WORKFLOW_SAMPLE_DATA")
dynamic_generation = args.dynamic_generation if args.dynamic_generation is not None else str_to_bool(os.getenv("WORKFLOW_DYNAMIC_GENERATION", "true"))
verbose = args.verbose if args.verbose is not None else str_to_bool(os.getenv("WORKFLOW_VERBOSE", "false"))
provider_id = args.provider_id or os.getenv("FHIR_PROVIDER_ID")
# Validate required fields
if not name:
print("❌ Error: Workflow name is required")
print(" Set WORKFLOW_NAME in .env, or use --name")
sys.exit(1)
if not instructions:
print("❌ Error: Workflow instructions are required")
print(" Set WORKFLOW_INSTRUCTIONS in .env, or use --instructions")
sys.exit(1)
if not sample_data_str:
print("❌ Error: Sample data is required")
print(" Set WORKFLOW_SAMPLE_DATA in .env, or use --sample-data")
sys.exit(1)
if not provider_id:
print("❌ Error: FHIR provider ID is required")
print(" Run setup_fhir_provider.py first, or use --provider-id")
sys.exit(1)
# Parse sample data
try:
sample_data = json.loads(sample_data_str)
except json.JSONDecodeError as e:
print(f"❌ Error: Invalid JSON in sample data: {e}")
sys.exit(1)
# Initialize PhenoML client
print("Initializing PhenoML client...")
try:
client = Client(
username=os.getenv("PHENOML_USERNAME"),
password=os.getenv("PHENOML_PASSWORD"),
base_url=os.getenv("PHENOML_BASE_URL")
)
print("✅ PhenoML client initialized\n")
except Exception as e:
print(f"❌ Failed to initialize PhenoML client: {e}")
print(" Make sure PHENOML_USERNAME, PHENOML_PASSWORD, and PHENOML_BASE_URL are set in .env")
sys.exit(1)
# Create workflow
print(f"Creating workflow:")
print(f" Name: {name}")
print(f" Provider ID: {provider_id}")
print(f" Dynamic generation: {dynamic_generation}")
print(f" Verbose: {verbose}")
print(f" Sample data: {json.dumps(sample_data, indent=2)}\n")
try:
workflow = client.workflows.create(
name=name,
workflow_instructions=instructions,
sample_data=sample_data,
fhir_provider_id=provider_id,
verbose=verbose,
dynamic_generation=dynamic_generation
)
workflow_id = workflow.workflow_id
print(f"✅ Workflow created successfully!")
print(f" Workflow ID: {workflow_id}\n")
# Save to .env
save_to_env("WORKFLOW_ID", workflow_id)
print(f"💾 Workflow ID saved to .env")
print(f"\n🎉 Workflow creation complete! You can now test it with test_workflow.py")
except Exception as e:
print(f"❌ Failed to create workflow: {e}")
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == "__main__":
main()