From 910536bb1c7d43c50a799d01e0822e86fce040ea Mon Sep 17 00:00:00 2001 From: "Gerard@msft" <99283778+gjwoods@users.noreply.github.com> Date: Mon, 11 Dec 2023 05:05:29 -0800 Subject: [PATCH] Rename Open Source to Open Model LLM Tool (#1437) # Description As title: Rename Open Source to Open Model LLM Tool to meet CELA requirements. # All Promptflow Contribution checklist: - [x] **The pull request does not introduce [breaking changes].** - [x] **CHANGELOG is updated for new features, bug fixes or other significant changes.** - [x] **I have read the [contribution guidelines](../CONTRIBUTING.md).** - [x] **Create an issue and link to the pull request to get dedicated review from promptflow team. Learn more: [suggested workflow](../CONTRIBUTING.md#suggested-workflow).** ## General Guidelines and Best Practices - [x] Title of the pull request is clear and informative. - [x] There are a small number of commits, each of which have an informative message. This means that previously merged commits do not appear in the history of the PR. For more information on cleaning up the commits in your PR, [see this page](https://github.com/Azure/azure-powershell/blob/master/documentation/development-docs/cleaning-up-commits.md). ### Testing Guidelines - [x] Pull request includes test coverage for the included changes. --- .../open_model_llm_on_vscode_promptflow.png | Bin 0 -> 72598 bytes .../open_source_llm_on_vscode_promptflow.png | Bin 76194 -> 0 bytes docs/reference/index.md | 2 +- ...rce_llm_tool.md => open_model_llm_tool.md} | 22 ++-- .../promptflow/tools/exception.py | 8 +- .../{open_source_llm.py => open_model_llm.py} | 109 +++++++++--------- ...en_source_llm.yaml => open_model_llm.yaml} | 14 +-- src/promptflow-tools/tests/conftest.py | 8 +- ...n_source_llm.py => test_open_model_llm.py} | 94 +++++++-------- 9 files changed, 131 insertions(+), 126 deletions(-) create mode 100644 docs/media/reference/tools-reference/open_model_llm_on_vscode_promptflow.png delete mode 100644 docs/media/reference/tools-reference/open_source_llm_on_vscode_promptflow.png rename docs/reference/tools-reference/{open_source_llm_tool.md => open_model_llm_tool.md} (70%) rename src/promptflow-tools/promptflow/tools/{open_source_llm.py => open_model_llm.py} (92%) rename src/promptflow-tools/promptflow/tools/yamls/{open_source_llm.yaml => open_model_llm.yaml} (80%) rename src/promptflow-tools/tests/{test_open_source_llm.py => test_open_model_llm.py} (86%) diff --git a/docs/media/reference/tools-reference/open_model_llm_on_vscode_promptflow.png b/docs/media/reference/tools-reference/open_model_llm_on_vscode_promptflow.png new file mode 100644 index 0000000000000000000000000000000000000000..318c5c16a67fc57ef85a9896530464d8dbc8d6a1 GIT binary patch literal 72598 zcmdSBc{r5q|35rP3rb~6vQ#9y5VA)lSwk4RFo;36vW%s|-GXjn1~DWgyRl>&BE*dB zV;PZKXslVrGGlno>At_8yYKV-p6588-|_q7_xq!xW6X73b6(f^KHu-x@;Sny4sMEFK0;L!vVLehF2kw@&wjh zCuZ>Zi0@6PKLo-pLjT90XDa*?0@=^iyLQ$5q5UH5$ZO7-#x0s=4`O*~yk{S~;y-RU z7Jb)g!rsXo(CtPyE;LW?I!VC(1?php!f1FV8OA&U{QxKg) zb)U(BzR(+#Y}ya=+`c@_X}Ptrf!{FS3JYtTC?&o3EGT>*8dFkgd55Mcxbs<;4U7vS z{#93#avK6kI}pVSK1RMjt~$j4$>KZ!qksEed-2I3NTlg;6a)D5j-{MK00Oyn)scSN zS>m6J9zq}&ng72|9OOe~)RC%QTV0`F&gJU==yH9FQBb0ysHjTDSVxKSIxfhrbZ)Uu zeru%4O~d~~W~dizrBShZq21kqevOyLe_!JjJZ7{xXn16Puc<1!G2C5=98U8^*w>`@ zQ2vx!+D}SDm+DgKCq#zb6;*>kUcDJ*#8ktLtCKu8egvc#o(@Us79cZIKVA13%R92~ zRAalH)9TgmEzm~o+hv=PEo$|L$-+L3zL4&;%Q*Y6)$6Lh-?aFtTPrm)IHXOwBK*x# z8nIIp?X^HC#vrJhqy9bWZb*ml;OB8*!WD`!UsP}c!QW4W&LmsWB7iaac_Z;k< zHb?3^U_2Iii+eD4)vM#7<-Ri;7qNN_){Trn_T5|X&iq@?pO5{hb4dgiSk1{P2eVnV{cmpt>7I-+-9+^ zg6Iu-o00Tpw%GM%ug%5LRFp@aOhnDNpZ>|0J4JGcRcZ?l_NCGY6C}%8>}JS(LH;5s zA6@N+Mi5Hsm+N3hLc30&JRHE8W^NWx4Vi|Yj|@?=*?KMV>^SNA#ftCs*ZpH*-6v2| zHr06SW>x9vYo~bdXKCsNs|V%44@&>y~rxez&BqJ2xvXEF=EwTfL+-1X$cIPkS2Dl<&Whva3_r z@y_GDVW>_l8WAcgm&ebi>k$U!y8~WurWmFxcE=p!zn3IxYy?{pvpua5_7L*~X2_4S z3tMgLe9*YFK1VFb&rI8({m4le)0b&uICukv4JMGvxa-IQaJ@t zV&k{Jy_LC!EkR|yKU2BXAsC^y)ABA-)Nc8zL)8J;y&Q-b!RTzto($aoAneWkuxY-@ zvdf+Xg-)I(6s4s?%q&lVSj_vIjQ`|lKeHZhr83{WEX}CE!X(reQ&N4K)?~J z;WmEgijCFb{XuhexETh&5z?D=HSQR{PIw{{M9cZ|q(~|*!nwYt!Lw9t^-$)ia`x{U0Rv1c2;8!UmebpiR1@-MZ+9uI|rVY=+O3c-{ls{%=7@7=xiRwcwQ}$vzG?@aes5yM zUGlt&8Im>D#wb5*i|J-5c-y@A+W$)d$A$JslF19oimqjYucA^j!wRNziKZ_E)K!9u zL(7kzQSQZVL@l}+rpUab92 z7kR8zRA$)IVYAGD95(t`k{xSaLY}DZt!^V07_+bJ;{Hf5+^>;k!&hpsO%KMx+=6fB z`o*=jN)DMJR*0=~L+h^0&64= z?oiN+1)&k1EBkvgS5{~xvvY!bcQtoox8Mtp97dPSCdy{!_IfQcsT?+!einlMN?m1{ot36-scZ3;mIU|Boe@rjwyxIW z23suabxyT49?Q)J@D})!g;v^OB6pz(lRP>15Q{B>Jfw$y;tGKb-nl3{urFlp_{R5I zl%5!aS$PyRJES~(y`a6h2&=Ejm6A+($spZ%0Aij4vdnTiHOSAW;?wJzC2X({k#>1w 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

i3&L((Q7n94sxxWVC%o~~=xqkV@nTK}fX3V0p2 zodGN;?dN|f!cz)I|Hm=?qsHb$KG~*o1mdk09V<|j!8!cr7osP_A=HCEKd;3`%5BP@ S2JKG%Fwil+QmJ(_^8W%o871fd literal 0 HcmV?d00001 diff --git a/docs/media/reference/tools-reference/open_source_llm_on_vscode_promptflow.png b/docs/media/reference/tools-reference/open_source_llm_on_vscode_promptflow.png deleted file mode 100644 index 9e79e237917c72debd1e0f3912c998eb01a00915..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76194 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

;}K_qd;K?MnlDgi?T{Cck7z}!&cv}Kh>tzx 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

-=5^q%15mw$V4n{R)ebfg8!i*A+%bgY%zc zOj9*>ZX5o(mIc@3>LFsQ&*+z2t#@P`#|CDrk=UAh^vOVwn7_6N)(49*R{?CxtQbb11L!@n!um_D(UVYzu2~7>XYw+i(^C z2#aD7977g$O^S_)eTZm#-GT9SaNG4yq%LI<3t$BW+2+MK%AtTZmf9~3#7Saf(h8Or zHDq`wvSZIP7j*G`cuSICbR6qo$BT4`j{s7c@_6c@$5c$AoQn6}dpKvdY@nGWf@lm@ zgwp0coX5uSVkUFN;^sbkn!V?|8XbD zt$F|9u=!4NskS@xk`4sz*A0uFV|Ud^k?Hn$zSBtea%cC|BC_%DNrVC;*14W$6Lc)q zX6(F7Ku%p8Gu*bGhXEDy3c@79|3hzDfuB)8m+5ZqH_?8@yUD*hE$kQkaRx2loTqQk zr&GmfDfxde6yB>a*DDu+-+EASLtnQQxsdKY;~cfWVdOUB&y=jt!`&9rt8B0!e3b42 zW2bRAJGyI8s6F%nxULM{|Ia|_u7=c1b%R-rR?$ z_~zTXb<2PNo>^YtDFXgEkn!=`Om76Fu6Dm)(OH}kWf!m&urwG&s@CsiuIDD@`&YgJ z=vb9?JAww`heK}!*5dRpIiJ4#2pVuQ9_1eti<(R7V(ULj@Tu1s?7~Pxtnm)&GN@-f zab+!tX!Niq9@4DPwIR{!5nbAlK=6x7z5#UCh`YJKHSvJCB(PcdXNw2$@LL3ggBOQRGFX=CLD34N^oHP_iWZZU zw#qhqo1fd(9sKe+UfCE|cTJrCBAzlz=NOP&EAHg(80{g6Qou9)z<+vTjS% z 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 diff --git a/docs/reference/index.md b/docs/reference/index.md index 0ceb9cae01d..598dba9c944 100644 --- a/docs/reference/index.md +++ b/docs/reference/index.md @@ -37,7 +37,7 @@ tools-reference/serp-api-tool tools-reference/faiss_index_lookup_tool tools-reference/vector_db_lookup_tool tools-reference/embedding_tool -tools-reference/open_source_llm_tool +tools-reference/open_model_llm_tool tools-reference/openai-gpt-4v-tool tools-reference/contentsafety_text_tool ``` diff --git a/docs/reference/tools-reference/open_source_llm_tool.md b/docs/reference/tools-reference/open_model_llm_tool.md similarity index 70% rename from docs/reference/tools-reference/open_source_llm_tool.md rename to docs/reference/tools-reference/open_model_llm_tool.md index 6825b5fa242..1c4f4894479 100644 --- a/docs/reference/tools-reference/open_source_llm_tool.md +++ b/docs/reference/tools-reference/open_model_llm_tool.md @@ -1,23 +1,23 @@ -# Open Source LLM +# Open Model LLM ## Introduction -The Open Source LLM tool enables the utilization of a variety of Open Source and Foundational Models, such as [Falcon](https://ml.azure.com/models/tiiuae-falcon-7b/version/4/catalog/registry/azureml) and [Llama 2](https://ml.azure.com/models/Llama-2-7b-chat/version/14/catalog/registry/azureml-meta), for natural language processing in Azure ML Prompt Flow. +The Open Model LLM tool enables the utilization of a variety of Open Model and Foundational Models, such as [Falcon](https://ml.azure.com/models/tiiuae-falcon-7b/version/4/catalog/registry/azureml) and [Llama 2](https://ml.azure.com/models/Llama-2-7b-chat/version/14/catalog/registry/azureml-meta), for natural language processing in Azure ML Prompt Flow. Here's how it looks in action on the Visual Studio Code prompt flow extension. In this example, the tool is being used to call a LlaMa-2 chat endpoint and asking "What is CI?". -![Screenshot of the Open Source LLM On VScode Prompt Flow extension](../../media/reference/tools-reference/open_source_llm_on_vscode_promptflow.png) +![Screenshot of the Open Model LLM On VScode Prompt Flow extension](../../media/reference/tools-reference/open_model_llm_on_vscode_promptflow.png) This prompt flow tool supports two different LLM API types: - **Chat**: Shown in the example above. The chat API type facilitates interactive conversations with text-based inputs and responses. - **Completion**: The Completion API type is used to generate single response text completions based on provided prompt input. -## Quick Overview: How do I use Open Source LLM Tool? +## Quick Overview: How do I use Open Model LLM Tool? 1. Choose a Model from the AzureML Model Catalog and get it deployed. 2. Connect to the model deployment. -3. Configure the open source llm tool settings. +3. Configure the open model llm tool settings. 4. Prepare the Prompt with [guidance](./prompt-tool.md#how-to-write-prompt). 5. Run the flow. @@ -35,15 +35,15 @@ In order for prompt flow to use your deployed model, you will need to connect to ### 1. Endpoint Connections -Once associated to a AzureML or Azure AI Studio workspace, the Open Source LLM tool can use the endpoints on that workspace. +Once associated to a AzureML or Azure AI Studio workspace, the Open Model LLM tool can use the endpoints on that workspace. 1. **Using AzureML or Azure AI Studio workspaces**: If you are using prompt flow in one of the web page based browsers workspaces, the online endpoints available on that workspace will automatically who up. -2. **Using VScode or Code First**: If you are using prompt flow in VScode or one of the Code First offerings, you will need to connect to the workspace. The Open Source LLM tool uses the azure.identity DefaultAzureCredential client for authorization. One way is through [setting environment credential values](https://learn.microsoft.com/en-us/python/api/azure-identity/azure.identity.environmentcredential?view=azure-python). +2. **Using VScode or Code First**: If you are using prompt flow in VScode or one of the Code First offerings, you will need to connect to the workspace. The Open Model LLM tool uses the azure.identity DefaultAzureCredential client for authorization. One way is through [setting environment credential values](https://learn.microsoft.com/en-us/python/api/azure-identity/azure.identity.environmentcredential?view=azure-python). ### 2. Custom Connections -The Open Source LLM tool uses the CustomConnection. Prompt flow supports two types of connections: +The Open Model LLM tool uses the CustomConnection. Prompt flow supports two types of connections: 1. **Workspace Connections** - These are connections which are stored as secrets on an Azure Machine Learning workspace. While these can be used, in many places, the are commonly created and maintained in the Studio UI. @@ -64,7 +64,7 @@ The required keys to set are: ## Running the Tool: Inputs -The Open Source LLM tool has a number of parameters, some of which are required. Please see the below table for details, you can match these to the screen shot above for visual clarity. +The Open Model LLM tool has a number of parameters, some of which are required. Please see the below table for details, you can match these to the screen shot above for visual clarity. | Name | Type | Description | Required | |------|------|-------------|----------| @@ -83,3 +83,7 @@ The Open Source LLM tool has a number of parameters, some of which are required. |------------|-------------|------------------------------------------| | Completion | string | The text of one predicted completion | | Chat | string | The text of one response int the conversation | + +## Deploying to an Online Endpoint + +When deploying a flow containing the Open Model LLM tool to an online endpoint, there is an additional step to setup permissions. During deployment through the web pages, there is a choice between System-assigned and User-assigned Identity types. Either way, using the Azure Portal (or a similar functionality), add the "Reader" Job function role to the identity on the Azure Machine Learning workspace or Ai Studio project which is hosting the endpoint. The prompt flow deployment may need to be refreshed. diff --git a/src/promptflow-tools/promptflow/tools/exception.py b/src/promptflow-tools/promptflow/tools/exception.py index b9850072105..4bcdab2ee41 100644 --- a/src/promptflow-tools/promptflow/tools/exception.py +++ b/src/promptflow-tools/promptflow/tools/exception.py @@ -144,21 +144,21 @@ def __init__(self, **kwargs): super().__init__(**kwargs, target=ErrorTarget.TOOL) -class OpenSourceLLMOnlineEndpointError(UserErrorException): +class OpenModelLLMOnlineEndpointError(UserErrorException): """Base exception raised when the call to an online endpoint failed.""" def __init__(self, **kwargs): super().__init__(**kwargs, target=ErrorTarget.TOOL) -class OpenSourceLLMUserError(UserErrorException): - """Base exception raised when the call to Open Source LLM failed with a user error.""" +class OpenModelLLMUserError(UserErrorException): + """Base exception raised when the call to Open Model LLM failed with a user error.""" def __init__(self, **kwargs): super().__init__(**kwargs, target=ErrorTarget.TOOL) -class OpenSourceLLMKeyValidationError(ToolValidationError): +class OpenModelLLMKeyValidationError(ToolValidationError): """Base exception raised when failed to validate functions when call chat api.""" def __init__(self, **kwargs): diff --git a/src/promptflow-tools/promptflow/tools/open_source_llm.py b/src/promptflow-tools/promptflow/tools/open_model_llm.py similarity index 92% rename from src/promptflow-tools/promptflow/tools/open_source_llm.py rename to src/promptflow-tools/promptflow/tools/open_model_llm.py index 9515a510400..84c5c28a0e0 100644 --- a/src/promptflow-tools/promptflow/tools/open_source_llm.py +++ b/src/promptflow-tools/promptflow/tools/open_model_llm.py @@ -18,9 +18,9 @@ from promptflow.contracts.types import PromptTemplate from promptflow.tools.common import render_jinja_template, validate_role from promptflow.tools.exception import ( - OpenSourceLLMOnlineEndpointError, - OpenSourceLLMUserError, - OpenSourceLLMKeyValidationError, + OpenModelLLMOnlineEndpointError, + OpenModelLLMUserError, + OpenModelLLMKeyValidationError, ChatAPIInvalidRole ) @@ -44,11 +44,11 @@ def wrapper(*args, **kwargs): for i in range(max_retries): try: return func(*args, **kwargs) - except OpenSourceLLMOnlineEndpointError as e: + except OpenModelLLMOnlineEndpointError as e: if i == max_retries - 1: error_message = f"Exception hit calling Online Endpoint: {type(e).__name__}: {str(e)}" print(error_message, file=sys.stderr) - raise OpenSourceLLMOnlineEndpointError(message=error_message) + raise OpenModelLLMOnlineEndpointError(message=error_message) delay *= exponential_base time.sleep(delay) @@ -93,11 +93,11 @@ class Endpoint: def __init__(self, endpoint_name: str, endpoint_url: str, - endpoint_key: str): + endpoint_api_key: str): self.deployments: List[Deployment] = [] self.default_deployment: Deployment = None self.endpoint_url = endpoint_url - self.endpoint_key = endpoint_key + self.endpoint_api_key = endpoint_api_key self.endpoint_name = endpoint_name @@ -221,13 +221,13 @@ def get_serverless_endpoint_key(self, serverless_endpoint_name) endpoint_url = try_get_from_dict(endpoint, ['properties', 'inferenceEndpoint', 'uri']) model_family = self._validate_model_family(endpoint) - endpoint_key = self._list_endpoint_key(token, - subscription_id, - resource_group, - workspace_name, - serverless_endpoint_name)['primaryKey'] + endpoint_api_key = self._list_endpoint_key(token, + subscription_id, + resource_group, + workspace_name, + serverless_endpoint_name)['primaryKey'] return (endpoint_url, - endpoint_key, + endpoint_api_key, model_family) @@ -334,7 +334,7 @@ def get_endpoint_from_custom_connection(self, connection: CustomConnection) -> T for key in REQUIRED_CONFIG_KEYS: if key not in conn_dict: accepted_keys = ",".join([key for key in REQUIRED_CONFIG_KEYS]) - raise OpenSourceLLMKeyValidationError( + raise OpenModelLLMKeyValidationError( message=f"""Required key `{key}` not found in given custom connection. Required keys are: {accepted_keys}.""" ) @@ -342,7 +342,7 @@ def get_endpoint_from_custom_connection(self, connection: CustomConnection) -> T for key in REQUIRED_SECRET_KEYS: if key not in conn_dict: accepted_keys = ",".join([key for key in REQUIRED_SECRET_KEYS]) - raise OpenSourceLLMKeyValidationError( + raise OpenModelLLMKeyValidationError( message=f"""Required secret key `{key}` not found in given custom connection. Required keys are: {accepted_keys}.""" ) @@ -389,7 +389,7 @@ def get_ml_client(self, message = "Unable to connect to AzureML. Please ensure the following environment variables are set: " message += ",".join(ENDPOINT_REQUIRED_ENV_VARS) message += "\nException: " + str(e) - raise OpenSourceLLMOnlineEndpointError(message=message) + raise OpenModelLLMOnlineEndpointError(message=message) def get_endpoints_and_deployments(self, credential, @@ -404,7 +404,7 @@ def get_endpoints_and_deployments(self, endpoint = Endpoint( endpoint_name=ep.name, endpoint_url=ep.scoring_uri, - endpoint_key=ml_client.online_endpoints.get_keys(ep.name).primary_key) + endpoint_api_key=ml_client.online_endpoints.get_keys(ep.name).primary_key) ordered_deployment_names = sorted(ep.traffic, key=lambda item: item[1]) deployments = ml_client.online_deployments.list(ep.name) @@ -653,7 +653,7 @@ def validate_model_family(model_family: str): return ModelFamily[model_family] except KeyError: accepted_models = ",".join([model.name for model in ModelFamily]) - raise OpenSourceLLMKeyValidationError( + raise OpenModelLLMKeyValidationError( message=f"""Given model_family '{model_family}' not recognized. Supported models are: {accepted_models}.""" ) @@ -718,11 +718,11 @@ def parse_chat(chat_str: str) -> List[Dict[str, str]]: try: validate_role(role, VALID_LLAMA_ROLES) except ChatAPIInvalidRole as e: - raise OpenSourceLLMUserError(message=e.message) + raise OpenModelLLMUserError(message=e.message) if len(chunks) <= index + 1: message = "Unexpected chat format. Please ensure the query matches the chat format of the model used." - raise OpenSourceLLMUserError(message=message) + raise OpenModelLLMUserError(message=message) chat_list.append({ "role": role, @@ -812,7 +812,7 @@ def format_response_payload(self, output: bytes) -> str: else: error_message = f"Unexpected response format. Response: {response_json}" print(error_message, file=sys.stderr) - raise OpenSourceLLMOnlineEndpointError(message=error_message) + raise OpenModelLLMOnlineEndpointError(message=error_message) class ServerlessLlamaContentFormatter(ContentFormatterBase): @@ -857,7 +857,7 @@ def format_response_payload(self, output: bytes) -> str: else: error_message = f"Unexpected response format. Response: {response_json}" print(error_message, file=sys.stderr) - raise OpenSourceLLMOnlineEndpointError(message=error_message) + raise OpenModelLLMOnlineEndpointError(message=error_message) class ContentFormatterFactory: @@ -916,7 +916,7 @@ def _call_endpoint(self, request_body: str) -> str: headers = { "Content-Type": "application/json", "Authorization": ("Bearer " + self.endpoint_api_key), - "x-ms-user-agent": "PromptFlow/OpenSourceLLM/" + self.model_family + "x-ms-user-agent": "PromptFlow/OpenModelLLM/" + self.model_family } # If this is not set it'll use the default deployment on the endpoint. @@ -928,7 +928,7 @@ def _call_endpoint(self, request_body: str) -> str: error_message = f"""Request failure while calling Online Endpoint Status:{result.status_code} Error:{result.text}""" print(error_message, file=sys.stderr) - raise OpenSourceLLMOnlineEndpointError(message=error_message) + raise OpenModelLLMOnlineEndpointError(message=error_message) return result.text @@ -953,7 +953,7 @@ def __call__( return response -class OpenSourceLLM(ToolProvider): +class OpenModelLLM(ToolProvider): def __init__(self): super().__init__() @@ -976,18 +976,18 @@ def get_deployment_from_endpoint(self, if ep.endpoint_name == endpoint_name: if deployment_name is None: return (ep.endpoint_url, - ep.endpoint_key, + ep.endpoint_api_key, ep.default_deployment.model_family) for d in ep.deployments: if d.deployment_name == deployment_name: return (ep.endpoint_url, - ep.endpoint_key, + ep.endpoint_api_key, d.model_family) message = f"""Invalid endpoint and deployment values. Please ensure endpoint name and deployment names are correct, and the deployment was successfull. Could not find endpoint: {endpoint_name} and deployment: {deployment_name}""" - raise OpenSourceLLMUserError(message=message) + raise OpenModelLLMUserError(message=message) def sanitize_endpoint_url(self, endpoint_url: str, @@ -1011,16 +1011,16 @@ def get_endpoint_details(self, deployment_name: str = None, **kwargs) -> Tuple[str, str, str]: if self.endpoint_values_in_kwargs(**kwargs): - endpoint_uri = kwargs["endpoint_uri"] - endpoint_key = kwargs["endpoint_key"] + endpoint_url = kwargs["endpoint_url"] + endpoint_api_key = kwargs["endpoint_api_key"] model_family = kwargs["model_family"] # clean these up, aka don't send them to MIR - del kwargs["endpoint_uri"] - del kwargs["endpoint_key"] + del kwargs["endpoint_url"] + del kwargs["endpoint_api_key"] del kwargs["model_family"] - return (endpoint_uri, endpoint_key, model_family) + return (endpoint_url, endpoint_api_key, model_family) (endpoint_connection_type, endpoint_connection_name) = parse_endpoint_connection_type(endpoint) print(f"endpoint_connection_type: {endpoint_connection_type} name: {endpoint_connection_name}", file=sys.stdout) @@ -1035,25 +1035,26 @@ def get_endpoint_details(self, message = f"""Error encountered while attempting to Authorize access to {endpoint}. Exception: {e}""" print(message, file=sys.stderr) - raise OpenSourceLLMUserError(message=message) + raise OpenModelLLMUserError(message=message) if con_type == "serverlessendpoint": - (endpoint_url, endpoint_key, model_family) = SERVERLESS_ENDPOINT_CONTAINER.get_serverless_endpoint_key( + (endpoint_url, endpoint_api_key, model_family) = SERVERLESS_ENDPOINT_CONTAINER.get_serverless_endpoint_key( token, subscription_id, resource_group_name, workspace_name, endpoint_connection_name) elif con_type == "onlineendpoint": - (endpoint_url, endpoint_key, model_family) = self.get_deployment_from_endpoint(credential, - subscription_id, - resource_group_name, - workspace_name, - endpoint_connection_name, - deployment_name) + (endpoint_url, endpoint_api_key, model_family) = self.get_deployment_from_endpoint( + credential, + subscription_id, + resource_group_name, + workspace_name, + endpoint_connection_name, + deployment_name) elif con_type == "connection": (endpoint_url, - endpoint_key, + endpoint_api_key, model_family) = CUSTOM_CONNECTION_CONTAINER.get_endpoint_from_azure_custom_connection( credential, subscription_id, @@ -1062,22 +1063,22 @@ def get_endpoint_details(self, endpoint_connection_name) elif con_type == "localconnection": (endpoint_url, - endpoint_key, + endpoint_api_key, model_family) = CUSTOM_CONNECTION_CONTAINER.get_endpoint_from_local_custom_connection( endpoint_connection_name) else: - raise OpenSourceLLMUserError(message=f"Invalid endpoint connection type: {endpoint_connection_type}") - return (self.sanitize_endpoint_url(endpoint_url, api_type), endpoint_key, model_family) + raise OpenModelLLMUserError(message=f"Invalid endpoint connection type: {endpoint_connection_type}") + return (self.sanitize_endpoint_url(endpoint_url, api_type), endpoint_api_key, model_family) def endpoint_values_in_kwargs(self, **kwargs): # This is mostly for testing, suggest not using this since security\privacy concerns for the endpoint key - if 'endpoint_uri' not in kwargs and 'endpoint_key' not in kwargs and 'model_family' not in kwargs: + if 'endpoint_url' not in kwargs and 'endpoint_api_key' not in kwargs and 'model_family' not in kwargs: return False - if 'endpoint_uri' not in kwargs or 'endpoint_key' not in kwargs or 'model_family' not in kwargs: + if 'endpoint_url' not in kwargs or 'endpoint_api_key' not in kwargs or 'model_family' not in kwargs: message = """Endpoint connection via kwargs not fully set. -If using kwargs, the following values must be set: endpoint_uri, endpoint_key, and model_family""" - raise OpenSourceLLMKeyValidationError(message=message) +If using kwargs, the following values must be set: endpoint_url, endpoint_api_key, and model_family""" + raise OpenModelLLMKeyValidationError(message=message) return True @@ -1101,10 +1102,10 @@ def call( if not deployment_name or deployment_name == DEPLOYMENT_DEFAULT: deployment_name = None - print(f"Executing Open Source LLM Tool for endpoint: '{endpoint_name}', deployment: '{deployment_name}'", + print(f"Executing Open Model LLM Tool for endpoint: '{endpoint_name}', deployment: '{deployment_name}'", file=sys.stdout) - (endpoint_uri, endpoint_key, model_family) = self.get_endpoint_details( + (endpoint_url, endpoint_api_key, model_family) = self.get_endpoint_details( subscription_id=os.getenv("AZUREML_ARM_SUBSCRIPTION", None), resource_group_name=os.getenv("AZUREML_ARM_RESOURCEGROUP", None), workspace_name=os.getenv("AZUREML_ARM_WORKSPACE_NAME", None), @@ -1123,12 +1124,12 @@ def call( model_family=model_family, api=api, chat_history=prompt, - endpoint_url=endpoint_uri + endpoint_url=endpoint_url ) llm = AzureMLOnlineEndpoint( - endpoint_url=endpoint_uri, - endpoint_api_key=endpoint_key, + endpoint_url=endpoint_url, + endpoint_api_key=endpoint_api_key, model_family=model_family, content_formatter=content_formatter, deployment_name=deployment_name, diff --git a/src/promptflow-tools/promptflow/tools/yamls/open_source_llm.yaml b/src/promptflow-tools/promptflow/tools/yamls/open_model_llm.yaml similarity index 80% rename from src/promptflow-tools/promptflow/tools/yamls/open_source_llm.yaml rename to src/promptflow-tools/promptflow/tools/yamls/open_model_llm.yaml index 61a942e2eff..05ae6c71165 100644 --- a/src/promptflow-tools/promptflow/tools/yamls/open_source_llm.yaml +++ b/src/promptflow-tools/promptflow/tools/yamls/open_model_llm.yaml @@ -1,17 +1,17 @@ -promptflow.tools.open_source_llm.OpenSourceLLM.call: - name: Open Source LLM - description: Use an Open Source model from the Azure Model catalog, deployed to an AzureML Online Endpoint for LLM Chat or Completion API calls. +promptflow.tools.open_model_llm.OpenModelLLM.call: + name: Open Model LLM + description: Use an open model from the Azure Model catalog, deployed to an AzureML Online Endpoint for LLM Chat or Completion API calls. icon: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACgElEQVR4nGWSz2vcVRTFP/e9NzOZ1KDGohASslLEH6VLV0ak4l/QpeDCrfQPcNGliODKnVm4EBdBsIjQIlhciKW0ycKFVCSNbYnjdDLtmPnmO/nO9917XcxMkjYX3uLx7nnn3HOuMK2Nix4fP78ZdrYXVkLVWjf3l3B1B+HpcjzGFtmqa6cePz7/x0dnn1n5qhj3iBJPYREIURAJuCtpY8PjReDbrf9WG7H1fuefwQU9qKztTcMJT+PNnEFvjGVDBDlSsH6p/9MLzy6+NxwVqI8RAg4IPmWedMckdLYP6O6UpIaQfvyyXG012+e79/ZfHukoS1ISMT2hGTB1RkUmNgQ5QZ0w+a2VWDq73MbdEWmfnnv6UWe7oNzPaLapl5CwuLTXK9WUGBuCjqekzhP+z52ZXOrKMD3OJg0Hh778aiOuvpnYvp05d6GJO4iAO4QAe/eV36/X5LFRV4Zmn+AdkqlL8Vjp3oVioOz+WTPzzYEgsN+fgPLYyJVheSbPPVl2ikeGZRjtG52/8rHuaV9VOlpP2OtKyVndcRVCSqOhsvxa4vW359i6OuKdD+aP8Q4SYPdOzS/flGjt1JUSaMqZ5nwa1Y8qWb/Ud/eZZkHisYezEM0m+fcelDr8F1SqW2LNK6r1jXQwyLzy1hxvrLXZulry7ocL+FS6G4QIu3fG/Px1gdYeW7LIgXU2P/115TOA5G7e3Rmj2aS/m7l5pThiZzrCcE/d1XHzbln373nw7y6veeoUm5KCNKT/IPPwbiY1hYd/l5MIT65BMFt87sU4v9D7/JMflr44uV6hGh1+L4RCkg6z5iK2tAhNLeLsNGwYA4fDYnC/drvuuFxe86NV/x+Ut27g0FvykgAAAABJRU5ErkJggg== type: custom_llm - module: promptflow.tools.open_source_llm - class_name: OpenSourceLLM + module: promptflow.tools.open_model_llm + class_name: OpenModelLLM function: call inputs: endpoint_name: type: - string dynamic_list: - func_path: promptflow.tools.open_source_llm.list_endpoint_names + func_path: promptflow.tools.open_model_llm.list_endpoint_names allow_manual_entry: true # Allow the user to clear this field is_multi_select: false deployment_name: @@ -19,7 +19,7 @@ promptflow.tools.open_source_llm.OpenSourceLLM.call: type: - string dynamic_list: - func_path: promptflow.tools.open_source_llm.list_deployment_names + func_path: promptflow.tools.open_model_llm.list_deployment_names func_kwargs: - name: endpoint type: diff --git a/src/promptflow-tools/tests/conftest.py b/src/promptflow-tools/tests/conftest.py index cec414bad16..725e0c784c3 100644 --- a/src/promptflow-tools/tests/conftest.py +++ b/src/promptflow-tools/tests/conftest.py @@ -48,7 +48,7 @@ def serp_connection(): return ConnectionManager().get("serp_connection") -def verify_oss_llm_custom_connection(connection: CustomConnection) -> bool: +def verify_om_llm_custom_connection(connection: CustomConnection) -> bool: '''Verify that there is a MIR endpoint up and available for the Custom Connection. We explicitly do not pass the endpoint key to avoid the delay in generating a response. ''' @@ -66,7 +66,7 @@ def llama_chat_custom_connection(): @pytest.fixture -def open_source_llm_ws_service_connection() -> bool: +def open_model_llm_ws_service_connection() -> bool: try: creds_custom_connection: CustomConnection = ConnectionManager().get("open_source_llm_ws_service_connection") subs = json.loads(creds_custom_connection.secrets['service_credential']) @@ -92,9 +92,9 @@ def skip_if_no_api_key(request, mocker): elif isinstance(connection, CustomConnection): if "endpoint_api_key" not in connection.secrets or "-api-key" in connection.secrets["endpoint_api_key"]: pytest.skip('skipped because no key') - # Verify Custom Connections, but only those used by the Open_Source_LLM Tool + # Verify Custom Connections, but only those used by the Open_Model_LLM Tool if "endpoint_url" in connection.configs and "-endpoint-url" not in connection.configs["endpoint_url"]: - if not verify_oss_llm_custom_connection(connection): + if not verify_om_llm_custom_connection(connection): pytest.skip('skipped because the connection is not valid') diff --git a/src/promptflow-tools/tests/test_open_source_llm.py b/src/promptflow-tools/tests/test_open_model_llm.py similarity index 86% rename from src/promptflow-tools/tests/test_open_source_llm.py rename to src/promptflow-tools/tests/test_open_model_llm.py index 19a3fec22b7..d14727b6ebc 100644 --- a/src/promptflow-tools/tests/test_open_source_llm.py +++ b/src/promptflow-tools/tests/test_open_model_llm.py @@ -6,11 +6,11 @@ from typing import List, Dict from promptflow.tools.exception import ( - OpenSourceLLMUserError, - OpenSourceLLMKeyValidationError + OpenModelLLMUserError, + OpenModelLLMKeyValidationError ) -from promptflow.tools.open_source_llm import ( - OpenSourceLLM, +from promptflow.tools.open_model_llm import ( + OpenModelLLM, API, ContentFormatterBase, LlamaContentFormatter, @@ -28,7 +28,7 @@ def validate_response(response): def verify_prompt_role_delimiters(message: str, codes: List[str]): - assert codes == "UserError/OpenSourceLLMUserError".split("/") + assert codes == "UserError/OpenModelLLMUserError".split("/") message_pattern = re.compile( r"The Chat API requires a specific format for prompt definition, and the prompt should include separate " @@ -42,10 +42,10 @@ def verify_prompt_role_delimiters(message: str, codes: List[str]): @pytest.fixture -def verify_service_endpoints(open_source_llm_ws_service_connection) -> Dict[str, List[str]]: - if not open_source_llm_ws_service_connection: +def verify_service_endpoints(open_model_llm_ws_service_connection) -> Dict[str, List[str]]: + if not open_model_llm_ws_service_connection: pytest.skip("Service Credential not available") - print("open_source_llm_ws_service_connection completed") + print("open_model_llm_ws_service_connection completed") required_env_vars = ["AZUREML_ARM_SUBSCRIPTION", "AZUREML_ARM_RESOURCEGROUP", "AZUREML_ARM_WORKSPACE_NAME", "AZURE_CLIENT_ID", "AZURE_TENANT_ID", "AZURE_CLIENT_SECRET"] for rev in required_env_vars: @@ -103,8 +103,8 @@ def completion_endpoints_provider(endpoints_provider: Dict[str, List[str]]) -> D @pytest.mark.usefixtures("use_secrets_config_file") -class TestOpenSourceLLM: - stateless_os_llm = OpenSourceLLM() +class TestOpenModelLLM: + stateless_os_llm = OpenModelLLM() gpt2_connection = "connection/gpt2_connection" llama_connection = "connection/llama_chat_connection" llama_serverless_connection = "connection/llama_chat_serverless" @@ -118,14 +118,14 @@ class TestOpenSourceLLM: user: """ + completion_prompt - def test_open_source_llm_completion(self, verify_service_endpoints): + def test_open_model_llm_completion(self, verify_service_endpoints): response = self.stateless_os_llm.call( self.completion_prompt, API.COMPLETION, endpoint_name=self.gpt2_connection) validate_response(response) - def test_open_source_llm_completion_with_deploy(self, verify_service_endpoints): + def test_open_model_llm_completion_with_deploy(self, verify_service_endpoints): response = self.stateless_os_llm.call( self.completion_prompt, API.COMPLETION, @@ -133,14 +133,14 @@ def test_open_source_llm_completion_with_deploy(self, verify_service_endpoints): deployment_name="gpt2-10") validate_response(response) - def test_open_source_llm_chat(self, verify_service_endpoints): + def test_open_model_llm_chat(self, verify_service_endpoints): response = self.stateless_os_llm.call( self.chat_prompt, API.CHAT, endpoint_name=self.gpt2_connection) validate_response(response) - def test_open_source_llm_chat_with_deploy(self, verify_service_endpoints): + def test_open_model_llm_chat_with_deploy(self, verify_service_endpoints): response = self.stateless_os_llm.call( self.chat_prompt, API.CHAT, @@ -148,7 +148,7 @@ def test_open_source_llm_chat_with_deploy(self, verify_service_endpoints): deployment_name="gpt2-10") validate_response(response) - def test_open_source_llm_chat_with_max_length(self, verify_service_endpoints): + def test_open_model_llm_chat_with_max_length(self, verify_service_endpoints): response = self.stateless_os_llm.call( self.chat_prompt, API.CHAT, @@ -158,49 +158,49 @@ def test_open_source_llm_chat_with_max_length(self, verify_service_endpoints): validate_response(response) @pytest.mark.skip_if_no_api_key("gpt2_custom_connection") - def test_open_source_llm_con_url_chat(self, gpt2_custom_connection): + def test_open_model_llm_con_url_chat(self, gpt2_custom_connection): tmp = copy.deepcopy(gpt2_custom_connection) del tmp.configs['endpoint_url'] - with pytest.raises(OpenSourceLLMKeyValidationError) as exc_info: + with pytest.raises(OpenModelLLMKeyValidationError) as exc_info: customConnectionsContainer = CustomConnectionsContainer() customConnectionsContainer.get_endpoint_from_custom_connection(connection=tmp) assert exc_info.value.message == """Required key `endpoint_url` not found in given custom connection. Required keys are: endpoint_url,model_family.""" - assert exc_info.value.error_codes == "UserError/ToolValidationError/OpenSourceLLMKeyValidationError".split("/") + assert exc_info.value.error_codes == "UserError/ToolValidationError/OpenModelLLMKeyValidationError".split("/") @pytest.mark.skip_if_no_api_key("gpt2_custom_connection") - def test_open_source_llm_con_key_chat(self, gpt2_custom_connection): + def test_open_model_llm_con_key_chat(self, gpt2_custom_connection): tmp = copy.deepcopy(gpt2_custom_connection) del tmp.secrets['endpoint_api_key'] - with pytest.raises(OpenSourceLLMKeyValidationError) as exc_info: + with pytest.raises(OpenModelLLMKeyValidationError) as exc_info: customConnectionsContainer = CustomConnectionsContainer() customConnectionsContainer.get_endpoint_from_custom_connection(connection=tmp) assert exc_info.value.message == ( "Required secret key `endpoint_api_key` " + """not found in given custom connection. Required keys are: endpoint_api_key.""") - assert exc_info.value.error_codes == "UserError/ToolValidationError/OpenSourceLLMKeyValidationError".split("/") + assert exc_info.value.error_codes == "UserError/ToolValidationError/OpenModelLLMKeyValidationError".split("/") @pytest.mark.skip_if_no_api_key("gpt2_custom_connection") - def test_open_source_llm_con_model_chat(self, gpt2_custom_connection): + def test_open_model_llm_con_model_chat(self, gpt2_custom_connection): tmp = copy.deepcopy(gpt2_custom_connection) del tmp.configs['model_family'] - with pytest.raises(OpenSourceLLMKeyValidationError) as exc_info: + with pytest.raises(OpenModelLLMKeyValidationError) as exc_info: customConnectionsContainer = CustomConnectionsContainer() customConnectionsContainer.get_endpoint_from_custom_connection(connection=tmp) assert exc_info.value.message == """Required key `model_family` not found in given custom connection. Required keys are: endpoint_url,model_family.""" - assert exc_info.value.error_codes == "UserError/ToolValidationError/OpenSourceLLMKeyValidationError".split("/") + assert exc_info.value.error_codes == "UserError/ToolValidationError/OpenModelLLMKeyValidationError".split("/") - def test_open_source_llm_escape_chat(self): + def test_open_model_llm_escape_chat(self): danger = r"The quick \brown fox\tjumped\\over \the \\boy\r\n" out_of_danger = ContentFormatterBase.escape_special_characters(danger) assert out_of_danger == "The quick \\brown fox\\tjumped\\\\over \\the \\\\boy\\r\\n" - def test_open_source_llm_llama_parse_chat_with_chat(self): + def test_open_model_llm_llama_parse_chat_with_chat(self): LlamaContentFormatter.parse_chat(self.chat_prompt) - def test_open_source_llm_llama_parse_multi_turn(self): + def test_open_model_llm_llama_parse_multi_turn(self): multi_turn_chat = """user: You are a AI which helps Customers answer questions. @@ -214,7 +214,7 @@ def test_open_source_llm_llama_parse_multi_turn(self): """ LlamaContentFormatter.parse_chat(multi_turn_chat) - def test_open_source_llm_llama_parse_ignore_whitespace(self): + def test_open_model_llm_llama_parse_ignore_whitespace(self): bad_chat_prompt = f"""system: You are a AI which helps Customers answer questions. @@ -222,16 +222,16 @@ def test_open_source_llm_llama_parse_ignore_whitespace(self): user: {self.completion_prompt}""" - with pytest.raises(OpenSourceLLMUserError) as exc_info: + with pytest.raises(OpenModelLLMUserError) as exc_info: LlamaContentFormatter.parse_chat(bad_chat_prompt) verify_prompt_role_delimiters(exc_info.value.message, exc_info.value.error_codes) - def test_open_source_llm_llama_parse_chat_with_comp(self): - with pytest.raises(OpenSourceLLMUserError) as exc_info: + def test_open_model_llm_llama_parse_chat_with_comp(self): + with pytest.raises(OpenModelLLMUserError) as exc_info: LlamaContentFormatter.parse_chat(self.completion_prompt) verify_prompt_role_delimiters(exc_info.value.message, exc_info.value.error_codes) - def test_open_source_llm_chat_endpoint_name(self, chat_endpoints_provider): + def test_open_model_llm_chat_endpoint_name(self, chat_endpoints_provider): for endpoint_name in chat_endpoints_provider: response = self.stateless_os_llm.call( self.chat_prompt, @@ -239,7 +239,7 @@ def test_open_source_llm_chat_endpoint_name(self, chat_endpoints_provider): endpoint_name=f"onlineEndpoint/{endpoint_name}") validate_response(response) - def test_open_source_llm_chat_endpoint_name_with_deployment(self, chat_endpoints_provider): + def test_open_model_llm_chat_endpoint_name_with_deployment(self, chat_endpoints_provider): for endpoint_name in chat_endpoints_provider: for deployment_name in chat_endpoints_provider[endpoint_name]: response = self.stateless_os_llm.call( @@ -249,7 +249,7 @@ def test_open_source_llm_chat_endpoint_name_with_deployment(self, chat_endpoints deployment_name=deployment_name) validate_response(response) - def test_open_source_llm_completion_endpoint_name(self, completion_endpoints_provider): + def test_open_model_llm_completion_endpoint_name(self, completion_endpoints_provider): for endpoint_name in completion_endpoints_provider: response = self.stateless_os_llm.call( self.completion_prompt, @@ -257,7 +257,7 @@ def test_open_source_llm_completion_endpoint_name(self, completion_endpoints_pro endpoint_name=f"onlineEndpoint/{endpoint_name}") validate_response(response) - def test_open_source_llm_completion_endpoint_name_with_deployment(self, completion_endpoints_provider): + def test_open_model_llm_completion_endpoint_name_with_deployment(self, completion_endpoints_provider): for endpoint_name in completion_endpoints_provider: for deployment_name in completion_endpoints_provider[endpoint_name]: response = self.stateless_os_llm.call( @@ -267,18 +267,18 @@ def test_open_source_llm_completion_endpoint_name_with_deployment(self, completi deployment_name=deployment_name) validate_response(response) - def test_open_source_llm_llama_chat(self, verify_service_endpoints): + def test_open_model_llm_llama_chat(self, verify_service_endpoints): response = self.stateless_os_llm.call(self.chat_prompt, API.CHAT, endpoint_name=self.llama_connection) validate_response(response) - def test_open_source_llm_llama_serverless(self, verify_service_endpoints): + def test_open_model_llm_llama_serverless(self, verify_service_endpoints): response = self.stateless_os_llm.call( self.chat_prompt, API.CHAT, endpoint_name=self.llama_serverless_connection) validate_response(response) - def test_open_source_llm_llama_chat_history(self, verify_service_endpoints): + def test_open_model_llm_llama_chat_history(self, verify_service_endpoints): chat_history_prompt = """system: * Given the following conversation history and the users next question, answer the next question. * If the conversation is irrelevant or empty, acknowledge and ask for more input. @@ -330,7 +330,7 @@ def test_open_source_llm_llama_chat_history(self, verify_service_endpoints): chat_input="Sorry I didn't follow, could you say that again?") validate_response(response) - def test_open_source_llm_dynamic_list_ignore_deployment(self, verify_service_endpoints): + def test_open_model_llm_dynamic_list_ignore_deployment(self, verify_service_endpoints): deployments = list_deployment_names( subscription_id=os.getenv("AZUREML_ARM_SUBSCRIPTION"), resource_group_name=os.getenv("AZUREML_ARM_RESOURCEGROUP"), @@ -355,7 +355,7 @@ def test_open_source_llm_dynamic_list_ignore_deployment(self, verify_service_end assert len(deployments) == 1 assert deployments[0]['value'] == 'default' - def test_open_source_llm_dynamic_list_serverless_test(self, verify_service_endpoints): + def test_open_model_llm_dynamic_list_serverless_test(self, verify_service_endpoints): subscription_id = os.getenv("AZUREML_ARM_SUBSCRIPTION") resource_group_name = os.getenv("AZUREML_ARM_RESOURCEGROUP") workspace_name = os.getenv("AZUREML_ARM_WORKSPACE_NAME") @@ -395,7 +395,7 @@ def test_open_source_llm_dynamic_list_serverless_test(self, verify_service_endpo assert model_family == "LLaMa" assert endpoint_key == eps_keys['primaryKey'] - def test_open_source_llm_dynamic_list_custom_connections_test(self, verify_service_endpoints): + def test_open_model_llm_dynamic_list_custom_connections_test(self, verify_service_endpoints): custom_container = CustomConnectionsContainer() credential = DefaultAzureCredential(exclude_interactive_browser_credential=False) @@ -406,7 +406,7 @@ def test_open_source_llm_dynamic_list_custom_connections_test(self, verify_servi workspace_name=os.getenv("AZUREML_ARM_WORKSPACE_NAME")) assert len(connections) > 1 - def test_open_source_llm_dynamic_list_happy_path(self, verify_service_endpoints): + def test_open_model_llm_dynamic_list_happy_path(self, verify_service_endpoints): endpoints = list_endpoint_names( subscription_id=os.getenv("AZUREML_ARM_SUBSCRIPTION"), resource_group_name=os.getenv("AZUREML_ARM_RESOURCEGROUP"), @@ -466,7 +466,7 @@ def test_open_source_llm_dynamic_list_happy_path(self, verify_service_endpoints) model_kwargs={}) validate_response(response) - def test_open_source_llm_get_model_llama(self): + def test_open_model_llm_get_model_llama(self): model_assets = [ "azureml://registries/azureml-meta/models/Llama-2-7b-chat/versions/14", "azureml://registries/azureml-meta/models/Llama-2-7b/versions/12", @@ -479,7 +479,7 @@ def test_open_source_llm_get_model_llama(self): for asset_name in model_assets: assert ModelFamily.LLAMA == get_model_type(asset_name) - def test_open_source_llm_get_model_gpt2(self): + def test_open_model_llm_get_model_gpt2(self): model_assets = [ "azureml://registries/azureml-staging/models/gpt2/versions/9", "azureml://registries/azureml/models/gpt2/versions/9", @@ -490,7 +490,7 @@ def test_open_source_llm_get_model_gpt2(self): for asset_name in model_assets: assert ModelFamily.GPT2 == get_model_type(asset_name) - def test_open_source_llm_get_model_dolly(self): + def test_open_model_llm_get_model_dolly(self): model_assets = [ "azureml://registries/azureml/models/databricks-dolly-v2-12b/versions/11" ] @@ -498,7 +498,7 @@ def test_open_source_llm_get_model_dolly(self): for asset_name in model_assets: assert ModelFamily.DOLLY == get_model_type(asset_name) - def test_open_source_llm_get_model_falcon(self): + def test_open_model_llm_get_model_falcon(self): model_assets = [ "azureml://registries/azureml/models/tiiuae-falcon-40b/versions/2", "azureml://registries/azureml/models/tiiuae-falcon-40b/versions/2" @@ -507,7 +507,7 @@ def test_open_source_llm_get_model_falcon(self): for asset_name in model_assets: assert ModelFamily.FALCON == get_model_type(asset_name) - def test_open_source_llm_get_model_failure_cases(self): + def test_open_model_llm_get_model_failure_cases(self): bad_model_assets = [ "azureml://registries/azureml-meta/models/CodeLlama-7b-Instruct-hf/versions/3", "azureml://registries/azureml-staging/models/gpt-2/versions/9",