Skip to content

Commit 4c4b75a

Browse files
committed
Version 1.4.114
1 parent bb317a6 commit 4c4b75a

404 files changed

Lines changed: 3374 additions & 429 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎abacusai/__init__.py‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@
207207
from .memory_options import MemoryOptions
208208
from .messaging_connector_response import MessagingConnectorResponse
209209
from .mobile_app_build_status import MobileAppBuildStatus
210+
from .mobile_app_identifiers import MobileAppIdentifiers
210211
from .mobile_build_info import MobileBuildInfo
211212
from .model import Model
212213
from .model_artifacts_export import ModelArtifactsExport
@@ -342,8 +343,9 @@
342343
from .web_search_result import WebSearchResult
343344
from .web_service_trigger_run import WebServiceTriggerRun
344345
from .webhook import Webhook
346+
from .whatsapp_referral_invite import WhatsappReferralInvite
345347
from .workflow_graph_node_details import WorkflowGraphNodeDetails
346348
from .workflow_node_template import WorkflowNodeTemplate
347349

348350

349-
__version__ = "1.4.113"
351+
__version__ = "1.4.114"

‎abacusai/ad_template.py‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ class AdTemplate(AbstractApiClass):
1818
cardDescription (str): Two-line description of the video the format makes, for its preview dialog
1919
description (str): Gallery caption / display copy
2020
exampleMedia (list): CDN URLs of preview videos for the card
21+
exampleMediaPreview (list): Compressed 480p encodes of example_media, for the card walls
2122
"""
2223

23-
def __init__(self, client, slug=None, name=None, category=None, supportsAvatar=None, needsProduct=None, defaultDuration=None, defaultAspectRatio=None, cardOneLiner=None, cardDescription=None, description=None, exampleMedia=None):
24+
def __init__(self, client, slug=None, name=None, category=None, supportsAvatar=None, needsProduct=None, defaultDuration=None, defaultAspectRatio=None, cardOneLiner=None, cardDescription=None, description=None, exampleMedia=None, exampleMediaPreview=None):
2425
super().__init__(client, None)
2526
self.slug = slug
2627
self.name = name
@@ -33,11 +34,12 @@ def __init__(self, client, slug=None, name=None, category=None, supportsAvatar=N
3334
self.card_description = cardDescription
3435
self.description = description
3536
self.example_media = exampleMedia
37+
self.example_media_preview = exampleMediaPreview
3638
self.deprecated_keys = {}
3739

3840
def __repr__(self):
39-
repr_dict = {f'slug': repr(self.slug), f'name': repr(self.name), f'category': repr(self.category), f'supports_avatar': repr(self.supports_avatar), f'needs_product': repr(self.needs_product), f'default_duration': repr(
40-
self.default_duration), f'default_aspect_ratio': repr(self.default_aspect_ratio), f'card_one_liner': repr(self.card_one_liner), f'card_description': repr(self.card_description), f'description': repr(self.description), f'example_media': repr(self.example_media)}
41+
repr_dict = {f'slug': repr(self.slug), f'name': repr(self.name), f'category': repr(self.category), f'supports_avatar': repr(self.supports_avatar), f'needs_product': repr(self.needs_product), f'default_duration': repr(self.default_duration), f'default_aspect_ratio': repr(
42+
self.default_aspect_ratio), f'card_one_liner': repr(self.card_one_liner), f'card_description': repr(self.card_description), f'description': repr(self.description), f'example_media': repr(self.example_media), f'example_media_preview': repr(self.example_media_preview)}
4143
class_name = "AdTemplate"
4244
repr_str = ',\n '.join([f'{key}={value}' for key, value in repr_dict.items(
4345
) if getattr(self, key, None) is not None and key not in self.deprecated_keys])
@@ -50,6 +52,6 @@ def to_dict(self):
5052
Returns:
5153
dict: The dict value representation of the class parameters
5254
"""
53-
resp = {'slug': self.slug, 'name': self.name, 'category': self.category, 'supports_avatar': self.supports_avatar, 'needs_product': self.needs_product, 'default_duration': self.default_duration,
54-
'default_aspect_ratio': self.default_aspect_ratio, 'card_one_liner': self.card_one_liner, 'card_description': self.card_description, 'description': self.description, 'example_media': self.example_media}
55+
resp = {'slug': self.slug, 'name': self.name, 'category': self.category, 'supports_avatar': self.supports_avatar, 'needs_product': self.needs_product, 'default_duration': self.default_duration, 'default_aspect_ratio': self.default_aspect_ratio,
56+
'card_one_liner': self.card_one_liner, 'card_description': self.card_description, 'description': self.description, 'example_media': self.example_media, 'example_media_preview': self.example_media_preview}
5557
return {key: value for key, value in resp.items() if value is not None and key not in self.deprecated_keys}

