From 3b5e2f417dab4daeede62672e41e1545cabdc9ee Mon Sep 17 00:00:00 2001 From: rehanrehman389 Date: Sun, 26 Jul 2026 14:39:48 +0000 Subject: [PATCH 1/2] fix: don't send empty api_key to Ollama --- flow/flow/doctype/flow_model/flow_model.py | 2 +- flow/lib/model.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/flow/flow/doctype/flow_model/flow_model.py b/flow/flow/doctype/flow_model/flow_model.py index 8bb46a5..fb9e37e 100644 --- a/flow/flow/doctype/flow_model/flow_model.py +++ b/flow/flow/doctype/flow_model/flow_model.py @@ -133,7 +133,7 @@ def test_connection(self): from flow.lib.model import resolve_provider_credentials provider_creds = resolve_provider_credentials(self.model_id) - api_key = self.get_password("api_key", raise_exception=False) or provider_creds.get("api_key") or "" + api_key = self.get_password("api_key", raise_exception=False) or provider_creds.get("api_key") or None base_url = self.base_url or provider_creds.get("base_url") kwargs = { diff --git a/flow/lib/model.py b/flow/lib/model.py index 543c32b..9cb1ca2 100644 --- a/flow/lib/model.py +++ b/flow/lib/model.py @@ -73,7 +73,7 @@ def __init__( params = {**provider_creds["extra_params"], **(params or {})} self.model_id = model_id - self._api_key = api_key or "" + self._api_key = api_key or None self.base_url = base_url self.params = params or {} self.timeout = timeout @@ -129,7 +129,7 @@ def resolve_provider_credentials(model_id: str) -> dict[str, Any]: return {} return { - "api_key": doc.get_password("api_key", raise_exception=False) or "", + "api_key": doc.get_password("api_key", raise_exception=False) or None, "base_url": doc.base_url or None, "extra_params": json.loads(doc.extra_params) if doc.extra_params else {}, } From d12236f20ee6750787579ef6bd9c8829698a28af Mon Sep 17 00:00:00 2001 From: rehanrehman389 Date: Sun, 26 Jul 2026 14:48:28 +0000 Subject: [PATCH 2/2] test: update empty api_key assertions to None --- flow/flow/doctype/flow_provider/test_flow_provider.py | 4 ++-- flow/tests/test_ai_model.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/flow/flow/doctype/flow_provider/test_flow_provider.py b/flow/flow/doctype/flow_provider/test_flow_provider.py index d2eaab4..f7cfcaa 100644 --- a/flow/flow/doctype/flow_provider/test_flow_provider.py +++ b/flow/flow/doctype/flow_provider/test_flow_provider.py @@ -76,11 +76,11 @@ def test_model_own_key_overrides_provider(self): def test_disabled_provider_not_used(self): frappe.get_doc(_provider(api_key="sk-from-provider", enabled=0)).insert() m = frappe.get_doc(_model()).insert() - self.assertEqual(Model(m.name)._api_key, "") + self.assertIsNone(Model(m.name)._api_key) def test_no_provider_row_leaves_key_empty(self): m = frappe.get_doc(_model()).insert() - self.assertEqual(Model(m.name)._api_key, "") + self.assertIsNone(Model(m.name)._api_key) def test_provider_base_url_used_when_model_has_none(self): frappe.get_doc(_provider(base_url="http://gateway.local")).insert() diff --git a/flow/tests/test_ai_model.py b/flow/tests/test_ai_model.py index 582971e..7d93025 100644 --- a/flow/tests/test_ai_model.py +++ b/flow/tests/test_ai_model.py @@ -45,7 +45,7 @@ def test_init_requires_model_id(self): def test_init_allows_empty_api_key_for_local_providers(self): m = Model(model_id="ollama/llama3.1", base_url="http://localhost:11434") - self.assertEqual(m._api_key, "") + self.assertIsNone(m._api_key) def test_init_rejects_name_with_kwargs(self): with self.assertRaises(ValueError):