Skip to content

Commit

Permalink
Remove ANSIBLE_AI_MODEL_MESH_xxx env vars.
Browse files Browse the repository at this point in the history
  • Loading branch information
manstis committed Jan 10, 2025
1 parent 8c4d876 commit 97e2637
Show file tree
Hide file tree
Showing 13 changed files with 88 additions and 97 deletions.
40 changes: 40 additions & 0 deletions README-ANSIBLE_AI_MODEL_MESH_CONFIG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Example `ANSIBLE_AI_MODEL_MESH_CONFIG` configuration

Pay close attention to the formatting of the blocks.

Each ends with `}},` otherwise conversion of the multi-line setting to a `str` can fail.

```text
ANSIBLE_AI_MODEL_MESH_CONFIG="{
"ModelPipelineCompletions": {
"provider": "ollama",
"config": {
"inference_url": "http://host.containers.internal:11434",
"model_id": "mistral:instruct"}},
"ModelPipelineContentMatch": {
"provider": "ollama",
"config": {
"inference_url": "http://host.containers.internal:11434",
"model_id": "mistral:instruct"}},
"ModelPipelinePlaybookGeneration": {
"provider": "ollama",
"config": {
"inference_url": "http://host.containers.internal:11434",
"model_id": "mistral:instruct"}},
"ModelPipelineRoleGeneration": {
"provider": "ollama",
"config": {
"inference_url": "http://host.containers.internal:11434",
"model_id": "mistral:instruct"}},
"ModelPipelinePlaybookExplanation": {
"provider": "ollama",
"config": {
"inference_url": "http://host.containers.internal:11434",
"model_id": "mistral:instruct"}},
"ModelPipelineChatBot": {
"provider": "http",
"config": {
"inference_url": "http://localhost:8000",
"model_id": "granite3-8b"}}
}"
```
16 changes: 7 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,9 @@ SECRET_KEY="somesecretvalue"
ENABLE_ARI_POSTPROCESS="False"
WCA_SECRET_BACKEND_TYPE="dummy"
# configure model server
ANSIBLE_AI_MODEL_MESH_API_URL="http://host.containers.internal:11434"
ANSIBLE_AI_MODEL_MESH_API_TYPE="ollama"
ANSIBLE_AI_MODEL_MESH_MODEL_ID="mistral:instruct"
ANSIBLE_AI_MODEL_MESH_CONFIG="..."
```
See the example [ANSIBLE_AI_MODEL_MESH_CONFIG](README-ANSIBLE_AI_MODEL_MESH_CONFIG.md).

### Start service and dependencies

Expand Down Expand Up @@ -108,9 +107,9 @@ command line the variable `DEBUG=True`.

The Django service listens on <http://127.0.0.1:8000>.

Note that there is no pytorch service defined in the docker-compose
file. You should adjust the `ANSIBLE_AI_MODEL_MESH_API_URL`
configuration key to point on an existing service.
Note that there is no pytorch service defined in the `docker-compose`
file. You should adjust the `ANSIBLE_AI_MODEL_MESH_CONFIG`
configuration to point to an existing service.

## <a name="aws-config">Use the WCA API Keys Manager</a>

Expand Down Expand Up @@ -460,11 +459,10 @@ To connect to the Mistal 7b Instruct model running on locally on [llama.cpp](htt
```
1. Set the appropriate environment variables
```bash
ANSIBLE_AI_MODEL_MESH_API_URL=http://$YOUR_REAL_IP:8080
ANSIBLE_AI_MODEL_MESH_API_TYPE=llamacpp
ANSIBLE_AI_MODEL_MESH_MODEL_ID=mistral-7b-instruct-v0.2.Q5_K_M.gguf
ANSIBLE_AI_MODEL_MESH_CONFIG="..."
ENABLE_ARI_POSTPROCESS=False
```
See the example [ANSIBLE_AI_MODEL_MESH_CONFIG](README-ANSIBLE_AI_MODEL_MESH_CONFIG.md).

