Latest commit

History

History

README.md

Python AICA API Client

pip install aica-api

The AICA API client module provides simple functions for interacting with the AICA Core through a REST API.

Refer to https://docs.aica.tech for more information about the AICA System.

Authentication with an API key

For connecting to AICA Core v4.3.0 and later, an API key is required for authentication.

API keys can be generated in AICA Studio with configurable access scopes. Note that available scopes are limited to those of the currently logged-in user. A generated API key is only shown once and should be kept secret. For example, it may be exported as an environment variable. The following example key is shown for demonstrative purposes only:

export AICA_API_KEY=64ce9e8f-aa46-4ba7-814f-f169c01c957e.RwoH6A1Ti5poNKSizoWrcBEYzh7AkB0kpMq1TR59t6os

The API key must then be provided to the constructor with the api_key keyword argument:

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)

Basic usage

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
ifaica.check():
print(f"Connected to AICA Core version {aica.core_version()}")

The client object can be used to easily make API calls to monitor or control AICA Core. For example:

aica.set_application('my_application.yaml')
aica.start_application()
aica.load_component('my_component')
aica.unload_component('my_component')
aica.stop_application()

To check the status of predicates and conditions, the following blocking methods can be employed:

ifaica.wait_for_condition('timer_1_active', timeout=10.0):
print('Condition is true!')
else:
print('Timed out before condition was true')
ifaica.wait_for_component_predicate('timer_1', 'is_timed_out', timeout=10.0):
print('Predicate is true!')
else:
print('Timed out before predicate was true')

Refer to the available methods of the AICA client class for more advanced usage.

Network configuration

By default, the API server of AICA Core is available on the default address localhost:8080. Depending on the network configuration, the URL or port number of the AICA Core instance may be different.

For example, when using AICA Launcher on macOS, the API is bound to a different, randomly generated port to avoid conflict with reserved ports. Use the "Open in browser" button from Launcher to open AICA Studio in the browser and copy the port from the url.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
# connect to a non-default port on the local networkaica=AICA(api_key=AICA_API_KEY, url='http://localhost:55005/api')
# or connect to a different host address entirelyaica=AICA(api_key=AICA_API_KEY, url='http://192.168.0.1:55005/api')

Compatibility table

The latest version of this AICA API client will generally support the latest AICA Core version. Major version changes to the API client or to AICA Core indicate breaking changes and are not always backwards compatible. To interact with older versions of AICA Core, it may be necessary to install older versions of the client. Use the following compatibility table to determine which client version to use.

AICA Core versionAPI protocol versionMatching Python client version
>= 5.1v3>= 4.0.2
>= 5.0, < 5.1v3Unsupported
>= 4.3, < 5.0v2>= 3.1.0
>= 4.0, < 4.3v2>= 3.0.0
3.xv2>= 2.0.0
2.xv21.2.0
<= 1.xv1Unsupported

The API protocol version is a namespace for the endpoints. Endpoints under the v2 protocol have a /v2/... prefix in the URL. A change to the protocol version indicates a fundamental change to the API structure or behavior.

Between major version changes, minor updates to the AICA Core version and Python client versions may introduce new endpoints and functions respectively. If a function requires a feature that the detected AICA Core version does not yet support (as is the case when the Python client version is more up-to-date than the targeted AICA Core), then calling that function will return None with a warning.

Changes to API behavior between AICA Core versions

AICA Core versions v1.x and earlier were alpha and pre-alpha versions that are no longer supported.

AICA Core version v2.x was a beta version that introduced a new API structure under the v2 protocol namespace.

In AICA Core v3.x, live data streaming for predicates and conditions switched from using raw websockets to Socket.IO for data transfer. This constituted a breaking change to API clients, but the overall structure of the REST API remained the same, and so the API protocol version is still v2.

AICA Core versions v4.0 through v4.2 keep the same protocol structure as before under the v2 namespace. The primary breaking change from the point of the API server and client is that the /version endpoint now returns the version of AICA Core, rather than the specific version of the API server subpackage inside core. These have historically carried the same major version, but in future the core version may have major updates without any breaking changes to the actual API server version.

AICA Core versions v4.3 and later introduce authentication and access scopes to the API server. An API key with appropriate scopes is required to access the respective endpoints and functionalities.

AICA Core versions v5 and later change some endpoints paths, methods and payloads. This is mostly internal to the client implementation.

Checking compatibility

Recent client versions include a check() method to assess the client version and API compatibility.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
# check compatability between the client version and API versionifaica.check():
print('Client and server versions are compatible')
else:
print('Client and server versions are incompatible')

The latest client versions also include the following functions to check the configuration details manually.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
# get the current version of this clientprint(aica.client_version())
# get the current version of AICA Core (e.g. "4.0.0")print(aica.core_version())
# get the current API protocol version (e.g. "v2")print(aica.protocol())
# get the specific version of the API server running in AICA Core (e.g. "4.0.1")# (generally only needed for debugging purposes)print(aica.api_version())
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