‎abacusai/agent_network.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class AgentNetwork(AbstractApiClass):
1010
discoverable (bool): Whether teammates in the org can find this agent and request a contact.
1111
orgHasOtherUsers (bool): Whether the owner's org has other users (teammate controls are shown only then).
1212
ownAgents (list): The owner's other agents (bot_id/name/description); always reachable.
13-
contacts (list): Teammate agents (bot_id/name/description/owner_user_id/owner_name/status/t); status is PENDING_IN, PENDING_OUT or ACCEPTED.
13+
contacts (list): Other people's agents (bot_id/name/owner_user_id/owner_name/status/t/org_id/external); status is PENDING_IN, PENDING_OUT or ACCEPTED; external agents live in another org (org_id set) and may be on another cluster.
1414
"""
1515

1616
def __init__(self, client, discoverable=None, orgHasOtherUsers=None, ownAgents=None, contacts=None):

‎abacusai/agent_skill.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class AgentSkill(AbstractApiClass):
2626
shareCount (int): Number of people an owned skill is shared with.
2727
sharedStoreDir (str): Directory name of the viewer's own copy of a shared skill, present once they opt in.
2828
hashedAgentSkillId (str): Hashed skill id used by skill share links.
29-
userDisabled (bool): Whether the user explicitly disabled this system skill, keeping it listed instead of returning it to the import library.
29+
userDisabled (bool): Whether this system skill, or (in a project listing) this linked user skill, was explicitly disabled in the listed scope, keeping it listed instead of returning it to the import library.
3030
usedByTasks (bool): Whether any of the user's daemon tasks reference this skill, so disabling it will ask for confirmation.
3131
"""
3232

‎abacusai/api_class/ai_agents.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -751,6 +751,7 @@ def to_dict(self):
751751

