The IIF file format for Amtelco scripts

Amtelco IIF files explained!

The IIF file format for Amtelco scripts
Metadata for a script included in an Amtelco .iif file

Today we're going to explore the generalized file-format for .iif files generated by the Amtelco Intelligent Series Supervisor application.

Before We Begin

I've observed a correlation between attendance and my weekly emails, so I'm going to do my best to keep up with these. As always, we publish our schedules online ahead of time!

Add Tues @ 12pm Eastern and Thur @ 3pm Eastern to your calendar so you don't forgot!

Office Hours

A weekly meeting with Call Theory and fellow customers to learn, ask questions, and network over general IT, call center, and Amtelco topics.

Scripting Sessions

A weekly meeting to train Amtelco Intelligent Series scripting topics from Basic, Intermediate, and Advanced topics on a repeating schedule.

Examining IIF Files

The goal behind this exercise is to better understand how scripting works underneath-the-hood: perhaps that will lead to improved tools for testing and development.

Slack script XML after being gunzipped, null byte removal, and beautify applied.


About IIF files

I'm not exactly sure what IIF is supposed to mean, but I'm going to go ahead and designate it the Intelligent Import Format (IIF) for the time being. I couldn't find details on Tech Helper and the only other reference I found was InfImpFile which sounds like it's for Infinity and not Intelligent. (Although, stranger things have happened.)

Essentially, you can export one or more Intelligent Series account scripts, system scripts, or templates to a stand-alone .iif file which can then be copied to another Amtelco system and imported.

This appears to be a proprietary file-format used only by Amtelco

This file format and import/export feature is what has enabled and empowered Amtelco call centers to share scripting with peers - something NAEO members regularly do, for example.

The Intelligent Import Format

In a nutshell, .iif files are binary data-formats that include concatenated, individually gzipped sections of XML or JSON.

The first string in the binary file will be one of following, determining whether the import will be done via the XML or JSON file versions:

  • SCRIPT_EXPORT_FILE_0 - Script sections are in XML format
  • SCRIPT_EXPORT_FILE_1 - Script sections are in JSON format

Once we know how the script data is formatted (presumably used for Amtelco's import procedure) we need the name of the script and the metadata (everything except the script's screens):

  • Template - Your Script
  • The gzipped XML or JSON script structure (Shared, Initialize, Load, etc.)
Format of gzipped data, name of script, and gzipped XML

After the script level details, you have a listing of all the screens for your script. Each screen works similar to script level setup:

  • The name of the screen, like Screen
  • The gzipped XML or JSON screen details
Screen named "Screen" and associated gzipped XML written to binary file

Finally, this structure is repeated for each script within your IIF file, using the name of each script as the delimiter.

Structure of IIF Files

Effectively, we end up with something like this for XML:

SCRIPT_EXPORT_FILE_0
Script1Name<gzipped-metadata-xml>
Screen1Name<gzipped-screen-xml>
Screen2Name<gzipped-screen-xml>
Script2Name<gzipped-metadata-xml>
Screen1Name<gzipped-screen-xml>
Screen2Name<gzipped-screen-xml>

Rough outline of an XML-based IIF file structure (binary .iif file)

It appears to be using [\0]\r\n i.e., an optionally-null-terminated CRLF to distinguish each screen within a script and the name of the script to delimit multiple included scripts.

This seems to also work for the JSON-encoded versions (which appear to be few and far between, even in IS 5.6):

SCRIPT_EXPORT_FILE_1
Script1Name<gzipped-metadata-json>
Screen1Name<gzipped-screen-json>
Screen2Name<gzipped-screen-json>
Script2Name<gzipped-metadata-json>
Screen1Name<gzipped-screen-json>
Screen2Name<gzipped-screen-json>

Rough JSON-based IIF file structure

What does this all mean?

Being able to decode the IIF format means we can entertain some additional tools for our customers. Here are some of the ideas of come up with so far:

  1. (Long Term) Use generative AI tools to create new client scripts and save them to .iif format for importing.
  2. (Medium Term) Filter and remove credentials, keywords, API keys, and other private data that might be included in scripting.
  3. (Short Term) Script visualizations to showcase, test, and confirm call flow for clients and internal reporting.

This will also allow us to create conversion tools - something that might come in handy when migrating to (or from) Amtelco Intelligent Series - reducing vendor lock-in and making things a little more agile along the way.

Shared Action Group from slack-post-messages.iif
P.S. The tool in my screenshots is CyberChef - https://gchq.github.io/CyberChef/ (running locally, of course)