History

README.md

Python AICA API Client

pip install aica-api

The AICA API client module provides simple functions for interacting with the AICA Core through a REST API.

Refer to https://docs.aica.tech for more information about the AICA System.

Authentication with an API key

For connecting to AICA Core v4.3.0 and later, an API key is required for authentication.

API keys can be generated in AICA Studio with configurable access scopes. Note that available scopes are limited to those of the currently logged-in user. A generated API key is only shown once and should be kept secret. For example, it may be exported as an environment variable. The following example key is shown for demonstrative purposes only:

export AICA_API_KEY=64ce9e8f-aa46-4ba7-814f-f169c01c957e.RwoH6A1Ti5poNKSizoWrcBEYzh7AkB0kpMq1TR59t6os

The API key must then be provided to the constructor with the api_key keyword argument:

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)

Basic usage

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
ifaica.check():
print(f"Connected to AICA Core version {aica.core_version()}")

The client object can be used to easily make API calls to monitor or control AICA Core. For example:

aica.set_application('my_application.yaml')
aica.start_application()
aica.load_component('my_component')
aica.unload_component('my_component')
aica.stop_application()

To check the status of predicates and conditions, the following blocking methods can be employed:

ifaica.wait_for_condition('timer_1_active', timeout=10.0):
print('Condition is true!')
else:
print('Timed out before condition was true')
ifaica.wait_for_component_predicate('timer_1', 'is_timed_out', timeout=10.0):
print('Predicate is true!')
else:
print('Timed out before predicate was true')

Refer to the available methods of the AICA client class for more advanced usage.

Network configuration

By default, the API server of AICA Core is available on the default address localhost:8080. Depending on the network configuration, the URL or port number of the AICA Core instance may be different.

For example, when using AICA Launcher on macOS, the API is bound to a different, randomly generated port to avoid conflict with reserved ports. Use the "Open in browser" button from Launcher to open AICA Studio in the browser and copy the port from the url.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
# connect to a non-default port on the local networkaica=AICA(api_key=AICA_API_KEY, url='http://localhost:55005/api')
# or connect to a different host address entirelyaica=AICA(api_key=AICA_API_KEY, url='http://192.168.0.1:55005/api')

Compatibility table

The latest version of this AICA API client will generally support the latest AICA Core version. Major version changes to the API client or to AICA Core indicate breaking changes and are not always backwards compatible. To interact with older versions of AICA Core, it may be necessary to install older versions of the client. Use the following compatibility table to determine which client version to use.

AICA Core versionAPI protocol versionMatching Python client version
>= 5.1v3>= 4.0.2
>= 5.0, < 5.1v3Unsupported
>= 4.3, < 5.0v2>= 3.1.0
>= 4.0, < 4.3v2>= 3.0.0
3.xv2>= 2.0.0
2.xv21.2.0
<= 1.xv1Unsupported

The API protocol version is a namespace for the endpoints. Endpoints under the v2 protocol have a /v2/... prefix in the URL. A change to the protocol version indicates a fundamental change to the API structure or behavior.

Between major version changes, minor updates to the AICA Core version and Python client versions may introduce new endpoints and functions respectively. If a function requires a feature that the detected AICA Core version does not yet support (as is the case when the Python client version is more up-to-date than the targeted AICA Core), then calling that function will return None with a warning.

Changes to API behavior between AICA Core versions

AICA Core versions v1.x and earlier were alpha and pre-alpha versions that are no longer supported.

AICA Core version v2.x was a beta version that introduced a new API structure under the v2 protocol namespace.

In AICA Core v3.x, live data streaming for predicates and conditions switched from using raw websockets to Socket.IO for data transfer. This constituted a breaking change to API clients, but the overall structure of the REST API remained the same, and so the API protocol version is still v2.

AICA Core versions v4.0 through v4.2 keep the same protocol structure as before under the v2 namespace. The primary breaking change from the point of the API server and client is that the /version endpoint now returns the version of AICA Core, rather than the specific version of the API server subpackage inside core. These have historically carried the same major version, but in future the core version may have major updates without any breaking changes to the actual API server version.

AICA Core versions v4.3 and later introduce authentication and access scopes to the API server. An API key with appropriate scopes is required to access the respective endpoints and functionalities.

AICA Core versions v5 and later change some endpoints paths, methods and payloads. This is mostly internal to the client implementation.

Checking compatibility

Recent client versions include a check() method to assess the client version and API compatibility.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
# check compatability between the client version and API versionifaica.check():
print('Client and server versions are compatible')
else:
print('Client and server versions are incompatible')

The latest client versions also include the following functions to check the configuration details manually.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
# get the current version of this clientprint(aica.client_version())
# get the current version of AICA Core (e.g. "4.0.0")print(aica.core_version())
# get the current API protocol version (e.g. "v2")print(aica.protocol())
# get the specific version of the API server running in AICA Core (e.g. "4.0.1")# (generally only needed for debugging purposes)print(aica.api_version())
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History

README.md

