# Hibiz LLM Wrapper
A comprehensive Python wrapper for Azure OpenAI services, specifically designed for Hibiz Solutions' applications. This library provides seamless integration with Azure OpenAI's Chat Completions and Embeddings APIs while offering robust token usage tracking, database logging, and error handling.
## Features
- **Chat Completions**: Support for text and JSON response types with automatic token calculation
- **Embeddings**: Create embeddings for single or multiple text inputs with comprehensive logging
- **Token Usage Tracking**: Automatic calculation and database logging of input, output, and total tokens
- **Database Integration**: PostgreSQL integration for usage analytics and monitoring
- **Error Handling**: Comprehensive error handling with detailed logging
- **Response Time Tracking**: Automatic measurement and logging of API response times
- **Application Tracking**: Enhanced logging with app_name, module_name, and function_name for detailed usage analytics
- **Parameter Validation**: Automatic validation and sanitization of API parameters
## Installation
```bash
pip install hibiz-llm-wrapper
```
## Quick Start
```python
from hibiz_llm_wrapper import LLMWrapper
# Initialize the database config
db_config = {
'host': 'database host',
'port': 5432,
'dbname': 'database name',
'user': 'user name',
'password': 'password'
}
# Initialize the wrapper
llm = LLMWrapper(
service_url="https://your-azure-openai-service.openai.azure.com",
api_key="your-api-key",
deployment_name="your-chat-deployment",
api_version="your-api-version",
db_config=db_config,
default_model="your-model-name",
default_embedding_model="your-embedding-model-name"
)
# Send a chat completion request
response = llm.send_request(
prompt_payload=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello, how are you?"}
],
customer_id="Default Customer",
organization_id="Default Organization",
app_name="ChatBot",
module_name="Conversation",
function_name="handle_greeting"
)
print(response["output_text"])
print(f"Tokens used: {response['total_tokens']}")
```
## API Reference
### LLMWrapper Class
#### Constructor
```python
LLMWrapper(
service_url: str,
api_key: str,
deployment_name: str,
api_version: str,
db_config=db_config,
default_model: str = "gpt-4",
default_embedding_model: str = "text-embedding-ada-002",
timeout: int = 600
)
```
**Parameters:**
- `service_url`: Azure OpenAI service endpoint URL
- `api_key`: Azure OpenAI API key
- `deployment_name`: Deployment name for chat completions
- `api_version`: API version (e.g., "2024-02-15-preview")
- `default_model`: Default model name for chat completions
- `default_embedding_model`: Default model name for embeddings
- `timeout`: Request timeout in seconds
### Methods
#### send_request()
Send a chat completion request to Azure OpenAI.
```python
send_request(
prompt_payload: List[Dict[str, Any]],
customer_id: str,
organization_id: str,
app_name: str,
module_name: str,
function_name: str,
model: Optional[str] = None,
response_type: str = "text",
**kwargs
) -> Dict[str, Any]
```
**Parameters:**
- `prompt_payload`: List of message dictionaries (OpenAI chat format)
- `customer_id`: Customer identifier for tracking
- `organization_id`: Organization identifier for tracking
- `app_name`: Application name using the service
- `module_name`: Module name within the application
- `function_name`: Specific function name for detailed tracking
- `model`: Model to use (overrides default)
- `response_type`: "text" or "json" for response format
- `**kwargs`: Additional parameters for the API request (see below)
**Supported kwargs Parameters:**
The `send_request` method accepts the following optional parameters through `**kwargs`. All parameters are automatically validated and sanitized:
- `temperature` (float): Controls randomness in the output
- Range: 0.0 to 2.0
- Default: 1.0
- Lower values make output more focused and deterministic
- `top_p` (float): Controls nucleus sampling
- Range: 0.0 to 1.0
- Default: 1.0
- Alternative to temperature for controlling randomness
- `frequency_penalty` (float): Penalizes new tokens based on their frequency
- Range: -2.0 to 2.0
- Default: 0.0
- Positive values reduce repetition
- `presence_penalty` (float): Penalizes new tokens based on their presence
- Range: -2.0 to 2.0
- Default: 0.0
- Positive values encourage talking about new topics
- `max_tokens` (int): Maximum number of tokens in the response
- Range: 1 to 10,000
- Default: Model-dependent
- Controls response length
**Returns:**
```python
{
"output_text": str,
"processed_output": Any,
"response_type": str,
"input_tokens": int,
"output_tokens": int,
"total_tokens": int,
"response_time_ms": int,
"model": str,
"app_name": str,
"module_name": str,
"function_name": str,
"full_response": dict,
"original_prompt": list
}
```
#### create_embeddings()
Create embeddings for text inputs using Azure OpenAI.
```python
create_embeddings(
input_texts: Union[str, List[str]],
customer_id: str,
organization_id: str,
app_name: str,
module_name: str,
function_name: str,
model: Optional[str] = None,
embedding_deployment_name: Optional[str] = None,
**kwargs
) -> Dict[str, Any]
```
**Parameters:**
- `input_texts`: Single string or list of strings to embed
- `customer_id`: Customer identifier for tracking
- `organization_id`: Organization identifier for tracking
- `app_name`: Application name using the service
- `module_name`: Module name within the application
- `function_name`: Specific function name for detailed tracking
- `model`: Embedding model to use (overrides default)
- `embedding_deployment_name`: Specific deployment name for embeddings
- `**kwargs`: Additional parameters for the embedding API
**Returns:**
```python
{
"embeddings": Union[List[float], List[List[float]]],
"input_tokens": int,
"output_tokens": int,
"total_tokens": int,
"response_time_ms": int,
"model": str,
"embedding_count": int,
"input_text_count": int,
"app_name": str,
"module_name": str,
"function_name": str,
"original_input": Union[str, List[str]]
}
```
#### get_usage_stats()
Retrieve usage statistics from the database.
```python
get_usage_stats(
customer_id: Optional[str] = None,
organization_id: Optional[str] = None,
app_name: Optional[str] = None,
module_name: Optional[str] = None,
function_name: Optional[str] = None,
start_date: Optional[str] = None,
end_date: Optional[str] = None,
request_type: Optional[str] = None
) -> Dict[str, Any]
```
## Usage Examples
### Basic Chat Completion
```python
# Simple text response
response = llm.send_request(
prompt_payload=[
{"role": "user", "content": "What is the capital of France?"}
],
customer_id="Default Customer",
organization_id="Default Organization",
app_name="KnowledgeBot",
module_name="Geography",
function_name="get_capital"
)
print(response["output_text"])
```
### Advanced Chat Completion with Parameters
```python
# Chat completion with advanced parameters
response = llm.send_request(
prompt_payload=[
{"role": "system", "content": "You are a creative writing assistant."},
{"role": "user", "content": "Write a short story about a robot."}
],
customer_id="Default Customer",
organization_id="Default Organization",
app_name="CreativeWriting",
module_name="StoryGeneration",
function_name="generate_story",
temperature=0.8, # More creative responses
max_tokens=500, # Limit response length
top_p=0.9, # Nucleus sampling
frequency_penalty=0.2, # Reduce repetition
presence_penalty=0.1, # Encourage new topics
stop=["\n\n", "THE END"] # Stop sequences
)
print(response["output_text"])
```
### JSON Response
```python
# Request structured JSON response
response = llm.send_request(
prompt_payload=[
{"role": "user", "content": "List 3 programming languages with their use cases in JSON format"}
],
customer_id="Default Customer",
organization_id="Default Organization",
app_name="DevAssistant",
module_name="Programming",
function_name="list_languages",
response_type="json",
temperature=0.1, # More deterministic for structured output
max_tokens=300
)
# Access parsed JSON data
json_data = response["processed_output"]
print(json_data)
```
### Creating Embeddings
```python
# Single text embedding
embedding_response = llm.create_embeddings(
input_texts="This is a sample text for embedding",
customer_id="Default Customer",
organization_id="Default Organization",
app_name="SearchEngine",
module_name="DocumentProcessing",
function_name="create_document_embedding"
)
print(f"Embedding dimension: {len(embedding_response['embeddings'])}")
# Multiple text embeddings
texts = [
"First document text",
"Second document text",
"Third document text"
]
batch_response = llm.create_embeddings(
input_texts=texts,
customer_id="Default Customer",
organization_id="Default Organization",
app_name="SearchEngine",
module_name="DocumentProcessing",
function_name="batch_embed_documents"
)
print(f"Created {batch_response['embedding_count']} embeddings")
```
### Using Context Manager
```python
# Automatic resource cleanup
with LLMWrapper(
service_url="https://your-service.openai.azure.com",
api_key="your-key",
deployment_name="your-deployment",
api_version="your-api-version"
db_config=db_config,
) as llm:
response = llm.send_request(
prompt_payload=[{"role": "user", "content": "Hello!"}],
customer_id="Default Customer",
organization_id="Default Organization",
app_name="TestApp",
module_name="Main",
function_name="test_function",
temperature=0.7,
max_tokens=100
)
print(response["output_text"])
```
### Getting Usage Statistics
```python
# Get usage stats for a specific app
stats = llm.get_usage_stats(
customer_id="Default Customer",
app_name="ChatBot",
start_date="2024-01-01T00:00:00",
end_date="2024-01-31T23:59:59"
)
print(f"Total tokens used: {stats.get('total_tokens', 0)}")
# Get embedding-specific stats
embedding_stats = llm.get_usage_stats(
organization_id="Default Organization",
request_type="embedding",
module_name="DocumentProcessing"
)
```
## Parameter Validation
The library automatically validates all parameters passed through `**kwargs`:
```python
# Valid parameters - will work correctly
response = llm.send_request(
prompt_payload=[{"role": "user", "content": "Hello!"}],
customer_id="Default Customer",
organization_id="Default Organization",
app_name="TestApp",
module_name="Main",
function_name="test_function",
temperature=1.5, # Valid: within 0.0-2.0 range
max_tokens=1000, # Valid: within 1-10000 range
top_p=0.8 # Valid: within 0.0-1.0 range
)
# Invalid parameters will be automatically corrected or raise validation errors
try:
response = llm.send_request(
prompt_payload=[{"role": "user", "content": "Hello!"}],
customer_id="Default Customer",
organization_id="Default Organization",
app_name="TestApp",
module_name="Main",
function_name="test_function",
temperature=3.0, # Invalid: exceeds 2.0 maximum
max_tokens=15000 # Invalid: exceeds 10000 maximum
)
except ValueError as e:
print(f"Parameter validation error: {e}")
```
## Enhanced Logging and Tracking
The library automatically logs all requests with detailed information:
- **Request Details**: Model, parameters, response type
- **Token Usage**: Input, output, and total token counts
- **Performance**: Response time in milliseconds
- **Application Context**: App name, module name, function name
- **Parameters Used**: All kwargs parameters and their validated values
- **Status**: Success or failure with error details
This enables comprehensive analytics and monitoring of your Azure OpenAI usage across different applications and modules.
## Error Handling
The library includes comprehensive error handling:
```python
from llm_wrapper.exceptions import APIError, DatabaseError, ValidationError
try:
response = llm.send_request(
prompt_payload=[{"role": "user", "content": "Hello!"}],
customer_id="Default Customer",
organization_id="Default Organization",
app_name="TestApp",
module_name="Main",
function_name="test_function",
temperature=0.7,
max_tokens=500
)
except APIError as e:
print(f"API request failed: {e}")
except DatabaseError as e:
print(f"Database logging failed: {e}")
except ValidationError as e:
print(f"Parameter validation failed: {e}")
```
## Database Schema
The library automatically creates the necessary database tables for token usage tracking. All usage data is stored with customer, organization, and application context for detailed analytics.
## Requirements
- Python 3.7+
- requests
- PostgreSQL database
- Azure OpenAI service
## Support
This library is developed and maintained exclusively for Hibiz Solutions. For support and questions, please contact the internal development team.
## License
Proprietary - Hibiz Solutions Internal Use Only
Raw data
{
"_id": null,
"home_page": null,
"name": "hibiz-llm-wrapper",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "Akilan R M <akilan@hibizsolutions.com>",
"keywords": "llm, language-model, openai, azure, gpt, ai, machine-learning, database, postgresql, mysql, mongodb, usage-tracking, api-wrapper",
"author": null,
"author_email": "Akilan R M <akilan@hibizsolutions.com>",
"download_url": "https://files.pythonhosted.org/packages/d9/47/cd3b1ac37b2141f4c4eb98e6f14b193692c600f63a4f2ff056caff15f35d/hibiz_llm_wrapper-1.0.5.tar.gz",
"platform": null,
"description": "# Hibiz LLM Wrapper\r\n\r\nA comprehensive Python wrapper for Azure OpenAI services, specifically designed for Hibiz Solutions' applications. This library provides seamless integration with Azure OpenAI's Chat Completions and Embeddings APIs while offering robust token usage tracking, database logging, and error handling.\r\n\r\n## Features\r\n\r\n- **Chat Completions**: Support for text and JSON response types with automatic token calculation\r\n- **Embeddings**: Create embeddings for single or multiple text inputs with comprehensive logging\r\n- **Token Usage Tracking**: Automatic calculation and database logging of input, output, and total tokens\r\n- **Database Integration**: PostgreSQL integration for usage analytics and monitoring\r\n- **Error Handling**: Comprehensive error handling with detailed logging\r\n- **Response Time Tracking**: Automatic measurement and logging of API response times\r\n- **Application Tracking**: Enhanced logging with app_name, module_name, and function_name for detailed usage analytics\r\n- **Parameter Validation**: Automatic validation and sanitization of API parameters\r\n\r\n## Installation\r\n\r\n```bash\r\npip install hibiz-llm-wrapper\r\n```\r\n\r\n## Quick Start\r\n\r\n```python\r\nfrom hibiz_llm_wrapper import LLMWrapper\r\n\r\n# Initialize the database config\r\ndb_config = {\r\n 'host': 'database host',\r\n 'port': 5432,\r\n 'dbname': 'database name',\r\n 'user': 'user name',\r\n 'password': 'password'\r\n }\r\n\r\n\r\n# Initialize the wrapper\r\nllm = LLMWrapper(\r\n service_url=\"https://your-azure-openai-service.openai.azure.com\",\r\n api_key=\"your-api-key\",\r\n deployment_name=\"your-chat-deployment\",\r\n api_version=\"your-api-version\",\r\n db_config=db_config,\r\n default_model=\"your-model-name\",\r\n default_embedding_model=\"your-embedding-model-name\"\r\n)\r\n\r\n# Send a chat completion request\r\nresponse = llm.send_request(\r\n prompt_payload=[\r\n {\"role\": \"system\", \"content\": \"You are a helpful assistant.\"},\r\n {\"role\": \"user\", \"content\": \"Hello, how are you?\"}\r\n ],\r\n customer_id=\"Default Customer\",\r\n organization_id=\"Default Organization\",\r\n app_name=\"ChatBot\",\r\n module_name=\"Conversation\",\r\n function_name=\"handle_greeting\"\r\n)\r\n\r\nprint(response[\"output_text\"])\r\nprint(f\"Tokens used: {response['total_tokens']}\")\r\n```\r\n\r\n## API Reference\r\n\r\n### LLMWrapper Class\r\n\r\n#### Constructor\r\n\r\n```python\r\nLLMWrapper(\r\n service_url: str,\r\n api_key: str,\r\n deployment_name: str,\r\n api_version: str,\r\n db_config=db_config,\r\n default_model: str = \"gpt-4\",\r\n default_embedding_model: str = \"text-embedding-ada-002\",\r\n timeout: int = 600\r\n)\r\n```\r\n\r\n**Parameters:**\r\n- `service_url`: Azure OpenAI service endpoint URL\r\n- `api_key`: Azure OpenAI API key\r\n- `deployment_name`: Deployment name for chat completions\r\n- `api_version`: API version (e.g., \"2024-02-15-preview\")\r\n- `default_model`: Default model name for chat completions\r\n- `default_embedding_model`: Default model name for embeddings\r\n- `timeout`: Request timeout in seconds\r\n\r\n### Methods\r\n\r\n#### send_request()\r\n\r\nSend a chat completion request to Azure OpenAI.\r\n\r\n```python\r\nsend_request(\r\n prompt_payload: List[Dict[str, Any]],\r\n customer_id: str,\r\n organization_id: str,\r\n app_name: str,\r\n module_name: str,\r\n function_name: str,\r\n model: Optional[str] = None,\r\n response_type: str = \"text\",\r\n **kwargs\r\n) -> Dict[str, Any]\r\n```\r\n\r\n**Parameters:**\r\n- `prompt_payload`: List of message dictionaries (OpenAI chat format)\r\n- `customer_id`: Customer identifier for tracking\r\n- `organization_id`: Organization identifier for tracking\r\n- `app_name`: Application name using the service\r\n- `module_name`: Module name within the application\r\n- `function_name`: Specific function name for detailed tracking\r\n- `model`: Model to use (overrides default)\r\n- `response_type`: \"text\" or \"json\" for response format\r\n- `**kwargs`: Additional parameters for the API request (see below)\r\n\r\n**Supported kwargs Parameters:**\r\n\r\nThe `send_request` method accepts the following optional parameters through `**kwargs`. All parameters are automatically validated and sanitized:\r\n\r\n- `temperature` (float): Controls randomness in the output\r\n - Range: 0.0 to 2.0\r\n - Default: 1.0\r\n - Lower values make output more focused and deterministic\r\n\r\n- `top_p` (float): Controls nucleus sampling\r\n - Range: 0.0 to 1.0\r\n - Default: 1.0\r\n - Alternative to temperature for controlling randomness\r\n\r\n- `frequency_penalty` (float): Penalizes new tokens based on their frequency\r\n - Range: -2.0 to 2.0\r\n - Default: 0.0\r\n - Positive values reduce repetition\r\n\r\n- `presence_penalty` (float): Penalizes new tokens based on their presence\r\n - Range: -2.0 to 2.0\r\n - Default: 0.0\r\n - Positive values encourage talking about new topics\r\n\r\n- `max_tokens` (int): Maximum number of tokens in the response\r\n - Range: 1 to 10,000\r\n - Default: Model-dependent\r\n - Controls response length\r\n\r\n\r\n**Returns:**\r\n```python\r\n{\r\n \"output_text\": str,\r\n \"processed_output\": Any,\r\n \"response_type\": str,\r\n \"input_tokens\": int,\r\n \"output_tokens\": int,\r\n \"total_tokens\": int,\r\n \"response_time_ms\": int,\r\n \"model\": str,\r\n \"app_name\": str,\r\n \"module_name\": str,\r\n \"function_name\": str,\r\n \"full_response\": dict,\r\n \"original_prompt\": list\r\n}\r\n```\r\n\r\n#### create_embeddings()\r\n\r\nCreate embeddings for text inputs using Azure OpenAI.\r\n\r\n```python\r\ncreate_embeddings(\r\n input_texts: Union[str, List[str]],\r\n customer_id: str,\r\n organization_id: str,\r\n app_name: str,\r\n module_name: str,\r\n function_name: str,\r\n model: Optional[str] = None,\r\n embedding_deployment_name: Optional[str] = None,\r\n **kwargs\r\n) -> Dict[str, Any]\r\n```\r\n\r\n**Parameters:**\r\n- `input_texts`: Single string or list of strings to embed\r\n- `customer_id`: Customer identifier for tracking\r\n- `organization_id`: Organization identifier for tracking\r\n- `app_name`: Application name using the service\r\n- `module_name`: Module name within the application\r\n- `function_name`: Specific function name for detailed tracking\r\n- `model`: Embedding model to use (overrides default)\r\n- `embedding_deployment_name`: Specific deployment name for embeddings\r\n- `**kwargs`: Additional parameters for the embedding API\r\n\r\n**Returns:**\r\n```python\r\n{\r\n \"embeddings\": Union[List[float], List[List[float]]],\r\n \"input_tokens\": int,\r\n \"output_tokens\": int,\r\n \"total_tokens\": int,\r\n \"response_time_ms\": int,\r\n \"model\": str,\r\n \"embedding_count\": int,\r\n \"input_text_count\": int,\r\n \"app_name\": str,\r\n \"module_name\": str,\r\n \"function_name\": str,\r\n \"original_input\": Union[str, List[str]]\r\n}\r\n```\r\n\r\n#### get_usage_stats()\r\n\r\nRetrieve usage statistics from the database.\r\n\r\n```python\r\nget_usage_stats(\r\n customer_id: Optional[str] = None,\r\n organization_id: Optional[str] = None,\r\n app_name: Optional[str] = None,\r\n module_name: Optional[str] = None,\r\n function_name: Optional[str] = None,\r\n start_date: Optional[str] = None,\r\n end_date: Optional[str] = None,\r\n request_type: Optional[str] = None\r\n) -> Dict[str, Any]\r\n```\r\n\r\n## Usage Examples\r\n\r\n### Basic Chat Completion\r\n\r\n```python\r\n# Simple text response\r\nresponse = llm.send_request(\r\n prompt_payload=[\r\n {\"role\": \"user\", \"content\": \"What is the capital of France?\"}\r\n ],\r\n customer_id=\"Default Customer\",\r\n organization_id=\"Default Organization\",\r\n app_name=\"KnowledgeBot\",\r\n module_name=\"Geography\",\r\n function_name=\"get_capital\"\r\n)\r\n\r\nprint(response[\"output_text\"])\r\n```\r\n\r\n### Advanced Chat Completion with Parameters\r\n\r\n```python\r\n# Chat completion with advanced parameters\r\nresponse = llm.send_request(\r\n prompt_payload=[\r\n {\"role\": \"system\", \"content\": \"You are a creative writing assistant.\"},\r\n {\"role\": \"user\", \"content\": \"Write a short story about a robot.\"}\r\n ],\r\n customer_id=\"Default Customer\",\r\n organization_id=\"Default Organization\",\r\n app_name=\"CreativeWriting\",\r\n module_name=\"StoryGeneration\",\r\n function_name=\"generate_story\",\r\n temperature=0.8, # More creative responses\r\n max_tokens=500, # Limit response length\r\n top_p=0.9, # Nucleus sampling\r\n frequency_penalty=0.2, # Reduce repetition\r\n presence_penalty=0.1, # Encourage new topics\r\n stop=[\"\\n\\n\", \"THE END\"] # Stop sequences\r\n)\r\n\r\nprint(response[\"output_text\"])\r\n```\r\n\r\n### JSON Response\r\n\r\n```python\r\n# Request structured JSON response\r\nresponse = llm.send_request(\r\n prompt_payload=[\r\n {\"role\": \"user\", \"content\": \"List 3 programming languages with their use cases in JSON format\"}\r\n ],\r\n customer_id=\"Default Customer\",\r\n organization_id=\"Default Organization\",\r\n app_name=\"DevAssistant\",\r\n module_name=\"Programming\",\r\n function_name=\"list_languages\",\r\n response_type=\"json\",\r\n temperature=0.1, # More deterministic for structured output\r\n max_tokens=300\r\n)\r\n\r\n# Access parsed JSON data\r\njson_data = response[\"processed_output\"]\r\nprint(json_data)\r\n```\r\n\r\n### Creating Embeddings\r\n\r\n```python\r\n# Single text embedding\r\nembedding_response = llm.create_embeddings(\r\n input_texts=\"This is a sample text for embedding\",\r\n customer_id=\"Default Customer\",\r\n organization_id=\"Default Organization\",\r\n app_name=\"SearchEngine\",\r\n module_name=\"DocumentProcessing\",\r\n function_name=\"create_document_embedding\"\r\n)\r\n\r\nprint(f\"Embedding dimension: {len(embedding_response['embeddings'])}\")\r\n\r\n# Multiple text embeddings\r\ntexts = [\r\n \"First document text\",\r\n \"Second document text\",\r\n \"Third document text\"\r\n]\r\n\r\nbatch_response = llm.create_embeddings(\r\n input_texts=texts,\r\n customer_id=\"Default Customer\",\r\n organization_id=\"Default Organization\",\r\n app_name=\"SearchEngine\",\r\n module_name=\"DocumentProcessing\",\r\n function_name=\"batch_embed_documents\"\r\n)\r\n\r\nprint(f\"Created {batch_response['embedding_count']} embeddings\")\r\n```\r\n\r\n### Using Context Manager\r\n\r\n```python\r\n# Automatic resource cleanup\r\nwith LLMWrapper(\r\n service_url=\"https://your-service.openai.azure.com\",\r\n api_key=\"your-key\",\r\n deployment_name=\"your-deployment\",\r\n api_version=\"your-api-version\"\r\n db_config=db_config,\r\n) as llm:\r\n response = llm.send_request(\r\n prompt_payload=[{\"role\": \"user\", \"content\": \"Hello!\"}],\r\n customer_id=\"Default Customer\",\r\n organization_id=\"Default Organization\",\r\n app_name=\"TestApp\",\r\n module_name=\"Main\",\r\n function_name=\"test_function\",\r\n temperature=0.7,\r\n max_tokens=100\r\n )\r\n print(response[\"output_text\"])\r\n```\r\n\r\n### Getting Usage Statistics\r\n\r\n```python\r\n# Get usage stats for a specific app\r\nstats = llm.get_usage_stats(\r\n customer_id=\"Default Customer\",\r\n app_name=\"ChatBot\",\r\n start_date=\"2024-01-01T00:00:00\",\r\n end_date=\"2024-01-31T23:59:59\"\r\n)\r\n\r\nprint(f\"Total tokens used: {stats.get('total_tokens', 0)}\")\r\n\r\n# Get embedding-specific stats\r\nembedding_stats = llm.get_usage_stats(\r\n organization_id=\"Default Organization\",\r\n request_type=\"embedding\",\r\n module_name=\"DocumentProcessing\"\r\n)\r\n```\r\n\r\n## Parameter Validation\r\n\r\nThe library automatically validates all parameters passed through `**kwargs`:\r\n\r\n```python\r\n# Valid parameters - will work correctly\r\nresponse = llm.send_request(\r\n prompt_payload=[{\"role\": \"user\", \"content\": \"Hello!\"}],\r\n customer_id=\"Default Customer\",\r\n organization_id=\"Default Organization\",\r\n app_name=\"TestApp\",\r\n module_name=\"Main\",\r\n function_name=\"test_function\",\r\n temperature=1.5, # Valid: within 0.0-2.0 range\r\n max_tokens=1000, # Valid: within 1-10000 range\r\n top_p=0.8 # Valid: within 0.0-1.0 range\r\n)\r\n\r\n# Invalid parameters will be automatically corrected or raise validation errors\r\ntry:\r\n response = llm.send_request(\r\n prompt_payload=[{\"role\": \"user\", \"content\": \"Hello!\"}],\r\n customer_id=\"Default Customer\",\r\n organization_id=\"Default Organization\",\r\n app_name=\"TestApp\",\r\n module_name=\"Main\",\r\n function_name=\"test_function\",\r\n temperature=3.0, # Invalid: exceeds 2.0 maximum\r\n max_tokens=15000 # Invalid: exceeds 10000 maximum\r\n )\r\nexcept ValueError as e:\r\n print(f\"Parameter validation error: {e}\")\r\n```\r\n\r\n## Enhanced Logging and Tracking\r\n\r\nThe library automatically logs all requests with detailed information:\r\n\r\n- **Request Details**: Model, parameters, response type\r\n- **Token Usage**: Input, output, and total token counts\r\n- **Performance**: Response time in milliseconds\r\n- **Application Context**: App name, module name, function name\r\n- **Parameters Used**: All kwargs parameters and their validated values\r\n- **Status**: Success or failure with error details\r\n\r\nThis enables comprehensive analytics and monitoring of your Azure OpenAI usage across different applications and modules.\r\n\r\n## Error Handling\r\n\r\nThe library includes comprehensive error handling:\r\n\r\n```python\r\nfrom llm_wrapper.exceptions import APIError, DatabaseError, ValidationError\r\n\r\ntry:\r\n response = llm.send_request(\r\n prompt_payload=[{\"role\": \"user\", \"content\": \"Hello!\"}],\r\n customer_id=\"Default Customer\",\r\n organization_id=\"Default Organization\",\r\n app_name=\"TestApp\",\r\n module_name=\"Main\",\r\n function_name=\"test_function\",\r\n temperature=0.7,\r\n max_tokens=500\r\n )\r\nexcept APIError as e:\r\n print(f\"API request failed: {e}\")\r\nexcept DatabaseError as e:\r\n print(f\"Database logging failed: {e}\")\r\nexcept ValidationError as e:\r\n print(f\"Parameter validation failed: {e}\")\r\n```\r\n\r\n## Database Schema\r\n\r\nThe library automatically creates the necessary database tables for token usage tracking. All usage data is stored with customer, organization, and application context for detailed analytics.\r\n\r\n## Requirements\r\n\r\n- Python 3.7+\r\n- requests\r\n- PostgreSQL database\r\n- Azure OpenAI service\r\n\r\n## Support\r\n\r\nThis library is developed and maintained exclusively for Hibiz Solutions. For support and questions, please contact the internal development team.\r\n\r\n## License\r\n\r\nProprietary - Hibiz Solutions Internal Use Only\r\n",
"bugtrack_url": null,
"license": null,
"summary": "A comprehensive Python wrapper for Large Language Models with database integration and usage tracking",
"version": "1.0.5",
"project_urls": null,
"split_keywords": [
"llm",
" language-model",
" openai",
" azure",
" gpt",
" ai",
" machine-learning",
" database",
" postgresql",
" mysql",
" mongodb",
" usage-tracking",
" api-wrapper"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "c8630e619ac1dd4075a466e5ec96a0994f4829241d6c5056f10e8378ddd0cfd1",
"md5": "7da69c1ff4a6b4480f14a22ef16bd464",
"sha256": "c772309434f4af432077aaa976831b01f67681bb8edd63e0b53400686e075d88"
},
"downloads": -1,
"filename": "hibiz_llm_wrapper-1.0.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "7da69c1ff4a6b4480f14a22ef16bd464",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 13857,
"upload_time": "2025-07-29T12:17:35",
"upload_time_iso_8601": "2025-07-29T12:17:35.349893Z",
"url": "https://files.pythonhosted.org/packages/c8/63/0e619ac1dd4075a466e5ec96a0994f4829241d6c5056f10e8378ddd0cfd1/hibiz_llm_wrapper-1.0.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d947cd3b1ac37b2141f4c4eb98e6f14b193692c600f63a4f2ff056caff15f35d",
"md5": "2e7d758bf5488e80cb87d04bfa660a3b",
"sha256": "0bc06b6aea8c7b5bc00ffd668f570ddf0f8df5a8713a0b7f4d1863c6bd496511"
},
"downloads": -1,
"filename": "hibiz_llm_wrapper-1.0.5.tar.gz",
"has_sig": false,
"md5_digest": "2e7d758bf5488e80cb87d04bfa660a3b",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 21129,
"upload_time": "2025-07-29T12:17:36",
"upload_time_iso_8601": "2025-07-29T12:17:36.667984Z",
"url": "https://files.pythonhosted.org/packages/d9/47/cd3b1ac37b2141f4c4eb98e6f14b193692c600f63a4f2ff056caff15f35d/hibiz_llm_wrapper-1.0.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-29 12:17:36",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "hibiz-llm-wrapper"
}