From 8b9771656a5f28a643085806966acbc4cd27b7cc Mon Sep 17 00:00:00 2001 From: jimmyzhuu Date: Sat, 4 Apr 2026 23:24:53 +0800 Subject: [PATCH 01/10] Add OpenAI-compatible LLM adapter --- README.md | 7 +- .../sdk1/src/unstract/sdk1/adapters/base1.py | 22 ++++++ .../unstract/sdk1/adapters/llm1/__init__.py | 2 + .../sdk1/adapters/llm1/openai_compatible.py | 40 +++++++++++ .../adapters/llm1/static/custom_openai.json | 59 +++++++++++++++ unstract/sdk1/src/unstract/sdk1/llm.py | 12 +++- .../tests/test_openai_compatible_adapter.py | 71 +++++++++++++++++++ 7 files changed, 209 insertions(+), 4 deletions(-) create mode 100644 unstract/sdk1/src/unstract/sdk1/adapters/llm1/openai_compatible.py create mode 100644 unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/custom_openai.json create mode 100644 unstract/sdk1/tests/test_openai_compatible_adapter.py diff --git a/README.md b/README.md index a3ab108c6b..9e282b3e10 100644 --- a/README.md +++ b/README.md @@ -176,9 +176,10 @@ Also see [architecture](docs/ARCHITECTURE.md). | Provider | Status | Provider | Status | |----------|--------|----------|--------| | OpenAI | ✅ | Azure OpenAI | ✅ | -| Anthropic Claude | ✅ | Google Gemini | ✅ | -| AWS Bedrock | ✅ | Mistral AI | ✅ | -| Ollama (local) | ✅ | Anyscale | ✅ | +| OpenAI Compatible | ✅ | Anthropic Claude | ✅ | +| AWS Bedrock | ✅ | Google Gemini | ✅ | +| Ollama (local) | ✅ | Mistral AI | ✅ | +| Anyscale | ✅ | | | ### Vector Databases diff --git a/unstract/sdk1/src/unstract/sdk1/adapters/base1.py b/unstract/sdk1/src/unstract/sdk1/adapters/base1.py index 8ad721c3d4..f4bf1b74a1 100644 --- a/unstract/sdk1/src/unstract/sdk1/adapters/base1.py +++ b/unstract/sdk1/src/unstract/sdk1/adapters/base1.py @@ -10,6 +10,7 @@ from typing import Any from pydantic import BaseModel, Field, model_validator + from unstract.sdk1.adapters.constants import Common from unstract.sdk1.adapters.enums import AdapterTypes @@ -225,6 +226,27 @@ def validate_model(adapter_metadata: dict[str, "Any"]) -> str: return f"openai/{model}" +class OpenAICompatibleLLMParameters(BaseChatCompletionParameters): + """See https://docs.litellm.ai/docs/providers/openai_compatible/.""" + + api_key: str | None = None + api_base: str + + @staticmethod + def validate(adapter_metadata: dict[str, "Any"]) -> dict[str, "Any"]: + adapter_metadata["model"] = OpenAICompatibleLLMParameters.validate_model( + adapter_metadata + ) + return OpenAICompatibleLLMParameters(**adapter_metadata).model_dump() + + @staticmethod + def validate_model(adapter_metadata: dict[str, "Any"]) -> str: + model = adapter_metadata.get("model", "") + if model.startswith("custom_openai/"): + return model + return f"custom_openai/{model}" + + class AzureOpenAILLMParameters(BaseChatCompletionParameters): """See https://docs.litellm.ai/docs/providers/azure/#completion---using-azure_ad_token-api_base-api_version.""" diff --git a/unstract/sdk1/src/unstract/sdk1/adapters/llm1/__init__.py b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/__init__.py index c23a33390a..1da3590f51 100644 --- a/unstract/sdk1/src/unstract/sdk1/adapters/llm1/__init__.py +++ b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/__init__.py @@ -8,6 +8,7 @@ from unstract.sdk1.adapters.llm1.bedrock import AWSBedrockLLMAdapter from unstract.sdk1.adapters.llm1.ollama import OllamaLLMAdapter from unstract.sdk1.adapters.llm1.openai import OpenAILLMAdapter +from unstract.sdk1.adapters.llm1.openai_compatible import OpenAICompatibleLLMAdapter from unstract.sdk1.adapters.llm1.vertexai import VertexAILLMAdapter adapters: dict[str, dict[str, Any]] = {} @@ -22,5 +23,6 @@ "AzureOpenAILLMAdapter", "OllamaLLMAdapter", "OpenAILLMAdapter", + "OpenAICompatibleLLMAdapter", "VertexAILLMAdapter", ] diff --git a/unstract/sdk1/src/unstract/sdk1/adapters/llm1/openai_compatible.py b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/openai_compatible.py new file mode 100644 index 0000000000..1ed942ba10 --- /dev/null +++ b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/openai_compatible.py @@ -0,0 +1,40 @@ +from typing import Any + +from unstract.sdk1.adapters.base1 import BaseAdapter, OpenAICompatibleLLMParameters +from unstract.sdk1.adapters.enums import AdapterTypes + + +class OpenAICompatibleLLMAdapter(OpenAICompatibleLLMParameters, BaseAdapter): + @staticmethod + def get_id() -> str: + return "openaicompatible|b6d10f33-2c41-49fc-a8c2-58d2b247fc09" + + @staticmethod + def get_metadata() -> dict[str, Any]: + return { + "name": "OpenAI Compatible", + "version": "1.0.0", + "adapter": OpenAICompatibleLLMAdapter, + "description": "OpenAI-compatible LLM adapter", + "is_active": True, + } + + @staticmethod + def get_name() -> str: + return "OpenAI Compatible" + + @staticmethod + def get_description() -> str: + return "OpenAI-compatible LLM adapter" + + @staticmethod + def get_provider() -> str: + return "custom_openai" + + @staticmethod + def get_icon() -> str: + return "/icons/adapter-icons/OpenAI.png" + + @staticmethod + def get_adapter_type() -> AdapterTypes: + return AdapterTypes.LLM diff --git a/unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/custom_openai.json b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/custom_openai.json new file mode 100644 index 0000000000..13219b1994 --- /dev/null +++ b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/custom_openai.json @@ -0,0 +1,59 @@ +{ + "title": "OpenAI Compatible LLM", + "type": "object", + "required": [ + "adapter_name", + "api_base" + ], + "properties": { + "adapter_name": { + "type": "string", + "title": "Name", + "default": "", + "description": "Provide a unique name for this adapter instance. Example: compatible-gateway-1" + }, + "api_key": { + "type": "string", + "title": "API Key", + "format": "password", + "description": "API key for your OpenAI-compatible endpoint. Leave empty if the endpoint does not require one." + }, + "model": { + "type": "string", + "title": "Model", + "default": "gpt-4o-mini", + "description": "The model name expected by your OpenAI-compatible endpoint. Examples: gpt-4o-mini, qwen-max, openai/gpt-4o" + }, + "api_base": { + "type": "string", + "format": "url", + "title": "API Base", + "default": "https://your-endpoint.example.com/v1", + "description": "Base URL for the OpenAI-compatible endpoint. Example: https://your-endpoint.example.com/v1" + }, + "max_tokens": { + "type": "number", + "minimum": 0, + "multipleOf": 1, + "title": "Maximum Output Tokens", + "default": 4096, + "description": "Maximum number of output tokens to limit LLM replies. Leave it empty to use the provider default." + }, + "max_retries": { + "type": "number", + "minimum": 0, + "multipleOf": 1, + "title": "Max Retries", + "default": 5, + "description": "The maximum number of times to retry a request if it fails." + }, + "timeout": { + "type": "number", + "minimum": 0, + "multipleOf": 1, + "title": "Timeout", + "default": 900, + "description": "Timeout in seconds." + } + } +} diff --git a/unstract/sdk1/src/unstract/sdk1/llm.py b/unstract/sdk1/src/unstract/sdk1/llm.py index 8ff29a89d5..2e9f9b1cdf 100644 --- a/unstract/sdk1/src/unstract/sdk1/llm.py +++ b/unstract/sdk1/src/unstract/sdk1/llm.py @@ -11,6 +11,7 @@ # from litellm import get_supported_openai_params from litellm import get_max_tokens, token_counter from pydantic import ValidationError + from unstract.sdk1.adapters.constants import Common from unstract.sdk1.adapters.llm1 import adapters from unstract.sdk1.audit import Audit @@ -539,7 +540,16 @@ def _record_usage( usage: Mapping[str, int] | None, llm_api: str, ) -> None: - prompt_tokens = token_counter(model=model, messages=messages) + try: + prompt_tokens = token_counter(model=model, messages=messages) + except Exception as e: + prompt_tokens = 0 + logger.warning( + "[sdk1][LLM][%s][%s] Failed to estimate prompt tokens: %s", + model, + llm_api, + e, + ) usage_data: Mapping[str, int] = usage or {} all_tokens = TokenCounterCompat( prompt_tokens=usage_data.get("prompt_tokens", 0), diff --git a/unstract/sdk1/tests/test_openai_compatible_adapter.py b/unstract/sdk1/tests/test_openai_compatible_adapter.py new file mode 100644 index 0000000000..b6ee6b8098 --- /dev/null +++ b/unstract/sdk1/tests/test_openai_compatible_adapter.py @@ -0,0 +1,71 @@ +from unittest.mock import MagicMock, patch + +from unstract.sdk1.adapters.base1 import OpenAICompatibleLLMParameters +from unstract.sdk1.adapters.constants import Common +from unstract.sdk1.adapters.llm1 import adapters +from unstract.sdk1.adapters.llm1.openai_compatible import OpenAICompatibleLLMAdapter + + +def test_openai_compatible_adapter_is_registered() -> None: + adapter_id = OpenAICompatibleLLMAdapter.get_id() + + assert adapter_id in adapters + assert adapters[adapter_id][Common.MODULE] is OpenAICompatibleLLMAdapter + + +def test_openai_compatible_validate_prefixes_model() -> None: + validated = OpenAICompatibleLLMParameters.validate( + { + "api_base": "https://gateway.example.com/v1", + "api_key": "test-key", + "model": "qwen-max", + } + ) + + assert validated["model"] == "custom_openai/qwen-max" + + +def test_openai_compatible_validate_preserves_prefixed_model() -> None: + validated = OpenAICompatibleLLMParameters.validate( + { + "api_base": "https://gateway.example.com/v1", + "model": "custom_openai/openai/gpt-4o", + } + ) + + assert validated["model"] == "custom_openai/openai/gpt-4o" + assert validated["api_key"] is None + + +def test_openai_compatible_schema_is_loadable() -> None: + schema = OpenAICompatibleLLMAdapter.get_json_schema() + + assert "\"title\": \"OpenAI Compatible LLM\"" in schema + + +def test_record_usage_tolerates_unmapped_models() -> None: + import sys + from types import ModuleType + + sys.modules.setdefault("magic", ModuleType("magic")) + + from unstract.sdk1.llm import LLM + + llm = LLM.__new__(LLM) + llm._platform_api_key = "platform-key" + llm.platform_kwargs = {"run_id": "run-1"} + llm.adapter = MagicMock() + llm.adapter.get_provider.return_value = "custom_openai" + + with ( + patch("unstract.sdk1.llm.token_counter", side_effect=Exception("unmapped")), + patch("unstract.sdk1.llm.Audit") as mock_audit, + ): + llm._record_usage( + model="custom_openai/qwen-max", + messages=[{"role": "user", "content": "hello"}], + usage={"prompt_tokens": 3, "completion_tokens": 4, "total_tokens": 7}, + llm_api="complete", + ) + + mock_audit.return_value.push_usage_data.assert_called_once() From 50907738847a8aa8bd1bf6e333b2ca7df373da1d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 4 Apr 2026 15:29:16 +0000 Subject: [PATCH 02/10] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- unstract/sdk1/src/unstract/sdk1/adapters/base1.py | 1 - unstract/sdk1/src/unstract/sdk1/llm.py | 1 - unstract/sdk1/tests/test_openai_compatible_adapter.py | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/unstract/sdk1/src/unstract/sdk1/adapters/base1.py b/unstract/sdk1/src/unstract/sdk1/adapters/base1.py index f4bf1b74a1..ed24cc77a9 100644 --- a/unstract/sdk1/src/unstract/sdk1/adapters/base1.py +++ b/unstract/sdk1/src/unstract/sdk1/adapters/base1.py @@ -10,7 +10,6 @@ from typing import Any from pydantic import BaseModel, Field, model_validator - from unstract.sdk1.adapters.constants import Common from unstract.sdk1.adapters.enums import AdapterTypes diff --git a/unstract/sdk1/src/unstract/sdk1/llm.py b/unstract/sdk1/src/unstract/sdk1/llm.py index 2e9f9b1cdf..7cc94a2afe 100644 --- a/unstract/sdk1/src/unstract/sdk1/llm.py +++ b/unstract/sdk1/src/unstract/sdk1/llm.py @@ -11,7 +11,6 @@ # from litellm import get_supported_openai_params from litellm import get_max_tokens, token_counter from pydantic import ValidationError - from unstract.sdk1.adapters.constants import Common from unstract.sdk1.adapters.llm1 import adapters from unstract.sdk1.audit import Audit diff --git a/unstract/sdk1/tests/test_openai_compatible_adapter.py b/unstract/sdk1/tests/test_openai_compatible_adapter.py index b6ee6b8098..bf1fc3c989 100644 --- a/unstract/sdk1/tests/test_openai_compatible_adapter.py +++ b/unstract/sdk1/tests/test_openai_compatible_adapter.py @@ -40,7 +40,7 @@ def test_openai_compatible_validate_preserves_prefixed_model() -> None: def test_openai_compatible_schema_is_loadable() -> None: schema = OpenAICompatibleLLMAdapter.get_json_schema() - assert "\"title\": \"OpenAI Compatible LLM\"" in schema + assert '"title": "OpenAI Compatible LLM"' in schema def test_record_usage_tolerates_unmapped_models() -> None: From f1d6dffc63d63bdf570b12d7888d9182f7f2d28d Mon Sep 17 00:00:00 2001 From: jimmyzhuu Date: Sun, 5 Apr 2026 00:34:09 +0800 Subject: [PATCH 03/10] Address review feedback for custom OpenAI adapter --- .../adapters/llm1/static/custom_openai.json | 9 ++- unstract/sdk1/src/unstract/sdk1/llm.py | 24 +++--- .../tests/test_openai_compatible_adapter.py | 74 +++++++++++++++---- 3 files changed, 79 insertions(+), 28 deletions(-) diff --git a/unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/custom_openai.json b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/custom_openai.json index 13219b1994..00f629b41e 100644 --- a/unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/custom_openai.json +++ b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/custom_openai.json @@ -13,7 +13,10 @@ "description": "Provide a unique name for this adapter instance. Example: compatible-gateway-1" }, "api_key": { - "type": "string", + "type": [ + "string", + "null" + ], "title": "API Key", "format": "password", "description": "API key for your OpenAI-compatible endpoint. Leave empty if the endpoint does not require one." @@ -22,14 +25,14 @@ "type": "string", "title": "Model", "default": "gpt-4o-mini", - "description": "The model name expected by your OpenAI-compatible endpoint. Examples: gpt-4o-mini, qwen-max, openai/gpt-4o" + "description": "The model name expected by your OpenAI-compatible endpoint. Examples: gpt-4o-mini, ERNIE-4.0-8K (Baidu Qianfan), qwen-max, openai/gpt-4o" }, "api_base": { "type": "string", "format": "url", "title": "API Base", "default": "https://your-endpoint.example.com/v1", - "description": "Base URL for the OpenAI-compatible endpoint. Example: https://your-endpoint.example.com/v1" + "description": "Base URL for the OpenAI-compatible endpoint. Examples: https://your-endpoint.example.com/v1, https://qianfan.baidubce.com/v2" }, "max_tokens": { "type": "number", diff --git a/unstract/sdk1/src/unstract/sdk1/llm.py b/unstract/sdk1/src/unstract/sdk1/llm.py index 7cc94a2afe..e6a49a8bb1 100644 --- a/unstract/sdk1/src/unstract/sdk1/llm.py +++ b/unstract/sdk1/src/unstract/sdk1/llm.py @@ -539,19 +539,21 @@ def _record_usage( usage: Mapping[str, int] | None, llm_api: str, ) -> None: - try: - prompt_tokens = token_counter(model=model, messages=messages) - except Exception as e: - prompt_tokens = 0 - logger.warning( - "[sdk1][LLM][%s][%s] Failed to estimate prompt tokens: %s", - model, - llm_api, - e, - ) usage_data: Mapping[str, int] = usage or {} + prompt_tokens = usage_data.get("prompt_tokens") + if prompt_tokens is None: + try: + prompt_tokens = token_counter(model=model, messages=messages) + except Exception as e: + prompt_tokens = 0 + logger.warning( + "[sdk1][LLM][%s][%s] Failed to estimate prompt tokens: %s", + model, + llm_api, + e, + ) all_tokens = TokenCounterCompat( - prompt_tokens=usage_data.get("prompt_tokens", 0), + prompt_tokens=usage_data.get("prompt_tokens", prompt_tokens or 0), completion_tokens=usage_data.get("completion_tokens", 0), total_tokens=usage_data.get("total_tokens", 0), ) diff --git a/unstract/sdk1/tests/test_openai_compatible_adapter.py b/unstract/sdk1/tests/test_openai_compatible_adapter.py index bf1fc3c989..1f58d636ec 100644 --- a/unstract/sdk1/tests/test_openai_compatible_adapter.py +++ b/unstract/sdk1/tests/test_openai_compatible_adapter.py @@ -1,3 +1,6 @@ +import json +from functools import lru_cache +from importlib import import_module from unittest.mock import MagicMock, patch from unstract.sdk1.adapters.base1 import OpenAICompatibleLLMParameters @@ -6,6 +9,26 @@ from unstract.sdk1.adapters.llm1.openai_compatible import OpenAICompatibleLLMAdapter +@lru_cache(maxsize=1) +def _load_llm_module() -> object: + import sys + from types import ModuleType + + with patch.dict( + sys.modules, + { + # Stub python-magic so importing LLM does not depend on libmagic + # being available in the test environment. + "magic": ModuleType("magic") + }, + ): + return import_module("unstract.sdk1.llm") + + +def _load_llm_class() -> type: + return _load_llm_module().LLM + + def test_openai_compatible_adapter_is_registered() -> None: adapter_id = OpenAICompatibleLLMAdapter.get_id() @@ -18,11 +41,11 @@ def test_openai_compatible_validate_prefixes_model() -> None: { "api_base": "https://gateway.example.com/v1", "api_key": "test-key", - "model": "qwen-max", + "model": "ERNIE-4.0-8K", } ) - assert validated["model"] == "custom_openai/qwen-max" + assert validated["model"] == "custom_openai/ERNIE-4.0-8K" def test_openai_compatible_validate_preserves_prefixed_model() -> None: @@ -38,33 +61,56 @@ def test_openai_compatible_validate_preserves_prefixed_model() -> None: def test_openai_compatible_schema_is_loadable() -> None: - schema = OpenAICompatibleLLMAdapter.get_json_schema() + schema = json.loads(OpenAICompatibleLLMAdapter.get_json_schema()) - assert '"title": "OpenAI Compatible LLM"' in schema + assert schema["title"] == "OpenAI Compatible LLM" + assert schema["properties"]["api_key"]["type"] == ["string", "null"] + assert "ERNIE-4.0-8K" in schema["properties"]["model"]["description"] -def test_record_usage_tolerates_unmapped_models() -> None: - import sys - from types import ModuleType +def test_record_usage_uses_reported_prompt_tokens_without_estimating() -> None: + llm_module = _load_llm_module() + llm_cls = llm_module.LLM - sys.modules.setdefault("magic", ModuleType("magic")) + llm = llm_cls.__new__(llm_cls) + llm._platform_api_key = "platform-key" + llm.platform_kwargs = {"run_id": "run-1"} + llm.adapter = MagicMock() + llm.adapter.get_provider.return_value = "custom_openai" - from unstract.sdk1.llm import LLM + with ( + patch.object(llm_module, "token_counter") as mock_token_counter, + patch.object(llm_module, "Audit") as mock_audit, + ): + llm._record_usage( + model="custom_openai/ERNIE-4.0-8K", + messages=[{"role": "user", "content": "hello"}], + usage={"prompt_tokens": 3, "completion_tokens": 4, "total_tokens": 7}, + llm_api="complete", + ) + + mock_token_counter.assert_not_called() + mock_audit.return_value.push_usage_data.assert_called_once() - llm = LLM.__new__(LLM) + +def test_record_usage_tolerates_unmapped_models_without_prompt_tokens() -> None: + llm_module = _load_llm_module() + llm_cls = llm_module.LLM + + llm = llm_cls.__new__(llm_cls) llm._platform_api_key = "platform-key" llm.platform_kwargs = {"run_id": "run-1"} llm.adapter = MagicMock() llm.adapter.get_provider.return_value = "custom_openai" with ( - patch("unstract.sdk1.llm.token_counter", side_effect=Exception("unmapped")), - patch("unstract.sdk1.llm.Audit") as mock_audit, + patch.object(llm_module, "token_counter", side_effect=Exception("unmapped")), + patch.object(llm_module, "Audit") as mock_audit, ): llm._record_usage( - model="custom_openai/qwen-max", + model="custom_openai/ERNIE-4.0-8K", messages=[{"role": "user", "content": "hello"}], - usage={"prompt_tokens": 3, "completion_tokens": 4, "total_tokens": 7}, + usage={"completion_tokens": 4, "total_tokens": 7}, llm_api="complete", ) From b4d0af106d64d39dcba7ee7e6d12353a77856579 Mon Sep 17 00:00:00 2001 From: jimmyzhuu Date: Sun, 5 Apr 2026 00:37:21 +0800 Subject: [PATCH 04/10] Fix import formatting after rebase --- unstract/sdk1/src/unstract/sdk1/llm.py | 1 + 1 file changed, 1 insertion(+) diff --git a/unstract/sdk1/src/unstract/sdk1/llm.py b/unstract/sdk1/src/unstract/sdk1/llm.py index e6a49a8bb1..6578eda67c 100644 --- a/unstract/sdk1/src/unstract/sdk1/llm.py +++ b/unstract/sdk1/src/unstract/sdk1/llm.py @@ -11,6 +11,7 @@ # from litellm import get_supported_openai_params from litellm import get_max_tokens, token_counter from pydantic import ValidationError + from unstract.sdk1.adapters.constants import Common from unstract.sdk1.adapters.llm1 import adapters from unstract.sdk1.audit import Audit From d3e1cad64bfe5de30aba336c19559cbabf18f712 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 4 Apr 2026 16:37:53 +0000 Subject: [PATCH 05/10] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- unstract/sdk1/src/unstract/sdk1/llm.py | 1 - 1 file changed, 1 deletion(-) diff --git a/unstract/sdk1/src/unstract/sdk1/llm.py b/unstract/sdk1/src/unstract/sdk1/llm.py index 6578eda67c..e6a49a8bb1 100644 --- a/unstract/sdk1/src/unstract/sdk1/llm.py +++ b/unstract/sdk1/src/unstract/sdk1/llm.py @@ -11,7 +11,6 @@ # from litellm import get_supported_openai_params from litellm import get_max_tokens, token_counter from pydantic import ValidationError - from unstract.sdk1.adapters.constants import Common from unstract.sdk1.adapters.llm1 import adapters from unstract.sdk1.audit import Audit From 2cb187a2e3c2d84604b2046b555ab70814018313 Mon Sep 17 00:00:00 2001 From: jimmyzhuu Date: Fri, 24 Apr 2026 11:10:36 +0800 Subject: [PATCH 06/10] Address follow-up review comments for OpenAI-compatible adapter --- .../icons/adapter-icons/OpenAICompatible.png | Bin 0 -> 136026 bytes .../sdk1/src/unstract/sdk1/adapters/base1.py | 4 + .../sdk1/adapters/llm1/openai_compatible.py | 12 ++- .../adapters/llm1/static/custom_openai.json | 5 +- unstract/sdk1/src/unstract/sdk1/llm.py | 6 +- .../tests/test_openai_compatible_adapter.py | 85 ++++++++++++++++-- 6 files changed, 99 insertions(+), 13 deletions(-) create mode 100644 frontend/public/icons/adapter-icons/OpenAICompatible.png diff --git a/frontend/public/icons/adapter-icons/OpenAICompatible.png b/frontend/public/icons/adapter-icons/OpenAICompatible.png new file mode 100644 index 0000000000000000000000000000000000000000..ec23189d9ab27571e8f25c030af6b9793e02a8c0 GIT binary patch literal 136026 zcmV)iK%&2iP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR930H6Z^1ONa40RR930000001NoFg#Z9R07*naRCodGy$OINMUgk&J>ApY zgL23%sHk`!DBg#nQcuIsn|y^lY;?s|*jh3A5zsNexApo^#| zE-LEcft(`(GBe#hGu_`WBJzklE34k?oFn%mra_4o7Z;Y6mcl$pvmrAzHH~nTMO=j5!otEt zB_YepfS8`1jxALk90&xjN#7;JK&51EZcg=`GPcDnTecu4zI(0QZ6_z!bR}ex6Cznf z|0wsUEKdL&flNp@4q?sgDqhu`nTl7gRbE0-brpLgPCBLQCfev7PIB)}u)Yv0%@w$0DOW zmot+_%(~Nnu-MBo`&^ zhyyJIQ;oL;!vg}$SNfJRU?4q-T4F%b{Xdtf6+UMqGqUt~HS*s{Qg~ z&Dn~gcf+4&O52>cRRZV;VV^t?LI9nkU4e~KRKv_u2>_|%3QeM?yH909Z1CQl4^pkn z{sPh6!JRo%gE$D$RCFNZlZk8gL_xyJnJXFeT2+;mFG{Snh-+;M$MEGK{F_l|AN3h; zJY10soc~QTGJ$62&5W^UxI!iFrJ;_qQS>G1cjwfyX$+-i+eU&c;x97=xL)tWYmiaZ z0rzrGSabjne(8vw#?i2XHTAWH>ItSoBM^(C#Fe5sENA+rViYt{=dyqtyC?#c{*`gz z^zDl6E2w_sCyq!0iUZy}0 zWsi8qKf4S-l%bdyCW0QFU=q^9qM$0d>`8^x?f(L9li0W&~R*hhBM|Qv7cf?tT^_%>{9xD>@KzuV0DbH94FJ2 zv@ykAzGN(pX*f~}hCxM!!$5+-IT>TX5eW0aCh)Kd6~kYJp^B^EpIvODfvv;SQD;VZ zMx?EOugWGD(>5oPI$PTwQvq%u*})Jy;K;{$KafLbVXa4sK+0(k25|`e3gXXrrOj#+ z@N|7%y{tz`nfrA1u#Z(uB8FlGc^nD?JN^=awlTk+bpxTYWWSc^1{&2jZX_{x8jK;3 zZo17Hhzo@98a2RXk2ftvqy={(Qs3DG$-OwXcGHSR*p6=m4$nf(QU+veW@|{T7x{38sv&8Jy;&pDtR=;WZMS7geKHG_-`IY)qUmfg7^1GXE~IFp`(&kB9{*e zFa{X|K^tF7EHZ+Dz5^ta44o6SOIjjfU>8()|J7`U?a$X$fincW5{ z9tmGKJKQ*gs9w<Ayn-I_DCzb=NFYfd0DhLvD&>UEGi*_oCxEA?@VL1gzzuku zB^=)IY_vJZXK|O8>(8vq?b~$_Jo*d}_TqTLSwLo)9>A|YbjS-=Mhxnhq2&DM*JcBHQ#*#n(N+DQMUta+#VJrsOfuT;% z-=k~j2q@%DBY3+yKp+hViEHF<2-hH|PU7IHz@v|J42TseCGrg8dMt#nv;D;@hw_o&5s*3KPDux?z_wovU*aPy$`-6q;O6MmRjo^1+fS1q_6W0&+RGra%b4L&3I{F# zl}!kdBu~6!hP`WCf|76m2zsu6LR=8& zUWyM{?O3)*B}9yEZmA}TLM)ZB2(>L+w=7~Er(6^+$(;#F*I;qBLS@ZVM?$D`7ZzlM zkcr!wq)5+^bg$Bb-2osv35;a&N#*5bT9l@`N)HyLkr5JvK(>Yx2JXzXDoh9m z#3L93tTiFI{fcQA!0HEr3@y%3~?`?UoFiqY(^aeSD4;)+5U z)>+E6J#TH}AUV-dcsso#cxhY;5<>mUQ{x05ta!v6NtA53?~&zL?VOB(&SC15s$+Pf6>oE#+76S6Ipt&FZXu?&$UJB7)837l#byQkO?U}zq?94IwaMzc09 z#sbnrw?WDFwcR$DR8>@Ps#rBKje)wUpnn5#Cl0hDgQ(hx00m{DiY=C7(t+18J2u_h z?>Ll?rfr{dw%PfpS9FA+3{=rM8C;;ev=4pnI<P$B7WMavY*=%aom8SI8*UMPxbL+GCG^qui?^L02;6J)_ii0EoaH0(oih#GiKT z4&0#c@PmRfjQy&nz@%J>5z3mS7LyZfO4%t{u8e&2h#ap$P`N&UEGKr3l0u*zR1($R zg64U*H*&jyBxK|P(>F8Xww-1l&DLPdQN*dE&~)hN!)4WVDH<11KkrE&4#Y8LDHB{^ zYDjR~0iY6E5=TZCyB>A_zz78p7~WNa#3S6dXE->K*Gf>FPD8;Y92-+=u&Jnw0Ad5O z+lrS}ZUUphq{uKdrWB3x8o_>0AhAD*CXH)IOxPL1t4aC>n}>!Jm4|LEr9Egs`p%R^-wlIg*HWRml~4+mPE{lFbv1rbC?8z|2@b6Ai`jvfo}$?hyRMB ze!MV;G)yBsFj&Xl z#&#=>Z98()0l;|6Bj%+6L9R%ET3h(yJtUr*W+fVl71~f74Pzf}vYtx9gaH%JiP$iuF~*T4(1hQ92`K9WLbHdJnyoy~hK%ih ztBI{BC&&=wVU%e{F|bD^@gerol5gkR8ns<|=?P!ISMNzREVQ8owA;>a@JRv6o};zw z$Us*!!3>2eoW^&@LSb-HjAu>2M99ru3PWsVbQ)qnZf@pw0K6|oD`NPrfCr-`uJrWgn=O&l#tDv zYj@Bit80-E&yY$|g)z#Ukj|w((x>M&CXlvn*|L=MIK!K_I3bD>G>FUc1Ufey&>8^k z%hOY9X~CiJWs%JCDfNUPWIXw96Ka4QqDzP@pv28_2Z6?#$u(|-=sZ|n6iw%7$MBe% zo}&IQy=b&=DK&~5G*SXef~Av|wrs&LlWuo`I#h}-?OfL^g)LjRM(ZoE+++sPqI2Eu zAK5yWSm-5c(p7*^I;M&j8xRymDeW@c-*K;4tgcu9f}y&_rU+Qn0rcO!uolS7jH{&u z*rIc(j|(qJh#Mi$vhKVQN}!PgkjO}rMo75Q7tdOxKzj@CH8R@mUZW`?@uaCoh^0Yp zEfp+Ch3>5_;|ASntDPgvU?7X-kz8j(rk#mDfC!FOix6eLi-fL<5rDPcI9e<7Sd@$7eQn}{GniCGx&NCgAihw13-+xctRSIngNN=O(3STUGj=VI|`rhesDE)>oS`aOR_ zOg`lN)$RU}r~n934s0lZhWAP>=H-M~p%Fw(LTszwa#lM|hpFqDUq#hoLkt}%(#T;A zGqWNX7h7yus=I+0LYLIXCx<`h+n{Dd@2ysSZCZl*Y77Y_esL`xTZAiySCrL)YXY|wzKp+l7xKlpNq&F7ox%~E-RJDEB zw*!)*!Av=O&IRb+=pnh(Q&+p4?2To&dg_8CMLQEy@3``AhDt%N$gqGZ#MAeJdL+g^ zK<7n?G!opDs&O!VxJSEQ-@Xu6?kq%`OV4Ua2QPj457nfPI?TB_%fuS?;9^a3+m>`& z@?KX;L_rdhLoUl;?V(r=9Y-g#U9TW!t1eqx>w>7Z2ly4uvR=8R2nQ4Sa~g7mpF(dAy$$-X8Lo>wxR)+FVWH4Rw*WB)@feaSf#7|N5eb?Dj3)Qa zxSe6AW>&$Q3lFR0bH9~@_&Vp5q0<(v6_jJuxE?6iDrCsU1|dHg zW)TMa)My^Wl)ONzjZkg?>@l2+MBt_hgZ2g{MfhP238~ekK;GAG64%=ms!K# zY@k#51Yi(G+Q2dS#((d!51=F7$7tK@ny?ch!;+A|j8Cww2*K~RaXsDvm5E`*lfUuu z8^b_p_*^v}&f`HDL&Q~xR+g=LRcC2qX27LNfdoXVT%rR&mwJHRTph~nRf-r|!&og|orfa2^+wGzBc!)r+MJQfhvouwA&KNM^g7}RM&d^f0AR&`vNcNm zsFt)Lr~4s?zhLbC!dwi;9BSF>A9}5-MJnU&>4Kw?c@}VE@e2FtJH-0x$KkACeMD-* z&1KZeyTsSnX=Rtv(g>5uX&E`AOd@*(=xrF|jSLV2ZXfj|tTlA|0i^O5lT6fOg~oal zPKH90T_cCl)bwuAfRxPM65RF^55+Kizih}rtWr5C8V8lJ#4@OR1{v`V7pG`!_1={7 zqdPB6Stf&BRC=>Wk+q}&jtJ90Xi(M2N!i$AlOPfND!$0Sa1b(vj}5e&i7|*31&yHT zK`>F`)Ny=Vr&3$A&>|4PwA;jlq)v{VbE6{Uq|(3#kCV82;|zk^ICv*16tqvH64NSJ zIx(fgzI+K1s;D-rlWZxgiEx0R1Ehrt5tavzTn7lMt9J7uKXzq=jCKc0vJhuA#r9Yj z&ORs<(9!)CG$a*bV%UVF+GvPzz`?@^wy!77Ng$U*ypk_DX006*nA%iRbd3NwhqNOk zfTBtuAl`+SWZut0R?XNqz~De+X}~x~y{&7qtR>qm(eV5OA_QZsa%7+;IyTVE)-s8M z&&8H8hsd}f18d~LP+FFyAkY@=;jC`Wz|~r_o3I8S^4uDW14SVP1w67wkI$LLybhk^ z7Jbjv)@4gH07NK02&YVgke()9Dx8oQtkUCi&Xq*ts=8q53yVw?qAUr~hEW+~0}t`# zo+tE*ogkD55P?P59S#Br@^X@FL1+ZQFeoX*o*(kWHtbxS0VQJ|S%C-zXq}C^z2Ll>lN`Y8(a9NrMKe%a?WL@KF#N9Heoj zTcvFKr8t}|NNVaOShd6l;l;j$Sb*c}T(aS#LPfLB8Ks!8(7?Nk*eKc!(1B2YoEYYK zj2{*y5HwN0kn@;;_yGc5)VZcTuV%AqJc+G;rzwP9USdlY7WIzZ9~!hI0fShpn2gN_ z%f+2l6^Agd3^UfHF@~2Vm~1%~N(fr)|5V8zg_s6KE}&H6{|IJbVIi>$1nbtVLuMU9 z(8hp^i&!rNOZ`yAy@?uKfuad<&Ft))H8dUIR3S&lEX>bWk^-HzGxRUpf5zAH^8BVv zKqus6BoU8^iMhEsyG#cKq&0;W7A-+SIQPY!6Cg6woL?!(J8TyhkdVc2ya#A72MF}@ z;UJC66Z7+%qJ%J8;|grCe9DYn{3MG5;imab9JeRvKqOvCNZ7feLhXnJ>nq3zafTj? z^0$nge{OD8W)f+N$RP5C#f8EODh3QIpUlqAMuyS`4xoZPW`2G?tKj&|%*?J`%L`lK z+*{FgR_SP0S|(4bbK%)x`@-hM%^2{}__B($#Z)#+or|*MIK}}VAV@;2p~sifR4E}e zj>rfzz@|-<5QU(M?0RN)mR7dm_#Fx1#O*WA$JGdj=R@o=>5G!curwcHeH771nLv)cAOA>!VuMl80V2<= z1*8*1O2|VRfi$T1)XFtV6F`V%0>yFT^Z|`=#~a!L#6fp3p-%xZh@)W&3PQ5R2ISrK zfCk~#7!w%u%7sHwFbxe7aWI$`gJ9Hu6veiJAVYwR!hA|ZkW&-C*FcP#i<|5AO+zIh zJ|WWNXlN@BPoH){HG#3dM*xx?C* zBRCB&iXWd=wpP3HAedDd)7H{L#%z(0Imc!@CQr>ULWSAbe#|Abh^OOFN)}6rqM|sq zLIXoWZm16cYn9!KYXOvUR;@)iz&w+W%60!1664m%?l9U(+W#&Oh>ikGHMBjKdB@Bo z1C2mqki@1ea0JBMy_YTOEgmmVv2LBTQV$P$4YeEOY{iVml0(l9Nx=Za3@~O~?;$F! z-T}ZkrU<3$ZHQql;@4iq(XDg$PSM1AUu5s6CBI5RYpQ}h=JIjgZ*_lFN-ov01aXU~zI1*QTzu;VC z*y+fMhMV$FB?AZy02yF1fLMzOn8wp3T|03d9(Rh%ukfX=A& z{P};sY0&v~g+{{Lp&CNy7yK&5(Chpv+ZUMGN9Q{hkkM&0B8)PxHM&?mHM+VI49~&c z8K7_ggP~S0{KQkV6hzYgJ0|Gddpi|=#}cyA;qX4OdOJqCQ$_)<9+k-PAF6-I!1kDd z-?IZic<>*wLufLg1IF+6q%ul$COMtcvh9dbd=W&y%HOZv+aDWRoG{mbliQjY90h52nSQefR<}_Q<(cw zi*X!K!qpqQk}Ke9iUCgTr2+dDRMg%TD2k4N2&gneE>*DcE)I0SOpk zpy&f<1=mJuTmb^MCLRGX@6_y^I~=V-R-6g~ajIGazRLRq0Xo zsz})|4wY0F8M;7~^nf4%X(L@0K2fYBv?4Yq9LL<7TOBVUJNwibcL?>FKrk0WRU`({ zY=o#lr4dmpBWtz5FDk^xg3{KMV>N~_>~tHKb!U+Pm^>^ZMaV3AzJpyJ^0A07lNpa~ zS<{vqOV&gmN-i6QjM>0im4JcNDUoXvb9om}4$wh_2@x&jmpX;`$A*4v@CYvMP-H7F zLU0KYiq^N?(&)14ert4L&oAGgLY90u9MNGgvSx}@Fr7_oStaaSv2yQhAbKS8B~&U* z$Q|o%+PIMmQsZ}Sk!HM4tyzO-ti4WBf){%5onP#p2Zd6D0vK+(lurY+k;o<6*M$m@33>xlWO*o*z=QXgDI?8o zFa=?)7`TqSb4Wt1d-wPAVd{eBCBo))QCu_UiL*r|siBbV4`(C=gl)MBbkyDf0vFQ# z0+K>NLQ6{dK8^8Fmm?41KpTJVWim#mZ*>G%z?=~5OH4^_C7cf@_EKFk2#li)jf%9^ znNTZ^HdQ|qOf@0mPluyPqTGmp;G?q;$4jEC)4)n`;2`HUOaRuflXognE59Oox{4*Z zDuF-~47)*aUZ6Uct+W#=*JBZF0dYxykn%u%VbJR!m_+o@Fo_@p0N68^E+!c54n%rE zxXHWl=}ZWeql7pz4znH$MU9=87aemZC;*4REq)yYt(t}|GYq|T?*8JAdqRxd50OYr zG(EH=MEcOhB3KfT>;?5$SRWB20Gtg&g_&67%$5>@b$;|uJqB%M8`~A@qf^R4 zxA5#dcWdik@~<>iG0Q9`6efWsDr4!eoV#8!=^%Lz7#2{X!)ifm)x;~9#FlKVaGcUD zeVoXYNRvry3t8^ct%;I0eFKIEG6AsK9Wg#ScRWWf?~!Iyd^A>|eKOEX7d}+vAszA` zC$RwTH64Vqq)%@J!*Pl!Wu{9Utgh>_Q%DPj>dG-5Q!>Uuu#L(%G7?_i6GVRZ*MQQl zC`$$huMHaqM8u-=0I)ivomnA*;!8(bR0DAU0~nxj;aFbV+jfNbMlh8u7yxW+x36|~;5UgPdjJ>z9lyfQv4S3Hg-ps|4DNjCIJ#!#%JS2N9JQPy1_9Ip!~UnzSmwh)yp zouWm)A;qE5((<7>kGJa5&MZKe0#gr7=Md zixo8VA4Q{>bp%J6?b>y)Vkg$k#@5>7(?;Is$N&LsnvPTw7}yG3M=q!q#MV-6U8gz| zS5R6b7M+t8oH6(>LKGWXh_&kUinbMWB)w>ytV$NjguQ!TDr>KFOVV3zEuf^O50&y9 z(I0k2(^Mwv!d3qJlXoamP*_n*=l5n-Kg%I2v=+rJtcDpD5&Jd-`9Q_}^#$4<^tW*? zlN3lYwYZI8o0i7yU2Ylepdp9&V31f>S)px=wm`Bmk(n(=T0N@65&FGKD|1R(=n)CWiE-%u6TEoSF!8doL*SacIT<)9hDt*fg|{<7 zi^L?C&6Hxf$Z-&BO1If)?WWX7z+`Q>SRmbp8Z}e4CYdG@8Q?;z5rZu5Hesj6a|db` zj!+~YXbvMlV(~;HWSw*v1FCkAIfD=|OF)D^7OUh(UHBxCZO?3p29&9VtjW23Fo6q> zR>oFDK%htTC=e(|?A2aS1fT|r#g2^xgqc;%rI8b2zb?>Rx`PPNwJC9sz11WJof_Pc5wklqD8;q%NinwMi(^hYM>IZwbK; zGv^h9hM_ECY?RimCbs;N91Eb8rB;E2m^cPB7n&|1D3(vUU$_tK{B9bGb2UmBkf)`y7G&H>%t)WDhLgLvI}YH0Ev09y4j^Xc0Cq2Y9Jz^6m!ysP&5|~ zX!fMbnW=}sDr%WRy9D~ypzm4+F`rGy9{AP7jRMq`EZ%H8Ye=L-UoZ?n?Wg>5n0 z(Lo5od9v=_VnCtRfxt5rXAp zkPy|a45P3>V0LCk62b!{VnpMD60*3+1BA2TQVLzco1ElDX>b8HHn-#_7Z&4$pve-U z?bP%X5+eE;CY*U>l^1CcudK@s-NZ06J1ff;`N1w-C%6+6k`Ni~-apv`h_TkJnVa>U zYwd#V;sOnKq=9o{9gsC($n%=1DGW2U#~H#lUTTri4jV5FoY4AO$Z9APNakrryDYF` zL6{745IQrn!3aqcOT&!kL+RhZ9j665KKeyQyLC*Ytw)M^^CDKIa!a4N76N0FWh8`l zf2s=x*^3?vsbOJ$0qa4bhYa)!GZm$%L9%a1IkG3#7?_ zxSc_C5tTSF!6j^XpgCNCm>}&|H=$gi;WWd!QpD`W=C2!scrb&6hVPDYW?hS5fPwXF zI7(laY4|Kz8YzYuFl7+q%ljr05fNJZ3eq|VabUH;-XYmS1w@)$HY_v06^s(l;N5!3ZefD;a~uH&Aq4^<14En#zr8BR z8gW9xJ&sfW5sh8h=#TF-r`t%i!Tuq zU*i%BAQXpn5NdS*u0Sx-n+7`uNn(L^c4yy!*<{wK#4N@D-Y=R?S{(`?T;?2%%?=qa!@mIh`{w#FcXbT2{M3f*|#OyYmFfkPgP*y)LB!k3g08So#wWT%^ z)di~9!p0)B=nm0oq_c7lf+eK0BOuY*HUe-<53s99rLnjAF$(tliYZPcIC$zH5E;|R z)FCxPIz_S8@09?$n+VrocdKuo8YA>gDfW`QGXcTrdZ%_?fid(j$*YZ3>PD1~d;o_` zUjT6&$Fl)skRh?sLFsZOg{$!iK&T80ETTRZkO-5jE?usW(=syXw5U}O;-*pIRxB?u z(INFwgB#-0*-&3?Qv#03I11Z!KaV58ZGz#(2VGO?w`)675Fcc!0md49<4{?R1AvMv zVl~29cX|pEVJojq#eqEmuhy~M4m&&~{u4nGhVq@X^$>X8J&c-E85wc(oPx(ns5^~K zp=>uwqa|lFYmkA2F2NLwjss3)N!y;;C$^&>uFy-n> zVkchRnE`oSRnG~P-x+}!VkVxx1JtJ>vcB+it}TvDw};!(;FxIe4Zyj9sz#b)!B8AV|@D%2KUQ5bT7@yD13 zhzOybe5p{$#Vhqqme@(4kdYpU%yWP8bH$3J83<*X>b0d+j}G^95KBh zFep`w6`Hl-2p6MLM?GUSJZPgSrMN365ymU#z4;gb25It!&;rU3Gn?TR&WCl=w3Rs0 zwB%Bi1B{YSAHnhJksZoq2m<3ApPYA*!5n|Gt499&90SS@#?sO|tb*6J+)!FAfG#6V zPHx)^TTj?qSecg;j78k<6F^&Jd55q~&9lP1y_F^)1|uAzR=cz%BRM%`^8~bHr{%`6 z7D>4~_qLY;+itT!JyQw8Xv~N)io6$t%ebYE^{#!%s-_a#5^tfYdFXPiTBx`CDgbEl zXke88(GZwR1kp1m35f_!hg&X>7>SryK-%ZLEXSTXDPr`;Nwb+svhGr0f9K=CptXQf zoJiujr=;2llA4>KnL{@Sj*R7}(#+{aH5_u0J-n*qLx z`aD91r-}zMip(93DR8895NgdPB$$W0nJ^XGnK2Kl*J;2TSTGU&9T6F-p6LJ)7dj`# z)rBw95r{$Zf(~AZSPQr{pI8bBjJgmAO_+!$8-(^!eGtsJ=sv;jU_t|goJRp` zJ{<_$i2%VX0@1rvCIieBi-%GeX!TLW2wl z_2mT6{a77=408w~#bfLB{=;MI(Q*PI6LkNY^kMN(X9CZx<7w|msH+G>o}Smjs2s1b zL_zt$kg@5tYwIB3fb|4;Ot7I0GK(QwJaOKUkS$yBFXHB_*dNw3B?O7}R!Iqg)MJqm zf_Jm8NGu@^Mu=N0B5W}=B*d++5GznRXrkiv6>{j-fI2sbB}^-=Nr2HFFDGEF&6d_z zpjhaIciShX71gGM07Uj%fzhnF0T1!7;b&(JZn%N^);J*{7Y1obi0fQSLCt8(l8|6I zfshE*78e(=QVW@@8O^C7R~YQrX`Cc2$Os`hN@+7oI!8P9eeC~P4uXuG1&c-0cNvTj zBt%k?WrE$mJ|Dst25LDD3K1g&AT=Es0*mEp`;q3c7 z*ir`q6M(7d5LoG6M74335qI)VCw@{AUW_PXgx%HN;LZ{VKg~aLteEj;taI8XMNLX64EpijCDtbzu@~MiGctawVJIZV(2v>Kfgb8xrD` zv!zZN7|JlDl#)Hs$x>=z;tfq^T!MhT-0>Yiivwb)UM}aZpc+@Y=z|SCmE@t;c3c}< zGU>3g&9XsJj4hHe_f`*HWz}*^16vr&UxRKzWqdu`Clc}6$0A36eB2XsI+${9N9C9x z=LF{5AlIa24QiUME?bzK%(fM`-iR1fKLHdm1~jyEucsC`U@_jnH-CB&XuFE_Xt%Cm zr3*HUvg2~g%5rNMb1OuEx^FaS+J$XqQzU9Bx2F0T2~QCjc_OOEGMohxG~Ae3j*Q>| zs3fPMN&FoGSmM{)khJS^`;b9H&-P7PW48$3QlEr$XcoRO%WeGJ3awq zfht1fqoP%6LQayj3`As{9A3%y80AR}3HG3%1{o>W+ivz362zbWcc({@ZYeszh738~ z7T{qz4J?KMw^@x8VZuETw2>Il%Omj)SsBuUxrb;Y*AUrwf*U2EQclKs04VW;d|(1R z>k@Xhclc7`K$ls-?M2ut3!S9+2LjVICiHhh3;sXCb92j_< zKxaiO0fEsxjS*@zBIC8*CSj$cbZAf`(+5C^5!6=e63`eD0^UFg*yoa3{URx6u;MZy z9=Pd@BGA^AzLx4sLJiZeoOLR~){ccXsb-Oy$l&^)?SAp8py&AS`2zXr(0SBZ!4ayG5O=b3722bou` zNi~cf9|IuCBsLr8CxB8IVF)EHo*-IPiy+(jI!BS1Z$KBsz2F(VKB4A&?E1nh97hsX-rVV%^8W z`t{q^E@3T-eX9q?-%F82L**)u=b=13T1JBQ_hE{A^;*RyNO#8eH+@K({4t$ z2-HXPV}Vms_<_7yc-)o{iJ9K?>Pbk6pdlu2gA!h~L^i)$FzSNgVpl=eL%XgrcRx$)+DG0uPN`M1E#SK5nAtBPFpm5+6 ze+@4@#DRapg5Lc_-3;#%-ZDQ6f>s#`?0Kw%qU2b~Ie7f^w7rYYek;MD;mzbqS(J)6 zavJgmgW{>rlQ9%s1xj8 zpI=zK_BYqzQSdGF5GDeoEa7*t@w7C4aC~lVcHO#lcmi`Bem8t_a%t-lp7^BSy!Qi( z*tNxC)IfzJvia2`Hm0AcQ$oyn2Ep)?T)E_AOufhv1{wN!SQ`&Y4M`;&hd^ZpmY}4l z$}A|nMIhN9sx6orF%UEe{A&KXse)5c;}kbVLm*BOB=ASwVs@j(v^pj_3g!U%!lh%! zp`odrF%1{HG+~ejIdGsxS%2+sZ``nH)5cBn3z*yymeA(I#MBOR>(=eCZs#3uzT0lQ-sV>O+~M}O z-S0O0?tk0c?6S))b2uJQ5|*$8fD75N&;?}H^Xp2hECf>0lB||mozoy8P8t>}ATTGw zHj`##x%c&`YZ`x+xiM|q(uF^$6cy;JJg>9Wb-eMkZ$=Tz#B#d*vXYcubn1bK;-n0BWfd2p5Up&3kXei^XHBwMssE8#;@Di(d2It+WGa&%MsdF?43?Ow7{i6j( z*7iw=^h(IJJ0V-QE-oxc6ylcvXc?Kw8LaR#x#qgx-gw!sF8|hr7oGpD@BZLNmt1}I z`WtS%am!{}wq*^P@xo|N_DeHD7!l|D^p6giSny}!^Vx!n#OW#Q)_0hvrg-=$J4w8lPz&UN&eH#3iu4c_2uRD*Zu|{9KL@3 zx88Zu$-C{k>pkyw=SM#DArE`#gYe-1hn&S^IX|*n^_Ls%fp@6{qC7L0I|OJr3z>Dy z5X_qf(h^9Z)KzibMX}wx1ttpzA_e~ZYunqlc9dx_vV@$@4f?!DJAvylrA7AQT7(L= z#;7ns^v|tNtZ^rqXamwaVUeu>7Mr^oF#Q8T55z8uj&_9RD5)^DxC4QkQ+(!c4OIz$x>TU2%2Y?a@*Bd1TCkLhRz6Jw|VOw%Wpe%jR2f$mn zX|j)bPPaWuIa;*q$KL32#M-r2uV4R#v(EX%r#}0=i!R=@FptxG{9$oq(GJ7%;mXk` zMr^GwtfpZ(&LPk;WCr=NjKJ(!Vk!jJQPd@QG& z=@TnE;91sA&!s*xG0==kU+&@a2g+Anea+k7`=Jki;w`b$47*HNQ6D zkXExGtZnQAJV#*x5sydI z7*5jxfQVvWBeFu+bc6BHD+oOuj3?3|C^q$WI|L)OG5JUva*|%kIe=6aMALjC;?BUy zJb*|&Xo+0Y!;Js#4}AEP(>}L;{k52X`D9$QD8QHm$to{tPRCQm%!uL^x)hA>lxJtx zZk*rr(NjKs+ULIbh=U(=)bkF1;QjB@dZtn#*sCcW>Y1~jZp1jmZj142jF-buw6V_q zk|d@wl#e;-8*B~=u*Gm61wqB(4=3$_O$PuopolCZx5FFD;)WpG;~$@26_Mgb2f1|i zQ3?&kMvgo=Nc0V$160Pgvt$w?Q~z(SyY8e9ed2v5f9%Suu9=;gSvN;_abU)G1}YVm zNR^feGnIt#*F&?`_#lD@2yoxX=gvIq%U?P736FW?aW6UYp7*$$kPH!5r{)r~I_|bF zFVZdL6qH+B9ID?Nw4K@ZUa$jpRG!0f(&qpGhKj5!#%FnjK%9QmUXn*@omIp?1d1ko zV@c-eSzFbyc+8|eBhoyE zTkZu(Vca^?@o-Zpo~9E1eih5fEw|VVX$>iN>}1w3y9I)nYuK!2T{zg>5vb$0w+;jB zc>rjqvl5z^p9=Yw9lw1*1eyiR#s~r^Ycr0k4WrSrOnPr=9MS*OP)_{6`K=58<<0N- z+Skv=;tlj@F1kb?LsGMngyV~XG+r~#ODKsPwjR`#ChIGe^o6s z1_K0N1+QB-hbaF3U;p#z&wa@!PW{Zn!lH!caQX})XOt_X=PDFbS714$-vOEHFU0T4 z{o{i5s0kGB5z1gnDb8T1{@Ealh=2nDjYcMu?p|qa?8+!?U0%Yi-0)S|(ecO`b|fep zuc|0e@Zuh8)Zng+of9{cupQpwy+`8It5#@l0sR1FV;b`=b&-z2W(34oiK+jyR zr|`_x6xLu+FBLRNIU$Qq9}?+DXMrY6nh5#SPk-)&x19Ks|GgBK`;i}~&{nX?jkiT> z&T65RK`fHjah%d7C^4W>!RIrqC$zLQ@xc2Yc-*l^KJws)pdI5Au_IDs)r00rZnWnb z$(fc_&P z^{1Mllk75rW+pdmkkV)liP*{rk=>*e^jfS(U}#3xriyG}28i}Gl^!zY&NcKhJ;K`Vr`Zb-O%I-qUDKmS}Vd2AdsMrbDc*M;tcKxuU%afjg$ZY zKmbWZK~!!+S_ve1xqyJy`3OFG7m2Mrgo})KK5>qHhITy1-cT}iY%r(dc9(>y7a-mR z4AyY(wSiD_0D|7d8FbvM9%BMSq;v0`o1MdBx5_9kVz~v(BeWmKEvAly$cj4Ib{U`- z|L~H3I^iu}IQtyhOQ+ZP%#i1rcZ;c<+oIiyimn;JaAT3&mMyfIYl#X8M_Jw$y7_)XgAp(wp8g;IAir#Nqfnz~W*Ct*DlDJyeBuM(erA0=&bfRXc z%NS!cHLF*|q;dDRGm!$a#Z}w=F(HM&&bZ~eJD%lCyOEY;$L2^nNSs*geBPBi~fkL4or#3fk*zn#D zeDobBe&E-?xsH}MfpR>oB{kJZoQo)pBu_<;bF_u}V0bN}1l4wJ!1J8an_Rv~uK zXkk*#*$9nDvmF^dXqdcUW4eh1+-ZDPZVNRtL{Gu{#$nwg~=myeQ@S6{RK z&2NA2$sa!zYkZpfe2`KQcG<|2Cr{lzSVMtznTXSZmWUm%M(1TZT6)$`7;~xD8jN95VKnF`a`mqQCGL=APNmjP-h`+p5URnWL$)*u!fL@uc zC~prr0S8%-dU(Di!hyjkGorE_d}TVEQ zQ+xYl)ia1u)mI`37=!Y~EQXTCxBJGZoQKDst@$>fFV|VEKPXhsfV2iXSYNTqKGrIeNAk-KqKh4#3d_Dw<%1?>Pe z0Qm#}4Y0L;HT?j5g(?~UlFLj(k%9!{noZSR+i?y33*9W>CA1RCsdB=R@6Q|*OQQR0aK|k_JC&gw^qygk5(oecAmFQL~r=g^h*rsniVBsrK zFQCB%JUctHaem|5-u=GAo^#auKm1?v#6VxSHGT123AMW45;ANn=Da`G2#l+Z28l^& zmJym;#^E^Va0iY9XhaM@!bSw@=;3bkPA0gkFPAktusR1}HwD)4XHQjw>;SSBmXobl zwxzI3@(NVY)JDN2bX0fZTax15A#9^T)>=~#LK(jQ{N-i8I{r1UfBB!h;g`RKAa zz*j5lp3mS?HV}tK5vh^q1HW^SJ3)dB87zE|}XLO%qNbMLP zRCqQdT<^wx{il59^Z)q&zvUOdyc{zfx0tSqddyIWq!vn{=ZZ~MxUn853FZY9nrK0g z|I?hSUZ_NnsJ90c1in46yK+UU@?fsPWHbWC4bS&t>NN{_ z2A<0 zefg{BzWkUMJnOJ0;YWQ(`Hg{$OY3^rHjHQ(23vud8ZjdP4KgL~x_1=_cZsTRr$wSU zIk8ml56m+3p{A}>4NwwQRWXf3i2i4F=|LF0Vg)y6kHFCRYrFyog3epYmzpGN4!2N% zW@=v0Z4w(aPT;UE69l~DMKFC)oTcj*0wJ`fm$)al%d}Sh%-XMKX>NYuY1kQ?{&|+7t=Ot&?Fa?)sC-L@|zq`l>o8cRrF~-?TSpjjklMPmRL?4QS{es5J(-T8NnhDuf36QlnA4um zFAqZq=0C{bl+jX)w{8@o00ToJ)}p$L#j}$kWBEB6&YBr`btuwW5%el%ml7iJdppvX zkpYfCKuW|j8X^~hOc=-o+UUQ$g2*flYH}Jzkpy&>LE%`M0NlED=^gL+;J>}~MEroF zJO?XBBgPHDGmsYAZ4;;5;-ykDu(TZ1maVtEfn1HaQD6T+5_W8(6BZN zV&xYE#8|o#{3!(PxNEPy?!t>M{?gg!oPExDm;LH;D5&*C+|VO)8%az>e2D{BRt0P4 zML-CI+^v)Ii;KJLwBs=^Is$(;yV=dK2!XeN0X{6yQ6cSCuZ5tvZ#_fb#w83?#KFx@ z$Hhe&2wyT28M>+(s7@AA0>0hpNCUCahcmB?5+ju)(kxCxwNEE$6=C| zBr=&M6!|YHVlkE^lbudE4vUl!tge-Epe{7fIRD^71geo9VIf$=0-O+-YA!m;sw|!X zHQgc3YLYG+1_-QX7%&tk#0dl+4eXc1^q&)wq|^jLPpFvP-|8E4Atf$pgyIGe17RRytq;L0z3YU; zJc!ux6mIFEd->@FU%$ET`oH+=f5K%SmWhQ|=|cZf#v#px zgO>VwGO&|HX_&dAAB=ts^|e@YP=y^a)uY`tMU*f+kXYB67AVZzB3(`sfV0)zADWvn z*thu6?rdEFquq6`6GjE>xh}&|6RPMr?EG%DrwXLwcYmn6ta@EY@!WeoAsD52Kr$UD zF0trbS~n%v@6HoXhrvmMGdBa5e$|eCVX5*$zo2(mpXo#%8&(_wc*_BRRwc`1OAWn_ z`HmOi!zo@Aj80IasbE&1Tf@X&Sb zGr#necc1j3Z(aCZblKDzbiFr4$pw}&^m+k}f;iA2R0gEC`GrLU^{V5Je(p1$db6AD zAd0doS!DpAsr3Mm3=GG`b*_^{1s?4kr*4f0fJy?<)Oi4)gPC6ZQU}Gu5FbPu=DT@( zkjRX7M!;!op927;Dhf*a9{tjN0Kn0`{6gn89sueiq#+@E0AMC27TVabuqYv)Bb1p^ zOKrMzmI=E1MCDXQFSP7?+DojD;qI@LXvMf}6BNr^>ooN{43!$T2P@y$i5OdV8bk_h zt}xENcHa4~e%%`{zv3$X^)5d%TFw!!uEu%RZBmX-+9?HSSf-DCbL-}gIPB@iAM?Wf zZgVS=xr0uG0t3kfdoyX#I-y8#@MXr6o^Z$^k9g?EPd)wZC%*sEpZy#kA`z_Uh87x2 z9VLvoJ4R(s%4|S;!R*@UtJkl8=X*YM{{s&=@ZR?<2B_@2i!KDjV9qmqG~^X&q_w&6?84ZJ10x|HZRk^}4^>aN~`*>tDj_8)Q2R zAR`61Y>3-<9&q0S|KwFKJ?Me=!Zvmi7T|p42Xx8U+~GAJ)&j+xI z!zO&iO<#Vr?F2NobqW#^Dkof|yHs&C;*dui{Kv02_P_(~4uip`<9^63FJE)budyKA zkAHgUWxu-OS65t#TXnG__ohvoHgCqyOAteRroTD9blzcyJ@?pcpS}0od#^q3c!%5X zwdd|wtU_P7Ku)?sN@5%;Xg$z^kV>QTCV9`bIF&yXiWwL^d*w+Xb_!pkb(6N1ve1tm zwbfnd9z;8+fQ%eSfIVKc0D82_GVbm_<4b4%@t?m5-&tYepgE2|Dcgi0UAEZn$yo$( z8z_9yhhMsQ{^3tQ{@54qcbk3Z=dpl7?P{rV3xr(v}#aLWh6fog;n#i^ZhO1^UiI>$pYfC@;C@y+^}Ez` zqLG68o(XHO{?89Cx!~L1y$HX&^V3UzeeJdQ?P45XaO{E(-IIdMkYmEf8{JN4?*PGF zFFVYw+vOHJ-)_HKA8@z3-sfKTxaZyPa;trBDF=gwyAhkHrb;HP=rj7K|W2(1Qo>Vb~NF|gy^)j?6c3k4YciQ*4_q|^G z%9lO-pao{SQ3wfD=A*#+Tpvu9NVr13n7SJPI59 z=MbVe7%l5X6uGCl9k(j2Tet4W=O6yEqh5e(J}|^!D3Qs^0YhKQPflEU)iqdb?u%df z+P5ye=*lau!aZ^ziDj7ZWj0nMorv%MD*9Pk-n#yp^;ceb)j8*$kDveCZP#1e2bpSDs5>q&!L=HaZwx?ty{9 zLzV-rdpIhqHXQ)SoD!yz)^prjgpddV=YAWW05*4^blZI6i$bCQjp|u7V?PusbdMTd zBk^%0ahdpMzqkzd{9Jea^_XtVekLBAk}inbih?LZP3w>qiLfpLu1LJ(g-5*L@Tc#% zb_^thv6_>c$QmmqrX0yqZY`LzujH~#kp-~H5Q&p7uR-@N?tEAZ6_ItcxR zJ6RnkhfJ}A)pK{=X-7P1ap>a@dGx~%!t)lm zcNs@zRu{+|wr$RC;j_0*03@UZgE@pz1iJYO48#WS4kxeLBGo8@+hQd;V{lKg$c(iu z4+A}K1C`TWQ0IiXthL+*O1lt}XAmTf4gjBa{Y`$QZoq|Xw{N66z`~xy*E-ThBf&>! znx6FVVNTir*Uhm*-#9OU z)dJTPFlKPS>0R%9$5+1WsK-C%k^EH(dPl1Wpns>^KxMSE3|Dcmk^~-U{@fSN`sgX2 zx#;^pz_-WvT!PC-XlEWZG9EWj?J&WmDmwR{SibG8Z}r5-J^EQsd(s{Dza74f2R9E$ zyG+MjkNP^C$WwcZB0X_KCUQZ9|R zfjUDU4njj-sG%Vt>F&>llplUcR&6c6HO~QvzNmOwwA1r*5gn)atp@;&FWoP`B;=O) z&Kv*$0mgC%^pw;H*%f5DX;+t}5D*=UfIxyJ$c7yN@Tvc={_cc#o^2q(?6lL(U+~;#z2wN}?y>u>{1jpL?kxuZIY!{YB24|CJpIfMeB{4= zbjeSrrq0KWHw2mW0>8RZL!8Vi88G#0pGWIJuS52Fo z1n1pg?5b%20}cZ*l{*RM4t*Pglj{Pg>hn9@B;`(!rdXz?@!eVq?j#5VYZ`F1poU}b z+RlXF6M6N{$Y7lV=R7EILXcHY1FP77{)=CI>8oFl&z9UFX7>op)Nl`qP?B9!v<<2Q zmo|C^9bfJ4w%e{RKl(*4c=lmfzKwQoKCi5dfvypfs0d@yn07_r30p;~Pe> z09ImQgvqUV_Ic}8?0Y!VKmCle-tw;Z;rm^j@Z*duOtB-Vx=>`63e`BIFs`s>b;MNO zodz0cN(VcyFccl zQbGXIIUkavjT<*&L!-=G*Wnt!ff@n^O8r=btl?OMcV`*I#6PUsd0a�C5Pe;GlpG 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%0D-Pa&pF8du{>`-SfDex`s#06{ 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 dict[str, "Any"]: adapter_metadata["model"] = OpenAICompatibleLLMParameters.validate_model( adapter_metadata ) + api_key = adapter_metadata.get("api_key") + if isinstance(api_key, str) and not api_key.strip(): + adapter_metadata["api_key"] = None return OpenAICompatibleLLMParameters(**adapter_metadata).model_dump() @staticmethod diff --git a/unstract/sdk1/src/unstract/sdk1/adapters/llm1/openai_compatible.py b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/openai_compatible.py index 1ed942ba10..3cb3ceafc4 100644 --- a/unstract/sdk1/src/unstract/sdk1/adapters/llm1/openai_compatible.py +++ b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/openai_compatible.py @@ -3,6 +3,12 @@ from unstract.sdk1.adapters.base1 import BaseAdapter, OpenAICompatibleLLMParameters from unstract.sdk1.adapters.enums import AdapterTypes +DESCRIPTION = ( + "Adapter for servers that implement the OpenAI Chat Completions API " + "(vLLM, LM Studio, self-hosted gateways, and third-party providers). " + "Use OpenAI for the official OpenAI service." +) + class OpenAICompatibleLLMAdapter(OpenAICompatibleLLMParameters, BaseAdapter): @staticmethod @@ -15,7 +21,7 @@ def get_metadata() -> dict[str, Any]: "name": "OpenAI Compatible", "version": "1.0.0", "adapter": OpenAICompatibleLLMAdapter, - "description": "OpenAI-compatible LLM adapter", + "description": DESCRIPTION, "is_active": True, } @@ -25,7 +31,7 @@ def get_name() -> str: @staticmethod def get_description() -> str: - return "OpenAI-compatible LLM adapter" + return DESCRIPTION @staticmethod def get_provider() -> str: @@ -33,7 +39,7 @@ def get_provider() -> str: @staticmethod def get_icon() -> str: - return "/icons/adapter-icons/OpenAI.png" + return "/icons/adapter-icons/OpenAICompatible.png" @staticmethod def get_adapter_type() -> AdapterTypes: diff --git a/unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/custom_openai.json b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/custom_openai.json index 00f629b41e..f4720c9e92 100644 --- a/unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/custom_openai.json +++ b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/custom_openai.json @@ -25,14 +25,13 @@ "type": "string", "title": "Model", "default": "gpt-4o-mini", - "description": "The model name expected by your OpenAI-compatible endpoint. Examples: gpt-4o-mini, ERNIE-4.0-8K (Baidu Qianfan), qwen-max, openai/gpt-4o" + "description": "The model name expected by your OpenAI-compatible endpoint. Examples: gateway-model, gpt-4o-mini, openai/gpt-4o" }, "api_base": { "type": "string", "format": "url", "title": "API Base", - "default": "https://your-endpoint.example.com/v1", - "description": "Base URL for the OpenAI-compatible endpoint. Examples: https://your-endpoint.example.com/v1, https://qianfan.baidubce.com/v2" + "description": "Base URL for the OpenAI-compatible endpoint. Examples: https://gateway.example.com/v1, https://llm.example.net/openai/v1" }, "max_tokens": { "type": "number", diff --git a/unstract/sdk1/src/unstract/sdk1/llm.py b/unstract/sdk1/src/unstract/sdk1/llm.py index e6a49a8bb1..bbfd91b6cd 100644 --- a/unstract/sdk1/src/unstract/sdk1/llm.py +++ b/unstract/sdk1/src/unstract/sdk1/llm.py @@ -11,6 +11,7 @@ # from litellm import get_supported_openai_params from litellm import get_max_tokens, token_counter from pydantic import ValidationError + from unstract.sdk1.adapters.constants import Common from unstract.sdk1.adapters.llm1 import adapters from unstract.sdk1.audit import Audit @@ -547,13 +548,14 @@ def _record_usage( except Exception as e: prompt_tokens = 0 logger.warning( - "[sdk1][LLM][%s][%s] Failed to estimate prompt tokens: %s", + "[sdk1][LLM][%s][%s] Failed to estimate prompt tokens; " + "recording 0 prompt tokens for usage audit: %s", model, llm_api, e, ) all_tokens = TokenCounterCompat( - prompt_tokens=usage_data.get("prompt_tokens", prompt_tokens or 0), + prompt_tokens=prompt_tokens or 0, completion_tokens=usage_data.get("completion_tokens", 0), total_tokens=usage_data.get("total_tokens", 0), ) diff --git a/unstract/sdk1/tests/test_openai_compatible_adapter.py b/unstract/sdk1/tests/test_openai_compatible_adapter.py index 1f58d636ec..53eade4601 100644 --- a/unstract/sdk1/tests/test_openai_compatible_adapter.py +++ b/unstract/sdk1/tests/test_openai_compatible_adapter.py @@ -8,6 +8,12 @@ from unstract.sdk1.adapters.llm1 import adapters from unstract.sdk1.adapters.llm1.openai_compatible import OpenAICompatibleLLMAdapter +OPENAI_COMPATIBLE_DESCRIPTION = ( + "Adapter for servers that implement the OpenAI Chat Completions API " + "(vLLM, LM Studio, self-hosted gateways, and third-party providers). " + "Use OpenAI for the official OpenAI service." +) + @lru_cache(maxsize=1) def _load_llm_module() -> object: @@ -41,11 +47,11 @@ def test_openai_compatible_validate_prefixes_model() -> None: { "api_base": "https://gateway.example.com/v1", "api_key": "test-key", - "model": "ERNIE-4.0-8K", + "model": "gateway-model", } ) - assert validated["model"] == "custom_openai/ERNIE-4.0-8K" + assert validated["model"] == "custom_openai/gateway-model" def test_openai_compatible_validate_preserves_prefixed_model() -> None: @@ -60,12 +66,37 @@ def test_openai_compatible_validate_preserves_prefixed_model() -> None: assert validated["api_key"] is None +def test_openai_compatible_validate_normalizes_blank_api_key_to_none() -> None: + validated = OpenAICompatibleLLMParameters.validate( + { + "api_base": "https://gateway.example.com/v1", + "api_key": " ", + "model": "gateway-model", + } + ) + + assert validated["api_key"] is None + + def test_openai_compatible_schema_is_loadable() -> None: schema = json.loads(OpenAICompatibleLLMAdapter.get_json_schema()) assert schema["title"] == "OpenAI Compatible LLM" assert schema["properties"]["api_key"]["type"] == ["string", "null"] - assert "ERNIE-4.0-8K" in schema["properties"]["model"]["description"] + assert "gateway-model" in schema["properties"]["model"]["description"] + assert "ERNIE" not in schema["properties"]["model"]["description"] + assert "qianfan" not in schema["properties"]["api_base"]["description"].lower() + assert "default" not in schema["properties"]["api_base"] + + +def test_openai_compatible_adapter_uses_distinct_description_and_icon() -> None: + metadata = OpenAICompatibleLLMAdapter.get_metadata() + + assert OpenAICompatibleLLMAdapter.get_description() == OPENAI_COMPATIBLE_DESCRIPTION + assert metadata["description"] == OPENAI_COMPATIBLE_DESCRIPTION + assert OpenAICompatibleLLMAdapter.get_icon() == ( + "/icons/adapter-icons/OpenAICompatible.png" + ) def test_record_usage_uses_reported_prompt_tokens_without_estimating() -> None: @@ -83,7 +114,7 @@ def test_record_usage_uses_reported_prompt_tokens_without_estimating() -> None: patch.object(llm_module, "Audit") as mock_audit, ): llm._record_usage( - model="custom_openai/ERNIE-4.0-8K", + model="custom_openai/gateway-model", messages=[{"role": "user", "content": "hello"}], usage={"prompt_tokens": 3, "completion_tokens": 4, "total_tokens": 7}, llm_api="complete", @@ -91,6 +122,12 @@ def test_record_usage_uses_reported_prompt_tokens_without_estimating() -> None: mock_token_counter.assert_not_called() mock_audit.return_value.push_usage_data.assert_called_once() + assert ( + mock_audit.return_value.push_usage_data.call_args.kwargs[ + "token_counter" + ].prompt_llm_token_count + == 3 + ) def test_record_usage_tolerates_unmapped_models_without_prompt_tokens() -> None: @@ -106,12 +143,50 @@ def test_record_usage_tolerates_unmapped_models_without_prompt_tokens() -> None: with ( patch.object(llm_module, "token_counter", side_effect=Exception("unmapped")), patch.object(llm_module, "Audit") as mock_audit, + patch.object(llm_module.logger, "warning") as mock_warning, ): llm._record_usage( - model="custom_openai/ERNIE-4.0-8K", + model="custom_openai/gateway-model", messages=[{"role": "user", "content": "hello"}], usage={"completion_tokens": 4, "total_tokens": 7}, llm_api="complete", ) mock_audit.return_value.push_usage_data.assert_called_once() + assert ( + mock_audit.return_value.push_usage_data.call_args.kwargs[ + "token_counter" + ].prompt_llm_token_count + == 0 + ) + assert "recording 0 prompt tokens for usage audit" in mock_warning.call_args.args[0] + + +def test_record_usage_uses_estimated_prompt_tokens_when_usage_has_none() -> None: + llm_module = _load_llm_module() + llm_cls = llm_module.LLM + + llm = llm_cls.__new__(llm_cls) + llm._platform_api_key = "platform-key" + llm.platform_kwargs = {"run_id": "run-1"} + llm.adapter = MagicMock() + llm.adapter.get_provider.return_value = "custom_openai" + + with ( + patch.object(llm_module, "token_counter", return_value=9) as mock_token_counter, + patch.object(llm_module, "Audit") as mock_audit, + ): + llm._record_usage( + model="custom_openai/gateway-model", + messages=[{"role": "user", "content": "hello"}], + usage={"prompt_tokens": None, "completion_tokens": 4, "total_tokens": 13}, + llm_api="complete", + ) + + mock_token_counter.assert_called_once() + assert ( + mock_audit.return_value.push_usage_data.call_args.kwargs[ + "token_counter" + ].prompt_llm_token_count + == 9 + ) From f6a2a7de8e6a1f934cdf4667afd5006cf4e82f0f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 24 Apr 2026 03:11:37 +0000 Subject: [PATCH 07/10] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- unstract/sdk1/src/unstract/sdk1/adapters/base1.py | 1 - unstract/sdk1/src/unstract/sdk1/llm.py | 1 - 2 files changed, 2 deletions(-) diff --git a/unstract/sdk1/src/unstract/sdk1/adapters/base1.py b/unstract/sdk1/src/unstract/sdk1/adapters/base1.py index 2f52ab31a4..427e1d361b 100644 --- a/unstract/sdk1/src/unstract/sdk1/adapters/base1.py +++ b/unstract/sdk1/src/unstract/sdk1/adapters/base1.py @@ -10,7 +10,6 @@ from typing import Any from pydantic import BaseModel, Field, model_validator - from unstract.sdk1.adapters.constants import Common from unstract.sdk1.adapters.enums import AdapterTypes diff --git a/unstract/sdk1/src/unstract/sdk1/llm.py b/unstract/sdk1/src/unstract/sdk1/llm.py index bbfd91b6cd..ce5819c9ec 100644 --- a/unstract/sdk1/src/unstract/sdk1/llm.py +++ b/unstract/sdk1/src/unstract/sdk1/llm.py @@ -11,7 +11,6 @@ # from litellm import get_supported_openai_params from litellm import get_max_tokens, token_counter from pydantic import ValidationError - from unstract.sdk1.adapters.constants import Common from unstract.sdk1.adapters.llm1 import adapters from unstract.sdk1.audit import Audit From 37e8afbaa7aea28db797fa142a71afb2792ed027 Mon Sep 17 00:00:00 2001 From: jimmyzhuu Date: Wed, 6 May 2026 19:22:43 +0800 Subject: [PATCH 08/10] Refine OpenAI compatible adapter schema naming --- .../sdk1/src/unstract/sdk1/adapters/base1.py | 16 ++++++++++------ .../sdk1/adapters/llm1/openai_compatible.py | 7 ++++++- ...custom_openai.json => openai_compatible.json} | 3 +-- .../sdk1/tests/test_openai_compatible_adapter.py | 10 +++++++++- 4 files changed, 26 insertions(+), 10 deletions(-) rename unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/{custom_openai.json => openai_compatible.json} (96%) diff --git a/unstract/sdk1/src/unstract/sdk1/adapters/base1.py b/unstract/sdk1/src/unstract/sdk1/adapters/base1.py index 6d5f61ba40..a587272fdc 100644 --- a/unstract/sdk1/src/unstract/sdk1/adapters/base1.py +++ b/unstract/sdk1/src/unstract/sdk1/adapters/base1.py @@ -4,7 +4,7 @@ import os from abc import ABC, abstractmethod from importlib import import_module -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, ClassVar if TYPE_CHECKING: from typing import Any @@ -76,6 +76,8 @@ def register_adapters(adapters: dict[str, dict[str, "Any"]], adapter_type: str) class BaseAdapter(ABC): """Adapter base class for compatibility with all SDK v1 providers.""" + SCHEMA_PATH: ClassVar[str | None] = None + @staticmethod @abstractmethod def get_id() -> str: @@ -103,11 +105,13 @@ def get_icon() -> str: @classmethod def get_json_schema(cls) -> str: - schema_path = ( - f"{os.path.dirname(__file__)}/" - f"{cls.get_adapter_type().name.lower()}1/static/" - f"{cls.get_provider()}.json" - ) + schema_path = cls.SCHEMA_PATH + if schema_path is None: + schema_path = ( + f"{os.path.dirname(__file__)}/" + f"{cls.get_adapter_type().name.lower()}1/static/" + f"{cls.get_provider()}.json" + ) with open(schema_path) as f: return f.read() diff --git a/unstract/sdk1/src/unstract/sdk1/adapters/llm1/openai_compatible.py b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/openai_compatible.py index 3cb3ceafc4..80ee12ce69 100644 --- a/unstract/sdk1/src/unstract/sdk1/adapters/llm1/openai_compatible.py +++ b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/openai_compatible.py @@ -1,4 +1,5 @@ -from typing import Any +import os +from typing import Any, ClassVar from unstract.sdk1.adapters.base1 import BaseAdapter, OpenAICompatibleLLMParameters from unstract.sdk1.adapters.enums import AdapterTypes @@ -11,6 +12,10 @@ class OpenAICompatibleLLMAdapter(OpenAICompatibleLLMParameters, BaseAdapter): + SCHEMA_PATH: ClassVar[str] = os.path.join( + os.path.dirname(__file__), "static", "openai_compatible.json" + ) + @staticmethod def get_id() -> str: return "openaicompatible|b6d10f33-2c41-49fc-a8c2-58d2b247fc09" diff --git a/unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/custom_openai.json b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/openai_compatible.json similarity index 96% rename from unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/custom_openai.json rename to unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/openai_compatible.json index f4720c9e92..8767ffdcf4 100644 --- a/unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/custom_openai.json +++ b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/openai_compatible.json @@ -1,5 +1,5 @@ { - "title": "OpenAI Compatible LLM", + "title": "OpenAI Compatible", "type": "object", "required": [ "adapter_name", @@ -24,7 +24,6 @@ "model": { "type": "string", "title": "Model", - "default": "gpt-4o-mini", "description": "The model name expected by your OpenAI-compatible endpoint. Examples: gateway-model, gpt-4o-mini, openai/gpt-4o" }, "api_base": { diff --git a/unstract/sdk1/tests/test_openai_compatible_adapter.py b/unstract/sdk1/tests/test_openai_compatible_adapter.py index 53eade4601..11b9b2c6ec 100644 --- a/unstract/sdk1/tests/test_openai_compatible_adapter.py +++ b/unstract/sdk1/tests/test_openai_compatible_adapter.py @@ -1,6 +1,7 @@ import json from functools import lru_cache from importlib import import_module +from pathlib import Path from unittest.mock import MagicMock, patch from unstract.sdk1.adapters.base1 import OpenAICompatibleLLMParameters @@ -79,10 +80,17 @@ def test_openai_compatible_validate_normalizes_blank_api_key_to_none() -> None: def test_openai_compatible_schema_is_loadable() -> None: + schema_path = Path(OpenAICompatibleLLMAdapter.SCHEMA_PATH) + + assert schema_path.name == "openai_compatible.json" + assert schema_path.exists() + assert not schema_path.with_name("custom_openai.json").exists() + schema = json.loads(OpenAICompatibleLLMAdapter.get_json_schema()) - assert schema["title"] == "OpenAI Compatible LLM" + assert schema["title"] == "OpenAI Compatible" assert schema["properties"]["api_key"]["type"] == ["string", "null"] + assert "default" not in schema["properties"]["model"] assert "gateway-model" in schema["properties"]["model"]["description"] assert "ERNIE" not in schema["properties"]["model"]["description"] assert "qianfan" not in schema["properties"]["api_base"]["description"].lower() From cfc70017ba880f694a462509fc46dc757165c574 Mon Sep 17 00:00:00 2001 From: Chandrasekharan M Date: Mon, 11 May 2026 15:57:29 +0530 Subject: [PATCH 09/10] Reject empty model string in OpenAICompatibleLLMParameters validate_model previously produced "custom_openai/" for an empty model, surfacing as a confusing LiteLLM error at call time. Match the existing GeminiLLMParameters.validate_model pattern: strip whitespace, raise ValueError on empty input. Co-Authored-By: Claude Opus 4.7 (1M context) --- unstract/sdk1/src/unstract/sdk1/adapters/base1.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/unstract/sdk1/src/unstract/sdk1/adapters/base1.py b/unstract/sdk1/src/unstract/sdk1/adapters/base1.py index 920028a8c9..8cd2263bca 100644 --- a/unstract/sdk1/src/unstract/sdk1/adapters/base1.py +++ b/unstract/sdk1/src/unstract/sdk1/adapters/base1.py @@ -247,7 +247,9 @@ def validate(adapter_metadata: dict[str, "Any"]) -> dict[str, "Any"]: @staticmethod def validate_model(adapter_metadata: dict[str, "Any"]) -> str: - model = adapter_metadata.get("model", "") + model = str(adapter_metadata.get("model", "")).strip() + if not model: + raise ValueError("model is required for the OpenAI Compatible adapter.") if model.startswith("custom_openai/"): return model return f"custom_openai/{model}" From 27215c2d34ba199acc87d6344b595aca1ebe8b64 Mon Sep 17 00:00:00 2001 From: Athul Date: Wed, 13 May 2026 01:06:00 +0530 Subject: [PATCH 10/10] Revert SCHEMA_PATH plumbing; rename schema to custom_openai.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses Ritwik's review feedback. The new BaseAdapter.SCHEMA_PATH class variable and the conditional branch in get_json_schema() are unnecessary: OpenAICompatibleLLMAdapter.get_provider() returns "custom_openai", and the default path resolution already builds …/llm1/static/{get_provider()}.json. Renaming the schema file lets the default lookup find it and keeps the base class untouched, which is the convention every other adapter follows. - Rename openai_compatible.json -> custom_openai.json - Drop SCHEMA_PATH class var and the if-None branch from BaseAdapter - Drop SCHEMA_PATH override (and unused os/ClassVar imports) from OpenAICompatibleLLMAdapter - Update test_openai_compatible_schema_is_loadable to read schema via get_json_schema() instead of touching SCHEMA_PATH directly --- .../sdk1/src/unstract/sdk1/adapters/base1.py | 16 ++++++---------- .../sdk1/adapters/llm1/openai_compatible.py | 7 +------ ...openai_compatible.json => custom_openai.json} | 0 .../sdk1/tests/test_openai_compatible_adapter.py | 7 ------- 4 files changed, 7 insertions(+), 23 deletions(-) rename unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/{openai_compatible.json => custom_openai.json} (100%) diff --git a/unstract/sdk1/src/unstract/sdk1/adapters/base1.py b/unstract/sdk1/src/unstract/sdk1/adapters/base1.py index 8cd2263bca..1e92fd0d79 100644 --- a/unstract/sdk1/src/unstract/sdk1/adapters/base1.py +++ b/unstract/sdk1/src/unstract/sdk1/adapters/base1.py @@ -4,7 +4,7 @@ import os from abc import ABC, abstractmethod from importlib import import_module -from typing import TYPE_CHECKING, ClassVar +from typing import TYPE_CHECKING if TYPE_CHECKING: from typing import Any @@ -76,8 +76,6 @@ def register_adapters(adapters: dict[str, dict[str, "Any"]], adapter_type: str) class BaseAdapter(ABC): """Adapter base class for compatibility with all SDK v1 providers.""" - SCHEMA_PATH: ClassVar[str | None] = None - @staticmethod @abstractmethod def get_id() -> str: @@ -105,13 +103,11 @@ def get_icon() -> str: @classmethod def get_json_schema(cls) -> str: - schema_path = cls.SCHEMA_PATH - if schema_path is None: - schema_path = ( - f"{os.path.dirname(__file__)}/" - f"{cls.get_adapter_type().name.lower()}1/static/" - f"{cls.get_provider()}.json" - ) + schema_path = ( + f"{os.path.dirname(__file__)}/" + f"{cls.get_adapter_type().name.lower()}1/static/" + f"{cls.get_provider()}.json" + ) with open(schema_path) as f: return f.read() diff --git a/unstract/sdk1/src/unstract/sdk1/adapters/llm1/openai_compatible.py b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/openai_compatible.py index 80ee12ce69..3cb3ceafc4 100644 --- a/unstract/sdk1/src/unstract/sdk1/adapters/llm1/openai_compatible.py +++ b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/openai_compatible.py @@ -1,5 +1,4 @@ -import os -from typing import Any, ClassVar +from typing import Any from unstract.sdk1.adapters.base1 import BaseAdapter, OpenAICompatibleLLMParameters from unstract.sdk1.adapters.enums import AdapterTypes @@ -12,10 +11,6 @@ class OpenAICompatibleLLMAdapter(OpenAICompatibleLLMParameters, BaseAdapter): - SCHEMA_PATH: ClassVar[str] = os.path.join( - os.path.dirname(__file__), "static", "openai_compatible.json" - ) - @staticmethod def get_id() -> str: return "openaicompatible|b6d10f33-2c41-49fc-a8c2-58d2b247fc09" diff --git a/unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/openai_compatible.json b/unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/custom_openai.json similarity index 100% rename from unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/openai_compatible.json rename to unstract/sdk1/src/unstract/sdk1/adapters/llm1/static/custom_openai.json diff --git a/unstract/sdk1/tests/test_openai_compatible_adapter.py b/unstract/sdk1/tests/test_openai_compatible_adapter.py index 9c8587c9e7..addbf080ce 100644 --- a/unstract/sdk1/tests/test_openai_compatible_adapter.py +++ b/unstract/sdk1/tests/test_openai_compatible_adapter.py @@ -1,7 +1,6 @@ import json from functools import lru_cache from importlib import import_module -from pathlib import Path from unittest.mock import MagicMock, patch from unstract.sdk1.adapters.base1 import OpenAICompatibleLLMParameters @@ -77,12 +76,6 @@ def test_openai_compatible_validate_normalizes_blank_api_key_to_none() -> None: def test_openai_compatible_schema_is_loadable() -> None: - schema_path = Path(OpenAICompatibleLLMAdapter.SCHEMA_PATH) - - assert schema_path.name == "openai_compatible.json" - assert schema_path.exists() - assert not schema_path.with_name("custom_openai.json").exists() - schema = json.loads(OpenAICompatibleLLMAdapter.get_json_schema()) assert schema["title"] == "OpenAI Compatible"