Initial commit
This commit is contained in:
153
skills/phenoml-workflow/scripts/setup_fhir_provider.py
Normal file
153
skills/phenoml-workflow/scripts/setup_fhir_provider.py
Normal file
@@ -0,0 +1,153 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
FHIR Provider Setup Script
|
||||
|
||||
Creates a FHIR provider using credentials from .env or CLI arguments.
|
||||
|
||||
Usage:
|
||||
python3 setup_fhir_provider.py
|
||||
python3 setup_fhir_provider.py --name "My FHIR Server" --provider medplum
|
||||
python3 setup_fhir_provider.py --help
|
||||
|
||||
Required .env variables:
|
||||
PHENOML_USERNAME, PHENOML_PASSWORD, PHENOML_BASE_URL
|
||||
FHIR_PROVIDER_BASE_URL, FHIR_PROVIDER_CLIENT_ID, FHIR_PROVIDER_CLIENT_SECRET
|
||||
|
||||
Example FHIR_PROVIDER_BASE_URL values:
|
||||
- Medplum: https://api.medplum.com/fhir/R4
|
||||
- Athena: https://api.preview.platform.athenahealth.com/fhir/r4
|
||||
- Epic: https://fhir.epic.com/interconnect-fhir-oauth/api/FHIR/R4
|
||||
- Cerner: https://fhir-myrecord.cerner.com/r4/[tenant-id]
|
||||
|
||||
Optional .env variables:
|
||||
FHIR_PROVIDER_NAME (default: "FHIR Server")
|
||||
FHIR_PROVIDER_TYPE (default: "medplum")
|
||||
FHIR_AUTH_METHOD (default: "client_secret")
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
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 main():
|
||||
parser = argparse.ArgumentParser(description='Create a FHIR provider for PhenoML workflows')
|
||||
parser.add_argument('--name', help='FHIR provider name')
|
||||
parser.add_argument('--provider', help='Provider type (medplum, epic, cerner, etc.)')
|
||||
parser.add_argument('--auth-method', help='Auth method (default: client_secret)')
|
||||
parser.add_argument('--base-url', help='FHIR base URL')
|
||||
parser.add_argument('--client-id', help='Client ID')
|
||||
parser.add_argument('--client-secret', help='Client secret')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Load environment
|
||||
load_dotenv()
|
||||
|
||||
# Get configuration (CLI args override .env)
|
||||
name = args.name or os.getenv("FHIR_PROVIDER_NAME", "FHIR Server")
|
||||
provider_type = args.provider or os.getenv("FHIR_PROVIDER_TYPE", "medplum")
|
||||
auth_method = args.auth_method or os.getenv("FHIR_AUTH_METHOD", "client_secret")
|
||||
|
||||
# Get FHIR provider credentials (CLI args override .env)
|
||||
base_url = args.base_url or os.getenv("FHIR_PROVIDER_BASE_URL")
|
||||
client_id = args.client_id or os.getenv("FHIR_PROVIDER_CLIENT_ID")
|
||||
client_secret = args.client_secret or os.getenv("FHIR_PROVIDER_CLIENT_SECRET")
|
||||
|
||||
# Validate required fields
|
||||
if not base_url:
|
||||
print("❌ Error: FHIR base URL is required")
|
||||
print(" Set FHIR_PROVIDER_BASE_URL in .env, or use --base-url")
|
||||
print("\n Example values:")
|
||||
print(" - Medplum: https://api.medplum.com/fhir/R4")
|
||||
print(" - Athena: https://api.preview.platform.athenahealth.com/fhir/r4")
|
||||
print(" - Epic: https://fhir.epic.com/interconnect-fhir-oauth/api/FHIR/R4")
|
||||
print(" - Cerner: https://fhir-myrecord.cerner.com/r4/[tenant-id]")
|
||||
sys.exit(1)
|
||||
|
||||
if not client_id:
|
||||
print("❌ Error: Client ID is required")
|
||||
print(" Set FHIR_PROVIDER_CLIENT_ID in .env, or use --client-id")
|
||||
sys.exit(1)
|
||||
|
||||
if not client_secret:
|
||||
print("❌ Error: Client secret is required")
|
||||
print(" Set FHIR_PROVIDER_CLIENT_SECRET in .env, or use --client-secret")
|
||||
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 FHIR provider
|
||||
print(f"Creating FHIR provider:")
|
||||
print(f" Name: {name}")
|
||||
print(f" Provider: {provider_type}")
|
||||
print(f" Base URL: {base_url}")
|
||||
print(f" Auth method: {auth_method}\n")
|
||||
|
||||
try:
|
||||
fhir_provider = client.fhir_provider.create(
|
||||
name=name,
|
||||
provider=provider_type,
|
||||
auth_method=auth_method,
|
||||
base_url=base_url,
|
||||
client_id=client_id,
|
||||
client_secret=client_secret
|
||||
)
|
||||
|
||||
provider_id = fhir_provider.data.id
|
||||
print(f"✅ FHIR provider created successfully!")
|
||||
print(f" Provider ID: {provider_id}\n")
|
||||
|
||||
# Save to .env
|
||||
save_to_env("FHIR_PROVIDER_ID", provider_id)
|
||||
print(f"💾 Provider ID saved to .env")
|
||||
print(f"\n🎉 Setup complete! You can now create workflows using this provider.")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Failed to create FHIR provider: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user