ApiConnection Model
- class smarter.apps.plugin.models.ApiConnection(*args, **kwargs)[source]
Bases:
ConnectionBaseStores API connection configuration for a Smarter plugin.
This model defines the connection details for a remote API used by a plugin, including authentication method, base URL, credentials, timeout, and proxy settings. It provides methods for testing the API and proxy connections, and for validating the configuration.
ApiConnectionis a concrete subclass ofConnectionBaseand is referenced byPluginDataApito provide the connection for API-based plugins. It supports a variety of authentication methods (none, basic, token, OAuth), as well as proxy configuration for secure and flexible integration with external APIs.- This model is responsible for:
Managing API credentials and secrets using the
Secretmodel.Constructing connection strings and request headers for different authentication schemes.
Providing methods for testing connectivity to the API and proxy endpoints.
Supporting timeout and proxy configuration for robust and secure API access.
Integrating with the Smarter plugin system to enable dynamic, authenticated API requests.
Typical use cases include plugins that need to retrieve or send data to external REST APIs, integrate with third-party services, or expose organizational APIs to the Smarter LLM platform.
See also:
ConnectionBasesmarter.apps.account.models.Secret
- Parameters:
id (BigAutoField) – Primary key: ID
created_at (DateTimeField) – Created at
updated_at (DateTimeField) – Updated at
name (CharField) – Name. Name in camelCase, e.g., ‘apiKey’, no special characters.
description (TextField) – Description. A brief description of this resource. Be verbose, but not too verbose.
version (CharField) – Version. Semantic version in the format MAJOR.MINOR.PATCH, e.g., ‘1.0.0’.
annotations (JSONField) – Annotations. Key-value pairs for annotating this resource.
kind (CharField) – Kind. The kind of connection. Example: ‘SQL’, ‘API’.
base_url (URLField) – Base url. The root domain of the API. Example: ‘https://api.example.com’.
auth_method (CharField) – Auth method. The authentication method to use. Example: ‘Basic Auth’, ‘Token Auth’.
timeout (IntegerField) –
Timeout. The timeout for the API request in seconds. Default is 30 seconds.
The timeout for the database connection in seconds. Default is 30 seconds.
proxy_protocol (CharField) –
Proxy protocol. The protocol to use for the proxy connection.
The protocol to use for the proxy connection.
proxy_host (CharField) –
Proxy host
The remote host of the SQL proxy connection. Should be a valid internet domain name.
proxy_port (IntegerField) –
Proxy port
The port of the SQL proxy connection. 8080 is a common default for HTTP proxies. 3128 is another common default for HTTP proxies. 1080 is a common default for SOCKS proxies. 8080 is a reasonable default as it is widely used for HTTP proxies.
proxy_username (CharField) –
Proxy username
The username for the proxy connection.
Relationship fields:
- Parameters:
user_profile (
ForeignKeytoUserProfile) – User profile (related name:apiconnections)api_key (
ForeignKeytoSecret) – Api key. The API key for authentication, if required. (related name:api_connections_api_key)proxy_password (
ForeignKeytoSecret) –Proxy password. The proxy password for authentication, if required. (related name:
api_connections_proxy_password)The password for the proxy connection, if required.
See:
smarter.apps.account.models.Secrettags (
TaggableManagertoTag) – Tags. Tags for categorizing and organizing this resource. (related name:apiconnection)tagged_items (
GenericRelationtoTaggedItem) – Tagged items (related name:+)
Reverse relationships:
- Parameters:
plugin_data_api_connection (Reverse
ForeignKeyfromPluginDataApi) – All plugin data api connection of this API Connection (related name ofconnection)
- AUTH_METHOD_CHOICES = [('none', 'None'), ('basic', 'Basic Auth'), ('token', 'Token Auth'), ('oauth', 'OAuth')]
- CONNECTION_KIND_CHOICES = [('SqlConnection', 'SqlConnection'), ('ApiConnection', 'ApiConnection')]
- exception DoesNotExist
Bases:
ObjectDoesNotExist- __init__(*args, **kwargs)
- add_note(object, /)
Exception.add_note(note) – add a note to the exception
- args
- silent_variable_failure = True
- with_traceback(object, /)
Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.
- HASH_FLOOR = 1000000
- HASH_PREFIX = 'r'
- HASH_SUFFIX = 'x'
- exception MultipleObjectsReturned
Bases:
MultipleObjectsReturned- __init__(*args, **kwargs)
- add_note(object, /)
Exception.add_note(note) – add a note to the exception
- args
- with_traceback(object, /)
Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.
- PROXY_PROTOCOL_CHOICES = [('http', 'HTTP'), ('https', 'HTTPS'), ('socks', 'SOCKS')]
- __init__(*args, **kwargs)
- async adelete(using=None, keep_parents=False)
- property amnesty_urls: list[str]
Returns a list of URLs that are exempt from certain checks.
This is a placeholder and should be overridden in subclasses.
- annotations
-
Annotations. Key-value pairs for annotating this resource.
- Type:
Type
- api_key
ForeignKeytoSecretApi key. The API key for authentication, if required. (related name:
api_connections_api_key)- Type:
Type
- api_key_id
Internal field, use
api_keyinstead.
- async arefresh_from_db(using=None, fields=None, from_queryset=None)
- async asave(*args, force_insert=False, force_update=False, using=None, update_fields=None)
- auth_method
-
Auth method. The authentication method to use. Example: ‘Basic Auth’, ‘Token Auth’.
Choices:
nonebasictokenoauth
- Type:
Type
- base_url
-
Base url. The root domain of the API. Example: ‘https://api.example.com’.
- Type:
Type
- cache_expiration = 60
- classmethod check(**kwargs)
- clean()
Hook for doing any extra model-wide validation after clean() has been called on every field by self.clean_fields. Any ValidationError raised by this method will not be associated with a particular field; it will have a special-case association with the field defined by NON_FIELD_ERRORS.
- clean_fields(exclude=None)
Clean all fields and raise a ValidationError containing a dict of all validation errors if any occur.
- property connection_string: str
Return the connection string.
- created_at
-
Created at
Timestamp indicating when the model instance was created. This field is automatically set to the current date and time when the instance is first created. It is indexed in the database for efficient querying.
- Type:
Type
- 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.
- date_error_message(lookup_type, field_name, unique_for)
- delete(using=None, keep_parents=False)
- description
-
Description. A brief description of this resource. Be verbose, but not too verbose.
- Type:
Type
- property elapsed_updated: int | None
Calculate the absolute time difference in seconds between a given datetime and the model’s
updated_attimestamp.This property is useful for determining how much time has elapsed since the model instance was last updated, or for comparing the
updated_atfield to any arbitrary datetime.Parameters:
dt (datetime, optional): The reference datetime to compare against
updated_at. - Ifdtis not provided, the current time is used. - Both naive and timezone-aware datetime objects are supported; the method will handle conversions as needed.
Returns:
int or None: The absolute difference in seconds between
updated_atanddt. ReturnsNoneifupdated_atis not set.
Example Usage:
obj = MyModel.objects.get(pk=1) # Time since last update seconds = obj.elapsed_updated print(f"Seconds since last update: {seconds}") # Compare to a specific datetime import datetime dt = datetime.datetime(2025, 12, 1, 12, 0, 0) diff = obj.elapsed_updated(dt) print(f"Seconds between updated_at and 2025-12-01 12:00:00: {diff}")
Note
Handles both naive and aware datetime objects, converting as necessary to ensure accurate calculation.
If
updated_atis not set (e.g., the object has not been saved), returnsNone.
Attention
If
dtis provided and is not adatetime.datetimeinstance, aTypeErrorwill be raised.Always ensure that
updated_atis set before relying on this property for calculations.
- execute_query(endpoint, params=None, limit=None)[source]
Execute the API query and return the results. This method constructs the full URL by combining the base URL and the endpoint, and sends a GET request to the API with the provided parameters.
- Parameters:
- Return type:
- Returns:
The API response as a JSON object or False if the request fails.
- classmethod find_hash(value)
Finds and returns the first substring in the given value that matches the hashed ID format.
- property formatted_class_name: str
Returns the class name formatted for logging.
- Returns:
The formatted class name as a string.
- Return type:
- 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:
- classmethod from_db(db, field_names, values)
- full_clean(exclude=None, validate_unique=True, validate_constraints=True)
Call clean_fields(), clean(), validate_unique(), and validate_constraints() on the model. Raise a ValidationError for any errors that occur.
- get_auth_method_display(*, field=<django.db.models.CharField: auth_method>)
Shows the label of the
auth_method. Seeget_FOO_display()for more information.
- classmethod get_cached_connection_by_name_and_kind(user, kind, name, invalidate=False)
Return a single instance of a concrete subclass of
ConnectionBaseby name and kind.This method retrieves a connection object (such as
SqlConnectionorApiConnection) for the given user, connection kind, and connection name. It searches across all concrete subclasses ofConnectionBaseand returns the matching instance if found.- Parameters:
user (User) – The user whose connection should be retrieved.
kind (SAMKinds) – The kind of connection (e.g.,
SAMKinds.SQL_CONNECTIONorSAMKinds.API_CONNECTION).name (str) – The name of the connection to retrieve.
- Returns:
The connection instance if found, otherwise None.
- Return type:
Union[ConnectionBase, None]
Example:
sql_conn = ConnectionBase.get_cached_connection_by_name_and_kind(user, SAMKinds.SQL_CONNECTION, "hr_database") api_conn = ConnectionBase.get_cached_connection_by_name_and_kind(user, SAMKinds.API_CONNECTION, "inventory_api")
See also:
ApiConnectionsmarter.lib.cache.cache_results()
- classmethod get_cached_connections_for_user(cls, user, invalidate=False)
Return a list of all instances of all concrete subclasses of
ConnectionBase.This method retrieves all connection objects (such as
SqlConnectionandApiConnection) associated with the user’s account, across all concrete subclasses ofConnectionBase. It is useful for enumerating all available connections for a given user, regardless of connection type.- Parameters:
user (User) – The user whose connections should be retrieved.
- Returns:
A list of all connection instances for the user’s account.
- Return type:
list[ConnectionBase]
Example:
connections = ConnectionBase.get_cached_connections_for_user(user) # returns [<SqlConnection ...>, <ApiConnection ...>, ...]
See also:
- classmethod get_cached_object(invalidate=False, pk=None, name=None, user=None, user_profile=None, username=None, account=None)
Retrieve a model instance using caching to optimize performance.
Examples of retrieval patterns:
# By primary key instance = MyModel.get_cached_object(pk=123) # By name and user profile instance = MyModel.get_cached_object(name="Resource Name", user_profile=user_profile) # By name and account instance = MyModel.get_cached_object(name="Resource Name", account=account)
- Parameters:
pk (
Optional[int]) – The primary key of the model instance to retrieve.name (
Optional[str]) – The name of the model instance to retrieve.user (
Optional[User]) – The user associated with the model instance.user_profile (
Optional[UserProfile]) – The user profile associated with the model instance.account (
Optional[Account]) – The account associated with the model instance.invalidate (
Optional[bool]) – Whether to invalidate the cache for this retrieval.
- Returns:
The model instance if found, otherwise None.
- Return type:
Optional[models.Model]
- classmethod get_cached_objects(invalidate=False, user_profile=None)
Retrieve a list of MetaDataWithOwnershipModel instances associated with a user profile using caching.
Example usage:
# Retrieve MetaDataWithOwnershipModel instances for a user profile with caching models = MetaDataWithOwnershipModel.get_cached_objects(my_user_profile, invalidate=invalidate)
- Parameters:
invalidate (bool, optional) – Whether to invalidate the cache for this retrieval.
user_profile (UserProfile, optional) – The user profile for which to retrieve MetaDataWithOwnershipModel instances.
- Returns:
A queryset of MetaDataWithOwnershipModel instances associated with the user profile.
- Return type:
models.QuerySet[“MetaDataWithOwnershipModel”]
- get_constraints()
- get_deferred_fields()
Return a set containing names of deferred fields for this instance.
- get_kind_display(*, field=<django.db.models.CharField: kind>)
Shows the label of the
kind. Seeget_FOO_display()for more information.
- classmethod get_object_by_locator(locator)
Retrieves an object based on its record locator.
Example:
obj = MyModel.objects.create() print(obj.id) # e.g., 123 locator = obj.record_locator # e.g., "mymodel-rc2x" retrieved_obj = MyModel.get_object_by_locator(locator) print(type(retrieved_obj)) # Should be <class 'MyModel'> print(retrieved_obj) # Should be the same as obj
- Parameters:
locator (
str) – The record locator string to decode and search for.- Returns:
The model instance if found, otherwise None.
- Return type:
Optional[TimestampedModel]
- get_proxy_protocol_display(*, field=<django.db.models.CharField: proxy_protocol>)
Shows the label of the
proxy_protocol. Seeget_FOO_display()for more information.
- classmethod hash_regex()
Returns a regex pattern that matches the hashed ID format for this model anywhere in a string.
The hashed ID format is defined by the
HASH_PREFIXandHASH_SUFFIXclass attributes, with a base64-encoded string in between. This regex can be used to validate or extract hashed IDs from strings, including when embedded in URLs.- Returns:
A regex pattern for matching hashed IDs.
- Return type:
- property hashed_id: str
Returns a URL-friendly hashed version of the object’s ID for use in URLs and other contexts where an obscured, non-identifying, non-sequential identifier is preferred.
Encoding scheme: 1. Take the object’s ID and add a large constant (HASH_FLOOR) to ensure it’s not easily guessable. 2. Convert the resulting number to a string and encode it using URL-safe base64 encoding. 3. Remove any padding characters from the encoded string. 4. Add a prefix and suffix to the encoded string to create a recognizable format.
Example:
obj = MyModel.objects.create() print(obj.id) # e.g., 123 print(obj.hashed_id) # e.g., "rc2x"
- Returns:
Hashed ID string (URL-safe, no padding)
- Return type:
- id
-
Primary key: ID
- Type:
Type
- classmethod id_from_hashed_id(hashed_id)
Decodes a hashed ID back to the original object ID.
decoding scheme: 1. Validate that the hashed ID starts with the expected prefix and ends with the expected suffix. 2. Remove the prefix and suffix to isolate the base64-encoded string. 3. Add padding if necessary to make the length of the encoded string a multiple of 4. 4. Decode the base64 string to get the original number as a string. 5. Convert the decoded string to an integer and subtract the HASH_FLOOR to get the original ID.
Example:
my_record = MyModel.objects.create() print(my_record.id) # e.g., 123 hashed_id = my_record.hashed_id # e.g., "rc2x" original_id = MyModel.id_from_hashed_id(hashed_id) print(original_id) # Should print the original ID (e.g., 123)
- kind
-
Kind. The kind of connection. Example: ‘SQL’, ‘API’.
Choices:
SqlConnectionApiConnection
- Type:
Type
- 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.
- name
-
Name. Name in camelCase, e.g., ‘apiKey’, no special characters.
- Type:
Type
- objects = <django.db.models.Manager object>
- property pk
- plugin_data_api_connection
Reverse
ForeignKeyfromPluginDataApiAll plugin data api connection of this API Connection (related name of
connection)- Type:
Type
- prepare_database_save(field)
- proxy_host
-
Proxy host
- Type:
Type
- proxy_password
ForeignKeytoSecretProxy password. The proxy password for authentication, if required. (related name:
api_connections_proxy_password)- Type:
Type
- proxy_password_id
Internal field, use
proxy_passwordinstead.
- proxy_port
-
Proxy port
- Type:
Type
- proxy_protocol
-
Proxy protocol. The protocol to use for the proxy connection.
Choices:
httphttpssocks
- Type:
Type
- proxy_username
-
Proxy username
- Type:
Type
- property ready: bool
Indicates whether the object is ready for use. This is a placeholder that should be overridden in subclasses.
- Returns:
True if ready, False otherwise.
- Return type:
- property record_locator: str
Returns a short, URL-friendly record locator derived from the object’s ID.
Example:
obj = MyModel.objects.create(name="Example") print(obj.id) # e.g., 123 print(obj.record_locator) # e.g., "chatbot-rc2x"
- Returns:
Record locator string (URL-safe, no padding)
- Return type:
- refresh_from_db(using=None, fields=None, from_queryset=None)
Reload field values from the database.
By default, the reloading happens from the database this instance was loaded from, or by the read router if this instance wasn’t loaded from any database. The using parameter will override the default.
Fields can be used to specify which fields to reload. The fields should be an iterable of field attnames. If fields is None, then all non-deferred fields are reloaded.
When accessing deferred fields of an instance, the deferred loading of the field will call this method.
- save(*args, **kwargs)[source]
Override the save method to validate the field dicts.
- save_base(raw=False, force_insert=False, force_update=False, using=None, update_fields=None)
Handle the parts of saving which should be done only once per save, yet need to be done in raw saves, too. This includes some sanity checks and signal sending.
The ‘raw’ argument is telling save_base not to save any parent models and not to do any changes to the values before save. This is used by fixture loading.
- serializable_value(field_name)
Return the value of the field name for this instance. If the field is a foreign key, return the id value instead of the object. If there’s no Field object with this name on the model, return the model attribute’s value.
Used to serialize a field’s value (in the serializer, or form output, for example). Normally, you would just access the attribute directly and not use this method.
- 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 (Optional[HttpRequest]) – The request object.
- Returns:
The absolute request URL.
- Return type:
Optional[str]
- Raises:
SmarterValueError – If the URI cannot be built from the request.
- sorted_dict(data)
Returns a new dictionary with keys sorted.
- tagged_items
Reverse
GenericRelationfromApiConnectionAll + of this tagged item (related name of
tagged_items)- Type:
Type
- tags = <taggit.managers._TaggableManager object>
- property tags_list: list[str]
Return the tags as a list of strings. We assume that @cached_property is more efficient at fetch that @cache_results, all things considered equal, which provides a marginal boost to instances. Meanwhile, the @cache_results is persisted to the Django cache, and thus outlives this instance. Thus, best of both worlds.
- test_connection()[source]
Test the API connection by making a simple GET request to the root domain.
- Return type:
- timeout
-
Timeout. The timeout for the API request in seconds. Default is 30 seconds.
- Type:
Type
- to_json()
Serialize the model instance to a JSON-compatible dictionary.
This method uses the custom
SmarterJSONEncoderto ensure that all fields, including timestamps and any complex data types, are properly serialized.
- 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.
- unique_error_message(model_class, unique_check)
- updated_at
-
Updated at
Timestamp indicating when the model instance was last updated. This field is automatically updated to the current date and time whenever the instance is saved. It is indexed in the database for efficient querying.
- Type:
Type
- user_profile
-
User profile (related name:
apiconnections)- Type:
Type
- user_profile_id
Internal field, use
user_profileinstead.
- validate_constraints(exclude=None)
- validate_unique(exclude=None)
Check unique constraints on the model and raise ValidationError if any failed.
- version
-
Version. Semantic version in the format MAJOR.MINOR.PATCH, e.g., ‘1.0.0’.
- Type:
Type