# Testing

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ def __init__(self, config: DummyConfiguration):
super().__init__(config=config)

def invoke(self, params: CompletionsParameters) -> CompletionsResponse:
logger.debug("!!!! settings.ANSIBLE_AI_MODEL_MESH_API_TYPE == 'dummy' !!!!")
logger.debug("!!!! ModelPipelineCompletions.provider == 'dummy' !!!!")
logger.debug("!!!! Mocking Model response !!!!")
if self.config.latency_use_jitter:
jitter: float = secrets.randbelow(1000) * 0.001
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,8 +108,8 @@ def __init__(self, config: WCAOnPremConfiguration):
raise WcaUsernameNotFound
if not self.config.api_key:
raise WcaKeyNotFound
# ANSIBLE_AI_MODEL_MESH_MODEL_ID cannot be validated until runtime. The
# User may provide an override value if the Environment Variable is not set.
# WCAOnPremConfiguration.model_id cannot be validated until runtime. The
# User may provide an override value if the setting is not defined.

def get_request_headers(
self, api_key: str, identifier: Optional[str]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ def get_api_key(self, user, organization_id: Optional[int]) -> str:

if organization_id is None:
logger.error(
"User does not have an organization and no ANSIBLE_AI_MODEL_MESH_API_KEY is set"
"User does not have an organization and WCASaaSConfiguration.api_key is not set"
)
raise WcaKeyNotFound

Expand Down
2 changes: 1 addition & 1 deletion ansible_ai_connect/ai/api/permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,4 +164,4 @@ class IsWCASaaSModelPipeline(permissions.BasePermission):
message = "User doesn't have access to the IBM watsonx Code Assistant."

def has_permission(self, request, view):
return CONTINUE if settings.ANSIBLE_AI_MODEL_MESH_API_TYPE == "wca" else BLOCK
return CONTINUE if settings.DEPLOYMENT_MODE == "saas" else BLOCK
4 changes: 2 additions & 2 deletions ansible_ai_connect/ai/api/tests/test_permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,10 +209,10 @@ def test_ensure_trial_user_can_pass_through_despite_trial_disabled(self):

class TestBlockUserWithoutWCASaaSConfiguration(WisdomAppsBackendMocking):

@override_settings(ANSIBLE_AI_MODEL_MESH_API_TYPE="wca")
@override_settings(DEPLOYMENT_MODE="saas")
def test_wca_saas_enabled(self):
self.assertEqual(IsWCASaaSModelPipeline().has_permission(Mock(), None), CONTINUE)

@override_settings(ANSIBLE_AI_MODEL_MESH_API_TYPE="wca-onprem")
@override_settings(DEPLOYMENT_MODE="onprem")
def test_wca_saas_not_enabled(self):
self.assertEqual(IsWCASaaSModelPipeline().has_permission(Mock(), None), BLOCK)
4 changes: 2 additions & 2 deletions ansible_ai_connect/ai/api/wca/tests/test_api_key_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
from ansible_ai_connect.test_utils import WisdomAppsBackendMocking


@override_settings(ANSIBLE_AI_MODEL_MESH_API_TYPE="wca")
@override_settings(DEPLOYMENT_MODE="saas")
@override_settings(WCA_SECRET_BACKEND_TYPE="aws_sm")
@patch.object(IsOrganisationAdministrator, "has_permission", return_value=True)
@patch.object(IsOrganisationLightspeedSubscriber, "has_permission", return_value=True)
Expand Down Expand Up @@ -547,7 +547,7 @@ def test_get_api_key_as_non_subscriber(self, *args):
self.assertEqual(r.status_code, HTTPStatus.FORBIDDEN)


@override_settings(ANSIBLE_AI_MODEL_MESH_API_TYPE="wca")
@override_settings(DEPLOYMENT_MODE="saas")
@override_settings(WCA_SECRET_BACKEND_TYPE="aws_sm")
@patch.object(IsOrganisationAdministrator, "has_permission", return_value=True)
@patch.object(IsOrganisationLightspeedSubscriber, "has_permission", return_value=True)
Expand Down
4 changes: 2 additions & 2 deletions ansible_ai_connect/ai/api/wca/tests/test_model_id_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
from ansible_ai_connect.test_utils import WisdomAppsBackendMocking, WisdomLogAwareMixin


@override_settings(ANSIBLE_AI_MODEL_MESH_API_TYPE="wca")
@override_settings(DEPLOYMENT_MODE="saas")
@override_settings(WCA_SECRET_BACKEND_TYPE="aws_sm")
@patch.object(IsOrganisationAdministrator, "has_permission", return_value=True)
@patch.object(IsOrganisationLightspeedSubscriber, "has_permission", return_value=True)
Expand Down Expand Up @@ -319,7 +319,7 @@ def test_get_model_id_as_non_subscriber(self, *args):
self.assertEqual(r.status_code, HTTPStatus.FORBIDDEN)


@override_settings(ANSIBLE_AI_MODEL_MESH_API_TYPE="wca")
@override_settings(DEPLOYMENT_MODE="saas")
@override_settings(WCA_SECRET_BACKEND_TYPE="aws_sm")
@patch.object(IsOrganisationAdministrator, "has_permission", return_value=True)
@patch.object(IsOrganisationLightspeedSubscriber, "has_permission", return_value=True)
Expand Down
51 changes: 25 additions & 26 deletions ansible_ai_connect/main/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@

from ansible_ai_connect.main.settings.types import (
t_deployment_mode,
t_model_mesh_api_type,
t_one_click_reports_postman_type,
t_wca_secret_backend_type,
)
Expand All @@ -51,31 +50,31 @@
# ==========================================
# Model Provider
# ------------------------------------------
ANSIBLE_AI_MODEL_MESH_API_TYPE: t_model_mesh_api_type = os.getenv(
"ANSIBLE_AI_MODEL_MESH_API_TYPE"
) or cast(t_model_mesh_api_type, "http")

ANSIBLE_AI_MODEL_MESH_API_URL = (
os.getenv("ANSIBLE_AI_MODEL_MESH_API_URL") or "https://model.wisdom.testing.ansible.com:443"
)

ANSIBLE_AI_MODEL_MESH_API_KEY = os.getenv("ANSIBLE_AI_MODEL_MESH_API_KEY")
ANSIBLE_AI_MODEL_MESH_MODEL_ID = os.getenv("ANSIBLE_AI_MODEL_MESH_MODEL_ID")
if "ANSIBLE_AI_MODEL_MESH_MODEL_NAME" in os.environ:
logger.warning(
"Use of ANSIBLE_AI_MODEL_MESH_MODEL_NAME is deprecated and "
"should be replaced with ANSIBLE_AI_MODEL_MESH_MODEL_ID."
)
if "ANSIBLE_AI_MODEL_MESH_MODEL_ID" in os.environ:
logger.warning(
"Environment variable ANSIBLE_AI_MODEL_MESH_MODEL_ID is set and will take precedence."
)
else:
logger.warning(
"Setting the value of ANSIBLE_AI_MODEL_MESH_MODEL_ID to "
"the value of ANSIBLE_AI_MODEL_MESH_MODEL_NAME."
)
ANSIBLE_AI_MODEL_MESH_MODEL_ID = os.getenv("ANSIBLE_AI_MODEL_MESH_MODEL_NAME")
# ANSIBLE_AI_MODEL_MESH_API_TYPE: t_model_mesh_api_type = os.getenv(
# "ANSIBLE_AI_MODEL_MESH_API_TYPE"
# ) or cast(t_model_mesh_api_type, "http")

# ANSIBLE_AI_MODEL_MESH_API_URL = (
# os.getenv("ANSIBLE_AI_MODEL_MESH_API_URL") or "https://model.wisdom.testing.ansible.com:443"
# )

# ANSIBLE_AI_MODEL_MESH_API_KEY = os.getenv("ANSIBLE_AI_MODEL_MESH_API_KEY")
# ANSIBLE_AI_MODEL_MESH_MODEL_ID = os.getenv("ANSIBLE_AI_MODEL_MESH_MODEL_ID")
# if "ANSIBLE_AI_MODEL_MESH_MODEL_NAME" in os.environ:
# logger.warning(
# "Use of ANSIBLE_AI_MODEL_MESH_MODEL_NAME is deprecated and "
# "should be replaced with ANSIBLE_AI_MODEL_MESH_MODEL_ID."
# )
# if "ANSIBLE_AI_MODEL_MESH_MODEL_ID" in os.environ:
# logger.warning(
# "Environment variable ANSIBLE_AI_MODEL_MESH_MODEL_ID is set and will take precedence."
# )
# else:
# logger.warning(
# "Setting the value of ANSIBLE_AI_MODEL_MESH_MODEL_ID to "
# "the value of ANSIBLE_AI_MODEL_MESH_MODEL_NAME."
# )
# ANSIBLE_AI_MODEL_MESH_MODEL_ID = os.getenv("ANSIBLE_AI_MODEL_MESH_MODEL_NAME")

# Model API Timeout (in seconds). Default is None.
ANSIBLE_AI_MODEL_MESH_API_TIMEOUT = os.getenv("ANSIBLE_AI_MODEL_MESH_API_TIMEOUT")
Expand Down
41 changes: 0 additions & 41 deletions ansible_ai_connect/main/tests/test_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,47 +97,6 @@ def test_github_auth_team_empty_key(self):
self.assertEqual(settings.SOCIAL_AUTH_GITHUB_SCOPE, [""])
self.assertEqual(settings.SOCIAL_AUTH_GITHUB_EXTRA_DATA, ["login"])

@patch.dict(
os.environ,
{
"ANSIBLE_AI_MODEL_MESH_MODEL_NAME": "a-model",
},
)
def test_use_of_model_mesh_model_name(self):
with self.assertLogs(logger="root", level="DEBUG") as log:
settings = self.reload_settings()
self.assertEqual(settings.ANSIBLE_AI_MODEL_MESH_MODEL_ID, "a-model")
self.assertTrue(
self.searchInLogOutput("Use of ANSIBLE_AI_MODEL_MESH_MODEL_NAME is deprecated", log)
)
self.assertTrue(
self.searchInLogOutput("Setting the value of ANSIBLE_AI_MODEL_MESH_MODEL_ID", log)
)

@patch.dict(
os.environ,
{
"ANSIBLE_AI_MODEL_MESH_MODEL_NAME": "a-model",
"ANSIBLE_AI_MODEL_MESH_MODEL_ID": "b-model",
},
)
def test_use_of_model_mesh_model_name_and_model_id(self):
with self.assertLogs(logger="root", level="DEBUG") as log:
settings = self.reload_settings()
self.assertEqual(settings.ANSIBLE_AI_MODEL_MESH_MODEL_ID, "b-model")
self.assertTrue(
self.searchInLogOutput("Use of ANSIBLE_AI_MODEL_MESH_MODEL_NAME is deprecated", log)
)
self.assertTrue(
self.searchInLogOutput(
"ANSIBLE_AI_MODEL_MESH_MODEL_ID is set and will take precedence", log
)
)

def test_ansible_ai_model_mesh_model_id_has_no_default(self):
settings = self.reload_settings()
self.assertIsNone(settings.ANSIBLE_AI_MODEL_MESH_MODEL_ID)

@patch.dict(
os.environ,
{
Expand Down
9 changes: 4 additions & 5 deletions docs/pycharm-setup.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,16 +194,15 @@ ANSIBLE_AI_DATABASE_USER=wisdom
DJANGO_SETTINGS_MODULE=main.settings.development
PYTHONUNBUFFERED=1
SECRET_KEY=somesecret
ANSIBLE_AI_MODEL_MESH_API_TYPE=ollama
ANSIBLE_AI_MODEL_MESH_MODEL_ID="mistral:instruct"
ANSIBLE_AI_MODEL_MESH_API_URL=http://127.0.0.1:11434
ENABLE_ARI_POSTPROCESS=False
DEPLOYMENT_MODE=upstream
ANSIBLE_AI_MODEL_MESH_CONFIG="..."
```
See the example [ANSIBLE_AI_MODEL_MESH_CONFIG](../README-ANSIBLE_AI_MODEL_MESH_CONFIG.md).

> [!TIP]
> The example shown above uses local Ollama server with Mistral 7B Instruct model.
> For using a other type of model server that provides prediction results,
> The example referenced above uses local Ollama server with Mistral 7B Instruct model.
> For using a different type of model server that provides prediction results,
> you need to set extra environment variables for a client type that is used
> to connect to the model server.
Expand Down
6 changes: 1 addition & 5 deletions tools/docker-compose/compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,8 @@ services:
- SECRET_KEY=${SECRET_KEY:-somesecret}
- SEGMENT_WRITE_KEY=${SEGMENT_WRITE_KEY}
- SEGMENT_ANALYTICS_WRITE_KEY=${SEGMENT_ANALYTICS_WRITE_KEY}
- ANSIBLE_AI_MODEL_MESH_API_URL=${ANSIBLE_AI_MODEL_MESH_API_URL}
- ANSIBLE_AI_MODEL_MESH_API_TYPE=${ANSIBLE_AI_MODEL_MESH_API_TYPE}
- ANSIBLE_AI_MODEL_MESH_API_TIMEOUT=${ANSIBLE_AI_MODEL_MESH_API_TIMEOUT:-120}
- ANSIBLE_AI_MODEL_MESH_API_KEY=${ANSIBLE_AI_MODEL_MESH_API_KEY}
- ANSIBLE_AI_MODEL_MESH_MODEL_ID=${ANSIBLE_AI_MODEL_MESH_MODEL_ID}
- ANSIBLE_AI_MODEL_MESH_API_TIMEOUT=${ANSIBLE_AI_MODEL_MESH_API_TIMEOUT:-120}
- COMPLETION_USER_RATE_THROTTLE=${COMPLETION_USER_RATE_THROTTLE}
- SOCIAL_AUTH_OIDC_OIDC_ENDPOINT=${SOCIAL_AUTH_OIDC_OIDC_ENDPOINT}
- SOCIAL_AUTH_OIDC_KEY=${SOCIAL_AUTH_OIDC_KEY}
Expand All @@ -62,7 +59,6 @@ services:
- WCA_SECRET_MANAGER_SECRET_ACCESS_KEY=${WCA_SECRET_MANAGER_SECRET_ACCESS_KEY}
- WCA_SECRET_BACKEND_TYPE=${WCA_SECRET_BACKEND_TYPE}
- WCA_SECRET_DUMMY_SECRETS=${WCA_SECRET_DUMMY_SECRETS}
- ANSIBLE_WCA_INFERENCE_URL=${ANSIBLE_WCA_INFERENCE_URL}
- ANSIBLE_WCA_HEALTHCHECK_API_KEY=${ANSIBLE_WCA_HEALTHCHECK_API_KEY}
- ANSIBLE_WCA_HEALTHCHECK_MODEL_ID=${ANSIBLE_WCA_HEALTHCHECK_MODEL_ID}
- ANSIBLE_WCA_IDP_URL=${ANSIBLE_WCA_IDP_URL}
Expand Down

0 comments on commit 97e2637

Please sign in to comment.