feat(pointfive): add pointfive to the dashboard logging integrations

This commit is contained in:
Yinon Kahta 2026-08-27 13:05:58 +03:00
parent 34186ab1d7
commit d9a0ea2a6e
4 changed files with 80 additions and 0 deletions

View file

@ -378,6 +378,27 @@
},
"description": "OpenTelemetry Logging Integration"
},
{
"id": "pointfive",
"displayName": "PointFive",
"logo": "pointfive.png",
"supports_key_team_logging": false,
"dynamic_params": {
"POINTFIVE_API_KEY": {
"type": "password",
"ui_name": "API Key",
"description": "PointFive API key, used to request an upload url for each batch of logs",
"required": true
},
"POINTFIVE_API_URL": {
"type": "text",
"ui_name": "API URL",
"description": "PointFive API endpoint. Leave blank to use https://api.pointfive.co/api/v1/ingestion",
"required": false
}
},
"description": "PointFive Logging Integration"
},
{
"id": "s3",
"displayName": "S3",

View file

@ -0,0 +1,47 @@
import json
from pathlib import Path
import litellm
from litellm.integrations.custom_logger import CustomLogger
def _dashboard_configs() -> tuple[dict, ...]:
path = Path(litellm.__file__).parent / "integrations" / "callback_configs.json"
return tuple(json.loads(path.read_text()))
def _pointfive_config() -> dict:
return next(config for config in _dashboard_configs() if config["id"] == "pointfive")
def test_pointfive_appears_in_the_dashboard_callback_dropdown():
"""The dropdown is served from callback_configs.json, so an entry only in the dashboard source is invisible."""
entry = _pointfive_config()
assert entry["displayName"] == "PointFive"
assert entry["supports_key_team_logging"] is False
assert entry["dynamic_params"]["POINTFIVE_API_KEY"]["required"] is True
assert entry["dynamic_params"]["POINTFIVE_API_KEY"]["type"] == "password"
assert entry["dynamic_params"]["POINTFIVE_API_URL"]["required"] is False
def test_the_dropdown_logo_asset_exists():
"""A logo the dashboard cannot resolve degrades silently to a letter tile."""
logo = _pointfive_config()["logo"]
repo_root = Path(litellm.__file__).parent.parent
asset = repo_root / "ui" / "litellm-dashboard" / "public" / "assets" / "logos" / logo
assert logo == "pointfive.png"
assert asset.is_file()
def test_the_dropdown_fields_are_the_env_vars_the_logger_reads():
"""
The field names are the environment variables verbatim.
The proxy would uppercase them either way, but naming them as stored means the edit
form finds the saved values and prefills them instead of showing blanks.
"""
fields = tuple(_pointfive_config()["dynamic_params"])
assert fields == tuple(CustomLogger.get_callback_env_vars("pointfive"))

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

View file

@ -9,6 +9,7 @@ import langsmithLogo from "../../public/assets/logos/langsmith.png";
import newrelicLogo from "../../public/assets/logos/newrelic.png";
import openmeterLogo from "../../public/assets/logos/openmeter.png";
import otelLogo from "../../public/assets/logos/otel.png";
import pointfiveLogo from "../../public/assets/logos/pointfive.png";
interface CallbackConfig {
id: string;
@ -162,6 +163,17 @@ export const CALLBACK_CONFIGS: CallbackConfig[] = [
},
description: "OpenTelemetry Logging Integration",
},
{
id: "pointfive",
displayName: "PointFive",
logo: pointfiveLogo.src,
supports_key_team_logging: false,
dynamic_params: {
POINTFIVE_API_KEY: "password",
POINTFIVE_API_URL: "text",
},
description: "PointFive Logging Integration",
},
{
id: "s3",
displayName: "S3",