Monday, March 9, 2026

#1125 - OIC Agent for diffing between 2 integration flows


Introduction 

I have a very simple use case here - my first integration, TESTER, invokes 3 apps -

  • Netsuite
  • QuickBooks
  • SAP
My second integration, TESTER2, is simply a new version of TESTER. It invokes the 3 apps mentioned above, however, there may be some payload changes, new fields added etc.

I need to know the mapping deltas between these 2. e.g. the map for the Netsuite invoke in TESTER has 4 fields -

  • orderNr
  • customer
  • product
  • price
While the same invoke in TESTER2 expects the extra field, country.

Net, net, I need to do a diff of the maps between both flows.

Leveraging the OIC Factory API

The factory api helps us here, let's say my steps are as follows - 

  • Run TESTER
  • Run TESTER2
  • Get the instanceId of the TESTER flow
  • Use that instanceId to retrieve the activity stream for that instance
  • Retrieve the output of the MAP action for the 3 invokes
  • Get the instanceId of the TESTER2 flow
  • Use that instanceId to retrieve the activity stream for that instance
  • Retrieve the output of the MAP action for the 3 invokes
  • Compare and contrast. Output the deltas.

I use the following factory apis -

I will need to get the latest instance of the integration, based on creationId. Then retrieve the relevant instanceId e.g.

I then use the instanceId to retrieve the activity stream.




Each flow has milestones and I'm only interested in the following mapping milestones - 

"m1Post,m2Post,m3Post"

 Let's check out one of the entries for such a milestone -

The payload field contains the result of the map in xml format. This is what I need to compare and contrast between both flows.


OIC Agent Tools

 
 I'll need to give the agent some tools to work with. I begin with the 2 factory api calls.

I also add a wait tool, to ensure the logs have been updated, before I retrieve them.


The 2 integrations I need to validate are in a separate project, they are called TESTER and TESTER2.

Each invokes the 3 ERP create integrations, but different versions - 

TESTER invokes version 1.0 of each, while TESTER2 invokes version 2.0

I need to see if there are any mapping deltas between the 2 flows.

Now back to my tools, I include another one, which will start the test, invoking TESTER and TESTER2 -


I also include a "Notify" tool to email results to interested parties.

Naturally, all of these tools are integrations, which can be exposed as agent tools with one mouse click.

The final tool I create is - Set Trace to Debug. This is a preparatory step to ensure the 2 integrations, TESTER and TESTER2, are running in Debug mode. This is required to ensure the map results are written to the activity stream.


OIC Agent

I use he ReAct pattern and configure my agent as follows - 

Role is set to - 

you are a tester that runs a test and compares outputs of map actions in OIC flows.


Guidelines set as follows - 

----------

The prompt you receive will contain the input you require to run the test.


#### 1. Run Regression Test

The tool you will use requires the following inputs - interationId1 + version nr - integrationId2 + version nr - resource and order details. Output all these details and then run  **Run Regression Tests**. Then output the response from the tool.


#### 2. Wait for the logs to be updated

Run the **wait** tool, set the waitInSecs parameter to 30.

Output the response.


#### 2. Get the instance id for the first test

Get the instance id of the integration with the id integrationId1, passed in the prompt. Use the **Get OIC Instances** tool for this. Set the timewindow parameter to 1h.

 Parse the response as follows -

2.1. check for the entry for the integrationId1 passed in the prompt. This should match the value of the integrationId field. The instanceId is 3 fields before the integrationId entry. e.g. 

