Enneo allows for the embedding of custom code in the form of “User Defined Functions” and applying it in various areas. These functions can be used notably in the business logic of rule-based AI agents, in webhooks, or event implementations; anywhere where custom code or SDKs are utilized.

Management of User Defined Functions

User defined functions are managed in the System Integration section of the settings. Here, any number of custom functions can be stored.
Functions are stored as code fragments that implement specific application logic and can be called in various integration scenarios.

Possible Applications

User Defined Functions offer a wide range of applications. For example:
  • External system interface calls: For ERP, task management, or archive systems.
  • Connection of output management systems: For sending notifications, for example.
  • Outsourcing complex processes: In the form of reusable building blocks.
With these functionalities, Enneo enhances adaptability and allows for the integration of specific business logic into AI-based customer support.

Calling User Defined Functions

Enneo can store and utilize custom functions. The following calls are possible, using a User-Defined-Function named ‘my-udf’ as an example: Within Enneo using Python SDK:
sdk.ApiEnneo.executeUdf('my-udf', {"parameter1": "value1", "parameter2": "value2"}, 'serviceWorker')
Within Enneo using PHP SDK:
\EnneoSDK\ApiEnneo::executeUdf('my-udf', ['parameter1' => 'value1', 'parameter2' => 'value2'],'serviceWorker');
Via external Web-Request:
    POST https://your-subdomain.enneo.ai/api/mind/executor/execute/my-udf
    Payload: '{"parameter1": "value1", "parameter2": "value2"}'

Storage Object for User Defined Functions

Any JSON object can be used as an Enneo internal storage object for custom functions. This allows data to be stored and retrieved using Enneo SDK.
\EnneoSDK\Setting::set('udfStorage', ['my' => 'data']);
$storedData = \EnneoSDK\Setting::get('udfStorage');

Example: Calling a Third-Party System’s API

Firstly, necessary data is set in the storage object for custom functions:
{
  "thirdParty": {
    "oauth": {
      "clientId": "123456789",
      "grantType": "client_credentials",
      "clientSecret": "abcdefg.....hijklmnop",
      "tokenEndpoint": "https://token-url/oauth2/token",
      "baseUrl": "https://third-party-url/api"
    }
  }
}
In the second step, a custom function fetch-thirdparty-token can be implemented to load the credentials. This approach is especially useful when loading the credentials can be reused in several other processes.
<?php

// Load Enneo SDK
require(getenv()['SDK']);

// Load storage object for custom functions
$udfStorage = \EnneoSDK\Setting::get('udfStorage');


// Loading the token
$clientId = $udfStorage->thirdParty->oauth->clientId;
$clientSecret = $udfStorage->thirdParty->oauth->clientSecret;

$result = \EnneoSDK\Api::call(
    method: 'POST',
    url: $udfStorage->thirdParty->oauth->tokenEndpoint,
    headers: [
        'Authorization: Basic ' . base64_encode($clientId . ':' . $clientSecret),
        'Content-Type: application/x-www-form-urlencoded',
        'Accept: application/json'
    ],
    params: http_build_query(['grant_type' => $udfStorage->thirdParty->oauth->grantType ?? 'client_credentials',
        'scope' => $udfStorage->thirdParty->oauth->scope ?? null])
);

// The output is in JSON format and can be used in the corresponding code after the call
echo json_encode(['accessToken' => $result->access_token,
    'accessTokenExpiresAt' => date("Y-m-d H:i:s T", time() + $result->expires_in),
    "baseUrl" => $udfStorage->thirdParty->baseUrl,
    "headers" => $udfStorage->thirdParty->headers ?? [],
    "apiName" => $udfStorage->thirdParty->apiName ?? "Customer API",
]);
Subsequently, the implementation of the function third-party-api-call for the actual API call can occur:
<?php

// Load SDK
require(getenv()['SDK']);

// Load the token using the previously defined "fetch-thirdparty-token" function
$credentials = \EnneoSDK\ApiEnneo::executeUdf('fetch-thirdparty-token', []);

// Load input parameters
$in = \EnneoSDK\Input::load();

// Prepare the header for the Third-Party-API request
$headers = [
    'Authorization: Bearer '. $credentials->accessToken,
    'Accept: application/json'
];
foreach (($credentials->headers ?? []) as $key => $val) {
    $headers[] = "$key: $val";
}

// API call and output
$res = \EnneoSDK\Api::call(
    method: $in->method,
    url: $credentials->baseUrl.'/'.$in->api,
    headers: $headers,
    params: $in->params
);

// Output result
echo json_encode($res);
This structure allows for flexible use and integration of custom code within Enneo to depict specific business logic or seamlessly connect external systems.

Calling Custom Functions

Custom functions in the code are called using executeUdf:
<?php

// Load Enneo SDK
require(getenv()['SDK']);

// Prepare payload for the API call of the third-party system
$payload = [
    'ticket-id' => 123,
    'key' => 'value'
];

// Call the custom function "third-party-api-call"
// this function takes an object as an input parameter:
// [
//      'method' => 'POST',
//      'api' => 'item',
//      'params' => [
//          'ticket-id' => 123,
//           'key' => 'value'
//      ]
// ]
EnneoSDK\ApiEnneo::executeUdf(
    'third-party-api-call',
    ['method' => 'POST', 'api' => 'item', 'params' => $payload]
);