Python AICA API Client

pip install aica-api

The AICA API client module provides simple functions for interacting with the AICA Core through a REST API.

Refer to https://docs.aica.tech for more information about the AICA System.

Authentication with an API key

For connecting to AICA Core v4.3.0 and later, an API key is required for authentication.

API keys can be generated in AICA Studio with configurable access scopes. Note that available scopes are limited to those of the currently logged-in user. A generated API key is only shown once and should be kept secret. For example, it may be exported as an environment variable. The following example key is shown for demonstrative purposes only:

export AICA_API_KEY=64ce9e8f-aa46-4ba7-814f-f169c01c957e.RwoH6A1Ti5poNKSizoWrcBEYzh7AkB0kpMq1TR59t6os

The API key must then be provided to the constructor with the api_key keyword argument:

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)

Basic usage

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
ifaica.check():
print(f"Connected to AICA Core version {aica.core_version()}")

The client object can be used to easily make API calls to monitor or control AICA Core. For example:

aica.set_application('my_application.yaml')
aica.start_application()
aica.load_component('my_component')
aica.unload_component('my_component')
aica.stop_application()

To check the status of predicates and conditions, the following blocking methods can be employed:

ifaica.wait_for_condition('timer_1_active', timeout=10.0):
print('Condition is true!')
else:
print('Timed out before condition was true')
ifaica.wait_for_component_predicate('timer_1', 'is_timed_out', timeout=10.0):
print('Predicate is true!')
else:
print('Timed out before predicate was true')

Refer to the available methods of the AICA client class for more advanced usage.

Network configuration

By default, the API server of AICA Core is available on the default address localhost:8080. Depending on the network configuration, the URL or port number of the AICA Core instance may be different.

For example, when using AICA Launcher on macOS, the API is bound to a different, randomly generated port to avoid conflict with reserved ports. Use the "Open in browser" button from Launcher to open AICA Studio in the browser and copy the port from the url.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
# connect to a non-default port on the local networkaica=AICA(api_key=AICA_API_KEY, url='http://localhost:55005/api')
# or connect to a different host address entirelyaica=AICA(api_key=AICA_API_KEY, url='http://192.168.0.1:55005/api')

Compatibility table

The latest version of this AICA API client will generally support the latest AICA Core version. Major version changes to the API client or to AICA Core indicate breaking changes and are not always backwards compatible. To interact with older versions of AICA Core, it may be necessary to install older versions of the client. Use the following compatibility table to determine which client version to use.

AICA Core versionAPI protocol versionMatching Python client version
>= 5.1v3>= 4.0.2
>= 5.0, < 5.1v3Unsupported
>= 4.3, < 5.0v2>= 3.1.0
>= 4.0, < 4.3v2>= 3.0.0
3.xv2>= 2.0.0
2.xv21.2.0
<= 1.xv1Unsupported

The API protocol version is a namespace for the endpoints. Endpoints under the v2 protocol have a /v2/... prefix in the URL. A change to the protocol version indicates a fundamental change to the API structure or behavior.

Between major version changes, minor updates to the AICA Core version and Python client versions may introduce new endpoints and functions respectively. If a function requires a feature that the detected AICA Core version does not yet support (as is the case when the Python client version is more up-to-date than the targeted AICA Core), then calling that function will return None with a warning.

Changes to API behavior between AICA Core versions

AICA Core versions v1.x and earlier were alpha and pre-alpha versions that are no longer supported.

AICA Core version v2.x was a beta version that introduced a new API structure under the v2 protocol namespace.

In AICA Core v3.x, live data streaming for predicates and conditions switched from using raw websockets to Socket.IO for data transfer. This constituted a breaking change to API clients, but the overall structure of the REST API remained the same, and so the API protocol version is still v2.

AICA Core versions v4.0 through v4.2 keep the same protocol structure as before under the v2 namespace. The primary breaking change from the point of the API server and client is that the /version endpoint now returns the version of AICA Core, rather than the specific version of the API server subpackage inside core. These have historically carried the same major version, but in future the core version may have major updates without any breaking changes to the actual API server version.

AICA Core versions v4.3 and later introduce authentication and access scopes to the API server. An API key with appropriate scopes is required to access the respective endpoints and functionalities.

AICA Core versions v5 and later change some endpoints paths, methods and payloads. This is mostly internal to the client implementation.

Checking compatibility

Recent client versions include a check() method to assess the client version and API compatibility.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
# check compatability between the client version and API versionifaica.check():
print('Client and server versions are compatible')
else:
print('Client and server versions are incompatible')

The latest client versions also include the following functions to check the configuration details manually.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
# get the current version of this clientprint(aica.client_version())
# get the current version of AICA Core (e.g. "4.0.0")print(aica.core_version())
# get the current API protocol version (e.g. "v2")print(aica.protocol())
# get the specific version of the API server running in AICA Core (e.g. "4.0.1")# (generally only needed for debugging purposes)print(aica.api_version())
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History

README.md

Python AICA API Client

