From da175fee70c744022742440f5b48435f03aec0be Mon Sep 17 00:00:00 2001 From: Shuchang Zheng Date: Wed, 18 Feb 2026 15:41:33 -0800 Subject: [PATCH] fix sync on oss side (#4797) --- skyvern/analytics.py | 25 ++++++++------------ skyvern/cli/core/result.py | 15 ++++++++++++ skyvern/forge/sdk/api/llm/config_registry.py | 4 ++-- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/skyvern/analytics.py b/skyvern/analytics.py index 2294c236..e751b94d 100644 --- a/skyvern/analytics.py +++ b/skyvern/analytics.py @@ -1,12 +1,16 @@ +import functools import importlib.metadata import platform from typing import Any, Dict +import structlog import typer from posthog import Posthog from skyvern.config import settings +LOG = structlog.get_logger(__name__) + posthog = Posthog( "phc_bVT2ugnZhMHRWqMvSRHPdeTjaPxQqT3QSsI3r5FlQR5", host="https://app.posthog.com", @@ -23,7 +27,9 @@ def get_oss_version() -> str: return "unknown" +@functools.lru_cache(maxsize=1) def analytics_metadata() -> Dict[str, Any]: + # Cached: all fields are process-lifetime constants. Do not add dynamic fields here. return { "os": platform.system().lower(), "oss_version": get_oss_version(), @@ -38,26 +44,15 @@ def capture( event: str, data: dict[str, Any] | None = None, ) -> None: - # If telemetry is disabled, don't send any data if not settings.SKYVERN_TELEMETRY: return - distinct_id = settings.ANALYTICS_ID - - payload: dict[str, Any] = data or {} try: + distinct_id = settings.ANALYTICS_ID + payload: dict[str, Any] = data or {} posthog.capture(distinct_id=distinct_id, event=event, properties=payload) - except Exception as e: - payload.update( - { - "capture_error": str(e), - } - ) - posthog.capture( - distinct_id=distinct_id, - event="failure", - properties=payload, - ) + except Exception: + LOG.debug("analytics capture failed", event=event, exc_info=True) # This is the main function that will be called by the typer CLI. This is separate from capture because typer diff --git a/skyvern/cli/core/result.py b/skyvern/cli/core/result.py index 437cf48d..94757b5b 100644 --- a/skyvern/cli/core/result.py +++ b/skyvern/cli/core/result.py @@ -5,6 +5,8 @@ from dataclasses import dataclass, field from datetime import datetime, timezone from typing import Any +from skyvern import analytics + class ErrorCode: NO_ACTIVE_BROWSER = "NO_ACTIVE_BROWSER" @@ -63,6 +65,19 @@ def make_result( warnings: list[str] | None = None, error: dict[str, Any] | None = None, ) -> dict[str, Any]: + analytics.capture( + "mcp_tool_call", + data={ + **analytics.analytics_metadata(), + "tool": action, + "ok": ok, + # "total" is set by Timer.__exit__; None for early-return paths before Timer starts + "timing_ms": (timing_ms or {}).get("total"), + "error_code": error.get("code") if error else None, + "browser_mode": browser_context.mode if browser_context else None, + "session_id": browser_context.session_id if browser_context else None, + }, + ) return { "ok": ok, "action": action, diff --git a/skyvern/forge/sdk/api/llm/config_registry.py b/skyvern/forge/sdk/api/llm/config_registry.py index f1c9d20f..e7938044 100644 --- a/skyvern/forge/sdk/api/llm/config_registry.py +++ b/skyvern/forge/sdk/api/llm/config_registry.py @@ -394,7 +394,7 @@ if settings.ENABLE_ANTHROPIC: "anthropic/claude-opus-4-6", ["ANTHROPIC_API_KEY"], supports_vision=True, - add_assistant_prefix=True, + add_assistant_prefix=False, # Claude 4.6 does not support assistant message prefill max_completion_tokens=64000, temperature=1, # Claude 4.6 only supports temperature=1 ), @@ -544,7 +544,7 @@ if settings.ENABLE_BEDROCK: "bedrock/us.anthropic.claude-opus-4-6-v1", ["AWS_REGION"], supports_vision=True, - add_assistant_prefix=True, + add_assistant_prefix=False, # Claude 4.6 does not support assistant message prefill max_completion_tokens=64000, temperature=1, # Claude 4.6 only supports temperature=1 ),