 <?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.analytica.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lchrisman</id>
	<title>Analytica Docs - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.analytica.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lchrisman"/>
	<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php/Special:Contributions/Lchrisman"/>
	<updated>2026-05-19T15:24:14Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.9</generator>
	<entry>
		<id>https://docs.analytica.com/index.php?title=RunConsoleProcess&amp;diff=63917</id>
		<title>RunConsoleProcess</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=RunConsoleProcess&amp;diff=63917"/>
		<updated>2026-05-18T21:39:41Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: ER 21196 followup: escape pipe chars in &amp;lt;code&amp;gt; inside Release template so rest of section renders&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Integration Functions]]&lt;br /&gt;
{{ReleaseBar}}&lt;br /&gt;
&lt;br /&gt;
== RunConsoleProcess(program, ''cmdLine, stdIn, block, curDir, priority, showErr{{Release|7.1||, path}}'') ==&lt;br /&gt;
&lt;br /&gt;
[[RunConsoleProcess]] lets an Analytica model run a ''console process'' -- that is, any Windows program. The program may be very simple with no graphical user interface that takes input from «stdIn»  and writing output to ''stdOut'' -- or it may interact with the user directly. [[RunConsoleProcess]] gives the path and name of the application in the «program» parameter. It can feed input to the program via command line parameters in «cmdLine», or as input data given as text to the «stdIn» parameter, which is piped to the ''StdIn'' input channel of the console process. Normally, when the process completes, [[RunConsoleProcess]] will return a result (as text) any information the program writes to ''stdOut''. Analytica can also send data to a console process via a data files created with [[WriteTextFile]] or receive a data file created by the process using [[ReadTextFile]].&lt;br /&gt;
&lt;br /&gt;
==Declaration ==&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background:white; border:white; margin-left: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
RunConsoleProcess(&lt;br /&gt;
    program: Atomic Text,&lt;br /&gt;
    cmdLine: Optional Atomic Text,&lt;br /&gt;
    stdIn: Optional Atomic Text,&lt;br /&gt;
    block: Optional Atomic Boolean, /* default TRUE */&lt;br /&gt;
    curDir: Optional Atomic Text, /* default process directory */&lt;br /&gt;
    priority: Optional Atomic Number, /* default 0 = normal, same as Ana */&lt;br /&gt;
    showErr: Optional Numeric) /* defaults to 1 = err msg */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Release|7.1||&lt;br /&gt;
In [[Analytica 7.1]] and later, «program» and «cmdLine» are individually optional (you must supply at least one), and there is a new optional named «path» parameter:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background:white; border:white; margin-left: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
RunConsoleProcess(&lt;br /&gt;
program: Optional Atomic Text,&lt;br /&gt;
cmdLine: Optional Atomic Text,&lt;br /&gt;
stdIn: Optional Atomic Text,&lt;br /&gt;
block: Optional Atomic Boolean, /* default TRUE */&lt;br /&gt;
curDir: Optional Atomic Text, /* default process directory */&lt;br /&gt;
priority: Optional Atomic Number, /* default 0 = normal, same as Ana */&lt;br /&gt;
showErr: Optional Numeric, /* defaults to 1 = err msg */&lt;br /&gt;
path: Optional Atomic Text) /* defaults to %PATH% */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[RunConsoleProcess]] offers considerable flexibility through a number of other optional parameters:&lt;br /&gt;
&lt;br /&gt;
«block»: By default (or if you set «block» to &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;),  [[RunConsoleProcess]] ''blocks'' -- that is, Analytica waits until the console process terminates and returns a result before it resumes execution. While blocked, Analytica still notices Windows events: If you press ''Ctrl+break'' (or ''Ctrl+.'') before the process terminates, it kills the process, and ends further computation by Analytica -- just like what it does when Analytica is computing without another process.&lt;br /&gt;
&lt;br /&gt;
If you pass &amp;lt;code&amp;gt;False&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;) to «block», [[RunConsoleProcess]] will not wait for the process to terminate: It immediately returns an empty text to Analytica. Analytica and the spawned process both continue running concurrently until they each terminate. If you press ''Ctrl+break'' (or ''Ctrl+.''), it interrupts any computations by Analytica, but has no effect on the spawned process. An unblocked process is independent, and may continue running even after you exit Analytica. Unblocked processes are useful when you want to send data to another application for display, such as a special graphing package or GIS, or for saving selected results. It is hard to get any results or status back to Analytica from an unblocked process. It is usually best to use a blocked process if you need results back.&lt;br /&gt;
&lt;br /&gt;
The «program» and «cmdLine» parameters are separated, rather than lumped together as one parameter, to protect against a common type of virus attack. &lt;br /&gt;
&lt;br /&gt;
«curDir»:  Any relative directory path specified in the program parameter is interpreted relative to Analytica's [[CurrentDataFolder]]. «curDir» specifies the directory the spawned process should use as its default directory to read and write files. If «curDir» is not specified, it uses its own directory as its default . &lt;br /&gt;
&lt;br /&gt;
«priority» defines the priority that Windows should give the spawned process relative to the Analytica process. The default (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;) runs the new process at the same priority as the Analytica program. A value of &amp;lt;code&amp;gt;–1&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-2&amp;lt;/code&amp;gt; lowers the priority, allowing other programs more of the CPU. A value of &amp;lt;code&amp;gt;+1&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;+2&amp;lt;/code&amp;gt; raises the priority, dedicating more of the CPU to the process.&lt;br /&gt;
&lt;br /&gt;
«showErr»: By default, in blocking mode, if the process writes anything to ''stdErr'', Analytica will display it as an error message when the process terminates. If &amp;lt;code&amp;gt;showErr = 2&amp;lt;/code&amp;gt; it shows any text in ''stdErr'' as a warning message. If &amp;lt;code&amp;gt;showErr = 0&amp;lt;/code&amp;gt;, and always in non-blocking mode, it ignores anything in ''stdErr''.&lt;br /&gt;
&lt;br /&gt;
'''Errors''': Analytica will give an error message if [[RunConsoleProcess]] cannot find or launch the specified program. &lt;br /&gt;
&lt;br /&gt;
[[RunConsoleProcess]] fully supports [[Intelligent Arrays]]: If any parameter is passed an array, it will run a separate process for each element of the array. It runs multiple blocking processes in sequence, one after another. It runs multiple non-blocking processes concurrently.&lt;br /&gt;
&lt;br /&gt;
{{Release|7.1||&lt;br /&gt;
== Combined command line and CMD built-ins ==&lt;br /&gt;
''New to [[Analytica 7.1]]''&lt;br /&gt;
&lt;br /&gt;
If you specify just one of «program» or «cmdLine» (and not both), it is treated as the entire command line, and Analytica locates the executable for you. So these two calls are equivalent:&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;ffmpeg.exe&amp;quot;, &amp;quot;ffmpeg -i input.mp4 output.mp3&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;ffmpeg -i input.mp4 output.mp3&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must specify at least one of «program» or «cmdLine»; calling [[RunConsoleProcess]] with neither raises an error. The original two-parameter form is still supported and recommended when you want to be explicit about which is the executable.&lt;br /&gt;
&lt;br /&gt;
In this combined-command-line form, if the first word names a built-in &amp;lt;code&amp;gt;CMD.EXE&amp;lt;/code&amp;gt; command (such as &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ECHO&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SET&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MOVE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DEL&amp;lt;/code&amp;gt;, …), Analytica automatically runs the command through CMD.EXE — that is, as &amp;lt;code&amp;gt;cmd /c «cmdLine»&amp;lt;/code&amp;gt;. For example:&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;DIR *.txt&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
runs as &amp;lt;code&amp;gt;cmd /c DIR *.txt&amp;lt;/code&amp;gt; and returns the directory listing.&lt;br /&gt;
&lt;br /&gt;
Shell operators such as &amp;lt;code&amp;gt;&amp;amp;&amp;amp;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;#124;&amp;amp;#124;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;#124;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; are interpreted by CMD.EXE, not by [[RunConsoleProcess]] itself. If your command line uses them — for example, to run several commands in a single shell session so their side effects persist — put it after &amp;lt;code&amp;gt;cmd /c&amp;lt;/code&amp;gt; explicitly:&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;cmd /c conda activate Env1 &amp;amp;&amp;amp; pip install desiredlib&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
«path»: An optional named parameter giving the &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;-separated search path used to locate the executable when you use the combined-command-line form. It defaults to the &amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt; environment variable. Use it to restrict (or extend) the search when running a tool that isn't in the system PATH:&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;ffmpeg -i input.mp4 output.mp3&amp;quot;, path: &amp;quot;C:\Tools\ffmpeg\bin&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;MyTool&amp;quot;, path: &amp;quot;C:\MyTools;%PATH%&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the executable is not found in «path», [[RunConsoleProcess]] raises a &amp;quot;could not launch&amp;quot; error rather than silently falling back to the system search path. «path» has no effect when both «program» and «cmdLine» are given, since in that mode «program» already names the executable explicitly.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Release|6.5||&lt;br /&gt;
== Using Environment Variables ==&lt;br /&gt;
''New to [[Analytica 6.5]]''&lt;br /&gt;
&lt;br /&gt;
You can substitute the value of environment variables into the «program», «cmdLine» or «curDir» parameters using &amp;lt;code&amp;gt;%name%&amp;lt;/code&amp;gt;. For example:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;[[RunConsoleProcess]]( &amp;quot;%windir%\system32\cscript.exe&amp;quot;, &amp;quot;cscript /NoLogo HelloWorld.vbs&amp;quot;, curDir:&amp;quot;%TEMP%&amp;quot;  )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you need to actually pass a % character in one of those parameters, then double it, e.g., &amp;lt;code&amp;gt;&amp;quot;%%&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== VB Script ===&lt;br /&gt;
Suppose the file &amp;lt;code&amp;gt;HelloWorld.vbs&amp;lt;/code&amp;gt; is in your model directory and contains:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;WScript.Echo &amp;quot;Hello World&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your call to [[RunConsoleProcess]] might look like:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;{{Release||6.4|C:\Windows}}{{Release|6.5||%windir%}}\System32\CScript.exe&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;&amp;quot;CScript/Nologo HelloWorld.vbs&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first parameter is the program (usually an ''EXE'' file) to be launched. You don't need to worry about quoting any spaces in the path name. The second parameter is the command line as it might appear on a command prompt. This expression will evaluate to the string &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If you need to send data to the ''StdIn'' of the process, include an optional parameter «stdIn»:&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;{{Release||6.4|C:\Windows}}{{Release|6.5||%windir%}}\System32\CScript.exe&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;&amp;quot;CScript/Nologo HelloWorld.vbs&amp;quot;, &amp;lt;/code&amp;gt;      &lt;br /&gt;
::&amp;lt;code&amp;gt;StdIn: MyDataToSend)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;code&amp;gt;MyDataToSend&amp;lt;/code&amp;gt; evaluates to a text.&lt;br /&gt;
&lt;br /&gt;
=== Batch File ===&lt;br /&gt;
In this example, a batch file named &amp;lt;code&amp;gt;DoIt.bat&amp;lt;/code&amp;gt; is in the directory &amp;lt;code&amp;gt;C:\Try&amp;lt;/code&amp;gt;.  Also in that directory is a file named &amp;lt;code&amp;gt;data.log&amp;lt;/code&amp;gt;.  The batch file, &amp;lt;code&amp;gt;DoIt.bat&amp;lt;/code&amp;gt; contains the following:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;# DoIt.bat -- dump the log&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;Type data.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This batch file assumes it is run from the directory &amp;lt;code&amp;gt;C:\Try&amp;lt;/code&amp;gt;.  {{Release||6.4|First, set up a Constant node:&lt;br /&gt;
:&amp;lt;code&amp;gt;Constant CMD := [[GetProcessInfo]](&amp;quot;env:comspec&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
which most commonly ends up with }}{{Release|6.5||This uses the &amp;lt;code&amp;gt;%comspec%&amp;lt;/code&amp;gt; environment variable to find the CMD command, which most commonly has }}the value &amp;lt;code&amp;gt;&amp;quot;C:\Windows\System32\Cmd.exe&amp;quot;&amp;lt;/code&amp;gt;. Then the call is:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess({{Release||6.4|CMD}}{{Release|6.5||&amp;quot;%comspec%&amp;quot;, &amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;&amp;quot;Cmd /C DoIt.bat&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;CurDir: &amp;quot;C:\Try&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or you can run it directly:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;DoIt.bat&amp;quot;, &amp;quot;DoIt.bat&amp;quot;, CurDir: &amp;quot;C:\Try&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reading Data from a URL ===&lt;br /&gt;
&lt;br /&gt;
If you want to read data from a URL, you should use the [[ReadFromURL]] function. Nevertheless, this example from the past may be illustrative.&lt;br /&gt;
&lt;br /&gt;
To read the contents of a web page given its URL, you can use:&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;ReadURL.exe&amp;quot;, &amp;quot;ReadURL &amp;quot; &amp;amp; url)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where ''url'' is a text string as would appear in the address bar of your browser.  You can download the [[media:ReadURL.exe | ReadURL.exe]] program by clicking on the link and saving.  The first parameter to [[RunConsoleProcess]] may need to be set to the full path where you placed [[media:ReadURL.exe | ReadURL.exe]] unless you put it in your [[CurrentDataFolder]].&lt;br /&gt;
&lt;br /&gt;
A step-by-step example using [[media:ReadURL.exe | ReadURL.exe]] is given here: [[Retrieving Content From the Web]]. This example includes the source code for [[media:ReadURL.exe | ReadURL.exe]], and develops an example that obtains historical stock price data from the Yahoo finance web site.&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
This function was introduced in [[What's new in Analytica 4.0?|Analytica 4.0]].&lt;br /&gt;
&lt;br /&gt;
Ability to use environment variables in «program», «cmdLine» and «curDir» was added in [[Analytica 6.5]].&lt;br /&gt;
&lt;br /&gt;
{{Release|7.1||In [[Analytica 7.1]], «program» and «cmdLine» became individually optional. When only one is given, it is treated as a combined command line; if the first word is a CMD.EXE built-in such as &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ECHO&amp;lt;/code&amp;gt;, it is run via &amp;lt;code&amp;gt;cmd /c&amp;lt;/code&amp;gt; automatically. A new optional named «path» parameter (default &amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;) can scope where the executable is searched for.}}&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* Webinar: [http://WebinarArchive.analytica.com/2007-10-18-Calling-External-Applications.wmv Calling-External-Applications.wmv] (requires Windows Media Player)&lt;br /&gt;
* [[CurrentDataFolder]]&lt;br /&gt;
* [[WriteTextFile]]&lt;br /&gt;
* [[ReadTextFile]]&lt;br /&gt;
* [[GetRegistryValue]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=RunConsoleProcess&amp;diff=63916</id>
		<title>RunConsoleProcess</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=RunConsoleProcess&amp;diff=63916"/>
		<updated>2026-05-18T21:38:10Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: ER 21196: document 7.1 enhancements — combined cmdline, CMD-builtin auto-wrap, new «path» parameter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Integration Functions]]&lt;br /&gt;
{{ReleaseBar}}&lt;br /&gt;
&lt;br /&gt;
== RunConsoleProcess(program, ''cmdLine, stdIn, block, curDir, priority, showErr{{Release|7.1||, path}}'') ==&lt;br /&gt;
&lt;br /&gt;
[[RunConsoleProcess]] lets an Analytica model run a ''console process'' -- that is, any Windows program. The program may be very simple with no graphical user interface that takes input from «stdIn»  and writing output to ''stdOut'' -- or it may interact with the user directly. [[RunConsoleProcess]] gives the path and name of the application in the «program» parameter. It can feed input to the program via command line parameters in «cmdLine», or as input data given as text to the «stdIn» parameter, which is piped to the ''StdIn'' input channel of the console process. Normally, when the process completes, [[RunConsoleProcess]] will return a result (as text) any information the program writes to ''stdOut''. Analytica can also send data to a console process via a data files created with [[WriteTextFile]] or receive a data file created by the process using [[ReadTextFile]].&lt;br /&gt;
&lt;br /&gt;
==Declaration ==&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background:white; border:white; margin-left: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
RunConsoleProcess(&lt;br /&gt;
    program: Atomic Text,&lt;br /&gt;
    cmdLine: Optional Atomic Text,&lt;br /&gt;
    stdIn: Optional Atomic Text,&lt;br /&gt;
    block: Optional Atomic Boolean, /* default TRUE */&lt;br /&gt;
    curDir: Optional Atomic Text, /* default process directory */&lt;br /&gt;
    priority: Optional Atomic Number, /* default 0 = normal, same as Ana */&lt;br /&gt;
    showErr: Optional Numeric) /* defaults to 1 = err msg */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Release|7.1||&lt;br /&gt;
In [[Analytica 7.1]] and later, «program» and «cmdLine» are individually optional (you must supply at least one), and there is a new optional named «path» parameter:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background:white; border:white; margin-left: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
RunConsoleProcess(&lt;br /&gt;
program: Optional Atomic Text,&lt;br /&gt;
cmdLine: Optional Atomic Text,&lt;br /&gt;
stdIn: Optional Atomic Text,&lt;br /&gt;
block: Optional Atomic Boolean, /* default TRUE */&lt;br /&gt;
curDir: Optional Atomic Text, /* default process directory */&lt;br /&gt;
priority: Optional Atomic Number, /* default 0 = normal, same as Ana */&lt;br /&gt;
showErr: Optional Numeric, /* defaults to 1 = err msg */&lt;br /&gt;
path: Optional Atomic Text) /* defaults to %PATH% */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[RunConsoleProcess]] offers considerable flexibility through a number of other optional parameters:&lt;br /&gt;
&lt;br /&gt;
«block»: By default (or if you set «block» to &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;),  [[RunConsoleProcess]] ''blocks'' -- that is, Analytica waits until the console process terminates and returns a result before it resumes execution. While blocked, Analytica still notices Windows events: If you press ''Ctrl+break'' (or ''Ctrl+.'') before the process terminates, it kills the process, and ends further computation by Analytica -- just like what it does when Analytica is computing without another process.&lt;br /&gt;
&lt;br /&gt;
If you pass &amp;lt;code&amp;gt;False&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;) to «block», [[RunConsoleProcess]] will not wait for the process to terminate: It immediately returns an empty text to Analytica. Analytica and the spawned process both continue running concurrently until they each terminate. If you press ''Ctrl+break'' (or ''Ctrl+.''), it interrupts any computations by Analytica, but has no effect on the spawned process. An unblocked process is independent, and may continue running even after you exit Analytica. Unblocked processes are useful when you want to send data to another application for display, such as a special graphing package or GIS, or for saving selected results. It is hard to get any results or status back to Analytica from an unblocked process. It is usually best to use a blocked process if you need results back.&lt;br /&gt;
&lt;br /&gt;
The «program» and «cmdLine» parameters are separated, rather than lumped together as one parameter, to protect against a common type of virus attack. &lt;br /&gt;
&lt;br /&gt;
«curDir»:  Any relative directory path specified in the program parameter is interpreted relative to Analytica's [[CurrentDataFolder]]. «curDir» specifies the directory the spawned process should use as its default directory to read and write files. If «curDir» is not specified, it uses its own directory as its default . &lt;br /&gt;
&lt;br /&gt;
«priority» defines the priority that Windows should give the spawned process relative to the Analytica process. The default (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;) runs the new process at the same priority as the Analytica program. A value of &amp;lt;code&amp;gt;–1&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-2&amp;lt;/code&amp;gt; lowers the priority, allowing other programs more of the CPU. A value of &amp;lt;code&amp;gt;+1&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;+2&amp;lt;/code&amp;gt; raises the priority, dedicating more of the CPU to the process.&lt;br /&gt;
&lt;br /&gt;
«showErr»: By default, in blocking mode, if the process writes anything to ''stdErr'', Analytica will display it as an error message when the process terminates. If &amp;lt;code&amp;gt;showErr = 2&amp;lt;/code&amp;gt; it shows any text in ''stdErr'' as a warning message. If &amp;lt;code&amp;gt;showErr = 0&amp;lt;/code&amp;gt;, and always in non-blocking mode, it ignores anything in ''stdErr''.&lt;br /&gt;
&lt;br /&gt;
'''Errors''': Analytica will give an error message if [[RunConsoleProcess]] cannot find or launch the specified program. &lt;br /&gt;
&lt;br /&gt;
[[RunConsoleProcess]] fully supports [[Intelligent Arrays]]: If any parameter is passed an array, it will run a separate process for each element of the array. It runs multiple blocking processes in sequence, one after another. It runs multiple non-blocking processes concurrently.&lt;br /&gt;
&lt;br /&gt;
{{Release|7.1||&lt;br /&gt;
== Combined command line and CMD built-ins ==&lt;br /&gt;
''New to [[Analytica 7.1]]''&lt;br /&gt;
&lt;br /&gt;
If you specify just one of «program» or «cmdLine» (and not both), it is treated as the entire command line, and Analytica locates the executable for you. So these two calls are equivalent:&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;ffmpeg.exe&amp;quot;, &amp;quot;ffmpeg -i input.mp4 output.mp3&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;ffmpeg -i input.mp4 output.mp3&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must specify at least one of «program» or «cmdLine»; calling [[RunConsoleProcess]] with neither raises an error. The original two-parameter form is still supported and recommended when you want to be explicit about which is the executable.&lt;br /&gt;
&lt;br /&gt;
In this combined-command-line form, if the first word names a built-in &amp;lt;code&amp;gt;CMD.EXE&amp;lt;/code&amp;gt; command (such as &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ECHO&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SET&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MOVE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DEL&amp;lt;/code&amp;gt;, …), Analytica automatically runs the command through CMD.EXE — that is, as &amp;lt;code&amp;gt;cmd /c «cmdLine»&amp;lt;/code&amp;gt;. For example:&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;DIR *.txt&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
runs as &amp;lt;code&amp;gt;cmd /c DIR *.txt&amp;lt;/code&amp;gt; and returns the directory listing.&lt;br /&gt;
&lt;br /&gt;
Shell operators such as &amp;lt;code&amp;gt;&amp;amp;&amp;amp;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; are interpreted by CMD.EXE, not by [[RunConsoleProcess]] itself. If your command line uses them — for example, to run several commands in a single shell session so their side effects persist — put it after &amp;lt;code&amp;gt;cmd /c&amp;lt;/code&amp;gt; explicitly:&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;cmd /c conda activate Env1 &amp;amp;&amp;amp; pip install desiredlib&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
«path»: An optional named parameter giving the &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;-separated search path used to locate the executable when you use the combined-command-line form. It defaults to the &amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt; environment variable. Use it to restrict (or extend) the search when running a tool that isn't in the system PATH:&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;ffmpeg -i input.mp4 output.mp3&amp;quot;, path: &amp;quot;C:\Tools\ffmpeg\bin&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;MyTool&amp;quot;, path: &amp;quot;C:\MyTools;%PATH%&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the executable is not found in «path», [[RunConsoleProcess]] raises a &amp;quot;could not launch&amp;quot; error rather than silently falling back to the system search path. «path» has no effect when both «program» and «cmdLine» are given, since in that mode «program» already names the executable explicitly.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Release|6.5||&lt;br /&gt;
== Using Environment Variables ==&lt;br /&gt;
''New to [[Analytica 6.5]]''&lt;br /&gt;
&lt;br /&gt;
You can substitute the value of environment variables into the «program», «cmdLine» or «curDir» parameters using &amp;lt;code&amp;gt;%name%&amp;lt;/code&amp;gt;. For example:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;[[RunConsoleProcess]]( &amp;quot;%windir%\system32\cscript.exe&amp;quot;, &amp;quot;cscript /NoLogo HelloWorld.vbs&amp;quot;, curDir:&amp;quot;%TEMP%&amp;quot;  )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you need to actually pass a % character in one of those parameters, then double it, e.g., &amp;lt;code&amp;gt;&amp;quot;%%&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== VB Script ===&lt;br /&gt;
Suppose the file &amp;lt;code&amp;gt;HelloWorld.vbs&amp;lt;/code&amp;gt; is in your model directory and contains:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;WScript.Echo &amp;quot;Hello World&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your call to [[RunConsoleProcess]] might look like:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;{{Release||6.4|C:\Windows}}{{Release|6.5||%windir%}}\System32\CScript.exe&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;&amp;quot;CScript/Nologo HelloWorld.vbs&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first parameter is the program (usually an ''EXE'' file) to be launched. You don't need to worry about quoting any spaces in the path name. The second parameter is the command line as it might appear on a command prompt. This expression will evaluate to the string &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If you need to send data to the ''StdIn'' of the process, include an optional parameter «stdIn»:&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;{{Release||6.4|C:\Windows}}{{Release|6.5||%windir%}}\System32\CScript.exe&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;&amp;quot;CScript/Nologo HelloWorld.vbs&amp;quot;, &amp;lt;/code&amp;gt;      &lt;br /&gt;
::&amp;lt;code&amp;gt;StdIn: MyDataToSend)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;code&amp;gt;MyDataToSend&amp;lt;/code&amp;gt; evaluates to a text.&lt;br /&gt;
&lt;br /&gt;
=== Batch File ===&lt;br /&gt;
In this example, a batch file named &amp;lt;code&amp;gt;DoIt.bat&amp;lt;/code&amp;gt; is in the directory &amp;lt;code&amp;gt;C:\Try&amp;lt;/code&amp;gt;.  Also in that directory is a file named &amp;lt;code&amp;gt;data.log&amp;lt;/code&amp;gt;.  The batch file, &amp;lt;code&amp;gt;DoIt.bat&amp;lt;/code&amp;gt; contains the following:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;# DoIt.bat -- dump the log&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;Type data.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This batch file assumes it is run from the directory &amp;lt;code&amp;gt;C:\Try&amp;lt;/code&amp;gt;.  {{Release||6.4|First, set up a Constant node:&lt;br /&gt;
:&amp;lt;code&amp;gt;Constant CMD := [[GetProcessInfo]](&amp;quot;env:comspec&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
which most commonly ends up with }}{{Release|6.5||This uses the &amp;lt;code&amp;gt;%comspec%&amp;lt;/code&amp;gt; environment variable to find the CMD command, which most commonly has }}the value &amp;lt;code&amp;gt;&amp;quot;C:\Windows\System32\Cmd.exe&amp;quot;&amp;lt;/code&amp;gt;. Then the call is:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess({{Release||6.4|CMD}}{{Release|6.5||&amp;quot;%comspec%&amp;quot;, &amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;&amp;quot;Cmd /C DoIt.bat&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;CurDir: &amp;quot;C:\Try&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or you can run it directly:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;DoIt.bat&amp;quot;, &amp;quot;DoIt.bat&amp;quot;, CurDir: &amp;quot;C:\Try&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reading Data from a URL ===&lt;br /&gt;
&lt;br /&gt;
If you want to read data from a URL, you should use the [[ReadFromURL]] function. Nevertheless, this example from the past may be illustrative.&lt;br /&gt;
&lt;br /&gt;
To read the contents of a web page given its URL, you can use:&lt;br /&gt;
:&amp;lt;code&amp;gt;RunConsoleProcess(&amp;quot;ReadURL.exe&amp;quot;, &amp;quot;ReadURL &amp;quot; &amp;amp; url)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where ''url'' is a text string as would appear in the address bar of your browser.  You can download the [[media:ReadURL.exe | ReadURL.exe]] program by clicking on the link and saving.  The first parameter to [[RunConsoleProcess]] may need to be set to the full path where you placed [[media:ReadURL.exe | ReadURL.exe]] unless you put it in your [[CurrentDataFolder]].&lt;br /&gt;
&lt;br /&gt;
A step-by-step example using [[media:ReadURL.exe | ReadURL.exe]] is given here: [[Retrieving Content From the Web]]. This example includes the source code for [[media:ReadURL.exe | ReadURL.exe]], and develops an example that obtains historical stock price data from the Yahoo finance web site.&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
This function was introduced in [[What's new in Analytica 4.0?|Analytica 4.0]].&lt;br /&gt;
&lt;br /&gt;
Ability to use environment variables in «program», «cmdLine» and «curDir» was added in [[Analytica 6.5]].&lt;br /&gt;
&lt;br /&gt;
{{Release|7.1||In [[Analytica 7.1]], «program» and «cmdLine» became individually optional. When only one is given, it is treated as a combined command line; if the first word is a CMD.EXE built-in such as &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ECHO&amp;lt;/code&amp;gt;, it is run via &amp;lt;code&amp;gt;cmd /c&amp;lt;/code&amp;gt; automatically. A new optional named «path» parameter (default &amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;) can scope where the executable is searched for.}}&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* Webinar: [http://WebinarArchive.analytica.com/2007-10-18-Calling-External-Applications.wmv Calling-External-Applications.wmv] (requires Windows Media Player)&lt;br /&gt;
* [[CurrentDataFolder]]&lt;br /&gt;
* [[WriteTextFile]]&lt;br /&gt;
* [[ReadTextFile]]&lt;br /&gt;
* [[GetRegistryValue]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=GetArrowsOnDiagram&amp;diff=63915</id>
		<title>GetArrowsOnDiagram</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=GetArrowsOnDiagram&amp;diff=63915"/>
		<updated>2026-05-15T17:40:43Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Meta-Inference Functions]]&lt;br /&gt;
&lt;br /&gt;
''new to [[Analytica 5.0]]''&lt;br /&gt;
&lt;br /&gt;
== GetArrowsOnDiagram(module'', browseOnly, asStruct'') ==&lt;br /&gt;
&lt;br /&gt;
Returns a list of the arrows that appear on an influence diagram. Each arrow returned has three elements: &lt;br /&gt;
* [[Handle]] to source node&lt;br /&gt;
* handle to target node&lt;br /&gt;
* flags -- a sum of integer bits:&lt;br /&gt;
*:1 = the arrow is a [[dynamic]] arrow.&lt;br /&gt;
*:2 = the arrow is hidden in browse mode, but visible in edit mode.  (new to [[Analytica 6.0]])&lt;br /&gt;
&lt;br /&gt;
(new to [[Analytica 6.0]]). When the optional «browseOnly» parameter is set to true, arrows that are hidden in browse mode are not included in the result.&lt;br /&gt;
&lt;br /&gt;
(new to [[Analytica 7.1]]) When the optional &amp;lt;code&amp;gt;asStruct:True&amp;lt;/code&amp;gt; is specified, returns each arrow as a &amp;lt;code&amp;gt;ArrowInfo&amp;lt;/code&amp;gt; [[Struct|struct instance]]. This can be more convenient for cases that involve a conversion to JSON.&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
Introduced in [[Analytica 5.0]].&lt;br /&gt;
&lt;br /&gt;
Added «asStruct» option in [[Analytica 7.1]].&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[Draw arrows]]&lt;br /&gt;
* [[Draw arrows between modules]]&lt;br /&gt;
* [[Modules and Libraries]]&lt;br /&gt;
* [[Arranging nodes to make clear diagrams]]&lt;br /&gt;
* [[Diagram window]]&lt;br /&gt;
* [[Meta-Inference]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=GetArrowsOnDiagram&amp;diff=63914</id>
		<title>GetArrowsOnDiagram</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=GetArrowsOnDiagram&amp;diff=63914"/>
		<updated>2026-05-15T17:37:29Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Meta-Inference Functions]]&lt;br /&gt;
&lt;br /&gt;
''new to [[Analytica 5.0]]''&lt;br /&gt;
&lt;br /&gt;
== GetArrowsOnDiagram(module'', browseOnly'') ==&lt;br /&gt;
&lt;br /&gt;
Returns a list of the arrows that appear on an influence diagram. Each arrow returned has three elements: &lt;br /&gt;
* [[Handle]] to source node&lt;br /&gt;
* handle to target node&lt;br /&gt;
* flags -- a sum of integer bits:&lt;br /&gt;
*:1 = the arrow is a [[dynamic]] arrow.&lt;br /&gt;
*:2 = the arrow is hidden in browse mode, but visible in edit mode.  (new to [[Analytica 6.0]])&lt;br /&gt;
&lt;br /&gt;
(new to [[Analytica 6.0]]). When the optional «browseOnly» parameter is set to true, arrows that are hidden in browse mode are not included in the result.&lt;br /&gt;
&lt;br /&gt;
(new to [[Analytica 7.1]]) When the optional &amp;lt;code&amp;gt;asStruct:True&amp;lt;/code&amp;gt; is specified, returns each arrow as a &amp;lt;code&amp;gt;ArrowInfo&amp;lt;/code&amp;gt; [[Struct|struct instance]]. This can be more convenient for cases that involve a conversion to JSON.&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
Introduced in [[Analytica 5.0]].&lt;br /&gt;
&lt;br /&gt;
Added «asStruct» option in [[Analytica 7.1]].&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[Draw arrows]]&lt;br /&gt;
* [[Draw arrows between modules]]&lt;br /&gt;
* [[Modules and Libraries]]&lt;br /&gt;
* [[Arranging nodes to make clear diagrams]]&lt;br /&gt;
* [[Diagram window]]&lt;br /&gt;
* [[Meta-Inference]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Assista_-_Analytica_AI_Assistant/Custom_user_skills_for_Assista&amp;diff=63913</id>
		<title>Assista - Analytica AI Assistant/Custom user skills for Assista</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Assista_-_Analytica_AI_Assistant/Custom_user_skills_for_Assista&amp;diff=63913"/>
		<updated>2026-05-14T21:08:24Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: /* See also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''New to [[Analytica 7.1]]''&lt;br /&gt;
&lt;br /&gt;
This page describes how to create your own '''custom user skill''' for Assista — a way to expand Assista's knowledge or capabilities with instructions, conventions, or domain knowledge that are specific to your model, your team, or your workflow.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #4a90e2; background:#eef6ff; padding:0.8em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Tip — Assista can help you author skills.''' The fastest way to write or refine a skill is to ask Assista directly — say something like ''&amp;quot;Help me write a custom skill that …&amp;quot;''. Assista has a built-in '''Authoring-skills''' capability that walks through picking a location, creating the [[#The AssistaSkill class|&amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object]], filling in each attribute, and adding resources. You don't need to memorize the details on this page — Assista will do most of the mechanical work for you and ask only the questions it needs answered.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== What is a skill? ==&lt;br /&gt;
&lt;br /&gt;
A '''skill''' is a packaged piece of guidance that Assista loads on demand when it decides the skill is relevant to your prompt. Each skill has:&lt;br /&gt;
&lt;br /&gt;
* A short '''description''' that is always visible to Assista, so it can decide whether to load the skill.&lt;br /&gt;
* A set of '''trigger conditions''' (''when-to-use'') that further refine when the skill applies.&lt;br /&gt;
* A '''skill body''' — the actual instructions, in markdown — that Assista reads when it loads the skill.&lt;br /&gt;
* Optional '''resources''' — supporting reference text (examples, lookup tables, sample data) that the skill body can refer to.&lt;br /&gt;
&lt;br /&gt;
Assista ships with a library of built-in skills. '''Custom user skills''' let you add your own on top of those. Custom skills come in two flavors:&lt;br /&gt;
&lt;br /&gt;
* '''Model-specific''' — embedded in a particular model. Use these when the skill references things only meaningful in that model (specific variables, modules, naming conventions, business rules).&lt;br /&gt;
* '''General / model-agnostic''' — placed in a shared linked library (a filed &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt;) so the same skill can be linked from multiple models. Use these for skills that are useful across many models — house style, team conventions, reusable techniques.&lt;br /&gt;
&lt;br /&gt;
Assista discovers your custom skills automatically at the start of each session and merges them with its built-in skills.&lt;br /&gt;
&lt;br /&gt;
=== Where to put a skill ===&lt;br /&gt;
&lt;br /&gt;
A skill object can live anywhere in the model, but the recommended placement is:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Skill type !! Where to put it&lt;br /&gt;
|-&lt;br /&gt;
| Model-specific || Inside a &amp;lt;code&amp;gt;Library&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;Module&amp;lt;/code&amp;gt;) in the current model.&lt;br /&gt;
|-&lt;br /&gt;
| Model-agnostic / general || Inside a '''&amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt;''' (filed library) saved as its own &amp;lt;code&amp;gt;.ana&amp;lt;/code&amp;gt; file, so it can be linked from multiple models.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Co-locating skills in a single library dedicated to skills keeps them tidy and easy to maintain. It's a recommended practice, not a requirement.&lt;br /&gt;
&lt;br /&gt;
== Anatomy of a skill ==&lt;br /&gt;
&lt;br /&gt;
=== The AssistaSkill class ===&lt;br /&gt;
&lt;br /&gt;
A skill is represented by an '''&amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt;''' object in the model. &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; is a module-like class — it acts as a private namespace, so identifiers of objects placed inside the skill (typically resources) do not collide with anything outside it.&lt;br /&gt;
&lt;br /&gt;
Every &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object should fill in these attributes:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Attribute !! Required !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Identifier&amp;lt;/code&amp;gt; || yes || The skill's name (a valid Analytica identifier). Used in skill listings and lookups.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt; || optional || Human-readable title.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; || yes || '''Very short''' — always included in Assista's context, so keep it to a single line.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AssistaSkill::SkillCategory&amp;lt;/code&amp;gt; || no|| Category name on line 1; optional category description on line 2 and beyond. If omitted its category will be &amp;quot;User_Skills&amp;quot;. When multiple skills are in the same category, providing the description or any one of them suffices.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AssistaSkill::WhenToUse&amp;lt;/code&amp;gt; || yes || Trigger conditions describing when the skill is applicable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt; || yes || The full skill instructions, in markdown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The three &amp;lt;code&amp;gt;AssistaSkill::&amp;lt;/code&amp;gt;-prefixed attributes live in the private '''&amp;lt;code&amp;gt;AssistaSkill::&amp;lt;/code&amp;gt; namespace''' — when reading or setting them via expressions, you must use the qualified name (&amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt;, not just &amp;lt;code&amp;gt;SkillBody&amp;lt;/code&amp;gt;). All three are '''text-only'''.&lt;br /&gt;
&lt;br /&gt;
=== Writing a good Description ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; is included in every Assista call where skills are considered, so it must be '''short''' — typically a single line of 10–25 words. Lead with what the skill does, then a brief ''&amp;quot;use when …&amp;quot;'' cue.&lt;br /&gt;
&lt;br /&gt;
Example: ''&amp;quot;Convert a wide-format table to long-format. Use when the user has data with multiple measurement columns to stack.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
=== Writing SkillCategory ===&lt;br /&gt;
&lt;br /&gt;
The first line is the category name (use the same wording across all skills that share a category). If a second-and-later line is present, it serves as the category's description; it is only used when the category isn't already defined by another skill. For skills joining an existing category, omit the description.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Reporting&lt;br /&gt;
Generating reports, exports, and summaries from model results.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Writing WhenToUse ===&lt;br /&gt;
&lt;br /&gt;
A bulleted list of trigger conditions. Assista reads this when deciding whether to load the skill body. Be specific — vague triggers either over-load the skill or miss valid cases. Include user-phrasing cues where possible (e.g., ''&amp;quot;User mentions 'unpivot' or 'melt'&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
=== Writing SkillBody ===&lt;br /&gt;
&lt;br /&gt;
The full instructions, in markdown. The body is loaded only when Assista decides the skill is relevant, so there is no hard length limit — but stay focused. Reference '''resources''' (see below) for long examples, lookup tables, or reference data rather than inlining them in the body.&lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
&lt;br /&gt;
Resources are supporting reference text placed '''inside''' the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object. Because &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; is its own namespace, resource identifiers don't collide with anything outside the skill.&lt;br /&gt;
&lt;br /&gt;
Use the &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; class for the typical case (literal text). Other variable classes are also recognized when you need them, but stick with &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; unless there's a reason not to.&lt;br /&gt;
&lt;br /&gt;
A resource needs:&lt;br /&gt;
&lt;br /&gt;
* An '''&amp;lt;code&amp;gt;Identifier&amp;lt;/code&amp;gt;''' — the resource name Assista will use to fetch it.&lt;br /&gt;
* A '''&amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;''' — what the resource contains (short).&lt;br /&gt;
* A '''&amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt;''' — the resource's content (typically a quoted text literal).&lt;br /&gt;
&lt;br /&gt;
A resource's &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt; may be a computed expression — it can even depend on the current model. Two caveats:&lt;br /&gt;
&lt;br /&gt;
# It must evaluate to an atomic text string.&lt;br /&gt;
# By default the value is '''cached''', so later changes to the model won't show up in the resource. To recompute on every access, set &amp;lt;code&amp;gt;CachingMethod&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; (never cache).&lt;br /&gt;
&lt;br /&gt;
Use computed resources sparingly — literal text is simpler and almost always sufficient.&lt;br /&gt;
&lt;br /&gt;
== How to create a skill ==&lt;br /&gt;
&lt;br /&gt;
=== The easy way: ask Assista ===&lt;br /&gt;
&lt;br /&gt;
The recommended way to create or edit a skill is to '''ask Assista'''. Open the Assista panel and say something like:&lt;br /&gt;
&lt;br /&gt;
* ''&amp;quot;Help me write a custom skill that …&amp;quot;''&lt;br /&gt;
* ''&amp;quot;Create a skill that teaches you about our naming conventions in this model.&amp;quot;''&lt;br /&gt;
* ''&amp;quot;Turn this prose into a proper skill: …&amp;quot;''&lt;br /&gt;
* ''&amp;quot;Edit my &amp;lt;code&amp;gt;Convert_wide_to_long&amp;lt;/code&amp;gt; skill to also mention the new &amp;lt;code&amp;gt;StackIndex&amp;lt;/code&amp;gt; function.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Assista's built-in '''Authoring-skills''' capability will:&lt;br /&gt;
&lt;br /&gt;
# Help you decide where the skill should live (model-specific vs. shared library).&lt;br /&gt;
# Create the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object with a valid identifier.&lt;br /&gt;
# Set &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SkillCategory&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WhenToUse&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;SkillBody&amp;lt;/code&amp;gt; for you, asking only the questions it needs answered.&lt;br /&gt;
# Add any resources you want inside the skill.&lt;br /&gt;
&lt;br /&gt;
Assista takes care of the mechanical details — including the namespace-qualified attribute names and Analytica's text-literal quoting rules — that would otherwise be easy to get wrong.&lt;br /&gt;
&lt;br /&gt;
=== The manual way ===&lt;br /&gt;
&lt;br /&gt;
If you'd rather create a skill by hand in Analytica:&lt;br /&gt;
&lt;br /&gt;
==== Step 1: Pick or create the parent module ====&lt;br /&gt;
&lt;br /&gt;
Decide where the new skill will live:&lt;br /&gt;
&lt;br /&gt;
* For '''shared / general''' skills, create or reuse a &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt; (filed library).&lt;br /&gt;
* For '''model-specific''' skills, create or reuse a &amp;lt;code&amp;gt;Library&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;Module&amp;lt;/code&amp;gt;) in the current model.&lt;br /&gt;
&lt;br /&gt;
==== Step 2: Create the AssistaSkill object ====&lt;br /&gt;
&lt;br /&gt;
Add a new object of class &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; inside the parent module. Give it a descriptive identifier and fill in &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Step 3: Set the namespaced attributes ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;AssistaSkill::SkillCategory&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AssistaSkill::WhenToUse&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt; are namespace-qualified, so you set them via expressions using the fully qualified name. For example, to set the category:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AssistaSkill::SkillCategory of Convert_wide_to_long := 'Reporting&lt;br /&gt;
Generating reports, exports, and summaries from model results.'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All three attributes are text-only. Remember Analytica's quoting convention: a literal single quote inside a single-quoted string is doubled (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==== Step 4 (optional): Add resources ====&lt;br /&gt;
&lt;br /&gt;
Add &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; objects (or other variable-class objects) '''inside''' the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object. Set each resource's &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt;. The &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt; is typically a literal text string.&lt;br /&gt;
&lt;br /&gt;
== Guidelines for effective skills ==&lt;br /&gt;
&lt;br /&gt;
A well-written skill is far more useful than a sketchy one. Aim for:&lt;br /&gt;
&lt;br /&gt;
* '''Concrete triggers in &amp;lt;code&amp;gt;WhenToUse&amp;lt;/code&amp;gt;.''' Specific user-phrasing cues beat abstract descriptions.&lt;br /&gt;
* '''Show, don't only tell.''' Include short examples for any action the skill recommends.&lt;br /&gt;
* '''Prefer dedicated tools over &amp;lt;code&amp;gt;Eval&amp;lt;/code&amp;gt;.''' When the skill recommends an action Assista should take in the model, point at the relevant Assista tool/callback rather than ad-hoc &amp;lt;code&amp;gt;Eval&amp;lt;/code&amp;gt; expressions. Fall back to &amp;lt;code&amp;gt;Eval&amp;lt;/code&amp;gt; only when no dedicated tool covers the operation.&lt;br /&gt;
* '''Keep the Description tight.''' It is the one piece always in Assista's context.&lt;br /&gt;
* '''Be terse.''' Don't pad with motivation or general advice Assista already has.&lt;br /&gt;
* '''Move long material into resources.''' Lookup tables, sample data, and long reference text belong in resources, not inlined in the body.&lt;br /&gt;
&lt;br /&gt;
=== Using libraries within a skill ===&lt;br /&gt;
&lt;br /&gt;
Custom skills can reference functions or variables defined in linked libraries — useful when the skill leans on reusable building blocks. A few guidelines:&lt;br /&gt;
&lt;br /&gt;
* Document any required library in the skill body, including how to link it if it isn't already linked.&lt;br /&gt;
* Prefer well-known or co-distributed libraries over ad-hoc dependencies, so the skill keeps working across users and models.&lt;br /&gt;
* For shared, model-agnostic skills, package the skill itself in a &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt; so it travels alongside its supporting code.&lt;br /&gt;
&lt;br /&gt;
== Quick checklist ==&lt;br /&gt;
&lt;br /&gt;
Before considering a new skill done, verify:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Identifier&amp;lt;/code&amp;gt; is a valid, descriptive Analytica identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; is a single short line, leading with what the skill does.&lt;br /&gt;
* &amp;lt;code&amp;gt;AssistaSkill::SkillCategory&amp;lt;/code&amp;gt; has the category name on line 1 (description optional on line 2+).&lt;br /&gt;
* &amp;lt;code&amp;gt;AssistaSkill::WhenToUse&amp;lt;/code&amp;gt; lists specific trigger conditions, ideally with user-phrasing cues.&lt;br /&gt;
* &amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt; is markdown, focused, with concrete examples for any recommended actions.&lt;br /&gt;
* If the skill is model-agnostic, it lives in a &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt; saved to its own file.&lt;br /&gt;
* Resources (if any) live inside the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object and use &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; (or another text-yielding class), with both &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt; set.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Assista - Analytica AI Assistant|Assista — Analytica AI Assistant]]&lt;br /&gt;
* [[Modules_and_Libraries#Filed_Library|Filed libraries (aka LinkLibrary)]]&lt;br /&gt;
* [[User-Defined_Functions#Libraries|Library]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=AssistaSkill&amp;diff=63912</id>
		<title>AssistaSkill</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=AssistaSkill&amp;diff=63912"/>
		<updated>2026-05-14T21:08:10Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: Redirected page to Assista - Analytica AI Assistant/Custom user skills for Assista&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Assista_-_Analytica_AI_Assistant/Custom_user_skills_for_Assista]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Assista_-_Analytica_AI_Assistant/Custom_user_skills_for_Assista&amp;diff=63911</id>
		<title>Assista - Analytica AI Assistant/Custom user skills for Assista</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Assista_-_Analytica_AI_Assistant/Custom_user_skills_for_Assista&amp;diff=63911"/>
		<updated>2026-05-14T21:06:32Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: /* See also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''New to [[Analytica 7.1]]''&lt;br /&gt;
&lt;br /&gt;
This page describes how to create your own '''custom user skill''' for Assista — a way to expand Assista's knowledge or capabilities with instructions, conventions, or domain knowledge that are specific to your model, your team, or your workflow.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #4a90e2; background:#eef6ff; padding:0.8em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Tip — Assista can help you author skills.''' The fastest way to write or refine a skill is to ask Assista directly — say something like ''&amp;quot;Help me write a custom skill that …&amp;quot;''. Assista has a built-in '''Authoring-skills''' capability that walks through picking a location, creating the [[#The AssistaSkill class|&amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object]], filling in each attribute, and adding resources. You don't need to memorize the details on this page — Assista will do most of the mechanical work for you and ask only the questions it needs answered.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== What is a skill? ==&lt;br /&gt;
&lt;br /&gt;
A '''skill''' is a packaged piece of guidance that Assista loads on demand when it decides the skill is relevant to your prompt. Each skill has:&lt;br /&gt;
&lt;br /&gt;
* A short '''description''' that is always visible to Assista, so it can decide whether to load the skill.&lt;br /&gt;
* A set of '''trigger conditions''' (''when-to-use'') that further refine when the skill applies.&lt;br /&gt;
* A '''skill body''' — the actual instructions, in markdown — that Assista reads when it loads the skill.&lt;br /&gt;
* Optional '''resources''' — supporting reference text (examples, lookup tables, sample data) that the skill body can refer to.&lt;br /&gt;
&lt;br /&gt;
Assista ships with a library of built-in skills. '''Custom user skills''' let you add your own on top of those. Custom skills come in two flavors:&lt;br /&gt;
&lt;br /&gt;
* '''Model-specific''' — embedded in a particular model. Use these when the skill references things only meaningful in that model (specific variables, modules, naming conventions, business rules).&lt;br /&gt;
* '''General / model-agnostic''' — placed in a shared linked library (a filed &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt;) so the same skill can be linked from multiple models. Use these for skills that are useful across many models — house style, team conventions, reusable techniques.&lt;br /&gt;
&lt;br /&gt;
Assista discovers your custom skills automatically at the start of each session and merges them with its built-in skills.&lt;br /&gt;
&lt;br /&gt;
=== Where to put a skill ===&lt;br /&gt;
&lt;br /&gt;
A skill object can live anywhere in the model, but the recommended placement is:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Skill type !! Where to put it&lt;br /&gt;
|-&lt;br /&gt;
| Model-specific || Inside a &amp;lt;code&amp;gt;Library&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;Module&amp;lt;/code&amp;gt;) in the current model.&lt;br /&gt;
|-&lt;br /&gt;
| Model-agnostic / general || Inside a '''&amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt;''' (filed library) saved as its own &amp;lt;code&amp;gt;.ana&amp;lt;/code&amp;gt; file, so it can be linked from multiple models.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Co-locating skills in a single library dedicated to skills keeps them tidy and easy to maintain. It's a recommended practice, not a requirement.&lt;br /&gt;
&lt;br /&gt;
== Anatomy of a skill ==&lt;br /&gt;
&lt;br /&gt;
=== The AssistaSkill class ===&lt;br /&gt;
&lt;br /&gt;
A skill is represented by an '''&amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt;''' object in the model. &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; is a module-like class — it acts as a private namespace, so identifiers of objects placed inside the skill (typically resources) do not collide with anything outside it.&lt;br /&gt;
&lt;br /&gt;
Every &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object should fill in these attributes:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Attribute !! Required !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Identifier&amp;lt;/code&amp;gt; || yes || The skill's name (a valid Analytica identifier). Used in skill listings and lookups.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt; || optional || Human-readable title.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; || yes || '''Very short''' — always included in Assista's context, so keep it to a single line.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AssistaSkill::SkillCategory&amp;lt;/code&amp;gt; || no|| Category name on line 1; optional category description on line 2 and beyond. If omitted its category will be &amp;quot;User_Skills&amp;quot;. When multiple skills are in the same category, providing the description or any one of them suffices.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AssistaSkill::WhenToUse&amp;lt;/code&amp;gt; || yes || Trigger conditions describing when the skill is applicable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt; || yes || The full skill instructions, in markdown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The three &amp;lt;code&amp;gt;AssistaSkill::&amp;lt;/code&amp;gt;-prefixed attributes live in the private '''&amp;lt;code&amp;gt;AssistaSkill::&amp;lt;/code&amp;gt; namespace''' — when reading or setting them via expressions, you must use the qualified name (&amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt;, not just &amp;lt;code&amp;gt;SkillBody&amp;lt;/code&amp;gt;). All three are '''text-only'''.&lt;br /&gt;
&lt;br /&gt;
=== Writing a good Description ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; is included in every Assista call where skills are considered, so it must be '''short''' — typically a single line of 10–25 words. Lead with what the skill does, then a brief ''&amp;quot;use when …&amp;quot;'' cue.&lt;br /&gt;
&lt;br /&gt;
Example: ''&amp;quot;Convert a wide-format table to long-format. Use when the user has data with multiple measurement columns to stack.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
=== Writing SkillCategory ===&lt;br /&gt;
&lt;br /&gt;
The first line is the category name (use the same wording across all skills that share a category). If a second-and-later line is present, it serves as the category's description; it is only used when the category isn't already defined by another skill. For skills joining an existing category, omit the description.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Reporting&lt;br /&gt;
Generating reports, exports, and summaries from model results.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Writing WhenToUse ===&lt;br /&gt;
&lt;br /&gt;
A bulleted list of trigger conditions. Assista reads this when deciding whether to load the skill body. Be specific — vague triggers either over-load the skill or miss valid cases. Include user-phrasing cues where possible (e.g., ''&amp;quot;User mentions 'unpivot' or 'melt'&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
=== Writing SkillBody ===&lt;br /&gt;
&lt;br /&gt;
The full instructions, in markdown. The body is loaded only when Assista decides the skill is relevant, so there is no hard length limit — but stay focused. Reference '''resources''' (see below) for long examples, lookup tables, or reference data rather than inlining them in the body.&lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
&lt;br /&gt;
Resources are supporting reference text placed '''inside''' the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object. Because &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; is its own namespace, resource identifiers don't collide with anything outside the skill.&lt;br /&gt;
&lt;br /&gt;
Use the &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; class for the typical case (literal text). Other variable classes are also recognized when you need them, but stick with &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; unless there's a reason not to.&lt;br /&gt;
&lt;br /&gt;
A resource needs:&lt;br /&gt;
&lt;br /&gt;
* An '''&amp;lt;code&amp;gt;Identifier&amp;lt;/code&amp;gt;''' — the resource name Assista will use to fetch it.&lt;br /&gt;
* A '''&amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;''' — what the resource contains (short).&lt;br /&gt;
* A '''&amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt;''' — the resource's content (typically a quoted text literal).&lt;br /&gt;
&lt;br /&gt;
A resource's &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt; may be a computed expression — it can even depend on the current model. Two caveats:&lt;br /&gt;
&lt;br /&gt;
# It must evaluate to an atomic text string.&lt;br /&gt;
# By default the value is '''cached''', so later changes to the model won't show up in the resource. To recompute on every access, set &amp;lt;code&amp;gt;CachingMethod&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; (never cache).&lt;br /&gt;
&lt;br /&gt;
Use computed resources sparingly — literal text is simpler and almost always sufficient.&lt;br /&gt;
&lt;br /&gt;
== How to create a skill ==&lt;br /&gt;
&lt;br /&gt;
=== The easy way: ask Assista ===&lt;br /&gt;
&lt;br /&gt;
The recommended way to create or edit a skill is to '''ask Assista'''. Open the Assista panel and say something like:&lt;br /&gt;
&lt;br /&gt;
* ''&amp;quot;Help me write a custom skill that …&amp;quot;''&lt;br /&gt;
* ''&amp;quot;Create a skill that teaches you about our naming conventions in this model.&amp;quot;''&lt;br /&gt;
* ''&amp;quot;Turn this prose into a proper skill: …&amp;quot;''&lt;br /&gt;
* ''&amp;quot;Edit my &amp;lt;code&amp;gt;Convert_wide_to_long&amp;lt;/code&amp;gt; skill to also mention the new &amp;lt;code&amp;gt;StackIndex&amp;lt;/code&amp;gt; function.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Assista's built-in '''Authoring-skills''' capability will:&lt;br /&gt;
&lt;br /&gt;
# Help you decide where the skill should live (model-specific vs. shared library).&lt;br /&gt;
# Create the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object with a valid identifier.&lt;br /&gt;
# Set &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SkillCategory&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WhenToUse&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;SkillBody&amp;lt;/code&amp;gt; for you, asking only the questions it needs answered.&lt;br /&gt;
# Add any resources you want inside the skill.&lt;br /&gt;
&lt;br /&gt;
Assista takes care of the mechanical details — including the namespace-qualified attribute names and Analytica's text-literal quoting rules — that would otherwise be easy to get wrong.&lt;br /&gt;
&lt;br /&gt;
=== The manual way ===&lt;br /&gt;
&lt;br /&gt;
If you'd rather create a skill by hand in Analytica:&lt;br /&gt;
&lt;br /&gt;
==== Step 1: Pick or create the parent module ====&lt;br /&gt;
&lt;br /&gt;
Decide where the new skill will live:&lt;br /&gt;
&lt;br /&gt;
* For '''shared / general''' skills, create or reuse a &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt; (filed library).&lt;br /&gt;
* For '''model-specific''' skills, create or reuse a &amp;lt;code&amp;gt;Library&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;Module&amp;lt;/code&amp;gt;) in the current model.&lt;br /&gt;
&lt;br /&gt;
==== Step 2: Create the AssistaSkill object ====&lt;br /&gt;
&lt;br /&gt;
Add a new object of class &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; inside the parent module. Give it a descriptive identifier and fill in &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Step 3: Set the namespaced attributes ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;AssistaSkill::SkillCategory&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AssistaSkill::WhenToUse&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt; are namespace-qualified, so you set them via expressions using the fully qualified name. For example, to set the category:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AssistaSkill::SkillCategory of Convert_wide_to_long := 'Reporting&lt;br /&gt;
Generating reports, exports, and summaries from model results.'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All three attributes are text-only. Remember Analytica's quoting convention: a literal single quote inside a single-quoted string is doubled (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==== Step 4 (optional): Add resources ====&lt;br /&gt;
&lt;br /&gt;
Add &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; objects (or other variable-class objects) '''inside''' the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object. Set each resource's &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt;. The &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt; is typically a literal text string.&lt;br /&gt;
&lt;br /&gt;
== Guidelines for effective skills ==&lt;br /&gt;
&lt;br /&gt;
A well-written skill is far more useful than a sketchy one. Aim for:&lt;br /&gt;
&lt;br /&gt;
* '''Concrete triggers in &amp;lt;code&amp;gt;WhenToUse&amp;lt;/code&amp;gt;.''' Specific user-phrasing cues beat abstract descriptions.&lt;br /&gt;
* '''Show, don't only tell.''' Include short examples for any action the skill recommends.&lt;br /&gt;
* '''Prefer dedicated tools over &amp;lt;code&amp;gt;Eval&amp;lt;/code&amp;gt;.''' When the skill recommends an action Assista should take in the model, point at the relevant Assista tool/callback rather than ad-hoc &amp;lt;code&amp;gt;Eval&amp;lt;/code&amp;gt; expressions. Fall back to &amp;lt;code&amp;gt;Eval&amp;lt;/code&amp;gt; only when no dedicated tool covers the operation.&lt;br /&gt;
* '''Keep the Description tight.''' It is the one piece always in Assista's context.&lt;br /&gt;
* '''Be terse.''' Don't pad with motivation or general advice Assista already has.&lt;br /&gt;
* '''Move long material into resources.''' Lookup tables, sample data, and long reference text belong in resources, not inlined in the body.&lt;br /&gt;
&lt;br /&gt;
=== Using libraries within a skill ===&lt;br /&gt;
&lt;br /&gt;
Custom skills can reference functions or variables defined in linked libraries — useful when the skill leans on reusable building blocks. A few guidelines:&lt;br /&gt;
&lt;br /&gt;
* Document any required library in the skill body, including how to link it if it isn't already linked.&lt;br /&gt;
* Prefer well-known or co-distributed libraries over ad-hoc dependencies, so the skill keeps working across users and models.&lt;br /&gt;
* For shared, model-agnostic skills, package the skill itself in a &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt; so it travels alongside its supporting code.&lt;br /&gt;
&lt;br /&gt;
== Quick checklist ==&lt;br /&gt;
&lt;br /&gt;
Before considering a new skill done, verify:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Identifier&amp;lt;/code&amp;gt; is a valid, descriptive Analytica identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; is a single short line, leading with what the skill does.&lt;br /&gt;
* &amp;lt;code&amp;gt;AssistaSkill::SkillCategory&amp;lt;/code&amp;gt; has the category name on line 1 (description optional on line 2+).&lt;br /&gt;
* &amp;lt;code&amp;gt;AssistaSkill::WhenToUse&amp;lt;/code&amp;gt; lists specific trigger conditions, ideally with user-phrasing cues.&lt;br /&gt;
* &amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt; is markdown, focused, with concrete examples for any recommended actions.&lt;br /&gt;
* If the skill is model-agnostic, it lives in a &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt; saved to its own file.&lt;br /&gt;
* Resources (if any) live inside the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object and use &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; (or another text-yielding class), with both &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt; set.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Assista - Analytica AI Assistant|Assista — Analytica AI Assistant]]&lt;br /&gt;
* [[AssistaSkill]]&lt;br /&gt;
* [[Modules_and_Libraries#Filed_Library|Filed libraries (aka LinkLibrary)]]&lt;br /&gt;
* [[User-Defined_Functions#Libraries|Library]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Assista_-_Analytica_AI_Assistant/Custom_user_skills_for_Assista&amp;diff=63910</id>
		<title>Assista - Analytica AI Assistant/Custom user skills for Assista</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Assista_-_Analytica_AI_Assistant/Custom_user_skills_for_Assista&amp;diff=63910"/>
		<updated>2026-05-14T21:04:22Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: /* Anatomy of a skill */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''New to [[Analytica 7.1]]''&lt;br /&gt;
&lt;br /&gt;
This page describes how to create your own '''custom user skill''' for Assista — a way to expand Assista's knowledge or capabilities with instructions, conventions, or domain knowledge that are specific to your model, your team, or your workflow.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #4a90e2; background:#eef6ff; padding:0.8em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Tip — Assista can help you author skills.''' The fastest way to write or refine a skill is to ask Assista directly — say something like ''&amp;quot;Help me write a custom skill that …&amp;quot;''. Assista has a built-in '''Authoring-skills''' capability that walks through picking a location, creating the [[#The AssistaSkill class|&amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object]], filling in each attribute, and adding resources. You don't need to memorize the details on this page — Assista will do most of the mechanical work for you and ask only the questions it needs answered.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== What is a skill? ==&lt;br /&gt;
&lt;br /&gt;
A '''skill''' is a packaged piece of guidance that Assista loads on demand when it decides the skill is relevant to your prompt. Each skill has:&lt;br /&gt;
&lt;br /&gt;
* A short '''description''' that is always visible to Assista, so it can decide whether to load the skill.&lt;br /&gt;
* A set of '''trigger conditions''' (''when-to-use'') that further refine when the skill applies.&lt;br /&gt;
* A '''skill body''' — the actual instructions, in markdown — that Assista reads when it loads the skill.&lt;br /&gt;
* Optional '''resources''' — supporting reference text (examples, lookup tables, sample data) that the skill body can refer to.&lt;br /&gt;
&lt;br /&gt;
Assista ships with a library of built-in skills. '''Custom user skills''' let you add your own on top of those. Custom skills come in two flavors:&lt;br /&gt;
&lt;br /&gt;
* '''Model-specific''' — embedded in a particular model. Use these when the skill references things only meaningful in that model (specific variables, modules, naming conventions, business rules).&lt;br /&gt;
* '''General / model-agnostic''' — placed in a shared linked library (a filed &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt;) so the same skill can be linked from multiple models. Use these for skills that are useful across many models — house style, team conventions, reusable techniques.&lt;br /&gt;
&lt;br /&gt;
Assista discovers your custom skills automatically at the start of each session and merges them with its built-in skills.&lt;br /&gt;
&lt;br /&gt;
=== Where to put a skill ===&lt;br /&gt;
&lt;br /&gt;
A skill object can live anywhere in the model, but the recommended placement is:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Skill type !! Where to put it&lt;br /&gt;
|-&lt;br /&gt;
| Model-specific || Inside a &amp;lt;code&amp;gt;Library&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;Module&amp;lt;/code&amp;gt;) in the current model.&lt;br /&gt;
|-&lt;br /&gt;
| Model-agnostic / general || Inside a '''&amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt;''' (filed library) saved as its own &amp;lt;code&amp;gt;.ana&amp;lt;/code&amp;gt; file, so it can be linked from multiple models.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Co-locating skills in a single library dedicated to skills keeps them tidy and easy to maintain. It's a recommended practice, not a requirement.&lt;br /&gt;
&lt;br /&gt;
== Anatomy of a skill ==&lt;br /&gt;
&lt;br /&gt;
=== The AssistaSkill class ===&lt;br /&gt;
&lt;br /&gt;
A skill is represented by an '''&amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt;''' object in the model. &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; is a module-like class — it acts as a private namespace, so identifiers of objects placed inside the skill (typically resources) do not collide with anything outside it.&lt;br /&gt;
&lt;br /&gt;
Every &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object should fill in these attributes:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Attribute !! Required !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Identifier&amp;lt;/code&amp;gt; || yes || The skill's name (a valid Analytica identifier). Used in skill listings and lookups.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt; || optional || Human-readable title.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; || yes || '''Very short''' — always included in Assista's context, so keep it to a single line.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AssistaSkill::SkillCategory&amp;lt;/code&amp;gt; || no|| Category name on line 1; optional category description on line 2 and beyond. If omitted its category will be &amp;quot;User_Skills&amp;quot;. When multiple skills are in the same category, providing the description or any one of them suffices.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AssistaSkill::WhenToUse&amp;lt;/code&amp;gt; || yes || Trigger conditions describing when the skill is applicable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt; || yes || The full skill instructions, in markdown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The three &amp;lt;code&amp;gt;AssistaSkill::&amp;lt;/code&amp;gt;-prefixed attributes live in the private '''&amp;lt;code&amp;gt;AssistaSkill::&amp;lt;/code&amp;gt; namespace''' — when reading or setting them via expressions, you must use the qualified name (&amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt;, not just &amp;lt;code&amp;gt;SkillBody&amp;lt;/code&amp;gt;). All three are '''text-only'''.&lt;br /&gt;
&lt;br /&gt;
=== Writing a good Description ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; is included in every Assista call where skills are considered, so it must be '''short''' — typically a single line of 10–25 words. Lead with what the skill does, then a brief ''&amp;quot;use when …&amp;quot;'' cue.&lt;br /&gt;
&lt;br /&gt;
Example: ''&amp;quot;Convert a wide-format table to long-format. Use when the user has data with multiple measurement columns to stack.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
=== Writing SkillCategory ===&lt;br /&gt;
&lt;br /&gt;
The first line is the category name (use the same wording across all skills that share a category). If a second-and-later line is present, it serves as the category's description; it is only used when the category isn't already defined by another skill. For skills joining an existing category, omit the description.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Reporting&lt;br /&gt;
Generating reports, exports, and summaries from model results.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Writing WhenToUse ===&lt;br /&gt;
&lt;br /&gt;
A bulleted list of trigger conditions. Assista reads this when deciding whether to load the skill body. Be specific — vague triggers either over-load the skill or miss valid cases. Include user-phrasing cues where possible (e.g., ''&amp;quot;User mentions 'unpivot' or 'melt'&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
=== Writing SkillBody ===&lt;br /&gt;
&lt;br /&gt;
The full instructions, in markdown. The body is loaded only when Assista decides the skill is relevant, so there is no hard length limit — but stay focused. Reference '''resources''' (see below) for long examples, lookup tables, or reference data rather than inlining them in the body.&lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
&lt;br /&gt;
Resources are supporting reference text placed '''inside''' the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object. Because &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; is its own namespace, resource identifiers don't collide with anything outside the skill.&lt;br /&gt;
&lt;br /&gt;
Use the &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; class for the typical case (literal text). Other variable classes are also recognized when you need them, but stick with &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; unless there's a reason not to.&lt;br /&gt;
&lt;br /&gt;
A resource needs:&lt;br /&gt;
&lt;br /&gt;
* An '''&amp;lt;code&amp;gt;Identifier&amp;lt;/code&amp;gt;''' — the resource name Assista will use to fetch it.&lt;br /&gt;
* A '''&amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;''' — what the resource contains (short).&lt;br /&gt;
* A '''&amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt;''' — the resource's content (typically a quoted text literal).&lt;br /&gt;
&lt;br /&gt;
A resource's &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt; may be a computed expression — it can even depend on the current model. Two caveats:&lt;br /&gt;
&lt;br /&gt;
# It must evaluate to an atomic text string.&lt;br /&gt;
# By default the value is '''cached''', so later changes to the model won't show up in the resource. To recompute on every access, set &amp;lt;code&amp;gt;CachingMethod&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; (never cache).&lt;br /&gt;
&lt;br /&gt;
Use computed resources sparingly — literal text is simpler and almost always sufficient.&lt;br /&gt;
&lt;br /&gt;
== How to create a skill ==&lt;br /&gt;
&lt;br /&gt;
=== The easy way: ask Assista ===&lt;br /&gt;
&lt;br /&gt;
The recommended way to create or edit a skill is to '''ask Assista'''. Open the Assista panel and say something like:&lt;br /&gt;
&lt;br /&gt;
* ''&amp;quot;Help me write a custom skill that …&amp;quot;''&lt;br /&gt;
* ''&amp;quot;Create a skill that teaches you about our naming conventions in this model.&amp;quot;''&lt;br /&gt;
* ''&amp;quot;Turn this prose into a proper skill: …&amp;quot;''&lt;br /&gt;
* ''&amp;quot;Edit my &amp;lt;code&amp;gt;Convert_wide_to_long&amp;lt;/code&amp;gt; skill to also mention the new &amp;lt;code&amp;gt;StackIndex&amp;lt;/code&amp;gt; function.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Assista's built-in '''Authoring-skills''' capability will:&lt;br /&gt;
&lt;br /&gt;
# Help you decide where the skill should live (model-specific vs. shared library).&lt;br /&gt;
# Create the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object with a valid identifier.&lt;br /&gt;
# Set &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SkillCategory&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WhenToUse&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;SkillBody&amp;lt;/code&amp;gt; for you, asking only the questions it needs answered.&lt;br /&gt;
# Add any resources you want inside the skill.&lt;br /&gt;
&lt;br /&gt;
Assista takes care of the mechanical details — including the namespace-qualified attribute names and Analytica's text-literal quoting rules — that would otherwise be easy to get wrong.&lt;br /&gt;
&lt;br /&gt;
=== The manual way ===&lt;br /&gt;
&lt;br /&gt;
If you'd rather create a skill by hand in Analytica:&lt;br /&gt;
&lt;br /&gt;
==== Step 1: Pick or create the parent module ====&lt;br /&gt;
&lt;br /&gt;
Decide where the new skill will live:&lt;br /&gt;
&lt;br /&gt;
* For '''shared / general''' skills, create or reuse a &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt; (filed library).&lt;br /&gt;
* For '''model-specific''' skills, create or reuse a &amp;lt;code&amp;gt;Library&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;Module&amp;lt;/code&amp;gt;) in the current model.&lt;br /&gt;
&lt;br /&gt;
==== Step 2: Create the AssistaSkill object ====&lt;br /&gt;
&lt;br /&gt;
Add a new object of class &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; inside the parent module. Give it a descriptive identifier and fill in &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Step 3: Set the namespaced attributes ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;AssistaSkill::SkillCategory&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AssistaSkill::WhenToUse&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt; are namespace-qualified, so you set them via expressions using the fully qualified name. For example, to set the category:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AssistaSkill::SkillCategory of Convert_wide_to_long := 'Reporting&lt;br /&gt;
Generating reports, exports, and summaries from model results.'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All three attributes are text-only. Remember Analytica's quoting convention: a literal single quote inside a single-quoted string is doubled (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==== Step 4 (optional): Add resources ====&lt;br /&gt;
&lt;br /&gt;
Add &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; objects (or other variable-class objects) '''inside''' the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object. Set each resource's &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt;. The &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt; is typically a literal text string.&lt;br /&gt;
&lt;br /&gt;
== Guidelines for effective skills ==&lt;br /&gt;
&lt;br /&gt;
A well-written skill is far more useful than a sketchy one. Aim for:&lt;br /&gt;
&lt;br /&gt;
* '''Concrete triggers in &amp;lt;code&amp;gt;WhenToUse&amp;lt;/code&amp;gt;.''' Specific user-phrasing cues beat abstract descriptions.&lt;br /&gt;
* '''Show, don't only tell.''' Include short examples for any action the skill recommends.&lt;br /&gt;
* '''Prefer dedicated tools over &amp;lt;code&amp;gt;Eval&amp;lt;/code&amp;gt;.''' When the skill recommends an action Assista should take in the model, point at the relevant Assista tool/callback rather than ad-hoc &amp;lt;code&amp;gt;Eval&amp;lt;/code&amp;gt; expressions. Fall back to &amp;lt;code&amp;gt;Eval&amp;lt;/code&amp;gt; only when no dedicated tool covers the operation.&lt;br /&gt;
* '''Keep the Description tight.''' It is the one piece always in Assista's context.&lt;br /&gt;
* '''Be terse.''' Don't pad with motivation or general advice Assista already has.&lt;br /&gt;
* '''Move long material into resources.''' Lookup tables, sample data, and long reference text belong in resources, not inlined in the body.&lt;br /&gt;
&lt;br /&gt;
=== Using libraries within a skill ===&lt;br /&gt;
&lt;br /&gt;
Custom skills can reference functions or variables defined in linked libraries — useful when the skill leans on reusable building blocks. A few guidelines:&lt;br /&gt;
&lt;br /&gt;
* Document any required library in the skill body, including how to link it if it isn't already linked.&lt;br /&gt;
* Prefer well-known or co-distributed libraries over ad-hoc dependencies, so the skill keeps working across users and models.&lt;br /&gt;
* For shared, model-agnostic skills, package the skill itself in a &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt; so it travels alongside its supporting code.&lt;br /&gt;
&lt;br /&gt;
== Quick checklist ==&lt;br /&gt;
&lt;br /&gt;
Before considering a new skill done, verify:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Identifier&amp;lt;/code&amp;gt; is a valid, descriptive Analytica identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; is a single short line, leading with what the skill does.&lt;br /&gt;
* &amp;lt;code&amp;gt;AssistaSkill::SkillCategory&amp;lt;/code&amp;gt; has the category name on line 1 (description optional on line 2+).&lt;br /&gt;
* &amp;lt;code&amp;gt;AssistaSkill::WhenToUse&amp;lt;/code&amp;gt; lists specific trigger conditions, ideally with user-phrasing cues.&lt;br /&gt;
* &amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt; is markdown, focused, with concrete examples for any recommended actions.&lt;br /&gt;
* If the skill is model-agnostic, it lives in a &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt; saved to its own file.&lt;br /&gt;
* Resources (if any) live inside the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object and use &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; (or another text-yielding class), with both &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt; set.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Assista - Analytica AI Assistant|Assista — Analytica AI Assistant]]&lt;br /&gt;
* [[AssistaSkill]]&lt;br /&gt;
* [[LinkLibrary]]&lt;br /&gt;
* [[Library]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Assista_-_Analytica_AI_Assistant/Custom_user_skills_for_Assista&amp;diff=63909</id>
		<title>Assista - Analytica AI Assistant/Custom user skills for Assista</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Assista_-_Analytica_AI_Assistant/Custom_user_skills_for_Assista&amp;diff=63909"/>
		<updated>2026-05-14T21:02:49Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: /* The AssistaSkill class */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''New to [[Analytica 7.1]]''&lt;br /&gt;
&lt;br /&gt;
This page describes how to create your own '''custom user skill''' for Assista — a way to expand Assista's knowledge or capabilities with instructions, conventions, or domain knowledge that are specific to your model, your team, or your workflow.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #4a90e2; background:#eef6ff; padding:0.8em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Tip — Assista can help you author skills.''' The fastest way to write or refine a skill is to ask Assista directly — say something like ''&amp;quot;Help me write a custom skill that …&amp;quot;''. Assista has a built-in '''Authoring-skills''' capability that walks through picking a location, creating the [[#The AssistaSkill class|&amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object]], filling in each attribute, and adding resources. You don't need to memorize the details on this page — Assista will do most of the mechanical work for you and ask only the questions it needs answered.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== What is a skill? ==&lt;br /&gt;
&lt;br /&gt;
A '''skill''' is a packaged piece of guidance that Assista loads on demand when it decides the skill is relevant to your prompt. Each skill has:&lt;br /&gt;
&lt;br /&gt;
* A short '''description''' that is always visible to Assista, so it can decide whether to load the skill.&lt;br /&gt;
* A set of '''trigger conditions''' (''when-to-use'') that further refine when the skill applies.&lt;br /&gt;
* A '''skill body''' — the actual instructions, in markdown — that Assista reads when it loads the skill.&lt;br /&gt;
* Optional '''resources''' — supporting reference text (examples, lookup tables, sample data) that the skill body can refer to.&lt;br /&gt;
&lt;br /&gt;
Assista ships with a library of built-in skills. '''Custom user skills''' let you add your own on top of those. Custom skills come in two flavors:&lt;br /&gt;
&lt;br /&gt;
* '''Model-specific''' — embedded in a particular model. Use these when the skill references things only meaningful in that model (specific variables, modules, naming conventions, business rules).&lt;br /&gt;
* '''General / model-agnostic''' — placed in a shared linked library (a filed &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt;) so the same skill can be linked from multiple models. Use these for skills that are useful across many models — house style, team conventions, reusable techniques.&lt;br /&gt;
&lt;br /&gt;
Assista discovers your custom skills automatically at the start of each session and merges them with its built-in skills.&lt;br /&gt;
&lt;br /&gt;
=== Where to put a skill ===&lt;br /&gt;
&lt;br /&gt;
A skill object can live anywhere in the model, but the recommended placement is:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Skill type !! Where to put it&lt;br /&gt;
|-&lt;br /&gt;
| Model-specific || Inside a &amp;lt;code&amp;gt;Library&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;Module&amp;lt;/code&amp;gt;) in the current model.&lt;br /&gt;
|-&lt;br /&gt;
| Model-agnostic / general || Inside a '''&amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt;''' (filed library) saved as its own &amp;lt;code&amp;gt;.ana&amp;lt;/code&amp;gt; file, so it can be linked from multiple models.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Co-locating skills in a single library dedicated to skills keeps them tidy and easy to maintain. It's a recommended practice, not a requirement.&lt;br /&gt;
&lt;br /&gt;
== Anatomy of a skill ==&lt;br /&gt;
&lt;br /&gt;
=== The AssistaSkill class ===&lt;br /&gt;
&lt;br /&gt;
A skill is represented by an '''&amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt;''' object in the model. &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; is a module-like class — it acts as a private namespace, so identifiers of objects placed inside the skill (typically resources) do not collide with anything outside it.&lt;br /&gt;
&lt;br /&gt;
Every &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object should fill in these attributes:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Attribute !! Required !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Identifier&amp;lt;/code&amp;gt; || yes || The skill's name (a valid Analytica identifier). Used in skill listings and lookups.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt; || optional || Human-readable title.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; || yes || '''Very short''' — always included in Assista's context, so keep it to a single line.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AssistaSkill::SkillCategory&amp;lt;/code&amp;gt; || no|| Category name on line 1; optional category description on line 2 and beyond. If omitted its category will be &amp;quot;User_Skills&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AssistaSkill::WhenToUse&amp;lt;/code&amp;gt; || yes || Trigger conditions describing when the skill is applicable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt; || yes || The full skill instructions, in markdown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The three &amp;lt;code&amp;gt;AssistaSkill::&amp;lt;/code&amp;gt;-prefixed attributes live in the private '''&amp;lt;code&amp;gt;AssistaSkill::&amp;lt;/code&amp;gt; namespace''' — when reading or setting them via expressions, you must use the qualified name (&amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt;, not just &amp;lt;code&amp;gt;SkillBody&amp;lt;/code&amp;gt;). All three are '''text-only'''.&lt;br /&gt;
&lt;br /&gt;
=== Writing a good Description ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; is included in every Assista call where skills are considered, so it must be '''short''' — typically a single line of 10–25 words. Lead with what the skill does, then a brief ''&amp;quot;use when …&amp;quot;'' cue.&lt;br /&gt;
&lt;br /&gt;
Example: ''&amp;quot;Convert a wide-format table to long-format. Use when the user has data with multiple measurement columns to stack.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
=== Writing SkillCategory ===&lt;br /&gt;
&lt;br /&gt;
The first line is the category name (use the same wording across all skills that share a category). If a second-and-later line is present, it serves as the category's description; it is only used when the category isn't already defined by another skill. For skills joining an existing category, omit the description.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Reporting&lt;br /&gt;
Generating reports, exports, and summaries from model results.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Writing WhenToUse ===&lt;br /&gt;
&lt;br /&gt;
A bulleted list of trigger conditions. Assista reads this when deciding whether to load the skill body. Be specific — vague triggers either over-load the skill or miss valid cases. Include user-phrasing cues where possible (e.g., ''&amp;quot;User mentions 'unpivot' or 'melt'&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
=== Writing SkillBody ===&lt;br /&gt;
&lt;br /&gt;
The full instructions, in markdown. The body is loaded only when Assista decides the skill is relevant, so there is no hard length limit — but stay focused. Reference '''resources''' (see below) for long examples, lookup tables, or reference data rather than inlining them in the body.&lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
&lt;br /&gt;
Resources are supporting reference text placed '''inside''' the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object. Because &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; is its own namespace, resource identifiers don't collide with anything outside the skill.&lt;br /&gt;
&lt;br /&gt;
Use the &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; class for the typical case (literal text). Other variable classes are also recognized when you need them, but stick with &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; unless there's a reason not to.&lt;br /&gt;
&lt;br /&gt;
A resource needs:&lt;br /&gt;
&lt;br /&gt;
* An '''&amp;lt;code&amp;gt;Identifier&amp;lt;/code&amp;gt;''' — the resource name Assista will use to fetch it.&lt;br /&gt;
* A '''&amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;''' — what the resource contains (short).&lt;br /&gt;
* A '''&amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt;''' — the resource's content (typically a quoted text literal).&lt;br /&gt;
&lt;br /&gt;
A resource's &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt; may be a computed expression — it can even depend on the current model. Two caveats:&lt;br /&gt;
&lt;br /&gt;
# It must evaluate to an atomic text string.&lt;br /&gt;
# By default the value is '''cached''', so later changes to the model won't show up in the resource. To recompute on every access, set &amp;lt;code&amp;gt;CachingMethod&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; (never cache).&lt;br /&gt;
&lt;br /&gt;
Use computed resources sparingly — literal text is simpler and almost always sufficient.&lt;br /&gt;
&lt;br /&gt;
== How to create a skill ==&lt;br /&gt;
&lt;br /&gt;
=== The easy way: ask Assista ===&lt;br /&gt;
&lt;br /&gt;
The recommended way to create or edit a skill is to '''ask Assista'''. Open the Assista panel and say something like:&lt;br /&gt;
&lt;br /&gt;
* ''&amp;quot;Help me write a custom skill that …&amp;quot;''&lt;br /&gt;
* ''&amp;quot;Create a skill that teaches you about our naming conventions in this model.&amp;quot;''&lt;br /&gt;
* ''&amp;quot;Turn this prose into a proper skill: …&amp;quot;''&lt;br /&gt;
* ''&amp;quot;Edit my &amp;lt;code&amp;gt;Convert_wide_to_long&amp;lt;/code&amp;gt; skill to also mention the new &amp;lt;code&amp;gt;StackIndex&amp;lt;/code&amp;gt; function.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Assista's built-in '''Authoring-skills''' capability will:&lt;br /&gt;
&lt;br /&gt;
# Help you decide where the skill should live (model-specific vs. shared library).&lt;br /&gt;
# Create the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object with a valid identifier.&lt;br /&gt;
# Set &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SkillCategory&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WhenToUse&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;SkillBody&amp;lt;/code&amp;gt; for you, asking only the questions it needs answered.&lt;br /&gt;
# Add any resources you want inside the skill.&lt;br /&gt;
&lt;br /&gt;
Assista takes care of the mechanical details — including the namespace-qualified attribute names and Analytica's text-literal quoting rules — that would otherwise be easy to get wrong.&lt;br /&gt;
&lt;br /&gt;
=== The manual way ===&lt;br /&gt;
&lt;br /&gt;
If you'd rather create a skill by hand in Analytica:&lt;br /&gt;
&lt;br /&gt;
==== Step 1: Pick or create the parent module ====&lt;br /&gt;
&lt;br /&gt;
Decide where the new skill will live:&lt;br /&gt;
&lt;br /&gt;
* For '''shared / general''' skills, create or reuse a &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt; (filed library).&lt;br /&gt;
* For '''model-specific''' skills, create or reuse a &amp;lt;code&amp;gt;Library&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;Module&amp;lt;/code&amp;gt;) in the current model.&lt;br /&gt;
&lt;br /&gt;
==== Step 2: Create the AssistaSkill object ====&lt;br /&gt;
&lt;br /&gt;
Add a new object of class &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; inside the parent module. Give it a descriptive identifier and fill in &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Step 3: Set the namespaced attributes ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;AssistaSkill::SkillCategory&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AssistaSkill::WhenToUse&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt; are namespace-qualified, so you set them via expressions using the fully qualified name. For example, to set the category:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AssistaSkill::SkillCategory of Convert_wide_to_long := 'Reporting&lt;br /&gt;
Generating reports, exports, and summaries from model results.'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All three attributes are text-only. Remember Analytica's quoting convention: a literal single quote inside a single-quoted string is doubled (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==== Step 4 (optional): Add resources ====&lt;br /&gt;
&lt;br /&gt;
Add &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; objects (or other variable-class objects) '''inside''' the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object. Set each resource's &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt;. The &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt; is typically a literal text string.&lt;br /&gt;
&lt;br /&gt;
== Guidelines for effective skills ==&lt;br /&gt;
&lt;br /&gt;
A well-written skill is far more useful than a sketchy one. Aim for:&lt;br /&gt;
&lt;br /&gt;
* '''Concrete triggers in &amp;lt;code&amp;gt;WhenToUse&amp;lt;/code&amp;gt;.''' Specific user-phrasing cues beat abstract descriptions.&lt;br /&gt;
* '''Show, don't only tell.''' Include short examples for any action the skill recommends.&lt;br /&gt;
* '''Prefer dedicated tools over &amp;lt;code&amp;gt;Eval&amp;lt;/code&amp;gt;.''' When the skill recommends an action Assista should take in the model, point at the relevant Assista tool/callback rather than ad-hoc &amp;lt;code&amp;gt;Eval&amp;lt;/code&amp;gt; expressions. Fall back to &amp;lt;code&amp;gt;Eval&amp;lt;/code&amp;gt; only when no dedicated tool covers the operation.&lt;br /&gt;
* '''Keep the Description tight.''' It is the one piece always in Assista's context.&lt;br /&gt;
* '''Be terse.''' Don't pad with motivation or general advice Assista already has.&lt;br /&gt;
* '''Move long material into resources.''' Lookup tables, sample data, and long reference text belong in resources, not inlined in the body.&lt;br /&gt;
&lt;br /&gt;
=== Using libraries within a skill ===&lt;br /&gt;
&lt;br /&gt;
Custom skills can reference functions or variables defined in linked libraries — useful when the skill leans on reusable building blocks. A few guidelines:&lt;br /&gt;
&lt;br /&gt;
* Document any required library in the skill body, including how to link it if it isn't already linked.&lt;br /&gt;
* Prefer well-known or co-distributed libraries over ad-hoc dependencies, so the skill keeps working across users and models.&lt;br /&gt;
* For shared, model-agnostic skills, package the skill itself in a &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt; so it travels alongside its supporting code.&lt;br /&gt;
&lt;br /&gt;
== Quick checklist ==&lt;br /&gt;
&lt;br /&gt;
Before considering a new skill done, verify:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Identifier&amp;lt;/code&amp;gt; is a valid, descriptive Analytica identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; is a single short line, leading with what the skill does.&lt;br /&gt;
* &amp;lt;code&amp;gt;AssistaSkill::SkillCategory&amp;lt;/code&amp;gt; has the category name on line 1 (description optional on line 2+).&lt;br /&gt;
* &amp;lt;code&amp;gt;AssistaSkill::WhenToUse&amp;lt;/code&amp;gt; lists specific trigger conditions, ideally with user-phrasing cues.&lt;br /&gt;
* &amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt; is markdown, focused, with concrete examples for any recommended actions.&lt;br /&gt;
* If the skill is model-agnostic, it lives in a &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt; saved to its own file.&lt;br /&gt;
* Resources (if any) live inside the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object and use &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; (or another text-yielding class), with both &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt; set.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Assista - Analytica AI Assistant|Assista — Analytica AI Assistant]]&lt;br /&gt;
* [[AssistaSkill]]&lt;br /&gt;
* [[LinkLibrary]]&lt;br /&gt;
* [[Library]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Assista_-_Analytica_AI_Assistant/Custom_user_skills_for_Assista&amp;diff=63908</id>
		<title>Assista - Analytica AI Assistant/Custom user skills for Assista</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Assista_-_Analytica_AI_Assistant/Custom_user_skills_for_Assista&amp;diff=63908"/>
		<updated>2026-05-14T20:49:10Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: Initial content: documenting custom user skills for Assista&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''New to [[Analytica 7.1]]''&lt;br /&gt;
&lt;br /&gt;
This page describes how to create your own '''custom user skill''' for Assista — a way to expand Assista's knowledge or capabilities with instructions, conventions, or domain knowledge that are specific to your model, your team, or your workflow.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #4a90e2; background:#eef6ff; padding:0.8em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Tip — Assista can help you author skills.''' The fastest way to write or refine a skill is to ask Assista directly — say something like ''&amp;quot;Help me write a custom skill that …&amp;quot;''. Assista has a built-in '''Authoring-skills''' capability that walks through picking a location, creating the [[#The AssistaSkill class|&amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object]], filling in each attribute, and adding resources. You don't need to memorize the details on this page — Assista will do most of the mechanical work for you and ask only the questions it needs answered.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== What is a skill? ==&lt;br /&gt;
&lt;br /&gt;
A '''skill''' is a packaged piece of guidance that Assista loads on demand when it decides the skill is relevant to your prompt. Each skill has:&lt;br /&gt;
&lt;br /&gt;
* A short '''description''' that is always visible to Assista, so it can decide whether to load the skill.&lt;br /&gt;
* A set of '''trigger conditions''' (''when-to-use'') that further refine when the skill applies.&lt;br /&gt;
* A '''skill body''' — the actual instructions, in markdown — that Assista reads when it loads the skill.&lt;br /&gt;
* Optional '''resources''' — supporting reference text (examples, lookup tables, sample data) that the skill body can refer to.&lt;br /&gt;
&lt;br /&gt;
Assista ships with a library of built-in skills. '''Custom user skills''' let you add your own on top of those. Custom skills come in two flavors:&lt;br /&gt;
&lt;br /&gt;
* '''Model-specific''' — embedded in a particular model. Use these when the skill references things only meaningful in that model (specific variables, modules, naming conventions, business rules).&lt;br /&gt;
* '''General / model-agnostic''' — placed in a shared linked library (a filed &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt;) so the same skill can be linked from multiple models. Use these for skills that are useful across many models — house style, team conventions, reusable techniques.&lt;br /&gt;
&lt;br /&gt;
Assista discovers your custom skills automatically at the start of each session and merges them with its built-in skills.&lt;br /&gt;
&lt;br /&gt;
=== Where to put a skill ===&lt;br /&gt;
&lt;br /&gt;
A skill object can live anywhere in the model, but the recommended placement is:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Skill type !! Where to put it&lt;br /&gt;
|-&lt;br /&gt;
| Model-specific || Inside a &amp;lt;code&amp;gt;Library&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;Module&amp;lt;/code&amp;gt;) in the current model.&lt;br /&gt;
|-&lt;br /&gt;
| Model-agnostic / general || Inside a '''&amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt;''' (filed library) saved as its own &amp;lt;code&amp;gt;.ana&amp;lt;/code&amp;gt; file, so it can be linked from multiple models.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Co-locating skills in a single library dedicated to skills keeps them tidy and easy to maintain. It's a recommended practice, not a requirement.&lt;br /&gt;
&lt;br /&gt;
== Anatomy of a skill ==&lt;br /&gt;
&lt;br /&gt;
=== The AssistaSkill class ===&lt;br /&gt;
&lt;br /&gt;
A skill is represented by an '''&amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt;''' object in the model. &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; is a module-like class — it acts as a private namespace, so identifiers of objects placed inside the skill (typically resources) do not collide with anything outside it.&lt;br /&gt;
&lt;br /&gt;
Every &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object should fill in these attributes:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Attribute !! Required !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Identifier&amp;lt;/code&amp;gt; || yes || The skill's name (a valid Analytica identifier). Used in skill listings and lookups.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt; || optional || Human-readable title.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; || yes || '''Very short''' — always included in Assista's context, so keep it to a single line.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AssistaSkill::SkillCategory&amp;lt;/code&amp;gt; || yes || Category name on line 1; optional category description on line 2 and beyond.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AssistaSkill::WhenToUse&amp;lt;/code&amp;gt; || yes || Trigger conditions describing when the skill is applicable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt; || yes || The full skill instructions, in markdown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The three &amp;lt;code&amp;gt;AssistaSkill::&amp;lt;/code&amp;gt;-prefixed attributes live in the private '''&amp;lt;code&amp;gt;AssistaSkill::&amp;lt;/code&amp;gt; namespace''' — when reading or setting them via expressions, you must use the qualified name (&amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt;, not just &amp;lt;code&amp;gt;SkillBody&amp;lt;/code&amp;gt;). All three are '''text-only'''.&lt;br /&gt;
&lt;br /&gt;
=== Writing a good Description ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; is included in every Assista call where skills are considered, so it must be '''short''' — typically a single line of 10–25 words. Lead with what the skill does, then a brief ''&amp;quot;use when …&amp;quot;'' cue.&lt;br /&gt;
&lt;br /&gt;
Example: ''&amp;quot;Convert a wide-format table to long-format. Use when the user has data with multiple measurement columns to stack.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
=== Writing SkillCategory ===&lt;br /&gt;
&lt;br /&gt;
The first line is the category name (use the same wording across all skills that share a category). If a second-and-later line is present, it serves as the category's description; it is only used when the category isn't already defined by another skill. For skills joining an existing category, omit the description.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Reporting&lt;br /&gt;
Generating reports, exports, and summaries from model results.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Writing WhenToUse ===&lt;br /&gt;
&lt;br /&gt;
A bulleted list of trigger conditions. Assista reads this when deciding whether to load the skill body. Be specific — vague triggers either over-load the skill or miss valid cases. Include user-phrasing cues where possible (e.g., ''&amp;quot;User mentions 'unpivot' or 'melt'&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
=== Writing SkillBody ===&lt;br /&gt;
&lt;br /&gt;
The full instructions, in markdown. The body is loaded only when Assista decides the skill is relevant, so there is no hard length limit — but stay focused. Reference '''resources''' (see below) for long examples, lookup tables, or reference data rather than inlining them in the body.&lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
&lt;br /&gt;
Resources are supporting reference text placed '''inside''' the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object. Because &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; is its own namespace, resource identifiers don't collide with anything outside the skill.&lt;br /&gt;
&lt;br /&gt;
Use the &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; class for the typical case (literal text). Other variable classes are also recognized when you need them, but stick with &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; unless there's a reason not to.&lt;br /&gt;
&lt;br /&gt;
A resource needs:&lt;br /&gt;
&lt;br /&gt;
* An '''&amp;lt;code&amp;gt;Identifier&amp;lt;/code&amp;gt;''' — the resource name Assista will use to fetch it.&lt;br /&gt;
* A '''&amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;''' — what the resource contains (short).&lt;br /&gt;
* A '''&amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt;''' — the resource's content (typically a quoted text literal).&lt;br /&gt;
&lt;br /&gt;
A resource's &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt; may be a computed expression — it can even depend on the current model. Two caveats:&lt;br /&gt;
&lt;br /&gt;
# It must evaluate to an atomic text string.&lt;br /&gt;
# By default the value is '''cached''', so later changes to the model won't show up in the resource. To recompute on every access, set &amp;lt;code&amp;gt;CachingMethod&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; (never cache).&lt;br /&gt;
&lt;br /&gt;
Use computed resources sparingly — literal text is simpler and almost always sufficient.&lt;br /&gt;
&lt;br /&gt;
== How to create a skill ==&lt;br /&gt;
&lt;br /&gt;
=== The easy way: ask Assista ===&lt;br /&gt;
&lt;br /&gt;
The recommended way to create or edit a skill is to '''ask Assista'''. Open the Assista panel and say something like:&lt;br /&gt;
&lt;br /&gt;
* ''&amp;quot;Help me write a custom skill that …&amp;quot;''&lt;br /&gt;
* ''&amp;quot;Create a skill that teaches you about our naming conventions in this model.&amp;quot;''&lt;br /&gt;
* ''&amp;quot;Turn this prose into a proper skill: …&amp;quot;''&lt;br /&gt;
* ''&amp;quot;Edit my &amp;lt;code&amp;gt;Convert_wide_to_long&amp;lt;/code&amp;gt; skill to also mention the new &amp;lt;code&amp;gt;StackIndex&amp;lt;/code&amp;gt; function.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Assista's built-in '''Authoring-skills''' capability will:&lt;br /&gt;
&lt;br /&gt;
# Help you decide where the skill should live (model-specific vs. shared library).&lt;br /&gt;
# Create the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object with a valid identifier.&lt;br /&gt;
# Set &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SkillCategory&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WhenToUse&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;SkillBody&amp;lt;/code&amp;gt; for you, asking only the questions it needs answered.&lt;br /&gt;
# Add any resources you want inside the skill.&lt;br /&gt;
&lt;br /&gt;
Assista takes care of the mechanical details — including the namespace-qualified attribute names and Analytica's text-literal quoting rules — that would otherwise be easy to get wrong.&lt;br /&gt;
&lt;br /&gt;
=== The manual way ===&lt;br /&gt;
&lt;br /&gt;
If you'd rather create a skill by hand in Analytica:&lt;br /&gt;
&lt;br /&gt;
==== Step 1: Pick or create the parent module ====&lt;br /&gt;
&lt;br /&gt;
Decide where the new skill will live:&lt;br /&gt;
&lt;br /&gt;
* For '''shared / general''' skills, create or reuse a &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt; (filed library).&lt;br /&gt;
* For '''model-specific''' skills, create or reuse a &amp;lt;code&amp;gt;Library&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;Module&amp;lt;/code&amp;gt;) in the current model.&lt;br /&gt;
&lt;br /&gt;
==== Step 2: Create the AssistaSkill object ====&lt;br /&gt;
&lt;br /&gt;
Add a new object of class &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; inside the parent module. Give it a descriptive identifier and fill in &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Step 3: Set the namespaced attributes ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;AssistaSkill::SkillCategory&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AssistaSkill::WhenToUse&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt; are namespace-qualified, so you set them via expressions using the fully qualified name. For example, to set the category:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AssistaSkill::SkillCategory of Convert_wide_to_long := 'Reporting&lt;br /&gt;
Generating reports, exports, and summaries from model results.'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All three attributes are text-only. Remember Analytica's quoting convention: a literal single quote inside a single-quoted string is doubled (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==== Step 4 (optional): Add resources ====&lt;br /&gt;
&lt;br /&gt;
Add &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; objects (or other variable-class objects) '''inside''' the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object. Set each resource's &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt;. The &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt; is typically a literal text string.&lt;br /&gt;
&lt;br /&gt;
== Guidelines for effective skills ==&lt;br /&gt;
&lt;br /&gt;
A well-written skill is far more useful than a sketchy one. Aim for:&lt;br /&gt;
&lt;br /&gt;
* '''Concrete triggers in &amp;lt;code&amp;gt;WhenToUse&amp;lt;/code&amp;gt;.''' Specific user-phrasing cues beat abstract descriptions.&lt;br /&gt;
* '''Show, don't only tell.''' Include short examples for any action the skill recommends.&lt;br /&gt;
* '''Prefer dedicated tools over &amp;lt;code&amp;gt;Eval&amp;lt;/code&amp;gt;.''' When the skill recommends an action Assista should take in the model, point at the relevant Assista tool/callback rather than ad-hoc &amp;lt;code&amp;gt;Eval&amp;lt;/code&amp;gt; expressions. Fall back to &amp;lt;code&amp;gt;Eval&amp;lt;/code&amp;gt; only when no dedicated tool covers the operation.&lt;br /&gt;
* '''Keep the Description tight.''' It is the one piece always in Assista's context.&lt;br /&gt;
* '''Be terse.''' Don't pad with motivation or general advice Assista already has.&lt;br /&gt;
* '''Move long material into resources.''' Lookup tables, sample data, and long reference text belong in resources, not inlined in the body.&lt;br /&gt;
&lt;br /&gt;
=== Using libraries within a skill ===&lt;br /&gt;
&lt;br /&gt;
Custom skills can reference functions or variables defined in linked libraries — useful when the skill leans on reusable building blocks. A few guidelines:&lt;br /&gt;
&lt;br /&gt;
* Document any required library in the skill body, including how to link it if it isn't already linked.&lt;br /&gt;
* Prefer well-known or co-distributed libraries over ad-hoc dependencies, so the skill keeps working across users and models.&lt;br /&gt;
* For shared, model-agnostic skills, package the skill itself in a &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt; so it travels alongside its supporting code.&lt;br /&gt;
&lt;br /&gt;
== Quick checklist ==&lt;br /&gt;
&lt;br /&gt;
Before considering a new skill done, verify:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Identifier&amp;lt;/code&amp;gt; is a valid, descriptive Analytica identifier.&lt;br /&gt;
* &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; is a single short line, leading with what the skill does.&lt;br /&gt;
* &amp;lt;code&amp;gt;AssistaSkill::SkillCategory&amp;lt;/code&amp;gt; has the category name on line 1 (description optional on line 2+).&lt;br /&gt;
* &amp;lt;code&amp;gt;AssistaSkill::WhenToUse&amp;lt;/code&amp;gt; lists specific trigger conditions, ideally with user-phrasing cues.&lt;br /&gt;
* &amp;lt;code&amp;gt;AssistaSkill::SkillBody&amp;lt;/code&amp;gt; is markdown, focused, with concrete examples for any recommended actions.&lt;br /&gt;
* If the skill is model-agnostic, it lives in a &amp;lt;code&amp;gt;LinkLibrary&amp;lt;/code&amp;gt; saved to its own file.&lt;br /&gt;
* Resources (if any) live inside the &amp;lt;code&amp;gt;AssistaSkill&amp;lt;/code&amp;gt; object and use &amp;lt;code&amp;gt;Constant&amp;lt;/code&amp;gt; (or another text-yielding class), with both &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Definition&amp;lt;/code&amp;gt; set.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Assista - Analytica AI Assistant|Assista — Analytica AI Assistant]]&lt;br /&gt;
* [[AssistaSkill]]&lt;br /&gt;
* [[LinkLibrary]]&lt;br /&gt;
* [[Library]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Keyboard_Shortcuts&amp;diff=63907</id>
		<title>Keyboard Shortcuts</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Keyboard_Shortcuts&amp;diff=63907"/>
		<updated>2026-05-14T18:03:10Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: ER 22141 -- shortcuts for Node Styles.... and Diagram styles...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Concepts]]&lt;br /&gt;
{{ReleaseBar}}&lt;br /&gt;
&lt;br /&gt;
Like most applications, Analytica offers keys or key combinations as shortcuts to access common features. Some, like ''ctrl+v'' to paste, or ''ctrl+s'' to '''s'''ave a model file, are common to most Windows applications.  Learning some of these can greatly speed up your interactions. &lt;br /&gt;
&lt;br /&gt;
You can see the keyboard shortcuts for Toolbar icon buttons in the tooltip that appears when you move the mouse cursor over each icon,  for menu options inside each menu at the top of the application, and for context-dependent menu that appears when you right-click. &lt;br /&gt;
&lt;br /&gt;
==Most valuable shortcuts==&lt;br /&gt;
&lt;br /&gt;
These are the most useful shortcuts to learn initially (beyond the standard shortcuts common to most Windows applications):&lt;br /&gt;
* ''CTRL+F'': Open the [[Find dialog]]&lt;br /&gt;
* ''CTRL+H'': Select a variable or function identifier in a definition, and press ''ctrl+H'' to open its Object view&lt;br /&gt;
* ''CTRL+R'': Select a node and see its result view&lt;br /&gt;
* ''CTR+B'': Open the [[Number Format Dialog]]&lt;br /&gt;
* ''CTR+U'': Open the [[Uncertainty Setup Dialog]]&lt;br /&gt;
* ''F8'': Change to Edit mode&lt;br /&gt;
* ''ctrl+click'': When the edit cursor is the a Definition in the Attribute panel at the bottom of a diagram, ''ctrl+click'' on another node to insert its identifier into the definition.&lt;br /&gt;
* Select several nodes in a Diagram and press:&lt;br /&gt;
** ''==''  resize the nodes to be the same as the last node you selected (the one with black boxes in the corners)&lt;br /&gt;
**''ctrl+='' align the nodes one above the other with same width&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Shortcuts for Toolbar buttons ==&lt;br /&gt;
&lt;br /&gt;
* F2: [[image:ParentTool.jpg]]: Open Diagram window containing the selected node.&lt;br /&gt;
* F3: [[image:OutlineTool.jpg]]: Open the Outliner window&lt;br /&gt;
* F4: [[image:ObjectWindowToolbarButton.jpg]]: Open the Object window for selected node.&lt;br /&gt;
* F5: [[image:ResultToolbarButton.jpg]]: Open the Result window for the selected variable. (same as CTRL+R)&lt;br /&gt;
* F6: [[image:Expr.jpg]]: Edit the definition (script for Button) of selected Variable or Function (same as CTRL+E) in Attribute Panel or Object window, depending on setting in Preferences... dialog.&lt;br /&gt;
* F7: [[image:browseTool.jpg]]: Enter browse mode &lt;br /&gt;
* F8: [[image:Edit_Mode_Toolbar_Button.jpg]]: Enter Edit mode&lt;br /&gt;
&lt;br /&gt;
== Shortcuts to add a nodes to a diagram ==&lt;br /&gt;
&lt;br /&gt;
* CTRL+1: New Decision node&lt;br /&gt;
* CTRL+2: New Variable node&lt;br /&gt;
* CTRL+3: New Chance node&lt;br /&gt;
* CTRL+4: New Objective node&lt;br /&gt;
* CTRL+5: New Module node &lt;br /&gt;
* CTRL+6: New Index node&lt;br /&gt;
* CTRL+7: New Constant node&lt;br /&gt;
* CTRL+8: New Function node&lt;br /&gt;
* CTRL+9: New Text node&lt;br /&gt;
* CTRL+0: New Button node&lt;br /&gt;
&lt;br /&gt;
== Tab as a shortcut ==&lt;br /&gt;
&lt;br /&gt;
Use the ''tab'' key to select the next element in a windowt: &lt;br /&gt;
* In a Diagram window, ''tab''  selects the next node from left to right, then up to down&lt;br /&gt;
* In an Object window,  ''tab'' selects the next Attribute field&lt;br /&gt;
* In a table,  ''tab'' selects the next cell.&lt;br /&gt;
&lt;br /&gt;
Use ''shift+tab'' to go backwards, to select the previous node, Attribute, or cell.&lt;br /&gt;
&lt;br /&gt;
=== Shortcuts for menus ===&lt;br /&gt;
&lt;br /&gt;
* F10: Select the main menu bar. &lt;br /&gt;
** Use left or right arrow or a letter to select a menu. &lt;br /&gt;
** Use up or down arrow or a letter to select an option in that menu.  &lt;br /&gt;
&lt;br /&gt;
* F12, or CTRL+': Open/close typescript window&lt;br /&gt;
&lt;br /&gt;
=== Shortcuts to edit a Definition or other attribute ===&lt;br /&gt;
&lt;br /&gt;
* Double-click an identifier to select it&lt;br /&gt;
* CTRL+f: Open [[find dialog]] for this identifier. A quick way to find the node for a variable, or open wiki page for a system function or variable.&lt;br /&gt;
* CTRL+click on a node:  When you are editing the Definition (or other attribute) in an Attribute panel, CTRL-click on another node in the same diagram inserts its identifier into the Definition. This shortcut is very handy when writing a complex expression.&lt;br /&gt;
* CTRL+alt on a node: Same as CTRL+click. Useful when running Analytica  on a Macintosh in VMWare Fusion or Parallels, which treat CTRL+click as something else. &lt;br /&gt;
* Return&lt;br /&gt;
* CTRL+Return&lt;br /&gt;
* CTRL+right-arrow: Move right one token (identifier or operator)&lt;br /&gt;
* CTRL+left-arrow: Move left one token (identifier or operator)&lt;br /&gt;
* CTRL+ALT+left-arrow: Find left paren that matches the right paren currently at the left of the caret.&lt;br /&gt;
* CTRL+ALT+right-arrow: Find right parent that matches the left parent currently to the right of the cursor.&lt;br /&gt;
* SHIFT+(any of the above): Select the characters between.&lt;br /&gt;
&lt;br /&gt;
=== Shortcuts to edit a diagram ===&lt;br /&gt;
&lt;br /&gt;
* Arrow: Move selected node(s) in direction of the arrow by a grid increment, if snap to grid is set -- otherwise, by one pixel.&lt;br /&gt;
* SHIFT+arrow: Move selected node(s) in direction of the arrow, by one pixel if snap to grid is set -- otherwise, by one grid increment. &lt;br /&gt;
* CTRL+left-arrow: Align left edges&lt;br /&gt;
* CTRL+F9: Align horiz center&lt;br /&gt;
* SHIFT+F9: Align vert centers of selected nodes&lt;br /&gt;
* CTRL+right-arrow: Align right edges&lt;br /&gt;
* CTRL+=: Align left and right edges of selected nodes&lt;br /&gt;
* CTRL+up-arrow: Align tops of selected nodes&lt;br /&gt;
* CTRL+down-arrow: Align bottoms of selected nodes&lt;br /&gt;
&lt;br /&gt;
These shortcuts use two keystrokes in sequence -- not pressed together:&lt;br /&gt;
* =,right-arrow: Make selected nodes the same width as the first selected node &lt;br /&gt;
* =,down-arrow: Make selected nodes the same height as the first selected node&lt;br /&gt;
* =,=: Make selected nodes the same width and height as the first selected node&lt;br /&gt;
&lt;br /&gt;
=== Shortcuts for Table Navigation ===&lt;br /&gt;
&lt;br /&gt;
Analytica supports almost all the standard shortcuts for tables offered by Microsoft Excel. See [[Shortcuts for Table Navigation]] for details.&lt;br /&gt;
&lt;br /&gt;
=== Alphabetic list of CTRL shortcuts by letter ===&lt;br /&gt;
&lt;br /&gt;
* CTRL+A: Select All nodes in a diagram, text in a definition, or cells in a table.&lt;br /&gt;
* CTRL+B: Open [[Number Format Dialog]]&lt;br /&gt;
* CTRL+C: Copy selected node(s), text, cell or region of a table.&lt;br /&gt;
* CTRL+D: Duplicate selected node(s)&lt;br /&gt;
* CTRL+E: Edit definition of selected node in Attribute pane&lt;br /&gt;
* CTRL+F: Open [[Find Dialog]] to find an object by identifier or title. In a table, Find will search table.&lt;br /&gt;
* CTRL+G: Find next matching item from [[Find Dialog]].&lt;br /&gt;
* CTRL+H: Find object with identifier matching the text you have selected -- e.g. in a definition.&lt;br /&gt;
* CTRL+ALT+H: Add/Edit hyperlink&lt;br /&gt;
* CTRL+I: Insert a new row or column after the row or column you have selected in an Edit table.&lt;br /&gt;
* CTRL+J: In a Diagram, align selected node(s) to grid&lt;br /&gt;
* CTRL+K: {{Release||6.4|Kill (delete) the row or column you have selected in an Edit table.}}{{Release|6.5||Add/Edit hyperlink}}&lt;br /&gt;
* CTRL+L: Open dialog to Add Module...&lt;br /&gt;
* CTRL+M: Make an alias from the selected node(s).&lt;br /&gt;
* CTRL+ALT+M: Toggle show markup&lt;br /&gt;
* CTRL+N: Start a New Model&lt;br /&gt;
* CTRL+O: Open a model file&lt;br /&gt;
* CTRL+P: Print the current Diagram, Graph&lt;br /&gt;
* CTRL+Q: Exit (Quit) the model.&lt;br /&gt;
* CTRL+R: Show result for selected variable(s)&lt;br /&gt;
* CTRL+S: Save the model{{Release|1=7.1|2=|3=&lt;br /&gt;
* CTRL+ALT+D: [[Diagram Style dialog|Set diagram styles...]]&lt;br /&gt;
* CTRL+ALT+S: [[Node Style dialog|Set node styles...]]}}&lt;br /&gt;
* CTRL+T: Adjust selected node(s) to their default size&lt;br /&gt;
* CTRL+U: Open Uncertainty Options... dialog&lt;br /&gt;
* CTRL+V: Paste text, cell or region of a table, or selected nodes.&lt;br /&gt;
* CTRL+W: Close the model&lt;br /&gt;
* CTRL+X: Cut selected text or node(s).&lt;br /&gt;
* CTRL+Y: Toggle between viewing titles and identifiers &lt;br /&gt;
* CTRL+Z: Undo last action (typing text or moving or resizing node(s)&lt;br /&gt;
* CTRL+. (CTRL+dot): Stop the computation in progress.&lt;br /&gt;
* CTRL+Break: Stop the computation in progress.&lt;br /&gt;
* CTRL+' (CTRL+apostrophe): Open/close Typescript window.  On some non-English keyboards, this combination is not available.  In those cases, use F12.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
[[Shortcuts for Table Navigation]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Keyboard_Shortcuts&amp;diff=63906</id>
		<title>Keyboard Shortcuts</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Keyboard_Shortcuts&amp;diff=63906"/>
		<updated>2026-05-14T18:00:57Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: /* Alphabetic list of CTRL shortcuts by letter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Concepts]]&lt;br /&gt;
{{ReleaseBar}}&lt;br /&gt;
&lt;br /&gt;
Like most applications, Analytica offers keys or key combinations as shortcuts to access common features. Some, like ''ctrl+v'' to paste, or ''ctrl+s'' to '''s'''ave a model file, are common to most Windows applications.  Learning some of these can greatly speed up your interactions. &lt;br /&gt;
&lt;br /&gt;
You can see the keyboard shortcuts for Toolbar icon buttons in the tooltip that appears when you move the mouse cursor over each icon,  for menu options inside each menu at the top of the application, and for context-dependent menu that appears when you right-click. &lt;br /&gt;
&lt;br /&gt;
==Most valuable shortcuts==&lt;br /&gt;
&lt;br /&gt;
These are the most useful shortcuts to learn initially (beyond the standard shortcuts common to most Windows applications):&lt;br /&gt;
* ''CTRL+F'': Open the [[Find dialog]]&lt;br /&gt;
* ''CTRL+H'': Select a variable or function identifier in a definition, and press ''ctrl+H'' to open its Object view&lt;br /&gt;
* ''CTRL+R'': Select a node and see its result view&lt;br /&gt;
* ''CTR+B'': Open the [[Number Format Dialog]]&lt;br /&gt;
* ''CTR+U'': Open the [[Uncertainty Setup Dialog]]&lt;br /&gt;
* ''F8'': Change to Edit mode&lt;br /&gt;
* ''ctrl+click'': When the edit cursor is the a Definition in the Attribute panel at the bottom of a diagram, ''ctrl+click'' on another node to insert its identifier into the definition.&lt;br /&gt;
* Select several nodes in a Diagram and press:&lt;br /&gt;
** ''==''  resize the nodes to be the same as the last node you selected (the one with black boxes in the corners)&lt;br /&gt;
**''ctrl+='' align the nodes one above the other with same width&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Shortcuts for Toolbar buttons ==&lt;br /&gt;
&lt;br /&gt;
* F2: [[image:ParentTool.jpg]]: Open Diagram window containing the selected node.&lt;br /&gt;
* F3: [[image:OutlineTool.jpg]]: Open the Outliner window&lt;br /&gt;
* F4: [[image:ObjectWindowToolbarButton.jpg]]: Open the Object window for selected node.&lt;br /&gt;
* F5: [[image:ResultToolbarButton.jpg]]: Open the Result window for the selected variable. (same as CTRL+R)&lt;br /&gt;
* F6: [[image:Expr.jpg]]: Edit the definition (script for Button) of selected Variable or Function (same as CTRL+E) in Attribute Panel or Object window, depending on setting in Preferences... dialog.&lt;br /&gt;
* F7: [[image:browseTool.jpg]]: Enter browse mode &lt;br /&gt;
* F8: [[image:Edit_Mode_Toolbar_Button.jpg]]: Enter Edit mode&lt;br /&gt;
&lt;br /&gt;
== Shortcuts to add a nodes to a diagram ==&lt;br /&gt;
&lt;br /&gt;
* CTRL+1: New Decision node&lt;br /&gt;
* CTRL+2: New Variable node&lt;br /&gt;
* CTRL+3: New Chance node&lt;br /&gt;
* CTRL+4: New Objective node&lt;br /&gt;
* CTRL+5: New Module node &lt;br /&gt;
* CTRL+6: New Index node&lt;br /&gt;
* CTRL+7: New Constant node&lt;br /&gt;
* CTRL+8: New Function node&lt;br /&gt;
* CTRL+9: New Text node&lt;br /&gt;
* CTRL+0: New Button node&lt;br /&gt;
&lt;br /&gt;
== Tab as a shortcut ==&lt;br /&gt;
&lt;br /&gt;
Use the ''tab'' key to select the next element in a windowt: &lt;br /&gt;
* In a Diagram window, ''tab''  selects the next node from left to right, then up to down&lt;br /&gt;
* In an Object window,  ''tab'' selects the next Attribute field&lt;br /&gt;
* In a table,  ''tab'' selects the next cell.&lt;br /&gt;
&lt;br /&gt;
Use ''shift+tab'' to go backwards, to select the previous node, Attribute, or cell.&lt;br /&gt;
&lt;br /&gt;
=== Shortcuts for menus ===&lt;br /&gt;
&lt;br /&gt;
* F10: Select the main menu bar. &lt;br /&gt;
** Use left or right arrow or a letter to select a menu. &lt;br /&gt;
** Use up or down arrow or a letter to select an option in that menu.  &lt;br /&gt;
&lt;br /&gt;
* F12, or CTRL+': Open/close typescript window&lt;br /&gt;
&lt;br /&gt;
=== Shortcuts to edit a Definition or other attribute ===&lt;br /&gt;
&lt;br /&gt;
* Double-click an identifier to select it&lt;br /&gt;
* CTRL+f: Open [[find dialog]] for this identifier. A quick way to find the node for a variable, or open wiki page for a system function or variable.&lt;br /&gt;
* CTRL+click on a node:  When you are editing the Definition (or other attribute) in an Attribute panel, CTRL-click on another node in the same diagram inserts its identifier into the Definition. This shortcut is very handy when writing a complex expression.&lt;br /&gt;
* CTRL+alt on a node: Same as CTRL+click. Useful when running Analytica  on a Macintosh in VMWare Fusion or Parallels, which treat CTRL+click as something else. &lt;br /&gt;
* Return&lt;br /&gt;
* CTRL+Return&lt;br /&gt;
* CTRL+right-arrow: Move right one token (identifier or operator)&lt;br /&gt;
* CTRL+left-arrow: Move left one token (identifier or operator)&lt;br /&gt;
* CTRL+ALT+left-arrow: Find left paren that matches the right paren currently at the left of the caret.&lt;br /&gt;
* CTRL+ALT+right-arrow: Find right parent that matches the left parent currently to the right of the cursor.&lt;br /&gt;
* SHIFT+(any of the above): Select the characters between.&lt;br /&gt;
&lt;br /&gt;
=== Shortcuts to edit a diagram ===&lt;br /&gt;
&lt;br /&gt;
* Arrow: Move selected node(s) in direction of the arrow by a grid increment, if snap to grid is set -- otherwise, by one pixel.&lt;br /&gt;
* SHIFT+arrow: Move selected node(s) in direction of the arrow, by one pixel if snap to grid is set -- otherwise, by one grid increment. &lt;br /&gt;
* CTRL+left-arrow: Align left edges&lt;br /&gt;
* CTRL+F9: Align horiz center&lt;br /&gt;
* SHIFT+F9: Align vert centers of selected nodes&lt;br /&gt;
* CTRL+right-arrow: Align right edges&lt;br /&gt;
* CTRL+=: Align left and right edges of selected nodes&lt;br /&gt;
* CTRL+up-arrow: Align tops of selected nodes&lt;br /&gt;
* CTRL+down-arrow: Align bottoms of selected nodes&lt;br /&gt;
&lt;br /&gt;
These shortcuts use two keystrokes in sequence -- not pressed together:&lt;br /&gt;
* =,right-arrow: Make selected nodes the same width as the first selected node &lt;br /&gt;
* =,down-arrow: Make selected nodes the same height as the first selected node&lt;br /&gt;
* =,=: Make selected nodes the same width and height as the first selected node&lt;br /&gt;
&lt;br /&gt;
=== Shortcuts for Table Navigation ===&lt;br /&gt;
&lt;br /&gt;
Analytica supports almost all the standard shortcuts for tables offered by Microsoft Excel. See [[Shortcuts for Table Navigation]] for details.&lt;br /&gt;
&lt;br /&gt;
=== Alphabetic list of CTRL shortcuts by letter ===&lt;br /&gt;
&lt;br /&gt;
* CTRL+A: Select All nodes in a diagram, text in a definition, or cells in a table.&lt;br /&gt;
* CTRL+B: Open [[Number Format Dialog]]&lt;br /&gt;
* CTRL+C: Copy selected node(s), text, cell or region of a table.&lt;br /&gt;
* CTRL+D: Duplicate selected node(s)&lt;br /&gt;
* CTRL+E: Edit definition of selected node in Attribute pane&lt;br /&gt;
* CTRL+F: Open [[Find Dialog]] to find an object by identifier or title. In a table, Find will search table.&lt;br /&gt;
* CTRL+G: Find next matching item from [[Find Dialog]].&lt;br /&gt;
* CTRL+H: Find object with identifier matching the text you have selected -- e.g. in a definition.&lt;br /&gt;
* CTRL+ALT+H: Add/Edit hyperlink&lt;br /&gt;
* CTRL+I: Insert a new row or column after the row or column you have selected in an Edit table.&lt;br /&gt;
* CTRL+J: In a Diagram, align selected node(s) to grid&lt;br /&gt;
* CTRL+K: {{Release||6.4|Kill (delete) the row or column you have selected in an Edit table.}}{{Release|6.5||Add/Edit hyperlink}}&lt;br /&gt;
* CTRL+L: Open dialog to Add Module...&lt;br /&gt;
* CTRL+M: Make an alias from the selected node(s).&lt;br /&gt;
* CTRL+ALT+M: Toggle show markup&lt;br /&gt;
* CTRL+N: Start a New Model&lt;br /&gt;
* CTRL+O: Open a model file&lt;br /&gt;
* CTRL+P: Print the current Diagram, Graph&lt;br /&gt;
* CTRL+Q: Exit (Quit) the model.&lt;br /&gt;
* CTRL+R: Show result for selected variable(s)&lt;br /&gt;
* CTRL+S: Save the model{{Release|1=7.0|2=|&lt;br /&gt;
* CTRL+ALT+D: Set diagram styles...&lt;br /&gt;
* CTRL+ALT+S: Set node styles...}}&lt;br /&gt;
* CTRL+T: Adjust selected node(s) to their default size&lt;br /&gt;
* CTRL+U: Open Uncertainty Options... dialog&lt;br /&gt;
* CTRL+V: Paste text, cell or region of a table, or selected nodes.&lt;br /&gt;
* CTRL+W: Close the model&lt;br /&gt;
* CTRL+X: Cut selected text or node(s).&lt;br /&gt;
* CTRL+Y: Toggle between viewing titles and identifiers &lt;br /&gt;
* CTRL+Z: Undo last action (typing text or moving or resizing node(s)&lt;br /&gt;
* CTRL+. (CTRL+dot): Stop the computation in progress.&lt;br /&gt;
* CTRL+Break: Stop the computation in progress.&lt;br /&gt;
* CTRL+' (CTRL+apostrophe): Open/close Typescript window.  On some non-English keyboards, this combination is not available.  In those cases, use F12.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
[[Shortcuts for Table Navigation]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Att_ArrowWayPoints&amp;diff=63904</id>
		<title>Att ArrowWayPoints</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Att_ArrowWayPoints&amp;diff=63904"/>
		<updated>2026-05-12T23:40:11Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: Initial page for Att_ArrowWayPoints: format, angle convention, coordinate encoding, and examples.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Attributes]]&lt;br /&gt;
''New to [[Analytica 6.0]]''&lt;br /&gt;
&lt;br /&gt;
== Attribute Att_ArrowWayPoints ==&lt;br /&gt;
&lt;br /&gt;
This attribute is used in objects of class [[ArrowClass]] to encode the geometry of an arrow between two nodes on an [[influence diagram]]. It records the angles at which the arrow leaves the tail node and enters the head node, and the position of any intermediate way points the user has dragged onto the arrow to bend it.&lt;br /&gt;
&lt;br /&gt;
Most arrows on an influence diagram are ''implicit'' &amp;amp;mdash; they arise automatically from a dependency between variables and do not have an associated &amp;lt;code&amp;gt;ArrowClass&amp;lt;/code&amp;gt; object. An explicit &amp;lt;code&amp;gt;ArrowClass&amp;lt;/code&amp;gt; object (and therefore an &amp;lt;code&amp;gt;Att_ArrowWayPoints&amp;lt;/code&amp;gt; value) is created only when the user bends an arrow, restyles it, or makes it [[Att_ArrowProperties|sticky]]. The default value (a straight arrow with floating endpoints) is the absence of any waypoints.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
The value is an array of numbers. The first two elements are the start and end angles; the remaining elements are pairs giving the position of each intermediate way point:&lt;br /&gt;
&lt;br /&gt;
  [ startAngle, endAngle, dx&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, dy&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, dx&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, dy&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, &amp;amp;hellip;, dx&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;, dy&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt; ]&lt;br /&gt;
&lt;br /&gt;
; startAngle&lt;br /&gt;
: The angle in degrees at which the arrow leaves the center of the tail (source) node. &amp;lt;code&amp;gt;Null&amp;lt;/code&amp;gt; means the tail floats &amp;amp;mdash; the rendering code chooses an anchor on the node's perimeter automatically based on the next way point.&lt;br /&gt;
; endAngle&lt;br /&gt;
: The angle in degrees at which the arrow enters the center of the head (target) node. &amp;lt;code&amp;gt;Null&amp;lt;/code&amp;gt; means the head floats.&lt;br /&gt;
; dx&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;, dy&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&lt;br /&gt;
: The x and y coordinate of the i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt; intermediate way point, encoded as described in the next section. There are zero or more such pairs.&lt;br /&gt;
&lt;br /&gt;
The total number of array elements is therefore &amp;lt;code&amp;gt;2 + 2&amp;amp;times;N&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; is the number of intermediate way points (often 0, 1 or 2).&lt;br /&gt;
&lt;br /&gt;
=== Angle convention ===&lt;br /&gt;
&lt;br /&gt;
Angles are measured in degrees using the standard &amp;lt;code&amp;gt;atan2(&amp;amp;Delta;y, &amp;amp;Delta;x)&amp;lt;/code&amp;gt; convention with screen coordinates (the y-axis points ''downward''):&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;amp;deg;&amp;lt;/code&amp;gt; &amp;amp;mdash; arrow leaves to the right of the node center.&lt;br /&gt;
* &amp;lt;code&amp;gt;90&amp;amp;deg;&amp;lt;/code&amp;gt; &amp;amp;mdash; arrow leaves downward.&lt;br /&gt;
* &amp;lt;code&amp;gt;180&amp;amp;deg;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-180&amp;amp;deg;&amp;lt;/code&amp;gt; &amp;amp;mdash; arrow leaves to the left.&lt;br /&gt;
* &amp;lt;code&amp;gt;-90&amp;amp;deg;&amp;lt;/code&amp;gt; &amp;amp;mdash; arrow leaves upward.&lt;br /&gt;
&lt;br /&gt;
The start angle is computed from the tail's center to the first way point (or to the head if there are no intermediate way points); the end angle is computed from the head's center to the last way point (or to the tail).&lt;br /&gt;
&lt;br /&gt;
=== Way point coordinates ===&lt;br /&gt;
&lt;br /&gt;
Each intermediate way point's &amp;lt;code&amp;gt;dx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;dy&amp;lt;/code&amp;gt; uses a piecewise encoding so that points inside the bounding box of the two nodes are fractional and points outside the box are expressed in absolute pixels. Let &amp;lt;code&amp;gt;xmin = min(tail.X, head.X)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;xmax = max(tail.X, head.X)&amp;lt;/code&amp;gt; (with the analogous definitions on the y-axis). The stored value &amp;lt;code&amp;gt;dx&amp;lt;/code&amp;gt; is interpreted as:&lt;br /&gt;
&lt;br /&gt;
* If &amp;lt;code&amp;gt;0 &amp;amp;le; dx &amp;amp;le; 1&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;dx&amp;lt;/code&amp;gt; is the fractional horizontal distance from the tail center's x to the head center's x. So &amp;lt;code&amp;gt;dx=0&amp;lt;/code&amp;gt; is the tail's column, &amp;lt;code&amp;gt;dx=1&amp;lt;/code&amp;gt; is the head's column, and &amp;lt;code&amp;gt;dx=0.5&amp;lt;/code&amp;gt; is halfway between.&lt;br /&gt;
* If &amp;lt;code&amp;gt;dx &amp;amp;lt; 0&amp;lt;/code&amp;gt;: the way point is to the left of both nodes; &amp;lt;code&amp;gt;dx&amp;lt;/code&amp;gt; is the number of pixels to the left of &amp;lt;code&amp;gt;xmin&amp;lt;/code&amp;gt; (i.e. the actual x is &amp;lt;code&amp;gt;xmin + dx&amp;lt;/code&amp;gt;).&lt;br /&gt;
* If &amp;lt;code&amp;gt;dx &amp;amp;gt; 1&amp;lt;/code&amp;gt;: the way point is to the right of both nodes; &amp;lt;code&amp;gt;(dx - 1)&amp;lt;/code&amp;gt; is the number of pixels to the right of &amp;lt;code&amp;gt;xmax&amp;lt;/code&amp;gt; (i.e. the actual x is &amp;lt;code&amp;gt;xmax + (dx - 1)&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
The y coordinate follows the same convention along the vertical axis (with the screen y-axis pointing downward, so &amp;lt;code&amp;gt;dy=0&amp;lt;/code&amp;gt; is the tail's row and &amp;lt;code&amp;gt;dy=1&amp;lt;/code&amp;gt; is the head's row).&lt;br /&gt;
&lt;br /&gt;
This piecewise encoding allows the way points to be stored independently of node size and to track the nodes if they are moved, while still allowing arrows to bend out beyond the bounding box of the two endpoints when needed. It also avoids a singularity when &amp;lt;code&amp;gt;tail.X == head.X&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;tail.Y == head.Y&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
A typical bent arrow with two intermediate way points, both inside the bounding box of the tail and head, with both endpoints floating:&lt;br /&gt;
&lt;br /&gt;
  [Null, Null, 0.4642857142857143, 0, 0.4642857142857143, 1]&lt;br /&gt;
&lt;br /&gt;
Both way points sit at about 46% of the way from the tail's x to the head's x; the first way point is at the tail's y, and the second is at the head's y. The result is an S-shaped (or right-angle) bend that exits the tail vertically and enters the head vertically.&lt;br /&gt;
&lt;br /&gt;
An arrow with a single way point and explicit (anchored) start and end angles:&lt;br /&gt;
&lt;br /&gt;
  [18.69898327753452, -20.85445779090173, 113, 0.5]&lt;br /&gt;
&lt;br /&gt;
Here the arrow leaves the tail at roughly 18.7&amp;amp;deg; (slightly below horizontal, to the right), enters the head at roughly &amp;amp;minus;20.9&amp;amp;deg; (slightly above horizontal, from the right), and the single way point sits at &amp;lt;code&amp;gt;(xmax + 112, midway in y)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A straight arrow with no way points and both endpoints floating is simply:&lt;br /&gt;
&lt;br /&gt;
  [Null, Null]&lt;br /&gt;
&lt;br /&gt;
or equivalently no &amp;lt;code&amp;gt;Att_ArrowWayPoints&amp;lt;/code&amp;gt; attribute at all on the [[ArrowClass]] object.&lt;br /&gt;
&lt;br /&gt;
== Programmatic access ==&lt;br /&gt;
&lt;br /&gt;
The textual form above can be read with [[GetAttribute]] and written with [[SetAttribute]] (in [[ADE]]) or with the corresponding methods in the [[Suan]] / Assista APIs. From an Analytica expression the value can be read with &amp;lt;code&amp;gt;Att_ArrowWayPoints of &amp;lt;var&amp;gt;arrowObj&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt; and set with &amp;lt;code&amp;gt;Att_ArrowWayPoints of &amp;lt;var&amp;gt;arrowObj&amp;lt;/var&amp;gt; := [&amp;amp;hellip;]&amp;lt;/code&amp;gt;. The &amp;lt;code&amp;gt;ArrowClass&amp;lt;/code&amp;gt; object for a given pair of nodes can be located by scanning &amp;lt;code&amp;gt;OutgoingArrows of &amp;lt;var&amp;gt;tailNode&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt; for the entry whose &amp;lt;code&amp;gt;Att_HeadNode&amp;lt;/code&amp;gt; equals &amp;lt;var&amp;gt;headNode&amp;lt;/var&amp;gt;; if none exists, you can create one with [[CreateNewObject]]&amp;lt;code&amp;gt;(Arrow, &amp;lt;var&amp;gt;parentModule&amp;lt;/var&amp;gt;)&amp;lt;/code&amp;gt; and then set its &amp;lt;code&amp;gt;Att_TailNode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Att_HeadNode&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;Att_ArrowWayPoints&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* [[Att_ArrowProperties]]: Visual styling (thickness, dash style, end caps, etc.) of the same arrow.&lt;br /&gt;
* [[ArrowClass]]: The class of objects that hold per-arrow attributes.&lt;br /&gt;
* [[NodeColor]]: Encodes the color of the arrow.&lt;br /&gt;
* [[NodeInfo]]: Per-node display flags, including whether incoming / outgoing arrows are shown.&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Assista_-_Analytica_AI_Assistant/Custom_user_skills_for_Assista&amp;diff=63903</id>
		<title>Assista - Analytica AI Assistant/Custom user skills for Assista</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Assista_-_Analytica_AI_Assistant/Custom_user_skills_for_Assista&amp;diff=63903"/>
		<updated>2026-05-12T22:46:35Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: Created page with &amp;quot;''New to Analytica 7.1''  This page describes how to create your own custom skill for Assista, as a way to expand Assista's knowledge or capabilities.  == What is a skill?...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''New to [[Analytica 7.1]]''&lt;br /&gt;
&lt;br /&gt;
This page describes how to create your own custom skill for Assista, as a way to expand Assista's knowledge or capabilities.&lt;br /&gt;
&lt;br /&gt;
== What is a skill? ==&lt;br /&gt;
&lt;br /&gt;
== Anatomy of a skill ==&lt;br /&gt;
&lt;br /&gt;
== How to create a skill ==&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Assista_-_Analytica_AI_Assistant&amp;diff=63902</id>
		<title>Assista - Analytica AI Assistant</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Assista_-_Analytica_AI_Assistant&amp;diff=63902"/>
		<updated>2026-05-12T22:43:18Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: /* Other */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; ''New in [[Analytica 6.5]]''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[image:assistaLogo.png|alt=|frameless|449x449px]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Assista'' is the Analytica AI assistant -- a co-pilot that uses Artificial Intelligence to help you use Analytica and build models.  You interact with Assista via a chat window. It provides help using plain English (and other natural languages). It can see your model and what variable or module you are looking at. It can can perform some tasks in the Analytica UI and make changes or additions to your model. It can also explain Analytica functions and suggest links to Analytica docs.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--The current release is Analytica 6.4. [https://docs.analytica.com/index.php/What%27s_new_in_Analytica_6.5%3F Analytica 6.5] is currently in [[Beta Tester Page|Beta Testing]].  If have have an active subscription license, we invite you to download it now from the [[Beta Tester Page]]. Alternatively, you can try it using the Free edition with 6.5 beta.  --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here are a few examples of questions and requests it can handle:&lt;br /&gt;
* Describe this model  -- ''explains what this model does''&lt;br /&gt;
* How do you change the background color?&lt;br /&gt;
* Change the background to white  -- ''sometimes it can act on the model itself''&lt;br /&gt;
* Show a graph of overall company profits -- ''finds a relevant variable and displays its graph''&lt;br /&gt;
* How is revenue determined? -- ''explains the definition for this variable''&lt;br /&gt;
* Write and fill in its description  -- &amp;quot;it describes the calculation for the currently displayed variable''&lt;br /&gt;
* I don't like that description. I want the description to explain what the definition means -- ''it adds a more useful description''&lt;br /&gt;
* Write a function for Geometric Average-- ''Shows a function to do this, and asks if you want to  create the function in the current module''&lt;br /&gt;
* Yes -- ''Adds the function into your model, including its Description''&lt;br /&gt;
* How do I use the Aggregate function -- ''Describes it with links to Analytica docs pages''&lt;br /&gt;
&lt;br /&gt;
'''Demos:'''&lt;br /&gt;
* See [https://downloads.analytica.com/Videos/AI_Series/AAIA_alpha_demo.mp4 a short demo of Assista responding to these prompts]&lt;br /&gt;
* Watch a demo given at Risk Awareness Year 2024 (RAW2024), &amp;lt;!--[https://2024.riskawarenessweek.com/talks/building-risk-awareness-with-ai-assistants An AI assistant collaboration to develop risk management models]--&amp;gt;[https://youtu.be/H_-Fix4V2o4 An AI assistant collaboration to develop risk management models], 10-Oct-2024.&lt;br /&gt;
* Watch a presentation from SDP 2025, &amp;quot;[https://youtu.be/zxqrTWyUWPk Advancing model-driven decision making through AI assistance], 23-March-2025, Vancouver, BC.&lt;br /&gt;
&lt;br /&gt;
== Inaccuracies ==&lt;br /&gt;
&lt;br /&gt;
Like other AI systems, it makes mistakes and sometimes gives wrong information. Its command of Analytica syntax and functions is not perfect.  But if it leads you astray today, don't give up on it!  We continue to improve it -- in part based on your questions.  Over time, it will become more capable of helping you with all stages of model building and interpreting results.&lt;br /&gt;
&lt;br /&gt;
== Privacy (or lack of) ==&lt;br /&gt;
&lt;br /&gt;
When you use Assista, your questions and some model information are sent to Lumina's servers as well as to OpenAI's servers (also, we may on occasion include Anthropic's, Google's, Cerebras's or SambaNova's LLM servers). We use this information to see how well it's working to improve Assista. We at Lumina take privacy seriously. We will make our best effort to protect this information from any access or use other than to operate and improve Assista. &lt;br /&gt;
&lt;br /&gt;
If you don't use Assista, it sends no information, so you need not worry about this when simply using Analytica.&lt;br /&gt;
&lt;br /&gt;
== Scope ==&lt;br /&gt;
&lt;br /&gt;
What can Assista help you with? This section identifies some areas, but these do not fully cover its full scope.&lt;br /&gt;
&lt;br /&gt;
Please ask it for whatever help you need, even if it doesn't match stuff shown here! It may surprise you, but even if it fails, your questions may inform Assista's engineers about what types of capabilities would be useful to focus on.&lt;br /&gt;
&lt;br /&gt;
Assista relies heavily on the documentation attributes (Title, Description, Units) in your model, and on the arrows that you have drawn between variables (even if they aren't yet defined). Keep those populated both for your own benefit, but also to increase the quality of the assistance. You can even ask it to write those descriptions for you.&lt;br /&gt;
&lt;br /&gt;
=== Using Analytica's UI ===&lt;br /&gt;
&lt;br /&gt;
::''How do you ... in Analytica?''&lt;br /&gt;
&lt;br /&gt;
Ask it for the steps required to do something using the Analytica's UI. &lt;br /&gt;
&lt;br /&gt;
Inaccuracies in its steps sometimes occur. But improving this accuracy is our first area of focus.&lt;br /&gt;
&lt;br /&gt;
=== Navigating the Docs ===&lt;br /&gt;
&lt;br /&gt;
The Analytica Docs are extensive. Assista can help you find what you need, even if you don't know the name of a feature or function. It shows &amp;quot;see also&amp;quot; links to relevant Docs pages.&lt;br /&gt;
&lt;br /&gt;
Ask it for a list of functions of a specified type, for example. Or where you can find more information on something.&lt;br /&gt;
&lt;br /&gt;
This general area is our second focus priority. &lt;br /&gt;
&lt;br /&gt;
=== Actions on the model ===&lt;br /&gt;
&lt;br /&gt;
In addition to explaining how to do something in Analytica GUI, Assista can sometimes do it for you!  Some examples:&lt;br /&gt;
&lt;br /&gt;
* Open the graph of X     { or edit table, result table, object window, etc.)&lt;br /&gt;
* Change the color of X to blue&lt;br /&gt;
* Write this description&lt;br /&gt;
* Write this definition.&lt;br /&gt;
* Add a variable to calculate X.&lt;br /&gt;
* ... and more&lt;br /&gt;
&lt;br /&gt;
=== Explaining Analytica concepts ===&lt;br /&gt;
&lt;br /&gt;
Ask it to teach you more about Analytica concepts.&lt;br /&gt;
&lt;br /&gt;
=== Formulating a model ===&lt;br /&gt;
&lt;br /&gt;
Structuring your complex, messy, real world problem as an influence diagram and model that captures the essential elements is a challenging task for human model builders. This is also one of the most exciting use cases for this new technology, especially in a collaborative analyst-assistant partnership. Try experimenting with this. We have found it is often quite helpful -- and sometimes not. &lt;br /&gt;
&lt;br /&gt;
=== Interpreting results ===&lt;br /&gt;
&lt;br /&gt;
How do you interpret results, tables and graphs? How should you act based on the insights? &lt;br /&gt;
&lt;br /&gt;
For now, Assista can't help much.  One reason is that it doesn't yet look directly at the raw numbers or graph images in your results (or edit tables), even though it can see your graphing dimensions (axes, keys) and table pivots.&lt;br /&gt;
&lt;br /&gt;
=== Custom user skills ===&lt;br /&gt;
''New to [[Analytica 7.1]]''&lt;br /&gt;
&lt;br /&gt;
It is possible to configure your own [[Assista_-_Analytica_AI_Assistant/Custom user skills for Assista|custom user skills for Assista]] as a way to expand her abilities or knowledge.&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
This list of ideas is by no means complete. If you could use some help while using Analytica, just try asking, even if it doesn't fall into any of these categories. It may give a useful response -- or at least, you may inspire us to extend its capabilities in new directions.&lt;br /&gt;
&lt;br /&gt;
== How Assista works ==&lt;br /&gt;
&lt;br /&gt;
Assista includes a small local Analytica client library that contains the conversation window. This library sends your prompt, chat history, and information about the UI context (e.g., what you are currently looking at) to an Assista server running on the Lumina Cloud. When requested by the server, this local library gets stuff from your model, performs any actions issued by the server, and adds results to the chat window. All  A.I. logic runs on the server. The client library is loaded into memory when you first press the Assista toolbar button. It is unloaded when you close your model; your session starts over when you open a new model.&lt;br /&gt;
&lt;br /&gt;
The server processes the prompt and generates the response. It starts by using an LLM to analyze your prompt, to identify what skill sets it needs to respond, the information sources it may need to reference, and actions it may need to perform. It then uses specialized algorithms to customize the instructions to the LLM for the next step, using semantic search to find relevant references from the Analytica docs, from your model, or internal data sources. It then sends customized instructions and reference materials to an LLM (usually Open AI's GPT-4o) which generates a natural language response. If it detects a mistake in the response, it describes the problem and sends it back to the LLM with additional reference materials to give it a second chance. It reformats the final response, adding hyperlinks, section headings, or code blocks, and so on, and shows it to the user at the end the conversation window.&lt;br /&gt;
&lt;br /&gt;
Lumina is actively developing and refining this process, so the process and performance will  change over time.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [https://downloads.analytica.com/Videos/AI_Series/AAIA_alpha_demo.mp4 A 7 minute (unpolished) demo video]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Assista_-_Analytica_AI_Assistant&amp;diff=63901</id>
		<title>Assista - Analytica AI Assistant</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Assista_-_Analytica_AI_Assistant&amp;diff=63901"/>
		<updated>2026-05-12T22:39:04Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: /* Privacy (or lack of) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; ''New in [[Analytica 6.5]]''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[image:assistaLogo.png|alt=|frameless|449x449px]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Assista'' is the Analytica AI assistant -- a co-pilot that uses Artificial Intelligence to help you use Analytica and build models.  You interact with Assista via a chat window. It provides help using plain English (and other natural languages). It can see your model and what variable or module you are looking at. It can can perform some tasks in the Analytica UI and make changes or additions to your model. It can also explain Analytica functions and suggest links to Analytica docs.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--The current release is Analytica 6.4. [https://docs.analytica.com/index.php/What%27s_new_in_Analytica_6.5%3F Analytica 6.5] is currently in [[Beta Tester Page|Beta Testing]].  If have have an active subscription license, we invite you to download it now from the [[Beta Tester Page]]. Alternatively, you can try it using the Free edition with 6.5 beta.  --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here are a few examples of questions and requests it can handle:&lt;br /&gt;
* Describe this model  -- ''explains what this model does''&lt;br /&gt;
* How do you change the background color?&lt;br /&gt;
* Change the background to white  -- ''sometimes it can act on the model itself''&lt;br /&gt;
* Show a graph of overall company profits -- ''finds a relevant variable and displays its graph''&lt;br /&gt;
* How is revenue determined? -- ''explains the definition for this variable''&lt;br /&gt;
* Write and fill in its description  -- &amp;quot;it describes the calculation for the currently displayed variable''&lt;br /&gt;
* I don't like that description. I want the description to explain what the definition means -- ''it adds a more useful description''&lt;br /&gt;
* Write a function for Geometric Average-- ''Shows a function to do this, and asks if you want to  create the function in the current module''&lt;br /&gt;
* Yes -- ''Adds the function into your model, including its Description''&lt;br /&gt;
* How do I use the Aggregate function -- ''Describes it with links to Analytica docs pages''&lt;br /&gt;
&lt;br /&gt;
'''Demos:'''&lt;br /&gt;
* See [https://downloads.analytica.com/Videos/AI_Series/AAIA_alpha_demo.mp4 a short demo of Assista responding to these prompts]&lt;br /&gt;
* Watch a demo given at Risk Awareness Year 2024 (RAW2024), &amp;lt;!--[https://2024.riskawarenessweek.com/talks/building-risk-awareness-with-ai-assistants An AI assistant collaboration to develop risk management models]--&amp;gt;[https://youtu.be/H_-Fix4V2o4 An AI assistant collaboration to develop risk management models], 10-Oct-2024.&lt;br /&gt;
* Watch a presentation from SDP 2025, &amp;quot;[https://youtu.be/zxqrTWyUWPk Advancing model-driven decision making through AI assistance], 23-March-2025, Vancouver, BC.&lt;br /&gt;
&lt;br /&gt;
== Inaccuracies ==&lt;br /&gt;
&lt;br /&gt;
Like other AI systems, it makes mistakes and sometimes gives wrong information. Its command of Analytica syntax and functions is not perfect.  But if it leads you astray today, don't give up on it!  We continue to improve it -- in part based on your questions.  Over time, it will become more capable of helping you with all stages of model building and interpreting results.&lt;br /&gt;
&lt;br /&gt;
== Privacy (or lack of) ==&lt;br /&gt;
&lt;br /&gt;
When you use Assista, your questions and some model information are sent to Lumina's servers as well as to OpenAI's servers (also, we may on occasion include Anthropic's, Google's, Cerebras's or SambaNova's LLM servers). We use this information to see how well it's working to improve Assista. We at Lumina take privacy seriously. We will make our best effort to protect this information from any access or use other than to operate and improve Assista. &lt;br /&gt;
&lt;br /&gt;
If you don't use Assista, it sends no information, so you need not worry about this when simply using Analytica.&lt;br /&gt;
&lt;br /&gt;
== Scope ==&lt;br /&gt;
&lt;br /&gt;
What can Assista help you with? This section identifies some areas, but these do not fully cover its full scope.&lt;br /&gt;
&lt;br /&gt;
Please ask it for whatever help you need, even if it doesn't match stuff shown here! It may surprise you, but even if it fails, your questions may inform Assista's engineers about what types of capabilities would be useful to focus on.&lt;br /&gt;
&lt;br /&gt;
Assista relies heavily on the documentation attributes (Title, Description, Units) in your model, and on the arrows that you have drawn between variables (even if they aren't yet defined). Keep those populated both for your own benefit, but also to increase the quality of the assistance. You can even ask it to write those descriptions for you.&lt;br /&gt;
&lt;br /&gt;
=== Using Analytica's UI ===&lt;br /&gt;
&lt;br /&gt;
::''How do you ... in Analytica?''&lt;br /&gt;
&lt;br /&gt;
Ask it for the steps required to do something using the Analytica's UI. &lt;br /&gt;
&lt;br /&gt;
Inaccuracies in its steps sometimes occur. But improving this accuracy is our first area of focus.&lt;br /&gt;
&lt;br /&gt;
=== Navigating the Docs ===&lt;br /&gt;
&lt;br /&gt;
The Analytica Docs are extensive. Assista can help you find what you need, even if you don't know the name of a feature or function. It shows &amp;quot;see also&amp;quot; links to relevant Docs pages.&lt;br /&gt;
&lt;br /&gt;
Ask it for a list of functions of a specified type, for example. Or where you can find more information on something.&lt;br /&gt;
&lt;br /&gt;
This general area is our second focus priority. &lt;br /&gt;
&lt;br /&gt;
=== Actions on the model ===&lt;br /&gt;
&lt;br /&gt;
In addition to explaining how to do something in Analytica GUI, Assista can sometimes do it for you!  Some examples:&lt;br /&gt;
&lt;br /&gt;
* Open the graph of X     { or edit table, result table, object window, etc.)&lt;br /&gt;
* Change the color of X to blue&lt;br /&gt;
* Write this description&lt;br /&gt;
* Write this definition.&lt;br /&gt;
* Add a variable to calculate X.&lt;br /&gt;
* ... and more&lt;br /&gt;
&lt;br /&gt;
=== Explaining Analytica concepts ===&lt;br /&gt;
&lt;br /&gt;
Ask it to teach you more about Analytica concepts.&lt;br /&gt;
&lt;br /&gt;
=== Formulating a model ===&lt;br /&gt;
&lt;br /&gt;
Structuring your complex, messy, real world problem as an influence diagram and model that captures the essential elements is a challenging task for human model builders. This is also one of the most exciting use cases for this new technology, especially in a collaborative analyst-assistant partnership. Try experimenting with this. We have found it is often quite helpful -- and sometimes not. &lt;br /&gt;
&lt;br /&gt;
=== Interpreting results ===&lt;br /&gt;
&lt;br /&gt;
How do you interpret results, tables and graphs? How should you act based on the insights? &lt;br /&gt;
&lt;br /&gt;
For now, Assista can't help much.  One reason is that it doesn't yet look directly at the raw numbers or graph images in your results (or edit tables), even though it can see your graphing dimensions (axes, keys) and table pivots.&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
This list of ideas is by no means complete. If you could use some help while using Analytica, just try asking, even if it doesn't fall into any of these categories. It may give a useful response -- or at least, you may inspire us to extend its capabilities in new directions.&lt;br /&gt;
&lt;br /&gt;
== How Assista works ==&lt;br /&gt;
&lt;br /&gt;
Assista includes a small local Analytica client library that contains the conversation window. This library sends your prompt, chat history, and information about the UI context (e.g., what you are currently looking at) to an Assista server running on the Lumina Cloud. When requested by the server, this local library gets stuff from your model, performs any actions issued by the server, and adds results to the chat window. All  A.I. logic runs on the server. The client library is loaded into memory when you first press the Assista toolbar button. It is unloaded when you close your model; your session starts over when you open a new model.&lt;br /&gt;
&lt;br /&gt;
The server processes the prompt and generates the response. It starts by using an LLM to analyze your prompt, to identify what skill sets it needs to respond, the information sources it may need to reference, and actions it may need to perform. It then uses specialized algorithms to customize the instructions to the LLM for the next step, using semantic search to find relevant references from the Analytica docs, from your model, or internal data sources. It then sends customized instructions and reference materials to an LLM (usually Open AI's GPT-4o) which generates a natural language response. If it detects a mistake in the response, it describes the problem and sends it back to the LLM with additional reference materials to give it a second chance. It reformats the final response, adding hyperlinks, section headings, or code blocks, and so on, and shows it to the user at the end the conversation window.&lt;br /&gt;
&lt;br /&gt;
Lumina is actively developing and refining this process, so the process and performance will  change over time.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [https://downloads.analytica.com/Videos/AI_Series/AAIA_alpha_demo.mp4 A 7 minute (unpolished) demo video]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.1%3F&amp;diff=63900</id>
		<title>What's new in Analytica 7.1?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.1%3F&amp;diff=63900"/>
		<updated>2026-05-12T22:36:57Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: /* Assista */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Analytica 7.1 is currently under development, and will be the next future release of Analytica. The current official release is [[Analytica 7.0]]. This page is under construction, and will list enhancements that are new to Analytica or ADE 7.1.&lt;br /&gt;
&lt;br /&gt;
== Window appearance ==&lt;br /&gt;
The appearance of the chrome around child MDI windows (aka the &amp;quot;non-client area&amp;quot;) has been changed to more closely match the Windows 11 style of windows -- i.e., thin (1 pixel) borders, rounded corners at the top, white title bar, very plain (text-like) button images in the toolbar.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
[[Assista]] is Analytica's A.I. assistant. She is greatly improved in this release.&lt;br /&gt;
* Her UI is now a top-level window that resides at the same level as Analytica's main application window.&lt;br /&gt;
** You can move her chat window to a non-overlapping location or even a different monitor (to maximize screen real estate used by your Analytica window).&lt;br /&gt;
** Selected objects remain visually selected in the main window when you type into Assista.&lt;br /&gt;
* Her chat has a different look-and-feel.&lt;br /&gt;
* Her chat window is faster and more responsive&lt;br /&gt;
* You can drag-highlight any text in her chat and copy to paste elsewhere.&lt;br /&gt;
* The UI has improved formatting capabilities for displaying Assista's response.&lt;br /&gt;
* Her &amp;quot;thoughts&amp;quot; display as she is processing your prompt, making it clear she is working and even giving you a peek into how she is solving it.&lt;br /&gt;
* She has a new processing pipeline on the backend, enabling her to respond faster but also work longer on harder tasks. &lt;br /&gt;
* She has an extended set of competencies (skills).&lt;br /&gt;
* You can create and expose your own custom skills to expand her capabilities.&lt;br /&gt;
&lt;br /&gt;
== CSV files ==&lt;br /&gt;
There are now a few additional ways to open CSV files in Analytica:&lt;br /&gt;
* On the command line: &amp;lt;code&amp;gt;Analytica.exe MyData.csv&amp;lt;/code&amp;gt;&lt;br /&gt;
* Drag and drop a *.csv file onto the diagram (which behaves the same as using &amp;lt;code&amp;gt;File / Import...&amp;lt;/code&amp;gt; on the *.csv file). &lt;br /&gt;
&lt;br /&gt;
== Spreadsheets ==&lt;br /&gt;
* &amp;lt;code&amp;gt;[[SpreadsheetOpen]](&amp;quot;new&amp;quot;)&amp;lt;/code&amp;gt; now creates a blank spreadsheet in memory. Works with both the Excel and LibXl backends.&lt;br /&gt;
* Prefacing a sheet name with + in the call to [[SpreadsheetSetCell]] or [[SpreadsheetSetRange]] will add a new sheet by that name to the workbook (as it applies the specified change to that new worksheet). Works with either backend.&lt;br /&gt;
* You can also now remove a sheet from a workbook using: &amp;lt;code&amp;gt;[[SpreadsheetSetCell]](wb, &amp;quot;-OldSheet&amp;quot;, col, row, Null)&amp;lt;/code&amp;gt;. The «col» and «row» parameters are required but ignored in this case.&lt;br /&gt;
&lt;br /&gt;
== Built-in functions ==&lt;br /&gt;
* New options for [[GetProcessInfo]]: &amp;lt;code&amp;gt;&amp;quot;Number of monitors&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Current monitor rect&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Current monitor work rect&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Monitor «N» Rect&amp;quot;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;&amp;quot;Monitor «N» work rect&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* New optional parameter, «throwParsingErrors», to [[Evaluate]].&lt;br /&gt;
* [[ReadFromURL]] is a bit smarter about returning binary content (like &amp;lt;code&amp;gt;*.zip&amp;lt;/code&amp;gt; files) as a [[In-memory binary data terms|Binary Data Term]].&lt;br /&gt;
&lt;br /&gt;
== System variables ==&lt;br /&gt;
* SysVar [[Graph_ColorSequence]]: Replaces [[Graph_ColorSeq]] which is now deprecated. The new sysvar contains a list of color interer with one integer (of the form &amp;lt;code&amp;gt;0x00rrggbb&amp;lt;/code&amp;gt;) per color (whereas the deprecated used triples of numbers per color).&lt;br /&gt;
&lt;br /&gt;
== Model loading ==&lt;br /&gt;
When opening a model file, the &amp;quot;checking&amp;quot; stage (when attributes are parsed) parses different expressions on different threads, resulting in substantially faster model load times for very large models.&lt;br /&gt;
&lt;br /&gt;
Note: In the event that this creates a problem with your specific model (maybe due to an as-yet-undiscovered multithreading bug), you can disable it for your model as follows:&lt;br /&gt;
# Temporarily turn off multithreading (Skip this step if you are able to load your model)&lt;br /&gt;
## New model&lt;br /&gt;
## &amp;lt;b&amp;gt;Definition menu / System variables / Settings / Maximum evaluation threads&amp;lt;/b&amp;gt;&lt;br /&gt;
## Set to 1  (and remember the previous value)&lt;br /&gt;
# Open your model&lt;br /&gt;
# &amp;lt;b&amp;gt;Definition menu / System variables / Settings / Disable Multithreaded Evaluations&amp;lt;/b&amp;gt;&lt;br /&gt;
# Press the &amp;lt;code&amp;gt;Edit Table&amp;lt;/code&amp;gt; button.&lt;br /&gt;
# Check the checkbox for &amp;lt;code&amp;gt;Parsing&amp;lt;/code&amp;gt;&lt;br /&gt;
# Save your model&lt;br /&gt;
# &amp;lt;b&amp;gt;Definition menu / System variables / Settings / Maximum evaluation threads&amp;lt;/b&amp;gt;&lt;br /&gt;
#: Restore the original value from Step 1&lt;br /&gt;
&lt;br /&gt;
== MCP server ==&lt;br /&gt;
* Added an ability to install multiple ADE-based Mcp servers that run different ADE releases. For example, you can install two MCP servers into Claude Code:&lt;br /&gt;
* ade-server: Runs ADE 7.1&lt;br /&gt;
* ade-server-70: Runs ADE 7.0&lt;br /&gt;
The information in the &amp;lt;code&amp;gt;«ADE install folder»\Examples\Mcp_server\README.txt&amp;lt;/code&amp;gt; file explain how (with enough info for Claude code to configure this for you).  &lt;br /&gt;
&lt;br /&gt;
With both installed, Claude Code (or other MCP-enabled AI agents) can compare results for the same model across different releases, etc.&lt;br /&gt;
&lt;br /&gt;
Side note: The Mcp server was added to ADE 7.0.&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
This release has undergone massive internal restructuring and refactorization. Ideally (i.e., in the absence of bugs) these changes won't change functionality, but may alter some aspects of behavior, hopefully for the better.&lt;br /&gt;
* Internal data structures use for multi-dimensional arrays has been changed. Possible impacts:&lt;br /&gt;
** Likely to remove the sensitivity to the &amp;quot;canonical order&amp;quot; of indexes on evaluation speed.&lt;br /&gt;
** May change relative evaluation speeds of various functions and operations.&lt;br /&gt;
&lt;br /&gt;
== Discontinued... ==&lt;br /&gt;
* Plug-in functions. (An old hook that allows you to extend Analytica with compiled functions and UI elements written it C++. We are almost certain no one is using these hooks any more.)&lt;br /&gt;
* The sysvar [[Graph_ColorSeq]] is now deprecated (but works for both reading and setting to preserve backward compatibility). It has been replaced by the system variable [[Graph_ColorSequence]].&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Analytica_Command_Line&amp;diff=63899</id>
		<title>Analytica Command Line</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Analytica_Command_Line&amp;diff=63899"/>
		<updated>2026-05-07T16:02:58Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:File Commands]]&lt;br /&gt;
[[Category:Analytica User Guide]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The desktop Analytica.exe process is launched with a command line having the format:&lt;br /&gt;
&lt;br /&gt;
 Analytica.exe [options] [filename]&lt;br /&gt;
&lt;br /&gt;
The brackets mean that these are optional. When ''filename'' has one or more spaces, you need to put double quotes around the filename. Or, you can put double quotes around the ''filename'' even if it doesn't have spaces.  The ''filename'' will usually have the extension *.ana.  When no filename is specified, Analytica launches to the intro screen.  When a filename is specified, it loads that model file.&lt;br /&gt;
&lt;br /&gt;
== Options ==&lt;br /&gt;
&lt;br /&gt;
Each option can be prefixed either with a forward slash, &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, or with a minus, &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;. Option values appear after a colon. There can be no spaces within the option or its value. When an option value contains a space, the option value must be quoted using double quotes. &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/rlmDiag:''filename''&amp;lt;/code&amp;gt;: Writes diagnostic information about licenses to ''filename''. This is very useful if you are encountering problems with a license that you believe has been activated, but is not working.  After launching Analytica with this option, exit Analytica and either review the log file in a text editor, or email the diagnostic file to support@lumina.com for assistance. The diagnostic file logs the information about licenses that it finds on your computer, and hence is very useful for debugging license problems. &lt;br /&gt;
*: Example usage: &amp;lt;code&amp;gt;Analytica.exe /rlmDiag:&amp;quot;c:\Temp\rlmDiag.log&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/roam:''days''&amp;lt;/code&amp;gt;: Specifies the number of days to roam a floating license.  Or, if ''days'' is -1, it releases a roamed license. See [[License Roaming]].&lt;br /&gt;
*: Example usage: &amp;lt;code&amp;gt;Analytica.exe /roam:7&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/lic:''licenseName''&amp;lt;/code&amp;gt;: Uses the specified license name without changing which license is selected by default. The license must already be activated (i.e., the license must be in your &amp;lt;code&amp;gt;C:\ProgramData\Lumina\Licenses&amp;lt;/code&amp;gt; folder).&lt;br /&gt;
*:Example: &amp;lt;code&amp;gt;Analytica.exe /lic:analytica_optimizer_761_2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/rlm:''server''&amp;lt;/code&amp;gt;: Specifies the server name (or port@serverName) that is running a Reprise License Manager with the desired centrally managed (e.g., floating) license.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/eval:''expression''&amp;lt;/code&amp;gt;: (new to [[Analytica 6.0]]). Specifies an Analytica expression that is evaluated immediately after the model file that is specified on the command line finishes loading. The evaluating occurs after any proactively evaluated variables or buttons in the model. It does not dirty the model. The expression can include global variable assignments, and button identifiers. You will almost certainly want to include double quotes around the expression, and you need to escape any interior quotes by proceeding the quote with a backslash. The parameter is ignored if ''filename'' is not specified on the command line.  See [[Running a model in a command line workflow]].&lt;br /&gt;
&lt;br /&gt;
*: Example usage: &amp;lt;code&amp;gt;Analytica.exe /eval:&amp;quot;Claimant=\&amp;quot;JDoe\&amp;quot;;Run_Batch;Exit&amp;quot; &amp;quot;Claim analysis.ana&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
*: In this example, &amp;lt;code&amp;gt;Claimant&amp;lt;/code&amp;gt; is the identifier of an input variable in the model and &amp;lt;code&amp;gt;Run_batch&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Exit&amp;lt;/code&amp;gt; are names of a buttons in the model.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/comment:''text''&amp;lt;/code&amp;gt;: (new to [[Analytica 6.0]]) The ''text'' is a comment that is ignored by Analytica. In one example usage, ACP3 adds a comment to each spawned processes to differentiate them in task manager.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/NoSplash&amp;lt;/code&amp;gt;: (new to [[Analytica 6.0]]) Don't show the splash screen at startup (which normally displays for 3 seconds). &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/mcp:«port»&amp;lt;/code&amp;gt;: (new to [[Analytica 7.0]]) Enable Analytica as [[MCP server in Analytica|an MCP server]] (a protocol that allows A.I. language models to call functions in your model). [[UDF]]s that contain &amp;lt;code&amp;gt;@mcpTool&amp;lt;/code&amp;gt; in their description are exposed as functions that the external A.I. client can call.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/lang:«code»&amp;lt;/code&amp;gt; (new to [[Analytica 7.1]]) Specifies the User Interface language for Analytica (for menus, dialogs, error messages, built-in function descriptions, etc.). «code» is a language code such as &amp;lt;code&amp;gt;'en'&amp;lt;/code&amp;gt; (for English), &amp;lt;code&amp;gt;'es'&amp;lt;/code&amp;gt; (for Spanish), etc. The language is only used when the resource files exist for that language in &lt;br /&gt;
*:&amp;lt;code&amp;gt;«Analytica install folder»\Resources\«code»\&amp;lt;/code&amp;gt;&lt;br /&gt;
*: The command line overrides the registry setting &amp;lt;code&amp;gt;Language&amp;lt;/code&amp;gt; (if present) in the hive&lt;br /&gt;
*:&amp;lt;code&amp;gt;HKCU\Software\Lumina Decision Systems\Analytica&amp;lt;/code&amp;gt;&lt;br /&gt;
*:As of [[Analytica 7.1]], non-English UI options is an experimental feature and not complete. &lt;br /&gt;
&lt;br /&gt;
The remaining options exist for internal purposes and aren't generally used by end-users:&lt;br /&gt;
* &amp;lt;code&amp;gt;/embedding&amp;lt;/code&amp;gt;: The Windows operating system uses this parameter when launching Analytica as a OLE-link server. Not used by end-users. Causes Analytica to launch quietly (without a GUI), load an indicated model, and exposes key OLE interfaces to Windows enabling an external application to complete the link to the model's data.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/solverDevLic&amp;lt;/code&amp;gt;: This parameter is sometimes used by Analytica developers, but not generally by end-users. It indicates that the licenses from [https://solver.com Frontline Systems] found in the &amp;lt;code&amp;gt;Solver.lic&amp;lt;/code&amp;gt; file are developer licenses rather than runtime licenses. &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/forcerelease&amp;lt;/code&amp;gt;: This parameter is used by Analytica quality assurance engineers during beta testing periods. It causes a beta release to behave like a final release build with regard to licensing.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;/config:''filename''&amp;lt;/code&amp;gt;: This is an option used by ACP3 (by Suan.exe) and not in Desktop Analytica.  The specified config file contains settings that define the ACP3 server configuration.&lt;br /&gt;
&lt;br /&gt;
== Accessing the Command line from a model ==&lt;br /&gt;
&lt;br /&gt;
The expression &amp;lt;code&amp;gt;[[GetProcessInfo]]('Command line')&amp;lt;/code&amp;gt; returns the command line used to launch the process.&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Analytica_Command_Line&amp;diff=63898</id>
		<title>Analytica Command Line</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Analytica_Command_Line&amp;diff=63898"/>
		<updated>2026-05-07T16:02:04Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:File Commands]]&lt;br /&gt;
[[Category:Analytica User Guide]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The desktop Analytica.exe process is launched with a command line having the format:&lt;br /&gt;
&lt;br /&gt;
 Analytica.exe [options] [filename]&lt;br /&gt;
&lt;br /&gt;
The brackets mean that these are optional. When ''filename'' has one or more spaces, you need to put double quotes around the filename. Or, you can put double quotes around the ''filename'' even if it doesn't have spaces.  The ''filename'' will usually have the extension *.ana.  When no filename is specified, Analytica launches to the intro screen.  When a filename is specified, it loads that model file.&lt;br /&gt;
&lt;br /&gt;
== Options ==&lt;br /&gt;
&lt;br /&gt;
Each option can be prefixed either with a forward slash, &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, or with a minus, &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;. Option values appear after a colon. There can be no spaces within the option or its value. When an option value contains a space, the option value must be quoted using double quotes. &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/rlmDiag:''filename''&amp;lt;/code&amp;gt;: Writes diagnostic information about licenses to ''filename''. This is very useful if you are encountering problems with a license that you believe has been activated, but is not working.  After launching Analytica with this option, exit Analytica and either review the log file in a text editor, or email the diagnostic file to support@lumina.com for assistance. The diagnostic file logs the information about licenses that it finds on your computer, and hence is very useful for debugging license problems. &lt;br /&gt;
*: Example usage: &amp;lt;code&amp;gt;Analytica.exe /rlmDiag:&amp;quot;c:\Temp\rlmDiag.log&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/roam:''days''&amp;lt;/code&amp;gt;: Specifies the number of days to roam a floating license.  Or, if ''days'' is -1, it releases a roamed license. See [[License Roaming]].&lt;br /&gt;
*: Example usage: &amp;lt;code&amp;gt;Analytica.exe /roam:7&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/lic:''licenseName''&amp;lt;/code&amp;gt;: Uses the specified license name without changing which license is selected by default. The license must already be activated (i.e., the license must be in your &amp;lt;code&amp;gt;C:\ProgramData\Lumina\Licenses&amp;lt;/code&amp;gt; folder).&lt;br /&gt;
*:Example: &amp;lt;code&amp;gt;Analytica.exe /lic:analytica_optimizer_761_2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/rlm:''server''&amp;lt;/code&amp;gt;: Specifies the server name (or port@serverName) that is running a Reprise License Manager with the desired centrally managed (e.g., floating) license.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/eval:''expression''&amp;lt;/code&amp;gt;: (new to [[Analytica 6.0]]). Specifies an Analytica expression that is evaluated immediately after the model file that is specified on the command line finishes loading. The evaluating occurs after any proactively evaluated variables or buttons in the model. It does not dirty the model. The expression can include global variable assignments, and button identifiers. You will almost certainly want to include double quotes around the expression, and you need to escape any interior quotes by proceeding the quote with a backslash. The parameter is ignored if ''filename'' is not specified on the command line.  See [[Running a model in a command line workflow]].&lt;br /&gt;
&lt;br /&gt;
*: Example usage: &amp;lt;code&amp;gt;Analytica.exe /eval:&amp;quot;Claimant=\&amp;quot;JDoe\&amp;quot;;Run_Batch;Exit&amp;quot; &amp;quot;Claim analysis.ana&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
*: In this example, &amp;lt;code&amp;gt;Claimant&amp;lt;/code&amp;gt; is the identifier of an input variable in the model and &amp;lt;code&amp;gt;Run_batch&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Exit&amp;lt;/code&amp;gt; are names of a buttons in the model.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/comment:''text''&amp;lt;/code&amp;gt;: (new to [[Analytica 6.0]]) The ''text'' is a comment that is ignored by Analytica. In one example usage, ACP3 adds a comment to each spawned processes to differentiate them in task manager.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/NoSplash&amp;lt;/code&amp;gt;: (new to [[Analytica 6.0]]) Don't show the splash screen at startup (which normally displays for 3 seconds). &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/mcp:«port»&amp;lt;/code&amp;gt;: (new to [[Analytica 7.0]]) Enable Analytica as an MCP server (a protocol that allows A.I. language models to call functions in your model). [[UDF]]s that contain &amp;lt;code&amp;gt;@mcpTool&amp;lt;/code&amp;gt; in their description are exposed as functions that the external A.I. client can call.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/lang:«code»&amp;lt;/code&amp;gt; (new to [[Analytica 7.1]]) Specifies the User Interface language for Analytica (for menus, dialogs, error messages, built-in function descriptions, etc.). «code» is a language code such as &amp;lt;code&amp;gt;'en'&amp;lt;/code&amp;gt; (for English), &amp;lt;code&amp;gt;'es'&amp;lt;/code&amp;gt; (for Spanish), etc. The language is only used when the resource files exist for that language in &lt;br /&gt;
*:&amp;lt;code&amp;gt;«Analytica install folder»\Resources\«code»\&amp;lt;/code&amp;gt;&lt;br /&gt;
*: The command line overrides the registry setting &amp;lt;code&amp;gt;Language&amp;lt;/code&amp;gt; (if present) in the hive&lt;br /&gt;
*:&amp;lt;code&amp;gt;HKCU\Software\Lumina Decision Systems\Analytica&amp;lt;/code&amp;gt;&lt;br /&gt;
*:As of [[Analytica 7.1]], non-English UI options is an experimental feature and not complete. &lt;br /&gt;
&lt;br /&gt;
The remaining options exist for internal purposes and aren't generally used by end-users:&lt;br /&gt;
* &amp;lt;code&amp;gt;/embedding&amp;lt;/code&amp;gt;: The Windows operating system uses this parameter when launching Analytica as a OLE-link server. Not used by end-users. Causes Analytica to launch quietly (without a GUI), load an indicated model, and exposes key OLE interfaces to Windows enabling an external application to complete the link to the model's data.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/solverDevLic&amp;lt;/code&amp;gt;: This parameter is sometimes used by Analytica developers, but not generally by end-users. It indicates that the licenses from [https://solver.com Frontline Systems] found in the &amp;lt;code&amp;gt;Solver.lic&amp;lt;/code&amp;gt; file are developer licenses rather than runtime licenses. &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/forcerelease&amp;lt;/code&amp;gt;: This parameter is used by Analytica quality assurance engineers during beta testing periods. It causes a beta release to behave like a final release build with regard to licensing.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;/config:''filename''&amp;lt;/code&amp;gt;: This is an option used by ACP3 (by Suan.exe) and not in Desktop Analytica.  The specified config file contains settings that define the ACP3 server configuration.&lt;br /&gt;
&lt;br /&gt;
== Accessing the Command line from a model ==&lt;br /&gt;
&lt;br /&gt;
The expression &amp;lt;code&amp;gt;[[GetProcessInfo]]('Command line')&amp;lt;/code&amp;gt; returns the command line used to launch the process.&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Analytica_Command_Line&amp;diff=63897</id>
		<title>Analytica Command Line</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Analytica_Command_Line&amp;diff=63897"/>
		<updated>2026-05-07T16:01:49Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:File Commands]]&lt;br /&gt;
[[Category:Analytica User Guide]]&lt;br /&gt;
&lt;br /&gt;
{{ReleaseBar}}&lt;br /&gt;
The desktop Analytica.exe process is launched with a command line having the format:&lt;br /&gt;
&lt;br /&gt;
 Analytica.exe [options] [filename]&lt;br /&gt;
&lt;br /&gt;
The brackets mean that these are optional. When ''filename'' has one or more spaces, you need to put double quotes around the filename. Or, you can put double quotes around the ''filename'' even if it doesn't have spaces.  The ''filename'' will usually have the extension *.ana.  When no filename is specified, Analytica launches to the intro screen.  When a filename is specified, it loads that model file.&lt;br /&gt;
&lt;br /&gt;
== Options ==&lt;br /&gt;
&lt;br /&gt;
Each option can be prefixed either with a forward slash, &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, or with a minus, &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;. Option values appear after a colon. There can be no spaces within the option or its value. When an option value contains a space, the option value must be quoted using double quotes. &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/rlmDiag:''filename''&amp;lt;/code&amp;gt;: Writes diagnostic information about licenses to ''filename''. This is very useful if you are encountering problems with a license that you believe has been activated, but is not working.  After launching Analytica with this option, exit Analytica and either review the log file in a text editor, or email the diagnostic file to support@lumina.com for assistance. The diagnostic file logs the information about licenses that it finds on your computer, and hence is very useful for debugging license problems. &lt;br /&gt;
*: Example usage: &amp;lt;code&amp;gt;Analytica.exe /rlmDiag:&amp;quot;c:\Temp\rlmDiag.log&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/roam:''days''&amp;lt;/code&amp;gt;: Specifies the number of days to roam a floating license.  Or, if ''days'' is -1, it releases a roamed license. See [[License Roaming]].&lt;br /&gt;
*: Example usage: &amp;lt;code&amp;gt;Analytica.exe /roam:7&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/lic:''licenseName''&amp;lt;/code&amp;gt;: Uses the specified license name without changing which license is selected by default. The license must already be activated (i.e., the license must be in your &amp;lt;code&amp;gt;C:\ProgramData\Lumina\Licenses&amp;lt;/code&amp;gt; folder).&lt;br /&gt;
*:Example: &amp;lt;code&amp;gt;Analytica.exe /lic:analytica_optimizer_761_2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/rlm:''server''&amp;lt;/code&amp;gt;: Specifies the server name (or port@serverName) that is running a Reprise License Manager with the desired centrally managed (e.g., floating) license.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/eval:''expression''&amp;lt;/code&amp;gt;: (new to [[Analytica 6.0]]). Specifies an Analytica expression that is evaluated immediately after the model file that is specified on the command line finishes loading. The evaluating occurs after any proactively evaluated variables or buttons in the model. It does not dirty the model. The expression can include global variable assignments, and button identifiers. You will almost certainly want to include double quotes around the expression, and you need to escape any interior quotes by proceeding the quote with a backslash. The parameter is ignored if ''filename'' is not specified on the command line.  See [[Running a model in a command line workflow]].&lt;br /&gt;
&lt;br /&gt;
*: Example usage: &amp;lt;code&amp;gt;Analytica.exe /eval:&amp;quot;Claimant=\&amp;quot;JDoe\&amp;quot;;Run_Batch;Exit&amp;quot; &amp;quot;Claim analysis.ana&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
*: In this example, &amp;lt;code&amp;gt;Claimant&amp;lt;/code&amp;gt; is the identifier of an input variable in the model and &amp;lt;code&amp;gt;Run_batch&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Exit&amp;lt;/code&amp;gt; are names of a buttons in the model.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/comment:''text''&amp;lt;/code&amp;gt;: (new to [[Analytica 6.0]]) The ''text'' is a comment that is ignored by Analytica. In one example usage, ACP3 adds a comment to each spawned processes to differentiate them in task manager.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/NoSplash&amp;lt;/code&amp;gt;: (new to [[Analytica 6.0]]) Don't show the splash screen at startup (which normally displays for 3 seconds). &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/mcp:«port»&amp;lt;/code&amp;gt;: (new to [[Analytica 7.0]]) Enable Analytica as an MCP server (a protocol that allows A.I. language models to call functions in your model). [[UDF]]s that contain &amp;lt;code&amp;gt;@mcpTool&amp;lt;/code&amp;gt; in their description are exposed as functions that the external A.I. client can call.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/lang:«code»&amp;lt;/code&amp;gt; (new to [[Analytica 7.1]]) Specifies the User Interface language for Analytica (for menus, dialogs, error messages, built-in function descriptions, etc.). «code» is a language code such as &amp;lt;code&amp;gt;'en'&amp;lt;/code&amp;gt; (for English), &amp;lt;code&amp;gt;'es'&amp;lt;/code&amp;gt; (for Spanish), etc. The language is only used when the resource files exist for that language in &lt;br /&gt;
*:&amp;lt;code&amp;gt;«Analytica install folder»\Resources\«code»\&amp;lt;/code&amp;gt;&lt;br /&gt;
*: The command line overrides the registry setting &amp;lt;code&amp;gt;Language&amp;lt;/code&amp;gt; (if present) in the hive&lt;br /&gt;
*:&amp;lt;code&amp;gt;HKCU\Software\Lumina Decision Systems\Analytica&amp;lt;/code&amp;gt;&lt;br /&gt;
*:As of [[Analytica 7.1]], non-English UI options is an experimental feature and not complete. &lt;br /&gt;
&lt;br /&gt;
The remaining options exist for internal purposes and aren't generally used by end-users:&lt;br /&gt;
* &amp;lt;code&amp;gt;/embedding&amp;lt;/code&amp;gt;: The Windows operating system uses this parameter when launching Analytica as a OLE-link server. Not used by end-users. Causes Analytica to launch quietly (without a GUI), load an indicated model, and exposes key OLE interfaces to Windows enabling an external application to complete the link to the model's data.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/solverDevLic&amp;lt;/code&amp;gt;: This parameter is sometimes used by Analytica developers, but not generally by end-users. It indicates that the licenses from [https://solver.com Frontline Systems] found in the &amp;lt;code&amp;gt;Solver.lic&amp;lt;/code&amp;gt; file are developer licenses rather than runtime licenses. &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/forcerelease&amp;lt;/code&amp;gt;: This parameter is used by Analytica quality assurance engineers during beta testing periods. It causes a beta release to behave like a final release build with regard to licensing.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;/config:''filename''&amp;lt;/code&amp;gt;: This is an option used by ACP3 (by Suan.exe) and not in Desktop Analytica.  The specified config file contains settings that define the ACP3 server configuration.&lt;br /&gt;
&lt;br /&gt;
== Accessing the Command line from a model ==&lt;br /&gt;
&lt;br /&gt;
The expression &amp;lt;code&amp;gt;[[GetProcessInfo]]('Command line')&amp;lt;/code&amp;gt; returns the command line used to launch the process.&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=GetProcessInfo&amp;diff=63896</id>
		<title>GetProcessInfo</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=GetProcessInfo&amp;diff=63896"/>
		<updated>2026-05-07T15:50:21Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: /* Types of information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[Category:System Functions]]&lt;br /&gt;
[[Category: Memory management]]&lt;br /&gt;
{{ReleaseBar}}&lt;br /&gt;
&lt;br /&gt;
[[GetProcessInfo]] can give you information about the current Analytica or [[ADE]] process, such as user name, computer, name, memory in use, number of processors available, number of objects in the model, and a whole lot more. from the Windows operating system,&lt;br /&gt;
&lt;br /&gt;
== Types of information  ==&lt;br /&gt;
&lt;br /&gt;
[[GetProcessInfo]] returns information about the current Analytica or [[ADE]] process from the Windows operating system, according to which of these texts you pass as the «item» parameter:&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Process ID&amp;quot;&amp;lt;/code&amp;gt; -- returns the Process ID, or Pid, for the current process.&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Thread ID&amp;quot;&amp;lt;/code&amp;gt; -- returns the Id of the Analytica/ADE thread.&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Priority&amp;quot;&amp;lt;/code&amp;gt; -- returns the priority of the Analytica/ADE thread.  The following values are possible (defined by the Windows operating system):&lt;br /&gt;
::*&amp;lt;code&amp;gt;-15&amp;lt;/code&amp;gt; : Idle only&lt;br /&gt;
::*&amp;lt;code&amp;gt;-2&amp;lt;/code&amp;gt; : lowest priority&lt;br /&gt;
::*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; : below normal&lt;br /&gt;
::*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; : normal priority&lt;br /&gt;
::*&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; : Above normal&lt;br /&gt;
::*&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; : Highest priority&lt;br /&gt;
::*&amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;: Critical priority&lt;br /&gt;
::*&amp;lt;code&amp;gt;31&amp;lt;/code&amp;gt;: Real-time priority&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Computer Name&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;User Name&amp;quot;&amp;lt;/code&amp;gt;: Windows login name&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;User Identity&amp;quot;&amp;lt;/code&amp;gt;: User name in ACP, or Windows login name in DTA.&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Windows Version&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Windows SP&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Windows Build&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Abort Event Object&amp;quot;&amp;lt;/code&amp;gt; { ADE only }.  Name of global Event object for ADE project that can be used to send ADE a break signal to abort the current computation.&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;ENV:''«name»''&amp;quot;&amp;lt;/code&amp;gt;: Retrieves the value for the environment variable «name»&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Environment Variables&amp;quot;&amp;lt;/code&amp;gt;: List of all Environment variables&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Command Line&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Analytica Path&amp;quot;&amp;lt;/code&amp;gt;: Full file path to the ''Analytica.exe, Ade.exe'', or ''Ade.dll'' file being run.&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Working Set Size&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Working Set Max&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Working Set Min&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Working Set Flags&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt; &amp;quot;Working Set Peak&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Private Bytes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Total RAM&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Free RAM&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Total Virtual&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Max Address Space&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Memory Load&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Total Free Memory&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Page Fault Count&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Avail Virtual&amp;quot;&amp;lt;/code&amp;gt; &lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Processor #&amp;quot;&amp;lt;/code&amp;gt;: On a multi-core computer, the processor currently running the current evaluation.  This changes with time.&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Affinity Mask&amp;quot;&amp;lt;/code&amp;gt;: A list of which processors the operating system will allow Analytica's evaluation to run on.&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Num Processors&amp;quot;&amp;lt;/code&amp;gt;: The number of processors the Analytica process is allowed to run on. &lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Num Sys Processors&amp;quot;&amp;lt;/code&amp;gt;: The total number of processors on this computer in the current processor group. Always &amp;lt;=64.{{Release|6.0||&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Num cores&amp;quot;&amp;lt;/code&amp;gt;: The total number of processors on this computer in all [https://docs.microsoft.com/en-us/windows/win32/procthread/processor-groups processor groups]. (Typically the same as &amp;lt;code&amp;gt;&amp;quot;Num Sys Processors&amp;quot;&amp;lt;/code&amp;gt; on computers with 64 cores or less, but can be greater than 64 on very high-end servers).}}&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;User Objects&amp;quot;&amp;lt;/code&amp;gt;: Number of objects in use (variable nodes, local indexes, etc) by a model&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Total Objects&amp;quot;&amp;lt;/code&amp;gt;: Number of objects in use including both user objects and built-in system objects.&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Free Objects&amp;quot;&amp;lt;/code&amp;gt;: Number of free &amp;quot;slots&amp;quot; still available for additional objects.{{Release|1=7.1|2=|3=&lt;br /&gt;
: &amp;lt;code&amp;gt;'UI Language'&amp;lt;/code&amp;gt;: Returns the language used for the Analytica user interface, &amp;quot;en&amp;quot;=English, &amp;quot;es&amp;quot;=Spanish, etc. }}{{Release|6.5||&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Application Rect&amp;quot;&amp;lt;/code&amp;gt;: Returns width, height, top, left, as 4 return values, describing the screen coordinates of the desktop Analytica application window. Returns Null in ADE. &lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Desk Rect&amp;quot;&amp;lt;/code&amp;gt;: Returns width, height, x,y, as 4 return values, describing the rectangle within the desktop application where MDI windows can be. This rectangle starts below the toolbar, and does not include application boundaries.}}{{Release|1=7.0|2=|3=&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Screenshot&amp;quot;&amp;lt;/code&amp;gt;: Returns an image of the Analytica desktop application window (at the time the function call is evaluated).}}{{Release|1=7.1|2=|3=&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Current Monitor Rect&amp;quot;&amp;lt;/code&amp;gt;: Returns width, height, x, y, as 4 return values, describing the screen coordinates of the monitor that the Analytica application window is currently on. Returns Null in ADE.&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Current Monitor Work Rect&amp;quot;&amp;lt;/code&amp;gt;: Returns width, height, x, y, as 4 return values, describing the work area (excluding taskbar) of the monitor that the Analytica application window is currently on. Returns Null in ADE.&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Number of Monitors&amp;quot;&amp;lt;/code&amp;gt;: The number of monitors connected to the system.&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Monitor ''N'' Rect&amp;quot;&amp;lt;/code&amp;gt;: Returns width, height, x, y, as 4 return values, describing the screen coordinates of the ''N''th monitor (1-based). Replace ''N'' with any integer from 1 to the value of &amp;lt;code&amp;gt;&amp;quot;Number of Monitors&amp;quot;&amp;lt;/code&amp;gt;. For example, &amp;lt;code&amp;gt;GetProcessInfo(&amp;quot;Monitor 2 Rect&amp;quot;)&amp;lt;/code&amp;gt; returns the rectangle of the 2nd monitor.&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Monitor ''N'' Work Rect&amp;quot;&amp;lt;/code&amp;gt;: Like &amp;lt;code&amp;gt;&amp;quot;Monitor ''N'' Rect&amp;quot;&amp;lt;/code&amp;gt; but returns the work area (excluding taskbar) of the ''N''th monitor. For example, &amp;lt;code&amp;gt;GetProcessInfo(&amp;quot;Monitor 1 Work Rect&amp;quot;)&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== Process ID ===&lt;br /&gt;
Knowing the Process ID makes it possible to differentiate between multiple instances of Analytica or [[ADE]] in the Windows Task Manager.  &lt;br /&gt;
:&amp;lt;code&amp;gt;GetProcessInfo(&amp;quot;Process ID&amp;quot;) &amp;amp;rarr; 4117&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reading the command line ===&lt;br /&gt;
:&amp;lt;code&amp;gt;GetProcessInfo(&amp;quot;Command Line&amp;quot;) &amp;amp;rarr; '&amp;quot;C:\Program Files\Lumina\Analytica.exe&amp;quot; &amp;quot;C:\My Models\Costs.ana&amp;quot;'&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Analytica Command Line]] for a list of valid command line parameters recognized by Analytica.&lt;br /&gt;
&lt;br /&gt;
=== Reading Environment Variables ===&lt;br /&gt;
Obtain a list of all environment variables:&lt;br /&gt;
:&amp;lt;code&amp;gt;Index EnvVarName := GetProcessInfo(&amp;quot;Environment Variables&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;GetProcessInfo(&amp;quot;Env:&amp;quot;&amp;amp;EnvVarName)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Getting PID from ADE (C#) ===&lt;br /&gt;
:&amp;lt;code&amp;gt;CAEngine ade = new CAEngine();&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;CAObject V = ade.CreateObject(&amp;quot;V&amp;quot;, &amp;quot;variable&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;V.SetAttribute(&amp;quot;definition&amp;quot;, &amp;quot;GetProcessInfo(\&amp;quot;Process ID\&amp;quot;)&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;string pInfoResult = V.Result().ToString();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aborting an in-progress evaluation in ADE ===&lt;br /&gt;
To abort a computation in [[ADE]], your program must obtain a HANDLE to the ''abort event object''.  In order to obtain this, you need to obtain the name of this object from ADE.  You get this by calling &amp;lt;code&amp;gt;GetProcessInfo(&amp;quot;Abort Event Object&amp;quot;)&amp;lt;/code&amp;gt;.  You then use the Windows Platform SDK routine OpenEvent to get the handle to this object.  When you want to abort an in-process computation, you set this event.  Generally your application that uses ADE will need to be multi-threaded, so that one thread calls ADE, the other thread detects the signal to abort the computation (the signal might be a user pressing ''Ctrl+Break'', for example).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background:white; border:white; margin-left: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
C++ example:&lt;br /&gt;
&lt;br /&gt;
    /* From first application thread, which uses ADE: */&lt;br /&gt;
    #include &amp;lt;windows.h&amp;gt;&lt;br /&gt;
    #import &amp;quot;ADE.exe&amp;quot;&lt;br /&gt;
    using namespace ADE4;&lt;br /&gt;
    ...&lt;br /&gt;
    GLOBAL HEVENT hAbort;&lt;br /&gt;
    ...&lt;br /&gt;
    void main() &lt;br /&gt;
    {&lt;br /&gt;
        ...&lt;br /&gt;
        CAEngine* pAde = new CAEngine();&lt;br /&gt;
        pAde-&amp;gt;SendCommand(&amp;quot;GetProcessInfo('Abort Event Object')&amp;quot;);&lt;br /&gt;
        _bstr_t abortObjName = pAde-&amp;gt;get_OutputBuffer();&lt;br /&gt;
        hAbort = OpenEvent(EVENT_MODIFY_STATE,/*bInherit*/FALSE,abortObjName);&lt;br /&gt;
        ...&lt;br /&gt;
        CreateThread(..., MonitorForBreak,... );&lt;br /&gt;
        CTable* pResult = pAde-&amp;gt;Get(&amp;quot;X&amp;quot;)-&amp;gt;ResultTable();  /* Initiate a very long computation */&lt;br /&gt;
        if (pAde-&amp;gt;get_ErrorCode() == 78) {&lt;br /&gt;
             /* The computation was aborted before completion */&lt;br /&gt;
             ...&lt;br /&gt;
        }&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    DWORD WINAPI MonitorForBreak( LPVOID )&lt;br /&gt;
    {&lt;br /&gt;
         /* This routine detects a signal to break the computation.  Maybe it is a user-keypress,&lt;br /&gt;
          * or other UI interaction. */&lt;br /&gt;
         if (DetectUserWantsToAbort()) {&lt;br /&gt;
             SetEvent(hAbort);                   /* Causes the abort */&lt;br /&gt;
         }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Memory Information ===&lt;br /&gt;
The Analytica process that evaluates your model may end up using a lot of memory.  The operating system keeps some of that memory in RAM, and swaps some of it out to virtual memory.  Accessing RAM is fast, while accessing virtual memory is much slower.  Windows makes various tradeoffs with what other programs are running on your computer to decide how much of the Analytica process to keep in RAM.  The amount of RAM to devote to Analytica is called its ''working set''.  When the working set is much smaller that the available RAM, other applications on your computer will respond well (since they can use that RAM), but Analytica may run slowly.  If the working set is close to the amount of available RAM, then Analytica gets to make more use of fast RAM, but other applications, and the Windows UI, may get very slow, since they will then need to switch in and out of memory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;GetProcessInfo(&amp;quot;Working Set Max&amp;quot;)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;GetProcessInfo(&amp;quot;Working set Min&amp;quot;)&amp;lt;/code&amp;gt; return the minimum and maximum working set size, in bytes, currently imposed by Windows on the Analytica process.  &amp;lt;code&amp;gt;GetProcessInfo(&amp;quot;Working Set Flags&amp;quot;)&amp;lt;/code&amp;gt; returns an integer containing flags, indicating whether Windows is allowed to alter these limits as the process uses more or less memory.  The flags are the following numbers added together:&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; = Analytica is guaranteed at least the minimum working set.&lt;br /&gt;
* &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; = Windows may reduce Analytica's working set below the minimum value when memory demands are high&lt;br /&gt;
* &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; = Windows will not allocate more than the indicated working set max.&lt;br /&gt;
* &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; = Windows may give Analytica more than the &amp;lt;code&amp;gt;Working Set Max&amp;lt;/code&amp;gt; when memory demands from other applications is low.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;&amp;quot;Avail Virtual&amp;quot;&amp;lt;/code&amp;gt; option returns the number that Windows reports as the theoretical maximum amount of memory available to all processes running on the operating system, including both RAM and page file space.  However, the number isn't very meaningful or reliable, as Windows often reports a number that far exceeds the amount of available hard disk space (for example, in Windows x64, a number of 8.8 TeraBytes is reported), and in 32-bit processes on Windows x64, the huge number seems to be wrap at 4GB, resulting in a nonesense (and often very small) number.&lt;br /&gt;
&lt;br /&gt;
{{Release|1=6.5|2=|3=&lt;br /&gt;
== Application window coordinates == &lt;br /&gt;
''new in [[Analytica 6.5]]''&lt;br /&gt;
:&amp;lt;code&amp;gt;[[Local]] (width, height, left, top) := [[GetProcessInfo]]( 'Application Rect');&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This gets the rectangle, in screen coordinates, of the desktop application.  From ADE, or ACP when there is no dual desktop UI running, returns Null.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;[[Local]](width, height) := [[GetProcessInfo]]('Desk Rect');&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This gets the size of the desk, the rectangle within the application where diagram windows, object window, result windows, the outliner, Assista window, etc. reside. This desk rectangle starts below the toolbar. You can also get the location:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;[[Local]](width, height, x, y) := [[GetProcessInfo]]('Desk Rect');&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The x,y location coordinate is relative to the application window.&lt;br /&gt;
}}&lt;br /&gt;
==History==&lt;br /&gt;
This function was introduced in [[What's new in Analytica 4.0?|Analytica 4.0]].&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[Working Set Size]]&lt;br /&gt;
* [[Memory usage and management]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=GetProcessInfo&amp;diff=63895</id>
		<title>GetProcessInfo</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=GetProcessInfo&amp;diff=63895"/>
		<updated>2026-05-07T15:49:21Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: 22111 -- Added 'UI Language'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[Category:System Functions]]&lt;br /&gt;
[[Category: Memory management]]&lt;br /&gt;
{{ReleaseBar}}&lt;br /&gt;
&lt;br /&gt;
[[GetProcessInfo]] can give you information about the current Analytica or [[ADE]] process, such as user name, computer, name, memory in use, number of processors available, number of objects in the model, and a whole lot more. from the Windows operating system,&lt;br /&gt;
&lt;br /&gt;
== Types of information  ==&lt;br /&gt;
&lt;br /&gt;
[[GetProcessInfo]] returns information about the current Analytica or [[ADE]] process from the Windows operating system, according to which of these texts you pass as the «item» parameter:&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Process ID&amp;quot;&amp;lt;/code&amp;gt; -- returns the Process ID, or Pid, for the current process.&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Thread ID&amp;quot;&amp;lt;/code&amp;gt; -- returns the Id of the Analytica/ADE thread.&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Priority&amp;quot;&amp;lt;/code&amp;gt; -- returns the priority of the Analytica/ADE thread.  The following values are possible (defined by the Windows operating system):&lt;br /&gt;
::*&amp;lt;code&amp;gt;-15&amp;lt;/code&amp;gt; : Idle only&lt;br /&gt;
::*&amp;lt;code&amp;gt;-2&amp;lt;/code&amp;gt; : lowest priority&lt;br /&gt;
::*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; : below normal&lt;br /&gt;
::*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; : normal priority&lt;br /&gt;
::*&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; : Above normal&lt;br /&gt;
::*&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; : Highest priority&lt;br /&gt;
::*&amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;: Critical priority&lt;br /&gt;
::*&amp;lt;code&amp;gt;31&amp;lt;/code&amp;gt;: Real-time priority&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Computer Name&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;User Name&amp;quot;&amp;lt;/code&amp;gt;: Windows login name&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;User Identity&amp;quot;&amp;lt;/code&amp;gt;: User name in ACP, or Windows login name in DTA.&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Windows Version&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Windows SP&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Windows Build&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Abort Event Object&amp;quot;&amp;lt;/code&amp;gt; { ADE only }.  Name of global Event object for ADE project that can be used to send ADE a break signal to abort the current computation.&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;ENV:''«name»''&amp;quot;&amp;lt;/code&amp;gt;: Retrieves the value for the environment variable «name»&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Environment Variables&amp;quot;&amp;lt;/code&amp;gt;: List of all Environment variables&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Command Line&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Analytica Path&amp;quot;&amp;lt;/code&amp;gt;: Full file path to the ''Analytica.exe, Ade.exe'', or ''Ade.dll'' file being run.&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Working Set Size&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Working Set Max&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Working Set Min&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Working Set Flags&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt; &amp;quot;Working Set Peak&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Private Bytes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Total RAM&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Free RAM&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Total Virtual&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Max Address Space&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Memory Load&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Total Free Memory&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Page Fault Count&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Avail Virtual&amp;quot;&amp;lt;/code&amp;gt; &lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Processor #&amp;quot;&amp;lt;/code&amp;gt;: On a multi-core computer, the processor currently running the current evaluation.  This changes with time.&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Affinity Mask&amp;quot;&amp;lt;/code&amp;gt;: A list of which processors the operating system will allow Analytica's evaluation to run on.&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Num Processors&amp;quot;&amp;lt;/code&amp;gt;: The number of processors the Analytica process is allowed to run on. &lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Num Sys Processors&amp;quot;&amp;lt;/code&amp;gt;: The total number of processors on this computer in the current processor group. Always &amp;lt;=64.{{Release|6.0||&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Num cores&amp;quot;&amp;lt;/code&amp;gt;: The total number of processors on this computer in all [https://docs.microsoft.com/en-us/windows/win32/procthread/processor-groups processor groups]. (Typically the same as &amp;lt;code&amp;gt;&amp;quot;Num Sys Processors&amp;quot;&amp;lt;/code&amp;gt; on computers with 64 cores or less, but can be greater than 64 on very high-end servers).}}&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;User Objects&amp;quot;&amp;lt;/code&amp;gt;: Number of objects in use (variable nodes, local indexes, etc) by a model&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Total Objects&amp;quot;&amp;lt;/code&amp;gt;: Number of objects in use including both user objects and built-in system objects.&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;quot;Free Objects&amp;quot;&amp;lt;/code&amp;gt;: Number of free &amp;quot;slots&amp;quot; still available for additional objects.{{Release|7.1||&lt;br /&gt;
: &amp;lt;code&amp;gt;'UI Language'&amp;lt;/code&amp;gt;: Returns the language used for the Analytica user interface, &amp;quot;en&amp;quot;=English, &amp;quot;es&amp;quot;=Spanish, etc. }}{{Release|6.5||&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Application Rect&amp;quot;&amp;lt;/code&amp;gt;: Returns width, height, top, left, as 4 return values, describing the screen coordinates of the desktop Analytica application window. Returns Null in ADE. &lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Desk Rect&amp;quot;&amp;lt;/code&amp;gt;: Returns width, height, x,y, as 4 return values, describing the rectangle within the desktop application where MDI windows can be. This rectangle starts below the toolbar, and does not include application boundaries.}}{{Release|1=7.0|2=|3=&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Screenshot&amp;quot;&amp;lt;/code&amp;gt;: Returns an image of the Analytica desktop application window (at the time the function call is evaluated).}}{{Release|1=7.1|2=|3=&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Current Monitor Rect&amp;quot;&amp;lt;/code&amp;gt;: Returns width, height, x, y, as 4 return values, describing the screen coordinates of the monitor that the Analytica application window is currently on. Returns Null in ADE.&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Current Monitor Work Rect&amp;quot;&amp;lt;/code&amp;gt;: Returns width, height, x, y, as 4 return values, describing the work area (excluding taskbar) of the monitor that the Analytica application window is currently on. Returns Null in ADE.&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Number of Monitors&amp;quot;&amp;lt;/code&amp;gt;: The number of monitors connected to the system.&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Monitor ''N'' Rect&amp;quot;&amp;lt;/code&amp;gt;: Returns width, height, x, y, as 4 return values, describing the screen coordinates of the ''N''th monitor (1-based). Replace ''N'' with any integer from 1 to the value of &amp;lt;code&amp;gt;&amp;quot;Number of Monitors&amp;quot;&amp;lt;/code&amp;gt;. For example, &amp;lt;code&amp;gt;GetProcessInfo(&amp;quot;Monitor 2 Rect&amp;quot;)&amp;lt;/code&amp;gt; returns the rectangle of the 2nd monitor.&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;quot;Monitor ''N'' Work Rect&amp;quot;&amp;lt;/code&amp;gt;: Like &amp;lt;code&amp;gt;&amp;quot;Monitor ''N'' Rect&amp;quot;&amp;lt;/code&amp;gt; but returns the work area (excluding taskbar) of the ''N''th monitor. For example, &amp;lt;code&amp;gt;GetProcessInfo(&amp;quot;Monitor 1 Work Rect&amp;quot;)&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== Process ID ===&lt;br /&gt;
Knowing the Process ID makes it possible to differentiate between multiple instances of Analytica or [[ADE]] in the Windows Task Manager.  &lt;br /&gt;
:&amp;lt;code&amp;gt;GetProcessInfo(&amp;quot;Process ID&amp;quot;) &amp;amp;rarr; 4117&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reading the command line ===&lt;br /&gt;
:&amp;lt;code&amp;gt;GetProcessInfo(&amp;quot;Command Line&amp;quot;) &amp;amp;rarr; '&amp;quot;C:\Program Files\Lumina\Analytica.exe&amp;quot; &amp;quot;C:\My Models\Costs.ana&amp;quot;'&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Analytica Command Line]] for a list of valid command line parameters recognized by Analytica.&lt;br /&gt;
&lt;br /&gt;
=== Reading Environment Variables ===&lt;br /&gt;
Obtain a list of all environment variables:&lt;br /&gt;
:&amp;lt;code&amp;gt;Index EnvVarName := GetProcessInfo(&amp;quot;Environment Variables&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;GetProcessInfo(&amp;quot;Env:&amp;quot;&amp;amp;EnvVarName)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Getting PID from ADE (C#) ===&lt;br /&gt;
:&amp;lt;code&amp;gt;CAEngine ade = new CAEngine();&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;CAObject V = ade.CreateObject(&amp;quot;V&amp;quot;, &amp;quot;variable&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;V.SetAttribute(&amp;quot;definition&amp;quot;, &amp;quot;GetProcessInfo(\&amp;quot;Process ID\&amp;quot;)&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;string pInfoResult = V.Result().ToString();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aborting an in-progress evaluation in ADE ===&lt;br /&gt;
To abort a computation in [[ADE]], your program must obtain a HANDLE to the ''abort event object''.  In order to obtain this, you need to obtain the name of this object from ADE.  You get this by calling &amp;lt;code&amp;gt;GetProcessInfo(&amp;quot;Abort Event Object&amp;quot;)&amp;lt;/code&amp;gt;.  You then use the Windows Platform SDK routine OpenEvent to get the handle to this object.  When you want to abort an in-process computation, you set this event.  Generally your application that uses ADE will need to be multi-threaded, so that one thread calls ADE, the other thread detects the signal to abort the computation (the signal might be a user pressing ''Ctrl+Break'', for example).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background:white; border:white; margin-left: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
C++ example:&lt;br /&gt;
&lt;br /&gt;
    /* From first application thread, which uses ADE: */&lt;br /&gt;
    #include &amp;lt;windows.h&amp;gt;&lt;br /&gt;
    #import &amp;quot;ADE.exe&amp;quot;&lt;br /&gt;
    using namespace ADE4;&lt;br /&gt;
    ...&lt;br /&gt;
    GLOBAL HEVENT hAbort;&lt;br /&gt;
    ...&lt;br /&gt;
    void main() &lt;br /&gt;
    {&lt;br /&gt;
        ...&lt;br /&gt;
        CAEngine* pAde = new CAEngine();&lt;br /&gt;
        pAde-&amp;gt;SendCommand(&amp;quot;GetProcessInfo('Abort Event Object')&amp;quot;);&lt;br /&gt;
        _bstr_t abortObjName = pAde-&amp;gt;get_OutputBuffer();&lt;br /&gt;
        hAbort = OpenEvent(EVENT_MODIFY_STATE,/*bInherit*/FALSE,abortObjName);&lt;br /&gt;
        ...&lt;br /&gt;
        CreateThread(..., MonitorForBreak,... );&lt;br /&gt;
        CTable* pResult = pAde-&amp;gt;Get(&amp;quot;X&amp;quot;)-&amp;gt;ResultTable();  /* Initiate a very long computation */&lt;br /&gt;
        if (pAde-&amp;gt;get_ErrorCode() == 78) {&lt;br /&gt;
             /* The computation was aborted before completion */&lt;br /&gt;
             ...&lt;br /&gt;
        }&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    DWORD WINAPI MonitorForBreak( LPVOID )&lt;br /&gt;
    {&lt;br /&gt;
         /* This routine detects a signal to break the computation.  Maybe it is a user-keypress,&lt;br /&gt;
          * or other UI interaction. */&lt;br /&gt;
         if (DetectUserWantsToAbort()) {&lt;br /&gt;
             SetEvent(hAbort);                   /* Causes the abort */&lt;br /&gt;
         }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Memory Information ===&lt;br /&gt;
The Analytica process that evaluates your model may end up using a lot of memory.  The operating system keeps some of that memory in RAM, and swaps some of it out to virtual memory.  Accessing RAM is fast, while accessing virtual memory is much slower.  Windows makes various tradeoffs with what other programs are running on your computer to decide how much of the Analytica process to keep in RAM.  The amount of RAM to devote to Analytica is called its ''working set''.  When the working set is much smaller that the available RAM, other applications on your computer will respond well (since they can use that RAM), but Analytica may run slowly.  If the working set is close to the amount of available RAM, then Analytica gets to make more use of fast RAM, but other applications, and the Windows UI, may get very slow, since they will then need to switch in and out of memory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;GetProcessInfo(&amp;quot;Working Set Max&amp;quot;)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;GetProcessInfo(&amp;quot;Working set Min&amp;quot;)&amp;lt;/code&amp;gt; return the minimum and maximum working set size, in bytes, currently imposed by Windows on the Analytica process.  &amp;lt;code&amp;gt;GetProcessInfo(&amp;quot;Working Set Flags&amp;quot;)&amp;lt;/code&amp;gt; returns an integer containing flags, indicating whether Windows is allowed to alter these limits as the process uses more or less memory.  The flags are the following numbers added together:&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; = Analytica is guaranteed at least the minimum working set.&lt;br /&gt;
* &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; = Windows may reduce Analytica's working set below the minimum value when memory demands are high&lt;br /&gt;
* &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; = Windows will not allocate more than the indicated working set max.&lt;br /&gt;
* &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; = Windows may give Analytica more than the &amp;lt;code&amp;gt;Working Set Max&amp;lt;/code&amp;gt; when memory demands from other applications is low.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;&amp;quot;Avail Virtual&amp;quot;&amp;lt;/code&amp;gt; option returns the number that Windows reports as the theoretical maximum amount of memory available to all processes running on the operating system, including both RAM and page file space.  However, the number isn't very meaningful or reliable, as Windows often reports a number that far exceeds the amount of available hard disk space (for example, in Windows x64, a number of 8.8 TeraBytes is reported), and in 32-bit processes on Windows x64, the huge number seems to be wrap at 4GB, resulting in a nonesense (and often very small) number.&lt;br /&gt;
&lt;br /&gt;
{{Release|1=6.5|2=|3=&lt;br /&gt;
== Application window coordinates == &lt;br /&gt;
''new in [[Analytica 6.5]]''&lt;br /&gt;
:&amp;lt;code&amp;gt;[[Local]] (width, height, left, top) := [[GetProcessInfo]]( 'Application Rect');&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This gets the rectangle, in screen coordinates, of the desktop application.  From ADE, or ACP when there is no dual desktop UI running, returns Null.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;[[Local]](width, height) := [[GetProcessInfo]]('Desk Rect');&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This gets the size of the desk, the rectangle within the application where diagram windows, object window, result windows, the outliner, Assista window, etc. reside. This desk rectangle starts below the toolbar. You can also get the location:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;[[Local]](width, height, x, y) := [[GetProcessInfo]]('Desk Rect');&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The x,y location coordinate is relative to the application window.&lt;br /&gt;
}}&lt;br /&gt;
==History==&lt;br /&gt;
This function was introduced in [[What's new in Analytica 4.0?|Analytica 4.0]].&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[Working Set Size]]&lt;br /&gt;
* [[Memory usage and management]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.1%3F&amp;diff=63887</id>
		<title>What's new in Analytica 7.1?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.1%3F&amp;diff=63887"/>
		<updated>2026-04-29T21:35:01Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: /* Window appearance */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Analytica 7.1 is currently under development, and will be the next future release of Analytica. The current official release is [[Analytica 7.0]]. This page is under construction, and will list enhancements that are new to Analytica or ADE 7.1.&lt;br /&gt;
&lt;br /&gt;
== Window appearance ==&lt;br /&gt;
The appearance of the chrome around child MDI windows (aka the &amp;quot;non-client area&amp;quot;) has been changed to more closely match the Windows 11 style of windows -- i.e., thin (1 pixel) borders, rounded corners at the top, white title bar, very plain (text-like) button images in the toolbar.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
Assista is Analytica's A.I. assistant. She is greatly improved in this release.&lt;br /&gt;
* Her UI is now a top-level window that resides at the same level as Analytica's main application window.&lt;br /&gt;
** You can move her chat window to a non-overlapping location or even a different monitor (to maximize screen real estate used by your Analytica window).&lt;br /&gt;
** Selected objects remain visually selected in the main window when you type into Assista.&lt;br /&gt;
* Her chat has a different look-and-feel.&lt;br /&gt;
* Her chat window is faster and more responsive&lt;br /&gt;
* You can drag-highlight any text in her chat and copy to paste elsewhere.&lt;br /&gt;
* The UI has improved formatting capabilities for displaying Assista's response.&lt;br /&gt;
* Her &amp;quot;thoughts&amp;quot; display as she is processing your prompt, making it clear she is working and even giving you a peek into how she is solving it.&lt;br /&gt;
* She has a new processing pipeline on the backend, enabling her to respond faster but also work longer on harder tasks. &lt;br /&gt;
* She has an extended set of competencies (skills).&lt;br /&gt;
&lt;br /&gt;
== CSV files ==&lt;br /&gt;
There are now a few additional ways to open CSV files in Analytica:&lt;br /&gt;
* On the command line: &amp;lt;code&amp;gt;Analytica.exe MyData.csv&amp;lt;/code&amp;gt;&lt;br /&gt;
* Drag and drop a *.csv file onto the diagram (which behaves the same as using &amp;lt;code&amp;gt;File / Import...&amp;lt;/code&amp;gt; on the *.csv file). &lt;br /&gt;
&lt;br /&gt;
== Spreadsheets ==&lt;br /&gt;
* &amp;lt;code&amp;gt;[[SpreadsheetOpen]](&amp;quot;new&amp;quot;)&amp;lt;/code&amp;gt; now creates a blank spreadsheet in memory. Works with both the Excel and LibXl backends.&lt;br /&gt;
* Prefacing a sheet name with + in the call to [[SpreadsheetSetCell]] or [[SpreadsheetSetRange]] will add a new sheet by that name to the workbook (as it applies the specified change to that new worksheet). Works with either backend.&lt;br /&gt;
* You can also now remove a sheet from a workbook using: &amp;lt;code&amp;gt;[[SpreadsheetSetCell]](wb, &amp;quot;-OldSheet&amp;quot;, col, row, Null)&amp;lt;/code&amp;gt;. The «col» and «row» parameters are required but ignored in this case.&lt;br /&gt;
&lt;br /&gt;
== Built-in functions ==&lt;br /&gt;
* New options for [[GetProcessInfo]]: &amp;lt;code&amp;gt;&amp;quot;Number of monitors&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Current monitor rect&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Current monitor work rect&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Monitor «N» Rect&amp;quot;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;&amp;quot;Monitor «N» work rect&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* New optional parameter, «throwParsingErrors», to [[Evaluate]].&lt;br /&gt;
* [[ReadFromURL]] is a bit smarter about returning binary content (like &amp;lt;code&amp;gt;*.zip&amp;lt;/code&amp;gt; files) as a [[In-memory binary data terms|Binary Data Term]].&lt;br /&gt;
&lt;br /&gt;
== System variables ==&lt;br /&gt;
* SysVar [[Graph_ColorSequence]]: Replaces [[Graph_ColorSeq]] which is now deprecated. The new sysvar contains a list of color interer with one integer (of the form &amp;lt;code&amp;gt;0x00rrggbb&amp;lt;/code&amp;gt;) per color (whereas the deprecated used triples of numbers per color).&lt;br /&gt;
&lt;br /&gt;
== Model loading ==&lt;br /&gt;
When opening a model file, the &amp;quot;checking&amp;quot; stage (when attributes are parsed) parses different expressions on different threads, resulting in substantially faster model load times for very large models.&lt;br /&gt;
&lt;br /&gt;
Note: In the event that this creates a problem with your specific model (maybe due to an as-yet-undiscovered multithreading bug), you can disable it for your model as follows:&lt;br /&gt;
# Temporarily turn off multithreading (Skip this step if you are able to load your model)&lt;br /&gt;
## New model&lt;br /&gt;
## &amp;lt;b&amp;gt;Definition menu / System variables / Settings / Maximum evaluation threads&amp;lt;/b&amp;gt;&lt;br /&gt;
## Set to 1  (and remember the previous value)&lt;br /&gt;
# Open your model&lt;br /&gt;
# &amp;lt;b&amp;gt;Definition menu / System variables / Settings / Disable Multithreaded Evaluations&amp;lt;/b&amp;gt;&lt;br /&gt;
# Press the &amp;lt;code&amp;gt;Edit Table&amp;lt;/code&amp;gt; button.&lt;br /&gt;
# Check the checkbox for &amp;lt;code&amp;gt;Parsing&amp;lt;/code&amp;gt;&lt;br /&gt;
# Save your model&lt;br /&gt;
# &amp;lt;b&amp;gt;Definition menu / System variables / Settings / Maximum evaluation threads&amp;lt;/b&amp;gt;&lt;br /&gt;
#: Restore the original value from Step 1&lt;br /&gt;
&lt;br /&gt;
== MCP server ==&lt;br /&gt;
* Added an ability to install multiple ADE-based Mcp servers that run different ADE releases. For example, you can install two MCP servers into Claude Code:&lt;br /&gt;
* ade-server: Runs ADE 7.1&lt;br /&gt;
* ade-server-70: Runs ADE 7.0&lt;br /&gt;
The information in the &amp;lt;code&amp;gt;«ADE install folder»\Examples\Mcp_server\README.txt&amp;lt;/code&amp;gt; file explain how (with enough info for Claude code to configure this for you).  &lt;br /&gt;
&lt;br /&gt;
With both installed, Claude Code (or other MCP-enabled AI agents) can compare results for the same model across different releases, etc.&lt;br /&gt;
&lt;br /&gt;
Side note: The Mcp server was added to ADE 7.0.&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
This release has undergone massive internal restructuring and refactorization. Ideally (i.e., in the absence of bugs) these changes won't change functionality, but may alter some aspects of behavior, hopefully for the better.&lt;br /&gt;
* Internal data structures use for multi-dimensional arrays has been changed. Possible impacts:&lt;br /&gt;
** Likely to remove the sensitivity to the &amp;quot;canonical order&amp;quot; of indexes on evaluation speed.&lt;br /&gt;
** May change relative evaluation speeds of various functions and operations.&lt;br /&gt;
&lt;br /&gt;
== Discontinued... ==&lt;br /&gt;
* Plug-in functions. (An old hook that allows you to extend Analytica with compiled functions and UI elements written it C++. We are almost certain no one is using these hooks any more.)&lt;br /&gt;
* The sysvar [[Graph_ColorSeq]] is now deprecated (but works for both reading and setting to preserve backward compatibility). It has been replaced by the system variable [[Graph_ColorSequence]].&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.1%3F&amp;diff=63886</id>
		<title>What's new in Analytica 7.1?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.1%3F&amp;diff=63886"/>
		<updated>2026-04-29T21:20:48Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Analytica 7.1 is currently under development, and will be the next future release of Analytica. The current official release is [[Analytica 7.0]]. This page is under construction, and will list enhancements that are new to Analytica or ADE 7.1.&lt;br /&gt;
&lt;br /&gt;
== Window appearance ==&lt;br /&gt;
The appearance of the chrome around child MDI windows (aka the &amp;quot;non-client area&amp;quot;) has been changed to more closely match the Windows 11 style of windows -- i.e., thin (1 pixel) borders, rounded corners at the top, white title bar, very plain (text-like) button images in the toolbar.&lt;br /&gt;
&lt;br /&gt;
== CSV files ==&lt;br /&gt;
There are now a few additional ways to open CSV files in Analytica:&lt;br /&gt;
* On the command line: &amp;lt;code&amp;gt;Analytica.exe MyData.csv&amp;lt;/code&amp;gt;&lt;br /&gt;
* Drag and drop a *.csv file onto the diagram (which behaves the same as using &amp;lt;code&amp;gt;File / Import...&amp;lt;/code&amp;gt; on the *.csv file). &lt;br /&gt;
&lt;br /&gt;
== Spreadsheets ==&lt;br /&gt;
* &amp;lt;code&amp;gt;[[SpreadsheetOpen]](&amp;quot;new&amp;quot;)&amp;lt;/code&amp;gt; now creates a blank spreadsheet in memory. Works with both the Excel and LibXl backends.&lt;br /&gt;
* Prefacing a sheet name with + in the call to [[SpreadsheetSetCell]] or [[SpreadsheetSetRange]] will add a new sheet by that name to the workbook (as it applies the specified change to that new worksheet). Works with either backend.&lt;br /&gt;
* You can also now remove a sheet from a workbook using: &amp;lt;code&amp;gt;[[SpreadsheetSetCell]](wb, &amp;quot;-OldSheet&amp;quot;, col, row, Null)&amp;lt;/code&amp;gt;. The «col» and «row» parameters are required but ignored in this case.&lt;br /&gt;
&lt;br /&gt;
== Built-in functions ==&lt;br /&gt;
* New options for [[GetProcessInfo]]: &amp;lt;code&amp;gt;&amp;quot;Number of monitors&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Current monitor rect&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Current monitor work rect&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Monitor «N» Rect&amp;quot;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;&amp;quot;Monitor «N» work rect&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* New optional parameter, «throwParsingErrors», to [[Evaluate]].&lt;br /&gt;
* [[ReadFromURL]] is a bit smarter about returning binary content (like &amp;lt;code&amp;gt;*.zip&amp;lt;/code&amp;gt; files) as a [[In-memory binary data terms|Binary Data Term]].&lt;br /&gt;
&lt;br /&gt;
== System variables ==&lt;br /&gt;
* SysVar [[Graph_ColorSequence]]: Replaces [[Graph_ColorSeq]] which is now deprecated. The new sysvar contains a list of color interer with one integer (of the form &amp;lt;code&amp;gt;0x00rrggbb&amp;lt;/code&amp;gt;) per color (whereas the deprecated used triples of numbers per color).&lt;br /&gt;
&lt;br /&gt;
== Model loading ==&lt;br /&gt;
When opening a model file, the &amp;quot;checking&amp;quot; stage (when attributes are parsed) parses different expressions on different threads, resulting in substantially faster model load times for very large models.&lt;br /&gt;
&lt;br /&gt;
Note: In the event that this creates a problem with your specific model (maybe due to an as-yet-undiscovered multithreading bug), you can disable it for your model as follows:&lt;br /&gt;
# Temporarily turn off multithreading (Skip this step if you are able to load your model)&lt;br /&gt;
## New model&lt;br /&gt;
## &amp;lt;b&amp;gt;Definition menu / System variables / Settings / Maximum evaluation threads&amp;lt;/b&amp;gt;&lt;br /&gt;
## Set to 1  (and remember the previous value)&lt;br /&gt;
# Open your model&lt;br /&gt;
# &amp;lt;b&amp;gt;Definition menu / System variables / Settings / Disable Multithreaded Evaluations&amp;lt;/b&amp;gt;&lt;br /&gt;
# Press the &amp;lt;code&amp;gt;Edit Table&amp;lt;/code&amp;gt; button.&lt;br /&gt;
# Check the checkbox for &amp;lt;code&amp;gt;Parsing&amp;lt;/code&amp;gt;&lt;br /&gt;
# Save your model&lt;br /&gt;
# &amp;lt;b&amp;gt;Definition menu / System variables / Settings / Maximum evaluation threads&amp;lt;/b&amp;gt;&lt;br /&gt;
#: Restore the original value from Step 1&lt;br /&gt;
&lt;br /&gt;
== MCP server ==&lt;br /&gt;
* Added an ability to install multiple ADE-based Mcp servers that run different ADE releases. For example, you can install two MCP servers into Claude Code:&lt;br /&gt;
* ade-server: Runs ADE 7.1&lt;br /&gt;
* ade-server-70: Runs ADE 7.0&lt;br /&gt;
The information in the &amp;lt;code&amp;gt;«ADE install folder»\Examples\Mcp_server\README.txt&amp;lt;/code&amp;gt; file explain how (with enough info for Claude code to configure this for you).  &lt;br /&gt;
&lt;br /&gt;
With both installed, Claude Code (or other MCP-enabled AI agents) can compare results for the same model across different releases, etc.&lt;br /&gt;
&lt;br /&gt;
Side note: The Mcp server was added to ADE 7.0.&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
This release has undergone massive internal restructuring and refactorization. Ideally (i.e., in the absence of bugs) these changes won't change functionality, but may alter some aspects of behavior, hopefully for the better.&lt;br /&gt;
* Internal data structures use for multi-dimensional arrays has been changed. Possible impacts:&lt;br /&gt;
** Likely to remove the sensitivity to the &amp;quot;canonical order&amp;quot; of indexes on evaluation speed.&lt;br /&gt;
** May change relative evaluation speeds of various functions and operations.&lt;br /&gt;
&lt;br /&gt;
== Discontinued... ==&lt;br /&gt;
* Plug-in functions. (An old hook that allows you to extend Analytica with compiled functions and UI elements written it C++. We are almost certain no one is using these hooks any more.)&lt;br /&gt;
* The sysvar [[Graph_ColorSeq]] is now deprecated (but works for both reading and setting to preserve backward compatibility). It has been replaced by the system variable [[Graph_ColorSequence]].&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Graph_ColorSequence&amp;diff=63885</id>
		<title>Graph ColorSequence</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Graph_ColorSequence&amp;diff=63885"/>
		<updated>2026-04-29T21:18:06Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: 16432 added this sysvar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:System Variables]]&lt;br /&gt;
[[Category: Graphs]]&lt;br /&gt;
&lt;br /&gt;
''New to [[Analytica 7.1]]''&lt;br /&gt;
&lt;br /&gt;
== SysVar Graph_ColorSequence ==&lt;br /&gt;
This system variable specifies the sequence of colors used for lines, symbols, or bars in graphs. (If the variable is not set, Analytica uses an internal default color sequence.) Each color is specified by [[Color parameters|color integer]] in which each color is specified as &amp;lt;code&amp;gt;0xaarrggbb&amp;lt;/code&amp;gt; (in hex notation) or &amp;lt;code&amp;gt;0x00rrggbb&amp;lt;/code&amp;gt; for fully opaque colors.&lt;br /&gt;
&lt;br /&gt;
You can modify the color sequence using &amp;quot;'Change series colors...''' on the right-mouse context menu for a key or sequence on a graph (i.e., right-click on a key symbol or a curve for the context menu).&lt;br /&gt;
&lt;br /&gt;
In your own code, you could modify the value by assigning to it a list of hex numbers and [[Color parameters|color names]]. E.g.,:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Graph_ColorSequence := [ 'blue', 0x0077F010, 'pink', 'green', 0x80C0C0FF, 'magenta',0x00000000 ]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example specifies only 7 colors. A graph needing more than 7 colors will repeat after the first 7. &lt;br /&gt;
&lt;br /&gt;
The colors in system variable, [[Graph_ColorSequence]] are the global default for all graphs.  You can override these colors for a single variable by assigning colors to [[Graph_ColorSequence]] in the [[GraphSetup]] attribute of the variable -- for variable X, for example:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;(GraphSetup of X := (GraphSetup of X) &amp;amp; chr(13)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;&amp;amp; &amp;quot;Graph_ColorSequence := [0x00FF0000, 0x0000FF00, 0x000000FF, 0x00FFFF00, 0x0000FFFF, 0x00FF00FF, 0x00000000]&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also specify the color sequence for a graph template by adding the assignment in the  [[GraphSetup]] attribute of the template, which will control the color sequence for every graph using that template -- for example for template T:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;(GraphSetup of T := (GraphSetup of T) &amp;amp; chr(13)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;&amp;amp; &amp;quot;Graph_ColorSequence := [0x00FF0000, 0x0000FF00, 0x000000FF, 0x00FFFF00, 0x0000FFFF, 0x00FF00FF, 0x00000000]&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* [[Graph_SymbolSeq]]&lt;br /&gt;
* [[Graph settings]]&lt;br /&gt;
* [[Graph Setting Associations]]&lt;br /&gt;
* [[Typescript]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Graph_ColorSeq&amp;diff=63884</id>
		<title>Graph ColorSeq</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Graph_ColorSeq&amp;diff=63884"/>
		<updated>2026-04-29T21:07:29Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: 16432 - deprecated by Graph_ColorSequence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:System Variables]]&lt;br /&gt;
[[Category: Graphs]]&lt;br /&gt;
&lt;br /&gt;
''As of [[Analytica 7.1]], this is deprecated. You should use [[Graph_ColorSequence]] instead.''&lt;br /&gt;
&lt;br /&gt;
{{ReleaseBar}}&lt;br /&gt;
&lt;br /&gt;
== SysVar Graph_ColorSeq ==&lt;br /&gt;
{{Release?|1=7.1|2=This legacy system variable provides a proxy view of the [[Graph_ColorSequence]] system variable but where each color requires a triplet numbers, giving the intensity of Red, Green and Blue (RGB), on a scale from 0 (off) to 65535 (maximum).  Thus, the value of [[Graph_ColorSeq]] is a tuple containing n triplets or 3n numbers. &lt;br /&gt;
&lt;br /&gt;
If you assign a new value in this form it automatically sets [[Graph_ColorSequence]] in the form it expects.  But unless you happen to be using legacy code written prior to [[Analytica 7.1]], your code should be reading or assigning to [[Graph_ColorSequence]] instead, which uses one [[Color parameters|Color integer]] per color.&lt;br /&gt;
|3=This system variable specifies the sequence of colors used for lines, symbols, or bars in graphs. (If the variable is not set, Analytica uses an internal default color sequence.) Each color is specified by a triplet of numbers, giving the intensity of Red, Green and Blue (RGB), on a scale from 0 (off) to 65535 (maximum).  Thus, the definition of [[Graph_ColorSeq]] is a tuple containing n triplets or 3n numbers. &lt;br /&gt;
&lt;br /&gt;
Analytica does not yet offer a graphical interface to modify color sequences. You can only set it via the [[Typescript]] window, or in a function called from a Button script. For example, you could enter the following into the Typescript:&lt;br /&gt;
:&amp;lt;code&amp;gt;Graph_ColorSeq: [65535,0,0, 0,65535,0, 0,0,65535, 65535,65535,0, 65535,0,65535, 0,65535,65535, 0,0,0]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These colors are red, green, blue, yellow, magenta, aqua, black, respectively. &lt;br /&gt;
&lt;br /&gt;
This example specifies only 7 colors. A graph needing more than 7 colors will repeat after the first 7. &lt;br /&gt;
&lt;br /&gt;
A color intensity can also be a negative value: It interprets -n as 65536-n. Thus, it treats -1 as 65535, i.e. totally on. &lt;br /&gt;
&lt;br /&gt;
The colors in system variable, [[Graph_ColorSeq]] are the global default for all graphs.  You can override these colors for a single variable by assigning RGB colors to [[Graph_ColorSeq]] in the [[GraphSetup]] attribute of the variable -- for variable X, for example:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;(GraphSetup of X := (GraphSetup of X) &amp;amp; chr(13)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;&amp;amp; &amp;quot;Graph_ColorSeq := [65535,0,0, 0,65535,0, 0,0,65535]&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also specify the color sequence for a graph template by adding the assignment in the  [[GraphSetup]] attribute of the template, which will control the color sequence for every graph using that template -- for example for template T:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;(GraphSetup of T := (GraphSetup of T) &amp;amp; chr(13)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;&amp;amp; &amp;quot;Graph_ColorSeq := [65535,0,0, 0,65535,0, 0,0,65535]&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* [[Graph_ColorSequence]]&lt;br /&gt;
* [[Graph_SymbolSeq]]&lt;br /&gt;
* [[Graph settings]]&lt;br /&gt;
* [[Graph Setting Associations]]&lt;br /&gt;
* [[Typescript]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Error_Messages/44053&amp;diff=63883</id>
		<title>Error Messages/44053</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Error_Messages/44053&amp;diff=63883"/>
		<updated>2026-04-28T17:37:53Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: Created page with &amp;quot;== Example error message == :In the call to KeelinCoefficients( ), there is only 1 usable quantile. A minumum of 2 is required.  == Description == Your data point index, the...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Example error message ==&lt;br /&gt;
:In the call to KeelinCoefficients( ), there is only 1 usable quantile. A minumum of 2 is required.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Your data point index, the «I» parameter to [[KeelinCoefficients]] (and likely the function you called) might be shorter than 2 elements, or it might be that the index is longer but only two points among your «values» and «percentiles» is non-Null.&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Unique&amp;diff=63882</id>
		<title>Unique</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Unique&amp;diff=63882"/>
		<updated>2026-04-28T17:01:10Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: /* mapToUnique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[Category:Functions that create lists]]&lt;br /&gt;
[[Category:Array Library]]&lt;br /&gt;
[[Category:Doc Status C]] &amp;lt;!-- For Lumina use, do not change --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
==Unique(a'', &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt;, position, caseInsensitive, resultIndex, mapToUnique, condition'')== &lt;br /&gt;
&lt;br /&gt;
Without the index parameter &amp;lt;code&amp;gt;«I»&amp;lt;/code&amp;gt;, it returns a list containing all the unique [[atom]]s in «a» (removing all duplicates). If «a» is a multidimensional array, the result the slices that are the unique across all dimensions.&lt;br /&gt;
&lt;br /&gt;
When an index &amp;lt;code&amp;gt;«I»&amp;lt;/code&amp;gt; is specified, it returns a subset of index &amp;lt;code&amp;gt;«I»&amp;lt;/code&amp;gt; where each [[slice]] of array «a»  along &amp;lt;code&amp;gt;«I»&amp;lt;/code&amp;gt;is unique. You can use it to remove duplicate slices from an array, or to identify a single member of each equivalence class.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
Let:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Variable DataSet :=&amp;lt;/code&amp;gt;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot; | Field &amp;amp;#9654;&lt;br /&gt;
|-&lt;br /&gt;
!PersonNum &amp;amp;#9660;'''&lt;br /&gt;
!LastName&lt;br /&gt;
!FirstName&lt;br /&gt;
!Company&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; |1&lt;br /&gt;
|Smith&lt;br /&gt;
|Bob&lt;br /&gt;
|Acme&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; |2&lt;br /&gt;
|Jones&lt;br /&gt;
|John&lt;br /&gt;
|Acme&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; |3&lt;br /&gt;
|Johnson&lt;br /&gt;
|Bob&lt;br /&gt;
|Floorworks&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; |4&lt;br /&gt;
|Smith&lt;br /&gt;
|Bob&lt;br /&gt;
|Acme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Then: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Unique(DataSet) &amp;amp;rarr; ['Smith', 'Jones', 'Johnson', 'Bob', 'John', 'Acme', 'Floorworks' ]&amp;lt;/code&amp;gt;  &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;{Requires [[Analytica 5.0]]}&amp;lt;/font&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;Unique(DataSet, PersonNum) &amp;amp;rarr; [1, 2, 3]&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;Unique(DataSet[Field = 'Company'], PersonNum) &amp;amp;rarr; [1, 3]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optional parameters ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; ===&lt;br /&gt;
The index parameter «&amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt;» is optional. When omitted, it finds the unique atomic values among all cells of «a». When specified, it returns values from «&amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt;» with unique values (slices). &lt;br /&gt;
&lt;br /&gt;
=== Position ===&lt;br /&gt;
By default, [[Unique]] returns the elements of the index.  If optional parameter «position»  is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;position: true&amp;lt;/code&amp;gt;) it returns the positions of the elements in &amp;lt;code&amp;gt;«I»&amp;lt;/code&amp;gt; , rather than their values (see [[Associative vs. Positional Indexing]]).&lt;br /&gt;
&lt;br /&gt;
This parameter is not used when the &amp;lt;code&amp;gt;«I»&amp;lt;/code&amp;gt; index parameter is omitted.&lt;br /&gt;
&lt;br /&gt;
===CaseInsensitive===&lt;br /&gt;
When applying [[Unique]] to text values, values are considered by default in a case-sensitive fashion,  for example, &amp;quot;Apple&amp;quot; and &amp;quot;apple&amp;quot; are considered distinct elements.  &lt;br /&gt;
&lt;br /&gt;
Specifying &amp;lt;code&amp;gt;caseInsensitive: true&amp;lt;/code&amp;gt; ignores differences in upper and lower case in text values when determining if values are unique.&lt;br /&gt;
&lt;br /&gt;
=== ResultIndex ===&lt;br /&gt;
&lt;br /&gt;
If you provide an Index &amp;lt;code&amp;gt;Result&amp;lt;/code&amp;gt; for parameter «ResultIndex», the resulting unique values are in an array indexed by &amp;lt;code&amp;gt;Result&amp;lt;/code&amp;gt;.  If &amp;lt;code&amp;gt;Result&amp;lt;/code&amp;gt; is shorter than the number of unique items, it omits the unique values after the first ''n'' items that fit, where ''n'' is the size of the index. When  &amp;lt;code&amp;gt;Result&amp;lt;/code&amp;gt; is too long, it fills out the extra cells with [[null]].&lt;br /&gt;
&lt;br /&gt;
«ResultIndex» is useful when you want to [[Array Abstraction|array abstract]]. For example, in a 2-D array &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;, you may want to identify the unique items along &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; separately for each item in index &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;For jj := J Do Unique(a[J = jj], I, resultIndex: I)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Without the «resultIndex» parameter, each iteration would return a list, and the [[For]] loop would then need to combine lists with incompatible implicit indexes, which would give an error. By ensuring that each result has an explicit index -- &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; in this example -- the results can be successfully combined.&lt;br /&gt;
&lt;br /&gt;
This [[For]] loop example is not equivalent to:&lt;br /&gt;
:&amp;lt;code&amp;gt;Unique(a, I, resultIndex: I)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The reason is that &amp;lt;code&amp;gt;Unique(a, I)&amp;lt;/code&amp;gt; compares entire [[slice]]s -- it isn't operating over each slice of the exogenous dimensions separately as most other array functions do.&lt;br /&gt;
&lt;br /&gt;
=== mapToUnique ===&lt;br /&gt;
&lt;br /&gt;
'''(new to [[Analytica 5.0]])'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Unique(A,I,mapToUnique:true)&amp;lt;/code&amp;gt; returns an array indexed by «I» which maps from each element of «I» back to the first element in A that has that same value. The first element with a given value maps to itself, and is the element that would have been returned if «mapToUnique» was not specified.  For example:&lt;br /&gt;
&lt;br /&gt;
::Index &amp;lt;code&amp;gt; I := 'a'..'e'&amp;lt;/code&amp;gt;&lt;br /&gt;
::Variable A := &amp;lt;code&amp;gt;[[Table]](I)(4,2,4,3,2)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;Unique(A, I, mapToUnique:true) &amp;amp;rarr; Array(I,['a','b','a','c','b'])&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;Unique(A, I, position:true, mapToUnique:true) &amp;amp;rarr; Array(I,[1,2,1,3,2])&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One situation where this is useful is when you use &amp;lt;code&amp;gt;Unique(A,I)&amp;lt;/code&amp;gt; to find the unique slices, so that you can compute an expensive function only on the unique slices. But then you figure out which result to use for each of the other slices, which «mapToUnique» gives you.&lt;br /&gt;
&lt;br /&gt;
Since «mapToUnique» returns the position along «&amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt;», you must specify the index «&amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt;» when using «mapToUnique».&lt;br /&gt;
&lt;br /&gt;
=== condition ===&lt;br /&gt;
'''(new to [[Analytica 5.3]])'''&lt;br /&gt;
&lt;br /&gt;
When you specify «condition», it finds the unique values from only those items that match the «condition». For example, if you don't want to include [[Null]] values, you can use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[[Unique]](A, condition:A&amp;lt;&amp;gt;Null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or to find only unique text values (when there might be other data types present such as numbers):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[[Unique]](A, condition:[[IsText]](A))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When «mapToUnique» is true, [[Null]] is returned for unmatched items along «I». When «condition» has an index not present in «A», the item of «A» is included if «condition» is true anywhere along that extra index.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
The [[Set Functions]] such as [[SetDifference]] or [[SetUnion]] ensure that no duplicates exist in the final result, and hence can also be used to find the unique elements. For example, when &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; is a 1-D array or list&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;#SetDifference(\L)&amp;lt;/code&amp;gt;&lt;br /&gt;
and &lt;br /&gt;
:&amp;lt;code&amp;gt;Unique(L)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
do the same thing. Since no set is being subtracted, [[SetDifference]] returns the set &amp;lt;code&amp;gt;\L&amp;lt;/code&amp;gt; after duplicates are removed.  In some instances, [[SetDifference]] has advantages over [[Unique]]. For example, if you also want to ignore certain values, including [[Null]] or others, you could compute the unique elements and then follow that with a call to [[SetDifference]] to remove the other values, but when so doing, you might as well skip the call to [[Unique]] entirely since [[SetDifference]] already does that for you.&lt;br /&gt;
&lt;br /&gt;
The ordering of elements in the result follows the ordering of the elements in «a», which often feels arbitrary. Hence, it is common to wrap the call to [[Unique]] is a call to [[SortIndex]] such as&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;SortIndex(Unique(a))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
The «&amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt;» parameter was first made optional in [[Analytica 5.0]]. Prior to that, the &amp;lt;code&amp;gt;Unique(a)&amp;lt;/code&amp;gt; usage was not available. Without to omitted index, use &amp;lt;code&amp;gt;a[I = Unique(a, I)]&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;#SetDifference(\a)&amp;lt;/code&amp;gt; to define an index.&lt;br /&gt;
&lt;br /&gt;
The «mapToUnique» parameter was introduced in [[Analytica 5.0]].&lt;br /&gt;
&lt;br /&gt;
The «resultIndex» parameter is present in [[Analytica 4.3]] and later, but hidden (doesn't show up in [[Expression Assist]], etc.) until [[Analytica 5.0]]. You can still use it in those earlier releases even though it is hidden.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[SortIndex]]&lt;br /&gt;
* [[Subset]]&lt;br /&gt;
* [[Set Functions]] -- These also remove duplicates from their results.&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Error_Messages/43024&amp;diff=63881</id>
		<title>Error Messages/43024</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Error_Messages/43024&amp;diff=63881"/>
		<updated>2026-04-25T17:31:42Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: Created page with &amp;quot;== Example error message ==  :The Definition of Doc_section_embeddings contains an undefined identifier, Read_Vector_DB_For.   :There is an object Vector_DB_library::Read_Vect...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Example error message ==&lt;br /&gt;
&lt;br /&gt;
:The Definition of Doc_section_embeddings contains an undefined identifier, Read_Vector_DB_For.&lt;br /&gt;
 &lt;br /&gt;
:There is an object Vector_DB_library::Read_Vector_DB_For, but it is not visible from Doc_section_embeddings. This may be because the Vector_DB_library namespace is not imported by the AI_Assistant_Framework namespace, or because its namespace scope is Private.&lt;br /&gt;
 &lt;br /&gt;
:Would you like to edit the Definition of Doc_section_embeddings?&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
The extra details in the second paragraph of this error can vary, but the cause is always that an identifier used within an expression is not recognized. It might be that no object with that identifier exists (e.g., perhaps you have a mis-spelling in your expression) or it might happen (as with the example) that the object is out-of-scope (e.g., in a private [[Namespaces|namespace]]. &lt;br /&gt;
&lt;br /&gt;
== Bringing the object into scope ==&lt;br /&gt;
If it says the object exists but is not visible from your expression's [[Namespaces|namespace]], you have a few options. &lt;br /&gt;
&lt;br /&gt;
=== Importing the target namespace  ===&lt;br /&gt;
&lt;br /&gt;
The first option would be to import the object's namespace into your expression's namespace. First, you'll have to figure out what module is the namespace of your expression. It is probably your top-level model, which we'll assume in the next expression. Then you add the target namespace to your namespace's &amp;lt;code&amp;gt;NamespaceImports&amp;lt;/code&amp;gt; attribute, listing each import an a separate line. You can do this programmatically with an expression like: &lt;br /&gt;
&lt;br /&gt;
 ( NamespaceImports of (Sys_TopLevelModel) :=  [[JoinText]]([namespaceimports of (Sys_TopLevelModel),&amp;quot;hello&amp;quot;],,Chr(13)) )&lt;br /&gt;
&lt;br /&gt;
If you do this from the [[Typescript|Typescript console window]], the parenthesis around the full expression is required (so that it interprets it as an expression, evaluating the right-hand side prior to the assignment). The parenthesis around &amp;lt;code&amp;gt;(Sys_TopLevelModel)&amp;lt;/code&amp;gt; are also essential here since we are setting the attribute of the object pointed to by &amp;lt;code&amp;gt;Sys_TopLevelModel&amp;lt;/code&amp;gt; not the attribute of &amp;lt;code&amp;gt;Sys_TopLevelModel&amp;lt;/code&amp;gt; itself. The use of [[JoinText]] here works in the case you are appending to the end and in the case where this is the first assignment to the attribute. &lt;br /&gt;
&lt;br /&gt;
=== Using a qualified name ===&lt;br /&gt;
Another option is to replace the (unqualified) identifier in your expression, &amp;lt;code&amp;gt;Read_Vector_DB_For&amp;lt;/code&amp;gt; in the example, with a qualified name (which specifies a namespace path to the object). In this case, the replacement would be &amp;lt;code&amp;gt;Vector_DB_library::Read_Vector_DB_For&amp;lt;/code&amp;gt;. The namespace path starts with an identifier that ''is'' in scope.&lt;br /&gt;
&lt;br /&gt;
This brings the identifier into scope in two important cases: (1) When the namespace itself wasn't imported, and (2) when the namespace was imported but the target object itself has a &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt; namespace scope. In the second case, when an object has a private namespace scope it usually means that the author of the library did not intend for you to use the object directly, so you should likely reconsider using that object in the first place (e.g., it may be subject to change in the future). &lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Namespaces]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Right_mouse_button_menus&amp;diff=63876</id>
		<title>Right mouse button menus</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Right_mouse_button_menus&amp;diff=63876"/>
		<updated>2026-04-21T14:55:57Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: An extra assista key&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Analytica User Guide]] &lt;br /&gt;
[[Category: Menus]]&lt;br /&gt;
{{ReleaseBar}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;breadcrumbs&amp;gt;Analytica User Guide &amp;gt; Menus &amp;gt; {{PAGENAME}}&amp;lt;/breadcrumbs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This menu appears when you click your right mouse button on one or more nodes, a diagram background, or in other windows&lt;br /&gt;
&lt;br /&gt;
The list of commands depends on the context. &lt;br /&gt;
&lt;br /&gt;
=== Variable node context menu in edit mode ===&lt;br /&gt;
The menu displayed below is what you get when you right-click a node. &lt;br /&gt;
 &lt;br /&gt;
{{Assista|key|Group or ungroup nodes}}&lt;br /&gt;
{{Assista|key|Change node visibility to hide node in browse mode}}&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
| rowspan=&amp;quot;53&amp;quot; | {{Release||6.4|[[File: Menus_14_6.3.png]]}}{{Release|6.5||[[Image:NodeContextMenu6.5.png]]}}&lt;br /&gt;
 ! style=&amp;quot;width: 180px;&amp;quot; | Menu item &lt;br /&gt;
! Description &lt;br /&gt;
|- &lt;br /&gt;
|Undo &lt;br /&gt;
|Undo your last action. “Can’t Undo” appears in this location if an undo is not possible. &lt;br /&gt;
|- &lt;br /&gt;
|Cut &lt;br /&gt;
|Cut the selected text, node(s), or table cells into the clipboard temporarily for pasting. &lt;br /&gt;
|-  &lt;br /&gt;
|Copy &lt;br /&gt;
|Copy the selected text, node(s), graph, or table cells into the clipboard so that you can paste them somewhere else. See [[Copy and Paste between applications#Copying_and_Pasting|Copying and Pasting]].&lt;br /&gt;
|-&lt;br /&gt;
|Paste&lt;br /&gt;
|Paste the contents of the clipboard at the insertion point in a text, diagram, or table, or replaces the current selection. See [[Copy and Paste between applications#Copying_and_Pasting|Copying and Pasting]].&lt;br /&gt;
|- &lt;br /&gt;
|Select All &lt;br /&gt;
|Select all the text in an attribute field, all the nodes in a diagram, or all the cells in a table. &lt;br /&gt;
|- &lt;br /&gt;
|Duplicate Nodes &lt;br /&gt;
|Duplicate the selected node(s) onto the same diagram. See “Duplicate nodes” in [[Create and edit nodes]]. &lt;br /&gt;
|- &lt;br /&gt;
|Make Alias&lt;br /&gt;
|Create an [[Alias_nodes|Alias]] of the node.&lt;br /&gt;
|-&lt;br /&gt;
| Make User Input Node&lt;br /&gt;
| Create a [[User input node]] for the currently selected variable.&lt;br /&gt;
|-&lt;br /&gt;
| Make User Output Node&lt;br /&gt;
| Create a [[User output node]] for the currently selected variable.&lt;br /&gt;
|-&lt;br /&gt;
| Group nodes&lt;br /&gt;
| (New to [[Analytica 6.5]]) Combines the selected nodes such that the nodes will get selected as a single unit. The primary selection (the node with solid handles) becomes the primary node of the group, so that its information is shown in the [[Attribute panel]], and for many commands it serves as the selected node.&lt;br /&gt;
|-&lt;br /&gt;
| Ungroup nodes&lt;br /&gt;
| (New to [[Analytica 6.5]])  Ungroups nodes that were previously grouped.&lt;br /&gt;
|-&lt;br /&gt;
|Copy Diagram  &lt;br /&gt;
|When a Diagram window is active, copy a picture of the diagram for pasting into a graphics application.  See [[Copy and Paste between applications#Copying_and_Pasting|Copying and Pasting]]. &lt;br /&gt;
|- &lt;br /&gt;
|Preferences &lt;br /&gt;
|Open the [[Preferences dialog]] to examine or change various options. &lt;br /&gt;
|- &lt;br /&gt;
|Edit Definition &lt;br /&gt;
|Open the appropriate view for editing the definition of the selected variable. If the variable is defined as a distribution or sequence, the Object Finder opens. If it is defined as a table or probability table, its edit table window opens. Otherwise, an [[Object window]] or [[Attribute panel]] opens, depending on the Edit attributes setting in the [[Preferences dialog]]. &lt;br /&gt;
|- &lt;br /&gt;
|Show Result &lt;br /&gt;
|Open a Result window for the selected object. See [[Result window]]. &lt;br /&gt;
|- &lt;br /&gt;
|Bring to Front &lt;br /&gt;
|Bring the selected object(s) to the front of the drawing order so that if  the object(s) overlap any other elements, the object is visible.  This menu option appears only when you right-click one or more nodes. ''This is the  only way to move some nodes in front of others.'' &lt;br /&gt;
|- &lt;br /&gt;
|Send to Back &lt;br /&gt;
|Send the selected object(s) to the back of the drawing order so that the  selected object(s) are drawn behind any overlapping elements.  This menu option appears only when you right-click one or more nodes. ''This is the  only way to move some nodes behind the others.'' &lt;br /&gt;
|- &lt;br /&gt;
|Hide in Browse&lt;br /&gt;
|Sets the node visibility to Hidden in browse mode. Same as [[ChangeNodeVisibility#.C2.ABoption.C2.BB_parameter|ChangeNodeVisibility(handle(node),'Hidden in browse')]]&lt;br /&gt;
|-&lt;br /&gt;
|Align &lt;br /&gt;
|Open the [[Diagram_menu#Align_submenu|Align submenu]]. &lt;br /&gt;
|- &lt;br /&gt;
|Make Same Size &lt;br /&gt;
|Open the [[Diagram_menu#Make_Same_Size_submenu|Make Same Size submenu]]. &lt;br /&gt;
|- &lt;br /&gt;
|Space Evenly &lt;br /&gt;
|Open the [[Diagram_menu#Space_Evenly_submenu|Space Evenly submenu]].&lt;br /&gt;
|- &lt;br /&gt;
|Set Diagram Style &lt;br /&gt;
|Display a Diagram style dialog to set default arrow displays, node size, and font for this diagram. See [[Diagram Style dialog]].&lt;br /&gt;
|- &lt;br /&gt;
|Set Node Style &lt;br /&gt;
|Display Node style dialog to set arrow display and font for the selected node(s). See [[Node Style dialog]]. &lt;br /&gt;
|- &lt;br /&gt;
|Show / Hide Color Palette &lt;br /&gt;
|Display the color palette to set the color of the diagram background or of selected nodes. See  “Recoloring nodes or background” in [[Color in influence diagrams]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button node context menu in edit mode ===&lt;br /&gt;
The menu displayed below is what you get when you right-click a button. &lt;br /&gt;
 &lt;br /&gt;
{{Assista|key|Configure the button to proactively evaluate when the model is loaded}}&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
| rowspan=&amp;quot;51&amp;quot; | [[File: Menus_15.png]]&lt;br /&gt;
 ! style=&amp;quot;width: 180px;&amp;quot; | Menu item &lt;br /&gt;
! Description &lt;br /&gt;
|- &lt;br /&gt;
|Undo &lt;br /&gt;
|Undo your last action. “Can’t Undo” appears in this location if an undo is not possible. &lt;br /&gt;
|- &lt;br /&gt;
|Cut &lt;br /&gt;
|Cut the selected text, node(s), or table cells into the clipboard temporarily for pasting. &lt;br /&gt;
|-  &lt;br /&gt;
|Copy &lt;br /&gt;
|Copy the selected text, node(s), graph, or table cells into the clipboard so that you can paste them somewhere else. See [[Copy and Paste between applications#Copying_and_Pasting|Copying and Pasting]].&lt;br /&gt;
|-&lt;br /&gt;
|Paste&lt;br /&gt;
|Paste the contents of the clipboard at the insertion point in a text, diagram, or table, or replaces the current selection. See [[Copy and Paste between applications#Copying_and_Pasting|Copying and Pasting]].&lt;br /&gt;
|- &lt;br /&gt;
|Select All &lt;br /&gt;
|Select all the text in an attribute field, all the nodes in a diagram, or all the cells in a table. &lt;br /&gt;
|- &lt;br /&gt;
|Duplicate Nodes &lt;br /&gt;
|Duplicate the selected node(s) onto the same diagram. See “Duplicate nodes” in [[Create and edit nodes]]. &lt;br /&gt;
|- &lt;br /&gt;
|Make Alias&lt;br /&gt;
|Create an [[Alias_nodes|Alias]] of the node.&lt;br /&gt;
|-&lt;br /&gt;
|Copy Diagram  &lt;br /&gt;
|When a Diagram window is active, copy a picture of the diagram for pasting into a graphics application.  See [[Copy and Paste between applications#Copying_and_Pasting|Copying and Pasting]]. &lt;br /&gt;
|- &lt;br /&gt;
|Preferences &lt;br /&gt;
|Open the [[Preferences dialog]] to examine or change various options. &lt;br /&gt;
|- &lt;br /&gt;
|Edit On click&lt;br /&gt;
|Open the appropriate view for editing the onclick of the selected button. &lt;br /&gt;
|- &lt;br /&gt;
|Run Onclick&lt;br /&gt;
|Execute the on-click of the selected button. Same as pressing the button in browse mode.&lt;br /&gt;
|- &lt;br /&gt;
|Run at load time&lt;br /&gt;
|Sets the [[Proactive_Evaluation|proactivelyevaluate]] attribute of the button to 32, so the onclick is evaluated when the model is loaded.&lt;br /&gt;
|-&lt;br /&gt;
|Bring to Front &lt;br /&gt;
|Bring the selected object(s) to the front of the drawing order so that if  the object(s) overlap any other elements, the object is visible.  This menu option appears only when you right-click one or more nodes. ''This is the  only way to move some nodes in front of others.'' &lt;br /&gt;
|- &lt;br /&gt;
|Send to Back &lt;br /&gt;
|Send the selected object(s) to the back of the drawing order so that the  selected object(s) are drawn behind any overlapping elements.  This menu option appears only when you right-click one or more nodes. ''This is the  only way to move some nodes behind the others.'' &lt;br /&gt;
|- &lt;br /&gt;
|Align &lt;br /&gt;
|Open the [[Diagram_menu#Align_submenu|Align submenu]]. &lt;br /&gt;
|- &lt;br /&gt;
|Make Same Size &lt;br /&gt;
|Open the [[Diagram_menu#Make_Same_Size_submenu|Make Same Size submenu]]. &lt;br /&gt;
|- &lt;br /&gt;
|Space Evenly &lt;br /&gt;
|Open the [[Diagram_menu#Space_Evenly_submenu|Space Evenly submenu]].&lt;br /&gt;
|- &lt;br /&gt;
|Set Diagram Style &lt;br /&gt;
|Display a Diagram style dialog to set default arrow displays, node size, and font for this diagram. See [[Diagram Style dialog]].&lt;br /&gt;
|- &lt;br /&gt;
|Set Node Style &lt;br /&gt;
|Display Node style dialog to set arrow display and font for the selected node(s). See [[Node Style dialog]]. &lt;br /&gt;
|- &lt;br /&gt;
|Show / Hide Color Palette &lt;br /&gt;
|Display the color palette to set the color of the diagram background or of selected nodes. See  “Recoloring nodes or background” in [[Color in influence diagrams]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[Menus]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Right_mouse_button_menus&amp;diff=63875</id>
		<title>Right mouse button menus</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Right_mouse_button_menus&amp;diff=63875"/>
		<updated>2026-04-21T14:54:38Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: Some additional assista keys&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Analytica User Guide]] &lt;br /&gt;
[[Category: Menus]]&lt;br /&gt;
{{ReleaseBar}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;breadcrumbs&amp;gt;Analytica User Guide &amp;gt; Menus &amp;gt; {{PAGENAME}}&amp;lt;/breadcrumbs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This menu appears when you click your right mouse button on one or more nodes, a diagram background, or in other windows&lt;br /&gt;
&lt;br /&gt;
The list of commands depends on the context. &lt;br /&gt;
&lt;br /&gt;
=== Variable node context menu in edit mode ===&lt;br /&gt;
The menu displayed below is what you get when you right-click a node. &lt;br /&gt;
 &lt;br /&gt;
{{Assista|key|Group or ungroup nodes}}&lt;br /&gt;
{{Assista|key|Change node visibility to hide node in browse mode}}&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
| rowspan=&amp;quot;53&amp;quot; | {{Release||6.4|[[File: Menus_14_6.3.png]]}}{{Release|6.5||[[Image:NodeContextMenu6.5.png]]}}&lt;br /&gt;
 ! style=&amp;quot;width: 180px;&amp;quot; | Menu item &lt;br /&gt;
! Description &lt;br /&gt;
|- &lt;br /&gt;
|Undo &lt;br /&gt;
|Undo your last action. “Can’t Undo” appears in this location if an undo is not possible. &lt;br /&gt;
|- &lt;br /&gt;
|Cut &lt;br /&gt;
|Cut the selected text, node(s), or table cells into the clipboard temporarily for pasting. &lt;br /&gt;
|-  &lt;br /&gt;
|Copy &lt;br /&gt;
|Copy the selected text, node(s), graph, or table cells into the clipboard so that you can paste them somewhere else. See [[Copy and Paste between applications#Copying_and_Pasting|Copying and Pasting]].&lt;br /&gt;
|-&lt;br /&gt;
|Paste&lt;br /&gt;
|Paste the contents of the clipboard at the insertion point in a text, diagram, or table, or replaces the current selection. See [[Copy and Paste between applications#Copying_and_Pasting|Copying and Pasting]].&lt;br /&gt;
|- &lt;br /&gt;
|Select All &lt;br /&gt;
|Select all the text in an attribute field, all the nodes in a diagram, or all the cells in a table. &lt;br /&gt;
|- &lt;br /&gt;
|Duplicate Nodes &lt;br /&gt;
|Duplicate the selected node(s) onto the same diagram. See “Duplicate nodes” in [[Create and edit nodes]]. &lt;br /&gt;
|- &lt;br /&gt;
|Make Alias&lt;br /&gt;
|Create an [[Alias_nodes|Alias]] of the node.&lt;br /&gt;
|-&lt;br /&gt;
| Make User Input Node&lt;br /&gt;
| Create a [[User input node]] for the currently selected variable.&lt;br /&gt;
|-&lt;br /&gt;
| Make User Output Node&lt;br /&gt;
| Create a [[User output node]] for the currently selected variable.&lt;br /&gt;
|-&lt;br /&gt;
| Group nodes&lt;br /&gt;
| (New to [[Analytica 6.5]]) Combines the selected nodes such that the nodes will get selected as a single unit. The primary selection (the node with solid handles) becomes the primary node of the group, so that its information is shown in the [[Attribute panel]], and for many commands it serves as the selected node.&lt;br /&gt;
|-&lt;br /&gt;
| Ungroup nodes&lt;br /&gt;
| (New to [[Analytica 6.5]])  Ungroups nodes that were previously grouped.&lt;br /&gt;
|-&lt;br /&gt;
|Copy Diagram  &lt;br /&gt;
|When a Diagram window is active, copy a picture of the diagram for pasting into a graphics application.  See [[Copy and Paste between applications#Copying_and_Pasting|Copying and Pasting]]. &lt;br /&gt;
|- &lt;br /&gt;
|Preferences &lt;br /&gt;
|Open the [[Preferences dialog]] to examine or change various options. &lt;br /&gt;
|- &lt;br /&gt;
|Edit Definition &lt;br /&gt;
|Open the appropriate view for editing the definition of the selected variable. If the variable is defined as a distribution or sequence, the Object Finder opens. If it is defined as a table or probability table, its edit table window opens. Otherwise, an [[Object window]] or [[Attribute panel]] opens, depending on the Edit attributes setting in the [[Preferences dialog]]. &lt;br /&gt;
|- &lt;br /&gt;
|Show Result &lt;br /&gt;
|Open a Result window for the selected object. See [[Result window]]. &lt;br /&gt;
|- &lt;br /&gt;
|Bring to Front &lt;br /&gt;
|Bring the selected object(s) to the front of the drawing order so that if  the object(s) overlap any other elements, the object is visible.  This menu option appears only when you right-click one or more nodes. ''This is the  only way to move some nodes in front of others.'' &lt;br /&gt;
|- &lt;br /&gt;
|Send to Back &lt;br /&gt;
|Send the selected object(s) to the back of the drawing order so that the  selected object(s) are drawn behind any overlapping elements.  This menu option appears only when you right-click one or more nodes. ''This is the  only way to move some nodes behind the others.'' &lt;br /&gt;
|- &lt;br /&gt;
|Hide in Browse&lt;br /&gt;
|Sets the node visibility to Hidden in browse mode. Same as [[ChangeNodeVisibility#.C2.ABoption.C2.BB_parameter|ChangeNodeVisibility(handle(node),'Hidden in browse')]]&lt;br /&gt;
|-&lt;br /&gt;
|Align &lt;br /&gt;
|Open the [[Diagram_menu#Align_submenu|Align submenu]]. &lt;br /&gt;
|- &lt;br /&gt;
|Make Same Size &lt;br /&gt;
|Open the [[Diagram_menu#Make_Same_Size_submenu|Make Same Size submenu]]. &lt;br /&gt;
|- &lt;br /&gt;
|Space Evenly &lt;br /&gt;
|Open the [[Diagram_menu#Space_Evenly_submenu|Space Evenly submenu]].&lt;br /&gt;
|- &lt;br /&gt;
|Set Diagram Style &lt;br /&gt;
|Display a Diagram style dialog to set default arrow displays, node size, and font for this diagram. See [[Diagram Style dialog]].&lt;br /&gt;
|- &lt;br /&gt;
|Set Node Style &lt;br /&gt;
|Display Node style dialog to set arrow display and font for the selected node(s). See [[Node Style dialog]]. &lt;br /&gt;
|- &lt;br /&gt;
|Show / Hide Color Palette &lt;br /&gt;
|Display the color palette to set the color of the diagram background or of selected nodes. See  “Recoloring nodes or background” in [[Color in influence diagrams]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button node context menu in edit mode ===&lt;br /&gt;
The menu displayed below is what you get when you right-click a button. &lt;br /&gt;
 &lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
| rowspan=&amp;quot;51&amp;quot; | [[File: Menus_15.png]]&lt;br /&gt;
 ! style=&amp;quot;width: 180px;&amp;quot; | Menu item &lt;br /&gt;
! Description &lt;br /&gt;
|- &lt;br /&gt;
|Undo &lt;br /&gt;
|Undo your last action. “Can’t Undo” appears in this location if an undo is not possible. &lt;br /&gt;
|- &lt;br /&gt;
|Cut &lt;br /&gt;
|Cut the selected text, node(s), or table cells into the clipboard temporarily for pasting. &lt;br /&gt;
|-  &lt;br /&gt;
|Copy &lt;br /&gt;
|Copy the selected text, node(s), graph, or table cells into the clipboard so that you can paste them somewhere else. See [[Copy and Paste between applications#Copying_and_Pasting|Copying and Pasting]].&lt;br /&gt;
|-&lt;br /&gt;
|Paste&lt;br /&gt;
|Paste the contents of the clipboard at the insertion point in a text, diagram, or table, or replaces the current selection. See [[Copy and Paste between applications#Copying_and_Pasting|Copying and Pasting]].&lt;br /&gt;
|- &lt;br /&gt;
|Select All &lt;br /&gt;
|Select all the text in an attribute field, all the nodes in a diagram, or all the cells in a table. &lt;br /&gt;
|- &lt;br /&gt;
|Duplicate Nodes &lt;br /&gt;
|Duplicate the selected node(s) onto the same diagram. See “Duplicate nodes” in [[Create and edit nodes]]. &lt;br /&gt;
|- &lt;br /&gt;
|Make Alias&lt;br /&gt;
|Create an [[Alias_nodes|Alias]] of the node.&lt;br /&gt;
|-&lt;br /&gt;
|Copy Diagram  &lt;br /&gt;
|When a Diagram window is active, copy a picture of the diagram for pasting into a graphics application.  See [[Copy and Paste between applications#Copying_and_Pasting|Copying and Pasting]]. &lt;br /&gt;
|- &lt;br /&gt;
|Preferences &lt;br /&gt;
|Open the [[Preferences dialog]] to examine or change various options. &lt;br /&gt;
|- &lt;br /&gt;
|Edit On click&lt;br /&gt;
|Open the appropriate view for editing the onclick of the selected button. &lt;br /&gt;
|- &lt;br /&gt;
|Run Onclick&lt;br /&gt;
|Execute the on-click of the selected button. Same as pressing the button in browse mode.&lt;br /&gt;
|- &lt;br /&gt;
|Run at load time&lt;br /&gt;
|Sets the [[Proactive_Evaluation|proactivelyevaluate]] attribute of the button to 32, so the onclick is evaluated when the model is loaded.&lt;br /&gt;
|-&lt;br /&gt;
|Bring to Front &lt;br /&gt;
|Bring the selected object(s) to the front of the drawing order so that if  the object(s) overlap any other elements, the object is visible.  This menu option appears only when you right-click one or more nodes. ''This is the  only way to move some nodes in front of others.'' &lt;br /&gt;
|- &lt;br /&gt;
|Send to Back &lt;br /&gt;
|Send the selected object(s) to the back of the drawing order so that the  selected object(s) are drawn behind any overlapping elements.  This menu option appears only when you right-click one or more nodes. ''This is the  only way to move some nodes behind the others.'' &lt;br /&gt;
|- &lt;br /&gt;
|Align &lt;br /&gt;
|Open the [[Diagram_menu#Align_submenu|Align submenu]]. &lt;br /&gt;
|- &lt;br /&gt;
|Make Same Size &lt;br /&gt;
|Open the [[Diagram_menu#Make_Same_Size_submenu|Make Same Size submenu]]. &lt;br /&gt;
|- &lt;br /&gt;
|Space Evenly &lt;br /&gt;
|Open the [[Diagram_menu#Space_Evenly_submenu|Space Evenly submenu]].&lt;br /&gt;
|- &lt;br /&gt;
|Set Diagram Style &lt;br /&gt;
|Display a Diagram style dialog to set default arrow displays, node size, and font for this diagram. See [[Diagram Style dialog]].&lt;br /&gt;
|- &lt;br /&gt;
|Set Node Style &lt;br /&gt;
|Display Node style dialog to set arrow display and font for the selected node(s). See [[Node Style dialog]]. &lt;br /&gt;
|- &lt;br /&gt;
|Show / Hide Color Palette &lt;br /&gt;
|Display the color palette to set the color of the diagram background or of selected nodes. See  “Recoloring nodes or background” in [[Color in influence diagrams]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[Menus]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Right_mouse_button_menus&amp;diff=63874</id>
		<title>Right mouse button menus</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Right_mouse_button_menus&amp;diff=63874"/>
		<updated>2026-04-21T14:49:42Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Analytica User Guide]] &lt;br /&gt;
[[Category: Menus]]&lt;br /&gt;
{{ReleaseBar}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;breadcrumbs&amp;gt;Analytica User Guide &amp;gt; Menus &amp;gt; {{PAGENAME}}&amp;lt;/breadcrumbs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This menu appears when you click your right mouse button on one or more nodes, a diagram background, or in other windows&lt;br /&gt;
&lt;br /&gt;
The list of commands depends on the context. &lt;br /&gt;
&lt;br /&gt;
=== Variable node context menu in edit mode ===&lt;br /&gt;
The menu displayed below is what you get when you right-click a node. &lt;br /&gt;
 &lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
| rowspan=&amp;quot;53&amp;quot; | {{Release||6.4|[[File: Menus_14_6.3.png]]}}{{Release|6.5||[[Image:NodeContextMenu6.5.png]]}}&lt;br /&gt;
 ! style=&amp;quot;width: 180px;&amp;quot; | Menu item &lt;br /&gt;
! Description &lt;br /&gt;
|- &lt;br /&gt;
|Undo &lt;br /&gt;
|Undo your last action. “Can’t Undo” appears in this location if an undo is not possible. &lt;br /&gt;
|- &lt;br /&gt;
|Cut &lt;br /&gt;
|Cut the selected text, node(s), or table cells into the clipboard temporarily for pasting. &lt;br /&gt;
|-  &lt;br /&gt;
|Copy &lt;br /&gt;
|Copy the selected text, node(s), graph, or table cells into the clipboard so that you can paste them somewhere else. See [[Copy and Paste between applications#Copying_and_Pasting|Copying and Pasting]].&lt;br /&gt;
|-&lt;br /&gt;
|Paste&lt;br /&gt;
|Paste the contents of the clipboard at the insertion point in a text, diagram, or table, or replaces the current selection. See [[Copy and Paste between applications#Copying_and_Pasting|Copying and Pasting]].&lt;br /&gt;
|- &lt;br /&gt;
|Select All &lt;br /&gt;
|Select all the text in an attribute field, all the nodes in a diagram, or all the cells in a table. &lt;br /&gt;
|- &lt;br /&gt;
|Duplicate Nodes &lt;br /&gt;
|Duplicate the selected node(s) onto the same diagram. See “Duplicate nodes” in [[Create and edit nodes]]. &lt;br /&gt;
|- &lt;br /&gt;
|Make Alias&lt;br /&gt;
|Create an [[Alias_nodes|Alias]] of the node.&lt;br /&gt;
|-&lt;br /&gt;
| Make User Input Node&lt;br /&gt;
| Create a [[User input node]] for the currently selected variable.&lt;br /&gt;
|-&lt;br /&gt;
| Make User Output Node&lt;br /&gt;
| Create a [[User output node]] for the currently selected variable.&lt;br /&gt;
|-&lt;br /&gt;
| Group nodes&lt;br /&gt;
| (New to [[Analytica 6.5]]) Combines the selected nodes such that the nodes will get selected as a single unit. The primary selection (the node with solid handles) becomes the primary node of the group, so that its information is shown in the [[Attribute panel]], and for many commands it serves as the selected node.&lt;br /&gt;
|-&lt;br /&gt;
| Ungroup nodes&lt;br /&gt;
| (New to [[Analytica 6.5]])  Ungroups nodes that were previously grouped.&lt;br /&gt;
|-&lt;br /&gt;
|Copy Diagram  &lt;br /&gt;
|When a Diagram window is active, copy a picture of the diagram for pasting into a graphics application.  See [[Copy and Paste between applications#Copying_and_Pasting|Copying and Pasting]]. &lt;br /&gt;
|- &lt;br /&gt;
|Preferences &lt;br /&gt;
|Open the [[Preferences dialog]] to examine or change various options. &lt;br /&gt;
|- &lt;br /&gt;
|Edit Definition &lt;br /&gt;
|Open the appropriate view for editing the definition of the selected variable. If the variable is defined as a distribution or sequence, the Object Finder opens. If it is defined as a table or probability table, its edit table window opens. Otherwise, an [[Object window]] or [[Attribute panel]] opens, depending on the Edit attributes setting in the [[Preferences dialog]]. &lt;br /&gt;
|- &lt;br /&gt;
|Show Result &lt;br /&gt;
|Open a Result window for the selected object. See [[Result window]]. &lt;br /&gt;
|- &lt;br /&gt;
|Bring to Front &lt;br /&gt;
|Bring the selected object(s) to the front of the drawing order so that if  the object(s) overlap any other elements, the object is visible.  This menu option appears only when you right-click one or more nodes. ''This is the  only way to move some nodes in front of others.'' &lt;br /&gt;
|- &lt;br /&gt;
|Send to Back &lt;br /&gt;
|Send the selected object(s) to the back of the drawing order so that the  selected object(s) are drawn behind any overlapping elements.  This menu option appears only when you right-click one or more nodes. ''This is the  only way to move some nodes behind the others.'' &lt;br /&gt;
|- &lt;br /&gt;
|Hide in Browse&lt;br /&gt;
|Sets the node visibility to Hidden in browse mode. Same as [[ChangeNodeVisibility#.C2.ABoption.C2.BB_parameter|ChangeNodeVisibility(handle(node),'Hidden in browse')]]&lt;br /&gt;
|-&lt;br /&gt;
|Align &lt;br /&gt;
|Open the [[Diagram_menu#Align_submenu|Align submenu]]. &lt;br /&gt;
|- &lt;br /&gt;
|Make Same Size &lt;br /&gt;
|Open the [[Diagram_menu#Make_Same_Size_submenu|Make Same Size submenu]]. &lt;br /&gt;
|- &lt;br /&gt;
|Space Evenly &lt;br /&gt;
|Open the [[Diagram_menu#Space_Evenly_submenu|Space Evenly submenu]].&lt;br /&gt;
|- &lt;br /&gt;
|Set Diagram Style &lt;br /&gt;
|Display a Diagram style dialog to set default arrow displays, node size, and font for this diagram. See [[Diagram Style dialog]].&lt;br /&gt;
|- &lt;br /&gt;
|Set Node Style &lt;br /&gt;
|Display Node style dialog to set arrow display and font for the selected node(s). See [[Node Style dialog]]. &lt;br /&gt;
|- &lt;br /&gt;
|Show / Hide Color Palette &lt;br /&gt;
|Display the color palette to set the color of the diagram background or of selected nodes. See  “Recoloring nodes or background” in [[Color in influence diagrams]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Button node context menu in edit mode ===&lt;br /&gt;
The menu displayed below is what you get when you right-click a button. &lt;br /&gt;
 &lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
| rowspan=&amp;quot;51&amp;quot; | [[File: Menus_15.png]]&lt;br /&gt;
 ! style=&amp;quot;width: 180px;&amp;quot; | Menu item &lt;br /&gt;
! Description &lt;br /&gt;
|- &lt;br /&gt;
|Undo &lt;br /&gt;
|Undo your last action. “Can’t Undo” appears in this location if an undo is not possible. &lt;br /&gt;
|- &lt;br /&gt;
|Cut &lt;br /&gt;
|Cut the selected text, node(s), or table cells into the clipboard temporarily for pasting. &lt;br /&gt;
|-  &lt;br /&gt;
|Copy &lt;br /&gt;
|Copy the selected text, node(s), graph, or table cells into the clipboard so that you can paste them somewhere else. See [[Copy and Paste between applications#Copying_and_Pasting|Copying and Pasting]].&lt;br /&gt;
|-&lt;br /&gt;
|Paste&lt;br /&gt;
|Paste the contents of the clipboard at the insertion point in a text, diagram, or table, or replaces the current selection. See [[Copy and Paste between applications#Copying_and_Pasting|Copying and Pasting]].&lt;br /&gt;
|- &lt;br /&gt;
|Select All &lt;br /&gt;
|Select all the text in an attribute field, all the nodes in a diagram, or all the cells in a table. &lt;br /&gt;
|- &lt;br /&gt;
|Duplicate Nodes &lt;br /&gt;
|Duplicate the selected node(s) onto the same diagram. See “Duplicate nodes” in [[Create and edit nodes]]. &lt;br /&gt;
|- &lt;br /&gt;
|Make Alias&lt;br /&gt;
|Create an [[Alias_nodes|Alias]] of the node.&lt;br /&gt;
|-&lt;br /&gt;
|Copy Diagram  &lt;br /&gt;
|When a Diagram window is active, copy a picture of the diagram for pasting into a graphics application.  See [[Copy and Paste between applications#Copying_and_Pasting|Copying and Pasting]]. &lt;br /&gt;
|- &lt;br /&gt;
|Preferences &lt;br /&gt;
|Open the [[Preferences dialog]] to examine or change various options. &lt;br /&gt;
|- &lt;br /&gt;
|Edit On click&lt;br /&gt;
|Open the appropriate view for editing the onclick of the selected button. &lt;br /&gt;
|- &lt;br /&gt;
|Run Onclick&lt;br /&gt;
|Execute the on-click of the selected button. Same as pressing the button in browse mode.&lt;br /&gt;
|- &lt;br /&gt;
|Run at load time&lt;br /&gt;
|Sets the [[Proactive_Evaluation|proactivelyevaluate]] attribute of the button to 32, so the onclick is evaluated when the model is loaded.&lt;br /&gt;
|-&lt;br /&gt;
|Bring to Front &lt;br /&gt;
|Bring the selected object(s) to the front of the drawing order so that if  the object(s) overlap any other elements, the object is visible.  This menu option appears only when you right-click one or more nodes. ''This is the  only way to move some nodes in front of others.'' &lt;br /&gt;
|- &lt;br /&gt;
|Send to Back &lt;br /&gt;
|Send the selected object(s) to the back of the drawing order so that the  selected object(s) are drawn behind any overlapping elements.  This menu option appears only when you right-click one or more nodes. ''This is the  only way to move some nodes behind the others.'' &lt;br /&gt;
|- &lt;br /&gt;
|Align &lt;br /&gt;
|Open the [[Diagram_menu#Align_submenu|Align submenu]]. &lt;br /&gt;
|- &lt;br /&gt;
|Make Same Size &lt;br /&gt;
|Open the [[Diagram_menu#Make_Same_Size_submenu|Make Same Size submenu]]. &lt;br /&gt;
|- &lt;br /&gt;
|Space Evenly &lt;br /&gt;
|Open the [[Diagram_menu#Space_Evenly_submenu|Space Evenly submenu]].&lt;br /&gt;
|- &lt;br /&gt;
|Set Diagram Style &lt;br /&gt;
|Display a Diagram style dialog to set default arrow displays, node size, and font for this diagram. See [[Diagram Style dialog]].&lt;br /&gt;
|- &lt;br /&gt;
|Set Node Style &lt;br /&gt;
|Display Node style dialog to set arrow display and font for the selected node(s). See [[Node Style dialog]]. &lt;br /&gt;
|- &lt;br /&gt;
|Show / Hide Color Palette &lt;br /&gt;
|Display the color palette to set the color of the diagram background or of selected nodes. See  “Recoloring nodes or background” in [[Color in influence diagrams]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[Menus]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.1%3F&amp;diff=63866</id>
		<title>What's new in Analytica 7.1?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.1%3F&amp;diff=63866"/>
		<updated>2026-04-17T16:09:01Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: /* Model loading */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Analytica 7.1 is currently under development, and will be the next future release of Analytica. The current official release is [[Analytica 7.0]]. This page is under construction, and will list enhancements that are new to Analytica or ADE 7.1.&lt;br /&gt;
&lt;br /&gt;
== Window appearance ==&lt;br /&gt;
The appearance of the chrome around child MDI windows (aka the &amp;quot;non-client area&amp;quot;) has been changed to more closely match the Windows 11 style of windows -- i.e., thin (1 pixel) borders, rounded corners at the top, white title bar, very plain (text-like) button images in the toolbar.&lt;br /&gt;
&lt;br /&gt;
== CSV files ==&lt;br /&gt;
There are now a few additional ways to open CSV files in Analytica:&lt;br /&gt;
* On the command line: &amp;lt;code&amp;gt;Analytica.exe MyData.csv&amp;lt;/code&amp;gt;&lt;br /&gt;
* Drag and drop a *.csv file onto the diagram (which behaves the same as using &amp;lt;code&amp;gt;File / Import...&amp;lt;/code&amp;gt; on the *.csv file). &lt;br /&gt;
&lt;br /&gt;
== Spreadsheets ==&lt;br /&gt;
* &amp;lt;code&amp;gt;[[SpreadsheetOpen]](&amp;quot;new&amp;quot;)&amp;lt;/code&amp;gt; now creates a blank spreadsheet in memory. Works with both the Excel and LibXl backends.&lt;br /&gt;
* Prefacing a sheet name with + in the call to [[SpreadsheetSetCell]] or [[SpreadsheetSetRange]] will add a new sheet by that name to the workbook (as it applies the specified change to that new worksheet). Works with either backend.&lt;br /&gt;
* You can also now remove a sheet from a workbook using: &amp;lt;code&amp;gt;[[SpreadsheetSetCell]](wb, &amp;quot;-OldSheet&amp;quot;, col, row, Null)&amp;lt;/code&amp;gt;. The «col» and «row» parameters are required but ignored in this case.&lt;br /&gt;
&lt;br /&gt;
== Built-in functions ==&lt;br /&gt;
* New options for [[GetProcessInfo]]: &amp;lt;code&amp;gt;&amp;quot;Number of monitors&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Current monitor rect&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Current monitor work rect&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Monitor «N» Rect&amp;quot;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;&amp;quot;Monitor «N» work rect&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* New optional parameter, «throwParsingErrors», to [[Evaluate]].&lt;br /&gt;
* [[ReadFromURL]] is a bit smarter about returning binary content (like &amp;lt;code&amp;gt;*.zip&amp;lt;/code&amp;gt; files) as a [[In-memory binary data terms|Binary Data Term]].&lt;br /&gt;
&lt;br /&gt;
== Model loading ==&lt;br /&gt;
When opening a model file, the &amp;quot;checking&amp;quot; stage (when attributes are parsed) parses different expressions on different threads, resulting in substantially faster model load times for very large models.&lt;br /&gt;
&lt;br /&gt;
Note: In the event that this creates a problem with your specific model (maybe due to an as-yet-undiscovered multithreading bug), you can disable it for your model as follows:&lt;br /&gt;
# Temporarily turn off multithreading (Skip this step if you are able to load your model)&lt;br /&gt;
## New model&lt;br /&gt;
## &amp;lt;b&amp;gt;Definition menu / System variables / Settings / Maximum evaluation threads&amp;lt;/b&amp;gt;&lt;br /&gt;
## Set to 1  (and remember the previous value)&lt;br /&gt;
# Open your model&lt;br /&gt;
# &amp;lt;b&amp;gt;Definition menu / System variables / Settings / Disable Multithreaded Evaluations&amp;lt;/b&amp;gt;&lt;br /&gt;
# Press the &amp;lt;code&amp;gt;Edit Table&amp;lt;/code&amp;gt; button.&lt;br /&gt;
# Check the checkbox for &amp;lt;code&amp;gt;Parsing&amp;lt;/code&amp;gt;&lt;br /&gt;
# Save your model&lt;br /&gt;
# &amp;lt;b&amp;gt;Definition menu / System variables / Settings / Maximum evaluation threads&amp;lt;/b&amp;gt;&lt;br /&gt;
#: Restore the original value from Step 1&lt;br /&gt;
&lt;br /&gt;
== MCP server ==&lt;br /&gt;
* Added an ability to install multiple ADE-based Mcp servers that run different ADE releases. For example, you can install two MCP servers into Claude Code:&lt;br /&gt;
* ade-server: Runs ADE 7.1&lt;br /&gt;
* ade-server-70: Runs ADE 7.0&lt;br /&gt;
The information in the &amp;lt;code&amp;gt;«ADE install folder»\Examples\Mcp_server\README.txt&amp;lt;/code&amp;gt; file explain how (with enough info for Claude code to configure this for you).  &lt;br /&gt;
&lt;br /&gt;
With both installed, Claude Code (or other MCP-enabled AI agents) can compare results for the same model across different releases, etc.&lt;br /&gt;
&lt;br /&gt;
Side note: The Mcp server was added to ADE 7.0.&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
This release has undergone massive internal restructuring and refactorization. Ideally (i.e., in the absence of bugs) these changes won't change functionality, but may alter some aspects of behavior, hopefully for the better.&lt;br /&gt;
* Internal data structures use for multi-dimensional arrays has been changed. Possible impacts:&lt;br /&gt;
** Likely to remove the sensitivity to the &amp;quot;canonical order&amp;quot; of indexes on evaluation speed.&lt;br /&gt;
** May change relative evaluation speeds of various functions and operations.&lt;br /&gt;
&lt;br /&gt;
== Discontinued... ==&lt;br /&gt;
* Plug-in functions. (An old hook that allows you to extend Analytica with compiled functions and UI elements written it C++. We are almost certain no one is using these hooks any more.)&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.1%3F&amp;diff=63865</id>
		<title>What's new in Analytica 7.1?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.1%3F&amp;diff=63865"/>
		<updated>2026-04-17T16:08:48Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: /* Model loading */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Analytica 7.1 is currently under development, and will be the next future release of Analytica. The current official release is [[Analytica 7.0]]. This page is under construction, and will list enhancements that are new to Analytica or ADE 7.1.&lt;br /&gt;
&lt;br /&gt;
== Window appearance ==&lt;br /&gt;
The appearance of the chrome around child MDI windows (aka the &amp;quot;non-client area&amp;quot;) has been changed to more closely match the Windows 11 style of windows -- i.e., thin (1 pixel) borders, rounded corners at the top, white title bar, very plain (text-like) button images in the toolbar.&lt;br /&gt;
&lt;br /&gt;
== CSV files ==&lt;br /&gt;
There are now a few additional ways to open CSV files in Analytica:&lt;br /&gt;
* On the command line: &amp;lt;code&amp;gt;Analytica.exe MyData.csv&amp;lt;/code&amp;gt;&lt;br /&gt;
* Drag and drop a *.csv file onto the diagram (which behaves the same as using &amp;lt;code&amp;gt;File / Import...&amp;lt;/code&amp;gt; on the *.csv file). &lt;br /&gt;
&lt;br /&gt;
== Spreadsheets ==&lt;br /&gt;
* &amp;lt;code&amp;gt;[[SpreadsheetOpen]](&amp;quot;new&amp;quot;)&amp;lt;/code&amp;gt; now creates a blank spreadsheet in memory. Works with both the Excel and LibXl backends.&lt;br /&gt;
* Prefacing a sheet name with + in the call to [[SpreadsheetSetCell]] or [[SpreadsheetSetRange]] will add a new sheet by that name to the workbook (as it applies the specified change to that new worksheet). Works with either backend.&lt;br /&gt;
* You can also now remove a sheet from a workbook using: &amp;lt;code&amp;gt;[[SpreadsheetSetCell]](wb, &amp;quot;-OldSheet&amp;quot;, col, row, Null)&amp;lt;/code&amp;gt;. The «col» and «row» parameters are required but ignored in this case.&lt;br /&gt;
&lt;br /&gt;
== Built-in functions ==&lt;br /&gt;
* New options for [[GetProcessInfo]]: &amp;lt;code&amp;gt;&amp;quot;Number of monitors&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Current monitor rect&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Current monitor work rect&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Monitor «N» Rect&amp;quot;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;&amp;quot;Monitor «N» work rect&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* New optional parameter, «throwParsingErrors», to [[Evaluate]].&lt;br /&gt;
* [[ReadFromURL]] is a bit smarter about returning binary content (like &amp;lt;code&amp;gt;*.zip&amp;lt;/code&amp;gt; files) as a [[In-memory binary data terms|Binary Data Term]].&lt;br /&gt;
&lt;br /&gt;
== Model loading ==&lt;br /&gt;
When opening a model file, the &amp;quot;checking&amp;quot; stage (when attributes are parsed) parses different expressions on different threads, resulting in substantially faster model load times for very large models.&lt;br /&gt;
&lt;br /&gt;
Note: In the event that this creates a problem with your specific model (maybe due to an as-yet-undiscovered multithreading bug), you can disable it for your model as follows:&lt;br /&gt;
# Temporarily turn off multithreading (Skip this step if you are able to load your model)&lt;br /&gt;
## New model&lt;br /&gt;
## &amp;lt;b&amp;gt;Definition menu / System variables / Settings / Maximum evaluation threads&amp;lt;/b&amp;gt;&lt;br /&gt;
## Set to 1  (and remember the previous value)&lt;br /&gt;
# Open your model&lt;br /&gt;
# &amp;lt;b&amp;gt;Definition menu / System variables / Settings / Disable Multithreaded Evaluations&amp;lt;/b&amp;gt;&lt;br /&gt;
# Press the &amp;lt;code&amp;gt;Edit Table&amp;lt;/code&amp;gt; button.&lt;br /&gt;
# Check the checkbox for &amp;lt;code&amp;gt;Parsing&amp;lt;/code&amp;gt;&lt;br /&gt;
# Save your model&lt;br /&gt;
# &amp;lt;b&amp;gt;Definition menu / System variables / Settings / Maximum evaluation threads&amp;lt;/b&amp;gt;&lt;br /&gt;
## Restore the original value from Step 1&lt;br /&gt;
&lt;br /&gt;
== MCP server ==&lt;br /&gt;
* Added an ability to install multiple ADE-based Mcp servers that run different ADE releases. For example, you can install two MCP servers into Claude Code:&lt;br /&gt;
* ade-server: Runs ADE 7.1&lt;br /&gt;
* ade-server-70: Runs ADE 7.0&lt;br /&gt;
The information in the &amp;lt;code&amp;gt;«ADE install folder»\Examples\Mcp_server\README.txt&amp;lt;/code&amp;gt; file explain how (with enough info for Claude code to configure this for you).  &lt;br /&gt;
&lt;br /&gt;
With both installed, Claude Code (or other MCP-enabled AI agents) can compare results for the same model across different releases, etc.&lt;br /&gt;
&lt;br /&gt;
Side note: The Mcp server was added to ADE 7.0.&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
This release has undergone massive internal restructuring and refactorization. Ideally (i.e., in the absence of bugs) these changes won't change functionality, but may alter some aspects of behavior, hopefully for the better.&lt;br /&gt;
* Internal data structures use for multi-dimensional arrays has been changed. Possible impacts:&lt;br /&gt;
** Likely to remove the sensitivity to the &amp;quot;canonical order&amp;quot; of indexes on evaluation speed.&lt;br /&gt;
** May change relative evaluation speeds of various functions and operations.&lt;br /&gt;
&lt;br /&gt;
== Discontinued... ==&lt;br /&gt;
* Plug-in functions. (An old hook that allows you to extend Analytica with compiled functions and UI elements written it C++. We are almost certain no one is using these hooks any more.)&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.1%3F&amp;diff=63864</id>
		<title>What's new in Analytica 7.1?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.1%3F&amp;diff=63864"/>
		<updated>2026-04-17T16:07:38Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: /* Model loading */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Analytica 7.1 is currently under development, and will be the next future release of Analytica. The current official release is [[Analytica 7.0]]. This page is under construction, and will list enhancements that are new to Analytica or ADE 7.1.&lt;br /&gt;
&lt;br /&gt;
== Window appearance ==&lt;br /&gt;
The appearance of the chrome around child MDI windows (aka the &amp;quot;non-client area&amp;quot;) has been changed to more closely match the Windows 11 style of windows -- i.e., thin (1 pixel) borders, rounded corners at the top, white title bar, very plain (text-like) button images in the toolbar.&lt;br /&gt;
&lt;br /&gt;
== CSV files ==&lt;br /&gt;
There are now a few additional ways to open CSV files in Analytica:&lt;br /&gt;
* On the command line: &amp;lt;code&amp;gt;Analytica.exe MyData.csv&amp;lt;/code&amp;gt;&lt;br /&gt;
* Drag and drop a *.csv file onto the diagram (which behaves the same as using &amp;lt;code&amp;gt;File / Import...&amp;lt;/code&amp;gt; on the *.csv file). &lt;br /&gt;
&lt;br /&gt;
== Spreadsheets ==&lt;br /&gt;
* &amp;lt;code&amp;gt;[[SpreadsheetOpen]](&amp;quot;new&amp;quot;)&amp;lt;/code&amp;gt; now creates a blank spreadsheet in memory. Works with both the Excel and LibXl backends.&lt;br /&gt;
* Prefacing a sheet name with + in the call to [[SpreadsheetSetCell]] or [[SpreadsheetSetRange]] will add a new sheet by that name to the workbook (as it applies the specified change to that new worksheet). Works with either backend.&lt;br /&gt;
* You can also now remove a sheet from a workbook using: &amp;lt;code&amp;gt;[[SpreadsheetSetCell]](wb, &amp;quot;-OldSheet&amp;quot;, col, row, Null)&amp;lt;/code&amp;gt;. The «col» and «row» parameters are required but ignored in this case.&lt;br /&gt;
&lt;br /&gt;
== Built-in functions ==&lt;br /&gt;
* New options for [[GetProcessInfo]]: &amp;lt;code&amp;gt;&amp;quot;Number of monitors&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Current monitor rect&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Current monitor work rect&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Monitor «N» Rect&amp;quot;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;&amp;quot;Monitor «N» work rect&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* New optional parameter, «throwParsingErrors», to [[Evaluate]].&lt;br /&gt;
* [[ReadFromURL]] is a bit smarter about returning binary content (like &amp;lt;code&amp;gt;*.zip&amp;lt;/code&amp;gt; files) as a [[In-memory binary data terms|Binary Data Term]].&lt;br /&gt;
&lt;br /&gt;
== Model loading ==&lt;br /&gt;
When opening a model file, the &amp;quot;checking&amp;quot; stage (when attributes are parsed) parses different expressions on different threads, resulting in substantially faster model load times for very large models.&lt;br /&gt;
&lt;br /&gt;
Note: In the event that this creates a problem with your specific model (maybe due to an as-yet-undiscovered multithreading bug), you can disable it for your model as follows:&lt;br /&gt;
# Temporarily turn off multithreading (Skip this step if you are able to load your model)&lt;br /&gt;
## New model&lt;br /&gt;
## &amp;lt;b&amp;gt;Definition menu / System variables / Settings / Maximum evaluation threads&amp;lt;/b&amp;gt;&lt;br /&gt;
## Set to 1  (and remember the previous value)&lt;br /&gt;
# Open your model&lt;br /&gt;
# &amp;lt;b&amp;gt;Definition menu / System variables / Settings / Disable Multithreaded Evaluations&amp;lt;/b&amp;gt;&lt;br /&gt;
# Press the &amp;lt;code&amp;gt;Edit Table&amp;lt;/code&amp;gt; button.&lt;br /&gt;
# Check the checkbox for &amp;lt;code&amp;gt;Parsing&amp;lt;/code&amp;gt;&lt;br /&gt;
# Save your model&lt;br /&gt;
&lt;br /&gt;
== MCP server ==&lt;br /&gt;
* Added an ability to install multiple ADE-based Mcp servers that run different ADE releases. For example, you can install two MCP servers into Claude Code:&lt;br /&gt;
* ade-server: Runs ADE 7.1&lt;br /&gt;
* ade-server-70: Runs ADE 7.0&lt;br /&gt;
The information in the &amp;lt;code&amp;gt;«ADE install folder»\Examples\Mcp_server\README.txt&amp;lt;/code&amp;gt; file explain how (with enough info for Claude code to configure this for you).  &lt;br /&gt;
&lt;br /&gt;
With both installed, Claude Code (or other MCP-enabled AI agents) can compare results for the same model across different releases, etc.&lt;br /&gt;
&lt;br /&gt;
Side note: The Mcp server was added to ADE 7.0.&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
This release has undergone massive internal restructuring and refactorization. Ideally (i.e., in the absence of bugs) these changes won't change functionality, but may alter some aspects of behavior, hopefully for the better.&lt;br /&gt;
* Internal data structures use for multi-dimensional arrays has been changed. Possible impacts:&lt;br /&gt;
** Likely to remove the sensitivity to the &amp;quot;canonical order&amp;quot; of indexes on evaluation speed.&lt;br /&gt;
** May change relative evaluation speeds of various functions and operations.&lt;br /&gt;
&lt;br /&gt;
== Discontinued... ==&lt;br /&gt;
* Plug-in functions. (An old hook that allows you to extend Analytica with compiled functions and UI elements written it C++. We are almost certain no one is using these hooks any more.)&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.1%3F&amp;diff=63863</id>
		<title>What's new in Analytica 7.1?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.1%3F&amp;diff=63863"/>
		<updated>2026-04-17T16:02:06Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Analytica 7.1 is currently under development, and will be the next future release of Analytica. The current official release is [[Analytica 7.0]]. This page is under construction, and will list enhancements that are new to Analytica or ADE 7.1.&lt;br /&gt;
&lt;br /&gt;
== Window appearance ==&lt;br /&gt;
The appearance of the chrome around child MDI windows (aka the &amp;quot;non-client area&amp;quot;) has been changed to more closely match the Windows 11 style of windows -- i.e., thin (1 pixel) borders, rounded corners at the top, white title bar, very plain (text-like) button images in the toolbar.&lt;br /&gt;
&lt;br /&gt;
== CSV files ==&lt;br /&gt;
There are now a few additional ways to open CSV files in Analytica:&lt;br /&gt;
* On the command line: &amp;lt;code&amp;gt;Analytica.exe MyData.csv&amp;lt;/code&amp;gt;&lt;br /&gt;
* Drag and drop a *.csv file onto the diagram (which behaves the same as using &amp;lt;code&amp;gt;File / Import...&amp;lt;/code&amp;gt; on the *.csv file). &lt;br /&gt;
&lt;br /&gt;
== Spreadsheets ==&lt;br /&gt;
* &amp;lt;code&amp;gt;[[SpreadsheetOpen]](&amp;quot;new&amp;quot;)&amp;lt;/code&amp;gt; now creates a blank spreadsheet in memory. Works with both the Excel and LibXl backends.&lt;br /&gt;
* Prefacing a sheet name with + in the call to [[SpreadsheetSetCell]] or [[SpreadsheetSetRange]] will add a new sheet by that name to the workbook (as it applies the specified change to that new worksheet). Works with either backend.&lt;br /&gt;
* You can also now remove a sheet from a workbook using: &amp;lt;code&amp;gt;[[SpreadsheetSetCell]](wb, &amp;quot;-OldSheet&amp;quot;, col, row, Null)&amp;lt;/code&amp;gt;. The «col» and «row» parameters are required but ignored in this case.&lt;br /&gt;
&lt;br /&gt;
== Built-in functions ==&lt;br /&gt;
* New options for [[GetProcessInfo]]: &amp;lt;code&amp;gt;&amp;quot;Number of monitors&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Current monitor rect&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Current monitor work rect&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Monitor «N» Rect&amp;quot;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;&amp;quot;Monitor «N» work rect&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* New optional parameter, «throwParsingErrors», to [[Evaluate]].&lt;br /&gt;
* [[ReadFromURL]] is a bit smarter about returning binary content (like &amp;lt;code&amp;gt;*.zip&amp;lt;/code&amp;gt; files) as a [[In-memory binary data terms|Binary Data Term]].&lt;br /&gt;
&lt;br /&gt;
== Model loading ==&lt;br /&gt;
When opening a model file, the &amp;quot;checking&amp;quot; stage (when attributes are parsed) parses different expressions on different threads, resulting in substantially faster model load times for very large models.&lt;br /&gt;
&lt;br /&gt;
== MCP server ==&lt;br /&gt;
* Added an ability to install multiple ADE-based Mcp servers that run different ADE releases. For example, you can install two MCP servers into Claude Code:&lt;br /&gt;
* ade-server: Runs ADE 7.1&lt;br /&gt;
* ade-server-70: Runs ADE 7.0&lt;br /&gt;
The information in the &amp;lt;code&amp;gt;«ADE install folder»\Examples\Mcp_server\README.txt&amp;lt;/code&amp;gt; file explain how (with enough info for Claude code to configure this for you).  &lt;br /&gt;
&lt;br /&gt;
With both installed, Claude Code (or other MCP-enabled AI agents) can compare results for the same model across different releases, etc.&lt;br /&gt;
&lt;br /&gt;
Side note: The Mcp server was added to ADE 7.0.&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
This release has undergone massive internal restructuring and refactorization. Ideally (i.e., in the absence of bugs) these changes won't change functionality, but may alter some aspects of behavior, hopefully for the better.&lt;br /&gt;
* Internal data structures use for multi-dimensional arrays has been changed. Possible impacts:&lt;br /&gt;
** Likely to remove the sensitivity to the &amp;quot;canonical order&amp;quot; of indexes on evaluation speed.&lt;br /&gt;
** May change relative evaluation speeds of various functions and operations.&lt;br /&gt;
&lt;br /&gt;
== Discontinued... ==&lt;br /&gt;
* Plug-in functions. (An old hook that allows you to extend Analytica with compiled functions and UI elements written it C++. We are almost certain no one is using these hooks any more.)&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.1%3F&amp;diff=63862</id>
		<title>What's new in Analytica 7.1?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.1%3F&amp;diff=63862"/>
		<updated>2026-04-17T15:59:58Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: /* Built-in functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Analytica 7.1 is currently under development, and will be the next future release of Analytica. The current official release is [[Analytica 7.0]]. This page is under construction, and will list enhancements that are new to Analytica or ADE 7.1.&lt;br /&gt;
&lt;br /&gt;
== Window appearance ==&lt;br /&gt;
The appearance of the chrome around child MDI windows (aka the &amp;quot;non-client area&amp;quot;) has been changed to more closely match the Windows 11 style of windows -- i.e., thin (1 pixel) borders, rounded corners at the top, white title bar, very plain (text-like) button images in the toolbar.&lt;br /&gt;
&lt;br /&gt;
== CSV files ==&lt;br /&gt;
There are now a few additional ways to open CSV files in Analytica:&lt;br /&gt;
* On the command line: &amp;lt;code&amp;gt;Analytica.exe MyData.csv&amp;lt;/code&amp;gt;&lt;br /&gt;
* Drag and drop a *.csv file onto the diagram (which behaves the same as using &amp;lt;code&amp;gt;File / Import...&amp;lt;/code&amp;gt; on the *.csv file). &lt;br /&gt;
&lt;br /&gt;
== Spreadsheets ==&lt;br /&gt;
* &amp;lt;code&amp;gt;[[SpreadsheetOpen]](&amp;quot;new&amp;quot;)&amp;lt;/code&amp;gt; now creates a blank spreadsheet in memory. Works with both the Excel and LibXl backends.&lt;br /&gt;
* Prefacing a sheet name with + in the call to [[SpreadsheetSetCell]] or [[SpreadsheetSetRange]] will add a new sheet by that name to the workbook (as it applies the specified change to that new worksheet). Works with either backend.&lt;br /&gt;
* You can also now remove a sheet from a workbook using: &amp;lt;code&amp;gt;[[SpreadsheetSetCell]](wb, &amp;quot;-OldSheet&amp;quot;, col, row, Null)&amp;lt;/code&amp;gt;. The «col» and «row» parameters are required but ignored in this case.&lt;br /&gt;
&lt;br /&gt;
== Built-in functions ==&lt;br /&gt;
* New options for [[GetProcessInfo]]: &amp;lt;code&amp;gt;&amp;quot;Number of monitors&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Current monitor rect&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Current monitor work rect&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Monitor «N» Rect&amp;quot;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;&amp;quot;Monitor «N» work rect&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* New optional parameter, «throwParsingErrors», to [[Evaluate]].&lt;br /&gt;
* [[ReadFromURL]] is a bit smarter about returning binary content (like &amp;lt;code&amp;gt;*.zip&amp;lt;/code&amp;gt; files) as a [[In-memory binary data terms|Binary Data Term]].&lt;br /&gt;
&lt;br /&gt;
== MCP server ==&lt;br /&gt;
* Added an ability to install multiple ADE-based Mcp servers that run different ADE releases. For example, you can install two MCP servers into Claude Code:&lt;br /&gt;
* ade-server: Runs ADE 7.1&lt;br /&gt;
* ade-server-70: Runs ADE 7.0&lt;br /&gt;
The information in the &amp;lt;code&amp;gt;«ADE install folder»\Examples\Mcp_server\README.txt&amp;lt;/code&amp;gt; file explain how (with enough info for Claude code to configure this for you).  &lt;br /&gt;
&lt;br /&gt;
With both installed, Claude Code (or other MCP-enabled AI agents) can compare results for the same model across different releases, etc.&lt;br /&gt;
&lt;br /&gt;
Side note: The Mcp server was added to ADE 7.0.&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
This release has undergone massive internal restructuring and refactorization. Ideally (i.e., in the absence of bugs) these changes won't change functionality, but may alter some aspects of behavior, hopefully for the better.&lt;br /&gt;
* Internal data structures use for multi-dimensional arrays has been changed. Possible impacts:&lt;br /&gt;
** Likely to remove the sensitivity to the &amp;quot;canonical order&amp;quot; of indexes on evaluation speed.&lt;br /&gt;
** May change relative evaluation speeds of various functions and operations.&lt;br /&gt;
&lt;br /&gt;
== Discontinued... ==&lt;br /&gt;
* Plug-in functions. (An old hook that allows you to extend Analytica with compiled functions and UI elements written it C++. We are almost certain no one is using these hooks any more.)&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.1%3F&amp;diff=63861</id>
		<title>What's new in Analytica 7.1?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.1%3F&amp;diff=63861"/>
		<updated>2026-04-17T15:55:28Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Analytica 7.1 is currently under development, and will be the next future release of Analytica. The current official release is [[Analytica 7.0]]. This page is under construction, and will list enhancements that are new to Analytica or ADE 7.1.&lt;br /&gt;
&lt;br /&gt;
== Window appearance ==&lt;br /&gt;
The appearance of the chrome around child MDI windows (aka the &amp;quot;non-client area&amp;quot;) has been changed to more closely match the Windows 11 style of windows -- i.e., thin (1 pixel) borders, rounded corners at the top, white title bar, very plain (text-like) button images in the toolbar.&lt;br /&gt;
&lt;br /&gt;
== CSV files ==&lt;br /&gt;
There are now a few additional ways to open CSV files in Analytica:&lt;br /&gt;
* On the command line: &amp;lt;code&amp;gt;Analytica.exe MyData.csv&amp;lt;/code&amp;gt;&lt;br /&gt;
* Drag and drop a *.csv file onto the diagram (which behaves the same as using &amp;lt;code&amp;gt;File / Import...&amp;lt;/code&amp;gt; on the *.csv file). &lt;br /&gt;
&lt;br /&gt;
== Spreadsheets ==&lt;br /&gt;
* &amp;lt;code&amp;gt;[[SpreadsheetOpen]](&amp;quot;new&amp;quot;)&amp;lt;/code&amp;gt; now creates a blank spreadsheet in memory. Works with both the Excel and LibXl backends.&lt;br /&gt;
* Prefacing a sheet name with + in the call to [[SpreadsheetSetCell]] or [[SpreadsheetSetRange]] will add a new sheet by that name to the workbook (as it applies the specified change to that new worksheet). Works with either backend.&lt;br /&gt;
* You can also now remove a sheet from a workbook using: &amp;lt;code&amp;gt;[[SpreadsheetSetCell]](wb, &amp;quot;-OldSheet&amp;quot;, col, row, Null)&amp;lt;/code&amp;gt;. The «col» and «row» parameters are required but ignored in this case.&lt;br /&gt;
&lt;br /&gt;
== Built-in functions ==&lt;br /&gt;
* New options for [[GetProcessInfo]]: &amp;lt;code&amp;gt;&amp;quot;Number of monitors&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Current monitor rect&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Current monitor work rect&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;Monitor «N» Rect&amp;quot;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;&amp;quot;Monitor «N» work rect&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== MCP server ==&lt;br /&gt;
* Added an ability to install multiple ADE-based Mcp servers that run different ADE releases. For example, you can install two MCP servers into Claude Code:&lt;br /&gt;
* ade-server: Runs ADE 7.1&lt;br /&gt;
* ade-server-70: Runs ADE 7.0&lt;br /&gt;
The information in the &amp;lt;code&amp;gt;«ADE install folder»\Examples\Mcp_server\README.txt&amp;lt;/code&amp;gt; file explain how (with enough info for Claude code to configure this for you).  &lt;br /&gt;
&lt;br /&gt;
With both installed, Claude Code (or other MCP-enabled AI agents) can compare results for the same model across different releases, etc.&lt;br /&gt;
&lt;br /&gt;
Side note: The Mcp server was added to ADE 7.0.&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
This release has undergone massive internal restructuring and refactorization. Ideally (i.e., in the absence of bugs) these changes won't change functionality, but may alter some aspects of behavior, hopefully for the better.&lt;br /&gt;
* Internal data structures use for multi-dimensional arrays has been changed. Possible impacts:&lt;br /&gt;
** Likely to remove the sensitivity to the &amp;quot;canonical order&amp;quot; of indexes on evaluation speed.&lt;br /&gt;
** May change relative evaluation speeds of various functions and operations.&lt;br /&gt;
&lt;br /&gt;
== Discontinued... ==&lt;br /&gt;
* Plug-in functions. (An old hook that allows you to extend Analytica with compiled functions and UI elements written it C++. We are almost certain no one is using these hooks any more.)&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Error_Messages/42699&amp;diff=63859</id>
		<title>Error Messages/42699</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Error_Messages/42699&amp;diff=63859"/>
		<updated>2026-04-17T14:17:43Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Error Message ==&lt;br /&gt;
:Syntax error:&lt;br /&gt;
::End is not allowed in an expression.&lt;br /&gt;
&lt;br /&gt;
more generally, &lt;br /&gt;
:«keyword» is not allowed in an expression.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
An example where this occurs:&lt;br /&gt;
 [[Begin]]&lt;br /&gt;
    [[Local]] x:=1;&lt;br /&gt;
 [[End]]&lt;br /&gt;
 x&lt;br /&gt;
&lt;br /&gt;
In this example, &amp;lt;code&amp;gt;[[Local]]&amp;lt;/code&amp;gt; expects a body expression after the semi-colon, but instead encounters an unexpected keyword, &amp;lt;code&amp;gt;[[End]]&amp;lt;/code&amp;gt;, resulting in this syntax error.&lt;br /&gt;
&lt;br /&gt;
Presumably the intended phrasing in this example would have been&lt;br /&gt;
 [[Begin]]&lt;br /&gt;
    [[Local]] x:=1;&lt;br /&gt;
    x&lt;br /&gt;
 [[End]]&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;[[Begin]]-[[End]]&amp;lt;/code&amp;gt; here isn't doing anything if this is the entire expression, but this might be extracted from a larger expression.&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Error_Messages/42699&amp;diff=63858</id>
		<title>Error Messages/42699</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Error_Messages/42699&amp;diff=63858"/>
		<updated>2026-04-17T14:16:35Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: Created page with &amp;quot;== Error Message == :Syntax error: ::End is not allowed in an expression.  more generally,  :«keyword» is not allowed in an expression.  == Description == An example where t...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Error Message ==&lt;br /&gt;
:Syntax error:&lt;br /&gt;
::End is not allowed in an expression.&lt;br /&gt;
&lt;br /&gt;
more generally, &lt;br /&gt;
:«keyword» is not allowed in an expression.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
An example where this occurs:&lt;br /&gt;
 [[Begin]]&lt;br /&gt;
    [[Local]] x:=1;&lt;br /&gt;
 [[End]]&lt;br /&gt;
 x&lt;br /&gt;
&lt;br /&gt;
In this example, &amp;lt;code&amp;gt;[[Local]]&amp;lt;/code&amp;gt; expects a body expression after the semi-colon, but instead encounters an unexpected keyword, &amp;lt;code&amp;gt;[[End]]&amp;lt;/code&amp;gt;, resulting in this syntax error.&lt;br /&gt;
&lt;br /&gt;
Presumably the intended phrasing in this example would have been&lt;br /&gt;
 [[Begin]]&lt;br /&gt;
    [[Local]] x:=1;&lt;br /&gt;
    x&lt;br /&gt;
 [[End]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Error_Messages/40020&amp;diff=63832</id>
		<title>Error Messages/40020</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Error_Messages/40020&amp;diff=63832"/>
		<updated>2026-04-13T16:20:04Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Error messages]]&lt;br /&gt;
&lt;br /&gt;
== Error message examples ==&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;''The condition for &amp;quot;while&amp;quot; evaluates to an array. It should evaluate to true (non-zero) or false (zero).''&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cause ==&lt;br /&gt;
This error is caused when an array is passed as the condition of a [[while]] loop. The following code will produce this error as [[Time]] is an array and &amp;lt;code&amp;gt;Time &amp;gt; 5&amp;lt;/code&amp;gt; will evaluate to an array.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;[[Local]] a:= 5; &amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;[[While]] (Time &amp;gt; a) Do (&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;a++;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remedies ==&lt;br /&gt;
Correct the condition for the while loop so it evaluates to true or false.&lt;br /&gt;
&lt;br /&gt;
Another possible remedy is to include the &amp;lt;code&amp;gt;Any&amp;lt;/code&amp;gt; keyword, i.e.,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;[[Local]] a:= 5; &amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;[[While]] Any (Time &amp;gt; a) Do (&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;a++;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
But when you do this, the iteration proceeds until all cells pass the condition, which may be inefficient in some cases (such as a convergence algorithm where it converges more precisely in many cells than is really required), and can result is the incorrect results in others (for example, when you want to stop at the first violation, but now some cells proceed further than that). &lt;br /&gt;
&lt;br /&gt;
=== Suggested revised message ===&lt;br /&gt;
In a construct '''WHILE''' &amp;lt;cond&amp;gt; '''DO''' &amp;lt;exp&amp;gt;, the condition should be a scalar (true (non-zero) or false (zero)), but not an [[array]].  See [[Ensuring Array Abstraction]] in [[Analytica User Guide]] on how to deal with this.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[While..Do]]&lt;br /&gt;
* [[Time]]&lt;br /&gt;
* [[Array Abstraction]]&lt;br /&gt;
* [[Ensuring Array Abstraction]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=TrackAttChanges&amp;diff=63820</id>
		<title>TrackAttChanges</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=TrackAttChanges&amp;diff=63820"/>
		<updated>2026-04-06T17:24:48Z</updated>

		<summary type="html">&lt;p&gt;Lchrisman: missing ' for optional params&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Special Functions]]&lt;br /&gt;
''New in [[Analytica 6.5]]''&lt;br /&gt;
&lt;br /&gt;
These esoteric functions can be used to track changes that a user makes to the model, or within a part of the model. It would be extremely rare for an Analytica user to make use of these functions, they exist for internal use within Analytica.  The names of these functions all begin with an underscore, which underscores how esoteric we consider them to be.&lt;br /&gt;
&lt;br /&gt;
== Function _TrackAttChanges( atts...'', within, excludeWithin, deletionHandler'' ) ==&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* «atts»: One or more attributes to be tracked. E.g., &amp;lt;code&amp;gt;_TrackAttChanges( Title, Description, Unit )&amp;lt;/code&amp;gt;.&lt;br /&gt;
* «within»: (Optional) Module containing all objects to track. If omitted, tracks all changes.&lt;br /&gt;
* «excludeWithin»: (Optional) Module to exclude from tracking (itself within «within» to be meaningful).&lt;br /&gt;
* «deletionHandler»: (Optional) A function you provide that gets called if an object (or objects) within tracking scope gets deleted.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Instantiates an «attTracker» which internally keeps track of which attribute values change. It tracks changes to the attributes listed in «atts» in objects that are within the module specified in «within», excluding any changes to objects within the module «excludeWithin».  Both «within» and «excludeWithin» are optional (if «within» is omitted then it tracks changes to any object). &lt;br /&gt;
&lt;br /&gt;
When an object is deleted, any changes logged for it are removed from its record since the object ceases to exist. To get notice of an object deletion you can supply a «deletionHandler» function, which will be called if one or more objects are deleted. The function must have the prototype signature:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Function deletionHandler( attTracker : _AttTracker atom )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be either a [[UDF]] or a [[local function]]. It is called after the deletion has occurred, so there is no record of which object(s) were deleted (there is no longer any way to refer to them), but it does tell you that at least one deletion occurred. This is generally not called until any pending evaluation finishes, at which point it is only called once (per «attTracker») even if there were multiple deletions during the evaluation.&lt;br /&gt;
&lt;br /&gt;
The «attTracker» keeps track of which attribute of which object changed, but it does not save the value before or after the change. Essentially it enables you to figure out whether a given attribute of a given object changed since you first instantiated the «attTracker», or since it was last reset.&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span id=&amp;quot;_AttTrackerQuery&amp;quot;&amp;gt;Function _AttTrackerQuery( attTracker'', h, atts...'' ) &amp;lt;/span&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* «attTracker»: The object obtained from a call to [[_TrackAttChanges]].&lt;br /&gt;
* «h»: (Optional): A handle to the object of interest.&lt;br /&gt;
* «atts»:  (Optional) The attribute(s) to query.&lt;br /&gt;
&lt;br /&gt;
Use this function to figure out what has changes since the «attTracker» started tracking or was last reset.&lt;br /&gt;
&lt;br /&gt;
When both «h» and «atts» are omitted, it returns a list of [[handle]]s to all the objects with any attribute changes.&lt;br /&gt;
&lt;br /&gt;
When «h» is specified, returns &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; if it has any changes to any of the tracked attributes, &amp;lt;code&amp;gt;False&amp;lt;/code&amp;gt; otherwise.  It array abstracts so «h» can also be an array of handles.&lt;br /&gt;
&lt;br /&gt;
When «h» is omitted but «atts» is specified, it returns a list of [[handle]]s to objects with a change to any of the tracked attributes that are in «atts».&lt;br /&gt;
&lt;br /&gt;
When both «h» and «atts» are specified, returns &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; if there was a change to any attribute in «Atts» of the object pointed to by «h».&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span id=&amp;quot;_AttTrackerReset&amp;quot;&amp;gt;Function _AttTrackerReset( attTracker ) &amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Clears the log of changes inside the «attTracker», thus starting the tracking over. &lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* [[Attributes]]&lt;/div&gt;</summary>
		<author><name>Lchrisman</name></author>
	</entry>
</feed>