SQL Plugin Broker
- class smarter.apps.plugin.manifest.brokers.sql_plugin.SAMSqlPluginBroker(*args, **kwargs)[source]
Broker for Smarter SQL Plugin Manifests.
This class is responsible for loading, validating, and parsing Smarter SQL YAML plugin manifests, and for initializing the corresponding Pydantic model. It provides generic services for SQL plugins, such as instantiation, creation, update, and deletion.
Responsibilities:
Load and validate SQL plugin manifests.
Parse manifest data into a structured Pydantic model (SAMSqlPlugin).
Provide access to plugin metadata, status, and specification.
Manage plugin lifecycle operations (create, update, delete, etc.).
Example Usage:
broker = SAMSqlPluginBroker(manifest=my_manifest) plugin = broker.plugin if plugin.ready: plugin.create() plugin.save()
Parameters:
- Parameters:
manifest (Optional[SAMSqlPlugin]) – Optional; a SAMSqlPlugin Pydantic model instance representing the plugin manifest.
Note
If the manifest kind does not match the expected plugin kind, or if required fields are missing, the broker may raise a SAMPluginBrokerError or related exception.
- property ORMMetaModelClass: Type[PluginMeta]
Return the Django ORM meta model class for the broker.
- Returns:
The Django ORM meta model class definition for the broker.
- Return type:
Type[PluginMeta]
- property ORMModelClass: Type[PluginDataSql]
Return the Django ORM model class for the broker.
- Returns:
The Django ORM model class definition for the broker.
- Return type:
Type[PluginDataSql]
- property SAMModelClass: Type[SAMSqlPlugin]
Return the Pydantic model class for the broker.
- Returns:
The Pydantic model class definition for the broker.
- Return type:
Type[SAMSqlPlugin]
- property SerializerClass: Type[PluginSerializer]
Returns the serializer class for the broker.
This property provides the serializer class definition used by the broker for serializing and deserializing plugin data. It returns the PluginSerializer class, which is specifically designed to handle static plugin data serialization.
- Returns:
The serializer class definition for the broker.
- Return type:
Type[PluginSerializer]
Example:
broker = SAMStaticPluginBroker() serializer_class = broker.SerializerClass print(serializer_class.__name__) # Output: "PluginSerializer"
See also
PluginSerializer for static plugin data serialization.
- __init__(*args, **kwargs)[source]
Initialize the SAMSqlPluginBroker instance.
This constructor initializes the broker by calling the parent class’s constructor, which will attempt to bootstrap the class instance with any combination of raw manifest data (in JSON or YAML format), a manifest loader, or existing Django ORM models. If a manifest loader is provided and its kind matches the expected kind for this broker, the manifest is initialized using the loader’s data.
This class can bootstrap itself in any of the following ways:
request.body (yaml or json string)
name + account (determined via authentication of the request object)
SAMLoader instance
manifest instance
filepath to a manifest file
If raw manifest data is provided, whether as a string or a dictionary, or a SAMLoader instance, the base class constructor will only goes as far as initializing the loader. The actual manifest model initialization is deferred to this constructor, which checks the loader’s kind.
- Parameters:
args – Positional arguments passed to the parent constructor.
kwargs – Keyword arguments passed to the parent constructor.
Example:
broker = SAMSqlPluginBroker(loader=loader, plugin_meta=plugin_meta)
See also
SAMPluginBaseBroker.__init__
- property abstract_broker_logger_cache_invalidation_prefix: str
Return the logger prefix for the AbstractBroker cache invalidation.
- Returns:
The logger prefix for the AbstractBroker.
- Return type:
- property abstract_broker_logger_prefix: str
Return the logger prefix for the AbstractBroker.
- Returns:
The logger prefix for the AbstractBroker.
- Return type:
- property abstract_broker_ready_state: str
Return a string representation of the AbstractBroker’s ready state.
- Returns:
“READY” if the AbstractBroker is ready, otherwise “NOT_READY”.
- Return type:
- property account: Account | None
Returns the account for the current user.
Handle lazy instantiation from user or user_profile.
- Returns:
The account for the current user.
- Return type:
Account or None
- property account_number: str | None
A helper function to get the account number from the account.
- Returns:
The account number for the current account.
- Return type:
str or None
- property am_ready: bool
Returns True if the AccountMixin is am_ready to be used.
This is a convenience property that checks if the account and user are initialized. AccountMixin is considered am_ready if: - self.user is an instance of User - self.user_profile is an instance of UserProfile - self.account is an instance of Account
- Returns:
True if the AccountMixin is am_ready to be used.
- Return type:
- property api_subdomain: str | None
Extracts the API subdomain from the URL.
- Returns:
The API subdomain or None if not found.
example:
- https://hr.3141-5926-5359.alpha.api.example.com/llm-client/ returns 'hr'
- property api_token: bytes | None
Get the API token from the request.
- Returns:
The API token as bytes if present in the Authorization header, otherwise None.
Example:
request_mixin = SmarterRequestMixin(request) token = request_mixin.api_token
- Returns:
The API token as bytes, or None if not present.
- property api_version: str
The API version of the manifest.
- Returns:
The API version of the manifest.
- Return type:
Optional[str]
- apply(request, *args, **kwargs)[source]
Apply the manifest: copy manifest data to the Django ORM model and save it to the database.
This method loads and validates the manifest, then applies its data to the corresponding Django ORM model. The plugin is created and, if ready, saved to the database. The response includes the serialized plugin data or an error message if the operation fails.
- Parameters:
request (
HttpRequest) – The HTTP request object.args – Additional positional arguments (unused).
kwargs – Additional keyword arguments for customization.
- Returns:
A SmarterJournaledJsonResponse indicating success or failure.
- Return type:
Example:
response = broker.apply(request) print(response.data)
- Raises:
SAMPluginBrokerError – If the manifest is not set or is not a valid SAMSqlPlugin
SAMBrokerErrorNotReady – If the plugin is not ready
See also
SAMSqlPluginBroker.manifest()SAMSqlPluginSqlPluginSmarterJournaledJsonResponseSAMPluginBrokerErrorSAMBrokerErrorNotReady
- property auth_header: str | None
Get the Authorization header from the request.
Example:
request_mixin = SmarterRequestMixin(request) print(request_mixin.auth_header)
This property checks for the “Authorization” header in the request headers or in the Django META dictionary.
- Returns:
The value of the “Authorization” header as a string, or None if not present.
- bool_environment_variable(var_name, default=False)
Retrieves a boolean value from an environment variable.
This method checks the specified environment variable and returns its value as a boolean. It recognizes common truthy values such as “true”, “1”, “yes”, and “on”. If the variable is not set or cannot be interpreted as a boolean, it returns the provided default value.
- cache_invalidations()[source]
Invalidate any relevant caches when the manifest or plugin data changes.
- Return type:
- property cache_key: str | None
Returns a cache key for the request.
This is used to cache the prompt request thread. The key is a combination of: - the class name, - authenticated username, - the prompt name, - and the client UID.
Currently used by the ApiV1CliPromptConfigApiView and ApiV1CliPromptApiView as a means of sharing the session_key.
- Parameters:
name – A generic object or resource name.
uid – UID of the client, assumed to have been created from the machine MAC address and the hostname of the client.
- Returns:
A unique cache key string.
Example:
request_mixin = SmarterRequestMixin(request) key = request_mixin.cache_key print(key) # e.g., 'a1b2c3d4e5f6...'
- clean_cli_param(param, param_name='unknown', url=None)
Remove any leading or trailing whitespace from the param.
Ensure that the param is a string.
Return the cleaned param.
- clear_cached_properties()
Clears all cached properties in this mixin.
- property created: bool
Return True if the broker was created successfully.
- Returns:
True if the broker was created successfully.
- Return type:
- property data: dict | list | str | None
Get the request body data as a dictionary, list or str.
Used for setting the session_key.
- Returns:
The request body data as a dict, list, or str, or None if not available.
Example:
request_mixin = SmarterRequestMixin(request) data = request_mixin.data print(data) # e.g., {'session_key': 'abc123', ...}
- data_to_dict(data)
Converts data to a dictionary, handling different types of input.
This method accepts either a dictionary or a string. If a string is provided, it will attempt to parse it as JSON first, and if that fails, as YAML. If parsing fails or the data type is unsupported, a SmarterValueError is raised.
- delete(request, *args, **kwargs)[source]
Delete the SQL plugin.
This method deletes the SQL plugin associated with this broker. It verifies that the plugin is of the correct type and is ready before attempting deletion. If successful, it returns a JSON response indicating success; otherwise, it raises appropriate errors.
- Raises:
SAMPluginBrokerError: If the plugin or plugin metadata is not properly initialized.
- Raises:
SAMBrokerErrorNotReady: If the plugin is not ready for deletion.
- Parameters:
request (
HttpRequest) – The HTTP request object.args – Additional positional arguments (unused).
kwargs – Additional keyword arguments (unused).
- Returns:
A SmarterJournaledJsonResponse indicating success or failure of the deletion.
- Return type:
See also
SqlPluginSmarterJournaledJsonResponseSAMPluginBrokerErrorSAMBrokerErrorNotReadySmarterJournalCliCommands
- deploy(request, *args, **kwargs)[source]
Deploy the SQL plugin (not implemented).
This is not implemented for SQL plugins.
- Raises:
SAMBrokerErrorNotImplemented: Always raised to indicate that this method is not implemented.
- Parameters:
request (
HttpRequest) – The HTTP request object.args – Additional positional arguments (unused).
kwargs – Additional keyword arguments (unused).
- Returns:
A SmarterJournaledJsonResponse indicating that the method is not implemented.
- Return type:
- describe(request, *args, **kwargs)[source]
Return a JSON response with the manifest data for this SQL plugin.
This method serializes the current SQL plugin’s manifest, metadata, specification, and status into a structured JSON response, suitable for API clients or UI inspection. It validates the manifest by round-tripping the data through the Pydantic model to ensure schema compliance.
- Parameters:
request (
HttpRequest) – The HTTP request object.args – Additional positional arguments (unused).
kwargs – Additional keyword arguments for customization.
- Returns:
A SmarterJournaledJsonResponse containing the manifest data.
- Return type:
Example:
response = broker.describe(request) print(response.data)
- Raises:
SAMPluginBrokerError – If required plugin components are not initialized.
SAMBrokerErrorNotReady – If the broker is not ready to describe the plugin.
See also
SAMSqlPluginBroker.manifest()SmarterJournaledJsonResponseSAMPluginBrokerErrorSAMBrokerErrorNotReadySqlPluginSmarterJournalCliCommandsSAMSqlPluginSAMKeysSqlDataSAMPluginSpecKeysSAMPluginMeta
- deserves_amnesty(slug)
Determines if a given URL deserves amnesty based on the amnesty URLs list.
This excuses certain endpoints (like health checks) from select middleware checks.
- dict_is_contained_in(dict1, dict2)
Checks if one dictionary is contained within another.
This method determines if all key-value pairs in dict1 are present in dict2.
- dict_is_subset(small, big)
Checks if one dictionary is a subset of another.
This method determines if all key-value pairs in the small dictionary are present in the big dictionary. It returns True if the small dictionary is a subset of the big dictionary, and False otherwise.
- property domain: str | None
Extracts the domain from the URL.
- Returns:
The domain or None if not found.
examples:
- https://hr.3141-5926-5359.alpha.api.example.com/llm-client/ returns 'hr.3141-5926-5359.alpha.api.example.com'
- eval_llm_client_url()
If we are an llm_client, based on analysis of the URL format.
then we need to make a follow up check of the user and account.
Examples
- 1.) For named urls, we extract the account number from the url,
then we load the account and admin user for that account.
- 2.) For smarter api urls, we would extract the llm_client id from the url,
then we would load the llm_client, account, and admin user for that account.
- 3.) For cli api urls, we would extract the llm_client name from the url,
then we would load the llm_client, account, and admin user for that account.
- example_manifest(request, *args, **kwargs)[source]
Returns an example SQL plugin manifest as a JSON response.
This method generates a sample manifest for the SQL plugin using the static
example_manifestmethod of the SqlPlugin class. The response is wrapped in a SmarterJournaledJsonResponse for consistency with the Smarter API’s journaling and response conventions.- Parameters:
request (
HttpRequest) – The HTTP request object.args – Additional positional arguments (unused).
kwargs – Additional keyword arguments passed to the example manifest generator.
- Returns:
A JSON response containing the example SQL plugin manifest.
- Return type:
Example:
response = broker.example_manifest(request) print(response.data)
See also
SqlPlugin.example_manifest()SmarterJournaledJsonResponse
- find_session_key()
Returns the unique prompt session key value for this request.
The session_key is managed by the /config/ endpoint for the llm_client. The React app calls this endpoint at app initialization to get a JSON dict that includes, among other info, this session_key, which uniquely identifies the device and the individual llm_client session for the device.
For subsequent prompt prompt requests, the session_key is intended to be sent in the body of the request as a key-value pair, e.g. {“session_key”: “1234567890”}.
This method will also check the request headers and cookies for the session_key. The session key can be found in one of the following:
URL parameter: http://localhost:9357/workbench/example/config/?session_key=1aeee4c1f183354247f43f80261573da921b0167c7c843b28afd3cb5ebba0d9a
Request JSON body: {‘session_key’: ‘1aeee4c1f183354247f43f80261573da921b0167c7c843b28afd3cb5ebba0d9a’}
Request header: {‘session_key’: ‘1aeee4c1f183354247f43f80261573da921b0167c7c843b28afd3cb5ebba0d9a’}
Cookie
A session_key generator
- property formatted_class_name: str
Returns a formatted class name for logging.
This property provides a human-readable, fully qualified class name, which is especially useful for log messages and debugging output. The format includes the parent class’s formatted name, followed by the current class name.
- Returns:
A string representing the formatted class name, e.g.,
ParentClass.SAMSqlPluginBroker().- Return type:
Example:
broker = SAMSqlPluginBroker(manifest=my_manifest) print(broker.formatted_class_name) # Output: ParentClass.SAMSqlPluginBroker()
- property formatted_class_name_cache_invalidations: str
Return the logger prefix for the AbstractBroker cache invalidations.
- Returns:
The logger prefix for the AbstractBroker cache invalidations.
- Return type:
- formatted_json(json_obj)
Formats a JSON object as a pretty-printed string with ANSI color codes for logging.
- property formatted_state_not_ready: str
Returns the not-ready state formatted for logging.
- Returns:
The formatted not-ready state as a string.
- Return type:
- property formatted_state_ready: str
Returns the readiness state formatted for logging.
- Returns:
The formatted readiness state as a string.
- Return type:
- formatted_text(text, color_code='\\x1b[1;31m')
Formats text with ANSI color codes for logging.
- formatted_text_blue(text)
Formats text in bold dark blue for logging.
- formatted_text_green(text)
Formats text in bright green for logging.
- formatted_text_red(text)
Formats text in dark red for logging.
- generate_fernet_encryption_key()
Generates a Fernet encryption key.
This method creates a new Fernet encryption key, which can be used for secure encryption and decryption of data. The generated key is returned as a URL-safe base64-encoded string.
- Returns:
A new Fernet encryption key.
- Return type:
- generate_session_key()
Generate a session_key based on a unique string and the current datetime.
- Return type:
- Returns:
A unique session key string.
- get(request, *args, **kwargs)
Return a JSON response with a list of SQL plugins for this account.
This method queries the database for all SQL plugins associated with the current account, optionally filtered by name, and returns a structured JSON response containing their serialized representations. Each plugin is validated by round-tripping through the Pydantic model.
- Parameters:
request (
HttpRequest) – The HTTP request object.args – Additional positional arguments (unused).
kwargs – Additional keyword arguments, such as filter criteria (e.g.,
name).
- Returns:
A SmarterJournaledJsonResponse containing a list of SQL plugin manifests and metadata.
- Return type:
Example:
response = broker.get(request, name="my_plugin") print(response.data)
- Raises:
SAMPluginBrokerError – If a plugin cannot be serialized or validated during the retrieval process.
See also
PluginMetaPluginSerializerSAMSqlPluginSmarterJournaledJsonResponseSmarterJournalCliCommandsSAMKeysSAMMetadataKeysSCLIResponseGetSCLIResponseGetData
- get_cookie_value(cookie_name)
Retrieve the value of a cookie from the request object.
- Parameters:
request – Django HttpRequest object
cookie_name – Name of the cookie to retrieve
- Returns:
Value of the cookie or None if the cookie does not exist
- get_model_titles(serializer)
For tabular output from get() implementations.
Returns a list of field names and types from the Django model serializer.
- get_or_create_secret(user_profile, name, value=None, description=None, expiration=None)
Get or create a Smarter Secret in the database.
This is used to store secrets that are passed in the manifest.
- Parameters:
- Returns:
The created or retrieved Secret object.
- Return type:
- get_readonly_csv_file(file_path)
Retrieves a read-only file object for a CSV file.
This method opens the specified CSV file in read-only mode and returns a file object that can be used to read its contents. It ensures that the file is not modified during the reading process.
- Parameters:
file_path (
str) – The path to the CSV file to open.- Returns:
A read-only file object for the specified CSV file.
- Return type:
file
- get_readonly_yaml_file(file_path)
Retrieves a read-only file object for a YAML file.
This method opens the specified YAML file in read-only mode and returns a file object that can be used to read its contents. It ensures that the file is not modified during the reading process.
- Parameters:
file_path (
str) – The path to the YAML file to open.- Returns:
A read-only file object for the specified YAML file.
- Return type:
file
- property health_check_urls: list[str]
Returns a list of URL paths that are considered health check endpoints.
- init(*args, **kwargs)
An optional method that can be called after initialization to perform any additional setup.
This is separate from __init__ to allow for more flexible initialization patterns.
- Parameters:
args – Positional arguments passed to the init method.
kwargs – Keyword arguments passed to the init method.
- Return type:
- Returns:
None
- invalidate_cached_properties()
Invalidates all cached properties on the instance to force re-evaluation.
This method removes all attributes cached by @cached_property decorators from the instance’s __dict__. It is useful for testing or when the request object changes and you need to ensure that all dependent properties are recalculated.
Example:
from smarter.lib.django.request import SmarterRequestMixin class Foo(SmarterRequestMixin): pass foo = Foo(request) foo.invalidate_cached_properties(request)
- Raises:
None –
- property ip_address: str | None
Get the client’s IP address from the request object.
This property attempts to extract the IP address from the request’s META dictionary, using the “REMOTE_ADDR” key. If the IP address is not available, it returns None.
- Returns:
The client’s IP address as a string, or None if not found.
- Return type:
Optional[str]
Example:
request_mixin = SmarterRequestMixin(request) ip = request_mixin.ip_address print(ip) # e.g., '192.168.1.100'
- property is_config: bool
Returns True if the URL resolves to a config endpoint.
Examples
http://testserver/api/v1/cli/prompt/config/testc7098865f39202d5/ http://localhost:9357/workbench/example/config/?session_key=1aeee4c1f183354247f43f80261573da921b0167c7c843b28afd3cb5ebba0d9a http://localhost:9357/api/v1/workbench/<int:llm_client_id>/prompt/config/ http://example.api.localhost:9357/config
- Returns:
True if the URL is a config endpoint, otherwise False.
- Return type:
- property is_dashboard: bool
Returns True if the URL resolves to a dashboard endpoint.
- Returns:
True if the URL is a dashboard endpoint, otherwise False.
- Return type:
- property is_default_domain: bool
Returns True if the URL is the default domain for the environment.
Example
api.alpha.platform.smarter.sh
- Returns:
bool: True if the URL is the default environment domain, otherwise False.
- property is_environment_root_domain: bool
Returns True if the URL resolves to the environment root domain.
- Returns:
True if the URL is the environment root domain, otherwise False.
- Return type:
- is_internal_api_request(request)
Check if the request is an internal API request.
This method checks for a custom attribute on the request object that indicates whether the request is an internal API request. This can be used to bypass certain authentication or permission checks for internal requests.
- Parameters:
request (
HttpRequest) – The Django request object.- Returns:
True if it’s an internal API request, False otherwise.
- Return type:
- property is_llm_client: bool
Returns True if the URL resolves to an llm_client endpoint.
Conditions are checked in a lazy sequence to avoid unnecessary processing.
Examples
http://localhost:9357/workbench/llm-clients/<str:hashed_id>/prompt/
http://localhost:9357/workbench/llm-clients/<str:hashed_id>/config/
http://localhost:9357/workbench/llm-clients/<str:hashed_id>/manifest/
- Returns:
True if the URL is an llm_client endpoint, otherwise False.
- Return type:
- property is_llm_client_cli_api_url: bool
9357/api/v1/cli/prompt/example/.
- The expected path parts are:
[‘api’, ‘v1’, ‘cli’, ‘prompt’, ‘example’]
- Returns:
True if the URL matches the CLI llm_client API pattern, otherwise False.
- Return type:
- Type:
Returns True if the URL is of the form http
- Type:
//localhost
- property is_llm_client_named_url: bool
Returns True if the url is of the form:
- Returns:
True if the URL matches the named llm_client pattern, otherwise False.
- Return type:
- property is_llm_client_sandbox_url: bool
Example URLs for llm_client sandbox endpoints.
Examples
Web console urls: - http://localhost:9357/workbench/llm-clients/<str:hashed_id>/prompt/ - http://localhost:9357/workbench/llm-clients/<str:hashed_id>/config/ - http://localhost:9357/workbench/llm-clients/<str:hashed_id>/manifest/
Api urls: - http://localhost:9357/api/v1/prompt/1/prompt/ - http://localhost:9357/api/v1/prompt/1/config/
Manifest view urls: https://alpha.platform.smarter.sh/workbench/llm-clients/hashed_id/ https://<environment_domain>/workbench/llm-clients/<str:hashed_id>/ path_parts: [‘workbench’, ‘llm-clients’, ‘rxy123hashedx’]
- Returns:
True if the URL matches an llm_client sandbox endpoint, otherwise False.
- Return type:
- property is_llm_client_smarter_api_url: bool
Returns True if the URL is of the form:
http://localhost:9357/api/v1/workbench/1/prompt/ path_parts: [‘api’, ‘v1’, ‘workbench’, ‘<int:pk>’, ‘prompt’]
http://localhost:9357/api/v1/llm-clients/1556/prompt/ path_parts: [‘api’, ‘v1’, ‘llm-clients’, ‘<int:pk>’, ‘prompt’]
http://localhost:9357/api/v1/llm-clients/rMTAwMDAwNwx/prompt/ path_parts: [‘api’, ‘v1’, ‘llm-clients’, ‘<str:hashed_id>’, ‘prompt’]
- Returns:
True if the URL matches a smarter API llm_client endpoint, otherwise False.
- Return type:
- property is_ready_abstract_broker: bool
Return True if the AbstractBroker is ready for operations.
An AbstractBroker is considered ready if: - The AccountMixin is ready. - The RequestMixin is ready. - either a valid manifest is loaded or a ready SAMLoader is present.
- Returns:
True if the AbstractBroker is ready for operations.
- Return type:
- property is_smarter_api: bool
9357/api/v1/.
Examples
path_parts: [‘api’, ‘v1’, ‘llm-clients’, ‘1’, ‘prompt’]
- Returns:
True if the URL matches the smarter API pattern, otherwise False.
- Return type:
- Type:
Returns True if the URL is of the form http
- Type:
//localhost
- property is_workbench: bool
Returns True if the URL resolves to a workbench endpoint.
- Returns:
True if the URL is a workbench endpoint, otherwise False.
- Return type:
- json_response_err(command, e)
Return a structured error response that can be unpacked and rendered.
by the cli in a variety of formats.
- Parameters:
command (
SmarterJournalCliCommands) – The command that was executed.e (
Exception) – The exception that was raised.
- Returns:
A SmarterJournaledJsonResponse containing the error response.
- Return type:
- json_response_err_notfound(command, message=None)
Return a common not found response.
- Parameters:
command (
SmarterJournalCliCommands) – The command that was executed.message (
Optional[str]) – An optional custom message to include in the response.
- Returns:
A SmarterJournaledJsonResponse containing the not found response.
- Return type:
- json_response_err_notimplemented(command)
Return a common not implemented response.
- Parameters:
command (
SmarterJournalCliCommands) – The command that was executed.- Returns:
A SmarterJournaledJsonResponse containing the not implemented response.
- Return type:
- json_response_err_notready(command)
Return a common not ready response.
- Parameters:
command (
SmarterJournalCliCommands) – The command that was executed.- Returns:
A SmarterJournaledJsonResponse containing the not ready response.
- Return type:
- json_response_err_readonly(command)
Return a common read-only response.
- Parameters:
command (
SmarterJournalCliCommands) – The command that was executed.- Returns:
A SmarterJournaledJsonResponse containing the read-only response.
- Return type:
- json_response_ok(command, data=None, message=None)
Return a common success response.
- Parameters:
command (
SmarterJournalCliCommands) – The command that was executed.message (
Optional[str]) – An optional message to include in the response.
- Returns:
A SmarterJournaledJsonResponse containing the success response.
- Return type:
- property kind: str
Returns the manifest kind for this plugin broker.
This property provides the canonical string identifier for the SQL plugin manifest type, as defined by the constant
MANIFEST_KIND. It is used to distinguish this broker’s manifest type from others in the Smarter API system.- Returns:
The manifest kind string for SQL plugins.
- Return type:
Example:
broker = SAMSqlPluginBroker(manifest=my_manifest) print(broker.kind) # Output: "SqlPlugin" # (or the value of MANIFEST_KIND)
See also
MANIFEST_KINDSAMSqlPluginBroker.manifest
- kind_setter(value)
Set the kind of manifest.
Validates that the kind is a valid SmarterJournalThings value.
- Raises:
SmarterValueError – If the kind is not valid.
- Parameters:
value (
str) – The kind of manifest to set.
- property loader: SAMLoader | None
The SAMLoader instance for this broker.
- Returns:
The SAMLoader instance for this broker.
- Return type:
Optional[SAMLoader]
- log_abstract_broker_state()
Log the current state of the AbstractBroker instance for debugging purposes.
- Returns:
None
- log_ready_status()
Logs the ready status of the view.
- logs(request, *args, **kwargs)[source]
Retrieve logs for the SQL plugin (not implemented).
This is not implemented for SQL plugins.
- Raises:
SAMBrokerErrorNotImplemented: Always raised to indicate that this method is not implemented.
- Parameters:
request (
HttpRequest) – The HTTP request object.args – Additional positional arguments (unused).
kwargs – Additional keyword arguments (unused).
- Returns:
A SmarterJournaledJsonResponse indicating that the method is not implemented.
- Return type:
- property manifest: SAMSqlPlugin | None
Returns the SQL plugin manifest as a validated Pydantic model instance.
This property constructs and caches a SAMSqlPlugin object using data from the manifest loader, including API version, kind, metadata, specification, and status. Child models (such as metadata, spec, and status) are automatically initialized by Pydantic.
If the manifest loader’s kind matches the expected plugin kind, the manifest is created and cached for future access. If the manifest has already been initialized, the cached instance is returned.
- Returns:
The initialized SQL plugin manifest as a Pydantic model, or
Noneif not available.- Return type:
Optional[SAMSqlPlugin]
Example:
broker = SAMSqlPluginBroker(manifest=None) manifest = broker.manifest if manifest: print(manifest.apiVersion)
See also
SAMSqlPluginSAMSqlPluginBroker.kindSAMPluginCommonMetadataSAMSqlPluginSpecSAMPluginCommonStatus
- manifest_setter(value)
Set the manifest for the broker and override all AbstractBroker.
model properties based on the manifest data.
- Parameters:
value (
Union[AbstractSAMBase,dict[str,Any],None]) – The manifest to set, either as a Pydantic model or a dictionary.
- manifest_to_django_orm()
Convert the Smarter API manifest metadata into a dictionary suitable for creating or updating a Django ORM LLMClient model.
This method extracts all relevant metadata from the loaded manifest and transforms it into a dictionary format compatible with Django ORM operations. The manifest’s configuration is first dumped and converted from camelCase to snake_case to match Django’s field naming conventions.
The resulting dictionary includes the account, name, description, and version fields from the manifest metadata. This dictionary is intended to be used to supplement the model spec when instantiating or updating a LLMClient ORM model instance in the database.
If the manifest is not loaded or is invalid, an exception is raised to indicate that the broker is not ready to perform the transformation.
- Returns:
A dictionary containing all metadata fields required to create or update a Django ORM LLMClient model.
- Return type:
- Raises:
SAMBrokerErrorNotReady – If the manifest is not loaded or cannot be found.
SAMLLMClientBrokerError – If the manifest metadata cannot be converted to a dictionary.
- mask_string(string='', mask_char='*', mask_length=4, string_length=8)
Masks a string for secure logging.
This utility function masks all but the last unmasked_chars characters of the input string, replacing them with asterisks. It is useful for logging sensitive information like API keys or passwords.
- property name: str | None
Retrieve the unique name identifier for the LLMClient instance managed by this broker.
This property accesses the name used to distinguish the LLMClient within the database and across the Smarter platform. The name is first returned from an internal cache if available. If not cached, and if a manifest is present, the name is extracted from the manifest’s metadata and stored for subsequent access.
The name is essential for database queries, model lookups, and for associating related resources such as API keys, plugins, and functions with the correct LLMClient instance.
- Returns:
The name of the LLMClient as a string, or
Noneif the name is not set or cannot be determined.- Return type:
Optional[str]
Note
The name property is a critical identifier used throughout the broker to ensure correct mapping between manifest data and persistent application state.
- name_cached_property_setter(value)
A workaround to the limitation that you cannot use both @cached_property and.
a setter for the same attribute name (name). In Python, you cannot have a property (or cached_property) and a setter with the same name unless you use the @property decorator (not @cached_property).
We need the cached_property so that the lazy evaluation of the name only happens once, and subsequent accesses return the cached value for performance. However, we also need to be able to set the name explicitly in some cases,
- Parameters:
value (
str) – The name to set for the manifest.
- property orm_instance: PluginDataBase | None
Return the Django ORM model instance for the broker.
- Returns:
The Django ORM model instance for the broker.
- Return type:
Optional[TimestampedModel]
- property orm_meta_instance: MetaDataWithOwnershipModel | None
Return the Django ORM meta model instance for the broker.
This is a cached property that retrieves the ORM meta instance based on the user_profile and kind. For simple relational models, the ORM meta class is the same as the ORM class, and the meta instance is the same as the ORM instance.
This property is used for resolving more complex ORM relationships where the name and user_profile fields are stored in a parent Django model.
- orm_meta_instance_setter()
Initialize the ORM metadata for the broker instance.
This method attempts to initialize the ORM metadata by querying the ORMMetaModelClass using the broker’s name and user_profile. If the ORM metadata is successfully retrieved, it is stored in the orm_meta_instance attribute. If the ORM metadata does not exist or an error occurs, the _orm_instance attribute is set to None.
- Return type:
- Returns:
None
- property params: QueryDict | None
Return the query parameters from the url of the request.
there are two scenarios to consider: 1. the request is a Django HttpRequest object (the expected case) 2. the request is a Python PreparedRequest object (the edge case)
- Returns:
The query parameters from the url of the request.
- Return type:
Optional[QueryDict]
- property parsed_url: ParseResult | None
Expose the private ParseResult URL object as a public property.
- Returns:
The parsed URL as a ParseResult object.
Example:
request_mixin = SmarterRequestMixin(request) parsed = request_mixin.parsed_url print(parsed.netloc) # e.g., 'example.com'
- property path: str | None
Extracts the path from the URL.
- Returns:
Optional[str]: The path as a string, or None if not found.
Examples
https://hr.3141-5926-5359.alpha.api.example.com/llm-client/ returns ‘/llm-client/’
- property plugin: SqlPlugin | None
Returns the initialized SqlPlugin instance for this broker.
This property creates and caches a SqlPlugin object using the current broker’s metadata, user profile, manifest, and name. If the plugin has already been initialized, the cached instance is returned.
- Returns:
The initialized SqlPlugin instance, or
Noneif not available.- Return type:
Optional[SqlPlugin]
Example:
broker = SAMSqlPluginBroker(manifest=my_manifest) plugin = broker.plugin if plugin and plugin.ready: plugin.create() plugin.save()
See also
SqlPluginSAMSqlPluginBroker.manifestSAMSqlPluginBroker.plugin_meta
- property plugin_data: PluginDataSql | None
Returns the PluginDataSql ORM object associated with this broker.
This property retrieves and caches the PluginDataSql instance for the current plugin, which is used to store and manage plugin-specific data in the database. If the object does not exist, a warning is logged and
Noneis returned.- Returns:
The PluginDataSql object for this broker, or
Noneif not available.- Return type:
Optional[PluginDataSql]
- Raises:
PluginDataSql.DoesNotExistif the object is not found in the database.
Example:
broker = SAMSqlPluginBroker(manifest=my_manifest) data = broker.plugin_data if data: print(data.connection)
See also
PluginDataSqlSAMSqlPluginBroker.plugin_meta
- plugin_data_orm2pydantic()[source]
Overrides the parent method to map SQL plugin data from ORM to Pydantic.
Converts the plugin data from the Django ORM model format to the Pydantic manifest format.
This method constructs a SqlData Pydantic model using the data associated with the current plugin_meta. It retrieves the data using the ORM-to-Pydantic conversion method.
- Return type:
- Parameters:
parameters (dict) –
An OpenAI API-compliant dictionary of parameters to pass to the API call, e.g.:
{ 'type': 'object', 'required': ['username'], 'properties': { 'unit': { 'enum': ['Celsius', 'Fahrenheit'], 'type': 'string', 'default': 'Celsius', 'description': 'The temperature unit to use.' }, 'username': { 'type': 'string', 'default': 'admin', 'description': 'The username to query.' } }, 'additionalProperties': False }
- Returns:
The plugin data as a Pydantic model.
- Return type:
Example
broker = SAMSqlPluginBroker() sql_data = broker.plugin_data_orm2pydantic() print(sql_data.model_dump_json())
- Raises:
SAMPluginBrokerError – If there is an error retrieving or converting the plugin data.
See also
SqlData
- plugin_init()[source]
Initialize the SQL plugin for this broker.
This method creates an instance of the SqlPlugin class using the current broker’s metadata, user profile, manifest, and name. It assigns the created plugin to the broker’s internal _plugin attribute for future access.
- Return type:
- Returns:
None
Example:
broker = SAMSqlPluginBroker(manifest=my_manifest) broker.plugin_init() plugin = broker.plugin if plugin.ready: plugin.create() plugin.save()
- property plugin_meta: PluginMeta | None
Retrieve the PluginMeta ORM instance associated with this broker.
This property returns the plugin metadata object for the current plugin, resolving it by name and account if not already cached. If the metadata cannot be found, None is returned.
- Returns:
The PluginMeta instance for this broker, or None if unavailable.
- Return type:
Optional[PluginMeta]
Note
The metadata is cached after the first successful lookup for efficient repeated access.
Warning
If the plugin metadata does not exist in the database, no exception is raised; None is returned.
See also
PluginMetaSAMPluginBaseBroker.plugin()SAMPluginBaseBroker.plugin_data()Example usage:
meta = broker.plugin_meta if meta: print(meta.name, meta.account) else: print("No plugin metadata found.")
- plugin_metadata_orm2pydantic()
Convert plugin metadata from the Django ORM model format to the Pydantic manifest format.
This method transforms the plugin metadata, typically retrieved as a dictionary from the Django ORM (PluginMeta), into a Pydantic model (SAMPluginCommonMetadata). It ensures the metadata is properly camel-cased and validated for use in manifest serialization and API responses.
- Returns:
The plugin metadata as a Pydantic model.
- Return type:
- Raises:
SAMPluginBrokerError – If the plugin metadata or plugin instance is not found, or if conversion fails.
Error
Any error during conversion, such as missing metadata or invalid format, is wrapped and raised as
SAMPluginBrokerError.See also
PluginMetaSAMPluginCommonMetadataSAMPluginBaseBroker.plugin_meta()SAMPluginBaseBroker.plugin()Example usage:
metadata = broker.plugin_metadata_orm2pydantic() print(metadata.name, metadata.description)
- property plugin_prompt_orm: PluginPrompt | None
Retrieve the PluginPrompt ORM instance associated with this broker.
This property returns the plugin prompt object for the current plugin metadata. If the prompt cannot be found, None is returned.
- Returns:
The PluginPrompt instance for this broker, or None if unavailable.
- Return type:
Optional[PluginPrompt]
Note
The prompt is retrieved based on the associated PluginMeta.
- plugin_prompt_orm2pydantic()
Convert plugin prompt data from the Django ORM model format to the Pydantic manifest format.
This method transforms the plugin prompt data, typically retrieved as a dictionary from the Django ORM (PluginPrompt), into a Pydantic model (SAMPluginCommonSpecPrompt). It ensures the prompt data is properly camel-cased and validated for use in manifest serialization and API responses.
- Returns:
The plugin prompt data as a Pydantic model.
- Return type:
SAMPluginCommonSpecPrompt- Raises:
SAMPluginBrokerError – If the plugin prompt or plugin instance is not found, or if conversion fails.
Error
Any error during conversion, such as missing prompt data or invalid format, is wrapped and raised as
SAMPluginBrokerError.See also
PluginPromptSAMPluginCommonSpecPromptSAMPluginBaseBroker.plugin_prompt()SAMPluginBaseBroker.plugin()Example usage:
prompt = broker.plugin_prompt_orm2pydantic() print(prompt.template, prompt.variables)
- plugin_selector_orm2pydantic()
Convert plugin selector data from the Django ORM model format to the Pydantic manifest format.
This method transforms the plugin selector data, typically retrieved as a dictionary from the Django ORM (PluginSelector), into a Pydantic model (SAMPluginCommonSpecSelector). It ensures the selector data is properly camel-cased and validated for use in manifest serialization and API responses.
- Returns:
The plugin selector data as a Pydantic model.
- Return type:
SAMPluginCommonSpecSelector- Raises:
SAMPluginBrokerError – If the plugin selector, plugin metadata, or plugin instance is not found, or if conversion fails.
Error
Any error during conversion, such as missing selector data or invalid format, is wrapped and raised as
SAMPluginBrokerError.See also
PluginSelectorSAMPluginCommonSpecSelectorSAMPluginBaseBroker.plugin()SAMPluginBaseBroker.plugin_meta()Example usage:
selector = broker.plugin_selector_orm2pydantic() print(selector.type, selector.options)
- plugin_sql_spec_orm2pydantic()[source]
Convert the static plugin specification from the Django ORM model format to the Pydantic manifest format.
This method constructs a SAMPluginStaticSpec Pydantic model using the prompt, selector, and static data associated with the current plugin_meta. It retrieves each component using their respective ORM-to-Pydantic conversion methods.
- Returns:
The static plugin specification as a Pydantic model.
- Return type:
Example:
broker = SAMStaticPluginBroker() static_spec = broker.plugin_static_spec_orm2pydantic() print(static_spec.model_dump_json())
- Raises:
SAMPluginBrokerError – If there is an error retrieving or converting any component of the plugin specification.
See also
SAMPluginStaticSpec
SAMPluginCommonSpecPrompt
SAMPluginCommonSpecSelector
SAMPluginStaticSpecData
- plugin_status_pydantic()
Get the plugin status as a Pydantic model.
This method retrieves the plugin status from the Django ORM model and converts it into a Pydantic model (SAMPluginCommonStatus). It ensures that the status information is properly formatted for use in manifest serialization and API responses.
- Returns:
The plugin status as a Pydantic model.
- Return type:
See also
SAMPluginCommonStatusSAMPluginBaseBroker.plugin_meta()SAMPluginBaseBroker.plugin()Example usage:
status = broker.plugin_status_pydantic() print(status.active, status.last_updated)
- prompt(request, *args, **kwargs)[source]
Prompt with the SQL plugin (not implemented).
This is not implemented for SQL plugins.
- Raises:
SAMBrokerErrorNotImplemented: Always raised to indicate that this method is not implemented.
- Parameters:
request (
HttpRequest) – The HTTP request object.args – Additional positional arguments (unused).
kwargs – Additional keyword arguments (unused).
- Returns:
A SmarterJournaledJsonResponse indicating that the method is not implemented.
- Return type:
- property qualified_request: bool
A cursory screening of the WSGI request object to look for.
any disqualifying conditions that confirm this is not a request that we are interested in.
The request is considered “qualified” if all of the following are true:
The request object (self._smarter_request) is present.
The URL path is present and non-empty.
The request does not originate from an internal AWS Kubernetes subnet (netloc starts with 192.168).
The path is not in the list of amnesty_urls.
The path does not start with /admin/.
The path does not start with /docs/.
The path does not end with a static file extension (e.g., .css, .js, .png, .jpg, .jpeg, .gif, .svg, .woff, .woff2, .ttf, .eot, .ico).
- Returns:
True if the request passes all checks and is of interest, otherwise False.
Example:
# True case: a valid llm_client request request_mixin = SmarterRequestMixin(request) if request_mixin.qualified_request: print("This is a qualified llm_client request.") # False case: a static asset or admin/docs request static_request = SmarterRequestMixin(static_asset_request) if not static_request.qualified_request: print("This request is not of interest.")
- property ready: bool
Check if the broker is ready for operations.
This property determines whether the broker has been properly initialized and is ready to perform its functions. A broker is considered ready if it has a valid manifest loaded, either from raw data, a loader, or existing Django ORM models.
- Returns:
Trueif the broker is ready,Falseotherwise.- Return type:
- property ready_state: str
Return a string representation of the broker’s ready state.
- Returns:
“READY” if the broker is ready, otherwise “NOT_READY”.
- Return type:
- recursive_sort_dict(data)
Recursively sorts a dictionary by its keys.
This method takes a dictionary and returns a new dictionary with all keys sorted in ascending order. If any values are also dictionaries, they will be sorted recursively as well.
- property request: HttpRequest | None
Return the request object.
- Returns:
The request object.
- Return type:
Optional[HttpRequest]
- rfc1034_compliant_str(name)
Converts a string to an RFC 1034 compliant format.
This method takes a string and converts it to a format that complies with RFC 1034, which is commonly used for domain names. It replaces invalid characters with hyphens and ensures the resulting string is lowercase.
- rfc1034_compliant_to_snake(name)
Converts an RFC 1034 compliant string to snake_case.
This method takes a string in RFC 1034 compliant format and converts it to snake_case. It replaces hyphens with underscores and ensures the resulting string is lowercase.
- property root_domain: str | None
Extracts the root domain from the URL.
- Returns:
The root domain or None if not found.
Example:
request_mixin = SmarterRequestMixin(request) print(request_mixin.root_domain) # For 'https://hr.3141-5926-5359.alpha.api.example.com/llm-client/' → 'smarter.sh' # For 'http://localhost:9357/' → 'localhost'
- schema(request, *args, **kwargs)
Return the published JSON schema for the Pydantic model.
- Parameters:
request (
HttpRequest) – The HTTP request object.args – Additional positional arguments.
kwargs – Additional keyword arguments.
- Returns:
A SmarterJournaledJsonResponse containing the JSON schema.
- Return type:
- property session_key: str
Getter for the session_key property.
The session_key is a unique identifier for a prompt session. It is used to identify the prompt session across multiple requests. If the session_key is not already set, it attempts to find it in the URL parameters. Barring that, it generates a new one.
- Returns:
The session key as a string.
Example:
request_mixin = SmarterRequestMixin(request) session_key = request_mixin.session_key print(session_key) # e.g., '38486326c21ef4bcb7e7bc305bdb062f16ee97ed8d2462dedb4565c860cd8ecc'
- set_and_verify_name_param(*args, command=None, **kwargs)
Set self.name from the ‘name’ query string param and then verify that it.
was actually passed.
- Parameters:
command (
Optional[SmarterJournalCliCommands]) – The command being executed, for error reporting purposes.- Raises:
SAMBrokerErrorNotReady – If neither a manifest nor a name param is provided.
- Returns:
None
- set_is_internal_api_request(request, value=True)
Set the internal API request attribute on the request object.
This method allows you to mark a request as an internal API request by setting a custom attribute on the request object. This can be used in middleware or views to indicate that the request should be treated as internal.
- Parameters:
request (
HttpRequest) – The Django request object.value (
bool) – The value to set for the internal API request attribute (default is True).
- Returns:
The modified Django request object.
- Return type:
- setup(*args, request=None, user=None, **kwargs)
Setup method to initialize the SmarterRequestMixin with the request and user.
This method is called during the setup phase of a Django view. It initializes the request and user attributes of the mixin. The request is set using the smarter_request property setter, which also handles URL parsing and user authentication.
- Parameters:
args – Positional arguments passed to the setup method.
request (
Optional[HttpRequest]) – The HTTP request object to be associated with this mixin instance.user (
Union[AnonymousUser,User,None]) – The user associated with the request, if available.kwargs – Keyword arguments passed to the setup method.
- Returns:
None
- smarter_build_absolute_uri(request)
Attempts to get the absolute URI from a request object.
This utility function tries to retrieve the request URL from any valid child class of
django.http.HttpRequest. It is especially useful in unit tests or scenarios where the request object may not implementbuild_absolute_uri().- Parameters:
request (
HttpRequest) – The request object.- Returns:
The absolute request URL.
- Return type:
- Raises:
SmarterValueError – If the URI cannot be built from the request.
- property smarter_request: Request | HttpRequest | ASGIRequest | MagicMock | None
Returns the current request object.
This property is named to avoid potential name collisions in child classes. This property is preferred over standard Django request types in that it more elegantly resolves idiosyncratic usage like Unit tests, Sphinx docs, and other non-standard request objects.
Example:
request_mixin = SmarterRequestMixin(request) req = request_mixin.smarter_request
- Returns:
The current request object.
- property smarter_request_llm_client_id: int | None
Extract the llm_client id from the URL.
Example
http://localhost:9357/workbench/llm-clients/rMTAwMDAyNwx/prompt/
returns the pk id that when decoded from the hashed ID format corresponds to the llm_client id.
- Returns:
The llm_client id as an integer, or None if not found.
- property smarter_request_llm_client_name: str | None
Extract the llm_client name from the URL.
Example
http://example.3141-5926-5359.api.localhost:9357/config
returns “example”
- Returns:
The llm_client name as a string, or None if not found.
- property smarter_request_user: AnonymousUser | User | None
Returns the user associated with the request.
This property is named to avoid potential name collisions in child classes. It retrieves the user from the request object if available.
Example:
request_mixin = SmarterRequestMixin(request) user = request_mixin.smarter_request_user
- Returns:
The user associated with the request, or None if not available.
- sorted_dict(data)
Returns a new dictionary with keys sorted.
- property srm_formatted_class_name: str
Returns the class name in a formatted string.
along with the name of this mixin.
- Returns:
Formatted class name string.
- property srm_ready: bool
Returns True if the request mixin is srm_ready for processing.
This is a convenience property to check if the request is srm_ready.
- Returns:
True if the request mixin is srm_ready, False otherwise.
- property subdomain: str | None
Extracts the subdomain from the URL.
- Returns:
The subdomain or None if not found.
Example:
request_mixin = SmarterRequestMixin(request) sub = request_mixin.subdomain print(sub) # e.g., 'hr.3141-5926-5359.alpha' for # 'https://hr.3141-5926-5359.alpha.api.example.com/llm-client/'
- property thing: SmarterJournalThings
The Smarter Journal Thing for this broker.
- Returns:
The Smarter Journal Thing for this broker.
- Return type:
SmarterJournalThings, an enumeration of all Smarter AI resource types.
- property timestamp
Create a consistent timestamp based on the time that this object was instantiated.
- Returns:
The timestamp as a datetime object.
Example:
request_mixin = SmarterRequestMixin(request) ts = request_mixin.timestamp print(ts) # e.g., 2025-12-01 12:34:56.789012
- to_camel_case(data, convert_values=False)
Converts a snake_case string to camelCase.
This method takes a string in snake_case format and converts it to camelCase. It is useful for standardizing naming conventions across different formats.
- to_json()
Serialize the broker instance to a JSON string.
- to_snake_case(data, convert_values=False)
Converts a camelCase or PascalCase string to snake_case.
This method takes a string in camelCase or PascalCase format and converts it to snake_case. It is useful for standardizing naming conventions across different formats.
- property uid: str | None
Unique identifier for the client.
This is assumed to be a combination of the machine MAC address and the hostname.
- Returns:
The client UID as a string, or None if not available.
Example:
request_mixin = SmarterRequestMixin(request) uid = request_mixin.uid print(uid) # e.g., '00:1A:2B:3C:4D:5E-myhost'
- undeploy(request, *args, **kwargs)[source]
Undeploy the SQL plugin (not implemented).
This is not implemented for SQL plugins.
- Raises:
SAMBrokerErrorNotImplemented: Always raised to indicate that this method is not implemented.
- Parameters:
request (
HttpRequest) – The HTTP request object.args – Additional positional arguments (unused).
kwargs – Additional keyword arguments (unused).
- Returns:
A SmarterJournaledJsonResponse indicating that the method is not implemented.
- Return type:
- property unformatted_class_name: str
Returns the raw class name without formatting.
- Returns:
The unformatted class name as a string.
- Return type:
This is useful for logging or serialization where the plain class name is needed.
- property unique_client_string: str
Generate a unique string based on several request attributes.
This string is used for generating session_key and client_key.
- The unique string is composed of:
Account number
URL
User agent
IP address
Timestamp
- Returns:
A unique string representing the client and request context.
- Return type:
Example:
request_mixin = SmarterRequestMixin(request) unique_str = request_mixin.unique_client_string print(unique_str)
- property uri: str | None
Return the full uri of the request.
- Returns:
The full uri of the request.
- Return type:
Optional[str]
- property url: str | None
The string representation of the ParseResult object stored in _parsed_url.
- Returns:
The URL as a string.
Example:
request_mixin = SmarterRequestMixin(request) url_str = request_mixin.url print(url_str) # e.g., 'https://example.com/path/'
- property url_account_number: str | None
Extract the account number from the URL using the pattern defined in.
SmarterValidator.VALID_ACCOUNT_NUMBER_PATTERN.
Example
http://example.3141-5926-5359.api.localhost:9357/config
returns “3141-5926-5359”
- Returns:
The account number as a string, or None if not found.
- property url_path_parts: list[str]
Extract the path parts from the URL.
- Returns:
A list of strings representing each part of the URL path.
Example:
request_mixin = SmarterRequestMixin(request) parts = request_mixin.url_path_parts print(parts) # e.g., ['api', 'v1', 'workbench', '1', 'prompt']
- property user: AnonymousUser | User | None
Returns the user.
Handle lazy instantiation from user_profile or account.
- Returns:
The user.
- Return type:
User or None
- property user_agent: str | None
Get the client’s user agent string from the request object.
This property attempts to extract the user agent from the request’s META dictionary, using the “HTTP_USER_AGENT” key. If the user agent is not available, it returns a default value.
- Returns:
The client’s user agent string, or None if not found.
- Return type:
Optional[str]
Example:
request_mixin = SmarterRequestMixin(request) ua = request_mixin.user_agent print(ua) # e.g., 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...'
- property user_profile: UserProfile | None
Returns the user_profile for the current user.
Handle lazy instantiation from user or account.
- Returns:
The user_profile for the current user.
- Return type:
UserProfile or None