pip install aica-api

The AICA API client module provides simple functions for interacting with the AICA Core through a REST API.

Refer to https://docs.aica.tech for more information about the AICA System.

Authentication with an API key

For connecting to AICA Core v4.3.0 and later, an API key is required for authentication.

API keys can be generated in AICA Studio with configurable access scopes. Note that available scopes are limited to those of the currently logged-in user. A generated API key is only shown once and should be kept secret. For example, it may be exported as an environment variable. The following example key is shown for demonstrative purposes only:

export AICA_API_KEY=64ce9e8f-aa46-4ba7-814f-f169c01c957e.RwoH6A1Ti5poNKSizoWrcBEYzh7AkB0kpMq1TR59t6os

The API key must then be provided to the constructor with the api_key keyword argument:

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)

Basic usage

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
ifaica.check():
print(f"Connected to AICA Core version {aica.core_version()}")

The client object can be used to easily make API calls to monitor or control AICA Core. For example:

aica.set_application('my_application.yaml')
aica.start_application()
aica.load_component('my_component')
aica.unload_component('my_component')
aica.stop_application()

To check the status of predicates and conditions, the following blocking methods can be employed:

ifaica.wait_for_condition('timer_1_active', timeout=10.0):
print('Condition is true!')
else:
print('Timed out before condition was true')
ifaica.wait_for_component_predicate('timer_1', 'is_timed_out', timeout=10.0):
print('Predicate is true!')
else:
print('Timed out before predicate was true')

Refer to the available methods of the AICA client class for more advanced usage.

Network configuration

By default, the API server of AICA Core is available on the default address localhost:8080. Depending on the network configuration, the URL or port number of the AICA Core instance may be different.

For example, when using AICA Launcher on macOS, the API is bound to a different, randomly generated port to avoid conflict with reserved ports. Use the "Open in browser" button from Launcher to open AICA Studio in the browser and copy the port from the url.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
# connect to a non-default port on the local networkaica=AICA(api_key=AICA_API_KEY, url='http://localhost:55005/api')
# or connect to a different host address entirelyaica=AICA(api_key=AICA_API_KEY, url='http://192.168.0.1:55005/api')

Compatibility table

The latest version of this AICA API client will generally support the latest AICA Core version. Major version changes to the API client or to AICA Core indicate breaking changes and are not always backwards compatible. To interact with older versions of AICA Core, it may be necessary to install older versions of the client. Use the following compatibility table to determine which client version to use.

AICA Core versionAPI protocol versionMatching Python client version
>= 5.1v3>= 4.0.2
>= 5.0, < 5.1v3Unsupported
>= 4.3, < 5.0v2>= 3.1.0
>= 4.0, < 4.3v2>= 3.0.0
3.xv2>= 2.0.0
2.xv21.2.0
<= 1.xv1Unsupported

The API protocol version is a namespace for the endpoints. Endpoints under the v2 protocol have a /v2/... prefix in the URL. A change to the protocol version indicates a fundamental change to the API structure or behavior.

Between major version changes, minor updates to the AICA Core version and Python client versions may introduce new endpoints and functions respectively. If a function requires a feature that the detected AICA Core version does not yet support (as is the case when the Python client version is more up-to-date than the targeted AICA Core), then calling that function will return None with a warning.

Changes to API behavior between AICA Core versions

AICA Core versions v1.x and earlier were alpha and pre-alpha versions that are no longer supported.

AICA Core version v2.x was a beta version that introduced a new API structure under the v2 protocol namespace.

In AICA Core v3.x, live data streaming for predicates and conditions switched from using raw websockets to Socket.IO for data transfer. This constituted a breaking change to API clients, but the overall structure of the REST API remained the same, and so the API protocol version is still v2.

AICA Core versions v4.0 through v4.2 keep the same protocol structure as before under the v2 namespace. The primary breaking change from the point of the API server and client is that the /version endpoint now returns the version of AICA Core, rather than the specific version of the API server subpackage inside core. These have historically carried the same major version, but in future the core version may have major updates without any breaking changes to the actual API server version.

AICA Core versions v4.3 and later introduce authentication and access scopes to the API server. An API key with appropriate scopes is required to access the respective endpoints and functionalities.

AICA Core versions v5 and later change some endpoints paths, methods and payloads. This is mostly internal to the client implementation.

Checking compatibility

Recent client versions include a check() method to assess the client version and API compatibility.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
# check compatability between the client version and API versionifaica.check():
print('Client and server versions are compatible')
else:
print('Client and server versions are incompatible')

The latest client versions also include the following functions to check the configuration details manually.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
# get the current version of this clientprint(aica.client_version())
# get the current version of AICA Core (e.g. "4.0.0")print(aica.core_version())
# get the current API protocol version (e.g. "v2")print(aica.protocol())
# get the specific version of the API server running in AICA Core (e.g. "4.0.1")# (generally only needed for debugging purposes)print(aica.api_version())
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

History

README.md

Python AICA API Client

pip install aica-api

