[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-launchdarkly-custom-metrics":3,"mdc-bwz258-key":34,"related-org-launchdarkly-custom-metrics":3747,"related-repo-launchdarkly-custom-metrics":3878},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":20,"repoUrl":21,"updatedAt":22,"license":23,"forks":24,"topics":25,"repo":29,"sourceUrl":32,"mdContent":33},"custom-metrics","manage custom business metrics for configs","Create, track, retrieve, update, and delete custom business metrics for configs. Covers full lifecycle: define metric kinds via API, emit events via SDK, and query results.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"launchdarkly","LaunchDarkly","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Flaunchdarkly.png",[12,16,17],{"name":13,"slug":14,"type":15},"Analytics","analytics","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Metrics","metrics",20,"https:\u002F\u002Fgithub.com\u002Flaunchdarkly\u002Fai-tooling","2026-05-22T06:55:36.436945","Apache-2.0",6,[26,27,28],"agent-skills","launchdarkly-ai","managed-by-terraform",{"repoUrl":21,"stars":20,"forks":24,"topics":30,"description":31},[26,27,28],"LaunchDarkly's official AI tooling","https:\u002F\u002Fgithub.com\u002Flaunchdarkly\u002Fai-tooling\u002Ftree\u002FHEAD\u002Fskills\u002Fagentcontrol\u002Fcustom-metrics","---\nname: custom-metrics\ndescription: \"Create, track, retrieve, update, and delete custom business metrics for configs. Covers full lifecycle: define metric kinds via API, emit events via SDK, and query results.\"\nlicense: Apache-2.0\ncompatibility: Requires the LaunchDarkly server SDK and a LaunchDarkly API token with the `writer` role for metric management.\nmetadata:\n  author: launchdarkly\n  version: \"1.0.0-experimental\"\n---\n\n# Custom Metrics for Configs\n\nFull lifecycle management of custom business metrics: create metric definitions via API, track events via SDK, retrieve metric data, and manage metrics programmatically.\n\n## Prerequisites\n\n- LaunchDarkly SDK initialized (see `sdk`)\n- LaunchDarkly API token with `writer` role for metric management\n- Understanding of built-in agent metrics (see `built-in-metrics`)\n\n## API Key Detection\n\nBefore prompting the user for an API key, try to detect it automatically:\n\n1. **Check Claude MCP config** - Read `~\u002F.claude\u002Fconfig.json` and look for `mcpServers.launchdarkly.env.LAUNCHDARKLY_API_KEY`\n2. **Check environment variables** - Look for `LAUNCHDARKLY_API_KEY`, `LAUNCHDARKLY_API_TOKEN`, or `LD_API_KEY`\n3. **Prompt user** - Only if detection fails, ask the user for their API key\n\n```python\nimport os\nimport json\nfrom pathlib import Path\n\ndef get_launchdarkly_api_key():\n    \"\"\"Auto-detect LaunchDarkly API key from Claude config or environment.\"\"\"\n    # 1. Check Claude MCP config\n    claude_config = Path.home() \u002F \".claude\" \u002F \"config.json\"\n    if claude_config.exists():\n        try:\n            config = json.load(open(claude_config))\n            api_key = config.get(\"mcpServers\", {}).get(\"launchdarkly\", {}).get(\"env\", {}).get(\"LAUNCHDARKLY_API_KEY\")\n            if api_key:\n                return api_key\n        except (json.JSONDecodeError, IOError):\n            pass\n\n    # 2. Check environment variables\n    for var in [\"LAUNCHDARKLY_API_KEY\", \"LAUNCHDARKLY_API_TOKEN\", \"LD_API_KEY\"]:\n        if os.environ.get(var):\n            return os.environ[var]\n\n    return None\n```\n\n## Metrics Lifecycle Overview\n\n| Step | Method | Purpose |\n|------|--------|---------|\n| 1. Create | API | Define metric in LaunchDarkly |\n| 2. Track | SDK | Send events to the metric |\n| 3. Get | API | Retrieve metric definition\u002Fdata |\n| 4. Update | API | Modify metric properties |\n| 5. Delete | API | Remove metric |\n\n## 1. Create Metric (API)\n\n**Required fields for numeric custom metrics:**\n- `successCriteria` - Must be one of: `\"HigherThanBaseline\"`, `\"LowerThanBaseline\"`\n- `unit` - e.g., `\"count\"`, `\"percent\"`, `\"milliseconds\"`\n\nThe API will return `400 Bad Request` if these are missing for numeric metrics.\n\n```python\nimport requests\nimport os\n\ndef create_metric(\n    project_key: str,\n    metric_key: str,\n    name: str,\n    kind: str = \"custom\",\n    is_numeric: bool = True,\n    unit: str = \"count\",\n    success_criteria: str = \"HigherThanBaseline\",\n    event_key: str = None,\n    description: str = None\n):\n    \"\"\"Create a new metric definition in LaunchDarkly.\"\"\"\n    API_TOKEN = os.environ.get(\"LAUNCHDARKLY_API_TOKEN\")\n\n    url = f\"https:\u002F\u002Fapp.launchdarkly.com\u002Fapi\u002Fv2\u002Fmetrics\u002F{project_key}\"\n\n    payload = {\n        \"key\": metric_key,\n        \"name\": name,\n        \"kind\": kind,\n        \"isNumeric\": is_numeric,\n        \"eventKey\": event_key or metric_key\n    }\n\n    # Unit and successCriteria are required for numeric custom metrics\n    if is_numeric and kind == \"custom\":\n        payload[\"unit\"] = unit\n        payload[\"successCriteria\"] = success_criteria\n\n    if description:\n        payload[\"description\"] = description\n\n    headers = {\n        \"Authorization\": API_TOKEN,\n        \"Content-Type\": \"application\u002Fjson\"\n    }\n\n    response = requests.post(url, json=payload, headers=headers)\n\n    if response.status_code == 201:\n        print(f\"[OK] Created metric: {metric_key}\")\n        return response.json()\n    elif response.status_code == 409:\n        print(f\"[INFO] Metric already exists: {metric_key}\")\n        return None\n    else:\n        print(f\"[ERROR] Failed to create metric: {response.status_code}\")\n        print(f\"        {response.text}\")\n        return None\n```\n\n**Metric Kinds:**\n- `custom` - Track any event (most common for agent metrics)\n- `pageview` - Track page views\n- `click` - Track click events\n\n**Success Criteria** (for numeric metrics):\n- `HigherThanBaseline` - Higher values are better (e.g., revenue, satisfaction)\n- `LowerThanBaseline` - Lower values are better (e.g., errors, latency)\n\n**Common Units:**\n- `count` - Generic count\n- `milliseconds` - Time duration\n- `percent` - Percentage values\n- `dollars` - Currency\n\n## 2. Track Events (SDK)\n\nOnce the metric is created, track events using the SDK:\n\n```python\nfrom ldclient import Context\nfrom ldclient.config import Config\nimport ldclient\n\n# Initialize (see sdk for details)\nldclient.set_config(Config(\"your-sdk-key\"))\nld_client = ldclient.get()\n\ndef track_metric(ld_client, user_id: str, metric_key: str, value: float, data: dict = None):\n    \"\"\"Track an event to a metric.\"\"\"\n    context = Context.builder(user_id).build()\n\n    ld_client.track(\n        metric_key,\n        context,\n        data=data,\n        metric_value=value\n    )\n```\n\n### Common Tracking Patterns\n\n```python\ndef track_conversion(ld_client, user_id: str, amount: float, config_key: str):\n    \"\"\"Track a conversion event with revenue.\"\"\"\n    context = Context.builder(user_id).build()\n\n    ld_client.track(\n        \"business.conversion\",\n        context,\n        data={\"configKey\": config_key, \"category\": \"electronics\"},\n        metric_value=amount\n    )\n\ndef track_task_success(ld_client, user_id: str, task_type: str, success: bool):\n    \"\"\"Track task completion success\u002Ffailure.\"\"\"\n    context = Context.builder(user_id).build()\n\n    ld_client.track(\n        \"task.success_rate\",\n        context,\n        data={\"taskType\": task_type},\n        metric_value=1.0 if success else 0.0\n    )\n\ndef track_satisfaction(ld_client, user_id: str, score: float, feedback_type: str):\n    \"\"\"Track user satisfaction (0-100 scale).\"\"\"\n    context = Context.builder(user_id).build()\n\n    ld_client.track(\n        \"user.satisfaction\",\n        context,\n        data={\"feedbackType\": feedback_type},\n        metric_value=score\n    )\n\n    # Track negative feedback separately for alerts\n    if score \u003C 50:\n        ld_client.track(\n            \"user.negative_feedback\",\n            context,\n            metric_value=1.0\n        )\n\ndef track_revenue(ld_client, user_id: str, revenue: float, source: str):\n    \"\"\"Track revenue generated after agent interaction.\"\"\"\n    context = Context.builder(user_id).set(\"tier\", \"premium\").build()\n\n    if revenue > 0:\n        ld_client.track(\n            \"revenue.impact\",\n            context,\n            data={\"source\": source},\n            metric_value=revenue\n        )\n```\n\n## 3. Get Metrics (API)\n\n### Get Single Metric\n\n```python\ndef get_metric(project_key: str, metric_key: str):\n    \"\"\"Get a single metric definition.\"\"\"\n    API_TOKEN = os.environ.get(\"LAUNCHDARKLY_API_TOKEN\")\n\n    url = f\"https:\u002F\u002Fapp.launchdarkly.com\u002Fapi\u002Fv2\u002Fmetrics\u002F{project_key}\u002F{metric_key}\"\n\n    headers = {\"Authorization\": API_TOKEN}\n\n    response = requests.get(url, headers=headers)\n\n    if response.status_code == 200:\n        metric = response.json()\n        print(f\"[OK] Metric: {metric['key']}\")\n        print(f\"     Name: {metric.get('name', 'N\u002FA')}\")\n        print(f\"     Kind: {metric.get('kind', 'N\u002FA')}\")\n        print(f\"     Numeric: {metric.get('isNumeric', False)}\")\n        print(f\"     Event Key: {metric.get('eventKey', 'N\u002FA')}\")\n        return metric\n    elif response.status_code == 404:\n        print(f\"[INFO] Metric not found: {metric_key}\")\n        return None\n    else:\n        print(f\"[ERROR] Failed to get metric: {response.status_code}\")\n        return None\n```\n\n### List All Metrics\n\n```python\ndef list_metrics(project_key: str, limit: int = 20):\n    \"\"\"List all metrics in a project.\"\"\"\n    API_TOKEN = os.environ.get(\"LAUNCHDARKLY_API_TOKEN\")\n\n    url = f\"https:\u002F\u002Fapp.launchdarkly.com\u002Fapi\u002Fv2\u002Fmetrics\u002F{project_key}\"\n\n    headers = {\"Authorization\": API_TOKEN}\n    params = {\"limit\": limit}\n\n    response = requests.get(url, headers=headers, params=params)\n\n    if response.status_code == 200:\n        data = response.json()\n        metrics = data.get(\"items\", [])\n        print(f\"[OK] Found {len(metrics)} metrics:\")\n        for metric in metrics:\n            numeric = \"numeric\" if metric.get(\"isNumeric\") else \"non-numeric\"\n            print(f\"     - {metric['key']} ({metric.get('kind', 'custom')}, {numeric})\")\n        return metrics\n    else:\n        print(f\"[ERROR] Failed to list metrics: {response.status_code}\")\n        return None\n```\n\n## 4. Update Metric (API)\n\n```python\ndef update_metric(project_key: str, metric_key: str, updates: list):\n    \"\"\"\n    Update a metric using JSON Patch operations.\n\n    Args:\n        updates: List of patch operations, e.g.:\n            [{\"op\": \"replace\", \"path\": \"\u002Fname\", \"value\": \"New Name\"}]\n    \"\"\"\n    API_TOKEN = os.environ.get(\"LAUNCHDARKLY_API_TOKEN\")\n\n    url = f\"https:\u002F\u002Fapp.launchdarkly.com\u002Fapi\u002Fv2\u002Fmetrics\u002F{project_key}\u002F{metric_key}\"\n\n    headers = {\n        \"Authorization\": API_TOKEN,\n        \"Content-Type\": \"application\u002Fjson\"\n    }\n\n    response = requests.patch(url, json=updates, headers=headers)\n\n    if response.status_code == 200:\n        print(f\"[OK] Updated metric: {metric_key}\")\n        return response.json()\n    elif response.status_code == 404:\n        print(f\"[ERROR] Metric not found: {metric_key}\")\n        return None\n    else:\n        print(f\"[ERROR] Failed to update metric: {response.status_code}\")\n        print(f\"        {response.text}\")\n        return None\n\n# Example: Update metric name and description\ndef rename_metric(project_key: str, metric_key: str, new_name: str, new_description: str = None):\n    \"\"\"Rename a metric and optionally update description.\"\"\"\n    updates = [\n        {\"op\": \"replace\", \"path\": \"\u002Fname\", \"value\": new_name}\n    ]\n    if new_description:\n        updates.append({\"op\": \"replace\", \"path\": \"\u002Fdescription\", \"value\": new_description})\n\n    return update_metric(project_key, metric_key, updates)\n```\n\n## 5. Delete Metric (API)\n\n```python\ndef delete_metric(project_key: str, metric_key: str):\n    \"\"\"Delete a metric from the project.\"\"\"\n    API_TOKEN = os.environ.get(\"LAUNCHDARKLY_API_TOKEN\")\n\n    url = f\"https:\u002F\u002Fapp.launchdarkly.com\u002Fapi\u002Fv2\u002Fmetrics\u002F{project_key}\u002F{metric_key}\"\n\n    headers = {\"Authorization\": API_TOKEN}\n\n    response = requests.delete(url, headers=headers)\n\n    if response.status_code == 204:\n        print(f\"[OK] Deleted metric: {metric_key}\")\n        return True\n    elif response.status_code == 404:\n        print(f\"[INFO] Metric not found: {metric_key}\")\n        return False\n    else:\n        print(f\"[ERROR] Failed to delete metric: {response.status_code}\")\n        return False\n```\n\n## Complete Workflow Example\n\n```python\nimport os\nimport requests\nfrom ldclient import Context\nfrom ldclient.config import Config\nimport ldclient\n\n# Setup\nAPI_TOKEN = os.environ.get(\"LAUNCHDARKLY_API_TOKEN\")\nSDK_KEY = os.environ.get(\"LAUNCHDARKLY_SDK_KEY\")\nPROJECT_KEY = \"support-ai\"\n\nldclient.set_config(Config(SDK_KEY))\nld_client = ldclient.get()\n\n# 1. Create metric\ncreate_metric(\n    PROJECT_KEY,\n    \"ai.task.completion\",\n    name=\"Agent Task Completion Rate\",\n    kind=\"custom\",\n    is_numeric=True,\n    description=\"Tracks successful agent task completions\"\n)\n\n# 2. Track events\ncontext = Context.builder(\"user-123\").build()\nld_client.track(\"ai.task.completion\", context, metric_value=1.0)\nld_client.track(\"ai.task.completion\", context, metric_value=1.0)\nld_client.track(\"ai.task.completion\", context, metric_value=0.0)  # failure\nld_client.flush()\n\n# 3. Get metric definition\nmetric = get_metric(PROJECT_KEY, \"ai.task.completion\")\n\n# 4. Update metric name\nrename_metric(PROJECT_KEY, \"ai.task.completion\", \"Agent Task Success Rate\")\n\n# 5. List all metrics\nlist_metrics(PROJECT_KEY)\n\n# 6. Delete metric (when no longer needed)\n# delete_metric(PROJECT_KEY, \"ai.task.completion\")\n```\n\n## Session Metrics Tracker\n\n```python\nimport time\nfrom ldclient import Context\n\nclass SessionMetricsTracker:\n    \"\"\"Track metrics across an entire user session.\"\"\"\n\n    def __init__(self, ld_client):\n        self.ld_client = ld_client\n        self.session_data = {}\n\n    def start_session(self, user_id: str, session_id: str):\n        \"\"\"Initialize session tracking.\"\"\"\n        self.session_data[session_id] = {\n            \"user_id\": user_id,\n            \"start_time\": time.time(),\n            \"interactions\": 0,\n            \"successful_tasks\": 0\n        }\n\n    def track_interaction(self, session_id: str, success: bool):\n        \"\"\"Track individual interaction within session.\"\"\"\n        if session_id not in self.session_data:\n            return\n        session = self.session_data[session_id]\n        session[\"interactions\"] += 1\n        if success:\n            session[\"successful_tasks\"] += 1\n\n    def end_session(self, session_id: str):\n        \"\"\"Finalize and track session metrics.\"\"\"\n        if session_id not in self.session_data:\n            return None\n\n        session = self.session_data[session_id]\n        duration = time.time() - session[\"start_time\"]\n\n        context = Context.builder(session[\"user_id\"]).build()\n\n        # Track session duration\n        self.ld_client.track(\n            \"session.duration\",\n            context,\n            data={\"interactions\": session[\"interactions\"]},\n            metric_value=duration\n        )\n\n        # Track session success rate\n        if session[\"interactions\"] > 0:\n            success_rate = session[\"successful_tasks\"] \u002F session[\"interactions\"]\n            self.ld_client.track(\n                \"session.success_rate\",\n                context,\n                metric_value=success_rate * 100\n            )\n\n        result = dict(session)\n        result[\"duration\"] = duration\n        del self.session_data[session_id]\n        return result\n```\n\n## Naming Conventions\n\n```python\n# Use dot notation for hierarchy\n\"quality.accuracy\"\n\"quality.relevance\"\n\"user.satisfaction\"\n\"user.engagement\"\n\"revenue.conversion\"\n\"task.success_rate\"\n\"session.duration\"\n\"ai.task.completion\"\n\"ai.recommendation.conversion\"\n```\n\n## Best Practices\n\n1. **Create Before Track** - Metric must exist before tracking events\n2. **Use Numeric Metrics** - Set `isNumeric=True` for aggregation\n3. **Consistent Keys** - Use same key in `create_metric()` and `ld_client.track()`\n4. **Always flush before close** - Call `ld_client.flush()` (await in Node) before `close()`. Trailing events are at risk of being lost otherwise, in short-lived scripts and long-running services alike. This is not a serverless-only rule; it applies to any process that exits.\n5. **Rate Limit** - Don't track on every keystroke\n\n## Viewing Metrics\n\nCustom metrics appear in:\n- **Metrics** page in LaunchDarkly UI\n- **Monitoring tab** of your config\n- Via API using `get_metric()` or `list_metrics()`\n\n## Related Skills\n\n- `sdk` - SDK setup\n- `built-in-metrics` - Built-in agent metrics (tokens, duration, cost)\n- `online-evals` - Quality metrics via judges\n\n## References\n\n- [Metrics API Documentation](https:\u002F\u002Fapidocs.launchdarkly.com\u002Ftag\u002FMetrics)\n- [Custom Events Documentation](https:\u002F\u002Fdocs.launchdarkly.com\u002Fsdk\u002Ffeatures\u002Fevents)\n- [Python SDK track() Reference](https:\u002F\u002Flaunchdarkly-python-sdk.readthedocs.io\u002F)\n",{"data":35,"body":39},{"name":4,"description":6,"license":23,"compatibility":36,"metadata":37},"Requires the LaunchDarkly server SDK and a LaunchDarkly API token with the `writer` role for metric management.",{"author":8,"version":38},"1.0.0-experimental",{"type":40,"children":41},"root",[42,51,57,64,108,114,119,190,407,413,533,539,547,605,618,1059,1067,1103,1113,1138,1146,1193,1199,1204,1352,1359,1759,1765,1771,1962,1968,2141,2147,2453,2459,2607,2613,2941,2947,3418,3424,3511,3517,3608,3614,3619,3660,3666,3700,3706,3741],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"custom-metrics-for-configs",[48],{"type":49,"value":50},"text","Custom Metrics for Configs",{"type":43,"tag":52,"props":53,"children":54},"p",{},[55],{"type":49,"value":56},"Full lifecycle management of custom business metrics: create metric definitions via API, track events via SDK, retrieve metric data, and manage metrics programmatically.",{"type":43,"tag":58,"props":59,"children":61},"h2",{"id":60},"prerequisites",[62],{"type":49,"value":63},"Prerequisites",{"type":43,"tag":65,"props":66,"children":67},"ul",{},[68,83,96],{"type":43,"tag":69,"props":70,"children":71},"li",{},[72,74,81],{"type":49,"value":73},"LaunchDarkly SDK initialized (see ",{"type":43,"tag":75,"props":76,"children":78},"code",{"className":77},[],[79],{"type":49,"value":80},"sdk",{"type":49,"value":82},")",{"type":43,"tag":69,"props":84,"children":85},{},[86,88,94],{"type":49,"value":87},"LaunchDarkly API token with ",{"type":43,"tag":75,"props":89,"children":91},{"className":90},[],[92],{"type":49,"value":93},"writer",{"type":49,"value":95}," role for metric management",{"type":43,"tag":69,"props":97,"children":98},{},[99,101,107],{"type":49,"value":100},"Understanding of built-in agent metrics (see ",{"type":43,"tag":75,"props":102,"children":104},{"className":103},[],[105],{"type":49,"value":106},"built-in-metrics",{"type":49,"value":82},{"type":43,"tag":58,"props":109,"children":111},{"id":110},"api-key-detection",[112],{"type":49,"value":113},"API Key Detection",{"type":43,"tag":52,"props":115,"children":116},{},[117],{"type":49,"value":118},"Before prompting the user for an API key, try to detect it automatically:",{"type":43,"tag":120,"props":121,"children":122},"ol",{},[123,148,180],{"type":43,"tag":69,"props":124,"children":125},{},[126,132,134,140,142],{"type":43,"tag":127,"props":128,"children":129},"strong",{},[130],{"type":49,"value":131},"Check Claude MCP config",{"type":49,"value":133}," - Read ",{"type":43,"tag":75,"props":135,"children":137},{"className":136},[],[138],{"type":49,"value":139},"~\u002F.claude\u002Fconfig.json",{"type":49,"value":141}," and look for ",{"type":43,"tag":75,"props":143,"children":145},{"className":144},[],[146],{"type":49,"value":147},"mcpServers.launchdarkly.env.LAUNCHDARKLY_API_KEY",{"type":43,"tag":69,"props":149,"children":150},{},[151,156,158,164,166,172,174],{"type":43,"tag":127,"props":152,"children":153},{},[154],{"type":49,"value":155},"Check environment variables",{"type":49,"value":157}," - Look for ",{"type":43,"tag":75,"props":159,"children":161},{"className":160},[],[162],{"type":49,"value":163},"LAUNCHDARKLY_API_KEY",{"type":49,"value":165},", ",{"type":43,"tag":75,"props":167,"children":169},{"className":168},[],[170],{"type":49,"value":171},"LAUNCHDARKLY_API_TOKEN",{"type":49,"value":173},", or ",{"type":43,"tag":75,"props":175,"children":177},{"className":176},[],[178],{"type":49,"value":179},"LD_API_KEY",{"type":43,"tag":69,"props":181,"children":182},{},[183,188],{"type":43,"tag":127,"props":184,"children":185},{},[186],{"type":49,"value":187},"Prompt user",{"type":49,"value":189}," - Only if detection fails, ask the user for their API key",{"type":43,"tag":191,"props":192,"children":197},"pre",{"className":193,"code":194,"language":195,"meta":196,"style":196},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import os\nimport json\nfrom pathlib import Path\n\ndef get_launchdarkly_api_key():\n    \"\"\"Auto-detect LaunchDarkly API key from Claude config or environment.\"\"\"\n    # 1. Check Claude MCP config\n    claude_config = Path.home() \u002F \".claude\" \u002F \"config.json\"\n    if claude_config.exists():\n        try:\n            config = json.load(open(claude_config))\n            api_key = config.get(\"mcpServers\", {}).get(\"launchdarkly\", {}).get(\"env\", {}).get(\"LAUNCHDARKLY_API_KEY\")\n            if api_key:\n                return api_key\n        except (json.JSONDecodeError, IOError):\n            pass\n\n    # 2. Check environment variables\n    for var in [\"LAUNCHDARKLY_API_KEY\", \"LAUNCHDARKLY_API_TOKEN\", \"LD_API_KEY\"]:\n        if os.environ.get(var):\n            return os.environ[var]\n\n    return None\n","python","",[198],{"type":43,"tag":75,"props":199,"children":200},{"__ignoreMap":196},[201,212,221,230,240,249,257,266,275,284,293,302,311,320,329,338,347,355,364,373,381,390,398],{"type":43,"tag":202,"props":203,"children":206},"span",{"class":204,"line":205},"line",1,[207],{"type":43,"tag":202,"props":208,"children":209},{},[210],{"type":49,"value":211},"import os\n",{"type":43,"tag":202,"props":213,"children":215},{"class":204,"line":214},2,[216],{"type":43,"tag":202,"props":217,"children":218},{},[219],{"type":49,"value":220},"import json\n",{"type":43,"tag":202,"props":222,"children":224},{"class":204,"line":223},3,[225],{"type":43,"tag":202,"props":226,"children":227},{},[228],{"type":49,"value":229},"from pathlib import Path\n",{"type":43,"tag":202,"props":231,"children":233},{"class":204,"line":232},4,[234],{"type":43,"tag":202,"props":235,"children":237},{"emptyLinePlaceholder":236},true,[238],{"type":49,"value":239},"\n",{"type":43,"tag":202,"props":241,"children":243},{"class":204,"line":242},5,[244],{"type":43,"tag":202,"props":245,"children":246},{},[247],{"type":49,"value":248},"def get_launchdarkly_api_key():\n",{"type":43,"tag":202,"props":250,"children":251},{"class":204,"line":24},[252],{"type":43,"tag":202,"props":253,"children":254},{},[255],{"type":49,"value":256},"    \"\"\"Auto-detect LaunchDarkly API key from Claude config or environment.\"\"\"\n",{"type":43,"tag":202,"props":258,"children":260},{"class":204,"line":259},7,[261],{"type":43,"tag":202,"props":262,"children":263},{},[264],{"type":49,"value":265},"    # 1. Check Claude MCP config\n",{"type":43,"tag":202,"props":267,"children":269},{"class":204,"line":268},8,[270],{"type":43,"tag":202,"props":271,"children":272},{},[273],{"type":49,"value":274},"    claude_config = Path.home() \u002F \".claude\" \u002F \"config.json\"\n",{"type":43,"tag":202,"props":276,"children":278},{"class":204,"line":277},9,[279],{"type":43,"tag":202,"props":280,"children":281},{},[282],{"type":49,"value":283},"    if claude_config.exists():\n",{"type":43,"tag":202,"props":285,"children":287},{"class":204,"line":286},10,[288],{"type":43,"tag":202,"props":289,"children":290},{},[291],{"type":49,"value":292},"        try:\n",{"type":43,"tag":202,"props":294,"children":296},{"class":204,"line":295},11,[297],{"type":43,"tag":202,"props":298,"children":299},{},[300],{"type":49,"value":301},"            config = json.load(open(claude_config))\n",{"type":43,"tag":202,"props":303,"children":305},{"class":204,"line":304},12,[306],{"type":43,"tag":202,"props":307,"children":308},{},[309],{"type":49,"value":310},"            api_key = config.get(\"mcpServers\", {}).get(\"launchdarkly\", {}).get(\"env\", {}).get(\"LAUNCHDARKLY_API_KEY\")\n",{"type":43,"tag":202,"props":312,"children":314},{"class":204,"line":313},13,[315],{"type":43,"tag":202,"props":316,"children":317},{},[318],{"type":49,"value":319},"            if api_key:\n",{"type":43,"tag":202,"props":321,"children":323},{"class":204,"line":322},14,[324],{"type":43,"tag":202,"props":325,"children":326},{},[327],{"type":49,"value":328},"                return api_key\n",{"type":43,"tag":202,"props":330,"children":332},{"class":204,"line":331},15,[333],{"type":43,"tag":202,"props":334,"children":335},{},[336],{"type":49,"value":337},"        except (json.JSONDecodeError, IOError):\n",{"type":43,"tag":202,"props":339,"children":341},{"class":204,"line":340},16,[342],{"type":43,"tag":202,"props":343,"children":344},{},[345],{"type":49,"value":346},"            pass\n",{"type":43,"tag":202,"props":348,"children":350},{"class":204,"line":349},17,[351],{"type":43,"tag":202,"props":352,"children":353},{"emptyLinePlaceholder":236},[354],{"type":49,"value":239},{"type":43,"tag":202,"props":356,"children":358},{"class":204,"line":357},18,[359],{"type":43,"tag":202,"props":360,"children":361},{},[362],{"type":49,"value":363},"    # 2. Check environment variables\n",{"type":43,"tag":202,"props":365,"children":367},{"class":204,"line":366},19,[368],{"type":43,"tag":202,"props":369,"children":370},{},[371],{"type":49,"value":372},"    for var in [\"LAUNCHDARKLY_API_KEY\", \"LAUNCHDARKLY_API_TOKEN\", \"LD_API_KEY\"]:\n",{"type":43,"tag":202,"props":374,"children":375},{"class":204,"line":20},[376],{"type":43,"tag":202,"props":377,"children":378},{},[379],{"type":49,"value":380},"        if os.environ.get(var):\n",{"type":43,"tag":202,"props":382,"children":384},{"class":204,"line":383},21,[385],{"type":43,"tag":202,"props":386,"children":387},{},[388],{"type":49,"value":389},"            return os.environ[var]\n",{"type":43,"tag":202,"props":391,"children":393},{"class":204,"line":392},22,[394],{"type":43,"tag":202,"props":395,"children":396},{"emptyLinePlaceholder":236},[397],{"type":49,"value":239},{"type":43,"tag":202,"props":399,"children":401},{"class":204,"line":400},23,[402],{"type":43,"tag":202,"props":403,"children":404},{},[405],{"type":49,"value":406},"    return None\n",{"type":43,"tag":58,"props":408,"children":410},{"id":409},"metrics-lifecycle-overview",[411],{"type":49,"value":412},"Metrics Lifecycle Overview",{"type":43,"tag":414,"props":415,"children":416},"table",{},[417,441],{"type":43,"tag":418,"props":419,"children":420},"thead",{},[421],{"type":43,"tag":422,"props":423,"children":424},"tr",{},[425,431,436],{"type":43,"tag":426,"props":427,"children":428},"th",{},[429],{"type":49,"value":430},"Step",{"type":43,"tag":426,"props":432,"children":433},{},[434],{"type":49,"value":435},"Method",{"type":43,"tag":426,"props":437,"children":438},{},[439],{"type":49,"value":440},"Purpose",{"type":43,"tag":442,"props":443,"children":444},"tbody",{},[445,464,482,499,516],{"type":43,"tag":422,"props":446,"children":447},{},[448,454,459],{"type":43,"tag":449,"props":450,"children":451},"td",{},[452],{"type":49,"value":453},"1. Create",{"type":43,"tag":449,"props":455,"children":456},{},[457],{"type":49,"value":458},"API",{"type":43,"tag":449,"props":460,"children":461},{},[462],{"type":49,"value":463},"Define metric in LaunchDarkly",{"type":43,"tag":422,"props":465,"children":466},{},[467,472,477],{"type":43,"tag":449,"props":468,"children":469},{},[470],{"type":49,"value":471},"2. Track",{"type":43,"tag":449,"props":473,"children":474},{},[475],{"type":49,"value":476},"SDK",{"type":43,"tag":449,"props":478,"children":479},{},[480],{"type":49,"value":481},"Send events to the metric",{"type":43,"tag":422,"props":483,"children":484},{},[485,490,494],{"type":43,"tag":449,"props":486,"children":487},{},[488],{"type":49,"value":489},"3. Get",{"type":43,"tag":449,"props":491,"children":492},{},[493],{"type":49,"value":458},{"type":43,"tag":449,"props":495,"children":496},{},[497],{"type":49,"value":498},"Retrieve metric definition\u002Fdata",{"type":43,"tag":422,"props":500,"children":501},{},[502,507,511],{"type":43,"tag":449,"props":503,"children":504},{},[505],{"type":49,"value":506},"4. Update",{"type":43,"tag":449,"props":508,"children":509},{},[510],{"type":49,"value":458},{"type":43,"tag":449,"props":512,"children":513},{},[514],{"type":49,"value":515},"Modify metric properties",{"type":43,"tag":422,"props":517,"children":518},{},[519,524,528],{"type":43,"tag":449,"props":520,"children":521},{},[522],{"type":49,"value":523},"5. Delete",{"type":43,"tag":449,"props":525,"children":526},{},[527],{"type":49,"value":458},{"type":43,"tag":449,"props":529,"children":530},{},[531],{"type":49,"value":532},"Remove metric",{"type":43,"tag":58,"props":534,"children":536},{"id":535},"_1-create-metric-api",[537],{"type":49,"value":538},"1. Create Metric (API)",{"type":43,"tag":52,"props":540,"children":541},{},[542],{"type":43,"tag":127,"props":543,"children":544},{},[545],{"type":49,"value":546},"Required fields for numeric custom metrics:",{"type":43,"tag":65,"props":548,"children":549},{},[550,574],{"type":43,"tag":69,"props":551,"children":552},{},[553,559,561,567,568],{"type":43,"tag":75,"props":554,"children":556},{"className":555},[],[557],{"type":49,"value":558},"successCriteria",{"type":49,"value":560}," - Must be one of: ",{"type":43,"tag":75,"props":562,"children":564},{"className":563},[],[565],{"type":49,"value":566},"\"HigherThanBaseline\"",{"type":49,"value":165},{"type":43,"tag":75,"props":569,"children":571},{"className":570},[],[572],{"type":49,"value":573},"\"LowerThanBaseline\"",{"type":43,"tag":69,"props":575,"children":576},{},[577,583,585,591,592,598,599],{"type":43,"tag":75,"props":578,"children":580},{"className":579},[],[581],{"type":49,"value":582},"unit",{"type":49,"value":584}," - e.g., ",{"type":43,"tag":75,"props":586,"children":588},{"className":587},[],[589],{"type":49,"value":590},"\"count\"",{"type":49,"value":165},{"type":43,"tag":75,"props":593,"children":595},{"className":594},[],[596],{"type":49,"value":597},"\"percent\"",{"type":49,"value":165},{"type":43,"tag":75,"props":600,"children":602},{"className":601},[],[603],{"type":49,"value":604},"\"milliseconds\"",{"type":43,"tag":52,"props":606,"children":607},{},[608,610,616],{"type":49,"value":609},"The API will return ",{"type":43,"tag":75,"props":611,"children":613},{"className":612},[],[614],{"type":49,"value":615},"400 Bad Request",{"type":49,"value":617}," if these are missing for numeric metrics.",{"type":43,"tag":191,"props":619,"children":621},{"className":193,"code":620,"language":195,"meta":196,"style":196},"import requests\nimport os\n\ndef create_metric(\n    project_key: str,\n    metric_key: str,\n    name: str,\n    kind: str = \"custom\",\n    is_numeric: bool = True,\n    unit: str = \"count\",\n    success_criteria: str = \"HigherThanBaseline\",\n    event_key: str = None,\n    description: str = None\n):\n    \"\"\"Create a new metric definition in LaunchDarkly.\"\"\"\n    API_TOKEN = os.environ.get(\"LAUNCHDARKLY_API_TOKEN\")\n\n    url = f\"https:\u002F\u002Fapp.launchdarkly.com\u002Fapi\u002Fv2\u002Fmetrics\u002F{project_key}\"\n\n    payload = {\n        \"key\": metric_key,\n        \"name\": name,\n        \"kind\": kind,\n        \"isNumeric\": is_numeric,\n        \"eventKey\": event_key or metric_key\n    }\n\n    # Unit and successCriteria are required for numeric custom metrics\n    if is_numeric and kind == \"custom\":\n        payload[\"unit\"] = unit\n        payload[\"successCriteria\"] = success_criteria\n\n    if description:\n        payload[\"description\"] = description\n\n    headers = {\n        \"Authorization\": API_TOKEN,\n        \"Content-Type\": \"application\u002Fjson\"\n    }\n\n    response = requests.post(url, json=payload, headers=headers)\n\n    if response.status_code == 201:\n        print(f\"[OK] Created metric: {metric_key}\")\n        return response.json()\n    elif response.status_code == 409:\n        print(f\"[INFO] Metric already exists: {metric_key}\")\n        return None\n    else:\n        print(f\"[ERROR] Failed to create metric: {response.status_code}\")\n        print(f\"        {response.text}\")\n        return None\n",[622],{"type":43,"tag":75,"props":623,"children":624},{"__ignoreMap":196},[625,633,640,647,655,663,671,679,687,695,703,711,719,727,735,743,751,758,766,773,781,789,797,805,814,823,832,840,849,858,867,876,884,893,902,910,919,928,937,945,953,962,970,979,988,997,1006,1015,1024,1033,1042,1051],{"type":43,"tag":202,"props":626,"children":627},{"class":204,"line":205},[628],{"type":43,"tag":202,"props":629,"children":630},{},[631],{"type":49,"value":632},"import requests\n",{"type":43,"tag":202,"props":634,"children":635},{"class":204,"line":214},[636],{"type":43,"tag":202,"props":637,"children":638},{},[639],{"type":49,"value":211},{"type":43,"tag":202,"props":641,"children":642},{"class":204,"line":223},[643],{"type":43,"tag":202,"props":644,"children":645},{"emptyLinePlaceholder":236},[646],{"type":49,"value":239},{"type":43,"tag":202,"props":648,"children":649},{"class":204,"line":232},[650],{"type":43,"tag":202,"props":651,"children":652},{},[653],{"type":49,"value":654},"def create_metric(\n",{"type":43,"tag":202,"props":656,"children":657},{"class":204,"line":242},[658],{"type":43,"tag":202,"props":659,"children":660},{},[661],{"type":49,"value":662},"    project_key: str,\n",{"type":43,"tag":202,"props":664,"children":665},{"class":204,"line":24},[666],{"type":43,"tag":202,"props":667,"children":668},{},[669],{"type":49,"value":670},"    metric_key: str,\n",{"type":43,"tag":202,"props":672,"children":673},{"class":204,"line":259},[674],{"type":43,"tag":202,"props":675,"children":676},{},[677],{"type":49,"value":678},"    name: str,\n",{"type":43,"tag":202,"props":680,"children":681},{"class":204,"line":268},[682],{"type":43,"tag":202,"props":683,"children":684},{},[685],{"type":49,"value":686},"    kind: str = \"custom\",\n",{"type":43,"tag":202,"props":688,"children":689},{"class":204,"line":277},[690],{"type":43,"tag":202,"props":691,"children":692},{},[693],{"type":49,"value":694},"    is_numeric: bool = True,\n",{"type":43,"tag":202,"props":696,"children":697},{"class":204,"line":286},[698],{"type":43,"tag":202,"props":699,"children":700},{},[701],{"type":49,"value":702},"    unit: str = \"count\",\n",{"type":43,"tag":202,"props":704,"children":705},{"class":204,"line":295},[706],{"type":43,"tag":202,"props":707,"children":708},{},[709],{"type":49,"value":710},"    success_criteria: str = \"HigherThanBaseline\",\n",{"type":43,"tag":202,"props":712,"children":713},{"class":204,"line":304},[714],{"type":43,"tag":202,"props":715,"children":716},{},[717],{"type":49,"value":718},"    event_key: str = None,\n",{"type":43,"tag":202,"props":720,"children":721},{"class":204,"line":313},[722],{"type":43,"tag":202,"props":723,"children":724},{},[725],{"type":49,"value":726},"    description: str = None\n",{"type":43,"tag":202,"props":728,"children":729},{"class":204,"line":322},[730],{"type":43,"tag":202,"props":731,"children":732},{},[733],{"type":49,"value":734},"):\n",{"type":43,"tag":202,"props":736,"children":737},{"class":204,"line":331},[738],{"type":43,"tag":202,"props":739,"children":740},{},[741],{"type":49,"value":742},"    \"\"\"Create a new metric definition in LaunchDarkly.\"\"\"\n",{"type":43,"tag":202,"props":744,"children":745},{"class":204,"line":340},[746],{"type":43,"tag":202,"props":747,"children":748},{},[749],{"type":49,"value":750},"    API_TOKEN = os.environ.get(\"LAUNCHDARKLY_API_TOKEN\")\n",{"type":43,"tag":202,"props":752,"children":753},{"class":204,"line":349},[754],{"type":43,"tag":202,"props":755,"children":756},{"emptyLinePlaceholder":236},[757],{"type":49,"value":239},{"type":43,"tag":202,"props":759,"children":760},{"class":204,"line":357},[761],{"type":43,"tag":202,"props":762,"children":763},{},[764],{"type":49,"value":765},"    url = f\"https:\u002F\u002Fapp.launchdarkly.com\u002Fapi\u002Fv2\u002Fmetrics\u002F{project_key}\"\n",{"type":43,"tag":202,"props":767,"children":768},{"class":204,"line":366},[769],{"type":43,"tag":202,"props":770,"children":771},{"emptyLinePlaceholder":236},[772],{"type":49,"value":239},{"type":43,"tag":202,"props":774,"children":775},{"class":204,"line":20},[776],{"type":43,"tag":202,"props":777,"children":778},{},[779],{"type":49,"value":780},"    payload = {\n",{"type":43,"tag":202,"props":782,"children":783},{"class":204,"line":383},[784],{"type":43,"tag":202,"props":785,"children":786},{},[787],{"type":49,"value":788},"        \"key\": metric_key,\n",{"type":43,"tag":202,"props":790,"children":791},{"class":204,"line":392},[792],{"type":43,"tag":202,"props":793,"children":794},{},[795],{"type":49,"value":796},"        \"name\": name,\n",{"type":43,"tag":202,"props":798,"children":799},{"class":204,"line":400},[800],{"type":43,"tag":202,"props":801,"children":802},{},[803],{"type":49,"value":804},"        \"kind\": kind,\n",{"type":43,"tag":202,"props":806,"children":808},{"class":204,"line":807},24,[809],{"type":43,"tag":202,"props":810,"children":811},{},[812],{"type":49,"value":813},"        \"isNumeric\": is_numeric,\n",{"type":43,"tag":202,"props":815,"children":817},{"class":204,"line":816},25,[818],{"type":43,"tag":202,"props":819,"children":820},{},[821],{"type":49,"value":822},"        \"eventKey\": event_key or metric_key\n",{"type":43,"tag":202,"props":824,"children":826},{"class":204,"line":825},26,[827],{"type":43,"tag":202,"props":828,"children":829},{},[830],{"type":49,"value":831},"    }\n",{"type":43,"tag":202,"props":833,"children":835},{"class":204,"line":834},27,[836],{"type":43,"tag":202,"props":837,"children":838},{"emptyLinePlaceholder":236},[839],{"type":49,"value":239},{"type":43,"tag":202,"props":841,"children":843},{"class":204,"line":842},28,[844],{"type":43,"tag":202,"props":845,"children":846},{},[847],{"type":49,"value":848},"    # Unit and successCriteria are required for numeric custom metrics\n",{"type":43,"tag":202,"props":850,"children":852},{"class":204,"line":851},29,[853],{"type":43,"tag":202,"props":854,"children":855},{},[856],{"type":49,"value":857},"    if is_numeric and kind == \"custom\":\n",{"type":43,"tag":202,"props":859,"children":861},{"class":204,"line":860},30,[862],{"type":43,"tag":202,"props":863,"children":864},{},[865],{"type":49,"value":866},"        payload[\"unit\"] = unit\n",{"type":43,"tag":202,"props":868,"children":870},{"class":204,"line":869},31,[871],{"type":43,"tag":202,"props":872,"children":873},{},[874],{"type":49,"value":875},"        payload[\"successCriteria\"] = success_criteria\n",{"type":43,"tag":202,"props":877,"children":879},{"class":204,"line":878},32,[880],{"type":43,"tag":202,"props":881,"children":882},{"emptyLinePlaceholder":236},[883],{"type":49,"value":239},{"type":43,"tag":202,"props":885,"children":887},{"class":204,"line":886},33,[888],{"type":43,"tag":202,"props":889,"children":890},{},[891],{"type":49,"value":892},"    if description:\n",{"type":43,"tag":202,"props":894,"children":896},{"class":204,"line":895},34,[897],{"type":43,"tag":202,"props":898,"children":899},{},[900],{"type":49,"value":901},"        payload[\"description\"] = description\n",{"type":43,"tag":202,"props":903,"children":905},{"class":204,"line":904},35,[906],{"type":43,"tag":202,"props":907,"children":908},{"emptyLinePlaceholder":236},[909],{"type":49,"value":239},{"type":43,"tag":202,"props":911,"children":913},{"class":204,"line":912},36,[914],{"type":43,"tag":202,"props":915,"children":916},{},[917],{"type":49,"value":918},"    headers = {\n",{"type":43,"tag":202,"props":920,"children":922},{"class":204,"line":921},37,[923],{"type":43,"tag":202,"props":924,"children":925},{},[926],{"type":49,"value":927},"        \"Authorization\": API_TOKEN,\n",{"type":43,"tag":202,"props":929,"children":931},{"class":204,"line":930},38,[932],{"type":43,"tag":202,"props":933,"children":934},{},[935],{"type":49,"value":936},"        \"Content-Type\": \"application\u002Fjson\"\n",{"type":43,"tag":202,"props":938,"children":940},{"class":204,"line":939},39,[941],{"type":43,"tag":202,"props":942,"children":943},{},[944],{"type":49,"value":831},{"type":43,"tag":202,"props":946,"children":948},{"class":204,"line":947},40,[949],{"type":43,"tag":202,"props":950,"children":951},{"emptyLinePlaceholder":236},[952],{"type":49,"value":239},{"type":43,"tag":202,"props":954,"children":956},{"class":204,"line":955},41,[957],{"type":43,"tag":202,"props":958,"children":959},{},[960],{"type":49,"value":961},"    response = requests.post(url, json=payload, headers=headers)\n",{"type":43,"tag":202,"props":963,"children":965},{"class":204,"line":964},42,[966],{"type":43,"tag":202,"props":967,"children":968},{"emptyLinePlaceholder":236},[969],{"type":49,"value":239},{"type":43,"tag":202,"props":971,"children":973},{"class":204,"line":972},43,[974],{"type":43,"tag":202,"props":975,"children":976},{},[977],{"type":49,"value":978},"    if response.status_code == 201:\n",{"type":43,"tag":202,"props":980,"children":982},{"class":204,"line":981},44,[983],{"type":43,"tag":202,"props":984,"children":985},{},[986],{"type":49,"value":987},"        print(f\"[OK] Created metric: {metric_key}\")\n",{"type":43,"tag":202,"props":989,"children":991},{"class":204,"line":990},45,[992],{"type":43,"tag":202,"props":993,"children":994},{},[995],{"type":49,"value":996},"        return response.json()\n",{"type":43,"tag":202,"props":998,"children":1000},{"class":204,"line":999},46,[1001],{"type":43,"tag":202,"props":1002,"children":1003},{},[1004],{"type":49,"value":1005},"    elif response.status_code == 409:\n",{"type":43,"tag":202,"props":1007,"children":1009},{"class":204,"line":1008},47,[1010],{"type":43,"tag":202,"props":1011,"children":1012},{},[1013],{"type":49,"value":1014},"        print(f\"[INFO] Metric already exists: {metric_key}\")\n",{"type":43,"tag":202,"props":1016,"children":1018},{"class":204,"line":1017},48,[1019],{"type":43,"tag":202,"props":1020,"children":1021},{},[1022],{"type":49,"value":1023},"        return None\n",{"type":43,"tag":202,"props":1025,"children":1027},{"class":204,"line":1026},49,[1028],{"type":43,"tag":202,"props":1029,"children":1030},{},[1031],{"type":49,"value":1032},"    else:\n",{"type":43,"tag":202,"props":1034,"children":1036},{"class":204,"line":1035},50,[1037],{"type":43,"tag":202,"props":1038,"children":1039},{},[1040],{"type":49,"value":1041},"        print(f\"[ERROR] Failed to create metric: {response.status_code}\")\n",{"type":43,"tag":202,"props":1043,"children":1045},{"class":204,"line":1044},51,[1046],{"type":43,"tag":202,"props":1047,"children":1048},{},[1049],{"type":49,"value":1050},"        print(f\"        {response.text}\")\n",{"type":43,"tag":202,"props":1052,"children":1054},{"class":204,"line":1053},52,[1055],{"type":43,"tag":202,"props":1056,"children":1057},{},[1058],{"type":49,"value":1023},{"type":43,"tag":52,"props":1060,"children":1061},{},[1062],{"type":43,"tag":127,"props":1063,"children":1064},{},[1065],{"type":49,"value":1066},"Metric Kinds:",{"type":43,"tag":65,"props":1068,"children":1069},{},[1070,1081,1092],{"type":43,"tag":69,"props":1071,"children":1072},{},[1073,1079],{"type":43,"tag":75,"props":1074,"children":1076},{"className":1075},[],[1077],{"type":49,"value":1078},"custom",{"type":49,"value":1080}," - Track any event (most common for agent metrics)",{"type":43,"tag":69,"props":1082,"children":1083},{},[1084,1090],{"type":43,"tag":75,"props":1085,"children":1087},{"className":1086},[],[1088],{"type":49,"value":1089},"pageview",{"type":49,"value":1091}," - Track page views",{"type":43,"tag":69,"props":1093,"children":1094},{},[1095,1101],{"type":43,"tag":75,"props":1096,"children":1098},{"className":1097},[],[1099],{"type":49,"value":1100},"click",{"type":49,"value":1102}," - Track click events",{"type":43,"tag":52,"props":1104,"children":1105},{},[1106,1111],{"type":43,"tag":127,"props":1107,"children":1108},{},[1109],{"type":49,"value":1110},"Success Criteria",{"type":49,"value":1112}," (for numeric metrics):",{"type":43,"tag":65,"props":1114,"children":1115},{},[1116,1127],{"type":43,"tag":69,"props":1117,"children":1118},{},[1119,1125],{"type":43,"tag":75,"props":1120,"children":1122},{"className":1121},[],[1123],{"type":49,"value":1124},"HigherThanBaseline",{"type":49,"value":1126}," - Higher values are better (e.g., revenue, satisfaction)",{"type":43,"tag":69,"props":1128,"children":1129},{},[1130,1136],{"type":43,"tag":75,"props":1131,"children":1133},{"className":1132},[],[1134],{"type":49,"value":1135},"LowerThanBaseline",{"type":49,"value":1137}," - Lower values are better (e.g., errors, latency)",{"type":43,"tag":52,"props":1139,"children":1140},{},[1141],{"type":43,"tag":127,"props":1142,"children":1143},{},[1144],{"type":49,"value":1145},"Common Units:",{"type":43,"tag":65,"props":1147,"children":1148},{},[1149,1160,1171,1182],{"type":43,"tag":69,"props":1150,"children":1151},{},[1152,1158],{"type":43,"tag":75,"props":1153,"children":1155},{"className":1154},[],[1156],{"type":49,"value":1157},"count",{"type":49,"value":1159}," - Generic count",{"type":43,"tag":69,"props":1161,"children":1162},{},[1163,1169],{"type":43,"tag":75,"props":1164,"children":1166},{"className":1165},[],[1167],{"type":49,"value":1168},"milliseconds",{"type":49,"value":1170}," - Time duration",{"type":43,"tag":69,"props":1172,"children":1173},{},[1174,1180],{"type":43,"tag":75,"props":1175,"children":1177},{"className":1176},[],[1178],{"type":49,"value":1179},"percent",{"type":49,"value":1181}," - Percentage values",{"type":43,"tag":69,"props":1183,"children":1184},{},[1185,1191],{"type":43,"tag":75,"props":1186,"children":1188},{"className":1187},[],[1189],{"type":49,"value":1190},"dollars",{"type":49,"value":1192}," - Currency",{"type":43,"tag":58,"props":1194,"children":1196},{"id":1195},"_2-track-events-sdk",[1197],{"type":49,"value":1198},"2. Track Events (SDK)",{"type":43,"tag":52,"props":1200,"children":1201},{},[1202],{"type":49,"value":1203},"Once the metric is created, track events using the SDK:",{"type":43,"tag":191,"props":1205,"children":1207},{"className":193,"code":1206,"language":195,"meta":196,"style":196},"from ldclient import Context\nfrom ldclient.config import Config\nimport ldclient\n\n# Initialize (see sdk for details)\nldclient.set_config(Config(\"your-sdk-key\"))\nld_client = ldclient.get()\n\ndef track_metric(ld_client, user_id: str, metric_key: str, value: float, data: dict = None):\n    \"\"\"Track an event to a metric.\"\"\"\n    context = Context.builder(user_id).build()\n\n    ld_client.track(\n        metric_key,\n        context,\n        data=data,\n        metric_value=value\n    )\n",[1208],{"type":43,"tag":75,"props":1209,"children":1210},{"__ignoreMap":196},[1211,1219,1227,1235,1242,1250,1258,1266,1273,1281,1289,1297,1304,1312,1320,1328,1336,1344],{"type":43,"tag":202,"props":1212,"children":1213},{"class":204,"line":205},[1214],{"type":43,"tag":202,"props":1215,"children":1216},{},[1217],{"type":49,"value":1218},"from ldclient import Context\n",{"type":43,"tag":202,"props":1220,"children":1221},{"class":204,"line":214},[1222],{"type":43,"tag":202,"props":1223,"children":1224},{},[1225],{"type":49,"value":1226},"from ldclient.config import Config\n",{"type":43,"tag":202,"props":1228,"children":1229},{"class":204,"line":223},[1230],{"type":43,"tag":202,"props":1231,"children":1232},{},[1233],{"type":49,"value":1234},"import ldclient\n",{"type":43,"tag":202,"props":1236,"children":1237},{"class":204,"line":232},[1238],{"type":43,"tag":202,"props":1239,"children":1240},{"emptyLinePlaceholder":236},[1241],{"type":49,"value":239},{"type":43,"tag":202,"props":1243,"children":1244},{"class":204,"line":242},[1245],{"type":43,"tag":202,"props":1246,"children":1247},{},[1248],{"type":49,"value":1249},"# Initialize (see sdk for details)\n",{"type":43,"tag":202,"props":1251,"children":1252},{"class":204,"line":24},[1253],{"type":43,"tag":202,"props":1254,"children":1255},{},[1256],{"type":49,"value":1257},"ldclient.set_config(Config(\"your-sdk-key\"))\n",{"type":43,"tag":202,"props":1259,"children":1260},{"class":204,"line":259},[1261],{"type":43,"tag":202,"props":1262,"children":1263},{},[1264],{"type":49,"value":1265},"ld_client = ldclient.get()\n",{"type":43,"tag":202,"props":1267,"children":1268},{"class":204,"line":268},[1269],{"type":43,"tag":202,"props":1270,"children":1271},{"emptyLinePlaceholder":236},[1272],{"type":49,"value":239},{"type":43,"tag":202,"props":1274,"children":1275},{"class":204,"line":277},[1276],{"type":43,"tag":202,"props":1277,"children":1278},{},[1279],{"type":49,"value":1280},"def track_metric(ld_client, user_id: str, metric_key: str, value: float, data: dict = None):\n",{"type":43,"tag":202,"props":1282,"children":1283},{"class":204,"line":286},[1284],{"type":43,"tag":202,"props":1285,"children":1286},{},[1287],{"type":49,"value":1288},"    \"\"\"Track an event to a metric.\"\"\"\n",{"type":43,"tag":202,"props":1290,"children":1291},{"class":204,"line":295},[1292],{"type":43,"tag":202,"props":1293,"children":1294},{},[1295],{"type":49,"value":1296},"    context = Context.builder(user_id).build()\n",{"type":43,"tag":202,"props":1298,"children":1299},{"class":204,"line":304},[1300],{"type":43,"tag":202,"props":1301,"children":1302},{"emptyLinePlaceholder":236},[1303],{"type":49,"value":239},{"type":43,"tag":202,"props":1305,"children":1306},{"class":204,"line":313},[1307],{"type":43,"tag":202,"props":1308,"children":1309},{},[1310],{"type":49,"value":1311},"    ld_client.track(\n",{"type":43,"tag":202,"props":1313,"children":1314},{"class":204,"line":322},[1315],{"type":43,"tag":202,"props":1316,"children":1317},{},[1318],{"type":49,"value":1319},"        metric_key,\n",{"type":43,"tag":202,"props":1321,"children":1322},{"class":204,"line":331},[1323],{"type":43,"tag":202,"props":1324,"children":1325},{},[1326],{"type":49,"value":1327},"        context,\n",{"type":43,"tag":202,"props":1329,"children":1330},{"class":204,"line":340},[1331],{"type":43,"tag":202,"props":1332,"children":1333},{},[1334],{"type":49,"value":1335},"        data=data,\n",{"type":43,"tag":202,"props":1337,"children":1338},{"class":204,"line":349},[1339],{"type":43,"tag":202,"props":1340,"children":1341},{},[1342],{"type":49,"value":1343},"        metric_value=value\n",{"type":43,"tag":202,"props":1345,"children":1346},{"class":204,"line":357},[1347],{"type":43,"tag":202,"props":1348,"children":1349},{},[1350],{"type":49,"value":1351},"    )\n",{"type":43,"tag":1353,"props":1354,"children":1356},"h3",{"id":1355},"common-tracking-patterns",[1357],{"type":49,"value":1358},"Common Tracking Patterns",{"type":43,"tag":191,"props":1360,"children":1362},{"className":193,"code":1361,"language":195,"meta":196,"style":196},"def track_conversion(ld_client, user_id: str, amount: float, config_key: str):\n    \"\"\"Track a conversion event with revenue.\"\"\"\n    context = Context.builder(user_id).build()\n\n    ld_client.track(\n        \"business.conversion\",\n        context,\n        data={\"configKey\": config_key, \"category\": \"electronics\"},\n        metric_value=amount\n    )\n\ndef track_task_success(ld_client, user_id: str, task_type: str, success: bool):\n    \"\"\"Track task completion success\u002Ffailure.\"\"\"\n    context = Context.builder(user_id).build()\n\n    ld_client.track(\n        \"task.success_rate\",\n        context,\n        data={\"taskType\": task_type},\n        metric_value=1.0 if success else 0.0\n    )\n\ndef track_satisfaction(ld_client, user_id: str, score: float, feedback_type: str):\n    \"\"\"Track user satisfaction (0-100 scale).\"\"\"\n    context = Context.builder(user_id).build()\n\n    ld_client.track(\n        \"user.satisfaction\",\n        context,\n        data={\"feedbackType\": feedback_type},\n        metric_value=score\n    )\n\n    # Track negative feedback separately for alerts\n    if score \u003C 50:\n        ld_client.track(\n            \"user.negative_feedback\",\n            context,\n            metric_value=1.0\n        )\n\ndef track_revenue(ld_client, user_id: str, revenue: float, source: str):\n    \"\"\"Track revenue generated after agent interaction.\"\"\"\n    context = Context.builder(user_id).set(\"tier\", \"premium\").build()\n\n    if revenue > 0:\n        ld_client.track(\n            \"revenue.impact\",\n            context,\n            data={\"source\": source},\n            metric_value=revenue\n        )\n",[1363],{"type":43,"tag":75,"props":1364,"children":1365},{"__ignoreMap":196},[1366,1374,1382,1389,1396,1403,1411,1418,1426,1434,1441,1448,1456,1464,1471,1478,1485,1493,1500,1508,1516,1523,1530,1538,1546,1553,1560,1567,1575,1582,1590,1598,1605,1612,1620,1628,1636,1644,1652,1660,1668,1675,1683,1691,1699,1706,1714,1721,1729,1736,1744,1752],{"type":43,"tag":202,"props":1367,"children":1368},{"class":204,"line":205},[1369],{"type":43,"tag":202,"props":1370,"children":1371},{},[1372],{"type":49,"value":1373},"def track_conversion(ld_client, user_id: str, amount: float, config_key: str):\n",{"type":43,"tag":202,"props":1375,"children":1376},{"class":204,"line":214},[1377],{"type":43,"tag":202,"props":1378,"children":1379},{},[1380],{"type":49,"value":1381},"    \"\"\"Track a conversion event with revenue.\"\"\"\n",{"type":43,"tag":202,"props":1383,"children":1384},{"class":204,"line":223},[1385],{"type":43,"tag":202,"props":1386,"children":1387},{},[1388],{"type":49,"value":1296},{"type":43,"tag":202,"props":1390,"children":1391},{"class":204,"line":232},[1392],{"type":43,"tag":202,"props":1393,"children":1394},{"emptyLinePlaceholder":236},[1395],{"type":49,"value":239},{"type":43,"tag":202,"props":1397,"children":1398},{"class":204,"line":242},[1399],{"type":43,"tag":202,"props":1400,"children":1401},{},[1402],{"type":49,"value":1311},{"type":43,"tag":202,"props":1404,"children":1405},{"class":204,"line":24},[1406],{"type":43,"tag":202,"props":1407,"children":1408},{},[1409],{"type":49,"value":1410},"        \"business.conversion\",\n",{"type":43,"tag":202,"props":1412,"children":1413},{"class":204,"line":259},[1414],{"type":43,"tag":202,"props":1415,"children":1416},{},[1417],{"type":49,"value":1327},{"type":43,"tag":202,"props":1419,"children":1420},{"class":204,"line":268},[1421],{"type":43,"tag":202,"props":1422,"children":1423},{},[1424],{"type":49,"value":1425},"        data={\"configKey\": config_key, \"category\": \"electronics\"},\n",{"type":43,"tag":202,"props":1427,"children":1428},{"class":204,"line":277},[1429],{"type":43,"tag":202,"props":1430,"children":1431},{},[1432],{"type":49,"value":1433},"        metric_value=amount\n",{"type":43,"tag":202,"props":1435,"children":1436},{"class":204,"line":286},[1437],{"type":43,"tag":202,"props":1438,"children":1439},{},[1440],{"type":49,"value":1351},{"type":43,"tag":202,"props":1442,"children":1443},{"class":204,"line":295},[1444],{"type":43,"tag":202,"props":1445,"children":1446},{"emptyLinePlaceholder":236},[1447],{"type":49,"value":239},{"type":43,"tag":202,"props":1449,"children":1450},{"class":204,"line":304},[1451],{"type":43,"tag":202,"props":1452,"children":1453},{},[1454],{"type":49,"value":1455},"def track_task_success(ld_client, user_id: str, task_type: str, success: bool):\n",{"type":43,"tag":202,"props":1457,"children":1458},{"class":204,"line":313},[1459],{"type":43,"tag":202,"props":1460,"children":1461},{},[1462],{"type":49,"value":1463},"    \"\"\"Track task completion success\u002Ffailure.\"\"\"\n",{"type":43,"tag":202,"props":1465,"children":1466},{"class":204,"line":322},[1467],{"type":43,"tag":202,"props":1468,"children":1469},{},[1470],{"type":49,"value":1296},{"type":43,"tag":202,"props":1472,"children":1473},{"class":204,"line":331},[1474],{"type":43,"tag":202,"props":1475,"children":1476},{"emptyLinePlaceholder":236},[1477],{"type":49,"value":239},{"type":43,"tag":202,"props":1479,"children":1480},{"class":204,"line":340},[1481],{"type":43,"tag":202,"props":1482,"children":1483},{},[1484],{"type":49,"value":1311},{"type":43,"tag":202,"props":1486,"children":1487},{"class":204,"line":349},[1488],{"type":43,"tag":202,"props":1489,"children":1490},{},[1491],{"type":49,"value":1492},"        \"task.success_rate\",\n",{"type":43,"tag":202,"props":1494,"children":1495},{"class":204,"line":357},[1496],{"type":43,"tag":202,"props":1497,"children":1498},{},[1499],{"type":49,"value":1327},{"type":43,"tag":202,"props":1501,"children":1502},{"class":204,"line":366},[1503],{"type":43,"tag":202,"props":1504,"children":1505},{},[1506],{"type":49,"value":1507},"        data={\"taskType\": task_type},\n",{"type":43,"tag":202,"props":1509,"children":1510},{"class":204,"line":20},[1511],{"type":43,"tag":202,"props":1512,"children":1513},{},[1514],{"type":49,"value":1515},"        metric_value=1.0 if success else 0.0\n",{"type":43,"tag":202,"props":1517,"children":1518},{"class":204,"line":383},[1519],{"type":43,"tag":202,"props":1520,"children":1521},{},[1522],{"type":49,"value":1351},{"type":43,"tag":202,"props":1524,"children":1525},{"class":204,"line":392},[1526],{"type":43,"tag":202,"props":1527,"children":1528},{"emptyLinePlaceholder":236},[1529],{"type":49,"value":239},{"type":43,"tag":202,"props":1531,"children":1532},{"class":204,"line":400},[1533],{"type":43,"tag":202,"props":1534,"children":1535},{},[1536],{"type":49,"value":1537},"def track_satisfaction(ld_client, user_id: str, score: float, feedback_type: str):\n",{"type":43,"tag":202,"props":1539,"children":1540},{"class":204,"line":807},[1541],{"type":43,"tag":202,"props":1542,"children":1543},{},[1544],{"type":49,"value":1545},"    \"\"\"Track user satisfaction (0-100 scale).\"\"\"\n",{"type":43,"tag":202,"props":1547,"children":1548},{"class":204,"line":816},[1549],{"type":43,"tag":202,"props":1550,"children":1551},{},[1552],{"type":49,"value":1296},{"type":43,"tag":202,"props":1554,"children":1555},{"class":204,"line":825},[1556],{"type":43,"tag":202,"props":1557,"children":1558},{"emptyLinePlaceholder":236},[1559],{"type":49,"value":239},{"type":43,"tag":202,"props":1561,"children":1562},{"class":204,"line":834},[1563],{"type":43,"tag":202,"props":1564,"children":1565},{},[1566],{"type":49,"value":1311},{"type":43,"tag":202,"props":1568,"children":1569},{"class":204,"line":842},[1570],{"type":43,"tag":202,"props":1571,"children":1572},{},[1573],{"type":49,"value":1574},"        \"user.satisfaction\",\n",{"type":43,"tag":202,"props":1576,"children":1577},{"class":204,"line":851},[1578],{"type":43,"tag":202,"props":1579,"children":1580},{},[1581],{"type":49,"value":1327},{"type":43,"tag":202,"props":1583,"children":1584},{"class":204,"line":860},[1585],{"type":43,"tag":202,"props":1586,"children":1587},{},[1588],{"type":49,"value":1589},"        data={\"feedbackType\": feedback_type},\n",{"type":43,"tag":202,"props":1591,"children":1592},{"class":204,"line":869},[1593],{"type":43,"tag":202,"props":1594,"children":1595},{},[1596],{"type":49,"value":1597},"        metric_value=score\n",{"type":43,"tag":202,"props":1599,"children":1600},{"class":204,"line":878},[1601],{"type":43,"tag":202,"props":1602,"children":1603},{},[1604],{"type":49,"value":1351},{"type":43,"tag":202,"props":1606,"children":1607},{"class":204,"line":886},[1608],{"type":43,"tag":202,"props":1609,"children":1610},{"emptyLinePlaceholder":236},[1611],{"type":49,"value":239},{"type":43,"tag":202,"props":1613,"children":1614},{"class":204,"line":895},[1615],{"type":43,"tag":202,"props":1616,"children":1617},{},[1618],{"type":49,"value":1619},"    # Track negative feedback separately for alerts\n",{"type":43,"tag":202,"props":1621,"children":1622},{"class":204,"line":904},[1623],{"type":43,"tag":202,"props":1624,"children":1625},{},[1626],{"type":49,"value":1627},"    if score \u003C 50:\n",{"type":43,"tag":202,"props":1629,"children":1630},{"class":204,"line":912},[1631],{"type":43,"tag":202,"props":1632,"children":1633},{},[1634],{"type":49,"value":1635},"        ld_client.track(\n",{"type":43,"tag":202,"props":1637,"children":1638},{"class":204,"line":921},[1639],{"type":43,"tag":202,"props":1640,"children":1641},{},[1642],{"type":49,"value":1643},"            \"user.negative_feedback\",\n",{"type":43,"tag":202,"props":1645,"children":1646},{"class":204,"line":930},[1647],{"type":43,"tag":202,"props":1648,"children":1649},{},[1650],{"type":49,"value":1651},"            context,\n",{"type":43,"tag":202,"props":1653,"children":1654},{"class":204,"line":939},[1655],{"type":43,"tag":202,"props":1656,"children":1657},{},[1658],{"type":49,"value":1659},"            metric_value=1.0\n",{"type":43,"tag":202,"props":1661,"children":1662},{"class":204,"line":947},[1663],{"type":43,"tag":202,"props":1664,"children":1665},{},[1666],{"type":49,"value":1667},"        )\n",{"type":43,"tag":202,"props":1669,"children":1670},{"class":204,"line":955},[1671],{"type":43,"tag":202,"props":1672,"children":1673},{"emptyLinePlaceholder":236},[1674],{"type":49,"value":239},{"type":43,"tag":202,"props":1676,"children":1677},{"class":204,"line":964},[1678],{"type":43,"tag":202,"props":1679,"children":1680},{},[1681],{"type":49,"value":1682},"def track_revenue(ld_client, user_id: str, revenue: float, source: str):\n",{"type":43,"tag":202,"props":1684,"children":1685},{"class":204,"line":972},[1686],{"type":43,"tag":202,"props":1687,"children":1688},{},[1689],{"type":49,"value":1690},"    \"\"\"Track revenue generated after agent interaction.\"\"\"\n",{"type":43,"tag":202,"props":1692,"children":1693},{"class":204,"line":981},[1694],{"type":43,"tag":202,"props":1695,"children":1696},{},[1697],{"type":49,"value":1698},"    context = Context.builder(user_id).set(\"tier\", \"premium\").build()\n",{"type":43,"tag":202,"props":1700,"children":1701},{"class":204,"line":990},[1702],{"type":43,"tag":202,"props":1703,"children":1704},{"emptyLinePlaceholder":236},[1705],{"type":49,"value":239},{"type":43,"tag":202,"props":1707,"children":1708},{"class":204,"line":999},[1709],{"type":43,"tag":202,"props":1710,"children":1711},{},[1712],{"type":49,"value":1713},"    if revenue > 0:\n",{"type":43,"tag":202,"props":1715,"children":1716},{"class":204,"line":1008},[1717],{"type":43,"tag":202,"props":1718,"children":1719},{},[1720],{"type":49,"value":1635},{"type":43,"tag":202,"props":1722,"children":1723},{"class":204,"line":1017},[1724],{"type":43,"tag":202,"props":1725,"children":1726},{},[1727],{"type":49,"value":1728},"            \"revenue.impact\",\n",{"type":43,"tag":202,"props":1730,"children":1731},{"class":204,"line":1026},[1732],{"type":43,"tag":202,"props":1733,"children":1734},{},[1735],{"type":49,"value":1651},{"type":43,"tag":202,"props":1737,"children":1738},{"class":204,"line":1035},[1739],{"type":43,"tag":202,"props":1740,"children":1741},{},[1742],{"type":49,"value":1743},"            data={\"source\": source},\n",{"type":43,"tag":202,"props":1745,"children":1746},{"class":204,"line":1044},[1747],{"type":43,"tag":202,"props":1748,"children":1749},{},[1750],{"type":49,"value":1751},"            metric_value=revenue\n",{"type":43,"tag":202,"props":1753,"children":1754},{"class":204,"line":1053},[1755],{"type":43,"tag":202,"props":1756,"children":1757},{},[1758],{"type":49,"value":1667},{"type":43,"tag":58,"props":1760,"children":1762},{"id":1761},"_3-get-metrics-api",[1763],{"type":49,"value":1764},"3. Get Metrics (API)",{"type":43,"tag":1353,"props":1766,"children":1768},{"id":1767},"get-single-metric",[1769],{"type":49,"value":1770},"Get Single Metric",{"type":43,"tag":191,"props":1772,"children":1774},{"className":193,"code":1773,"language":195,"meta":196,"style":196},"def get_metric(project_key: str, metric_key: str):\n    \"\"\"Get a single metric definition.\"\"\"\n    API_TOKEN = os.environ.get(\"LAUNCHDARKLY_API_TOKEN\")\n\n    url = f\"https:\u002F\u002Fapp.launchdarkly.com\u002Fapi\u002Fv2\u002Fmetrics\u002F{project_key}\u002F{metric_key}\"\n\n    headers = {\"Authorization\": API_TOKEN}\n\n    response = requests.get(url, headers=headers)\n\n    if response.status_code == 200:\n        metric = response.json()\n        print(f\"[OK] Metric: {metric['key']}\")\n        print(f\"     Name: {metric.get('name', 'N\u002FA')}\")\n        print(f\"     Kind: {metric.get('kind', 'N\u002FA')}\")\n        print(f\"     Numeric: {metric.get('isNumeric', False)}\")\n        print(f\"     Event Key: {metric.get('eventKey', 'N\u002FA')}\")\n        return metric\n    elif response.status_code == 404:\n        print(f\"[INFO] Metric not found: {metric_key}\")\n        return None\n    else:\n        print(f\"[ERROR] Failed to get metric: {response.status_code}\")\n        return None\n",[1775],{"type":43,"tag":75,"props":1776,"children":1777},{"__ignoreMap":196},[1778,1786,1794,1801,1808,1816,1823,1831,1838,1846,1853,1861,1869,1877,1885,1893,1901,1909,1917,1925,1933,1940,1947,1955],{"type":43,"tag":202,"props":1779,"children":1780},{"class":204,"line":205},[1781],{"type":43,"tag":202,"props":1782,"children":1783},{},[1784],{"type":49,"value":1785},"def get_metric(project_key: str, metric_key: str):\n",{"type":43,"tag":202,"props":1787,"children":1788},{"class":204,"line":214},[1789],{"type":43,"tag":202,"props":1790,"children":1791},{},[1792],{"type":49,"value":1793},"    \"\"\"Get a single metric definition.\"\"\"\n",{"type":43,"tag":202,"props":1795,"children":1796},{"class":204,"line":223},[1797],{"type":43,"tag":202,"props":1798,"children":1799},{},[1800],{"type":49,"value":750},{"type":43,"tag":202,"props":1802,"children":1803},{"class":204,"line":232},[1804],{"type":43,"tag":202,"props":1805,"children":1806},{"emptyLinePlaceholder":236},[1807],{"type":49,"value":239},{"type":43,"tag":202,"props":1809,"children":1810},{"class":204,"line":242},[1811],{"type":43,"tag":202,"props":1812,"children":1813},{},[1814],{"type":49,"value":1815},"    url = f\"https:\u002F\u002Fapp.launchdarkly.com\u002Fapi\u002Fv2\u002Fmetrics\u002F{project_key}\u002F{metric_key}\"\n",{"type":43,"tag":202,"props":1817,"children":1818},{"class":204,"line":24},[1819],{"type":43,"tag":202,"props":1820,"children":1821},{"emptyLinePlaceholder":236},[1822],{"type":49,"value":239},{"type":43,"tag":202,"props":1824,"children":1825},{"class":204,"line":259},[1826],{"type":43,"tag":202,"props":1827,"children":1828},{},[1829],{"type":49,"value":1830},"    headers = {\"Authorization\": API_TOKEN}\n",{"type":43,"tag":202,"props":1832,"children":1833},{"class":204,"line":268},[1834],{"type":43,"tag":202,"props":1835,"children":1836},{"emptyLinePlaceholder":236},[1837],{"type":49,"value":239},{"type":43,"tag":202,"props":1839,"children":1840},{"class":204,"line":277},[1841],{"type":43,"tag":202,"props":1842,"children":1843},{},[1844],{"type":49,"value":1845},"    response = requests.get(url, headers=headers)\n",{"type":43,"tag":202,"props":1847,"children":1848},{"class":204,"line":286},[1849],{"type":43,"tag":202,"props":1850,"children":1851},{"emptyLinePlaceholder":236},[1852],{"type":49,"value":239},{"type":43,"tag":202,"props":1854,"children":1855},{"class":204,"line":295},[1856],{"type":43,"tag":202,"props":1857,"children":1858},{},[1859],{"type":49,"value":1860},"    if response.status_code == 200:\n",{"type":43,"tag":202,"props":1862,"children":1863},{"class":204,"line":304},[1864],{"type":43,"tag":202,"props":1865,"children":1866},{},[1867],{"type":49,"value":1868},"        metric = response.json()\n",{"type":43,"tag":202,"props":1870,"children":1871},{"class":204,"line":313},[1872],{"type":43,"tag":202,"props":1873,"children":1874},{},[1875],{"type":49,"value":1876},"        print(f\"[OK] Metric: {metric['key']}\")\n",{"type":43,"tag":202,"props":1878,"children":1879},{"class":204,"line":322},[1880],{"type":43,"tag":202,"props":1881,"children":1882},{},[1883],{"type":49,"value":1884},"        print(f\"     Name: {metric.get('name', 'N\u002FA')}\")\n",{"type":43,"tag":202,"props":1886,"children":1887},{"class":204,"line":331},[1888],{"type":43,"tag":202,"props":1889,"children":1890},{},[1891],{"type":49,"value":1892},"        print(f\"     Kind: {metric.get('kind', 'N\u002FA')}\")\n",{"type":43,"tag":202,"props":1894,"children":1895},{"class":204,"line":340},[1896],{"type":43,"tag":202,"props":1897,"children":1898},{},[1899],{"type":49,"value":1900},"        print(f\"     Numeric: {metric.get('isNumeric', False)}\")\n",{"type":43,"tag":202,"props":1902,"children":1903},{"class":204,"line":349},[1904],{"type":43,"tag":202,"props":1905,"children":1906},{},[1907],{"type":49,"value":1908},"        print(f\"     Event Key: {metric.get('eventKey', 'N\u002FA')}\")\n",{"type":43,"tag":202,"props":1910,"children":1911},{"class":204,"line":357},[1912],{"type":43,"tag":202,"props":1913,"children":1914},{},[1915],{"type":49,"value":1916},"        return metric\n",{"type":43,"tag":202,"props":1918,"children":1919},{"class":204,"line":366},[1920],{"type":43,"tag":202,"props":1921,"children":1922},{},[1923],{"type":49,"value":1924},"    elif response.status_code == 404:\n",{"type":43,"tag":202,"props":1926,"children":1927},{"class":204,"line":20},[1928],{"type":43,"tag":202,"props":1929,"children":1930},{},[1931],{"type":49,"value":1932},"        print(f\"[INFO] Metric not found: {metric_key}\")\n",{"type":43,"tag":202,"props":1934,"children":1935},{"class":204,"line":383},[1936],{"type":43,"tag":202,"props":1937,"children":1938},{},[1939],{"type":49,"value":1023},{"type":43,"tag":202,"props":1941,"children":1942},{"class":204,"line":392},[1943],{"type":43,"tag":202,"props":1944,"children":1945},{},[1946],{"type":49,"value":1032},{"type":43,"tag":202,"props":1948,"children":1949},{"class":204,"line":400},[1950],{"type":43,"tag":202,"props":1951,"children":1952},{},[1953],{"type":49,"value":1954},"        print(f\"[ERROR] Failed to get metric: {response.status_code}\")\n",{"type":43,"tag":202,"props":1956,"children":1957},{"class":204,"line":807},[1958],{"type":43,"tag":202,"props":1959,"children":1960},{},[1961],{"type":49,"value":1023},{"type":43,"tag":1353,"props":1963,"children":1965},{"id":1964},"list-all-metrics",[1966],{"type":49,"value":1967},"List All Metrics",{"type":43,"tag":191,"props":1969,"children":1971},{"className":193,"code":1970,"language":195,"meta":196,"style":196},"def list_metrics(project_key: str, limit: int = 20):\n    \"\"\"List all metrics in a project.\"\"\"\n    API_TOKEN = os.environ.get(\"LAUNCHDARKLY_API_TOKEN\")\n\n    url = f\"https:\u002F\u002Fapp.launchdarkly.com\u002Fapi\u002Fv2\u002Fmetrics\u002F{project_key}\"\n\n    headers = {\"Authorization\": API_TOKEN}\n    params = {\"limit\": limit}\n\n    response = requests.get(url, headers=headers, params=params)\n\n    if response.status_code == 200:\n        data = response.json()\n        metrics = data.get(\"items\", [])\n        print(f\"[OK] Found {len(metrics)} metrics:\")\n        for metric in metrics:\n            numeric = \"numeric\" if metric.get(\"isNumeric\") else \"non-numeric\"\n            print(f\"     - {metric['key']} ({metric.get('kind', 'custom')}, {numeric})\")\n        return metrics\n    else:\n        print(f\"[ERROR] Failed to list metrics: {response.status_code}\")\n        return None\n",[1972],{"type":43,"tag":75,"props":1973,"children":1974},{"__ignoreMap":196},[1975,1983,1991,1998,2005,2012,2019,2026,2034,2041,2049,2056,2063,2071,2079,2087,2095,2103,2111,2119,2126,2134],{"type":43,"tag":202,"props":1976,"children":1977},{"class":204,"line":205},[1978],{"type":43,"tag":202,"props":1979,"children":1980},{},[1981],{"type":49,"value":1982},"def list_metrics(project_key: str, limit: int = 20):\n",{"type":43,"tag":202,"props":1984,"children":1985},{"class":204,"line":214},[1986],{"type":43,"tag":202,"props":1987,"children":1988},{},[1989],{"type":49,"value":1990},"    \"\"\"List all metrics in a project.\"\"\"\n",{"type":43,"tag":202,"props":1992,"children":1993},{"class":204,"line":223},[1994],{"type":43,"tag":202,"props":1995,"children":1996},{},[1997],{"type":49,"value":750},{"type":43,"tag":202,"props":1999,"children":2000},{"class":204,"line":232},[2001],{"type":43,"tag":202,"props":2002,"children":2003},{"emptyLinePlaceholder":236},[2004],{"type":49,"value":239},{"type":43,"tag":202,"props":2006,"children":2007},{"class":204,"line":242},[2008],{"type":43,"tag":202,"props":2009,"children":2010},{},[2011],{"type":49,"value":765},{"type":43,"tag":202,"props":2013,"children":2014},{"class":204,"line":24},[2015],{"type":43,"tag":202,"props":2016,"children":2017},{"emptyLinePlaceholder":236},[2018],{"type":49,"value":239},{"type":43,"tag":202,"props":2020,"children":2021},{"class":204,"line":259},[2022],{"type":43,"tag":202,"props":2023,"children":2024},{},[2025],{"type":49,"value":1830},{"type":43,"tag":202,"props":2027,"children":2028},{"class":204,"line":268},[2029],{"type":43,"tag":202,"props":2030,"children":2031},{},[2032],{"type":49,"value":2033},"    params = {\"limit\": limit}\n",{"type":43,"tag":202,"props":2035,"children":2036},{"class":204,"line":277},[2037],{"type":43,"tag":202,"props":2038,"children":2039},{"emptyLinePlaceholder":236},[2040],{"type":49,"value":239},{"type":43,"tag":202,"props":2042,"children":2043},{"class":204,"line":286},[2044],{"type":43,"tag":202,"props":2045,"children":2046},{},[2047],{"type":49,"value":2048},"    response = requests.get(url, headers=headers, params=params)\n",{"type":43,"tag":202,"props":2050,"children":2051},{"class":204,"line":295},[2052],{"type":43,"tag":202,"props":2053,"children":2054},{"emptyLinePlaceholder":236},[2055],{"type":49,"value":239},{"type":43,"tag":202,"props":2057,"children":2058},{"class":204,"line":304},[2059],{"type":43,"tag":202,"props":2060,"children":2061},{},[2062],{"type":49,"value":1860},{"type":43,"tag":202,"props":2064,"children":2065},{"class":204,"line":313},[2066],{"type":43,"tag":202,"props":2067,"children":2068},{},[2069],{"type":49,"value":2070},"        data = response.json()\n",{"type":43,"tag":202,"props":2072,"children":2073},{"class":204,"line":322},[2074],{"type":43,"tag":202,"props":2075,"children":2076},{},[2077],{"type":49,"value":2078},"        metrics = data.get(\"items\", [])\n",{"type":43,"tag":202,"props":2080,"children":2081},{"class":204,"line":331},[2082],{"type":43,"tag":202,"props":2083,"children":2084},{},[2085],{"type":49,"value":2086},"        print(f\"[OK] Found {len(metrics)} metrics:\")\n",{"type":43,"tag":202,"props":2088,"children":2089},{"class":204,"line":340},[2090],{"type":43,"tag":202,"props":2091,"children":2092},{},[2093],{"type":49,"value":2094},"        for metric in metrics:\n",{"type":43,"tag":202,"props":2096,"children":2097},{"class":204,"line":349},[2098],{"type":43,"tag":202,"props":2099,"children":2100},{},[2101],{"type":49,"value":2102},"            numeric = \"numeric\" if metric.get(\"isNumeric\") else \"non-numeric\"\n",{"type":43,"tag":202,"props":2104,"children":2105},{"class":204,"line":357},[2106],{"type":43,"tag":202,"props":2107,"children":2108},{},[2109],{"type":49,"value":2110},"            print(f\"     - {metric['key']} ({metric.get('kind', 'custom')}, {numeric})\")\n",{"type":43,"tag":202,"props":2112,"children":2113},{"class":204,"line":366},[2114],{"type":43,"tag":202,"props":2115,"children":2116},{},[2117],{"type":49,"value":2118},"        return metrics\n",{"type":43,"tag":202,"props":2120,"children":2121},{"class":204,"line":20},[2122],{"type":43,"tag":202,"props":2123,"children":2124},{},[2125],{"type":49,"value":1032},{"type":43,"tag":202,"props":2127,"children":2128},{"class":204,"line":383},[2129],{"type":43,"tag":202,"props":2130,"children":2131},{},[2132],{"type":49,"value":2133},"        print(f\"[ERROR] Failed to list metrics: {response.status_code}\")\n",{"type":43,"tag":202,"props":2135,"children":2136},{"class":204,"line":392},[2137],{"type":43,"tag":202,"props":2138,"children":2139},{},[2140],{"type":49,"value":1023},{"type":43,"tag":58,"props":2142,"children":2144},{"id":2143},"_4-update-metric-api",[2145],{"type":49,"value":2146},"4. Update Metric (API)",{"type":43,"tag":191,"props":2148,"children":2150},{"className":193,"code":2149,"language":195,"meta":196,"style":196},"def update_metric(project_key: str, metric_key: str, updates: list):\n    \"\"\"\n    Update a metric using JSON Patch operations.\n\n    Args:\n        updates: List of patch operations, e.g.:\n            [{\"op\": \"replace\", \"path\": \"\u002Fname\", \"value\": \"New Name\"}]\n    \"\"\"\n    API_TOKEN = os.environ.get(\"LAUNCHDARKLY_API_TOKEN\")\n\n    url = f\"https:\u002F\u002Fapp.launchdarkly.com\u002Fapi\u002Fv2\u002Fmetrics\u002F{project_key}\u002F{metric_key}\"\n\n    headers = {\n        \"Authorization\": API_TOKEN,\n        \"Content-Type\": \"application\u002Fjson\"\n    }\n\n    response = requests.patch(url, json=updates, headers=headers)\n\n    if response.status_code == 200:\n        print(f\"[OK] Updated metric: {metric_key}\")\n        return response.json()\n    elif response.status_code == 404:\n        print(f\"[ERROR] Metric not found: {metric_key}\")\n        return None\n    else:\n        print(f\"[ERROR] Failed to update metric: {response.status_code}\")\n        print(f\"        {response.text}\")\n        return None\n\n# Example: Update metric name and description\ndef rename_metric(project_key: str, metric_key: str, new_name: str, new_description: str = None):\n    \"\"\"Rename a metric and optionally update description.\"\"\"\n    updates = [\n        {\"op\": \"replace\", \"path\": \"\u002Fname\", \"value\": new_name}\n    ]\n    if new_description:\n        updates.append({\"op\": \"replace\", \"path\": \"\u002Fdescription\", \"value\": new_description})\n\n    return update_metric(project_key, metric_key, updates)\n",[2151],{"type":43,"tag":75,"props":2152,"children":2153},{"__ignoreMap":196},[2154,2162,2170,2178,2185,2193,2201,2209,2216,2223,2230,2237,2244,2251,2258,2265,2272,2279,2287,2294,2301,2309,2316,2323,2331,2338,2345,2353,2360,2367,2374,2382,2390,2398,2406,2414,2422,2430,2438,2445],{"type":43,"tag":202,"props":2155,"children":2156},{"class":204,"line":205},[2157],{"type":43,"tag":202,"props":2158,"children":2159},{},[2160],{"type":49,"value":2161},"def update_metric(project_key: str, metric_key: str, updates: list):\n",{"type":43,"tag":202,"props":2163,"children":2164},{"class":204,"line":214},[2165],{"type":43,"tag":202,"props":2166,"children":2167},{},[2168],{"type":49,"value":2169},"    \"\"\"\n",{"type":43,"tag":202,"props":2171,"children":2172},{"class":204,"line":223},[2173],{"type":43,"tag":202,"props":2174,"children":2175},{},[2176],{"type":49,"value":2177},"    Update a metric using JSON Patch operations.\n",{"type":43,"tag":202,"props":2179,"children":2180},{"class":204,"line":232},[2181],{"type":43,"tag":202,"props":2182,"children":2183},{"emptyLinePlaceholder":236},[2184],{"type":49,"value":239},{"type":43,"tag":202,"props":2186,"children":2187},{"class":204,"line":242},[2188],{"type":43,"tag":202,"props":2189,"children":2190},{},[2191],{"type":49,"value":2192},"    Args:\n",{"type":43,"tag":202,"props":2194,"children":2195},{"class":204,"line":24},[2196],{"type":43,"tag":202,"props":2197,"children":2198},{},[2199],{"type":49,"value":2200},"        updates: List of patch operations, e.g.:\n",{"type":43,"tag":202,"props":2202,"children":2203},{"class":204,"line":259},[2204],{"type":43,"tag":202,"props":2205,"children":2206},{},[2207],{"type":49,"value":2208},"            [{\"op\": \"replace\", \"path\": \"\u002Fname\", \"value\": \"New Name\"}]\n",{"type":43,"tag":202,"props":2210,"children":2211},{"class":204,"line":268},[2212],{"type":43,"tag":202,"props":2213,"children":2214},{},[2215],{"type":49,"value":2169},{"type":43,"tag":202,"props":2217,"children":2218},{"class":204,"line":277},[2219],{"type":43,"tag":202,"props":2220,"children":2221},{},[2222],{"type":49,"value":750},{"type":43,"tag":202,"props":2224,"children":2225},{"class":204,"line":286},[2226],{"type":43,"tag":202,"props":2227,"children":2228},{"emptyLinePlaceholder":236},[2229],{"type":49,"value":239},{"type":43,"tag":202,"props":2231,"children":2232},{"class":204,"line":295},[2233],{"type":43,"tag":202,"props":2234,"children":2235},{},[2236],{"type":49,"value":1815},{"type":43,"tag":202,"props":2238,"children":2239},{"class":204,"line":304},[2240],{"type":43,"tag":202,"props":2241,"children":2242},{"emptyLinePlaceholder":236},[2243],{"type":49,"value":239},{"type":43,"tag":202,"props":2245,"children":2246},{"class":204,"line":313},[2247],{"type":43,"tag":202,"props":2248,"children":2249},{},[2250],{"type":49,"value":918},{"type":43,"tag":202,"props":2252,"children":2253},{"class":204,"line":322},[2254],{"type":43,"tag":202,"props":2255,"children":2256},{},[2257],{"type":49,"value":927},{"type":43,"tag":202,"props":2259,"children":2260},{"class":204,"line":331},[2261],{"type":43,"tag":202,"props":2262,"children":2263},{},[2264],{"type":49,"value":936},{"type":43,"tag":202,"props":2266,"children":2267},{"class":204,"line":340},[2268],{"type":43,"tag":202,"props":2269,"children":2270},{},[2271],{"type":49,"value":831},{"type":43,"tag":202,"props":2273,"children":2274},{"class":204,"line":349},[2275],{"type":43,"tag":202,"props":2276,"children":2277},{"emptyLinePlaceholder":236},[2278],{"type":49,"value":239},{"type":43,"tag":202,"props":2280,"children":2281},{"class":204,"line":357},[2282],{"type":43,"tag":202,"props":2283,"children":2284},{},[2285],{"type":49,"value":2286},"    response = requests.patch(url, json=updates, headers=headers)\n",{"type":43,"tag":202,"props":2288,"children":2289},{"class":204,"line":366},[2290],{"type":43,"tag":202,"props":2291,"children":2292},{"emptyLinePlaceholder":236},[2293],{"type":49,"value":239},{"type":43,"tag":202,"props":2295,"children":2296},{"class":204,"line":20},[2297],{"type":43,"tag":202,"props":2298,"children":2299},{},[2300],{"type":49,"value":1860},{"type":43,"tag":202,"props":2302,"children":2303},{"class":204,"line":383},[2304],{"type":43,"tag":202,"props":2305,"children":2306},{},[2307],{"type":49,"value":2308},"        print(f\"[OK] Updated metric: {metric_key}\")\n",{"type":43,"tag":202,"props":2310,"children":2311},{"class":204,"line":392},[2312],{"type":43,"tag":202,"props":2313,"children":2314},{},[2315],{"type":49,"value":996},{"type":43,"tag":202,"props":2317,"children":2318},{"class":204,"line":400},[2319],{"type":43,"tag":202,"props":2320,"children":2321},{},[2322],{"type":49,"value":1924},{"type":43,"tag":202,"props":2324,"children":2325},{"class":204,"line":807},[2326],{"type":43,"tag":202,"props":2327,"children":2328},{},[2329],{"type":49,"value":2330},"        print(f\"[ERROR] Metric not found: {metric_key}\")\n",{"type":43,"tag":202,"props":2332,"children":2333},{"class":204,"line":816},[2334],{"type":43,"tag":202,"props":2335,"children":2336},{},[2337],{"type":49,"value":1023},{"type":43,"tag":202,"props":2339,"children":2340},{"class":204,"line":825},[2341],{"type":43,"tag":202,"props":2342,"children":2343},{},[2344],{"type":49,"value":1032},{"type":43,"tag":202,"props":2346,"children":2347},{"class":204,"line":834},[2348],{"type":43,"tag":202,"props":2349,"children":2350},{},[2351],{"type":49,"value":2352},"        print(f\"[ERROR] Failed to update metric: {response.status_code}\")\n",{"type":43,"tag":202,"props":2354,"children":2355},{"class":204,"line":842},[2356],{"type":43,"tag":202,"props":2357,"children":2358},{},[2359],{"type":49,"value":1050},{"type":43,"tag":202,"props":2361,"children":2362},{"class":204,"line":851},[2363],{"type":43,"tag":202,"props":2364,"children":2365},{},[2366],{"type":49,"value":1023},{"type":43,"tag":202,"props":2368,"children":2369},{"class":204,"line":860},[2370],{"type":43,"tag":202,"props":2371,"children":2372},{"emptyLinePlaceholder":236},[2373],{"type":49,"value":239},{"type":43,"tag":202,"props":2375,"children":2376},{"class":204,"line":869},[2377],{"type":43,"tag":202,"props":2378,"children":2379},{},[2380],{"type":49,"value":2381},"# Example: Update metric name and description\n",{"type":43,"tag":202,"props":2383,"children":2384},{"class":204,"line":878},[2385],{"type":43,"tag":202,"props":2386,"children":2387},{},[2388],{"type":49,"value":2389},"def rename_metric(project_key: str, metric_key: str, new_name: str, new_description: str = None):\n",{"type":43,"tag":202,"props":2391,"children":2392},{"class":204,"line":886},[2393],{"type":43,"tag":202,"props":2394,"children":2395},{},[2396],{"type":49,"value":2397},"    \"\"\"Rename a metric and optionally update description.\"\"\"\n",{"type":43,"tag":202,"props":2399,"children":2400},{"class":204,"line":895},[2401],{"type":43,"tag":202,"props":2402,"children":2403},{},[2404],{"type":49,"value":2405},"    updates = [\n",{"type":43,"tag":202,"props":2407,"children":2408},{"class":204,"line":904},[2409],{"type":43,"tag":202,"props":2410,"children":2411},{},[2412],{"type":49,"value":2413},"        {\"op\": \"replace\", \"path\": \"\u002Fname\", \"value\": new_name}\n",{"type":43,"tag":202,"props":2415,"children":2416},{"class":204,"line":912},[2417],{"type":43,"tag":202,"props":2418,"children":2419},{},[2420],{"type":49,"value":2421},"    ]\n",{"type":43,"tag":202,"props":2423,"children":2424},{"class":204,"line":921},[2425],{"type":43,"tag":202,"props":2426,"children":2427},{},[2428],{"type":49,"value":2429},"    if new_description:\n",{"type":43,"tag":202,"props":2431,"children":2432},{"class":204,"line":930},[2433],{"type":43,"tag":202,"props":2434,"children":2435},{},[2436],{"type":49,"value":2437},"        updates.append({\"op\": \"replace\", \"path\": \"\u002Fdescription\", \"value\": new_description})\n",{"type":43,"tag":202,"props":2439,"children":2440},{"class":204,"line":939},[2441],{"type":43,"tag":202,"props":2442,"children":2443},{"emptyLinePlaceholder":236},[2444],{"type":49,"value":239},{"type":43,"tag":202,"props":2446,"children":2447},{"class":204,"line":947},[2448],{"type":43,"tag":202,"props":2449,"children":2450},{},[2451],{"type":49,"value":2452},"    return update_metric(project_key, metric_key, updates)\n",{"type":43,"tag":58,"props":2454,"children":2456},{"id":2455},"_5-delete-metric-api",[2457],{"type":49,"value":2458},"5. Delete Metric (API)",{"type":43,"tag":191,"props":2460,"children":2462},{"className":193,"code":2461,"language":195,"meta":196,"style":196},"def delete_metric(project_key: str, metric_key: str):\n    \"\"\"Delete a metric from the project.\"\"\"\n    API_TOKEN = os.environ.get(\"LAUNCHDARKLY_API_TOKEN\")\n\n    url = f\"https:\u002F\u002Fapp.launchdarkly.com\u002Fapi\u002Fv2\u002Fmetrics\u002F{project_key}\u002F{metric_key}\"\n\n    headers = {\"Authorization\": API_TOKEN}\n\n    response = requests.delete(url, headers=headers)\n\n    if response.status_code == 204:\n        print(f\"[OK] Deleted metric: {metric_key}\")\n        return True\n    elif response.status_code == 404:\n        print(f\"[INFO] Metric not found: {metric_key}\")\n        return False\n    else:\n        print(f\"[ERROR] Failed to delete metric: {response.status_code}\")\n        return False\n",[2463],{"type":43,"tag":75,"props":2464,"children":2465},{"__ignoreMap":196},[2466,2474,2482,2489,2496,2503,2510,2517,2524,2532,2539,2547,2555,2563,2570,2577,2585,2592,2600],{"type":43,"tag":202,"props":2467,"children":2468},{"class":204,"line":205},[2469],{"type":43,"tag":202,"props":2470,"children":2471},{},[2472],{"type":49,"value":2473},"def delete_metric(project_key: str, metric_key: str):\n",{"type":43,"tag":202,"props":2475,"children":2476},{"class":204,"line":214},[2477],{"type":43,"tag":202,"props":2478,"children":2479},{},[2480],{"type":49,"value":2481},"    \"\"\"Delete a metric from the project.\"\"\"\n",{"type":43,"tag":202,"props":2483,"children":2484},{"class":204,"line":223},[2485],{"type":43,"tag":202,"props":2486,"children":2487},{},[2488],{"type":49,"value":750},{"type":43,"tag":202,"props":2490,"children":2491},{"class":204,"line":232},[2492],{"type":43,"tag":202,"props":2493,"children":2494},{"emptyLinePlaceholder":236},[2495],{"type":49,"value":239},{"type":43,"tag":202,"props":2497,"children":2498},{"class":204,"line":242},[2499],{"type":43,"tag":202,"props":2500,"children":2501},{},[2502],{"type":49,"value":1815},{"type":43,"tag":202,"props":2504,"children":2505},{"class":204,"line":24},[2506],{"type":43,"tag":202,"props":2507,"children":2508},{"emptyLinePlaceholder":236},[2509],{"type":49,"value":239},{"type":43,"tag":202,"props":2511,"children":2512},{"class":204,"line":259},[2513],{"type":43,"tag":202,"props":2514,"children":2515},{},[2516],{"type":49,"value":1830},{"type":43,"tag":202,"props":2518,"children":2519},{"class":204,"line":268},[2520],{"type":43,"tag":202,"props":2521,"children":2522},{"emptyLinePlaceholder":236},[2523],{"type":49,"value":239},{"type":43,"tag":202,"props":2525,"children":2526},{"class":204,"line":277},[2527],{"type":43,"tag":202,"props":2528,"children":2529},{},[2530],{"type":49,"value":2531},"    response = requests.delete(url, headers=headers)\n",{"type":43,"tag":202,"props":2533,"children":2534},{"class":204,"line":286},[2535],{"type":43,"tag":202,"props":2536,"children":2537},{"emptyLinePlaceholder":236},[2538],{"type":49,"value":239},{"type":43,"tag":202,"props":2540,"children":2541},{"class":204,"line":295},[2542],{"type":43,"tag":202,"props":2543,"children":2544},{},[2545],{"type":49,"value":2546},"    if response.status_code == 204:\n",{"type":43,"tag":202,"props":2548,"children":2549},{"class":204,"line":304},[2550],{"type":43,"tag":202,"props":2551,"children":2552},{},[2553],{"type":49,"value":2554},"        print(f\"[OK] Deleted metric: {metric_key}\")\n",{"type":43,"tag":202,"props":2556,"children":2557},{"class":204,"line":313},[2558],{"type":43,"tag":202,"props":2559,"children":2560},{},[2561],{"type":49,"value":2562},"        return True\n",{"type":43,"tag":202,"props":2564,"children":2565},{"class":204,"line":322},[2566],{"type":43,"tag":202,"props":2567,"children":2568},{},[2569],{"type":49,"value":1924},{"type":43,"tag":202,"props":2571,"children":2572},{"class":204,"line":331},[2573],{"type":43,"tag":202,"props":2574,"children":2575},{},[2576],{"type":49,"value":1932},{"type":43,"tag":202,"props":2578,"children":2579},{"class":204,"line":340},[2580],{"type":43,"tag":202,"props":2581,"children":2582},{},[2583],{"type":49,"value":2584},"        return False\n",{"type":43,"tag":202,"props":2586,"children":2587},{"class":204,"line":349},[2588],{"type":43,"tag":202,"props":2589,"children":2590},{},[2591],{"type":49,"value":1032},{"type":43,"tag":202,"props":2593,"children":2594},{"class":204,"line":357},[2595],{"type":43,"tag":202,"props":2596,"children":2597},{},[2598],{"type":49,"value":2599},"        print(f\"[ERROR] Failed to delete metric: {response.status_code}\")\n",{"type":43,"tag":202,"props":2601,"children":2602},{"class":204,"line":366},[2603],{"type":43,"tag":202,"props":2604,"children":2605},{},[2606],{"type":49,"value":2584},{"type":43,"tag":58,"props":2608,"children":2610},{"id":2609},"complete-workflow-example",[2611],{"type":49,"value":2612},"Complete Workflow Example",{"type":43,"tag":191,"props":2614,"children":2616},{"className":193,"code":2615,"language":195,"meta":196,"style":196},"import os\nimport requests\nfrom ldclient import Context\nfrom ldclient.config import Config\nimport ldclient\n\n# Setup\nAPI_TOKEN = os.environ.get(\"LAUNCHDARKLY_API_TOKEN\")\nSDK_KEY = os.environ.get(\"LAUNCHDARKLY_SDK_KEY\")\nPROJECT_KEY = \"support-ai\"\n\nldclient.set_config(Config(SDK_KEY))\nld_client = ldclient.get()\n\n# 1. Create metric\ncreate_metric(\n    PROJECT_KEY,\n    \"ai.task.completion\",\n    name=\"Agent Task Completion Rate\",\n    kind=\"custom\",\n    is_numeric=True,\n    description=\"Tracks successful agent task completions\"\n)\n\n# 2. Track events\ncontext = Context.builder(\"user-123\").build()\nld_client.track(\"ai.task.completion\", context, metric_value=1.0)\nld_client.track(\"ai.task.completion\", context, metric_value=1.0)\nld_client.track(\"ai.task.completion\", context, metric_value=0.0)  # failure\nld_client.flush()\n\n# 3. Get metric definition\nmetric = get_metric(PROJECT_KEY, \"ai.task.completion\")\n\n# 4. Update metric name\nrename_metric(PROJECT_KEY, \"ai.task.completion\", \"Agent Task Success Rate\")\n\n# 5. List all metrics\nlist_metrics(PROJECT_KEY)\n\n# 6. Delete metric (when no longer needed)\n# delete_metric(PROJECT_KEY, \"ai.task.completion\")\n",[2617],{"type":43,"tag":75,"props":2618,"children":2619},{"__ignoreMap":196},[2620,2627,2634,2641,2648,2655,2662,2670,2678,2686,2694,2701,2709,2716,2723,2731,2739,2747,2755,2763,2771,2779,2787,2795,2802,2810,2818,2826,2833,2841,2849,2856,2864,2872,2879,2887,2895,2902,2910,2918,2925,2933],{"type":43,"tag":202,"props":2621,"children":2622},{"class":204,"line":205},[2623],{"type":43,"tag":202,"props":2624,"children":2625},{},[2626],{"type":49,"value":211},{"type":43,"tag":202,"props":2628,"children":2629},{"class":204,"line":214},[2630],{"type":43,"tag":202,"props":2631,"children":2632},{},[2633],{"type":49,"value":632},{"type":43,"tag":202,"props":2635,"children":2636},{"class":204,"line":223},[2637],{"type":43,"tag":202,"props":2638,"children":2639},{},[2640],{"type":49,"value":1218},{"type":43,"tag":202,"props":2642,"children":2643},{"class":204,"line":232},[2644],{"type":43,"tag":202,"props":2645,"children":2646},{},[2647],{"type":49,"value":1226},{"type":43,"tag":202,"props":2649,"children":2650},{"class":204,"line":242},[2651],{"type":43,"tag":202,"props":2652,"children":2653},{},[2654],{"type":49,"value":1234},{"type":43,"tag":202,"props":2656,"children":2657},{"class":204,"line":24},[2658],{"type":43,"tag":202,"props":2659,"children":2660},{"emptyLinePlaceholder":236},[2661],{"type":49,"value":239},{"type":43,"tag":202,"props":2663,"children":2664},{"class":204,"line":259},[2665],{"type":43,"tag":202,"props":2666,"children":2667},{},[2668],{"type":49,"value":2669},"# Setup\n",{"type":43,"tag":202,"props":2671,"children":2672},{"class":204,"line":268},[2673],{"type":43,"tag":202,"props":2674,"children":2675},{},[2676],{"type":49,"value":2677},"API_TOKEN = os.environ.get(\"LAUNCHDARKLY_API_TOKEN\")\n",{"type":43,"tag":202,"props":2679,"children":2680},{"class":204,"line":277},[2681],{"type":43,"tag":202,"props":2682,"children":2683},{},[2684],{"type":49,"value":2685},"SDK_KEY = os.environ.get(\"LAUNCHDARKLY_SDK_KEY\")\n",{"type":43,"tag":202,"props":2687,"children":2688},{"class":204,"line":286},[2689],{"type":43,"tag":202,"props":2690,"children":2691},{},[2692],{"type":49,"value":2693},"PROJECT_KEY = \"support-ai\"\n",{"type":43,"tag":202,"props":2695,"children":2696},{"class":204,"line":295},[2697],{"type":43,"tag":202,"props":2698,"children":2699},{"emptyLinePlaceholder":236},[2700],{"type":49,"value":239},{"type":43,"tag":202,"props":2702,"children":2703},{"class":204,"line":304},[2704],{"type":43,"tag":202,"props":2705,"children":2706},{},[2707],{"type":49,"value":2708},"ldclient.set_config(Config(SDK_KEY))\n",{"type":43,"tag":202,"props":2710,"children":2711},{"class":204,"line":313},[2712],{"type":43,"tag":202,"props":2713,"children":2714},{},[2715],{"type":49,"value":1265},{"type":43,"tag":202,"props":2717,"children":2718},{"class":204,"line":322},[2719],{"type":43,"tag":202,"props":2720,"children":2721},{"emptyLinePlaceholder":236},[2722],{"type":49,"value":239},{"type":43,"tag":202,"props":2724,"children":2725},{"class":204,"line":331},[2726],{"type":43,"tag":202,"props":2727,"children":2728},{},[2729],{"type":49,"value":2730},"# 1. Create metric\n",{"type":43,"tag":202,"props":2732,"children":2733},{"class":204,"line":340},[2734],{"type":43,"tag":202,"props":2735,"children":2736},{},[2737],{"type":49,"value":2738},"create_metric(\n",{"type":43,"tag":202,"props":2740,"children":2741},{"class":204,"line":349},[2742],{"type":43,"tag":202,"props":2743,"children":2744},{},[2745],{"type":49,"value":2746},"    PROJECT_KEY,\n",{"type":43,"tag":202,"props":2748,"children":2749},{"class":204,"line":357},[2750],{"type":43,"tag":202,"props":2751,"children":2752},{},[2753],{"type":49,"value":2754},"    \"ai.task.completion\",\n",{"type":43,"tag":202,"props":2756,"children":2757},{"class":204,"line":366},[2758],{"type":43,"tag":202,"props":2759,"children":2760},{},[2761],{"type":49,"value":2762},"    name=\"Agent Task Completion Rate\",\n",{"type":43,"tag":202,"props":2764,"children":2765},{"class":204,"line":20},[2766],{"type":43,"tag":202,"props":2767,"children":2768},{},[2769],{"type":49,"value":2770},"    kind=\"custom\",\n",{"type":43,"tag":202,"props":2772,"children":2773},{"class":204,"line":383},[2774],{"type":43,"tag":202,"props":2775,"children":2776},{},[2777],{"type":49,"value":2778},"    is_numeric=True,\n",{"type":43,"tag":202,"props":2780,"children":2781},{"class":204,"line":392},[2782],{"type":43,"tag":202,"props":2783,"children":2784},{},[2785],{"type":49,"value":2786},"    description=\"Tracks successful agent task completions\"\n",{"type":43,"tag":202,"props":2788,"children":2789},{"class":204,"line":400},[2790],{"type":43,"tag":202,"props":2791,"children":2792},{},[2793],{"type":49,"value":2794},")\n",{"type":43,"tag":202,"props":2796,"children":2797},{"class":204,"line":807},[2798],{"type":43,"tag":202,"props":2799,"children":2800},{"emptyLinePlaceholder":236},[2801],{"type":49,"value":239},{"type":43,"tag":202,"props":2803,"children":2804},{"class":204,"line":816},[2805],{"type":43,"tag":202,"props":2806,"children":2807},{},[2808],{"type":49,"value":2809},"# 2. Track events\n",{"type":43,"tag":202,"props":2811,"children":2812},{"class":204,"line":825},[2813],{"type":43,"tag":202,"props":2814,"children":2815},{},[2816],{"type":49,"value":2817},"context = Context.builder(\"user-123\").build()\n",{"type":43,"tag":202,"props":2819,"children":2820},{"class":204,"line":834},[2821],{"type":43,"tag":202,"props":2822,"children":2823},{},[2824],{"type":49,"value":2825},"ld_client.track(\"ai.task.completion\", context, metric_value=1.0)\n",{"type":43,"tag":202,"props":2827,"children":2828},{"class":204,"line":842},[2829],{"type":43,"tag":202,"props":2830,"children":2831},{},[2832],{"type":49,"value":2825},{"type":43,"tag":202,"props":2834,"children":2835},{"class":204,"line":851},[2836],{"type":43,"tag":202,"props":2837,"children":2838},{},[2839],{"type":49,"value":2840},"ld_client.track(\"ai.task.completion\", context, metric_value=0.0)  # failure\n",{"type":43,"tag":202,"props":2842,"children":2843},{"class":204,"line":860},[2844],{"type":43,"tag":202,"props":2845,"children":2846},{},[2847],{"type":49,"value":2848},"ld_client.flush()\n",{"type":43,"tag":202,"props":2850,"children":2851},{"class":204,"line":869},[2852],{"type":43,"tag":202,"props":2853,"children":2854},{"emptyLinePlaceholder":236},[2855],{"type":49,"value":239},{"type":43,"tag":202,"props":2857,"children":2858},{"class":204,"line":878},[2859],{"type":43,"tag":202,"props":2860,"children":2861},{},[2862],{"type":49,"value":2863},"# 3. Get metric definition\n",{"type":43,"tag":202,"props":2865,"children":2866},{"class":204,"line":886},[2867],{"type":43,"tag":202,"props":2868,"children":2869},{},[2870],{"type":49,"value":2871},"metric = get_metric(PROJECT_KEY, \"ai.task.completion\")\n",{"type":43,"tag":202,"props":2873,"children":2874},{"class":204,"line":895},[2875],{"type":43,"tag":202,"props":2876,"children":2877},{"emptyLinePlaceholder":236},[2878],{"type":49,"value":239},{"type":43,"tag":202,"props":2880,"children":2881},{"class":204,"line":904},[2882],{"type":43,"tag":202,"props":2883,"children":2884},{},[2885],{"type":49,"value":2886},"# 4. Update metric name\n",{"type":43,"tag":202,"props":2888,"children":2889},{"class":204,"line":912},[2890],{"type":43,"tag":202,"props":2891,"children":2892},{},[2893],{"type":49,"value":2894},"rename_metric(PROJECT_KEY, \"ai.task.completion\", \"Agent Task Success Rate\")\n",{"type":43,"tag":202,"props":2896,"children":2897},{"class":204,"line":921},[2898],{"type":43,"tag":202,"props":2899,"children":2900},{"emptyLinePlaceholder":236},[2901],{"type":49,"value":239},{"type":43,"tag":202,"props":2903,"children":2904},{"class":204,"line":930},[2905],{"type":43,"tag":202,"props":2906,"children":2907},{},[2908],{"type":49,"value":2909},"# 5. List all metrics\n",{"type":43,"tag":202,"props":2911,"children":2912},{"class":204,"line":939},[2913],{"type":43,"tag":202,"props":2914,"children":2915},{},[2916],{"type":49,"value":2917},"list_metrics(PROJECT_KEY)\n",{"type":43,"tag":202,"props":2919,"children":2920},{"class":204,"line":947},[2921],{"type":43,"tag":202,"props":2922,"children":2923},{"emptyLinePlaceholder":236},[2924],{"type":49,"value":239},{"type":43,"tag":202,"props":2926,"children":2927},{"class":204,"line":955},[2928],{"type":43,"tag":202,"props":2929,"children":2930},{},[2931],{"type":49,"value":2932},"# 6. Delete metric (when no longer needed)\n",{"type":43,"tag":202,"props":2934,"children":2935},{"class":204,"line":964},[2936],{"type":43,"tag":202,"props":2937,"children":2938},{},[2939],{"type":49,"value":2940},"# delete_metric(PROJECT_KEY, \"ai.task.completion\")\n",{"type":43,"tag":58,"props":2942,"children":2944},{"id":2943},"session-metrics-tracker",[2945],{"type":49,"value":2946},"Session Metrics Tracker",{"type":43,"tag":191,"props":2948,"children":2950},{"className":193,"code":2949,"language":195,"meta":196,"style":196},"import time\nfrom ldclient import Context\n\nclass SessionMetricsTracker:\n    \"\"\"Track metrics across an entire user session.\"\"\"\n\n    def __init__(self, ld_client):\n        self.ld_client = ld_client\n        self.session_data = {}\n\n    def start_session(self, user_id: str, session_id: str):\n        \"\"\"Initialize session tracking.\"\"\"\n        self.session_data[session_id] = {\n            \"user_id\": user_id,\n            \"start_time\": time.time(),\n            \"interactions\": 0,\n            \"successful_tasks\": 0\n        }\n\n    def track_interaction(self, session_id: str, success: bool):\n        \"\"\"Track individual interaction within session.\"\"\"\n        if session_id not in self.session_data:\n            return\n        session = self.session_data[session_id]\n        session[\"interactions\"] += 1\n        if success:\n            session[\"successful_tasks\"] += 1\n\n    def end_session(self, session_id: str):\n        \"\"\"Finalize and track session metrics.\"\"\"\n        if session_id not in self.session_data:\n            return None\n\n        session = self.session_data[session_id]\n        duration = time.time() - session[\"start_time\"]\n\n        context = Context.builder(session[\"user_id\"]).build()\n\n        # Track session duration\n        self.ld_client.track(\n            \"session.duration\",\n            context,\n            data={\"interactions\": session[\"interactions\"]},\n            metric_value=duration\n        )\n\n        # Track session success rate\n        if session[\"interactions\"] > 0:\n            success_rate = session[\"successful_tasks\"] \u002F session[\"interactions\"]\n            self.ld_client.track(\n                \"session.success_rate\",\n                context,\n                metric_value=success_rate * 100\n            )\n\n        result = dict(session)\n        result[\"duration\"] = duration\n        del self.session_data[session_id]\n        return result\n",[2951],{"type":43,"tag":75,"props":2952,"children":2953},{"__ignoreMap":196},[2954,2962,2969,2976,2984,2992,2999,3007,3015,3023,3030,3038,3046,3054,3062,3070,3078,3086,3094,3101,3109,3117,3125,3133,3141,3149,3157,3165,3172,3180,3188,3195,3203,3210,3217,3225,3232,3240,3247,3255,3263,3271,3278,3286,3294,3301,3308,3316,3324,3332,3340,3348,3356,3365,3374,3382,3391,3400,3409],{"type":43,"tag":202,"props":2955,"children":2956},{"class":204,"line":205},[2957],{"type":43,"tag":202,"props":2958,"children":2959},{},[2960],{"type":49,"value":2961},"import time\n",{"type":43,"tag":202,"props":2963,"children":2964},{"class":204,"line":214},[2965],{"type":43,"tag":202,"props":2966,"children":2967},{},[2968],{"type":49,"value":1218},{"type":43,"tag":202,"props":2970,"children":2971},{"class":204,"line":223},[2972],{"type":43,"tag":202,"props":2973,"children":2974},{"emptyLinePlaceholder":236},[2975],{"type":49,"value":239},{"type":43,"tag":202,"props":2977,"children":2978},{"class":204,"line":232},[2979],{"type":43,"tag":202,"props":2980,"children":2981},{},[2982],{"type":49,"value":2983},"class SessionMetricsTracker:\n",{"type":43,"tag":202,"props":2985,"children":2986},{"class":204,"line":242},[2987],{"type":43,"tag":202,"props":2988,"children":2989},{},[2990],{"type":49,"value":2991},"    \"\"\"Track metrics across an entire user session.\"\"\"\n",{"type":43,"tag":202,"props":2993,"children":2994},{"class":204,"line":24},[2995],{"type":43,"tag":202,"props":2996,"children":2997},{"emptyLinePlaceholder":236},[2998],{"type":49,"value":239},{"type":43,"tag":202,"props":3000,"children":3001},{"class":204,"line":259},[3002],{"type":43,"tag":202,"props":3003,"children":3004},{},[3005],{"type":49,"value":3006},"    def __init__(self, ld_client):\n",{"type":43,"tag":202,"props":3008,"children":3009},{"class":204,"line":268},[3010],{"type":43,"tag":202,"props":3011,"children":3012},{},[3013],{"type":49,"value":3014},"        self.ld_client = ld_client\n",{"type":43,"tag":202,"props":3016,"children":3017},{"class":204,"line":277},[3018],{"type":43,"tag":202,"props":3019,"children":3020},{},[3021],{"type":49,"value":3022},"        self.session_data = {}\n",{"type":43,"tag":202,"props":3024,"children":3025},{"class":204,"line":286},[3026],{"type":43,"tag":202,"props":3027,"children":3028},{"emptyLinePlaceholder":236},[3029],{"type":49,"value":239},{"type":43,"tag":202,"props":3031,"children":3032},{"class":204,"line":295},[3033],{"type":43,"tag":202,"props":3034,"children":3035},{},[3036],{"type":49,"value":3037},"    def start_session(self, user_id: str, session_id: str):\n",{"type":43,"tag":202,"props":3039,"children":3040},{"class":204,"line":304},[3041],{"type":43,"tag":202,"props":3042,"children":3043},{},[3044],{"type":49,"value":3045},"        \"\"\"Initialize session tracking.\"\"\"\n",{"type":43,"tag":202,"props":3047,"children":3048},{"class":204,"line":313},[3049],{"type":43,"tag":202,"props":3050,"children":3051},{},[3052],{"type":49,"value":3053},"        self.session_data[session_id] = {\n",{"type":43,"tag":202,"props":3055,"children":3056},{"class":204,"line":322},[3057],{"type":43,"tag":202,"props":3058,"children":3059},{},[3060],{"type":49,"value":3061},"            \"user_id\": user_id,\n",{"type":43,"tag":202,"props":3063,"children":3064},{"class":204,"line":331},[3065],{"type":43,"tag":202,"props":3066,"children":3067},{},[3068],{"type":49,"value":3069},"            \"start_time\": time.time(),\n",{"type":43,"tag":202,"props":3071,"children":3072},{"class":204,"line":340},[3073],{"type":43,"tag":202,"props":3074,"children":3075},{},[3076],{"type":49,"value":3077},"            \"interactions\": 0,\n",{"type":43,"tag":202,"props":3079,"children":3080},{"class":204,"line":349},[3081],{"type":43,"tag":202,"props":3082,"children":3083},{},[3084],{"type":49,"value":3085},"            \"successful_tasks\": 0\n",{"type":43,"tag":202,"props":3087,"children":3088},{"class":204,"line":357},[3089],{"type":43,"tag":202,"props":3090,"children":3091},{},[3092],{"type":49,"value":3093},"        }\n",{"type":43,"tag":202,"props":3095,"children":3096},{"class":204,"line":366},[3097],{"type":43,"tag":202,"props":3098,"children":3099},{"emptyLinePlaceholder":236},[3100],{"type":49,"value":239},{"type":43,"tag":202,"props":3102,"children":3103},{"class":204,"line":20},[3104],{"type":43,"tag":202,"props":3105,"children":3106},{},[3107],{"type":49,"value":3108},"    def track_interaction(self, session_id: str, success: bool):\n",{"type":43,"tag":202,"props":3110,"children":3111},{"class":204,"line":383},[3112],{"type":43,"tag":202,"props":3113,"children":3114},{},[3115],{"type":49,"value":3116},"        \"\"\"Track individual interaction within session.\"\"\"\n",{"type":43,"tag":202,"props":3118,"children":3119},{"class":204,"line":392},[3120],{"type":43,"tag":202,"props":3121,"children":3122},{},[3123],{"type":49,"value":3124},"        if session_id not in self.session_data:\n",{"type":43,"tag":202,"props":3126,"children":3127},{"class":204,"line":400},[3128],{"type":43,"tag":202,"props":3129,"children":3130},{},[3131],{"type":49,"value":3132},"            return\n",{"type":43,"tag":202,"props":3134,"children":3135},{"class":204,"line":807},[3136],{"type":43,"tag":202,"props":3137,"children":3138},{},[3139],{"type":49,"value":3140},"        session = self.session_data[session_id]\n",{"type":43,"tag":202,"props":3142,"children":3143},{"class":204,"line":816},[3144],{"type":43,"tag":202,"props":3145,"children":3146},{},[3147],{"type":49,"value":3148},"        session[\"interactions\"] += 1\n",{"type":43,"tag":202,"props":3150,"children":3151},{"class":204,"line":825},[3152],{"type":43,"tag":202,"props":3153,"children":3154},{},[3155],{"type":49,"value":3156},"        if success:\n",{"type":43,"tag":202,"props":3158,"children":3159},{"class":204,"line":834},[3160],{"type":43,"tag":202,"props":3161,"children":3162},{},[3163],{"type":49,"value":3164},"            session[\"successful_tasks\"] += 1\n",{"type":43,"tag":202,"props":3166,"children":3167},{"class":204,"line":842},[3168],{"type":43,"tag":202,"props":3169,"children":3170},{"emptyLinePlaceholder":236},[3171],{"type":49,"value":239},{"type":43,"tag":202,"props":3173,"children":3174},{"class":204,"line":851},[3175],{"type":43,"tag":202,"props":3176,"children":3177},{},[3178],{"type":49,"value":3179},"    def end_session(self, session_id: str):\n",{"type":43,"tag":202,"props":3181,"children":3182},{"class":204,"line":860},[3183],{"type":43,"tag":202,"props":3184,"children":3185},{},[3186],{"type":49,"value":3187},"        \"\"\"Finalize and track session metrics.\"\"\"\n",{"type":43,"tag":202,"props":3189,"children":3190},{"class":204,"line":869},[3191],{"type":43,"tag":202,"props":3192,"children":3193},{},[3194],{"type":49,"value":3124},{"type":43,"tag":202,"props":3196,"children":3197},{"class":204,"line":878},[3198],{"type":43,"tag":202,"props":3199,"children":3200},{},[3201],{"type":49,"value":3202},"            return None\n",{"type":43,"tag":202,"props":3204,"children":3205},{"class":204,"line":886},[3206],{"type":43,"tag":202,"props":3207,"children":3208},{"emptyLinePlaceholder":236},[3209],{"type":49,"value":239},{"type":43,"tag":202,"props":3211,"children":3212},{"class":204,"line":895},[3213],{"type":43,"tag":202,"props":3214,"children":3215},{},[3216],{"type":49,"value":3140},{"type":43,"tag":202,"props":3218,"children":3219},{"class":204,"line":904},[3220],{"type":43,"tag":202,"props":3221,"children":3222},{},[3223],{"type":49,"value":3224},"        duration = time.time() - session[\"start_time\"]\n",{"type":43,"tag":202,"props":3226,"children":3227},{"class":204,"line":912},[3228],{"type":43,"tag":202,"props":3229,"children":3230},{"emptyLinePlaceholder":236},[3231],{"type":49,"value":239},{"type":43,"tag":202,"props":3233,"children":3234},{"class":204,"line":921},[3235],{"type":43,"tag":202,"props":3236,"children":3237},{},[3238],{"type":49,"value":3239},"        context = Context.builder(session[\"user_id\"]).build()\n",{"type":43,"tag":202,"props":3241,"children":3242},{"class":204,"line":930},[3243],{"type":43,"tag":202,"props":3244,"children":3245},{"emptyLinePlaceholder":236},[3246],{"type":49,"value":239},{"type":43,"tag":202,"props":3248,"children":3249},{"class":204,"line":939},[3250],{"type":43,"tag":202,"props":3251,"children":3252},{},[3253],{"type":49,"value":3254},"        # Track session duration\n",{"type":43,"tag":202,"props":3256,"children":3257},{"class":204,"line":947},[3258],{"type":43,"tag":202,"props":3259,"children":3260},{},[3261],{"type":49,"value":3262},"        self.ld_client.track(\n",{"type":43,"tag":202,"props":3264,"children":3265},{"class":204,"line":955},[3266],{"type":43,"tag":202,"props":3267,"children":3268},{},[3269],{"type":49,"value":3270},"            \"session.duration\",\n",{"type":43,"tag":202,"props":3272,"children":3273},{"class":204,"line":964},[3274],{"type":43,"tag":202,"props":3275,"children":3276},{},[3277],{"type":49,"value":1651},{"type":43,"tag":202,"props":3279,"children":3280},{"class":204,"line":972},[3281],{"type":43,"tag":202,"props":3282,"children":3283},{},[3284],{"type":49,"value":3285},"            data={\"interactions\": session[\"interactions\"]},\n",{"type":43,"tag":202,"props":3287,"children":3288},{"class":204,"line":981},[3289],{"type":43,"tag":202,"props":3290,"children":3291},{},[3292],{"type":49,"value":3293},"            metric_value=duration\n",{"type":43,"tag":202,"props":3295,"children":3296},{"class":204,"line":990},[3297],{"type":43,"tag":202,"props":3298,"children":3299},{},[3300],{"type":49,"value":1667},{"type":43,"tag":202,"props":3302,"children":3303},{"class":204,"line":999},[3304],{"type":43,"tag":202,"props":3305,"children":3306},{"emptyLinePlaceholder":236},[3307],{"type":49,"value":239},{"type":43,"tag":202,"props":3309,"children":3310},{"class":204,"line":1008},[3311],{"type":43,"tag":202,"props":3312,"children":3313},{},[3314],{"type":49,"value":3315},"        # Track session success rate\n",{"type":43,"tag":202,"props":3317,"children":3318},{"class":204,"line":1017},[3319],{"type":43,"tag":202,"props":3320,"children":3321},{},[3322],{"type":49,"value":3323},"        if session[\"interactions\"] > 0:\n",{"type":43,"tag":202,"props":3325,"children":3326},{"class":204,"line":1026},[3327],{"type":43,"tag":202,"props":3328,"children":3329},{},[3330],{"type":49,"value":3331},"            success_rate = session[\"successful_tasks\"] \u002F session[\"interactions\"]\n",{"type":43,"tag":202,"props":3333,"children":3334},{"class":204,"line":1035},[3335],{"type":43,"tag":202,"props":3336,"children":3337},{},[3338],{"type":49,"value":3339},"            self.ld_client.track(\n",{"type":43,"tag":202,"props":3341,"children":3342},{"class":204,"line":1044},[3343],{"type":43,"tag":202,"props":3344,"children":3345},{},[3346],{"type":49,"value":3347},"                \"session.success_rate\",\n",{"type":43,"tag":202,"props":3349,"children":3350},{"class":204,"line":1053},[3351],{"type":43,"tag":202,"props":3352,"children":3353},{},[3354],{"type":49,"value":3355},"                context,\n",{"type":43,"tag":202,"props":3357,"children":3359},{"class":204,"line":3358},53,[3360],{"type":43,"tag":202,"props":3361,"children":3362},{},[3363],{"type":49,"value":3364},"                metric_value=success_rate * 100\n",{"type":43,"tag":202,"props":3366,"children":3368},{"class":204,"line":3367},54,[3369],{"type":43,"tag":202,"props":3370,"children":3371},{},[3372],{"type":49,"value":3373},"            )\n",{"type":43,"tag":202,"props":3375,"children":3377},{"class":204,"line":3376},55,[3378],{"type":43,"tag":202,"props":3379,"children":3380},{"emptyLinePlaceholder":236},[3381],{"type":49,"value":239},{"type":43,"tag":202,"props":3383,"children":3385},{"class":204,"line":3384},56,[3386],{"type":43,"tag":202,"props":3387,"children":3388},{},[3389],{"type":49,"value":3390},"        result = dict(session)\n",{"type":43,"tag":202,"props":3392,"children":3394},{"class":204,"line":3393},57,[3395],{"type":43,"tag":202,"props":3396,"children":3397},{},[3398],{"type":49,"value":3399},"        result[\"duration\"] = duration\n",{"type":43,"tag":202,"props":3401,"children":3403},{"class":204,"line":3402},58,[3404],{"type":43,"tag":202,"props":3405,"children":3406},{},[3407],{"type":49,"value":3408},"        del self.session_data[session_id]\n",{"type":43,"tag":202,"props":3410,"children":3412},{"class":204,"line":3411},59,[3413],{"type":43,"tag":202,"props":3414,"children":3415},{},[3416],{"type":49,"value":3417},"        return result\n",{"type":43,"tag":58,"props":3419,"children":3421},{"id":3420},"naming-conventions",[3422],{"type":49,"value":3423},"Naming Conventions",{"type":43,"tag":191,"props":3425,"children":3427},{"className":193,"code":3426,"language":195,"meta":196,"style":196},"# Use dot notation for hierarchy\n\"quality.accuracy\"\n\"quality.relevance\"\n\"user.satisfaction\"\n\"user.engagement\"\n\"revenue.conversion\"\n\"task.success_rate\"\n\"session.duration\"\n\"ai.task.completion\"\n\"ai.recommendation.conversion\"\n",[3428],{"type":43,"tag":75,"props":3429,"children":3430},{"__ignoreMap":196},[3431,3439,3447,3455,3463,3471,3479,3487,3495,3503],{"type":43,"tag":202,"props":3432,"children":3433},{"class":204,"line":205},[3434],{"type":43,"tag":202,"props":3435,"children":3436},{},[3437],{"type":49,"value":3438},"# Use dot notation for hierarchy\n",{"type":43,"tag":202,"props":3440,"children":3441},{"class":204,"line":214},[3442],{"type":43,"tag":202,"props":3443,"children":3444},{},[3445],{"type":49,"value":3446},"\"quality.accuracy\"\n",{"type":43,"tag":202,"props":3448,"children":3449},{"class":204,"line":223},[3450],{"type":43,"tag":202,"props":3451,"children":3452},{},[3453],{"type":49,"value":3454},"\"quality.relevance\"\n",{"type":43,"tag":202,"props":3456,"children":3457},{"class":204,"line":232},[3458],{"type":43,"tag":202,"props":3459,"children":3460},{},[3461],{"type":49,"value":3462},"\"user.satisfaction\"\n",{"type":43,"tag":202,"props":3464,"children":3465},{"class":204,"line":242},[3466],{"type":43,"tag":202,"props":3467,"children":3468},{},[3469],{"type":49,"value":3470},"\"user.engagement\"\n",{"type":43,"tag":202,"props":3472,"children":3473},{"class":204,"line":24},[3474],{"type":43,"tag":202,"props":3475,"children":3476},{},[3477],{"type":49,"value":3478},"\"revenue.conversion\"\n",{"type":43,"tag":202,"props":3480,"children":3481},{"class":204,"line":259},[3482],{"type":43,"tag":202,"props":3483,"children":3484},{},[3485],{"type":49,"value":3486},"\"task.success_rate\"\n",{"type":43,"tag":202,"props":3488,"children":3489},{"class":204,"line":268},[3490],{"type":43,"tag":202,"props":3491,"children":3492},{},[3493],{"type":49,"value":3494},"\"session.duration\"\n",{"type":43,"tag":202,"props":3496,"children":3497},{"class":204,"line":277},[3498],{"type":43,"tag":202,"props":3499,"children":3500},{},[3501],{"type":49,"value":3502},"\"ai.task.completion\"\n",{"type":43,"tag":202,"props":3504,"children":3505},{"class":204,"line":286},[3506],{"type":43,"tag":202,"props":3507,"children":3508},{},[3509],{"type":49,"value":3510},"\"ai.recommendation.conversion\"\n",{"type":43,"tag":58,"props":3512,"children":3514},{"id":3513},"best-practices",[3515],{"type":49,"value":3516},"Best Practices",{"type":43,"tag":120,"props":3518,"children":3519},{},[3520,3530,3548,3572,3598],{"type":43,"tag":69,"props":3521,"children":3522},{},[3523,3528],{"type":43,"tag":127,"props":3524,"children":3525},{},[3526],{"type":49,"value":3527},"Create Before Track",{"type":49,"value":3529}," - Metric must exist before tracking events",{"type":43,"tag":69,"props":3531,"children":3532},{},[3533,3538,3540,3546],{"type":43,"tag":127,"props":3534,"children":3535},{},[3536],{"type":49,"value":3537},"Use Numeric Metrics",{"type":49,"value":3539}," - Set ",{"type":43,"tag":75,"props":3541,"children":3543},{"className":3542},[],[3544],{"type":49,"value":3545},"isNumeric=True",{"type":49,"value":3547}," for aggregation",{"type":43,"tag":69,"props":3549,"children":3550},{},[3551,3556,3558,3564,3566],{"type":43,"tag":127,"props":3552,"children":3553},{},[3554],{"type":49,"value":3555},"Consistent Keys",{"type":49,"value":3557}," - Use same key in ",{"type":43,"tag":75,"props":3559,"children":3561},{"className":3560},[],[3562],{"type":49,"value":3563},"create_metric()",{"type":49,"value":3565}," and ",{"type":43,"tag":75,"props":3567,"children":3569},{"className":3568},[],[3570],{"type":49,"value":3571},"ld_client.track()",{"type":43,"tag":69,"props":3573,"children":3574},{},[3575,3580,3582,3588,3590,3596],{"type":43,"tag":127,"props":3576,"children":3577},{},[3578],{"type":49,"value":3579},"Always flush before close",{"type":49,"value":3581}," - Call ",{"type":43,"tag":75,"props":3583,"children":3585},{"className":3584},[],[3586],{"type":49,"value":3587},"ld_client.flush()",{"type":49,"value":3589}," (await in Node) before ",{"type":43,"tag":75,"props":3591,"children":3593},{"className":3592},[],[3594],{"type":49,"value":3595},"close()",{"type":49,"value":3597},". Trailing events are at risk of being lost otherwise, in short-lived scripts and long-running services alike. This is not a serverless-only rule; it applies to any process that exits.",{"type":43,"tag":69,"props":3599,"children":3600},{},[3601,3606],{"type":43,"tag":127,"props":3602,"children":3603},{},[3604],{"type":49,"value":3605},"Rate Limit",{"type":49,"value":3607}," - Don't track on every keystroke",{"type":43,"tag":58,"props":3609,"children":3611},{"id":3610},"viewing-metrics",[3612],{"type":49,"value":3613},"Viewing Metrics",{"type":43,"tag":52,"props":3615,"children":3616},{},[3617],{"type":49,"value":3618},"Custom metrics appear in:",{"type":43,"tag":65,"props":3620,"children":3621},{},[3622,3631,3641],{"type":43,"tag":69,"props":3623,"children":3624},{},[3625,3629],{"type":43,"tag":127,"props":3626,"children":3627},{},[3628],{"type":49,"value":18},{"type":49,"value":3630}," page in LaunchDarkly UI",{"type":43,"tag":69,"props":3632,"children":3633},{},[3634,3639],{"type":43,"tag":127,"props":3635,"children":3636},{},[3637],{"type":49,"value":3638},"Monitoring tab",{"type":49,"value":3640}," of your config",{"type":43,"tag":69,"props":3642,"children":3643},{},[3644,3646,3652,3654],{"type":49,"value":3645},"Via API using ",{"type":43,"tag":75,"props":3647,"children":3649},{"className":3648},[],[3650],{"type":49,"value":3651},"get_metric()",{"type":49,"value":3653}," or ",{"type":43,"tag":75,"props":3655,"children":3657},{"className":3656},[],[3658],{"type":49,"value":3659},"list_metrics()",{"type":43,"tag":58,"props":3661,"children":3663},{"id":3662},"related-skills",[3664],{"type":49,"value":3665},"Related Skills",{"type":43,"tag":65,"props":3667,"children":3668},{},[3669,3679,3689],{"type":43,"tag":69,"props":3670,"children":3671},{},[3672,3677],{"type":43,"tag":75,"props":3673,"children":3675},{"className":3674},[],[3676],{"type":49,"value":80},{"type":49,"value":3678}," - SDK setup",{"type":43,"tag":69,"props":3680,"children":3681},{},[3682,3687],{"type":43,"tag":75,"props":3683,"children":3685},{"className":3684},[],[3686],{"type":49,"value":106},{"type":49,"value":3688}," - Built-in agent metrics (tokens, duration, cost)",{"type":43,"tag":69,"props":3690,"children":3691},{},[3692,3698],{"type":43,"tag":75,"props":3693,"children":3695},{"className":3694},[],[3696],{"type":49,"value":3697},"online-evals",{"type":49,"value":3699}," - Quality metrics via judges",{"type":43,"tag":58,"props":3701,"children":3703},{"id":3702},"references",[3704],{"type":49,"value":3705},"References",{"type":43,"tag":65,"props":3707,"children":3708},{},[3709,3721,3731],{"type":43,"tag":69,"props":3710,"children":3711},{},[3712],{"type":43,"tag":3713,"props":3714,"children":3718},"a",{"href":3715,"rel":3716},"https:\u002F\u002Fapidocs.launchdarkly.com\u002Ftag\u002FMetrics",[3717],"nofollow",[3719],{"type":49,"value":3720},"Metrics API Documentation",{"type":43,"tag":69,"props":3722,"children":3723},{},[3724],{"type":43,"tag":3713,"props":3725,"children":3728},{"href":3726,"rel":3727},"https:\u002F\u002Fdocs.launchdarkly.com\u002Fsdk\u002Ffeatures\u002Fevents",[3717],[3729],{"type":49,"value":3730},"Custom Events Documentation",{"type":43,"tag":69,"props":3732,"children":3733},{},[3734],{"type":43,"tag":3713,"props":3735,"children":3738},{"href":3736,"rel":3737},"https:\u002F\u002Flaunchdarkly-python-sdk.readthedocs.io\u002F",[3717],[3739],{"type":49,"value":3740},"Python SDK track() Reference",{"type":43,"tag":3742,"props":3743,"children":3744},"style",{},[3745],{"type":49,"value":3746},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3748,"total":1026},[3749,3766,3775,3785,3796,3808,3816,3830,3841,3850,3860,3869],{"slug":3750,"name":3750,"fn":3751,"description":3752,"org":3753,"tags":3754,"stars":20,"repoUrl":21,"updatedAt":3765},"agent-graphs","create and manage agent graphs","Create and manage agent graphs — directed graphs of configs connected by edges with handoff logic. Use when building multi-agent workflows where configs route to each other.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3755,3758,3761,3762],{"name":3756,"slug":3757,"type":15},"Agents","agents",{"name":3759,"slug":3760,"type":15},"Architecture","architecture",{"name":9,"slug":8,"type":15},{"name":3763,"slug":3764,"type":15},"Multi-Agent","multi-agent","2026-07-28T05:33:33.709407",{"slug":3767,"name":3767,"fn":3768,"description":3769,"org":3770,"tags":3771,"stars":20,"repoUrl":21,"updatedAt":3774},"aiconfig-agent-graphs","manage agent graphs","DEPRECATED redirect — this skill was renamed to agent-graphs. Do not use this skill; invoke agent-graphs instead. Kept only so old references to aiconfig-agent-graphs still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3772,3773],{"name":3756,"slug":3757,"type":15},{"name":3759,"slug":3760,"type":15},"2026-05-22T06:55:56.527064",{"slug":3776,"name":3776,"fn":3777,"description":3778,"org":3779,"tags":3780,"stars":20,"repoUrl":21,"updatedAt":3784},"aiconfig-ai-metrics","manage built-in AI metrics","DEPRECATED redirect — this skill was renamed to built-in-metrics. Do not use this skill; invoke built-in-metrics instead. Kept only so old references to aiconfig-ai-metrics still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3781,3782,3783],{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"2026-05-22T06:55:53.858749",{"slug":3786,"name":3786,"fn":3787,"description":3788,"org":3789,"tags":3790,"stars":20,"repoUrl":21,"updatedAt":3795},"aiconfig-create","redirect to configs-create skill","DEPRECATED redirect — this skill was renamed to configs-create. Do not use this skill; invoke configs-create instead. Kept only so old references to aiconfig-create still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3791,3792],{"name":9,"slug":8,"type":15},{"name":3793,"slug":3794,"type":15},"Reference","reference","2026-05-22T06:55:41.790591",{"slug":3797,"name":3797,"fn":3798,"description":3799,"org":3800,"tags":3801,"stars":20,"repoUrl":21,"updatedAt":3807},"aiconfig-custom-metrics","configure custom metrics in LaunchDarkly","DEPRECATED redirect — this skill was renamed to custom-metrics. Do not use this skill; invoke custom-metrics instead. Kept only so old references to aiconfig-custom-metrics still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3802,3803,3806],{"name":13,"slug":14,"type":15},{"name":3804,"slug":3805,"type":15},"Feature Flags","feature-flags",{"name":9,"slug":8,"type":15},"2026-05-22T06:55:57.84851",{"slug":3809,"name":3809,"fn":3810,"description":3811,"org":3812,"tags":3813,"stars":20,"repoUrl":21,"updatedAt":3815},"aiconfig-migrate","redirect to migrate skill","DEPRECATED redirect — this skill was renamed to migrate. Do not use this skill; invoke migrate instead. Kept only so old references to aiconfig-migrate still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3814],{"name":3793,"slug":3794,"type":15},"2026-05-22T06:55:44.464733",{"slug":3817,"name":3817,"fn":3818,"description":3819,"org":3820,"tags":3821,"stars":20,"repoUrl":21,"updatedAt":3829},"aiconfig-online-evals","run online evaluations","DEPRECATED redirect — this skill was renamed to online-evals. Do not use this skill; invoke online-evals instead. Kept only so old references to aiconfig-online-evals still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3822,3825,3826],{"name":3823,"slug":3824,"type":15},"Evals","evals",{"name":9,"slug":8,"type":15},{"name":3827,"slug":3828,"type":15},"Testing","testing","2026-05-22T06:55:55.179617",{"slug":3831,"name":3831,"fn":3832,"description":3833,"org":3834,"tags":3835,"stars":20,"repoUrl":21,"updatedAt":3840},"aiconfig-projects","manage AI configuration projects","DEPRECATED redirect — this skill was renamed to projects. Do not use this skill; invoke projects instead. Kept only so old references to aiconfig-projects still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3836,3839],{"name":3837,"slug":3838,"type":15},"Configuration","configuration",{"name":9,"slug":8,"type":15},"2026-05-22T06:55:48.522229",{"slug":3842,"name":3842,"fn":3843,"description":3844,"org":3845,"tags":3846,"stars":20,"repoUrl":21,"updatedAt":3849},"aiconfig-snippets","manage AI configuration snippets","DEPRECATED redirect — this skill was renamed to snippets. Do not use this skill; invoke snippets instead. Kept only so old references to aiconfig-snippets still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3847,3848],{"name":3837,"slug":3838,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:47.16557",{"slug":3851,"name":3851,"fn":3852,"description":3853,"org":3854,"tags":3855,"stars":20,"repoUrl":21,"updatedAt":3859},"aiconfig-targeting","configure LaunchDarkly targeting rules","DEPRECATED redirect — this skill was renamed to configs-targeting. Do not use this skill; invoke configs-targeting instead. Kept only so old references to aiconfig-targeting still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3856,3857,3858],{"name":3837,"slug":3838,"type":15},{"name":3804,"slug":3805,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:49.845445",{"slug":3861,"name":3861,"fn":3862,"description":3863,"org":3864,"tags":3865,"stars":20,"repoUrl":21,"updatedAt":3868},"aiconfig-tools","redirect to tools skill","DEPRECATED redirect — this skill was renamed to tools. Do not use this skill; invoke tools instead. Kept only so old references to aiconfig-tools still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3866,3867],{"name":9,"slug":8,"type":15},{"name":3793,"slug":3794,"type":15},"2026-05-22T06:55:39.13373",{"slug":3870,"name":3870,"fn":3871,"description":3872,"org":3873,"tags":3874,"stars":20,"repoUrl":21,"updatedAt":3877},"aiconfig-update","redirect to configs-update skill","DEPRECATED redirect — this skill was renamed to configs-update. Do not use this skill; invoke configs-update instead. Kept only so old references to aiconfig-update still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3875,3876],{"name":9,"slug":8,"type":15},{"name":3793,"slug":3794,"type":15},"2026-05-22T06:55:40.464884",{"items":3879,"total":1026},[3880,3887,3892,3898,3903,3909,3913],{"slug":3750,"name":3750,"fn":3751,"description":3752,"org":3881,"tags":3882,"stars":20,"repoUrl":21,"updatedAt":3765},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3883,3884,3885,3886],{"name":3756,"slug":3757,"type":15},{"name":3759,"slug":3760,"type":15},{"name":9,"slug":8,"type":15},{"name":3763,"slug":3764,"type":15},{"slug":3767,"name":3767,"fn":3768,"description":3769,"org":3888,"tags":3889,"stars":20,"repoUrl":21,"updatedAt":3774},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3890,3891],{"name":3756,"slug":3757,"type":15},{"name":3759,"slug":3760,"type":15},{"slug":3776,"name":3776,"fn":3777,"description":3778,"org":3893,"tags":3894,"stars":20,"repoUrl":21,"updatedAt":3784},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3895,3896,3897],{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},{"slug":3786,"name":3786,"fn":3787,"description":3788,"org":3899,"tags":3900,"stars":20,"repoUrl":21,"updatedAt":3795},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3901,3902],{"name":9,"slug":8,"type":15},{"name":3793,"slug":3794,"type":15},{"slug":3797,"name":3797,"fn":3798,"description":3799,"org":3904,"tags":3905,"stars":20,"repoUrl":21,"updatedAt":3807},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3906,3907,3908],{"name":13,"slug":14,"type":15},{"name":3804,"slug":3805,"type":15},{"name":9,"slug":8,"type":15},{"slug":3809,"name":3809,"fn":3810,"description":3811,"org":3910,"tags":3911,"stars":20,"repoUrl":21,"updatedAt":3815},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3912],{"name":3793,"slug":3794,"type":15},{"slug":3817,"name":3817,"fn":3818,"description":3819,"org":3914,"tags":3915,"stars":20,"repoUrl":21,"updatedAt":3829},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3916,3917,3918],{"name":3823,"slug":3824,"type":15},{"name":9,"slug":8,"type":15},{"name":3827,"slug":3828,"type":15}]