diff --git a/api/oss/src/core/secrets/dtos.py b/api/oss/src/core/secrets/dtos.py index 0a6b60d344..992596075f 100644 --- a/api/oss/src/core/secrets/dtos.py +++ b/api/oss/src/core/secrets/dtos.py @@ -84,31 +84,38 @@ def validate_secret_data_based_on_kind(cls, values: Dict[str, Any]): data = data.model_dump() values["data"] = data + standard_provider_kinds = {provider.value for provider in StandardProviderKind} + custom_provider_kinds = {provider.value for provider in CustomProviderKind} + if kind == SecretKind.PROVIDER_KEY.value: if not isinstance(data, dict): raise ValueError( "The provided request secret dto is not a valid type for StandardProviderDTO" ) - if not isinstance(data["provider"], dict) or "key" not in data["provider"]: + provider = data.get("provider") + if not isinstance(provider, dict) or "key" not in provider: raise ValueError( "The provided request secret dto is missing required fields for StandardProviderSettingsDTO" ) - if data["kind"] not in StandardProviderKind.__members__.values(): + # Accept the legacy provider slug on input, but persist the canonical value. + if data.get("kind") == StandardProviderKind.MISTRALAI.value: + data["kind"] = StandardProviderKind.MISTRAL.value + if data.get("kind") not in standard_provider_kinds: raise ValueError( "The provided kind in data is not a valid StandardProviderKind enum" ) elif kind == SecretKind.CUSTOM_PROVIDER.value: + if not isinstance(data, dict): + raise ValueError( + "The provided request secret dto is not a valid type for CustomProviderDTO" + ) # Fix inconsistent API naming - Users might enter 'togetherai' but the API requires 'together_ai' # This ensures compatibility with LiteLLM which requires the provider in "together_ai" format if data.get("kind", "") == "togetherai": data["kind"] = "together_ai" - if not isinstance(data, dict): - raise ValueError( - "The provided request secret dto is not a valid type for CustomProviderDTO" - ) - if data["kind"] not in CustomProviderKind.__members__.values(): + if data.get("kind") not in custom_provider_kinds: raise ValueError( "The provided kind in data is not a valid CustomProviderKind enum" ) diff --git a/api/oss/src/core/secrets/utils.py b/api/oss/src/core/secrets/utils.py index 9d7e1e838b..d5c7c6ae51 100644 --- a/api/oss/src/core/secrets/utils.py +++ b/api/oss/src/core/secrets/utils.py @@ -7,6 +7,35 @@ from oss.src.models.api.evaluation_model import LMProvidersEnum +_LEGACY_SYSTEM_ENV_NAMES = { + LMProvidersEnum.mistral.value: ("MISTRALAI_API_KEY",), +} + +_PROVIDER_ENV_ALIASES = { + "mistralai": LMProvidersEnum.mistral.value, +} + + +def _get_system_env_secret(secret_name: str) -> str | None: + for env_name in (secret_name, *_LEGACY_SYSTEM_ENV_NAMES.get(secret_name, ())): + env_var = os.getenv(env_name) + if env_var: + return env_var + + return None + + +def _provider_slug_to_env_var(provider_slug: str) -> str: + if not provider_slug: + return "" + + canonical_provider = LMProvidersEnum.__members__.get(provider_slug.replace("_", "")) + if canonical_provider: + return canonical_provider.value + + return _PROVIDER_ENV_ALIASES.get(provider_slug, f"{provider_slug.upper()}_API_KEY") + + async def get_system_llm_providers_secrets() -> Dict[str, Any]: """ Fetches LLM providers secrets from system environment variables. @@ -15,7 +44,7 @@ async def get_system_llm_providers_secrets() -> Dict[str, Any]: secrets = {} for llm_provider in LMProvidersEnum: secret_name = llm_provider.value - env_var = os.getenv(secret_name) + env_var = _get_system_env_secret(secret_name) if env_var: secrets[secret_name] = env_var @@ -46,7 +75,7 @@ async def get_user_llm_providers_secrets(project_id: str) -> Dict[str, Any]: for secret in secrets: kind = secret["data"].get("kind") provider_slug = kind.value if kind else "" - secret_name = f"{provider_slug.upper()}_API_KEY" + secret_name = _provider_slug_to_env_var(provider_slug) if provider_slug: provider = secret["data"].get("provider") readable_secrets[secret_name] = provider.get("key") if provider else None diff --git a/api/oss/src/models/api/evaluation_model.py b/api/oss/src/models/api/evaluation_model.py index f26f109bed..1065cdf15b 100644 --- a/api/oss/src/models/api/evaluation_model.py +++ b/api/oss/src/models/api/evaluation_model.py @@ -153,7 +153,6 @@ class LLMRunRateLimit(BaseModel): class LMProvidersEnum(str, Enum): openai = "OPENAI_API_KEY" mistral = "MISTRAL_API_KEY" - mistralai = "MISTRALAI_API_KEY" cohere = "COHERE_API_KEY" anthropic = "ANTHROPIC_API_KEY" anyscale = "ANYSCALE_API_KEY" diff --git a/api/oss/tests/legacy/conftest.py b/api/oss/tests/legacy/conftest.py index 884ef7a7b1..b46a6cfebc 100644 --- a/api/oss/tests/legacy/conftest.py +++ b/api/oss/tests/legacy/conftest.py @@ -43,7 +43,6 @@ def sample_testset_endpoint_json(): API_KEYS_MAPPING = { "OPENAI_API_KEY": "openai", "MISTRAL_API_KEY": "mistral", - "MISTRALAI_API_KEY": "mistralai", "COHERE_API_KEY": "cohere", "ANTHROPIC_API_KEY": "anthropic", "ANYSCALE_API_KEY": "anyscale", diff --git a/api/oss/tests/pytest/unit/secrets/test_dtos.py b/api/oss/tests/pytest/unit/secrets/test_dtos.py new file mode 100644 index 0000000000..b5ad771009 --- /dev/null +++ b/api/oss/tests/pytest/unit/secrets/test_dtos.py @@ -0,0 +1,60 @@ +import pytest +from pydantic import ValidationError + +from oss.src.core.secrets.dtos import CreateSecretDTO, UpdateSecretDTO + + +def test_create_secret_normalizes_mistralai_standard_provider_payload(): + payload = { + "header": {"name": "Mistral AI", "description": ""}, + "secret": { + "kind": "provider_key", + "data": { + "kind": "mistralai", + "provider": { + "key": "TEST_KEY", + }, + }, + }, + } + + secret = CreateSecretDTO.model_validate(payload) + + assert secret.secret.data.kind == "mistral" + assert secret.secret.data.provider.key == "TEST_KEY" + + +def test_update_secret_normalizes_mistralai_standard_provider_payload(): + payload = { + "secret": { + "kind": "provider_key", + "data": { + "kind": "mistralai", + "provider": { + "key": "TEST_KEY", + }, + }, + }, + } + + secret = UpdateSecretDTO.model_validate(payload) + + assert secret.secret.data.kind == "mistral" + assert secret.secret.data.provider.key == "TEST_KEY" + + +def test_create_secret_rejects_missing_standard_provider_kind(): + payload = { + "header": {"name": "Mistral AI", "description": ""}, + "secret": { + "kind": "provider_key", + "data": { + "provider": { + "key": "TEST_KEY", + }, + }, + }, + } + + with pytest.raises(ValidationError, match="StandardProviderKind"): + CreateSecretDTO.model_validate(payload) diff --git a/api/oss/tests/pytest/unit/secrets/test_utils.py b/api/oss/tests/pytest/unit/secrets/test_utils.py new file mode 100644 index 0000000000..a37c0e692a --- /dev/null +++ b/api/oss/tests/pytest/unit/secrets/test_utils.py @@ -0,0 +1,64 @@ +from types import SimpleNamespace + +import pytest + +from oss.src.core.secrets.enums import StandardProviderKind +from oss.src.core.secrets.utils import ( + get_system_llm_providers_secrets, + get_user_llm_providers_secrets, +) + + +class _FakeVaultService: + def __init__(self, *_args, **_kwargs): + pass + + async def list_secrets(self, project_id): + del project_id + return [ + SimpleNamespace( + kind="provider_key", + model_dump=lambda include=None: { + "data": { + "kind": StandardProviderKind.MISTRALAI, + "provider": {"key": "mistral-key"}, + } + }, + ), + SimpleNamespace( + kind="provider_key", + model_dump=lambda include=None: { + "data": { + "kind": StandardProviderKind.TOGETHERAI, + "provider": {"key": "together-key"}, + } + }, + ), + ] + + +@pytest.mark.asyncio +async def test_get_user_llm_providers_secrets_normalizes_legacy_provider_slugs( + monkeypatch, +): + monkeypatch.setattr("oss.src.core.secrets.utils.VaultService", _FakeVaultService) + + secrets = await get_user_llm_providers_secrets( + "00000000-0000-0000-0000-000000000000" + ) + + assert secrets["MISTRAL_API_KEY"] == "mistral-key" + assert "MISTRALAI_API_KEY" not in secrets + assert secrets["TOGETHERAI_API_KEY"] == "together-key" + assert "TOGETHER_AI_API_KEY" not in secrets + + +@pytest.mark.asyncio +async def test_get_system_llm_providers_secrets_reads_legacy_mistralai_env(monkeypatch): + monkeypatch.delenv("MISTRAL_API_KEY", raising=False) + monkeypatch.setenv("MISTRALAI_API_KEY", "legacy-mistral-key") + + secrets = await get_system_llm_providers_secrets() + + assert secrets["MISTRAL_API_KEY"] == "legacy-mistral-key" + assert "MISTRALAI_API_KEY" not in secrets diff --git a/sdk/agenta/sdk/managers/secrets.py b/sdk/agenta/sdk/managers/secrets.py index 79736ab585..3f97f25651 100644 --- a/sdk/agenta/sdk/managers/secrets.py +++ b/sdk/agenta/sdk/managers/secrets.py @@ -13,7 +13,17 @@ log = get_module_logger(__name__) +_PROVIDER_KIND_ALIASES = { + "mistralai": "mistral", +} + + class SecretsManager: + @staticmethod + def _normalize_provider_kind(provider_kind: str) -> str: + normalized = re.sub(r"[\s-]+", "", provider_kind.lower()) + return _PROVIDER_KIND_ALIASES.get(normalized, normalized) + @staticmethod def get_from_route(scope: str = "all") -> Optional[List[Dict[str, Any]]]: context = RoutingContext.get() @@ -192,9 +202,7 @@ def get_provider_settings(model: str, scope: str = "all") -> Optional[Dict]: # STEP 3: initialize provider settings and simplify provider name provider_settings = dict(model=compatible_provider_model) - request_provider_kind = re.sub( - r"[\s-]+", "", provider.lower() - ) # normalizing other special characters too (azure-openai) + request_provider_kind = SecretsManager._normalize_provider_kind(provider) # STEP 4: get credentials for model for secret in secrets: @@ -204,7 +212,9 @@ def get_provider_settings(model: str, scope: str = "all") -> Optional[Dict]: # i). Extract API key if present # (for standard models -- openai/anthropic/gemini, etc) if secret.get("kind") == "provider_key": - secret_provider_kind = secret_data.get("kind", "") + secret_provider_kind = SecretsManager._normalize_provider_kind( + secret_data.get("kind", "") + ) if request_provider_kind == secret_provider_kind: if "key" in provider_info: @@ -336,9 +346,7 @@ def get_provider_settings_from_workflow( # STEP 3: initialize provider settings and simplify provider name provider_settings = dict(model=compatible_provider_model) - request_provider_kind = re.sub( - r"[\s-]+", "", provider.lower() - ) # normalizing other special characters too (azure-openai) + request_provider_kind = SecretsManager._normalize_provider_kind(provider) # STEP 4: get credentials for model for secret in secrets: @@ -348,7 +356,9 @@ def get_provider_settings_from_workflow( # i). Extract API key if present # (for standard models -- openai/anthropic/gemini, etc) if secret.get("kind") == "provider_key": - secret_provider_kind = secret_data.get("kind", "") + secret_provider_kind = SecretsManager._normalize_provider_kind( + secret_data.get("kind", "") + ) if request_provider_kind == secret_provider_kind: if "key" in provider_info: diff --git a/sdk/agenta/sdk/workflows/runners/daytona.py b/sdk/agenta/sdk/workflows/runners/daytona.py index 8b3aafb18b..adee9fe54e 100644 --- a/sdk/agenta/sdk/workflows/runners/daytona.py +++ b/sdk/agenta/sdk/workflows/runners/daytona.py @@ -128,7 +128,8 @@ def _get_provider_env_vars(self) -> Dict[str, str]: "deepinfra": "DEEPINFRA_API_KEY", "alephalpha": "ALEPHALPHA_API_KEY", "groq": "GROQ_API_KEY", - "mistralai": "MISTRALAI_API_KEY", + "mistral": "MISTRAL_API_KEY", + "mistralai": "MISTRAL_API_KEY", "anthropic": "ANTHROPIC_API_KEY", "perplexityai": "PERPLEXITYAI_API_KEY", # Secret kind is "together_ai" (underscore) even though the env var is TOGETHERAI_API_KEY diff --git a/sdk/oss/tests/legacy/new_tests/conftest.py b/sdk/oss/tests/legacy/new_tests/conftest.py index b6bebae734..cc03ce9ab7 100644 --- a/sdk/oss/tests/legacy/new_tests/conftest.py +++ b/sdk/oss/tests/legacy/new_tests/conftest.py @@ -46,7 +46,6 @@ def sample_testset_endpoint_json(): API_KEYS_MAPPING = { "OPENAI_API_KEY": "openai", "MISTRAL_API_KEY": "mistral", - "MISTRALAI_API_KEY": "mistralai", "COHERE_API_KEY": "cohere", "ANTHROPIC_API_KEY": "anthropic", "ANYSCALE_API_KEY": "anyscale", diff --git a/sdk/oss/tests/pytest/unit/test_mistral_provider_aliases.py b/sdk/oss/tests/pytest/unit/test_mistral_provider_aliases.py new file mode 100644 index 0000000000..2311470eab --- /dev/null +++ b/sdk/oss/tests/pytest/unit/test_mistral_provider_aliases.py @@ -0,0 +1,55 @@ +from types import SimpleNamespace + +from agenta.sdk.contexts.running import RunningContext +from agenta.sdk.managers.secrets import SecretsManager +from agenta.sdk.workflows.runners.daytona import DaytonaRunner + + +def test_secrets_manager_accepts_mistralai_secret_for_mistral_model(monkeypatch): + monkeypatch.setattr( + SecretsManager, + "get_from_route", + staticmethod( + lambda scope="all": [ + { + "kind": "provider_key", + "data": { + "kind": "mistralai", + "provider": {"key": "TEST_KEY"}, + }, + } + ] + ), + ) + + settings = SecretsManager.get_provider_settings("mistral/mistral-small") + + assert settings is not None + assert settings["model"] == "mistral/mistral-small" + assert settings["api_key"] == "TEST_KEY" + + +def test_daytona_runner_exports_canonical_mistral_env_var(monkeypatch): + monkeypatch.setenv("DAYTONA_API_KEY", "test-daytona-key") + runner = DaytonaRunner() + monkeypatch.setattr( + RunningContext, + "get", + staticmethod( + lambda: SimpleNamespace( + vault_secrets=[ + { + "kind": "provider_key", + "data": { + "kind": "mistralai", + "provider": {"key": "TEST_KEY"}, + }, + } + ] + ) + ), + ) + + env_vars = runner._get_provider_env_vars() + + assert env_vars["MISTRAL_API_KEY"] == "TEST_KEY" diff --git a/web/eslint.config.mjs b/web/eslint.config.mjs index ac93231cb5..657d519421 100644 --- a/web/eslint.config.mjs +++ b/web/eslint.config.mjs @@ -45,12 +45,12 @@ const config = [ "no-restricted-syntax": [ "error", { - selector: 'ExportNamedDeclaration[source.value=/^@agenta/]', + selector: "ExportNamedDeclaration[source.value=/^@agenta/]", message: "Do not re-export from @agenta/* packages. Consumers should import directly from the source package for proper tree-shaking.", }, { - selector: 'ExportAllDeclaration[source.value=/^@agenta/]', + selector: "ExportAllDeclaration[source.value=/^@agenta/]", message: "Do not re-export from @agenta/* packages. Consumers should import directly from the source package for proper tree-shaking.", }, diff --git a/web/oss/src/lib/helpers/llmProviders.ts b/web/oss/src/lib/helpers/llmProviders.ts index 84c7817ce1..0414e02de7 100644 --- a/web/oss/src/lib/helpers/llmProviders.ts +++ b/web/oss/src/lib/helpers/llmProviders.ts @@ -41,7 +41,7 @@ export const transformSecret = (secrets: CustomSecretDTO[] | StandardSecretDTO[] alephalpha: "ALEPHALPHA_API_KEY", groq: "GROQ_API_KEY", mistral: "MISTRAL_API_KEY", - mistralai: "MISTRALAI_API_KEY", + mistralai: "MISTRAL_API_KEY", anthropic: "ANTHROPIC_API_KEY", perplexityai: "PERPLEXITYAI_API_KEY", together_ai: "TOGETHERAI_API_KEY", @@ -85,7 +85,7 @@ export const transformSecret = (secrets: CustomSecretDTO[] | StandardSecretDTO[] export const llmAvailableProviders: LlmProvider[] = [ {title: "OpenAI", key: "", name: "OPENAI_API_KEY"}, - {title: "Mistral AI", key: "", name: "MISTRALAI_API_KEY"}, + {title: "Mistral AI", key: "", name: "MISTRAL_API_KEY"}, {title: "Cohere", key: "", name: "COHERE_API_KEY"}, {title: "Anthropic", key: "", name: "ANTHROPIC_API_KEY"}, {title: "Anyscale", key: "", name: "ANYSCALE_API_KEY"}, diff --git a/web/oss/src/state/app/atoms/vault.ts b/web/oss/src/state/app/atoms/vault.ts index 20d19205e9..1ed3431ed2 100644 --- a/web/oss/src/state/app/atoms/vault.ts +++ b/web/oss/src/state/app/atoms/vault.ts @@ -155,7 +155,9 @@ const getEnvNameMap = (): Record => ({ DEEPINFRA_API_KEY: SecretDTOProvider.DEEPINFRA, ALEPHALPHA_API_KEY: SecretDTOProvider.ALEPHALPHA, GROQ_API_KEY: SecretDTOProvider.GROQ, - MISTRAL_API_KEY: SecretDTOProvider.MISTRALAI, + MISTRAL_API_KEY: SecretDTOProvider.MISTRAL, + // Backward-compatible mapping for legacy Mistral provider name + MISTRALAI_API_KEY: SecretDTOProvider.MISTRAL, ANTHROPIC_API_KEY: SecretDTOProvider.ANTHROPIC, PERPLEXITYAI_API_KEY: SecretDTOProvider.PERPLEXITYAI, TOGETHERAI_API_KEY: SecretDTOProvider.TOGETHERAI, @@ -174,6 +176,13 @@ export const createStandardSecretAtom = atom(null, async (get, set, provider: Ll const updateMutation = get(updateVaultSecretMutationAtom) try { + const providerKind = envNameMap[provider.name as string] + if (!providerKind) { + throw new Error( + `[vault] Unknown provider name "${provider.name}" when creating standard secret`, + ) + } + // Match the original working payload structure exactly const payload = { header: { @@ -183,7 +192,7 @@ export const createStandardSecretAtom = atom(null, async (get, set, provider: Ll secret: { kind: SecretDTOKind.PROVIDER_KEY, data: { - kind: envNameMap[provider.name as string], + kind: providerKind, provider: { key: provider.key, }, diff --git a/web/oss/tests/manual/cell-renderers/test-extract-chat-messages.ts b/web/oss/tests/manual/cell-renderers/test-extract-chat-messages.ts index b3e458ceec..4768f7c5a2 100644 --- a/web/oss/tests/manual/cell-renderers/test-extract-chat-messages.ts +++ b/web/oss/tests/manual/cell-renderers/test-extract-chat-messages.ts @@ -31,9 +31,7 @@ const run = () => { assert.deepEqual(extractChatMessages(nested), [{role: "user", content: "nested"}]) assert.equal(extractChatMessages(deep), null) - assert.deepEqual(extractChatMessages(choices), [ - {role: "assistant", content: "from choices"}, - ]) + assert.deepEqual(extractChatMessages(choices), [{role: "assistant", content: "from choices"}]) assert.deepEqual(extractChatMessages(single), [{role: "assistant", content: "single message"}]) assert.equal(extractChatMessages(plainJson), null) diff --git a/web/oss/tests/playwright/acceptance/app/test.ts b/web/oss/tests/playwright/acceptance/app/test.ts index d6d98dee78..37281f6e1f 100644 --- a/web/oss/tests/playwright/acceptance/app/test.ts +++ b/web/oss/tests/playwright/acceptance/app/test.ts @@ -57,10 +57,7 @@ const testWithAppFixtures = baseTest.extend({ await uiHelpers.typeWithDelay('input[placeholder="Enter a name"]', appName) await page.getByText(appType).first().click() const createAppPromise = page.waitForResponse((response) => { - if ( - !response.url().includes("/apps") || - response.request().method() !== "POST" - ) { + if (!response.url().includes("/apps") || response.request().method() !== "POST") { return false } diff --git a/web/oss/tests/playwright/acceptance/playground/tests.ts b/web/oss/tests/playwright/acceptance/playground/tests.ts index 2074aaee3e..fdefcd368d 100644 --- a/web/oss/tests/playwright/acceptance/playground/tests.ts +++ b/web/oss/tests/playwright/acceptance/playground/tests.ts @@ -85,9 +85,9 @@ const testWithVariantFixtures = baseTest.extend({ await uiHelpers.expectPath(`/apps/${appId}/playground`) } - await expect( - page.getByRole("button", {name: "Run", exact: true}).first(), - ).toBeVisible({timeout: 30000}) + await expect(page.getByRole("button", {name: "Run", exact: true}).first()).toBeVisible({ + timeout: 30000, + }) }) }, diff --git a/web/oss/tests/playwright/acceptance/prompt-registry/index.ts b/web/oss/tests/playwright/acceptance/prompt-registry/index.ts index 8819583b2e..066e09b327 100644 --- a/web/oss/tests/playwright/acceptance/prompt-registry/index.ts +++ b/web/oss/tests/playwright/acceptance/prompt-registry/index.ts @@ -37,9 +37,9 @@ const promptRegistryTests = () => { await uiHelpers.expectPath("/prompts") // Verify the Prompts heading is visible - await expect( - page.getByRole("heading", {name: /prompts/i}).first(), - ).toBeVisible({timeout: 15000}) + await expect(page.getByRole("heading", {name: /prompts/i}).first()).toBeVisible({ + timeout: 15000, + }) // Verify the prompts table is visible (uses div-based rows) const promptsTable = page.getByRole("table").first() diff --git a/web/oss/tests/playwright/acceptance/smoke.spec.ts b/web/oss/tests/playwright/acceptance/smoke.spec.ts index 5182c6e0da..c0011a7985 100644 --- a/web/oss/tests/playwright/acceptance/smoke.spec.ts +++ b/web/oss/tests/playwright/acceptance/smoke.spec.ts @@ -1,6 +1,8 @@ import {test, expect} from "@playwright/test" -test("smoke: auth works and can navigate to apps @scope:auth @coverage:smoke @path:happy @lens:functional @cost:free @license:oss", async ({page}) => { +test("smoke: auth works and can navigate to apps @scope:auth @coverage:smoke @path:happy @lens:functional @cost:free @license:oss", async ({ + page, +}) => { test.setTimeout(10000) await page.goto("/apps") await page.waitForURL("**/apps", {timeout: 5000}) diff --git a/web/oss/tests/playwright/acceptance/testsset/index.ts b/web/oss/tests/playwright/acceptance/testsset/index.ts index 49c752e634..b85333f609 100644 --- a/web/oss/tests/playwright/acceptance/testsset/index.ts +++ b/web/oss/tests/playwright/acceptance/testsset/index.ts @@ -86,7 +86,9 @@ const testsetTests = () => { // 6. Verify testset page await uiHelpers.waitForPath(`/testsets/${testsetId}`) - await expect(page.getByRole("heading", {name: /testset|test set/i}).first()).toBeVisible() + await expect( + page.getByRole("heading", {name: /testset|test set/i}).first(), + ).toBeVisible() const response = await testsetResponsePromise const testset = response.testset diff --git a/web/tests/playwright.config.ts b/web/tests/playwright.config.ts index f7f9ddd180..67d35f11f8 100644 --- a/web/tests/playwright.config.ts +++ b/web/tests/playwright.config.ts @@ -5,7 +5,6 @@ import {fileURLToPath} from "url" import {defineConfig} from "@playwright/test" import dotenv from "dotenv" - // Get current directory in ESM const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename) diff --git a/web/tests/playwright/config/testTags.ts b/web/tests/playwright/config/testTags.ts index ae296186d9..62a53fffc8 100644 --- a/web/tests/playwright/config/testTags.ts +++ b/web/tests/playwright/config/testTags.ts @@ -105,9 +105,4 @@ export const createTagString = (type: PlaywrightConfig.TestTagType, value: strin `${TAG_ARGUMENTS[type].prefix}${value}` // Re-export types from the types module for backward compatibility -export type { - TestTagType, - TestTag, - TagArgument, - ProjectFeatureConfig, -} from "./types" +export type {TestTagType, TestTag, TagArgument, ProjectFeatureConfig} from "./types" diff --git a/web/tests/playwright/global-teardown.ts b/web/tests/playwright/global-teardown.ts index 98f71f40c8..4b338a68c1 100644 --- a/web/tests/playwright/global-teardown.ts +++ b/web/tests/playwright/global-teardown.ts @@ -112,9 +112,7 @@ async function deleteEphemeralProject(apiURL: string): Promise { return } - console.log( - `[global-teardown] Deleting ephemeral project: ${projectName} (${projectId})`, - ) + console.log(`[global-teardown] Deleting ephemeral project: ${projectName} (${projectId})`) const statePath = resolve(__dirname, "../state.json") const sessionToken = getSessionToken(statePath) diff --git a/web/tests/playwright/scripts/run-tests.ts b/web/tests/playwright/scripts/run-tests.ts index 4f704b428e..a42a6d4753 100644 --- a/web/tests/playwright/scripts/run-tests.ts +++ b/web/tests/playwright/scripts/run-tests.ts @@ -60,7 +60,9 @@ function parseArgs(args: string[]): ParsedArgs { } // Check if this is a dimension flag - const dimensionMatch = arg.match(/^--?(coverage|lens|path|case|speed|scope|license|cost|plan|role)$/) + const dimensionMatch = arg.match( + /^--?(coverage|lens|path|case|speed|scope|license|cost|plan|role)$/, + ) if (dimensionMatch && i + 1 < args.length) { const dimension = dimensionMatch[1] diff --git a/web/tests/tests/fixtures/base.fixture/apiHelpers/index.ts b/web/tests/tests/fixtures/base.fixture/apiHelpers/index.ts index cfd739b237..337de6fe58 100644 --- a/web/tests/tests/fixtures/base.fixture/apiHelpers/index.ts +++ b/web/tests/tests/fixtures/base.fixture/apiHelpers/index.ts @@ -321,7 +321,9 @@ export const getEvaluationRuns = async (page: Page) => { method: "POST", }) - await page.goto(`${getProjectScopedBasePath(page)}/evaluations`, {waitUntil: "domcontentloaded"}) + await page.goto(`${getProjectScopedBasePath(page)}/evaluations`, { + waitUntil: "domcontentloaded", + }) const evaluationRuns = await evaluationRunsResponse // Fix: Check for .runs array in the response