Metering for AI Units
Your application needs to report business metrics that reflect the value of AI functionality and cover the cost of GenAI/LLM services. The generative AI hub can report these metrics to Unified Metering on your behalf.
Each LLM request must supply additional headers as documented in the SAP Help Portal.
Required headers:
X-USECASE-IDX-BUSINESS-CONTEXTX-LOCALTENANT-IDX-PRODUCT-TYPE
Common Setup
from gen_ai_hub.proxy import get_proxy_client
from gen_ai_hub.proxy.gen_ai_hub_proxy import temporary_headers_addition
METERING_HEADERS = {
'X-USECASE-ID': 'my-usecase',
'X-BUSINESS-CONTEXT': 'my-context',
'X-LOCALTENANT-ID': 'tenant-123',
'X-PRODUCT-TYPE': 'my-product'
}
proxy_client = get_proxy_client('gen-ai-hub')
proxy_client.set_headers_addition(headers=METERING_HEADERS)
Native LLM Clients
Instance-level headers
from gen_ai_hub.proxy.native.openai import OpenAI
# All requests from this client include metering headers
client = OpenAI(proxy_client=proxy_client)
response = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'Hello!'}]
)
print(response.choices[0].message.content)
Request-level headers
from gen_ai_hub.proxy.native.openai import OpenAI
client = OpenAI()
# Only this request includes metering headers
with temporary_headers_addition(headers=METERING_HEADERS):
response = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'Hello!'}]
)
print(response.choices[0].message.content)
Orchestration Service
Instance-level headers
from gen_ai_hub.orchestration_v2 import (
OrchestrationService, OrchestrationConfig, ModuleConfig, Template,
PromptTemplatingModuleConfig, LLMModelDetails, UserMessage
)
config = OrchestrationConfig(
modules=ModuleConfig(
prompt_templating=PromptTemplatingModuleConfig(
prompt=Template(template=[UserMessage(content='{{?input}}')]),
model=LLMModelDetails(name='gpt-4o')
)
)
)
# All requests from this service include metering headers
service = OrchestrationService(proxy_client=proxy_client, config=config)
response = service.run(placeholder_values={'input': 'Hello!'})
print(response.final_result.choices[0].message.content)
Request-level headers
from gen_ai_hub.orchestration_v2 import OrchestrationService
service = OrchestrationService(config=config)
with temporary_headers_addition(headers=METERING_HEADERS):
response = service.run(placeholder_values={'input': 'Hello!'})
print(response.final_result.choices[0].message.content)
Prompt Registry
Instance-level headers
from gen_ai_hub.prompt_registry import PromptTemplateClient
client = PromptTemplateClient(proxy_client=proxy_client)
templates = client.get_prompt_templates(scenario='my-scenario')
print(f"Found {templates.count} templates")
Request-level headers
from gen_ai_hub.prompt_registry import PromptTemplateClient
client = PromptTemplateClient()
with temporary_headers_addition(headers=METERING_HEADERS):
templates = client.get_prompt_templates(scenario='my-scenario')
print(f"Found {templates.count} templates")
Document Grounding Clients
Instance-level headers
from gen_ai_hub.document_grounding import PipelineAPIClient, RetrievalAPIClient, VectorAPIClient
pipeline_client = PipelineAPIClient(proxy_client=proxy_client)
retrieval_client = RetrievalAPIClient(proxy_client=proxy_client)
vector_client = VectorAPIClient(proxy_client=proxy_client)
print(f"Found {pipeline_client.get_pipelines().count} pipelines")
print(f"Found {retrieval_client.get_data_repositories().count} repositories")
print(f"Found {vector_client.get_collections().count} collections")
Request-level headers
from gen_ai_hub.document_grounding import RetrievalAPIClient
client = RetrievalAPIClient()
with temporary_headers_addition(headers=METERING_HEADERS):
repositories = client.get_data_repositories()
print(f"Found {repositories.count} repositories")
Combining Instance and Request-level Headers
Request-level headers are merged with instance-level headers. If the same header is set at both levels, the request-level value takes precedence.
from gen_ai_hub.proxy.native.openai import OpenAI
proxy_client.set_headers_addition({
'X-USECASE-ID': 'default-usecase',
'X-LOCALTENANT-ID': 'tenant-123'
})
client = OpenAI(proxy_client=proxy_client)
with temporary_headers_addition({'X-USECASE-ID': 'special-usecase'}):
# X-USECASE-ID: 'special-usecase' (request-level wins)
# X-LOCALTENANT-ID: 'tenant-123' (from instance-level)
response = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'Hello!'}]
)