diff --git a/agent-plane/agent-plane-protocol/README.md b/agent-plane/agent-plane-protocol/README.md index c551e2d..df77329 100644 --- a/agent-plane/agent-plane-protocol/README.md +++ b/agent-plane/agent-plane-protocol/README.md @@ -87,37 +87,37 @@ For a list of environment variables to configure the behaviour of the data plane See [this sample configuration file](resources/dataplane.properties) -| Property | Required | Default/Example | Description | List | -|-----------------------------------------------|----------|--------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|------| -| cx.agent.asset.default | | urn:x-arq:DefaultGraph | IRI of the default graph (federated data catalogue) | | -| cx.agent.asset.file | | https://www.w3id.org/catenax/ontology,dataspace.ttl | Initial triples for the default graph (federated data catalogue) | L | -| cx.agent.accesspoint.name | | api | Matchmaking agent endpoint name (internal) | | -| cx.agent.controlplane.protocol | (X) | http://oem-control-plane:8182 | Protocol Endpoint of the providing control plane (needed if you want to access local graphs/skills without absolute address) | | -| cx.agent.controlplane.management | X | http://oem-control-plane2:8181/management/v2 | Data Management Endpoint of the consuming control plane | | -| cx.agent.controlplane.management.provider | (X) | http://oem-control-plane:8181/management/v2 | Data Management Endpoint of the providing control plane (only if different from the consuming control plane) | | -| edc.participant.id | X | BPNL00000DUMMY | business partner number under which the consuming control plane operates | | -| edc.api.auth.code | (X) | X-Api-Key | Authentication Header for consuming control plane (if any) | | -| edc.api.auth.key | (X) | **** | Authentication Secret for consuming control plane (if any) | | +| Property | Required | Default/Example | Description | List | +|-----------------------------------------------|----------|--------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|------| +| cx.agent.asset.default | | urn:x-arq:DefaultGraph | IRI of the default graph (federated data catalogue) | | +| cx.agent.asset.file | | https://www.w3id.org/catenax/ontology,dataspace.ttl | Initial triples for the default graph (federated data catalogue) | L | +| cx.agent.accesspoint.name | | api | Matchmaking agent endpoint name (internal) | | +| cx.agent.controlplane.protocol | (X) | http://oem-control-plane:8182 | Protocol Endpoint of the providing control plane (needed if you want to access local graphs/skills without absolute address) | | +| cx.agent.controlplane.management | X | http://oem-control-plane2:8181/management | Data Management Endpoint of the consuming control plane | | +| cx.agent.controlplane.management.provider | (X) | http://oem-control-plane:8181/management | Data Management Endpoint of the providing control plane (only if different from the consuming control plane) | | +| edc.participant.id | X | BPNL00000DUMMY | business partner number under which the consuming control plane operates | | +| edc.api.auth.code | (X) | X-Api-Key | Authentication Header for consuming control plane (if any) | | +| edc.api.auth.key | (X) | **** | Authentication Secret for consuming control plane (if any) | | | edc.dataplane.token.validation.endpoint | X | http://oem-control-plane2:9999/control/token / http://localhost:8082/api/validation/ | Token validation endpoint of single control plane or the address of the integrated switching validator in case of multiple control planes | | -| edc.dataplane.token.validation.endpoints. | (X) | http://oem-control-plane:9999/control/token | Additional token validation endpoints to switch between (if multiple control planes) | * | -| web.http.callback.port | X | 8187 | Callback endpoint port | | -| web.http.callback.path | X | /callback | Callback endpoint path prefix | | -| cx.agent.callback | X | http://oem-data-plane:8187/callback/endpoint-data-reference | Callback endpoint full address as seen from the consuming control plane | | -| cx.agent.skill.contract | | cx.agent.skill.contract.default=Contract?partner=Skill | Id/IRI of the default contract put in the cx-common:publishedUnderContract property for new skills | | -| cx.agent.dataspace.synchronization | | -1 / 60000 | If positive, number of seconds between each catalogue synchronization attempt | | -| cx.agent.service.allow | | (http|edc)s?://.* | Regular expression for determining which IRIs are allowed in SERVICE calls (on top level/federated data catalogue) | | -| cx.agent.service.deny | | ^$ | Regular expression for determining which IRIs are denied in SERVICE calls (on top level/federated data catalogue) | | | -| cx.agent.service.asset.allow | | (http|edc)s://.* | Regular expression for determining which IRIs are allowed in delegated SERVICE calls (if not overriden by the cx-common:allowServicePattern address property) | | -| cx.agent.service.asset.deny | | ^$ | Regular expression for determining which IRIs are denied in delegated SERVICE calls (it not overridden by the cx-common:denyServicePattern address property) | | | -| cx.agent.dataspace.remotes | | http://consumer-edc-control:8282,http://tiera-edc-control:8282 | business partner control plane protocol urls to synchronize with | L | -| cx.agent.sparql.verbose | | false | Controls the verbosity of the SparQL Engine | | -| cx.agent.threadpool.size | | 4 | Number of threads pooled for any concurrent batch calls and synchronisation actions | | -| cx.agent.federation.batch.max | | 9223372036854775807 / 8 | Maximal number of tuples to send in one query | | -| cx.agent.negotiation.poll | | 1000 | Number of milliseconds between negotiation status checks | | -| cx.agent.negotiation.timeout | | 30000 | Number of milliseconds after which a pending negotiation is regarded as stale | | -| cx.agent.connect.timeout | | | Number of milliseconds after which a connection attempt is regarded as stale | | -| cx.agent.read.timeout | | 1080000 | Number of milliseconds after which a reading attempt is regarded as stale | | -| cx.agent.call.timeout | | | Number of milliseconds after which a complete call is regarded as stale | | -| cx.agent.write.timeout | | | Number of milliseconds after which a write attempt is regarded as stale | | -| cx.agent.edc.version | | 0.5.1 | Version of the TX EDC that is used (in case that management/transfer API changes) | | +| edc.dataplane.token.validation.endpoints. | (X) | http://oem-control-plane:9999/control/token | Additional token validation endpoints to switch between (if multiple control planes) | * | +| web.http.callback.port | X | 8187 | Callback endpoint port | | +| web.http.callback.path | X | /callback | Callback endpoint path prefix | | +| cx.agent.callback | X | http://oem-data-plane:8187/callback/endpoint-data-reference | Callback endpoint full address as seen from the consuming control plane | | +| cx.agent.skill.contract | | cx.agent.skill.contract.default=Contract?partner=Skill | Id/IRI of the default contract put in the cx-common:publishedUnderContract property for new skills | | +| cx.agent.dataspace.synchronization | | -1 / 60000 | If positive, number of seconds between each catalogue synchronization attempt | | +| cx.agent.service.allow | | (http|edc)s?://.* | Regular expression for determining which IRIs are allowed in SERVICE calls (on top level/federated data catalogue) | | +| cx.agent.service.deny | | ^$ | Regular expression for determining which IRIs are denied in SERVICE calls (on top level/federated data catalogue) | | | +| cx.agent.service.asset.allow | | (http|edc)s://.* | Regular expression for determining which IRIs are allowed in delegated SERVICE calls (if not overriden by the cx-common:allowServicePattern address property) | | +| cx.agent.service.asset.deny | | ^$ | Regular expression for determining which IRIs are denied in delegated SERVICE calls (it not overridden by the cx-common:denyServicePattern address property) | | | +| cx.agent.dataspace.remotes | | http://consumer-edc-control:8282,http://tiera-edc-control:8282 | business partner control plane protocol urls to synchronize with | L | +| cx.agent.sparql.verbose | | false | Controls the verbosity of the SparQL Engine | | +| cx.agent.threadpool.size | | 4 | Number of threads pooled for any concurrent batch calls and synchronisation actions | | +| cx.agent.federation.batch.max | | 9223372036854775807 / 8 | Maximal number of tuples to send in one query | | +| cx.agent.negotiation.poll | | 1000 | Number of milliseconds between negotiation status checks | | +| cx.agent.negotiation.timeout | | 30000 | Number of milliseconds after which a pending negotiation is regarded as stale | | +| cx.agent.connect.timeout | | | Number of milliseconds after which a connection attempt is regarded as stale | | +| cx.agent.read.timeout | | 1080000 | Number of milliseconds after which a reading attempt is regarded as stale | | +| cx.agent.call.timeout | | | Number of milliseconds after which a complete call is regarded as stale | | +| cx.agent.write.timeout | | | Number of milliseconds after which a write attempt is regarded as stale | | +| cx.agent.edc.version | | 0.5.1 | Version of the TX EDC that is used (in case that management/transfer API changes) | | diff --git a/agent-plane/agent-plane-protocol/resources/dataplane.properties b/agent-plane/agent-plane-protocol/resources/dataplane.properties index 80f6daa..8912391 100644 --- a/agent-plane/agent-plane-protocol/resources/dataplane.properties +++ b/agent-plane/agent-plane-protocol/resources/dataplane.properties @@ -61,8 +61,8 @@ edc.dataplane.token.validation.endpoints.provider=http://providing-control-plane edc.dataplane.token.validation.endpoints.consumer=http://consuming-control-plane:9999/control/token cx.agent.controlplane.protocol=http://consuming-control-plane:8282 -cx.agent.controlplane.management=http://consuming-control-plane:8181/management/v2 -cx.agent.controlplane.management.provider=http://providing-control-plane:8181/management/v2 +cx.agent.controlplane.management=http://consuming-control-plane:8181/management +cx.agent.controlplane.management.provider=http://providing-control-plane:8181/management cx.agent.callback=http://agent-plane:8187/callback/endpoint-data-reference cx.agent.skill.contract.default=Contract?partner=Skill cx.agent.edc.version=0.5.1 diff --git a/agent-plane/agent-plane-protocol/src/main/java/org/eclipse/tractusx/agents/edc/service/DataManagement.java b/agent-plane/agent-plane-protocol/src/main/java/org/eclipse/tractusx/agents/edc/service/DataManagement.java index 7114736..ea178f7 100644 --- a/agent-plane/agent-plane-protocol/src/main/java/org/eclipse/tractusx/agents/edc/service/DataManagement.java +++ b/agent-plane/agent-plane-protocol/src/main/java/org/eclipse/tractusx/agents/edc/service/DataManagement.java @@ -18,6 +18,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; +import jakarta.json.JsonArray; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; import okhttp3.*; import org.eclipse.tractusx.agents.edc.AgentConfig; import jakarta.ws.rs.InternalServerErrorException; @@ -27,11 +32,16 @@ import org.eclipse.edc.spi.types.TypeManager; import org.eclipse.tractusx.agents.edc.jsonld.JsonLd; import org.eclipse.tractusx.agents.edc.model.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.util.Collection; import java.util.List; +import java.util.Map; +import java.util.Set; import static java.lang.String.format; @@ -45,7 +55,7 @@ public class DataManagement { * some constants when interacting with control plane */ public static final String DSP_PATH="%s/api/v1/dsp"; - public static final String CATALOG_CALL = "%s/catalog/request"; + public static final String CATALOG_CALL = "%s%s/catalog/request"; // catalog request 0.5.>=1 public static final String CATALOG_REQUEST_BODY = "{" + "\"@context\": {}," + @@ -59,7 +69,7 @@ public class DataManagement { "\"providerUrl\": \"%s\", " + "\"querySpec\": %s }"; - public static final String ASSET_CREATE_CALL = "%s/assets"; + public static final String ASSET_CREATE_CALL = "%s%s/assets"; public static final String ASSET_CREATE_BODY="{\n" + " \"@context\": {\n" + " \"rdf\": \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\",\n" + @@ -97,7 +107,43 @@ public class DataManagement { " \"proxyBody\": \"true\"\n" + " }\n" + "}\n"; - public static final String ASSET_CALL = "%s/assets/request"; + + public static final String SKILL_ASSET_CREATE_BODY_V3 = "{\n" + + " \"@context\": {\n" + + " \"rdf\": \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\",\n" + + " \"rdfs\": \"http://www.w3.org/2000/01/rdf-schema#\",\n" + + " \"cx-common\": \"https://w3id.org/catenax/ontology/common#\",\n" + + " \"sh\": \"http://www.w3.org/ns/shacl#\"\n" + + " },\n" + + " \"@id\": \"%1$s\", \n" + + " \"properties\": {\n" + + " \"name\": \"%2$s\",\n" + + " \"description\": \"%3$s\",\n" + + " \"version\": \"%4$s\",\n" + + " \"contenttype\": \"application/json, application/xml\",\n" + + "%5$s" + + " \"rdf:type\": \"cx-common:SkillAsset\",\n" + + " \"rdfs:isDefinedBy\": \"%6$s\",\n" + + " \"cx-common:implementsProtocol\": \"cx-common:Protocol?w3c:http:SKILL\",\n" + + " \"cx-common:distributionMode\": \"%7$s\",\n" + + " \"cx-common:isFederated\": \"%8$b^^xsd:boolean\"\n" + + " },\n" + + " \"privateProperties\": {\n" + + " \"cx-common:query\":%9$s\n" + + " },\n" + + " \"dataAddress\": {\n" + + " \"id\":\"%1$s\",\n" + + " \"@type\": \"DataAddress\",\n" + + " \"type\": \"cx-common:Protocol?w3c:http:SKILL\",\n" + + " \"baseUrl\":\"https://w3id.org/catenax\",\n" + + " \"proxyPath\": \"false\",\n" + + " \"proxyMethod\": \"true\",\n" + + " \"proxyQueryParams\": \"true\",\n" + + " \"proxyBody\": \"true\"\n" + + " }\n" + + "}\n"; + + public static final String ASSET_CALL = "%s%s/assets/request"; // negotiation request 0.5.>=1 public static final String NEGOTIATION_REQUEST_BODY="{\n" + @@ -129,9 +175,9 @@ public class DataManagement { "}\n" + "}"; - public static final String NEGOTIATION_INITIATE_CALL = "%s/contractnegotiations"; - public static final String NEGOTIATION_CHECK_CALL = "%s/contractnegotiations/%s"; - public static final String TRANSFER_INITIATE_CALL = "%s/transferprocesses"; + public static final String NEGOTIATION_INITIATE_CALL = "%s/v2/contractnegotiations"; + public static final String NEGOTIATION_CHECK_CALL = "%s/v2/contractnegotiations/%s"; + public static final String TRANSFER_INITIATE_CALL = "%s/v2/transferprocesses"; public static final String TRANSFER_REQUEST_BODY="{\n" + " \"@context\": {\n" + @@ -154,8 +200,8 @@ public class DataManagement { " \"isFinite\": true\n" + " }\n" + "}"; - public static final String TRANSFER_CHECK_CALL = "%s/transferprocesses/%s"; - public static final String AGREEMENT_CHECK_CALL = "%s/contractagreements/%s"; + public static final String TRANSFER_CHECK_CALL = "%s/v2/transferprocesses/%s"; + public static final String AGREEMENT_CHECK_CALL = "%s/v2/contractagreements/%s"; /** * references to EDC services @@ -203,7 +249,7 @@ public DcatCatalog findContractOffers(String remoteControlPlaneIdsUrl, String as * @throws IOException in case something went wrong */ public DcatCatalog getCatalog(String remoteControlPlaneIdsUrl, QuerySpec spec) throws IOException { - var url = String.format(CATALOG_CALL,config.getControlPlaneManagementUrl()); + var url = String.format(CATALOG_CALL,config.getControlPlaneManagementUrl(),"/v2"); // use a version specific call String template = config.isPrerelease() ? CATALOG_REQUEST_BODY_PRERELEASE : CATALOG_REQUEST_BODY; @@ -236,7 +282,8 @@ public DcatCatalog getCatalog(String remoteControlPlaneIdsUrl, QuerySpec spec) t */ public List listAssets(QuerySpec spec) throws IOException { - var url = String.format(ASSET_CALL,config.getControlPlaneManagementProviderUrl()); + String version = config.isPrerelease() ? "/v2" : "/v3"; + var url = String.format(ASSET_CALL, config.getControlPlaneManagementProviderUrl(), version); var assetObject=(ObjectNode) objectMapper.readTree(objectMapper.writeValueAsString(spec)); assetObject.put("@context",objectMapper.createObjectNode()); var assetSpec = objectMapper.writeValueAsString(assetObject); @@ -274,13 +321,16 @@ public List listAssets(QuerySpec spec) throws IOException { */ public IdResponse createOrUpdateSkill(String assetId, String name, String description, String version, String contract, String ontologies, String distributionMode, boolean isFederated, String query) throws IOException { - var url = String.format(ASSET_CREATE_CALL,config.getControlPlaneManagementProviderUrl()); + String apiVersion = config.isPrerelease() ? "/v2" : "/v3"; + var url = String.format(ASSET_CREATE_CALL, config.getControlPlaneManagementProviderUrl(), apiVersion); if(contract!=null) { contract=String.format(" \"cx-common:publishedUnderContract\": \"%1$s\",\n",contract); } else { contract=""; } - var assetSpec = String.format(ASSET_CREATE_BODY,assetId,name,description,version,contract,ontologies,distributionMode,isFederated,query); + String spec = config.isPrerelease() ? ASSET_CREATE_BODY : SKILL_ASSET_CREATE_BODY_V3; + + var assetSpec = String.format(spec, assetId, name, description, version, contract, ontologies, distributionMode, isFederated, query); var request = new Request.Builder().url(url).post(RequestBody.create(assetSpec,MediaType.parse("application/json"))); config.getControlPlaneManagementHeaders().forEach(request::addHeader); @@ -293,14 +343,15 @@ public IdResponse createOrUpdateSkill(String assetId, String name, String descri throw new InternalServerErrorException(format("Control plane responded with: %s %s", response.code(), body != null ? body.string() : "")); } - var patchRequest=new Request.Builder().url(url).patch(RequestBody.create(assetSpec,MediaType.parse("application/json"))); - config.getControlPlaneManagementHeaders().forEach(patchRequest::addHeader); + var putRequest=new Request.Builder().url(url).put(RequestBody.create(assetSpec,MediaType.parse("application/json"))); + config.getControlPlaneManagementHeaders().forEach(putRequest::addHeader); - try (var patchResponse = httpClient.newCall(patchRequest.build()).execute()) { - body=patchResponse.body(); - if(!patchResponse.isSuccessful() || body==null) { + try (var putResponse = httpClient.newCall(putRequest.build()).execute()) { + body=putResponse.body(); + if(!putResponse.isSuccessful() || body==null) { throw new InternalServerErrorException(format("Control plane responded with: %s %s", response.code(), body != null ? body.string() : "")); } + return new IdResponse(jakarta.json.Json.createObjectBuilder().add("@id","assetId").build()); } } diff --git a/charts/agent-connector-azure-vault/Chart.yaml b/charts/agent-connector-azure-vault/Chart.yaml index 9648624..c00627f 100644 --- a/charts/agent-connector-azure-vault/Chart.yaml +++ b/charts/agent-connector-azure-vault/Chart.yaml @@ -42,7 +42,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 1.10.2-SNAPSHOT +version: 1.10.3-SNAPSHOT # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. diff --git a/charts/agent-connector-azure-vault/templates/deployment-dataplane.yaml b/charts/agent-connector-azure-vault/templates/deployment-dataplane.yaml index 38394ae..176fbef 100644 --- a/charts/agent-connector-azure-vault/templates/deployment-dataplane.yaml +++ b/charts/agent-connector-azure-vault/templates/deployment-dataplane.yaml @@ -179,7 +179,7 @@ spec: - name: "CX_AGENT_CONTROLPLANE_PROTOCOL" value: {{ printf "http://%s-controlplane:%v" ( include "txdc.fullname" $root ) $root.Values.controlplane.endpoints.protocol.port | quote }} - name: "CX_AGENT_CONTROLPLANE_MANAGEMENT" - value: {{ printf "http://%s-controlplane:%v%s%s" ( include "txdc.fullname" $root ) $root.Values.controlplane.endpoints.management.port $root.Values.controlplane.endpoints.management.path "/v2" | quote }} + value: {{ printf "http://%s-controlplane:%v%s" ( include "txdc.fullname" $root ) $root.Values.controlplane.endpoints.management.port $root.Values.controlplane.endpoints.management.path | quote }} {{- end }} {{- if $dataplane.agent.default }} diff --git a/charts/agent-connector-memory/Chart.yaml b/charts/agent-connector-memory/Chart.yaml index 8e268fe..0c62975 100644 --- a/charts/agent-connector-memory/Chart.yaml +++ b/charts/agent-connector-memory/Chart.yaml @@ -42,7 +42,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 1.10.2-SNAPSHOT +version: 1.10.3-SNAPSHOT # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. diff --git a/charts/agent-connector-memory/templates/deployment-dataplane.yaml b/charts/agent-connector-memory/templates/deployment-dataplane.yaml index 3462a38..534486d 100644 --- a/charts/agent-connector-memory/templates/deployment-dataplane.yaml +++ b/charts/agent-connector-memory/templates/deployment-dataplane.yaml @@ -179,7 +179,7 @@ spec: - name: "CX_AGENT_CONTROLPLANE_PROTOCOL" value: {{ printf "http://%s-controlplane:%v" ( include "txdc.fullname" $root ) $root.Values.controlplane.endpoints.protocol.port | quote }} - name: "CX_AGENT_CONTROLPLANE_MANAGEMENT" - value: {{ printf "http://%s-controlplane:%v%s%s" ( include "txdc.fullname" $root ) $root.Values.controlplane.endpoints.management.port $root.Values.controlplane.endpoints.management.path "/v2" | quote }} + value: {{ printf "http://%s-controlplane:%v%s" ( include "txdc.fullname" $root ) $root.Values.controlplane.endpoints.management.port $root.Values.controlplane.endpoints.management.path | quote }} {{- end }} {{- if $dataplane.agent.default }} diff --git a/charts/agent-connector/Chart.yaml b/charts/agent-connector/Chart.yaml index 4259f05..88b6347 100644 --- a/charts/agent-connector/Chart.yaml +++ b/charts/agent-connector/Chart.yaml @@ -41,7 +41,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 1.10.2-SNAPSHOT +version: 1.10.3-SNAPSHOT # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. diff --git a/charts/agent-connector/templates/deployment-dataplane.yaml b/charts/agent-connector/templates/deployment-dataplane.yaml index 10594fc..4908279 100644 --- a/charts/agent-connector/templates/deployment-dataplane.yaml +++ b/charts/agent-connector/templates/deployment-dataplane.yaml @@ -179,7 +179,7 @@ spec: - name: "CX_AGENT_CONTROLPLANE_PROTOCOL" value: {{ printf "http://%s-controlplane:%v" ( include "txdc.fullname" $root ) $root.Values.controlplane.endpoints.protocol.port | quote }} - name: "CX_AGENT_CONTROLPLANE_MANAGEMENT" - value: {{ printf "http://%s-controlplane:%v%s%s" ( include "txdc.fullname" $root ) $root.Values.controlplane.endpoints.management.port $root.Values.controlplane.endpoints.management.path "/v2" | quote }} + value: {{ printf "http://%s-controlplane:%v%s" ( include "txdc.fullname" $root ) $root.Values.controlplane.endpoints.management.port $root.Values.controlplane.endpoints.management.path | quote }} {{- end }} {{- if $dataplane.agent.default }}