From palantir-pack
Applies production-ready Palantir Foundry SDK patterns for Python and TypeScript, including client singletons, typed error handling, pagination, retries, and multi-tenant factories.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin palantir-packThis skill is limited to using the following tools:
Production-ready patterns for Foundry Platform SDK and OSDK usage. Covers client singletons, typed error handling, pagination helpers, retry logic, and multi-tenant client factories.
Installs Palantir Foundry SDK for Python or TypeScript and configures OAuth2 or token auth with env vars and client examples. For new integrations or API setup.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Share bugs, ideas, or general feedback.
Production-ready patterns for Foundry Platform SDK and OSDK usage. Covers client singletons, typed error handling, pagination helpers, retry logic, and multi-tenant client factories.
palantir-install-auth setupfoundry-platform-sdk or @osdk/client installed# src/foundry_client.py
import os
import foundry
from functools import lru_cache
@lru_cache(maxsize=1)
def get_client() -> foundry.FoundryClient:
"""Thread-safe singleton — cached after first call."""
auth = foundry.ConfidentialClientAuth(
client_id=os.environ["FOUNDRY_CLIENT_ID"],
client_secret=os.environ["FOUNDRY_CLIENT_SECRET"],
hostname=os.environ["FOUNDRY_HOSTNAME"],
scopes=["api:read-data", "api:write-data"],
)
auth.sign_in_as_service_user()
return foundry.FoundryClient(auth=auth, hostname=os.environ["FOUNDRY_HOSTNAME"])
import foundry
from dataclasses import dataclass
from typing import TypeVar, Generic, Optional
T = TypeVar("T")
@dataclass
class Result(Generic[T]):
data: Optional[T] = None
error: Optional[str] = None
status_code: Optional[int] = None
def safe_call(fn, *args, **kwargs) -> Result:
"""Wrap any Foundry SDK call with structured error handling."""
try:
return Result(data=fn(*args, **kwargs))
except foundry.ApiError as e:
return Result(error=e.message, status_code=e.status_code)
except Exception as e:
return Result(error=str(e))
# Usage
result = safe_call(
get_client().ontologies.OntologyObject.list,
ontology="my-company", object_type="Employee", page_size=10,
)
if result.error:
print(f"Error {result.status_code}: {result.error}")
else:
print(f"Found {len(result.data.data)} objects")
def paginate_objects(client, ontology: str, object_type: str, page_size: int = 100):
"""Iterate through all objects with automatic pagination."""
page_token = None
while True:
result = client.ontologies.OntologyObject.list(
ontology=ontology,
object_type=object_type,
page_size=page_size,
page_token=page_token,
)
yield from result.data
page_token = result.next_page_token
if not page_token:
break
# Usage
for emp in paginate_objects(get_client(), "my-company", "Employee"):
print(emp.properties["fullName"])
import time
import random
def retry_with_backoff(fn, max_retries=3, base_delay=1.0):
"""Retry on 429/5xx with jittered exponential backoff."""
for attempt in range(max_retries + 1):
try:
return fn()
except foundry.ApiError as e:
if attempt == max_retries or e.status_code not in (429, 500, 502, 503):
raise
delay = base_delay * (2 ** attempt) + random.uniform(0, 0.5)
print(f"Retry {attempt + 1}/{max_retries} in {delay:.1f}s (HTTP {e.status_code})")
time.sleep(delay)
import { createClient, type Client } from "@osdk/client";
import { createConfidentialOauthClient } from "@osdk/oauth";
// Singleton with lazy initialization
let _client: Client | null = null;
export function getOsdkClient(): Client {
if (!_client) {
const oauth = createConfidentialOauthClient(
process.env.FOUNDRY_CLIENT_ID!,
process.env.FOUNDRY_CLIENT_SECRET!,
`https://${process.env.FOUNDRY_HOSTNAME}/multipass/api/oauth2/token`,
);
_client = createClient(
`https://${process.env.FOUNDRY_HOSTNAME}`,
process.env.ONTOLOGY_RID!,
oauth,
);
}
return _client;
}
| Pattern | Use Case | Benefit |
|---|---|---|
| Singleton | All API calls | One auth flow, reused connection |
| Result wrapper | Error propagation | No uncaught exceptions |
| Pagination helper | Large datasets | Memory-safe iteration |
| Retry with backoff | Transient failures | Resilient operations |
_clients: dict[str, foundry.FoundryClient] = {}
def get_client_for_tenant(tenant_id: str) -> foundry.FoundryClient:
if tenant_id not in _clients:
hostname = get_tenant_hostname(tenant_id)
token = get_tenant_token(tenant_id)
_clients[tenant_id] = foundry.FoundryClient(
auth=foundry.UserTokenAuth(hostname=hostname, token=token),
hostname=hostname,
)
return _clients[tenant_id]
Apply patterns in palantir-core-workflow-a for real pipeline usage.