{

            "creationDate": "2026-03-06T18:22:58.448+0000",

            "date": "2026-03-06T18:22:58.848+0000",

       ...

            "instanceId": "gKMQcBmJEfGsAQHrZc0f7Q",

            "instanceReportingLevel": "Debug",

            "integration": "TESTER|01.00.0000|AA_MAERSK_AGENT_REGRES_TESTS",

            "integrationId": "TESTER",


Always take the instanceId with the correct integrationId and the most recent creationDate value, because there may be more entries for the same integrationId.


Output the instanceId you find as "*** First Test Instance Id is ***" + instanceId +  " executed at " + creationDate.


Then take the instanceId field value for the first test and use it to invoke the **Get Instance Activity Stream** tool.


2.2. Parse the result, looking for the field "m1Post", then take the value of the the following payload field and format it as proper XML. Output the result as value of integrationId1 + "  Output of Map1  " + the proper XML, e.g. TESTER Output of Map1 <xml>.


2.3. Parse the result, looking for the field "m2Post", then take the value of the the following payload field and format it as proper XML. Output the result as value of integrationId1 + "  Output of Map2  " + the proper XML, e.g. TESTER Output of Map2 <xml>.

2.4. Parse the result, looking for the field "m3Post", then take the value of the the following payload field and format it as proper XML. Output the result as value of integrationId1 + "  Output of Map3  " + the proper XML, e.g. TESTER Output of Map3 <xml>.


--

#### 3. Get the instance id for the second test

Get the instance id of the integration with the id integrationId2, passed in the prompt. Use the **Get OIC Instances** tool for this. Set the timewindow parameter to 1h.

 Parse the response as follows -

1.1. check for the entry for the integrationId2 passed in the prompt. This should match the value of the integrationId field. The instanceId is 3 fields before the integrationId entry. e.g. 

{

            "creationDate": "2026-03-06T18:22:58.448+0000",

            "date": "2026-03-06T18:22:58.848+0000",

       ...

            "instanceId": "gKMQcBmJEfGsAQHrZc0f7Q",

            "instanceReportingLevel": "Debug",

            "integration": "TESTER2|01.00.0000|AA_MAERSK_AGENT_REGRES_TESTS",

            "integrationId": "TESTER2",


Always select the instanceId with the correct integrationId and the most recent creationDate value, because there may be more entries for the same integrationId.


Output the instanceId you find as "*** Second Test Instance Id is ***" + instanceId +  " executed at " + creationDate.


Then take the instanceId field value for the second test and use it to invoke the **Get Instance Activity Stream** tool.


1.2. Parse the result, looking for the field "m1Post", then take the value of the the following payload field and format it as proper XML.  Output the result as value of integrationId2 + "  Output of Map1  " + the proper XML, e.g. TESTER2 Output of Map1 <xml>.


1.3. Parse the result, looking for the field "m2Post", then take the value of the the following payload field and format it as proper XML.Output the result as value of integrationId2 + "  Output of Map2  " + the proper XML, e.g. TESTER2 Output of Map2 <xml>.


1.4. Parse the result, looking for the field "m3Post", then take the value of the the following payload field and format it as proper XML. Output the result as value of integrationId2 + "  Output of Map3  " + the proper XML, e.g. TESTER2 Output of Map3 <xml>.

--


Compare the structure of the xml payloads from integrationId1 and integrationId2 and output the deltas. I am looking for fields that are added or missing.

Finally send the comparison results as an email using the **Notify** tool. Set the email parameter to niall.commiskey@oracle.com. Set the subject to "Diffing result for " + integrationId1 + " and " + integrationId2.

Set the body to the result of the comparison you just performed.  

--------

Run the Agent

Just up front, the deltas are as follows -

TESTER

  • payload for Netsuite invoke includes orderNr, customer, product, price
  • payload for QuickBooks invoke includes orderNr, customer, product, price
  • payload for SAP invoke includes orderNr, customer, product, price

TESTER2

  • payload for Netsuite invoke includes orderNr, customer, product, price, country
  • payload for QuickBooks invoke includes orderNr, customer, product, price
  • payload for SAP invoke includes orderNr, customer, product, price, status

Let's see if the agent can work this out.

It found the structure delta in the Netsuite map.

It also highlighted TESTER returns the orderNr with the prefix, Netsuite-, excellent.


Map2 - no structural change.

Map3 - TESTER2 has the extra field, status, for the SAP invoke.

I check my email - 

Summa Summarum

Granted, I did this in a hurry. I need to optimise the guidelines, but I hope I have demonstrated the power available to you here. Net, net, the world is your oyster!















 

Tuesday, March 3, 2026

#1124 - OIC Announcements

Introduction

According to the docsSystem announcements provide timely and important information to Oracle Integration users. Your tenancy displays system announcements only after an administrator creates a policy that allows the announcements. Creating the policy is a one-time action that applies to all Oracle Integration instances in the tenancy.

I check out my OIC instance - 

and see nada. It is imperative to activate announcements in the OIC UI, because many OIC users do not have OCI console access, and this information can be crucial. 

So here are the 2 policies I need to apply - 
allow service integration to {ANNOUNCEMENT_LIST} in tenancy
allow service integration to {ANNOUNCEMENT_READ} in tenancy

These I apply in the root compartment.

But, before I do that, let's check out the announcements in the OCI console - Governance & Administration -> Announcements

Here is one such announcement - 
Note, I have 4 of these announcements, why so many?

Let's take a step back - I am viewing these announcements in the context of a specific compartment. I check how many OIC instances I have in this compartment - 3 in one region, another in Chicago.

Now back to the announcements- 
I open the first one - and click on Impacted resources

Ok, so that's my NiallC-Demo instance addressed.

I could now mark that announcement as read - 

The second announcement is for the resource - devShape.

The 3rd is for Ruck3.
The 4th is for the OIC instance in Chicago.
 
That's that cleared up; net, net - one announcement per service instance.

Now I'll apply the policy at root level - 
Now back to my OIC UI - 

Announcements are now surfaced.

Summa Summarum

This is a must do for OIC admins, so, hopefully, you've all done it, if not...















#1123 - OIC Tools powering Private Agent Factory

Introduction

This is a follow up on the previous PAF post. It's a slight variation on my ubiquitous Order Processing Agent & Tools

Here the orders are in a DB and a user can browse the DB table and decide which orders to process e.g. I see shedloads of orders, but decide for some reason only know to myself to just process order with the number 678.  

Creating the Flow in Private Agent Factory

Let's work thru these, left to right - 

Chat input - the user input, such as process order 678.

Agent - this agent takes the input and extracts the orderNr, and surface it in an SQL statement e.g. SELECT * from orders WHERE orderNr = '678'.

The custom instructions - Parse the chat input and extract the order number.
Use that order number to create a valid SQL Select statement against the orders table -
Select * from orders where orderNr = 'extracted orderNumber'  
Don't include a ; at the end of the SQL statement and ensure there are no extra invisible characters in the string you return

I join this to the SQL Query action.

Now to the order processing agent - 

Here I just push the result of the SQL execution to the Order Processing Agent.

Click on Playground, to test the flow  - 


Summa Summarum

Private Agent Factory is yet another compelling agent framework offering from ORCL. OIC based tools are the lingua franca here, so what stopping you getting started on your Agentic AI journey?


 






Sunday, March 1, 2026

#1122 - Langflow Agent invoking Agent example

Introduction 

Here is a simple example of agent invoking agent. I have 2 agents, each backed by tools running on OIC.
  • our Order Processing Agent - hopefully well known to you all
  • our CRM agent - responsible for managing customer order history
Our CRM agent has access to the following tool - 

My order processing flow has been augmented as follows - 

Note the new actions - 
  • API Request
  • Custom Component - Agent -> Webhook Body
The Custom Component transforms the agent output into the required format for the API Request.

So which API are we requesting?
Well, here's the second flow - 

The core is the Agent/MCP Tools that update our CRM system, after the customer's order has been processed.

The initial action is the Webhook, which is what the API Request from the first flow calls. The next 2 actions, marshal the incoming data int the correct format - 

I probably don't need 2 here, just showing my langflow inadequacy.

The Parser output is the input to the Agent

Note the 2 Chat Output actions; these will show the request and response from the agent.
  
Now I run the first agent, processing the following order -  

create order with the order number 310397 for Irish customer Riobard Crowley, for the product, iBike, price is 456. Customer email is xxx@gmail.com

I check the second flow in Playground -

I check in OIC - 

Summa Summarum

This scenario was simple to implement, thanks to chatGPT. Net, net - no matter which agent topology you have, OIC tools are there for you. 





Friday, February 27, 2026

#1121 - Mistral AI - kicking the tyres of this compelling European LLM

Introduction

So what is it?
From Wikipedia
Mistral AI is a premier French AI startup, founded in 2023 and valued over US$14 billion by 2025, that develops high-performance, cost-efficient, and largely open-weight large language models (LLMs). It offers versatile models—including Mistral Large 3 and Codestral—optimized for tasks like text generation, coding, and multilingual reasoning

A European LLM, excellent!

I'm starting with the Experiment for free option -

I get my api key -

and off I go - 

Postman & Mistral AI

Sanity test passed!

OIC & Mistral AI

Now to OIC, here I create a new project and add a REST (invoke) connection -

I also add a REST (trigger) connection -

I create a simple sync integration - 

Input and output are simple strings.

I add the Mistral invoke - 

Here is the full Response structure - 

{
    "id": "33b51594fea144cf8d4669abd35478e9",
    "created": 1772190410,
    "model": "mistral-large-latest",
    "usage": {
        "prompt_tokens": 11,
        "total_tokens": 1137,
        "completion_tokens": 1126,
        "prompt_tokens_details": {
            "cached_tokens": 0
        }
    },
    "object": "chat.completion",
    "choices": [
        {
            "index": 0,
            "finish_reason": "stop",
            "message": {
                "role": "assistant",
                "tool_calls": null,
                "content": "somecontent"
            }
        }
    ]
}


I complete the Map actions - first Map - 

                      I complete the Map actions - second Map - 



I activate and run - 

                              Second sanity test passed.

Langflow, Mistral AI and OIC Tools


                     Note how I use the Mistral AI component, to allow the Agent to use this LLM.

 

                                      I just need to specify the Model name and Mistral API Key.


The rest you've already seen in earlier posts, OIC based MCP Tools etc.

Summa Summarum

Mistral AI is simple to use, be it from Postman or as the LLM for your agent in Langflow. What's in a name? Mistral - a strong, cold, dry, northwesterly wind that blows from southern France into the Mediterranean Sea, particularly in winter and spring. Originating from the Occitan word for "master," this wind is known for its force, often reaching over 100 km/h

 Courtesy of Wikipedia.