752752
@classmethod
753753
def from_dict(cls, node: dict):
754+
validate_input_dict_param(node, friendly_class_name='decision_node', must_contain=['name', 'source_code'])
754755
return cls(
755756
name=node['name'],
756757
condition=node['source_code'],
@@ -829,6 +830,7 @@ def to_dict(self):
829830

830831
@classmethod
831832
def from_dict(cls, node: dict):
833+
validate_input_dict_param(node, friendly_class_name='llm_agent_node', must_contain=['name', 'chatbot_deployment_id', 'chatbot_parameters'])
832834
instance = cls(
833835
name=node['name'],
834836
chatbot_deployment_id=node['chatbot_deployment_id'],

‎abacusai/api_class/enums.py‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ class VectorStoreTextEncoder(ApiEnum):
605605
'LLAMA3_LARGE_CHAT', 'LLAMA3_1_405B', 'LLAMA3_1_70B', 'LLAMA3_1_8B', 'LLAMA3_3_70B', 'LLAMA4_MAVERICK',
606606
'QWEN_2_5_32B_BASE', 'QWEN_2_5_32B', 'QWEN_2_5_72B', 'QWQ_32B',
607607
'DEEPSEEK_V3_1', 'DEEPSEEK_R1',
608-
'ZAI_GLM_5_1', 'OX_ALPHA', 'ABACUS_DRACARYS',
608+
'ZAI_GLM_5_1', 'OX_ALPHA', 'UNION_ALPHA', 'ABACUS_DRACARYS',
609609
)
610610
class LLMName(ApiEnum):
611611
OPENAI_GPT3_5 = 'OPENAI_GPT3_5'
@@ -655,6 +655,8 @@ class LLMName(ApiEnum):
655655
CLAUDE_V4_7_OPUS = 'CLAUDE_V4_7_OPUS'
656656
CLAUDE_V4_8_OPUS = 'CLAUDE_V4_8_OPUS'
657657
CLAUDE_V5_OPUS = 'CLAUDE_V5_OPUS'
658+
CLAUDE_V5_FABLE = 'CLAUDE_V5_FABLE'
659+
CLAUDE_V5_1_FABLE = 'CLAUDE_V5_1_FABLE'
658660
GEMINI_1_5_PRO = 'GEMINI_1_5_PRO'
659661
GEMINI_1_5_FLASH = 'GEMINI_1_5_FLASH'
660662
GEMINI_2_PRO = 'GEMINI_2_PRO'
@@ -718,6 +720,7 @@ class LLMName(ApiEnum):
718720
KIMI_K3 = 'KIMI_K3'
719721
INKLING = 'INKLING'
720722
OX_ALPHA = 'OX_ALPHA'
723+
UNION_ALPHA = 'UNION_ALPHA'
721724

722725

723726
class MonitorAlertType(ApiEnum):

‎abacusai/app_user_group.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class AppUserGroup(AbstractApiClass):
1717
isExternalServiceGroup (bool): Whether the App User Group corresponds to a user group that's defined in an external service (i.e Microsft Active Directory or Okta) or not
1818
externalServiceGroupId (str): The identifier that corresponds to the app user group's external service group representation
1919
creationSource (str): The source of the app user group
20-
users (User): The users in the user group.
20+
users (User): The users in the user group. Each carries a `status` of `ACTIVE` or `PAUSED`.
2121
"""
2222

2323
def __init__(self, client, name=None, userGroupId=None, externalApplicationIds=None, invitedUserEmails=None, publicUserGroup=None, hasExternalApplicationReporting=None, isExternalServiceGroup=None, externalServiceGroupId=None, creationSource=None, users={}):

‎abacusai/bot_channel_options.py‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,20 @@ class BotChannelOptions(AbstractApiClass):
1010
sharedChannels (list): Channels this cluster runs a shared Abacus bot for, so they link by QR / deep link with no user-supplied tokens.
1111
telegramBotUsername (str): The shared Telegram bot's username, when there is one.
1212
channels (list): Every supported channel: channel, label, whether it is shared, whether the 'use your own bot' screen should offer it (offers_own_bot), and the credential form it takes (credential_fields: key/label/secret, in display order).
13+
slackWorkspace (dict): The admin-installed Slack workspace personal agents can be reached from (team_id, workspace_name, linked: whether this user tied their Slack account to Abacus.AI), when the org has one.
1314
"""
1415

15-
def __init__(self, client, sharedChannels=None, telegramBotUsername=None, channels=None):
16+
def __init__(self, client, sharedChannels=None, telegramBotUsername=None, channels=None, slackWorkspace=None):
1617
super().__init__(client, None)
1718
self.shared_channels = sharedChannels
1819
self.telegram_bot_username = telegramBotUsername
1920
self.channels = channels
21+
self.slack_workspace = slackWorkspace
2022
self.deprecated_keys = {}
2123

2224
def __repr__(self):
2325
repr_dict = {f'shared_channels': repr(self.shared_channels), f'telegram_bot_username': repr(
24-
self.telegram_bot_username), f'channels': repr(self.channels)}
26+
self.telegram_bot_username), f'channels': repr(self.channels), f'slack_workspace': repr(self.slack_workspace)}
2527
class_name = "BotChannelOptions"
2628
repr_str = ',\n '.join([f'{key}={value}' for key, value in repr_dict.items(
2729
) if getattr(self, key, None) is not None and key not in self.deprecated_keys])
@@ -34,6 +36,6 @@ def to_dict(self):
3436
Returns:
3537
dict: The dict value representation of the class parameters
3638
"""
37-
resp = {'shared_channels': self.shared_channels,
38-
'telegram_bot_username': self.telegram_bot_username, 'channels': self.channels}
39+
resp = {'shared_channels': self.shared_channels, 'telegram_bot_username': self.telegram_bot_username,
40+
'channels': self.channels, 'slack_workspace': self.slack_workspace}
3941
return {key: value for key, value in resp.items() if value is not None and key not in self.deprecated_keys}

‎abacusai/chatllm_referral_invite.py‎

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,22 @@ class ChatllmReferralInvite(AbstractApiClass):
1010
userAlreadyExists (list): List of user emails not successfullt invited, because they are already registered users.
1111
successfulInvites (list): List of users successfully invited.
1212
failedToSend (list): Emails whose invite could not be sent from the user's Gmail account.
13+
invitesSent (int): The user's total invites on record after this call (AbacusAI Bot invites only).
14+
milestoneCreditsGranted (int): Credits granted by this call when it crossed the invite milestone, else 0 (AbacusAI Bot invites only).
1315
"""
1416

15-
def __init__(self, client, userAlreadyExists=None, successfulInvites=None, failedToSend=None):
17+
def __init__(self, client, userAlreadyExists=None, successfulInvites=None, failedToSend=None, invitesSent=None, milestoneCreditsGranted=None):
1618
super().__init__(client, None)
1719
self.user_already_exists = userAlreadyExists
1820
self.successful_invites = successfulInvites
1921
self.failed_to_send = failedToSend
22+
self.invites_sent = invitesSent
23+
self.milestone_credits_granted = milestoneCreditsGranted
2024
self.deprecated_keys = {}
2125