The AICA API client module provides simple functions for interacting with the AICA Core through a REST API.

Refer to https://docs.aica.tech for more information about the AICA System.

Authentication with an API key

For connecting to AICA Core v4.3.0 and later, an API key is required for authentication.

API keys can be generated in AICA Studio with configurable access scopes. Note that available scopes are limited to those of the currently logged-in user. A generated API key is only shown once and should be kept secret. For example, it may be exported as an environment variable. The following example key is shown for demonstrative purposes only:

export AICA_API_KEY=64ce9e8f-aa46-4ba7-814f-f169c01c957e.RwoH6A1Ti5poNKSizoWrcBEYzh7AkB0kpMq1TR59t6os

The API key must then be provided to the constructor with the api_key keyword argument:

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)

Basic usage

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
ifaica.check():
print(f"Connected to AICA Core version {aica.core_version()}")

The client object can be used to easily make API calls to monitor or control AICA Core. For example:

aica.set_application('my_application.yaml')
aica.start_application()
aica.load_component('my_component')
aica.unload_component('my_component')
aica.stop_application()

To check the status of predicates and conditions, the following blocking methods can be employed:

ifaica.wait_for_condition('timer_1_active', timeout=10.0):
print('Condition is true!')
else:
print('Timed out before condition was true')
ifaica.wait_for_component_predicate('timer_1', 'is_timed_out', timeout=10.0):
print('Predicate is true!')
else:
print('Timed out before predicate was true')

Refer to the available methods of the AICA client class for more advanced usage.

Network configuration

By default, the API server of AICA Core is available on the default address localhost:8080. Depending on the network configuration, the URL or port number of the AICA Core instance may be different.

For example, when using AICA Launcher on macOS, the API is bound to a different, randomly generated port to avoid conflict with reserved ports. Use the "Open in browser" button from Launcher to open AICA Studio in the browser and copy the port from the url.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
# connect to a non-default port on the local networkaica=AICA(api_key=AICA_API_KEY, url='http://localhost:55005/api')
# or connect to a different host address entirelyaica=AICA(api_key=AICA_API_KEY, url='http://192.168.0.1:55005/api')

Compatibility table

The latest version of this AICA API client will generally support the latest AICA Core version. Major version changes to the API client or to AICA Core indicate breaking changes and are not always backwards compatible. To interact with older versions of AICA Core, it may be necessary to install older versions of the client. Use the following compatibility table to determine which client version to use.

AICA Core versionAPI protocol versionMatching Python client version
>= 5.1v3>= 4.0.2
>= 5.0, < 5.1v3Unsupported
>= 4.3, < 5.0v2>= 3.1.0
>= 4.0, < 4.3v2>= 3.0.0
3.xv2>= 2.0.0
2.xv21.2.0
<= 1.xv1Unsupported

The API protocol version is a namespace for the endpoints. Endpoints under the v2 protocol have a /v2/... prefix in the URL. A change to the protocol version indicates a fundamental change to the API structure or behavior.

Between major version changes, minor updates to the AICA Core version and Python client versions may introduce new endpoints and functions respectively. If a function requires a feature that the detected AICA Core version does not yet support (as is the case when the Python client version is more up-to-date than the targeted AICA Core), then calling that function will return None with a warning.

Changes to API behavior between AICA Core versions

AICA Core versions v1.x and earlier were alpha and pre-alpha versions that are no longer supported.

AICA Core version v2.x was a beta version that introduced a new API structure under the v2 protocol namespace.

In AICA Core v3.x, live data streaming for predicates and conditions switched from using raw websockets to Socket.IO for data transfer. This constituted a breaking change to API clients, but the overall structure of the REST API remained the same, and so the API protocol version is still v2.

AICA Core versions v4.0 through v4.2 keep the same protocol structure as before under the v2 namespace. The primary breaking change from the point of the API server and client is that the /version endpoint now returns the version of AICA Core, rather than the specific version of the API server subpackage inside core. These have historically carried the same major version, but in future the core version may have major updates without any breaking changes to the actual API server version.

AICA Core versions v4.3 and later introduce authentication and access scopes to the API server. An API key with appropriate scopes is required to access the respective endpoints and functionalities.

AICA Core versions v5 and later change some endpoints paths, methods and payloads. This is mostly internal to the client implementation.

Checking compatibility

Recent client versions include a check() method to assess the client version and API compatibility.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
# check compatability between the client version and API versionifaica.check():
print('Client and server versions are compatible')
else:
print('Client and server versions are incompatible')

The latest client versions also include the following functions to check the configuration details manually.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
# get the current version of this clientprint(aica.client_version())
# get the current version of AICA Core (e.g. "4.0.0")print(aica.core_version())
# get the current API protocol version (e.g. "v2")print(aica.protocol())
# get the specific version of the API server running in AICA Core (e.g. "4.0.1")# (generally only needed for debugging purposes)print(aica.api_version())
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History

README.md

Python AICA API Client

pip install aica-api

