e768098d0e
tools_continuous_delivery / Private PyPI non-main branch release (push) Has been skipped
tools_continuous_delivery / Private PyPI main branch release (push) Failing after 2m42s
Publish Promptflow Doc / Build (push) Has been cancelled
Publish Promptflow Doc / Deploy (push) Has been cancelled
Flake8 Lint / flake8 (push) Has been cancelled
Spell check CI / Spell_Check (push) Has been cancelled
80 lines
2.1 KiB
Python
80 lines
2.1 KiB
Python
"""
|
|
Azure ML managed online endpoint scoring script.
|
|
|
|
Replaces: Prompt Flow Managed Online Endpoint.
|
|
|
|
init() is called once when the container starts.
|
|
run(raw_data) is called for each request; raw_data is the JSON request body.
|
|
|
|
Deploy:
|
|
bash deploy.sh
|
|
|
|
Optional: set MAF_WORKFLOW_FILE to your workflow file path
|
|
(default: phase-2-rebuild/01_linear_flow.py).
|
|
"""
|
|
|
|
import asyncio
|
|
import json
|
|
import logging
|
|
import os
|
|
from pathlib import Path
|
|
import sys
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
workflow = None
|
|
|
|
|
|
def init():
|
|
"""Called once when the endpoint container starts."""
|
|
global workflow
|
|
|
|
guide_root = Path(__file__).resolve().parents[2]
|
|
if str(guide_root) not in sys.path:
|
|
sys.path.insert(0, str(guide_root))
|
|
|
|
# Optional tracing — only when the connection string is present.
|
|
appinsights_conn = os.getenv("APPLICATIONINSIGHTS_CONNECTION_STRING")
|
|
if appinsights_conn:
|
|
from azure.monitor.opentelemetry import configure_azure_monitor
|
|
from agent_framework.observability import configure_otel_providers
|
|
|
|
configure_azure_monitor(connection_string=appinsights_conn)
|
|
configure_otel_providers()
|
|
|
|
from workflow_loader import load_workflow
|
|
|
|
workflow = load_workflow()
|
|
logger.info("Workflow loaded successfully.")
|
|
|
|
|
|
def run(raw_data):
|
|
"""Called for each scoring request.
|
|
|
|
Parameters
|
|
----------
|
|
raw_data : str
|
|
JSON string with the request body, e.g. '{"question": "..."}'
|
|
|
|
Returns
|
|
-------
|
|
dict
|
|
{"answer": str}
|
|
"""
|
|
data = json.loads(raw_data)
|
|
question = data.get("question", "").strip()
|
|
if not question:
|
|
raise ValueError("Question must not be empty.")
|
|
|
|
result = asyncio.get_event_loop().run_until_complete(workflow.run(question))
|
|
outputs = result.get_outputs()
|
|
|
|
if not outputs:
|
|
raise RuntimeError("Workflow produced no output.")
|
|
|
|
output = outputs[0]
|
|
# AgentResponse objects are not JSON-serializable; extract the text.
|
|
if hasattr(output, "text"):
|
|
return {"answer": output.text}
|
|
return {"answer": str(output)}
|