2226
def __repr__(self):
23-
repr_dict = {f'user_already_exists': repr(self.user_already_exists), f'successful_invites': repr(
24-
self.successful_invites), f'failed_to_send': repr(self.failed_to_send)}
27+
repr_dict = {f'user_already_exists': repr(self.user_already_exists), f'successful_invites': repr(self.successful_invites), f'failed_to_send': repr(
28+
self.failed_to_send), f'invites_sent': repr(self.invites_sent), f'milestone_credits_granted': repr(self.milestone_credits_granted)}
2529
class_name = "ChatllmReferralInvite"
2630
repr_str = ',\n '.join([f'{key}={value}' for key, value in repr_dict.items(
2731
) if getattr(self, key, None) is not None and key not in self.deprecated_keys])
@@ -34,6 +38,6 @@ def to_dict(self):
3438
Returns:
3539
dict: The dict value representation of the class parameters
3640
"""
37-
resp = {'user_already_exists': self.user_already_exists,
38-
'successful_invites': self.successful_invites, 'failed_to_send': self.failed_to_send}
41+
resp = {'user_already_exists': self.user_already_exists, 'successful_invites': self.successful_invites,
42+
'failed_to_send': self.failed_to_send, 'invites_sent': self.invites_sent, 'milestone_credits_granted': self.milestone_credits_granted}
3943
return {key: value for key, value in resp.items() if value is not None and key not in self.deprecated_keys}

‎abacusai/client.py‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -716,7 +716,7 @@ class BaseApiClient:
716716
client_options (ClientOptions): Optional API client configurations
717717
skip_version_check (bool): If true, will skip checking the server's current API version on initializing the client
718718
"""
719-
client_version = '1.4.113'
719+
client_version = '1.4.114'
720720

721721
def __init__(self, api_key: str = None, server: str = None, client_options: ClientOptions = None, skip_version_check: bool = False, include_tb: bool = False):
722722
self.api_key = api_key
@@ -747,8 +747,9 @@ def __init__(self, api_key: str = None, server: str = None, client_options: Clie
747747
endpoint_info = self._call_api('getApiEndpoint', 'GET')
748748
self.prediction_endpoint = endpoint_info['predictEndpoint']
749749
self.proxy_endpoint = endpoint_info.get('proxyEndpoint')
750+
self.api_endpoint = endpoint_info['apiEndpoint']
750751
if not self.server:
751-
self.server = endpoint_info['apiEndpoint']
752+
self.server = self.api_endpoint
752753
break
753754
except Exception as e:
754755
logging.warning(f'Error while calling API: {e}')
@@ -761,15 +762,16 @@ def __init__(self, api_key: str = None, server: str = None, client_options: Clie
761762
'g')
762763
if not skip_version_check:
763764
try:
764-
self.web_version = self._call_api('version', 'GET')
765+
self.web_version = self._call_api(
766+
'version', 'GET', server_override=self.api_endpoint)
765767
if version.parse(self.web_version) > version.parse(self.client_version):
766768
warnings.warn(
767769
'A new version of the Abacus.AI library is available')
768770
warnings.warn(
769771
f'Current Version: {self.client_version} -> New Version: {self.web_version}')
770772
except Exception:
771773
logging.error(
772-
f'Failed get the current API version from Abacus.AI ({self.server or DEFAULT_SERVER}/api/v0/version)')
774+
f'Failed get the current API version from Abacus.AI ({self.api_endpoint or self.server or DEFAULT_SERVER}/api/v0/version)')
773775
# Modify traceback
774776
if not include_tb:
775777
excepthook = sys.excepthook
@@ -4729,7 +4731,7 @@ def _get_doc_retriever_deployment_info(self, document_retriever_id: str):
47294731
@lru_cache()
47304732
def _cached_doc_retriever_deployment_info(document_retriever_id: str, ttl_hash: int):
47314733
info = self._call_api('_getDocRetrieverDeploymentInfo', 'GET', query_params={
4732-
'documentRetrieverId': document_retriever_id})
4734+
'documentRetrieverId': document_retriever_id}, server_override=self.api_endpoint)
47334735
deployment_token = info['deploymentToken']
47344736
deployment_id = info['deploymentId']
47354737
return deployment_token, deployment_id

0 commit comments

Comments
 (0)