The AICA API client module provides simple functions for interacting with the AICA Core through a REST API.

Refer to https://docs.aica.tech for more information about the AICA System.

Authentication with an API key

For connecting to AICA Core v4.3.0 and later, an API key is required for authentication.

API keys can be generated in AICA Studio with configurable access scopes. Note that available scopes are limited to those of the currently logged-in user. A generated API key is only shown once and should be kept secret. For example, it may be exported as an environment variable. The following example key is shown for demonstrative purposes only:

export AICA_API_KEY=64ce9e8f-aa46-4ba7-814f-f169c01c957e.RwoH6A1Ti5poNKSizoWrcBEYzh7AkB0kpMq1TR59t6os

The API key must then be provided to the constructor with the api_key keyword argument:

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)

Basic usage

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
ifaica.check():
print(f"Connected to AICA Core version {aica.core_version()}")

The client object can be used to easily make API calls to monitor or control AICA Core. For example:

aica.set_application('my_application.yaml')
aica.start_application()
aica.load_component('my_component')
aica.unload_component('my_component')
aica.stop_application()

To check the status of predicates and conditions, the following blocking methods can be employed:

ifaica.wait_for_condition('timer_1_active', timeout=10.0):
print('Condition is true!')
else:
print('Timed out before condition was true')
ifaica.wait_for_component_predicate('timer_1', 'is_timed_out', timeout=10.0):
print('Predicate is true!')
else:
print('Timed out before predicate was true')

Refer to the available methods of the AICA client class for more advanced usage.

Network configuration

By default, the API server of AICA Core is available on the default address localhost:8080. Depending on the network configuration, the URL or port number of the AICA Core instance may be different.

For example, when using AICA Launcher on macOS, the API is bound to a different, randomly generated port to avoid conflict with reserved ports. Use the "Open in browser" button from Launcher to open AICA Studio in the browser and copy the port from the url.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
# connect to a non-default port on the local networkaica=AICA(api_key=AICA_API_KEY, url='http://localhost:55005/api')
# or connect to a different host address entirelyaica=AICA(api_key=AICA_API_KEY, url='http://192.168.0.1:55005/api')

Compatibility table

The latest version of this AICA API client will generally support the latest AICA Core version. Major version changes to the API client or to AICA Core indicate breaking changes and are not always backwards compatible. To interact with older versions of AICA Core, it may be necessary to install older versions of the client. Use the following compatibility table to determine which client version to use.

AICA Core versionAPI protocol versionMatching Python client version
>= 5.1v3>= 4.0.2
>= 5.0, < 5.1v3Unsupported
>= 4.3, < 5.0v2>= 3.1.0
>= 4.0, < 4.3v2>= 3.0.0
3.xv2>= 2.0.0
2.xv21.2.0
<= 1.xv1Unsupported

The API protocol version is a namespace for the endpoints. Endpoints under the v2 protocol have a /v2/... prefix in the URL. A change to the protocol version indicates a fundamental change to the API structure or behavior.

Between major version changes, minor updates to the AICA Core version and Python client versions may introduce new endpoints and functions respectively. If a function requires a feature that the detected AICA Core version does not yet support (as is the case when the Python client version is more up-to-date than the targeted AICA Core), then calling that function will return None with a warning.

Changes to API behavior between AICA Core versions

AICA Core versions v1.x and earlier were alpha and pre-alpha versions that are no longer supported.

AICA Core version v2.x was a beta version that introduced a new API structure under the v2 protocol namespace.

In AICA Core v3.x, live data streaming for predicates and conditions switched from using raw websockets to Socket.IO for data transfer. This constituted a breaking change to API clients, but the overall structure of the REST API remained the same, and so the API protocol version is still v2.

AICA Core versions v4.0 through v4.2 keep the same protocol structure as before under the v2 namespace. The primary breaking change from the point of the API server and client is that the /version endpoint now returns the version of AICA Core, rather than the specific version of the API server subpackage inside core. These have historically carried the same major version, but in future the core version may have major updates without any breaking changes to the actual API server version.

AICA Core versions v4.3 and later introduce authentication and access scopes to the API server. An API key with appropriate scopes is required to access the respective endpoints and functionalities.

AICA Core versions v5 and later change some endpoints paths, methods and payloads. This is mostly internal to the client implementation.

Checking compatibility

Recent client versions include a check() method to assess the client version and API compatibility.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
# check compatability between the client version and API versionifaica.check():
print('Client and server versions are compatible')
else:
print('Client and server versions are incompatible')

The latest client versions also include the following functions to check the configuration details manually.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
# get the current version of this clientprint(aica.client_version())
# get the current version of AICA Core (e.g. "4.0.0")print(aica.core_version())
# get the current API protocol version (e.g. "v2")print(aica.protocol())
# get the specific version of the API server running in AICA Core (e.g. "4.0.1")# (generally only needed for debugging purposes)print(aica.api_version())
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History

README.md

Python AICA API Client

pip install aica-api

The AICA API client module provides simple functions for interacting with the AICA Core through a REST API.

Refer to https://docs.aica.tech for more information about the AICA System.

Authentication with an API key

For connecting to AICA Core v4.3.0 and later, an API key is required for authentication.

API keys can be generated in AICA Studio with configurable access scopes. Note that available scopes are limited to those of the currently logged-in user. A generated API key is only shown once and should be kept secret. For example, it may be exported as an environment variable. The following example key is shown for demonstrative purposes only:

export AICA_API_KEY=64ce9e8f-aa46-4ba7-814f-f169c01c957e.RwoH6A1Ti5poNKSizoWrcBEYzh7AkB0kpMq1TR59t6os

The API key must then be provided to the constructor with the api_key keyword argument:

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)

Basic usage

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
ifaica.check():
print(f"Connected to AICA Core version {aica.core_version()}")

The client object can be used to easily make API calls to monitor or control AICA Core. For example:

aica.set_application('my_application.yaml')
aica.start_application()
aica.load_component('my_component')
aica.unload_component('my_component')
aica.stop_application()

To check the status of predicates and conditions, the following blocking methods can be employed:

ifaica.wait_for_condition('timer_1_active', timeout=10.0):
print('Condition is true!')
else:
print('Timed out before condition was true')
ifaica.wait_for_component_predicate('timer_1', 'is_timed_out', timeout=10.0):
print('Predicate is true!')
else:
print('Timed out before predicate was true')

Refer to the available methods of the AICA client class for more advanced usage.

Network configuration

By default, the API server of AICA Core is available on the default address localhost:8080. Depending on the network configuration, the URL or port number of the AICA Core instance may be different.

For example, when using AICA Launcher on macOS, the API is bound to a different, randomly generated port to avoid conflict with reserved ports. Use the "Open in browser" button from Launcher to open AICA Studio in the browser and copy the port from the url.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
# connect to a non-default port on the local networkaica=AICA(api_key=AICA_API_KEY, url='http://localhost:55005/api')
# or connect to a different host address entirelyaica=AICA(api_key=AICA_API_KEY, url='http://192.168.0.1:55005/api')

Compatibility table

The latest version of this AICA API client will generally support the latest AICA Core version. Major version changes to the API client or to AICA Core indicate breaking changes and are not always backwards compatible. To interact with older versions of AICA Core, it may be necessary to install older versions of the client. Use the following compatibility table to determine which client version to use.

AICA Core versionAPI protocol versionMatching Python client version
>= 5.1v3>= 4.0.2
>= 5.0, < 5.1v3Unsupported
>= 4.3, < 5.0v2>= 3.1.0
>= 4.0, < 4.3v2>= 3.0.0
3.xv2>= 2.0.0
2.xv21.2.0
<= 1.xv1Unsupported

The API protocol version is a namespace for the endpoints. Endpoints under the v2 protocol have a /v2/... prefix in the URL. A change to the protocol version indicates a fundamental change to the API structure or behavior.

Between major version changes, minor updates to the AICA Core version and Python client versions may introduce new endpoints and functions respectively. If a function requires a feature that the detected AICA Core version does not yet support (as is the case when the Python client version is more up-to-date than the targeted AICA Core), then calling that function will return None with a warning.

Changes to API behavior between AICA Core versions

AICA Core versions v1.x and earlier were alpha and pre-alpha versions that are no longer supported.

AICA Core version v2.x was a beta version that introduced a new API structure under the v2 protocol namespace.

In AICA Core v3.x, live data streaming for predicates and conditions switched from using raw websockets to Socket.IO for data transfer. This constituted a breaking change to API clients, but the overall structure of the REST API remained the same, and so the API protocol version is still v2.

AICA Core versions v4.0 through v4.2 keep the same protocol structure as before under the v2 namespace. The primary breaking change from the point of the API server and client is that the /version endpoint now returns the version of AICA Core, rather than the specific version of the API server subpackage inside core. These have historically carried the same major version, but in future the core version may have major updates without any breaking changes to the actual API server version.

AICA Core versions v4.3 and later introduce authentication and access scopes to the API server. An API key with appropriate scopes is required to access the respective endpoints and functionalities.

AICA Core versions v5 and later change some endpoints paths, methods and payloads. This is mostly internal to the client implementation.

Checking compatibility

Recent client versions include a check() method to assess the client version and API compatibility.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
# check compatability between the client version and API versionifaica.check():
print('Client and server versions are compatible')
else:
print('Client and server versions are incompatible')

The latest client versions also include the following functions to check the configuration details manually.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
# get the current version of this clientprint(aica.client_version())
# get the current version of AICA Core (e.g. "4.0.0")print(aica.core_version())
# get the current API protocol version (e.g. "v2")print(aica.protocol())
# get the specific version of the API server running in AICA Core (e.g. "4.0.1")# (generally only needed for debugging purposes)print(aica.api_version())
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

History

README.md

Python AICA API Client

pip install aica-api

The AICA API client module provides simple functions for interacting with the AICA Core through a REST API.

Refer to https://docs.aica.tech for more information about the AICA System.

Authentication with an API key

For connecting to AICA Core v4.3.0 and later, an API key is required for authentication.

API keys can be generated in AICA Studio with configurable access scopes. Note that available scopes are limited to those of the currently logged-in user. A generated API key is only shown once and should be kept secret. For example, it may be exported as an environment variable. The following example key is shown for demonstrative purposes only:

export AICA_API_KEY=64ce9e8f-aa46-4ba7-814f-f169c01c957e.RwoH6A1Ti5poNKSizoWrcBEYzh7AkB0kpMq1TR59t6os

The API key must then be provided to the constructor with the api_key keyword argument:

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)

Basic usage

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
ifaica.check():
print(f"Connected to AICA Core version {aica.core_version()}")

The client object can be used to easily make API calls to monitor or control AICA Core. For example:

aica.set_application('my_application.yaml')
aica.start_application()
aica.load_component('my_component')
aica.unload_component('my_component')
aica.stop_application()

To check the status of predicates and conditions, the following blocking methods can be employed:

ifaica.wait_for_condition('timer_1_active', timeout=10.0):
print('Condition is true!')
else:
print('Timed out before condition was true')
ifaica.wait_for_component_predicate('timer_1', 'is_timed_out', timeout=10.0):
print('Predicate is true!')
else:
print('Timed out before predicate was true')

Refer to the available methods of the AICA client class for more advanced usage.

Network configuration

By default, the API server of AICA Core is available on the default address localhost:8080. Depending on the network configuration, the URL or port number of the AICA Core instance may be different.

For example, when using AICA Launcher on macOS, the API is bound to a different, randomly generated port to avoid conflict with reserved ports. Use the "Open in browser" button from Launcher to open AICA Studio in the browser and copy the port from the url.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
# connect to a non-default port on the local networkaica=AICA(api_key=AICA_API_KEY, url='http://localhost:55005/api')
# or connect to a different host address entirelyaica=AICA(api_key=AICA_API_KEY, url='http://192.168.0.1:55005/api')

Compatibility table

The latest version of this AICA API client will generally support the latest AICA Core version. Major version changes to the API client or to AICA Core indicate breaking changes and are not always backwards compatible. To interact with older versions of AICA Core, it may be necessary to install older versions of the client. Use the following compatibility table to determine which client version to use.

AICA Core versionAPI protocol versionMatching Python client version
>= 5.1v3>= 4.0.2
>= 5.0, < 5.1v3Unsupported
>= 4.3, < 5.0v2>= 3.1.0
>= 4.0, < 4.3v2>= 3.0.0
3.xv2>= 2.0.0
2.xv21.2.0
<= 1.xv1Unsupported

The API protocol version is a namespace for the endpoints. Endpoints under the v2 protocol have a /v2/... prefix in the URL. A change to the protocol version indicates a fundamental change to the API structure or behavior.

Between major version changes, minor updates to the AICA Core version and Python client versions may introduce new endpoints and functions respectively. If a function requires a feature that the detected AICA Core version does not yet support (as is the case when the Python client version is more up-to-date than the targeted AICA Core), then calling that function will return None with a warning.

Changes to API behavior between AICA Core versions

AICA Core versions v1.x and earlier were alpha and pre-alpha versions that are no longer supported.

AICA Core version v2.x was a beta version that introduced a new API structure under the v2 protocol namespace.

In AICA Core v3.x, live data streaming for predicates and conditions switched from using raw websockets to Socket.IO for data transfer. This constituted a breaking change to API clients, but the overall structure of the REST API remained the same, and so the API protocol version is still v2.

AICA Core versions v4.0 through v4.2 keep the same protocol structure as before under the v2 namespace. The primary breaking change from the point of the API server and client is that the /version endpoint now returns the version of AICA Core, rather than the specific version of the API server subpackage inside core. These have historically carried the same major version, but in future the core version may have major updates without any breaking changes to the actual API server version.

AICA Core versions v4.3 and later introduce authentication and access scopes to the API server. An API key with appropriate scopes is required to access the respective endpoints and functionalities.

AICA Core versions v5 and later change some endpoints paths, methods and payloads. This is mostly internal to the client implementation.

Checking compatibility

Recent client versions include a check() method to assess the client version and API compatibility.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
# check compatability between the client version and API versionifaica.check():
print('Client and server versions are compatible')
else:
print('Client and server versions are incompatible')

The latest client versions also include the following functions to check the configuration details manually.

importosfromaica_api.clientimportAICAAICA_API_KEY=os.getenv('AICA_API_KEY')
aica=AICA(api_key=AICA_API_KEY)
# get the current version of this clientprint(aica.client_version())
# get the current version of AICA Core (e.g. "4.0.0")print(aica.core_version())
# get the current API protocol version (e.g. "v2")print(aica.protocol())
# get the specific version of the API server running in AICA Core (e.g. "4.0.1")# (generally only needed for debugging purposes)print(aica.api_version())